diff --git a/merge-queue-analysis/.gitignore b/merge-queue-analysis/.gitignore new file mode 100644 index 0000000..92afa22 --- /dev/null +++ b/merge-queue-analysis/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +venv/ diff --git a/merge-queue-analysis/README.md b/merge-queue-analysis/README.md new file mode 100644 index 0000000..8bc4c95 --- /dev/null +++ b/merge-queue-analysis/README.md @@ -0,0 +1,105 @@ +# Merge Queue Separation Analysis + +Scripts to model the impact of separating the `mural-web` shipit2 merge queue into per-repo queues. + +## Background + +The `mural-web` shipit2 queue processes ~15 repos through a single FIFO queue. This analysis quantifies how much faster PRs would merge if murally and mural-api (and all other repos) had their own parallel queues. + +## Setup + +```bash +# Use the existing venv from prior analysis, or create a new one +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# GitHub token for API access +export GITHUB_TOKEN=$(gh auth token) +``` + +## Scripts + +Run in order: + +### Step 0: `discover_shipit_bot.py` + +Samples recent PRs to identify the shipit bot username and catalog all comment formats it uses. Outputs `bot_discovery.json`. + +```bash +python discover_shipit_bot.py + +# Options: +# --sample-size 50 Number of PRs to sample for bot discovery +# --audit-size 200 Number of PRs to check for format drift +# --force Re-run even if cached +``` + +### Step 1: `fetch_shipit_data.py` + +Fetches merged/closed PRs with all bot comments from GitHub GraphQL API. Caches per-repo JSON files. Classification is done after collection so heuristics can be refined without re-fetching. + +```bash +python fetch_shipit_data.py + +# Options: +# --repos murally mural-api Specific repos (default: all 15 mural-web repos) +# --start-date 2025-02-18 Start date (default: 2025-02-18) +# --end-date 2026-02-18 End date (default: 2026-02-18) +# --bot-username USER Override bot username from discovery +# --force Re-fetch even if cached +``` + +### Step 2: `analyze_queue_timeline.py` + +Reconstructs the single-queue FIFO timeline from shipit events. Groups cross-repo efforts as single queue items. Computes per-item queue wait time, processing time, and total time. + +```bash +python analyze_queue_timeline.py + +# Options: +# --data-dir . Directory with shipit_data_*.json files +# --output-dir . Directory for output files +``` + +**Outputs:** +- `queue_events.csv` — per-event timeline with metrics +- `queue_timeline_summary.txt` — human-readable summary +- `queue_timeline_summary.json` — machine-readable summary + +### Step 3: `simulate_separate_queues.py` + +Simulates per-repo queues vs the current single queue. Cross-repo efforts are expanded into separate queue entries. Compares wait times and computes improvement metrics. + +```bash +python simulate_separate_queues.py + +# Options: +# --data-dir . Directory with queue_events.csv +# --output-dir . Directory for output files +``` + +**Outputs:** +- `simulation_results.csv` — per-PR current vs proposed comparison +- `weekly_summary.csv` — weekly aggregated metrics +- `wait_time_distribution.csv` — histogram of wait times +- `queue_depth_timeseries.csv` — hourly queue depth by repo +- `simulation_comparison.json` — full comparison metrics + +## Output Files + +| File | Description | +|------|-------------| +| `bot_discovery.json` | Bot username and comment format catalog | +| `shipit_data_*.json` | Raw cached PR data per repo | +| `queue_events.csv` | Reconstructed timeline with per-event metrics | +| `queue_timeline_summary.json` | Summary statistics for the single queue | +| `simulation_results.csv` | Per-PR current vs proposed comparison | +| `weekly_summary.csv` | Weekly aggregated metrics | +| `wait_time_distribution.csv` | Histogram of wait times (current vs proposed) | +| `queue_depth_timeseries.csv` | Hourly queue depth by repo | +| `simulation_comparison.json` | Full comparison metrics | + +## Analysis Document + +Results are summarized in `../merge-queue-separate-queues-analysis.md`. diff --git a/merge-queue-analysis/ambiguous_prs_for_review.json b/merge-queue-analysis/ambiguous_prs_for_review.json new file mode 100644 index 0000000..4051ef1 --- /dev/null +++ b/merge-queue-analysis/ambiguous_prs_for_review.json @@ -0,0 +1,9663 @@ +[ + { + "number": 47172, + "title": "[NEXT-452][CAN-6298] Move SDKs into packages", + "branch": "fix/next-452", + "merged_at": "2026-02-17", + "changed_files": 44, + "additions": 303, + "deletions": 684, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/helpers/accessibility/index.ts", + "packages/canvas/src/helpers/accessibility/screen-readers.test.ts", + "packages/canvas/src/helpers/accessibility/screen-readers.ts", + "packages/canvas/src/helpers/accessibility/types.ts", + "packages/canvas/src/helpers/accessibility/utils.ts", + "packages/canvas/src/helpers/accessibility/widget-message/table-cell.ts", + "packages/canvas/src/helpers/widgets/index.ts", + "packages/canvas/src/helpers/widgets/related-arrows.ts", + "packages/canvas/src/sdk/apis/dragging/dragging.ts", + "packages/canvas/src/sdk/apis/dragging/index.ts", + "packages/canvas/src/sdk/apis/dragging/selectors.ts", + "packages/canvas/src/sdk/apis/dragging/types.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/rightbar/index.ts", + "packages/canvas/src/sdk/apis/rightbar/rightbar.ts", + "packages/canvas/src/sdk/apis/screen-reader/index.ts", + "packages/canvas/src/sdk/apis/screen-reader/screen-reader.ts", + "packages/canvas/src/sdk/apis/screen-reader/types.ts", + "packages/canvas/src/sdk/apis/sdk-apis.ts", + "packages/canvas/src/sdk/apis/selection/index.ts" + ], + "total_files": 44, + "body_preview": "**[NEXT-452 Move SDKs into packages](https://mural.atlassian.net/browse/NEXT-452)**\r\n\r\nIn this PR:\r\n* Move stop/start editing on dragging into dispatcher\r\n* Move `dragging` SDK into packages\r\n* Use primitive API instead of SdkApis in screen reader helpers\r\n* Move screen reader SDK into packages\r\n* Move accessebility helpers into packages\r\n* Move selection SDK implementation into packages\r\n* Move `rightbar` SDK into packages\r\n* Remove `transcript` SDK duplicate\r\n\r\nThe environment: https://next-45" + }, + { + "number": 47158, + "title": "[NEXT-451] Move `remote` SDK into packages", + "branch": "fix/next-451", + "merged_at": "2026-02-13", + "changed_files": 4, + "additions": 28, + "deletions": 30, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/remote/index.ts", + "packages/canvas/src/sdk/apis/remote/remote.ts", + "src/mural/dispatcher/facilitation/index.tsx", + "src/mural/sdk/apis/index.ts" + ], + "total_files": 4, + "body_preview": "**[NEXT-451 Move `remote` SDK into packages](https://mural.atlassian.net/browse/NEXT-451)**\r\n\r\nThis PR moves `remote` SDK into packages.\r\n\r\nThe environment: https://next-451.mural.engineering/" + }, + { + "number": 47156, + "title": "[NEXT-450] Move `snap` SDK into packages", + "branch": "fix/next-450", + "merged_at": "2026-02-13", + "changed_files": 28, + "additions": 344, + "deletions": 324, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/helpers/widgets/can-snap-widget.ts", + "packages/canvas/src/helpers/widgets/index.ts", + "packages/canvas/src/helpers/widgets/is-arrow-connected-to.ts", + "packages/canvas/src/helpers/widgets/resize-widgets.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/sdk-apis.ts", + "packages/canvas/src/sdk/apis/snap/index.ts", + "packages/canvas/src/sdk/apis/snap/snap.ts", + "packages/canvas/src/sdk/apis/viewport/viewport.ts", + "src/mural/addons/core/mouse/mouse-manager.tsx", + "src/mural/addons/widget-compositors/enhanced-kanban-board/plugins/resize.ts", + "src/mural/business/drag-selected-widgets/index.ts", + "src/mural/business/resize-widgets/utils/apply-deltas-and-resize.ts", + "src/mural/business/resize-widgets/utils/calculate-scales.ts", + "src/mural/business/resize-widgets/utils/get-uniform-scale.ts", + "src/mural/business/resize-widgets/utils/is-uniform-resize.ts", + "src/mural/business/resize-widgets/utils/resize-single-widget.ts", + "src/mural/business/resize/resize-table/index.ts", + "src/mural/business/resize/resize-table/util.ts", + "src/mural/business/snap-to-grid.ts" + ], + "total_files": 28, + "body_preview": "**[NEXT-450 Move `snap` SDK into packages](https://mural.atlassian.net/browse/NEXT-450)**\r\n\r\nIn this PR:\r\n* Move `snap` SDK and related helpers into packages\r\n* Made `primitive` SDK accessible via `SubSdk`\r\n* Replaces `WidgetsSdkApi` with `PrimitiveApis` in some helpers\r\n\r\nThe environment: https://next-450.mural.engineering/" + }, + { + "number": 47143, + "title": "[NEXT-446] Move viewport SDK into packages", + "branch": "fix/next-446", + "merged_at": "2026-02-12", + "changed_files": 4, + "additions": 29, + "deletions": 30, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/viewport/index.ts", + "packages/canvas/src/sdk/apis/viewport/viewport.ts", + "src/mural/dispatcher/snipping-selection/snipping-selection-dispatcher.test.ts", + "src/mural/sdk/apis/index.ts" + ], + "total_files": 4, + "body_preview": "**[NEXT-446 Move viewport SDK into packages](https://mural.atlassian.net/browse/NEXT-446)**\r\n\r\nThis PR moves viewport SDK implementation into packages.\r\n\r\nThe environment: https://next-446.mural.engineering/" + }, + { + "number": 47127, + "title": "Updates `package/canvas` relative barrel imports to be explicit", + "branch": "fix-barrel-imports", + "merged_at": "2026-02-12", + "changed_files": 13, + "additions": 39, + "deletions": 31, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + ".knip.jsonc", + "package-lock.json", + "packages/canvas/src/sdk/apis/content-extension/stage-manager.ts", + "packages/canvas/src/sdk/apis/sidebar/types.ts", + "packages/canvas/src/sdk/apis/system-of-record/types.ts", + "packages/canvas/src/sdk/apis/widgets/connector/connector.ts", + "packages/canvas/src/sdk/primitives/primitive-api.ts", + "packages/canvas/src/sdk/primitives/widgets/selectors.test.ts", + "packages/canvas/src/sdk/primitives/widgets/selectors.ts", + "packages/canvas/src/sdk/primitives/widgets/widget-primitive-api.ts", + "packages/canvas/src/tools-api/builders/index.ts", + "packages/canvas/src/tools-api/builders/toolbar/index.ts", + "packages/canvas/src/tools-api/builders/toolbar/tool-instance.test.ts" + ], + "total_files": 13, + "body_preview": "Updates all relative imports in `@muralco/canvas` to point directly to the file exporting the symbol needed, instead of using a top level barrel. This will help reduce potential circular dependencies and unwanted code being included in subpath packages. " + }, + { + "number": 47134, + "title": "[NEXT-444] Move ported SDK part into packages", + "branch": "fix/next-444", + "merged_at": "2026-02-12", + "changed_files": 84, + "additions": 442, + "deletions": 404, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/canvas-sdk-apis.ts", + "packages/canvas/src/sdk/apis/index.ts", + "src/amp/apply-changes-to-mural.ts", + "src/amp/helpers.ts", + "src/mural/addons/core/concealed-data/html-concealed-data/helpers/get-labels-to-copy.ts", + "src/mural/addons/core/concealed-data/html-concealed-data/helpers/getTagsToCopy.ts", + "src/mural/addons/core/context-menu/lock/index.tsx", + "src/mural/addons/core/fixed-widget-toolbar/lock/lock-tool.test.tsx", + "src/mural/addons/core/fixed-widget-toolbar/lock/lock-tool.tsx", + "src/mural/addons/core/toolbar/define-button.tsx", + "src/mural/addons/jira-cloud/helpers/helpers.test.ts", + "src/mural/addons/jira-legacy/apps-catalog-page-content/index.tsx", + "src/mural/addons/notetaker/api.ts", + "src/mural/addons/research-mural/research-mural-ui/components/InitiateResearchModal.tsx", + "src/mural/addons/research-mural/research-mural-ui/hooks/useSalesforceAIResearch.tsx", + "src/mural/addons/system-of-record/common/index.ts", + "src/mural/business/add-template-to-canvas/index.ts", + "src/mural/business/add-template-to-canvas/updateWidgetsCEsFromTemplate.test.ts", + "src/mural/business/add-widgets/index.ts", + "src/mural/business/can-cluster-freeform-area.ts" + ], + "total_files": 84, + "body_preview": "**[NEXT-444 Move ported SDK part into packages](https://mural.atlassian.net/browse/NEXT-444)**\r\n\r\nThis PR introduces `CanvasSdkApis` that represents SDKs subset moved into packages. `SdkApis` extends it.\r\nAlso `SubSdk<'sdk1' | 'sdk2'>` was added to specify SDK subsets.\r\n\r\nThe environment: https://next-444.mural.engineering/" + }, + { + "number": 47064, + "title": "[EN-3571] add first screen for new workspace consolidation modal", + "branch": "feat/en-3571-first-wc-screen", + "merged_at": "2026-02-12", + "changed_files": 16, + "additions": 1234, + "deletions": 1003, + "packages_touched": [ + "api", + "settings" + ], + "files_sample": [ + "packages/api/src/companies.ts", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/reducer.ts", + "packages/settings/company-settings/src/views/company-workspaces/hooks/useEligibleConsolidationWorkspaces.ts", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/ConsolidationTimeStep.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/ConsolidationTimeStep.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidate.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidate.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidation-time-step.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidation-time-step.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/destination-dropdown.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/destination-dropdown.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/source-and-destination-selection.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/source-workspaces-list.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/styles.module.sass", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/types.ts" + ], + "total_files": 16, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nAdds a functional first screen to the new workspace consolidation modal\r\n- Reflects either the inline or bulk selection of workspaces selected by the user in table format, with some metadata information\r\n- Generates a list of eligible destination workspaces based on a composition of a query and an exclusion of currently selected source workspaces\r\n- Graceful query loading and error states\r\n- Stores destination workspace selection in a top le" + }, + { + "number": 47058, + "title": "[bug][connection-verification] production realtime /ping refactor, regional URL exceptions, CORS troubleshooting", + "branch": "bug/connection-verification-pt-i", + "merged_at": "2026-02-11", + "changed_files": 5, + "additions": 412, + "deletions": 49, + "packages_touched": [ + "connection-verification" + ], + "files_sample": [ + "packages/connection-verification/src/hooks/use-connectivity-test.test.ts", + "packages/connection-verification/src/hooks/use-connectivity-test.ts", + "packages/connection-verification/src/pages/can-i-connect/index.tsx", + "packages/connection-verification/src/utils/region-urls.test.ts", + "packages/connection-verification/src/utils/region-urls.ts" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we relied on the `ping` endpoint in the production realtime service.\r\nHaving been told this endpoint is disabled in production due to some custom haproxy implementation,\r\nwe're implementing a work around.\r\n\r\nNow, with these changes, we rely on the user channel to confirm connection to realtime. In the future, it would be wise to go back to the `/ping` impelmentation for greater assurance that a user can connect\r\nto " + }, + { + "number": 47097, + "title": "[NEXT-441] Migrate low priority dispatcher functions", + "branch": "update/migrate-low-dispatcher-functions", + "merged_at": "2026-02-10", + "changed_files": 33, + "additions": 52, + "deletions": 70, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/clipboard/index.ts", + "packages/canvas/src/dispatcher/clipboard/utils/is-markdown.ts", + "packages/canvas/src/dispatcher/facilitation/timer/helpers.ts", + "packages/canvas/src/dispatcher/facilitation/timer/index.ts", + "packages/canvas/src/dispatcher/file-preview/index.ts", + "packages/canvas/src/dispatcher/file-preview/utils.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/dispatcher/input/index.ts", + "packages/canvas/src/dispatcher/input/keyboard/util.ts", + "packages/canvas/src/dispatcher/labels/index.ts", + "packages/canvas/src/dispatcher/labels/types.ts", + "packages/canvas/src/dispatcher/widgets/quick-add/defaults.ts", + "packages/canvas/src/dispatcher/widgets/quick-add/index.ts", + "src/modals/content-viewer/components/page-asset-handler.ts", + "src/mural/addons/core/editors/lexical/common/keydown-handlers.ts", + "src/mural/addons/core/keyboard-handlers/accessibility-handlers.ts", + "src/mural/addons/core/keyboard-handlers/move-handlers.ts", + "src/mural/addons/core/paste-handlers/index.tsx", + "src/mural/addons/core/paste-handlers/is-markdown.test.ts", + "src/mural/addons/timer/controller.tsx" + ], + "total_files": 33, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis PR continues the migration of \u201clow priority\u201d dispatcher utilities from the app-level mural dispatcher into the shared @muralco/canvas/dispatcher package, updating app code and tests to consume the new shared exports.\r\n\r\nChanges:\r\n\r\n- Repointed multiple call sites to import dispatcher utilities/constants from @muralco/canvas/dispatcher (keyboard, quick-add padding, labels API types, markdown detection, timer helper, file-preview range he" + }, + { + "number": 47059, + "title": "[NEXT-435] Move `primitives` SDK into packages", + "branch": "fix/next-435", + "merged_at": "2026-02-10", + "changed_files": 349, + "additions": 826, + "deletions": 1054, + "packages_touched": [ + "canvas", + "canvas-widgets", + "geometry" + ], + "files_sample": [ + "CODEOWNERS", + "packages/canvas-widgets/src/store/widget-store.test.ts", + "packages/canvas-widgets/src/store/widget-store.ts", + "packages/canvas/src/sdk/apis/selection/selectors.ts", + "packages/canvas/src/sdk/apis/widgets/changes/systems/absorption/all-or-nothing/utils/get-group-by-part-of.ts", + "packages/canvas/src/sdk/common/consts-the-universe-must-be-aware-of.ts", + "packages/canvas/src/sdk/primitives/index.ts", + "packages/canvas/src/sdk/primitives/primitive-api.ts", + "packages/canvas/src/sdk/primitives/types.ts", + "packages/canvas/src/sdk/primitives/widgets/defaults.test.ts", + "packages/canvas/src/sdk/primitives/widgets/defaults.ts", + "packages/canvas/src/sdk/primitives/widgets/get-global-position.ts", + "packages/canvas/src/sdk/primitives/widgets/index.ts", + "packages/canvas/src/sdk/primitives/widgets/selectors.test.ts", + "packages/canvas/src/sdk/primitives/widgets/selectors.ts", + "packages/canvas/src/sdk/primitives/widgets/types.ts", + "packages/canvas/src/sdk/primitives/widgets/widget-primitive-api.ts", + "packages/geometry/src/aabb.ts", + "packages/geometry/src/obb.ts", + "src/mural/addons/absorption-feedback/index.test.ts" + ], + "total_files": 349, + "body_preview": "**[NEXT-435 Move `primitives` SDK into packages](https://mural.atlassian.net/browse/NEXT-435)**\r\n\r\nIn this PR:\r\n* Moved `primitive` SDK into packages (the main target of this PR)\r\n* Fixed `WidgetStore.getAabb` results inconsistency for cases when one id passed, or an array of ids\r\n* Removed `sanitizeWidgetBbox`, `internalComputeBounds`, `internalGetInaccurateAbsolutePosition`, and `getBounds` from primitives SDK \r\n* Simplified `getWidgetsWithinAabb`, now it uses WidgetStore\r\n* Moved `isBeingDra" + }, + { + "number": 47071, + "title": "Migrate core register functionality and dispatcher + tools api prereqs", + "branch": "register-dispatcher-files", + "merged_at": "2026-02-09", + "changed_files": 208, + "additions": 316, + "deletions": 274, + "packages_touched": [ + "canvas", + "tools-api" + ], + "files_sample": [ + "CODEOWNERS", + "packages/canvas/build/webpack.config.js", + "packages/canvas/package.json", + "packages/canvas/src/dispatcher/extension-points.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/toolbar-utils.ts", + "packages/canvas/src/register/create.ts", + "packages/canvas/src/register/index.ts", + "packages/canvas/src/register/util.ts", + "packages/canvas/src/tools-api/README.md", + "packages/canvas/src/tools-api/builders/index.ts", + "packages/canvas/src/tools-api/builders/selectors.ts", + "packages/canvas/src/tools-api/builders/tool/index.ts", + "packages/canvas/src/tools-api/builders/tool/tool.ts", + "packages/canvas/src/tools-api/builders/toolbar/index.ts", + "packages/canvas/src/tools-api/builders/toolbar/tool-instance.test.ts", + "packages/canvas/src/tools-api/builders/toolbar/tool-instance.ts", + "packages/canvas/src/tools-api/index.ts", + "packages/tools-api/README.md" + ], + "total_files": 208, + "body_preview": "### Summary\r\n\r\nMigrates core register and dispatcher into `@muralco/canvas`, and moves tools-api builders into the canvas package as `@muralco/canvas/tools-api`. Consumers now import from canvas instead of `src/` paths.\r\n\r\nThe `@muralco/canvas/tools-api` package will be used for tools api functionality that is canvas specific. There are some usages of ToolsAPI related interfaces and functionality in non canvas parts of the product, these need to live in the `@muralco/tools-api` package. \r\n\r\n### " + }, + { + "number": 47030, + "title": "[NEXT-429] refactor: migrate canvas sor business rules to integrations-platform", + "branch": "update/migrate-canvas-sor-to-integrations", + "merged_at": "2026-02-06", + "changed_files": 180, + "additions": 284, + "deletions": 284, + "packages_touched": [ + "canvas", + "integrations-platform" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/system-of-record/components/index.ts", + "packages/canvas/src/business/system-of-record/index.ts", + "packages/canvas/src/business/system-of-record/integrations/rally/milestone/index.ts", + "packages/canvas/src/business/system-of-record/integrations/salesforce/common/index.ts", + "packages/canvas/src/business/system-of-record/integrations/salesforce/common/linkedin/index.ts", + "packages/canvas/src/business/system-of-record/integrations/salesforce/contact/index.ts", + "packages/canvas/src/business/system-of-record/types/index.ts", + "packages/canvas/src/business/system-of-record/utils/index.ts", + "packages/canvas/src/business/system-of-record/utils/model-version.ts", + "packages/integrations-platform/package.json", + "packages/integrations-platform/src/platform/system-of-record/components/export-records-modal/index.ts", + "packages/integrations-platform/src/platform/system-of-record/components/export-records-modal/types.ts", + "packages/integrations-platform/src/platform/system-of-record/components/index.ts", + "packages/integrations-platform/src/platform/system-of-record/index.ts", + "packages/integrations-platform/src/platform/system-of-record/integrations/asana/index.ts", + "packages/integrations-platform/src/platform/system-of-record/integrations/asana/task/index.ts", + "packages/integrations-platform/src/platform/system-of-record/integrations/asana/task/test-data.ts", + "packages/integrations-platform/src/platform/system-of-record/integrations/index.ts" + ], + "total_files": 180, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis pull request migrates System of Record (SOR) business rules, utilities, types, and test fixtures from @muralco/canvas/business to @muralco/integrations-platform/platform. The migration aims to decouple SOR functionality from the canvas package and consolidate it into a dedicated integrations platform package.\r\n\r\nChanges:\r\n- Migrated SOR utility functions (getWidgetGridPositions, isLatestSorModelVersion, isValidSorModelVersion) and types" + }, + { + "number": 47063, + "title": "Move test specific dependencies to `devDependencies`", + "branch": "fix-mocks-deps", + "merged_at": "2026-02-06", + "changed_files": 4, + "additions": 78, + "deletions": 12, + "packages_touched": [ + "dashboard", + "identity-and-access-management" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/room-page/package.json", + "packages/identity-and-access-management/package.json" + ], + "total_files": 4, + "body_preview": "Moves test specific packages from `dependencies` to `devDependencies`. " + }, + { + "number": 47057, + "title": "Add deployment watcher for beta and stable", + "branch": "stable-fix/better-deployment-watcher", + "merged_at": "2026-02-06", + "changed_files": 5, + "additions": 145, + "deletions": 38, + "packages_touched": [], + "files_sample": [ + ".github/workflows/alpha-deployment.yml", + ".github/workflows/beta-deployment.yml", + ".github/workflows/master-deployment.yml", + ".github/workflows/stable-deployment.yml", + "scripts/wait-for-deployment.js" + ], + "total_files": 5, + "body_preview": "## Summary\n\nAdds a deployment watcher that polls the deployed app until the version comment in the HTML matches the pushed commit SHA.\n\n### Changes\n- **scripts/wait-for-deployment.js**: Node.js script that polls a URL, extracts `` from the HTML, and exits when it matches the expected commit\n- **beta-deployment.yml**: Waits for beta.mural.co to serve the pushed commit; cancels in-progress runs when a new push lands\n- **stable-deployment.yml**: Waits for app.mural.co to ser" + }, + { + "number": 47051, + "title": "Backmerge conflict 2026-02-06", + "branch": "beta-fix/conflict-0a9abf7-b257aa4", + "merged_at": "2026-02-06", + "changed_files": 36, + "additions": 59, + "deletions": 39, + "packages_touched": [ + "canvas", + "collaboration-insights", + "connection-verification", + "dashboard", + "enterprise-security", + "identity-and-access-management", + "playbooks", + "route-create-team", + "route-reset-password", + "route-terms-and-conditions", + "settings" + ], + "files_sample": [ + ".github/workflows/lint-codeowners.yml", + ".github/workflows/quality.yml", + "CODEOWNERS", + "build/lint.sh", + "lefthook.yml", + "package-lock.json", + "package.json", + "packages/canvas/package.json", + "packages/collaboration-insights/src/components/info-card/info-card.tsx", + "packages/collaboration-insights/src/components/table/types.tsx", + "packages/connection-verification/.eslintrc.js", + "packages/connection-verification/jest.config.js", + "packages/dashboard/archived-murals/src/archived.test.tsx", + "packages/dashboard/archived-murals/src/components/archived-murals-table.test.tsx", + "packages/dashboard/archived-murals/src/components/modals/index.tsx", + "packages/dashboard/archived-murals/src/types.test.ts", + "packages/dashboard/archived-murals/src/types.ts", + "packages/dashboard/cards/src/trackingUtils.ts", + "packages/dashboard/room-page/src/murals-grid/DraggableThumb.test.tsx", + "packages/dashboard/room-page/src/murals-grid/blank-state/DashboardBlankState.tsx" + ], + "total_files": 36, + "body_preview": "Unable to automatically merge 'stable' into 'beta' due to merge conflicts.\n\nHey please fix conflicts and merge this PR into beta\n\n# Merge instructions\n## Always use MERGE and do not SQUASH nor REBASE :point_down:\n```bash\ngit fetch\ngit checkout beta-fix/conflict-0a9abf7-b257aa4\ngit merge origin/beta\n```\n\n**Actually fix the conflict**\n```bash\ngit commit\ngit push origin HEAD\n```\n\n**Do not squash/rebase your commits.**\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Main risk is CI/tooli" + }, + { + "number": 47044, + "title": "Improve QA Validations", + "branch": "stable-fix/qa-improvements", + "merged_at": "2026-02-06", + "changed_files": 36, + "additions": 111, + "deletions": 41, + "packages_touched": [ + "canvas", + "collaboration-insights", + "connection-verification", + "dashboard", + "enterprise-security", + "identity-and-access-management", + "playbooks", + "route-create-team", + "route-reset-password", + "route-terms-and-conditions", + "settings" + ], + "files_sample": [ + ".github/workflows/lint-codeowners.yml", + ".github/workflows/quality.yml", + "CODEOWNERS", + "build/lint.sh", + "lefthook.yml", + "package-lock.json", + "package.json", + "packages/canvas/package.json", + "packages/collaboration-insights/src/components/info-card/info-card.tsx", + "packages/collaboration-insights/src/components/table/types.tsx", + "packages/connection-verification/.eslintrc.js", + "packages/connection-verification/jest.config.js", + "packages/dashboard/archived-murals/src/archived.test.tsx", + "packages/dashboard/archived-murals/src/components/archived-murals-table.test.tsx", + "packages/dashboard/archived-murals/src/components/modals/index.tsx", + "packages/dashboard/archived-murals/src/types.test.ts", + "packages/dashboard/archived-murals/src/types.ts", + "packages/dashboard/cards/src/trackingUtils.ts", + "packages/dashboard/room-page/src/murals-grid/DraggableThumb.test.tsx", + "packages/dashboard/room-page/src/murals-grid/blank-state/DashboardBlankState.tsx" + ], + "total_files": 36, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIntroduces new linting rules to improve project QA.\r\n- ESLint packages related code. And fixes the current offender code.\r\n- CODEOWNERS linting action. And fixes the current errors\r\n- Improves lefthooks to also run for packages\r\n\r\n#### Reviewer Resources\r\n- If it builds, works. Only cosmetic code changes\r\n- [Jira Ticket](https://www.youtube.com/watch?v=H3KpR6EyZX0)\r\n" + }, + { + "number": 47031, + "title": "[EN-3636] add workspace consolidation modal shell", + "branch": "feat/en-3636-add-modal-shell", + "merged_at": "2026-02-05", + "changed_files": 7, + "additions": 393, + "deletions": 2, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/reducer.ts", + "packages/settings/company-settings/src/views/company-workspaces/modals/confirm-bulk-action.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidate.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/consolidate.tsx", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/index.ts", + "packages/settings/company-settings/src/views/company-workspaces/modals/consolidate/styles.module.sass" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nAdds a shell modal for filling out the content of the new workspace consolidation modal\r\n- Works with both inline and bulk action flow triggers\r\n- Controls and local state for tracking the step/stage of the modal flow\r\n- Dynamic title/button content, back button visibility etc based on modal step\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3636) to understand the context of this " + }, + { + "number": 47013, + "title": "Migrate helpers + SDK Context Prereqs", + "branch": "sdk-context-prereq", + "merged_at": "2026-02-05", + "changed_files": 131, + "additions": 345, + "deletions": 275, + "packages_touched": [ + "canvas", + "share-modal" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/canvas/build/webpack.config.js", + "packages/canvas/package.json", + "packages/canvas/src/helpers/animated-value.test.ts", + "packages/canvas/src/helpers/engine-positioning.ts", + "packages/canvas/src/helpers/facilitation/canvas-reactions/get-emoji-name.ts", + "packages/canvas/src/helpers/facilitation/canvas-reactions/get-reaction-tooltip-text.ts", + "packages/canvas/src/helpers/facilitation/canvas-reactions/helpers.ts", + "packages/canvas/src/helpers/facilitation/canvas-reactions/index.test.ts", + "packages/canvas/src/helpers/facilitation/canvas-reactions/index.ts", + "packages/canvas/src/helpers/facilitation/follow/follow.ts", + "packages/canvas/src/helpers/facilitation/follow/index.ts", + "packages/canvas/src/helpers/facilitation/follow/summon.ts", + "packages/canvas/src/helpers/facilitation/index.ts", + "packages/canvas/src/helpers/file-icon-catalog.ts", + "packages/canvas/src/helpers/get-clusters-in-rect.ts", + "packages/canvas/src/helpers/get-default-thumbnail.test.ts", + "packages/canvas/src/helpers/get-instruction-base64.ts", + "packages/canvas/src/helpers/get-text-decoration.ts" + ], + "total_files": 131, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n#### Files moved\r\n\r\nCode was moved into `packages/canvas` and re-exported so SDK/context code can depend on the canvas package instead of `src/mural`.\r\n\r\n**1. General helpers** \r\n`src/mural/helpers/` \u2192 `packages/canvas/src/helpers/`\r\n\r\n- `engine-positioning.ts`\r\n- `file-icon-catalog.ts`\r\n- `get-clusters-in-rect.ts`\r\n- `get-instruction-base64.ts`\r\n- `get-text-decoration.ts`\r\n- `gifs-surveillance.ts`\r\n- `image-lod.ts`\r\n- `is-array-different" + }, + { + "number": 47019, + "title": "[NEXT-382] Remove redundant `getSelectionBoundingRect` function", + "branch": "fix/next-382", + "merged_at": "2026-02-05", + "changed_files": 15, + "additions": 70, + "deletions": 97, + "packages_touched": [ + "geometry" + ], + "files_sample": [ + "packages/geometry/src/aabb.ts", + "src/mural/addons/core/widget-composition/manager/plugins/drag/strategies/remove-absorb-feedback.ts", + "src/mural/addons/core/widget-composition/manager/plugins/drag/strategies/remove-snapping-guides.ts", + "src/mural/addons/widget-compositors/apis/planner-board/utils.test.ts", + "src/mural/addons/widget-compositors/apis/planner-board/utils.ts", + "src/mural/addons/widget-compositors/enhanced-kanban-board/plugins/drag-transient-state.test.ts", + "src/mural/addons/widget-compositors/enhanced-kanban-board/plugins/drag-transient-state.ts", + "src/mural/addons/widget-compositors/enhanced-kanban-board/plugins/drag.test.ts", + "src/mural/addons/widget-compositors/enhanced-kanban-board/plugins/integrations.ts", + "src/mural/addons/widget-compositors/utils.ts", + "src/mural/dispatcher/hover-feedback/index.test.ts", + "src/mural/dispatcher/hover-feedback/index.ts", + "src/mural/helpers/get-selection-bounding-rect.ts", + "src/test/unit/helpers/smart-frameworks-compositor-api-setup.ts", + "src/test/unit/mocks/smart-frameworks-mocks.ts" + ], + "total_files": 15, + "body_preview": "**[NEXT-382 Inspect `helpers` folder and move geometry/math related functions into geometry package](https://mural.atlassian.net/browse/NEXT-382)**\r\n\r\nThis PR removes `getSelectionBoundingRect` in favor of `sdk.selection.getBounds()`, `sdk.widgets.getAabb()` or `widgetStore.getAabb()`. \r\n\r\nUpdated `Aabb.isEmpty()` function to work correctly with `NaN`.\r\n\r\nThe environment: https://next-382.mural.engineering/" + }, + { + "number": 46929, + "title": "Refine/unify add image logic", + "branch": "refine/unify-add-image-logic", + "merged_at": "2026-02-05", + "changed_files": 60, + "additions": 6039, + "deletions": 288, + "packages_touched": [ + "canvas", + "platform" + ], + "files_sample": [ + "CODEOWNERS", + "packages/canvas/src/dispatcher/mural/index.ts", + "packages/canvas/src/dispatcher/mural/types.ts", + "packages/platform/base-64/src/base64-to-file.test.ts", + "packages/platform/base-64/src/base64-to-file.ts", + "packages/platform/base-64/src/index.ts", + "packages/platform/base-64/src/is-base-64.test.ts", + "packages/platform/base-64/src/is-base-64.ts", + "src/mural/business/add-widgets/persistThirdPartyImage.ts", + "src/mural/business/update-natural-dimensions/index.test.ts", + "src/mural/business/update-natural-dimensions/index.ts", + "src/mural/dispatcher/file-preview/index.ts", + "src/mural/dispatcher/mural/index.tsx", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/handle-upload-error.test.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/handle-upload-error.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/upload-file.test.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/upload-file.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/upload-image-by-url.test.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/upload-image-by-url.ts", + "src/mural/dispatcher/mural/upload-assets/by-files/helpers/upload-image.test.ts" + ], + "total_files": 60, + "body_preview": "## Ticket \ud83c\udfab \r\n\r\nhttps://mural.atlassian.net/browse/CWI-2567\r\n\r\n## What was changed and why? \ud83e\udd14 \r\n\r\nDemo Loom: https://www.loom.com/share/6aa0a2b3657d4fe6be603b15528096c6\r\n\r\nIt seems that Google has changed the html layout of their image search results, and when a user drags the images from the search results onto the canvas, they fail to upload onto the canvas.\r\n\r\nThis is because the urls for these images are now base64 encoded, and this was breaking uploads.\r\n\r\nIn order to handle this properly, " + }, + { + "number": 47022, + "title": "[NEXT-424] migrate all companies global admin view (take 2 \ud83d\ude44)", + "branch": "feat/next-424-migrate-all-comps", + "merged_at": "2026-02-04", + "changed_files": 30, + "additions": 283, + "deletions": 225, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "features/settings/user/companies/create-company.feature", + "packages/settings/company-settings/features/v2/views/all-companies/create-company.feature", + "packages/settings/company-settings/features/v2/views/all-companies/index.feature", + "packages/settings/company-settings/features/v2/views/all-companies/search.feature", + "packages/settings/company-settings/src/views/all-companies/controller.tsx", + "packages/settings/company-settings/src/views/all-companies/create/index.tsx", + "packages/settings/company-settings/src/views/all-companies/create/style.sass", + "packages/settings/company-settings/src/views/all-companies/domain-list/header.tsx", + "packages/settings/company-settings/src/views/all-companies/domain-list/index.tsx", + "packages/settings/company-settings/src/views/all-companies/domain-list/item.tsx", + "packages/settings/company-settings/src/views/all-companies/domain-list/style.sass", + "packages/settings/company-settings/src/views/all-companies/domain-selector/index.tsx", + "packages/settings/company-settings/src/views/all-companies/domain-selector/style.sass", + "packages/settings/company-settings/src/views/all-companies/domains/index.tsx", + "packages/settings/company-settings/src/views/all-companies/domains/styles.module.sass", + "packages/settings/company-settings/src/views/all-companies/index.tsx", + "packages/settings/company-settings/src/views/all-companies/list/index.tsx", + "packages/settings/company-settings/src/views/all-companies/list/style.sass", + "packages/settings/company-settings/src/views/all-companies/style.sass", + "packages/settings/company-settings/src/views/all-companies/view.tsx" + ], + "total_files": 30, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nMoves all **view** level code and dependencies (components, helpers, etc.) for the `/me/companies` route to the `@muralco/company-settings` package\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-424) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-424-migrate-all-comps.mural.engineering/) to perform a smoke test. ([all testing " + }, + { + "number": 47021, + "title": "[FEP-6425] - remove packages docs script", + "branch": "remove-packages-docs-script", + "merged_at": "2026-02-04", + "changed_files": 241, + "additions": 108, + "deletions": 1743, + "packages_touched": [ + "README.md", + "accessibility", + "admin-reports", + "apps", + "authentication-lib", + "beacon", + "billing", + "canvas", + "canvas-asset-management", + "canvas-engine-types", + "canvas-widgets", + "claim", + "collaboration-insights", + "color-palette", + "company-template-collections", + "config", + "connection-verification", + "core-dispatcher", + "create-package", + "dashboard", + "deprecation", + "download-exports", + "embedly", + "enterprise-security", + "feature-celebrate", + "geometry", + "identity-and-access-management", + "iframe-event-dispatcher", + "integrations", + "integrations-platform", + "learning", + "legacy-ui", + "logger", + "media", + "modals-common", + "mural-state-container", + "mural-utils", + "native", + "navigate", + "optimizely", + "parking-lot", + "pdf-import", + "permissions", + "platform", + "playbooks", + "queries", + "realtime", + "realtime-client", + "route-about-you", + "route-access-required", + "route-bye", + "route-check-email", + "route-check-email-code", + "route-create-password", + "route-create-team", + "route-errors", + "route-invitation", + "route-invitation-verify-email", + "route-join-company-workspace", + "route-reset-password", + "route-signin", + "route-signup", + "route-terms-and-conditions", + "route-verify-code", + "route-verify-email", + "salesforce-chat", + "scim", + "settings", + "share-modal", + "shared", + "state-api", + "telemetry", + "templates", + "test-mocks", + "testing-tools", + "theme-manager", + "toast", + "tools-api", + "tracking-lib", + "truncated", + "user" + ], + "files_sample": [ + ".github/workflows/quality.yml", + ".knip.jsonc", + "README.md", + "package-lock.json", + "package.json", + "packages/README.md", + "packages/accessibility/api-extractor.json", + "packages/accessibility/package.json", + "packages/admin-reports/api-extractor.json", + "packages/admin-reports/package.json", + "packages/apps/api-extractor.json", + "packages/apps/package.json", + "packages/authentication-lib/api-extractor.json", + "packages/authentication-lib/package.json", + "packages/beacon/api-extractor.json", + "packages/beacon/package.json", + "packages/billing/api-extractor.json", + "packages/billing/package.json", + "packages/canvas-asset-management/api-extractor.json", + "packages/canvas-asset-management/package.json" + ], + "total_files": 241, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6425](https://mural.atlassian.net/browse/FEP-6425)\r\n\r\n#### Remove docs script and api-extractor / api-documenter\r\n \r\n- Stop generating API docs via api-extractor and api-documenter.\r\n- Remove all related config, scripts, and dependencies from the repo.\r\n\r\n#### Summary of changes\r\n\r\n- Dropped the root docs script and the CI job that ran it; removed the generate-docs shell script and the turbo docs tas" + }, + { + "number": 47010, + "title": "Updates Test Rigs to have default `cacheTime` of 0", + "branch": "test-rig-query-cache", + "merged_at": "2026-02-03", + "changed_files": 4, + "additions": 22, + "deletions": 5, + "packages_touched": [ + "queries" + ], + "files_sample": [ + "package-lock.json", + "packages/queries/package.json", + "packages/queries/src/queryConfig.ts", + "src/route-config.tsx" + ], + "total_files": 4, + "body_preview": "Test env: https://test-rig-query-cache.mural.engineering" + }, + { + "number": 47008, + "title": "Small improvements on the `Hints` section of the widget inspector", + "branch": "refactor/hints-inspector", + "merged_at": "2026-02-03", + "changed_files": 4, + "additions": 23, + "deletions": 14, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/dev/dev-menu/index.tsx", + "src/mural/addons/dev/dev-panel/index.ts", + "src/mural/addons/dev/widgets-inspector/index.tsx", + "src/mural/addons/dev/widgets-inspector/styles.module.sass" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds some minor improvements to the `Hints` section of the widget inspector to give it less relevance than what it has right now.\r\nIt basically has a smaller size, it starts collapsed by default and then some minor visual tweaks.\r\n\r\nThe idea behind this is to give more relevance to the widget properties, which is the main usage we give to the widget inspector\r\n\r\n\ud83c\udf0e **Test env**: https://hints-inspector.mural.engineering/\r\n\r\n_This PR" + }, + { + "number": 47001, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-final", + "merged_at": "2026-02-03", + "changed_files": 307, + "additions": 791, + "deletions": 870, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/mural/index.ts", + "packages/canvas/src/sdk/state/mural/mural.ts", + "packages/canvas/src/sdk/state/register/index.ts", + "packages/canvas/src/sdk/state/register/register.ts", + "packages/canvas/src/sdk/state/register/sidebar.ts", + "src/lib/tools-api/builders/selectors.test.ts", + "src/lib/tools-api/builders/selectors.ts", + "src/lib/tools-api/builders/tool/index.ts", + "src/lib/tools-api/builders/toolbar/index.test.ts", + "src/lib/tools-api/builders/toolbar/index.ts", + "src/lib/tools-api/registration/types.ts", + "src/lib/tools-api/renderers/toolbar/index.test.tsx", + "src/lib/tools-api/renderers/toolbar/index.tsx", + "src/lib/tools-api/wellknown-toolbars/fixed-widget-toolbar.test.tsx", + "src/modals/apps-catalog/app-page/index.test.tsx", + "src/modals/apps-catalog/app-page/index.tsx", + "src/modals/apps-catalog/app-setting/index.tsx" + ], + "total_files": 307, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `RegisterState` and `MuralState` into canvas package.\r\n\r\nThe environment: https://next-356-final.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Medium risk due to a broad refactor that touches many imports and state initialization paths; any mismatch in the new exported `MuralState.getInitial`/`RegisterState.initial` shapes could cause runtime regression" + }, + { + "number": 46952, + "title": "[NEXT-280] package user profile view", + "branch": "feat/next-280-package-profile-view", + "merged_at": "2026-02-02", + "changed_files": 109, + "additions": 600, + "deletions": 1523, + "packages_touched": [ + "legacy-ui", + "queries", + "settings" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/legacy-ui/src/settings/components/members-list/types.ts", + "packages/queries/src/hooks/useWorkspaceUsersQuery.tsx", + "packages/settings/settings-commons/package.json", + "packages/settings/settings-commons/src/defs.d.ts", + "packages/settings/settings-commons/src/helpers/index.ts", + "packages/settings/settings-commons/src/helpers/upload/index.ts", + "packages/settings/settings-commons/src/helpers/upload/upload.ts", + "packages/settings/user-settings/.eslintrc.js", + "packages/settings/user-settings/README.md", + "packages/settings/user-settings/api-extractor.json", + "packages/settings/user-settings/build/webpack.config.js", + "packages/settings/user-settings/jest.config.js", + "packages/settings/user-settings/jest.setup.js", + "packages/settings/user-settings/package.json", + "packages/settings/user-settings/src/components/index.ts", + "packages/settings/user-settings/src/components/leave-workspace/confirm-target.tsx", + "packages/settings/user-settings/src/components/leave-workspace/index.test.tsx", + "packages/settings/user-settings/src/components/leave-workspace/index.ts" + ], + "total_files": 109, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis PR moves the view level code (and all sub components, utilities, etc.) for the `/me/profile` route to a new `@muralco/user-settings` package. This is an initial PR toward migrating the \"user dashboard\" family of routes (`/me/*` to the packaging system\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-280) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing " + }, + { + "number": 46958, + "title": "[NEXT-422] Migrate high and medium priority business rules", + "branch": "update/migrate-high-priority-business-rules", + "merged_at": "2026-02-02", + "changed_files": 82, + "additions": 198, + "deletions": 149, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/addons/core/bottom-bar-menu/index.ts", + "packages/canvas/src/addons/core/bottom-bar-menu/util.ts", + "packages/canvas/src/addons/core/index.ts", + "packages/canvas/src/business/labels/index.ts", + "packages/canvas/src/business/labels/utils.ts", + "packages/canvas/src/business/system-of-record/components/export-records-modal/index.ts", + "packages/canvas/src/business/system-of-record/components/export-records-modal/types.ts", + "packages/canvas/src/business/system-of-record/components/index.ts", + "packages/canvas/src/business/system-of-record/index.ts", + "packages/canvas/src/business/system-of-record/integrations/salesforce/common/index.ts", + "packages/canvas/src/business/system-of-record/integrations/salesforce/common/types.ts", + "packages/canvas/src/business/system-of-record/types/index.ts", + "packages/canvas/src/business/system-of-record/types/search/filters/index.ts", + "packages/canvas/src/business/system-of-record/types/search/filters/string.tsx", + "packages/canvas/src/business/system-of-record/types/search/index.ts", + "packages/canvas/src/components/widgets/arrow/index.ts", + "packages/canvas/src/components/widgets/arrow/orthogonal-util.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/line-height.ts", + "src/mural/addons/ai/ai-cluster/create-cluster-area.ts" + ], + "total_files": 82, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR migrates high and medium priority business rules and utilities from local application directories to shared packages in @muralco/canvas. The migration improves code reusability and consolidates common functionality into a shared package that can be used across the codebase.\r\n\r\nChanges:\r\n\r\n- Migrated orthogonal arrow utilities from src/mural/components/widgets/arrow/orthogonal-util.ts to packages/canvas/src/components/widgets/arrow/" + }, + { + "number": 46980, + "title": "refactor: move src/lib/tools-api/well-known.ts to @muralco/tools-api \u2026", + "branch": "tools-api-well-known", + "merged_at": "2026-02-02", + "changed_files": 156, + "additions": 179, + "deletions": 176, + "packages_touched": [ + "tools-api" + ], + "files_sample": [ + "packages/tools-api/src/core/index.ts", + "packages/tools-api/src/core/well-known.ts", + "src/lib/tools-api/renderers/toolbar/index.test.tsx", + "src/lib/tools-api/renderers/toolbar/index.tsx", + "src/lib/tools-api/wellknown-toolbars/fixed-widget-toolbar.test.tsx", + "src/lib/tools-api/wellknown-toolbars/fixed-widget-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/mural-actions-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/navigation-sidebar-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/navigation-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/utilities-toolbar.tsx", + "src/mural/addons/ai/ai-chat/index.tsx", + "src/mural/addons/ai/ai-chat/panel/panel-header/index.tsx", + "src/mural/addons/ai/ai-cluster/dropdown-option.tsx", + "src/mural/addons/ai/ai-diagram/dropdown-option.tsx", + "src/mural/addons/ai/ai-generate-change-summary/dropdown-option.tsx", + "src/mural/addons/ai/ai-generate-ideas/dropdown-option.tsx", + "src/mural/addons/ai/ai-mindmaps/dropdown-option.tsx", + "src/mural/addons/ai/ai-org-chart/dropdown-option.tsx", + "src/mural/addons/ai/ai-rewrite/dropdown-option.tsx", + "src/mural/addons/ai/ai-sentiment-classification/dropdown-option.tsx" + ], + "total_files": 156, + "body_preview": "Moves `well-known.ts` tools-api definition to `packages/tools-api`" + }, + { + "number": 46916, + "title": "[NEXT-415] Continuing to migrate sdk apis", + "branch": "refactor/sdk-api-cont", + "merged_at": "2026-01-30", + "changed_files": 122, + "additions": 374, + "deletions": 308, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/apis/apps/apps.ts", + "packages/canvas/src/sdk/apis/apps/index.ts", + "packages/canvas/src/sdk/apis/apps/selectors.ts", + "packages/canvas/src/sdk/apis/assets/assets.ts", + "packages/canvas/src/sdk/apis/assets/index.ts", + "packages/canvas/src/sdk/apis/clipboard/clipboard.ts", + "packages/canvas/src/sdk/apis/clipboard/index.ts", + "packages/canvas/src/sdk/apis/config/config.ts", + "packages/canvas/src/sdk/apis/config/index.ts", + "packages/canvas/src/sdk/apis/config/selectors.ts", + "packages/canvas/src/sdk/apis/content-viewer/content-viewer.ts", + "packages/canvas/src/sdk/apis/content-viewer/index.ts", + "packages/canvas/src/sdk/apis/experiments/experiments.ts", + "packages/canvas/src/sdk/apis/experiments/index.ts", + "packages/canvas/src/sdk/apis/experiments/selectors.ts", + "packages/canvas/src/sdk/apis/experiments/types.ts", + "packages/canvas/src/sdk/apis/extensions/extensions.ts", + "packages/canvas/src/sdk/apis/extensions/index.ts" + ], + "total_files": 122, + "body_preview": "Test environment:\r\nhttps://sdk-api-cont.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor that moves/rewires many SDK APIs and selectors and updates dozens of imports; risk is mainly integration/typing mismatches or missed import paths rather than new business logic.\n> \n> **Overview**\n> Continues the SDK migration by moving additional APIs/selectors into `packages/canvas/src/sdk/apis` (including `apps`, `assets`, `clipboard`, `config`, `experiments`, `" + }, + { + "number": 46934, + "title": "Improve Cucumber Distributed Running Implementation", + "branch": "stable-fix/refactor-dist-cucumber", + "merged_at": "2026-01-30", + "changed_files": 20, + "additions": 390, + "deletions": 168, + "packages_touched": [], + "files_sample": [ + ".github/workflows/build.yml", + ".github/workflows/cluster-runners.yml", + ".github/workflows/cucumber-rig-runner.yml", + ".github/workflows/quality.yml", + ".github/workflows/queue-reaper.yml", + "CODEOWNERS", + "build/test-react.sh", + "cucumber-cluster/README.md", + "cucumber-cluster/common/cluster-helpers.js", + "cucumber-cluster/common/queue.js", + "cucumber-cluster/reporter/monitor-reporter.js", + "cucumber-cluster/scripts/finalizer.js", + "cucumber-cluster/scripts/queue_ripper.py", + "cucumber-cluster/scripts/trigger-workers.js", + "cucumber-cluster/to-patch/cluster-serde.js", + "cucumber-cluster/to-patch/cluster.js", + "cucumber-cluster/to-patch/consumer.js", + "cucumber-cluster/to-patch/producer.js", + "package.json", + "patches/@cucumber+cucumber+7.3.1.patch" + ], + "total_files": 20, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nReorganizes and improves the Cucumber distributed test (AKA React Test Rig) runner infrastructure with a focus in improve clarity on discovering issues, and future improvements, and at the same time reducing duplicated config.\r\n\r\n**Changes:**\r\n- Reorganized cucumber-cluster directory structure with dedicated folders for common utilities, patch files, scripts, and reporters\r\n- Consolidated GitHub Actions workflows by creating a reusable `cu" + }, + { + "number": 46937, + "title": "[NEXT-421] Migrate critical business rules from `/src/mural`", + "branch": "update/migrate-critical-business-rules", + "merged_at": "2026-01-29", + "changed_files": 94, + "additions": 203, + "deletions": 193, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/business/system-of-record/index.ts", + "packages/canvas/src/business/system-of-record/integrations/microsoft-planner/task/index.ts", + "packages/canvas/src/business/system-of-record/integrations/microsoft-planner/task/types.ts", + "packages/canvas/src/business/system-of-record/integrations/rally/milestone/index.ts", + "packages/canvas/src/business/system-of-record/integrations/rally/milestone/types.ts", + "packages/canvas/src/business/system-of-record/utils/tests/types.ts", + "src/mural/addons/internal-integrations/microsoft-planner/utils.ts", + "src/mural/addons/internal-integrations/rally/utils.ts", + "src/mural/business/system-of-record/bulk-sync/service.test.ts", + "src/mural/business/system-of-record/components/import-records-modal/modal.test.tsx", + "src/mural/business/system-of-record/components/widget-panel/region/index.test.tsx", + "src/mural/business/system-of-record/components/widget-panel/setting/index.test.tsx", + "src/mural/business/system-of-record/core/configuration/config-and-definition.test.ts", + "src/mural/business/system-of-record/core/configuration/index.test.ts", + "src/mural/business/system-of-record/core/import-record.test.ts", + "src/mural/business/system-of-record/core/index.test.ts", + "src/mural/business/system-of-record/core/resource/resource-cache.test.ts", + "src/mural/business/system-of-record/core/resource/resource-loader.test.ts", + "src/mural/business/system-of-record/core/sync/out-of-sync.test.ts", + "src/mural/business/system-of-record/core/widget-labels/build.test.ts" + ], + "total_files": 94, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThree type modules were moved from `src/mural/business/system-of-record/` into `packages/canvas` under the `@muralco/canvas/business` subpath.\r\n\r\n## Files moved\r\n\r\n| From (src/) | To (packages/canvas/) |\r\n|-------------|------------------------|\r\n| `mural/business/system-of-record/utils/tests/types.ts` | `src/business/system-of-record/utils/tests/types.ts` |\r\n| `mural/business/system-of-record/integrations/rally/milestone/types.ts` | `src/bu" + }, + { + "number": 46946, + "title": "[NEXT-356] Move register state-related and tool-related types into packages", + "branch": "fix/next-356-register-tool", + "merged_at": "2026-01-29", + "changed_files": 61, + "additions": 172, + "deletions": 154, + "packages_touched": [ + "canvas", + "tools-api" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/src/register/components/index.ts", + "packages/canvas/src/register/components/navigation/index.ts", + "packages/canvas/src/register/components/navigation/navigation.ts", + "packages/canvas/src/register/components/sidebar/index.ts", + "packages/canvas/src/register/components/sidebar/sidebar.ts", + "packages/canvas/src/register/components/snipping-selection/index.ts", + "packages/canvas/src/register/components/snipping-selection/snipping-selection.ts", + "packages/canvas/src/register/types/bottom-bar.ts", + "packages/tools-api/package.json", + "packages/tools-api/src/core/index.ts", + "packages/tools-api/src/core/types.ts", + "packages/tools-api/src/index.ts", + "packages/tools-api/src/renderers/badge/badge.tsx", + "packages/tools-api/src/renderers/badge/index.ts", + "packages/tools-api/src/renderers/badge/styles.module.sass", + "packages/tools-api/src/renderers/badge/types.ts", + "packages/tools-api/src/renderers/index.ts", + "src/lib/tools-api/adapters/ToolbarButtonAdapter/index.tsx", + "src/lib/tools-api/adapters/menu/ToolbarMenuAdapter/index.tsx" + ], + "total_files": 61, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `Tool` and `RegisterState` related types into packages.\r\n\r\nThe environment: https://next-356-register-tool.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Moderate risk due to widespread type/import rewiring across `canvas` register components and the Tools API; runtime behavior should be mostly unchanged, but incorrect exports/import paths could cause bu" + }, + { + "number": 46951, + "title": "Notetaker note detail view", + "branch": "feature/notetaker-note-detail-view", + "merged_at": "2026-01-29", + "changed_files": 10, + "additions": 729, + "deletions": 6, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/notetaker/api.ts", + "src/mural/addons/notetaker/index.tsx", + "src/mural/addons/notetaker/note-detail-modal-styles.module.sass", + "src/mural/addons/notetaker/note-detail-modal.tsx", + "src/mural/addons/notetaker/panel/index.tsx", + "static/images/mock-avatars/img_0.png", + "static/images/mock-avatars/img_1.png", + "static/images/mock-avatars/img_2.png", + "static/images/mock-avatars/img_3.png", + "static/images/mock-avatars/img_4.png" + ], + "total_files": 10, + "body_preview": "## Summary\nAdds notetaker note detail modal and related UI.\n\n## Changes\n- Note detail modal UI\n- Fetch note by id (mocked)\n- Bottom bar avatar + menu\n- Notetaker addon registration and rightbar implementation\n- Static assets and styling updates\n\n## Branch\n`feature/notetaker-note-detail-view` \u2192 `master`" + }, + { + "number": 46892, + "title": "[NEXT-409] move /trial-expired and remaining workspace block routes code", + "branch": "feat/next-409-pkg-expired-rte", + "merged_at": "2026-01-29", + "changed_files": 44, + "additions": 384, + "deletions": 398, + "packages_touched": [ + "legacy-ui", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/legacy-ui/src/icons/index.ts", + "packages/legacy-ui/src/icons/lock-icon.tsx", + "packages/legacy-ui/src/ui/components/avatar-dropdown-settings/avatar-dropdown-settings.tsx", + "packages/legacy-ui/src/ui/components/avatar-dropdown-settings/index.ts", + "packages/legacy-ui/src/ui/components/avatar-dropdown-settings/style.sass", + "packages/settings/workspace-settings/package.json", + "packages/settings/workspace-settings/src/components/block-pages/icon-gift.tsx", + "packages/settings/workspace-settings/src/components/block-pages/icon-leave.tsx", + "packages/settings/workspace-settings/src/components/block-pages/icon-user.tsx", + "packages/settings/workspace-settings/src/components/block-pages/index.ts", + "packages/settings/workspace-settings/src/components/block-pages/style.sass", + "packages/settings/workspace-settings/src/components/index.ts", + "packages/settings/workspace-settings/src/components/team-card-info/index.ts", + "packages/settings/workspace-settings/src/components/team-card-info/style.sass", + "packages/settings/workspace-settings/src/components/team-card-info/team-card-info.tsx", + "packages/settings/workspace-settings/src/components/trial-extended-notification/index.ts", + "packages/settings/workspace-settings/src/components/trial-extended-notification/styles.module.sass", + "packages/settings/workspace-settings/src/components/trial-extended-notification/trial-extended-notification.tsx", + "packages/settings/workspace-settings/src/index.ts" + ], + "total_files": 44, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #46874 . Moves the final \"workspace blocked route\" (`/t/:tid/trial-expired`) to the packaging system:\r\n- Migrates a few more icon files to either `@muralco/legacy-ui` (had other references) or to `@muralco/workspace-settings` (only referenced for these routes)\r\n- Moves all components and other code related to rendering the above route and the collection of block routes to `@muralco/workspace-settings`\r\n- Updates `@muralco/works" + }, + { + "number": 46925, + "title": "[notetaker] show \"live\" transcription indicator", + "branch": "feature/notetaker-ui-pt-ii", + "merged_at": "2026-01-28", + "changed_files": 6, + "additions": 384, + "deletions": 5, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/notetaker/api.ts", + "src/mural/business/notetaker/index.ts", + "src/mural/components/notetaker-avatar/index.tsx", + "src/mural/components/notetaker-avatar/notetaker-panel.module.sass", + "src/mural/components/notetaker-avatar/notetaker-panel.tsx", + "src/views/mural/ui/bottombar/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://notetaker-ui-pt-ii.mural.engineering) to perform a smoke test. (" + }, + { + "number": 46917, + "title": "[NEXT-416] Remove dispatcher dependency from edition protocol", + "branch": "fix/next-416-2", + "merged_at": "2026-01-27", + "changed_files": 22, + "additions": 97, + "deletions": 66, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/core/editors/arrow/index.tsx", + "src/mural/addons/core/editors/index.tsx", + "src/mural/register/types.ts", + "src/mural/sdk/apis/widgets/edition-protocols/card.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/card.ts", + "src/mural/sdk/apis/widgets/edition-protocols/cluster.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/cluster.ts", + "src/mural/sdk/apis/widgets/edition-protocols/connector.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/connector.ts", + "src/mural/sdk/apis/widgets/edition-protocols/file.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/file.ts", + "src/mural/sdk/apis/widgets/edition-protocols/shape.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/shape.ts", + "src/mural/sdk/apis/widgets/edition-protocols/sticky.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/sticky.ts", + "src/mural/sdk/apis/widgets/edition-protocols/table-cell.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/table-cell.ts", + "src/mural/sdk/apis/widgets/edition-protocols/title.test.ts", + "src/mural/sdk/apis/widgets/edition-protocols/title.ts", + "src/mural/sdk/apis/widgets/edition-protocols/titled-image.test.ts" + ], + "total_files": 22, + "body_preview": "**[NEXT-416 Remove dispatcher dependency from registered components](https://mural.atlassian.net/browse/NEXT-416)**\r\n\r\nThis PR removes dispatcher reference from `WidgetEditionSession` to remove dispatcher references from `MuralState` type.\r\n\r\nThe environment: https://next-416-2.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Decouples `dispatcher` from widget edition sessions and shifts it to protocol factories.\n> \n> - Changes `create*Protocol` APIs to higher-order functions: `creat" + }, + { + "number": 46903, + "title": "Feature/notetaker UI pt i", + "branch": "feature/notetaker-ui-pt-i", + "merged_at": "2026-01-27", + "changed_files": 32, + "additions": 1514, + "deletions": 10, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/modals/types.ts", + "packages/canvas/src/sdk/apis/modals/types.ts", + "packages/canvas/src/sdk/state/rightbar/rightbar.ts", + "src/mural/addons/core/share-modal/index.tsx", + "src/mural/addons/index.ts", + "src/mural/addons/notetaker/api.ts", + "src/mural/addons/notetaker/bottom-button/index.tsx", + "src/mural/addons/notetaker/bottom-button/styles.module.sass", + "src/mural/addons/notetaker/bottom-button/submenu.tsx", + "src/mural/addons/notetaker/index.test.ts", + "src/mural/addons/notetaker/index.tsx", + "src/mural/addons/notetaker/modal-styles.module.sass", + "src/mural/addons/notetaker/modal.tsx", + "src/mural/addons/notetaker/panel/header/index.tsx", + "src/mural/addons/notetaker/panel/header/styles.module.sass", + "src/mural/addons/notetaker/panel/index.tsx", + "src/mural/addons/notetaker/panel/recordings-list.tsx", + "src/mural/addons/notetaker/panel/styles.module.sass", + "src/mural/addons/notetaker/styles.module.sass", + "src/mural/addons/notetaker/types.ts" + ], + "total_files": 32, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, we had a \"transcription\" add on which rendered a new rightbar where the user could input a meeting URL and view the live transcript.\r\n\r\nNow, with these changes, we introduce a new right bar conforming to official designs. We render the past meetings rather than surfacing a realtime transcript. We also introduce a bottom-bar component which serves as a new entry point to both the share modal and the \"add notetaker\" mod" + }, + { + "number": 46898, + "title": "[NEXT-416] Remove dispatcher dependency from registered components", + "branch": "fix/next-416", + "merged_at": "2026-01-26", + "changed_files": 17, + "additions": 115, + "deletions": 84, + "packages_touched": [ + "core-dispatcher" + ], + "files_sample": [ + "packages/core-dispatcher/src/connect.tsx", + "src/mural/addons/core/participants/index.tsx", + "src/mural/addons/core/snipping-selection/component/index.tsx", + "src/mural/components/navigation/minimap/index.tsx", + "src/mural/hooks/use-dispatcher.ts", + "src/mural/hooks/use-dispatcher.tsx", + "src/mural/register/components/bottom-bar/types.ts", + "src/mural/register/components/navigation/types.ts", + "src/mural/register/components/sidebar/types.ts", + "src/mural/register/components/snipping-selection/types.ts", + "src/mural/register/components/topbar/types.ts", + "src/views/mural.v2/toolbars/web/index.tsx", + "src/views/mural/mural.tsx", + "src/views/mural/ui/bottombar/index.tsx", + "src/views/mural/ui/sidebar/index.tsx", + "src/views/mural/ui/visualization-controls/index.tsx", + "src/views/mural/ui/widgets-container/index.tsx" + ], + "total_files": 17, + "body_preview": "**[NEXT-416 Remove dispatcher dependency from registered components](https://mural.atlassian.net/browse/NEXT-416)**\r\n\r\nThis PR uses react context to provide `dispatcher` to registered components. This allows us to move props types into packages.\r\n\r\nThe environment: https://next-416.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves `dispatcher` provisioning to React context and updates registered components accordingly.\n> \n> - Adds `MuralDispatcherContext`, `useDispatcher` hook, " + }, + { + "number": 46851, + "title": "[NEXT-389] Migrate more sdk apis", + "branch": "refactor/sdk-apis-continued", + "merged_at": "2026-01-23", + "changed_files": 94, + "additions": 414, + "deletions": 370, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/apis/absorption-feedback/absorption-feedback.test.ts", + "packages/canvas/src/sdk/apis/absorption-feedback/absorption-feedback.ts", + "packages/canvas/src/sdk/apis/absorption-feedback/index.ts", + "packages/canvas/src/sdk/apis/ai/types.test.ts", + "packages/canvas/src/sdk/apis/callout-scheduler/callout-scheduler.test.ts", + "packages/canvas/src/sdk/apis/callout-scheduler/callout-scheduler.ts", + "packages/canvas/src/sdk/apis/callout-scheduler/index.ts", + "packages/canvas/src/sdk/apis/callouts/callouts.ts", + "packages/canvas/src/sdk/apis/callouts/index.ts", + "packages/canvas/src/sdk/apis/canvas/canvas.ts", + "packages/canvas/src/sdk/apis/canvas/index.ts", + "packages/canvas/src/sdk/apis/conference/conference.ts", + "packages/canvas/src/sdk/apis/conference/index.ts", + "packages/canvas/src/sdk/apis/direct-exports/direct-exports.ts", + "packages/canvas/src/sdk/apis/direct-exports/index.ts", + "packages/canvas/src/sdk/apis/dom/dom.ts", + "packages/canvas/src/sdk/apis/dom/index.ts", + "packages/canvas/src/sdk/apis/dom/types.ts" + ], + "total_files": 94, + "body_preview": "Test environment: https://sdk-apis-continued.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK APIs under `@muralco/canvas` with local `types` modules and explicit `index` re-exports, and updates app code accordingly.\n> \n> - Migrates APIs (e.g., `canvas`, `dom`, `participants`, `share`, `export`, `operations`, `notifications`, `integrations`, `native/bridge`, `template`, `temporary-mural`, `room`, `widget-toolbar`, `workspace`, `snipping-selection`, `callouts`, `callou" + }, + { + "number": 46865, + "title": "Migrates 3rd of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-3", + "merged_at": "2026-01-23", + "changed_files": 158, + "additions": 307, + "deletions": 266, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/addons/ai/ai-create-workshop/index.ts", + "packages/canvas/src/addons/ai/ai-create-workshop/types.ts", + "packages/canvas/src/addons/ai/index.ts", + "packages/canvas/src/addons/core/editors/lexical/widget-editor/serialization/index.ts", + "packages/canvas/src/addons/core/editors/lexical/widget-editor/serialization/types.ts", + "packages/canvas/src/addons/dev/index.ts", + "packages/canvas/src/addons/dev/table/index.ts", + "packages/canvas/src/addons/dev/table/styles.sass", + "packages/canvas/src/addons/dev/table/table.tsx", + "packages/canvas/src/addons/index.ts", + "packages/canvas/src/business/content-extension/index.ts", + "packages/canvas/src/business/content-extension/shared/handlers/common/index.ts", + "packages/canvas/src/business/content-extension/shared/handlers/common/system-of-record.ts", + "packages/canvas/src/business/content-extension/shared/handlers/index.ts", + "packages/canvas/src/business/content-extension/shared/index.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/components/index.ts", + "packages/canvas/src/components/widgets/arrow/index.ts" + ], + "total_files": 158, + "body_preview": "This PR is the third of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the third batch of `medium` priority dependencies.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\n## Prerequis" + }, + { + "number": 46883, + "title": "[NEXT-382] Move `Poly` and `Bezier2` into geometry package", + "branch": "fix/next-382", + "merged_at": "2026-01-23", + "changed_files": 20, + "additions": 496, + "deletions": 653, + "packages_touched": [ + "canvas", + "geometry" + ], + "files_sample": [ + "packages/canvas/src/helpers/animated-value.ts", + "packages/canvas/src/helpers/bezier2.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/math.ts", + "packages/geometry/src/bezier2.ts", + "packages/geometry/src/index.ts", + "packages/geometry/src/poly.test.ts", + "packages/geometry/src/poly.ts", + "src/mural/addons/core/editors/drawing/controller.tsx", + "src/mural/dispatcher/widgets/connector/geometry.ts", + "src/mural/dispatcher/widgets/inking/intersection.ts", + "src/mural/dispatcher/widgets/inking/simplify-points.ts", + "src/mural/helpers/path-math.test.ts", + "src/mural/helpers/path-math.ts", + "src/mural/sdk/apis/snap/index.ts", + "src/mural/sdk/apis/widgets/changes/systems/comment-tracking/index.ts", + "src/mural/sdk/apis/widgets/inking/index.ts", + "src/test/react-new/step-definitions/widgets.ts", + "src/test/react/step-definitions/given/widget.tsx", + "src/views/mural/widgets/components/stroke-editor.tsx" + ], + "total_files": 20, + "body_preview": "**[NEXT-382 Inspect `helpers` folder and move geometry/math related functions into geometry package](https://mural.atlassian.net/browse/NEXT-382)**\r\n\r\nThis PR moves `Poly` and `Bezier2` into geometry package. There is also a conversion to regular classes instead of type + namespace.\r\nSome unused functions were removed.\r\n\r\nThe environment: https://next-382.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Scope**\n> - Moves curve/polyline utilities from `packages/canvas/helpers` to `p" + }, + { + "number": 46875, + "title": "Breaks apart and migrates `src/mural/register` ui-component types", + "branch": "register-prereq", + "merged_at": "2026-01-23", + "changed_files": 58, + "additions": 196, + "deletions": 197, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/register/types/bottom-bar.ts", + "packages/canvas/src/register/types/index.ts", + "packages/canvas/src/register/types/tabs.ts", + "src/mural/addons/core/bottom-bar-menu/broadcast-pointer.tsx", + "src/mural/addons/core/bottom-bar-menu/celebrate.tsx", + "src/mural/addons/core/bottom-bar-menu/disabled-cursors.tsx", + "src/mural/addons/core/bottom-bar-menu/facilitator-superpowers.tsx", + "src/mural/addons/core/bottom-bar-menu/follow-me.tsx", + "src/mural/addons/core/bottom-bar-menu/release-summon.tsx", + "src/mural/addons/core/bottom-bar-menu/summon.tsx", + "src/mural/addons/core/bottom-bar-menu/toggle-broadcast-pointers.tsx", + "src/mural/addons/core/bottom-bar-menu/toggle-cursors.tsx", + "src/mural/addons/core/bottom-bar-menu/toggle-reactions.tsx", + "src/mural/addons/core/bottom-bar-menu/util.ts", + "src/mural/addons/core/bottom-bar-menu/visitor-name.tsx", + "src/mural/addons/core/sidebar/panels/diagramming/sidebar-button.tsx", + "src/mural/addons/core/sidebar/panels/files/sidebar-button.tsx", + "src/mural/addons/core/sidebar/panels/icons/sidebar-button.tsx", + "src/mural/addons/core/sidebar/panels/images/sidebar-button.tsx", + "src/mural/addons/core/sidebar/panels/shapes/sidebar-button.tsx" + ], + "total_files": 58, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, UI component types for the register system were centralized in `src/mural/register/types/ui-components.ts`, which contained types for bottom bar menus, sidebar buttons, and secondary top bar components. This monolithic file made it difficult to reuse types across packages and created tight coupling between the main codebase and the canvas package.\r\n\r\nNow, with these changes, we've broken apart and migrated these typ" + }, + { + "number": 46874, + "title": "[NEXT-276, NEXT-277, NEXT-278] migrate three additional workspace block routes", + "branch": "feat/move-additional-block-rtes", + "merged_at": "2026-01-22", + "changed_files": 11, + "additions": 95, + "deletions": 88, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/workspace-settings/src/components/block-pages/icon-softblock.tsx", + "packages/settings/workspace-settings/src/components/block-pages/icon-suspended.tsx", + "packages/settings/workspace-settings/src/routes/block-routes.tsx", + "packages/settings/workspace-settings/src/views/account-suspended/account-suspended.tsx", + "packages/settings/workspace-settings/src/views/account-suspended/index.ts", + "packages/settings/workspace-settings/src/views/index.ts", + "packages/settings/workspace-settings/src/views/soft-block-expired/index.ts", + "packages/settings/workspace-settings/src/views/soft-block-expired/soft-block-expired.tsx", + "packages/settings/workspace-settings/src/views/workspace-suspended/index.ts", + "packages/settings/workspace-settings/src/views/workspace-suspended/workspace-suspended.tsx", + "src/team/block-pages/routes/index.tsx" + ], + "total_files": 11, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #46821 . Moves three additional \"block routes\" to `@muralco/workspace-settings`\r\n- `/t/:tid/workspace-suspended`\r\n- `/t/:tid/account-suspended`\r\n- `/t/:tid/soft-block-expired`\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://move-additional-block-rtes.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nOnce you're" + }, + { + "number": 46821, + "title": "[NEXT-275] package workspace account locked route", + "branch": "feat/next-275-acct-lcked-rte", + "merged_at": "2026-01-22", + "changed_files": 64, + "additions": 333, + "deletions": 278, + "packages_touched": [ + "integrations", + "legacy-ui", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/integrations/src/company-settings/integrations-list.tsx", + "packages/legacy-ui/package.json", + "packages/legacy-ui/src/ui/components/index.ts", + "packages/legacy-ui/src/ui/components/legacy-avatar/index.tsx", + "packages/legacy-ui/src/ui/components/legacy-avatar/star-icon.tsx", + "packages/legacy-ui/src/ui/components/legacy-avatar/style.sass", + "packages/settings/workspace-settings/package.json", + "packages/settings/workspace-settings/src/components/block-pages/block-pages.tsx", + "packages/settings/workspace-settings/src/components/block-pages/button-container.tsx", + "packages/settings/workspace-settings/src/components/block-pages/dropdown-settings.tsx", + "packages/settings/workspace-settings/src/components/block-pages/icon-blocked.tsx", + "packages/settings/workspace-settings/src/components/block-pages/index.ts", + "packages/settings/workspace-settings/src/components/block-pages/select-teams.tsx", + "packages/settings/workspace-settings/src/components/block-pages/send-notification-button.tsx", + "packages/settings/workspace-settings/src/components/block-pages/style.sass", + "packages/settings/workspace-settings/src/components/block-pages/track-main-button.tsx", + "packages/settings/workspace-settings/src/components/current-plan/index.tsx", + "packages/settings/workspace-settings/src/components/current-plan/style.sass", + "packages/settings/workspace-settings/src/components/index.ts" + ], + "total_files": 64, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nFirst PR to move the family of \"block routes\" for workspaces:\r\n- Moves all components, types, HOCs, helpers, etc. needed to support rendering/exporting the `t/:tid/account-locked` route from `@muralco/workspace-settings`\r\n- Updates shared references and `src/route-config.tsx`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-275) to understand the context of this effort.\r\n- \ud83e\uddea Please " + }, + { + "number": 46854, + "title": "Migrates additional \"high\" and \"critical\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-critical", + "merged_at": "2026-01-22", + "changed_files": 200, + "additions": 305, + "deletions": 280, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/addons/mindmaps/index.ts", + "packages/canvas/src/addons/mindmaps/types.ts", + "packages/canvas/src/business/discovery-call/index.ts", + "packages/canvas/src/business/discovery-call/types.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/kanban/index.ts", + "packages/canvas/src/business/kanban/types.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/dispatcher/rightbar/index.ts", + "packages/canvas/src/dispatcher/rightbar/types.ts", + "packages/canvas/src/helpers/shapes/get-shape-path.ts", + "packages/canvas/src/helpers/shapes/index.ts", + "packages/canvas/src/sdk/state/snipping-selection/snipping-selection.ts", + "src/mural/addons/core/facilitation/voting/highlights/panel.tsx", + "src/mural/addons/core/mural-ticket/utils/kanban.ts", + "src/mural/addons/core/top-bar/activity/index.tsx", + "src/mural/addons/core/widget-composition/manager/manager.test.ts", + "src/mural/addons/mindmaps/before-show-handlers.test.ts", + "src/mural/addons/mindmaps/drag-n-drop-api.ts", + "src/mural/addons/mindmaps/drag-n-drop-local.test.ts" + ], + "total_files": 200, + "body_preview": "This PR continues the series of modularizing canvas dependencies into the canvas package, handling remaining `high` and `critical` priority dependencies that were missed in previous migration PRs.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0" + }, + { + "number": 46856, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-13", + "merged_at": "2026-01-21", + "changed_files": 78, + "additions": 282, + "deletions": 281, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/internal/index.ts", + "packages/canvas/src/sdk/state/internal/internal.ts", + "packages/canvas/src/sdk/state/system-of-record/index.ts", + "packages/canvas/src/sdk/state/system-of-record/system-of-record.ts", + "packages/canvas/src/sdk/state/temporary-mural/index.ts", + "packages/canvas/src/sdk/state/temporary-mural/temporary-mural.ts", + "src/mural/addons/system-of-record/common/index.ts", + "src/mural/addons/system-of-record/common/register/record-type.tsx", + "src/mural/business/system-of-record/bulk-sync/service.test.ts", + "src/mural/business/system-of-record/bulk-sync/service.ts", + "src/mural/business/system-of-record/components/import-from-url-modal/index.test.tsx", + "src/mural/business/system-of-record/components/import-from-url-modal/index.tsx", + "src/mural/business/system-of-record/components/import-records-modal/index.tsx", + "src/mural/business/system-of-record/components/import-records-modal/modal.test.tsx", + "src/mural/business/system-of-record/components/import-records-modal/modal.tsx", + "src/mural/business/system-of-record/components/manage-native-connection/index.test.tsx", + "src/mural/business/system-of-record/components/widget-panel/region/index.test.tsx", + "src/mural/business/system-of-record/components/widget-panel/setting/index.test.tsx", + "src/mural/business/system-of-record/components/widget-panel/types.ts" + ], + "total_files": 78, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these branches of the state:\r\n* `internal`\r\n* `system-of-record`\r\n* `temporary-mural`\r\n\r\nThe environment: https://next-356-13.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Centralizes state by moving `internal`, `system-of-record`, and `temporary-mural` into `@muralco/canvas/sdk/state`, exposing initial state and types.\n> \n> - Adds packaged state modules" + }, + { + "number": 46862, + "title": "Fix `getDefaultWidgetBackgroundColor` usage + standardize canvas helper exports", + "branch": "patch-canvas-package-defaults", + "merged_at": "2026-01-21", + "changed_files": 13, + "additions": 27, + "deletions": 30, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/helpers/animated-scroller-transition.ts", + "packages/canvas/src/helpers/contains-grouped-widgets.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/measure-text.ts", + "packages/canvas/src/helpers/with-wheel-stop-propagation.tsx", + "src/mural/addons/core/context-menu/util.ts", + "src/mural/addons/core/editors/drawing/view.tsx", + "src/mural/addons/core/editors/inking/view.tsx", + "src/mural/business/delete-widgets/can-delete-button-render.ts", + "src/mural/business/delete-widgets/can-delete-widgets.ts", + "src/mural/helpers/widget-creation.ts", + "src/views/mural/ui/widgets-container/widget-editor-layer/input/hint/view.tsx", + "src/views/mural/widgets/components/shape-text.ts" + ], + "total_files": 13, + "body_preview": "## Summary\r\n\r\nFixes a critical bug in AI searchable options where sticky widget background colors were being lost, and standardizes canvas helper exports.\r\n\r\nTest env: https://patch-canvas-package-defaults.mural.engineering\r\n\r\n### \ud83d\udd27 Standardize Canvas Helper Exports\r\n\r\nConverted default exports to named exports for consistency:\r\n- `AnimatedScrollerTransition` \u2192 `animatedScrollerTransition`\r\n- `ContainsGroupedWidgets` \u2192 `containsGroupedWidgets`\r\n- `MeasureText` \u2192 `measureText`\r\n- `WithWheelStopPr" + }, + { + "number": 46852, + "title": "[NEXT-411] Migrate canvas helper utilities from src/mural/helpers to @muralco/canvas package", + "branch": "migrate-helpers-2", + "merged_at": "2026-01-21", + "changed_files": 101, + "additions": 179, + "deletions": 146, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/helpers/accessibility/index.ts", + "packages/canvas/src/helpers/accessibility/types.ts", + "packages/canvas/src/helpers/action-bar.ts", + "packages/canvas/src/helpers/animated-scroller-transition.ts", + "packages/canvas/src/helpers/animated-value.ts", + "packages/canvas/src/helpers/bezier2.ts", + "packages/canvas/src/helpers/can-draw-by-zoom-level.ts", + "packages/canvas/src/helpers/contains-grouped-widgets.ts", + "packages/canvas/src/helpers/counters-map.ts", + "packages/canvas/src/helpers/font-metrics.ts", + "packages/canvas/src/helpers/fps-tester.ts", + "packages/canvas/src/helpers/get-background-color.ts", + "packages/canvas/src/helpers/get-default-thumbnail.ts", + "packages/canvas/src/helpers/get-photo-original-rect.ts", + "packages/canvas/src/helpers/get-selection-rect.ts", + "packages/canvas/src/helpers/get-toolbar-widgets.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/is-widget-or-ancestors-hidden.ts" + ], + "total_files": 101, + "body_preview": "## Summary\nMigrates 28 canvas-related helper files from `src/mural/helpers/` to `packages/canvas/src/helpers/` to centralize canvas utilities in the `@muralco/canvas` package.\n\n## Migrated Files\n\n### Accessibility\n- **accessibility/types.ts** \u2192 `packages/canvas/src/helpers/accessibility/types.ts` - Accessibility type definitions\n\n### Widget & Canvas Helpers \n- **action-bar.ts** \u2192 `packages/canvas/src/helpers/action-bar.ts` - Action bar utilities\n- **can-draw-by-zoom-level.ts** \u2192 `packages/canva" + }, + { + "number": 46824, + "title": "Upgrade sass and sass-loader", + "branch": "update-sass-version", + "merged_at": "2026-01-20", + "changed_files": 56, + "additions": 534, + "deletions": 235, + "packages_touched": [ + "collaboration-insights", + "config", + "identity-and-access-management", + "legacy-styles", + "legacy-ui", + "modals-common", + "settings" + ], + "files_sample": [ + "build/webpack.dev.js", + "package-lock.json", + "package.json", + "packages/collaboration-insights/src/company-insights/style.sass", + "packages/collaboration-insights/src/workspace-insights/style.sass", + "packages/config/package.json", + "packages/config/webpack/webpack-react.config.js", + "packages/identity-and-access-management/src/company/groups/style.sass", + "packages/legacy-styles/sass/styleguide/modules/_buttons.sass", + "packages/legacy-styles/sass/styleguide/modules/_helpers.sass", + "packages/legacy-styles/sass/styleguide/modules/_messages.sass", + "packages/legacy-styles/sass/styleguide/partials/_global-classes.sass", + "packages/legacy-styles/sass/views/new-sass/components/_simple-dropdown.sass", + "packages/legacy-ui/src/ui/components/button/style.sass", + "packages/legacy-ui/src/ui/components/callout/position.sass", + "packages/legacy-ui/src/ui/components/callout/style.sass", + "packages/legacy-ui/src/ui/components/input/style.sass", + "packages/modals-common/src/Mural/MuralInsights/style.sass", + "packages/settings/company-settings/src/views/style.sass", + "src/apps/web/dashboard/pages/rooms/overview/style.sass" + ], + "total_files": 56, + "body_preview": "[https://linear.app/mural/issue/FEP-70/investigate-sass-upgrade-to-a-version-higher-than-171](https://linear.app/mural/issue/FEP-70/investigate-sass-upgrade-to-a-version-higher-than-171)\r\n\r\n[https://update-sass-version.mural.engineering/](https://update-sass-version.mural.engineering/)\r\n\r\nFEP-70\r\n\r\n# Upgrade SASS\r\n\r\nThis branch updates Sass and sass-loader to the latest supported versions, then adjusts syntax and tooling to match modern Dart Sass behavior. The upgrade is important to keep builds" + }, + { + "number": 46801, + "title": "[NEXT-325] Replace WithAuthenticatedUser with RequireAuth for something-went-wrong", + "branch": "fix/next-325", + "merged_at": "2026-01-20", + "changed_files": 4, + "additions": 24, + "deletions": 11, + "packages_touched": [ + "integrations" + ], + "files_sample": [ + "package-lock.json", + "packages/integrations/package.json", + "packages/integrations/src/error/something-went-wrong/index.tsx", + "packages/integrations/src/routes/index.tsx" + ], + "total_files": 4, + "body_preview": "\n> [!NOTE]\n> **Switch to new auth guard for error flow**\n> \n> - Wrap `integration-uh-oh` route with `RequireAuth`, using `onError` \u2192 redirect to `/signin`, `onLoading` \u2192 `MrlSpinner`, and `onMissingSession` \u2192 `logout`\n> - Convert `IntegrationSomethingWentWrong` to a plain component (remove `WithAuthenticatedUser`), add explicit `React.ReactElement` return type\n> - Add `@muralco/user` dependency to `@muralco/integrations`\n> \n> Written by [Cursor Bugbot](https://cursor." + }, + { + "number": 46782, + "title": "Migrates second batch of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-2", + "merged_at": "2026-01-20", + "changed_files": 295, + "additions": 721, + "deletions": 542, + "packages_touched": [ + "canvas", + "settings" + ], + "files_sample": [ + ".knip.jsonc", + "CODEOWNERS", + "package-lock.json", + "packages/canvas/build/webpack.config.js", + "packages/canvas/package.json", + "packages/canvas/src/business/2-way-sync/index.ts", + "packages/canvas/src/business/2-way-sync/types.ts", + "packages/canvas/src/business/add-template-to-canvas/index.ts", + "packages/canvas/src/business/add-template-to-canvas/types.ts", + "packages/canvas/src/business/inclusive-selection.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/integrations/bulk-sync/index.ts", + "packages/canvas/src/business/integrations/bulk-sync/types.ts", + "packages/canvas/src/business/integrations/index.ts", + "packages/canvas/src/business/kanban/consts.ts", + "packages/canvas/src/business/kanban/index.ts", + "packages/canvas/src/business/resize-widgets/index.ts", + "packages/canvas/src/business/resize-widgets/types.ts", + "packages/canvas/src/business/shapes/index.ts", + "packages/canvas/src/business/shapes/shape-supports-background.ts" + ], + "total_files": 295, + "body_preview": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the second batch of `medium` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\nTest env: https://mi" + }, + { + "number": 46827, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-12", + "merged_at": "2026-01-20", + "changed_files": 97, + "additions": 561, + "deletions": 624, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "CODEOWNERS", + "packages/canvas/src/sdk/apis/content-extension/types.ts", + "packages/canvas/src/sdk/apis/transcript/index.test.ts", + "packages/canvas/src/sdk/apis/widgets/changes/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "packages/canvas/src/sdk/state/content-extension/content-extension.ts", + "packages/canvas/src/sdk/state/content-extension/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/public/index.ts", + "packages/canvas/src/sdk/state/public/public.ts", + "packages/canvas/src/sdk/state/screen-reader/index.ts", + "packages/canvas/src/sdk/state/screen-reader/screen-reader.ts", + "packages/canvas/src/sdk/state/sidebar/index.ts", + "packages/canvas/src/sdk/state/sidebar/sidebar.ts", + "packages/canvas/src/sdk/state/snipping-selection/index.ts", + "packages/canvas/src/sdk/state/snipping-selection/snipping-selection.ts", + "packages/canvas/src/sdk/state/template-addon/index.ts", + "packages/canvas/src/sdk/state/template-addon/template-addon.ts", + "packages/canvas/src/sdk/state/widgets/index.ts" + ], + "total_files": 97, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR move into packages these state branches:\r\n* `content-extension`\r\n* `public`\r\n* `screen-reader`\r\n* `sidebar`\r\n* `snipping-selection`\r\n* `template-addon`\r\n* `widgets`\r\n\r\nThe environment: https://next-356-12.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK state under `packages/canvas/src/sdk/state` and replaces legacy `src/mural/sdk/state` usage.\n> \n> - Adds packag" + }, + { + "number": 46829, + "title": "Knip fine tuning", + "branch": "knip-imp", + "merged_at": "2026-01-20", + "changed_files": 81, + "additions": 258, + "deletions": 718, + "packages_touched": [ + "accessibility", + "admin-reports", + "apps", + "authentication-lib", + "beacon", + "billing", + "canvas", + "claim", + "collaboration-insights", + "company-template-collections", + "config", + "connection-verification", + "create-package", + "dashboard", + "deprecation", + "download-exports", + "enterprise-security", + "feature-celebrate", + "identity-and-access-management", + "integrations", + "learning", + "legacy-ui", + "modals-common", + "mural-state-container", + "mural-utils", + "native", + "navigate", + "parking-lot", + "pdf-import", + "platform", + "playbooks", + "queries", + "route-about-you", + "route-access-required", + "route-bye", + "route-check-email", + "route-check-email-code", + "route-create-password", + "route-create-team", + "route-errors", + "route-invitation", + "route-invitation-verify-email", + "route-join-company-workspace", + "route-reset-password", + "route-signin", + "route-signup", + "route-terms-and-conditions", + "route-verify-code", + "route-verify-email", + "salesforce-chat", + "settings", + "templates", + "test-mocks", + "theme-manager", + "toast", + "tools-api", + "truncated", + "user" + ], + "files_sample": [ + ".knip.jsonc", + "package-lock.json", + "package.json", + "packages/accessibility/package.json", + "packages/admin-reports/package.json", + "packages/apps/package.json", + "packages/authentication-lib/package.json", + "packages/beacon/package.json", + "packages/billing/package.json", + "packages/canvas/package.json", + "packages/claim/package.json", + "packages/collaboration-insights/package.json", + "packages/company-template-collections/package.json", + "packages/config/package.json", + "packages/connection-verification/package.json", + "packages/create-package/templates/react/package.json", + "packages/dashboard/archived-murals/package.json", + "packages/dashboard/cards/package.json", + "packages/dashboard/content-grid/package.json", + "packages/dashboard/content-hierarchy/package.json" + ], + "total_files": 81, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFine-tuning of the Knip configuration to remove unused dependencies detected across the monorepo. \r\n\r\n**Changes:**\r\n- Removed unused dependencies (jsdom, react-router-dom, @types/*, testing libraries) from 60+ packages\r\n- Moved `jsdom` from individual packages to the shared `@muralco/config` package where it's actually used in Jest configurations\r\n- Updated `.knip.jsonc` to ignore template files and reorganize ignore patterns\r\n- Minor impr" + }, + { + "number": 46811, + "title": "[NEXT-403] Move src/mural/sdk/apis/widgets/changes/types to package", + "branch": "refactor/widget-changes-sdk-api", + "merged_at": "2026-01-16", + "changed_files": 40, + "additions": 118, + "deletions": 74, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/widgets/changes/index.ts", + "packages/canvas/src/sdk/apis/widgets/changes/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "src/mural/addons/ai/ai-spell-check/function-call.test.ts", + "src/mural/addons/mindmaps/create-child.test.ts", + "src/mural/addons/mindmaps/drag-n-drop-remote.test.ts", + "src/mural/addons/mindmaps/expand-collapse/collapse-expand-api.test.ts", + "src/mural/addons/mindmaps/expand-collapse/count-invisibility-changed-nodes.test.ts", + "src/mural/addons/mindmaps/orientation.test.ts", + "src/mural/addons/mindmaps/toolbar.test.ts", + "src/mural/addons/widget-compositors/apis/planner-board/columns/switch-layout.test.ts", + "src/mural/business/add-widgets/util/process-link-with-widget-id.test.ts", + "src/mural/business/duplicate-selected-widgets.test.ts", + "src/mural/business/group-selected-widgets/index.test.ts", + "src/mural/business/migrate-to-sticky-rich-text.ts", + "src/mural/business/model-update-guard-drop-widgets-on-canvas.test.ts", + "src/mural/business/resize-widgets/model-update-guard-resize-widgets.test.ts", + "src/mural/business/system-of-record/core/paste-handler/index.test.ts", + "src/mural/business/tables/fit-table-cell-to-content.test.ts" + ], + "total_files": 40, + "body_preview": "Test environment: https://widget-changes-sdk-api.mural.engineering" + }, + { + "number": 46778, + "title": "Migrates first batch of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-1", + "merged_at": "2026-01-16", + "changed_files": 270, + "additions": 671, + "deletions": 493, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/addons/ai/ai-sentiment-classification/constants.ts", + "packages/canvas/src/addons/ai/ai-sentiment-classification/index.ts", + "packages/canvas/src/addons/ai/ai-upgrade/index.ts", + "packages/canvas/src/addons/ai/ai-upgrade/utils.ts", + "packages/canvas/src/addons/ai/index.ts", + "packages/canvas/src/addons/azure-devops/constants.ts", + "packages/canvas/src/addons/azure-devops/index.ts", + "packages/canvas/src/addons/core/action-bar/actions-parser/actions/consts.ts", + "packages/canvas/src/addons/core/action-bar/actions-parser/actions/index.ts", + "packages/canvas/src/addons/core/action-bar/actions-parser/index.ts", + "packages/canvas/src/addons/core/action-bar/index.ts", + "packages/canvas/src/addons/core/action-bar/panel/index.ts", + "packages/canvas/src/addons/core/action-bar/panel/results/index.ts", + "packages/canvas/src/addons/core/action-bar/panel/results/types.ts", + "packages/canvas/src/addons/core/context-menu/format-types.ts", + "packages/canvas/src/addons/core/context-menu/import/can-import.ts", + "packages/canvas/src/addons/core/context-menu/import/index.ts", + "packages/canvas/src/addons/core/context-menu/index.ts" + ], + "total_files": 270, + "body_preview": "This PR is the first of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the first batch of `medium` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\nTest env: https://migr" + }, + { + "number": 46799, + "title": "[NEXT-406] Move WidgetsState to package", + "branch": "refactor/package-widgets-state", + "merged_at": "2026-01-16", + "changed_files": 78, + "additions": 369, + "deletions": 354, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/widgets/index.ts", + "packages/canvas/src/dispatcher/widgets/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/remote/dragging/index.ts", + "packages/canvas/src/sdk/apis/widgets/remote/dragging/types.ts", + "packages/canvas/src/sdk/apis/widgets/remote/index.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "packages/canvas/src/sdk/state/widgets/index.ts", + "packages/canvas/src/sdk/state/widgets/types.ts", + "src/mural/addons/ai/ai-cluster/create-cluster-area.ts", + "src/mural/addons/core/editors/arrow/index.tsx", + "src/mural/addons/core/editors/lexical/widget-editor/hooks/use-widget-plain-text-edition.ts", + "src/mural/addons/core/editors/lexical/widget-editor/hooks/use-widget-rich-text-edition.test.tsx", + "src/mural/addons/core/editors/lexical/widget-editor/hooks/use-widget-rich-text-edition.ts", + "src/mural/addons/core/widget-composition/manager/plugins/utils.ts", + "src/mural/addons/widget-compositors/enhanced-kanban-board/utils.ts", + "src/mural/business/area/create-area-with-content.test.ts", + "src/mural/business/area/create-area-with-content.ts", + "src/mural/business/edit-widget/wait-for-editor-hide.ts", + "src/mural/business/hover-widget-feedback/index.ts" + ], + "total_files": 78, + "body_preview": "Test environment: https://package-widgets-state.mural.engineering\r\n" + }, + { + "number": 46783, + "title": "[NEXT-356] Move `engine` state into packages", + "branch": "fix/next-356-11", + "merged_at": "2026-01-15", + "changed_files": 19, + "additions": 137, + "deletions": 178, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/helpers/freehand.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/stroke-to-svg.ts", + "packages/canvas/src/helpers/transform-inking.ts", + "packages/canvas/src/sdk/state/engine/engine.ts", + "packages/canvas/src/sdk/state/engine/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "src/mural/addons/core/facilitation/private-time/index.test.ts", + "src/mural/addons/core/snippets/util.ts", + "src/mural/addons/dev/widgets-inspector/index.tsx", + "src/mural/helpers/stroke-to-svg.ts", + "src/mural/sdk/apis/engine/utils.ts", + "src/mural/sdk/state/engine/index.ts", + "src/mural/sdk/state/engine/types.ts", + "src/mural/sdk/state/internal/index.ts", + "src/mural/sdk/state/internal/types.ts", + "src/test/react/step-definitions/then/widget.ts", + "src/views/mural/widgets/components/strokes.tsx", + "src/views/mural/widgets/render-widget.tsx" + ], + "total_files": 19, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `engine` state and freehand-related functions into packages. Removed bounding box info from `strokeToSvg` results.\r\n\r\nThe environment: https://next-356-11.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Centralizes engine and inking logic under packages for reuse and consistency.\n> \n> - Move `engine` state to `packages/canvas/sdk/state/engine` with `InternalEngineState." + }, + { + "number": 46771, + "title": "Migrates remaining \"high\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-priority-deps-2", + "merged_at": "2026-01-15", + "changed_files": 217, + "additions": 457, + "deletions": 372, + "packages_touched": [ + "canvas", + "tracking-lib" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/addons/core/editors/lexical/common/commands/index.ts", + "packages/canvas/src/addons/core/editors/lexical/common/commands/types.ts", + "packages/canvas/src/addons/core/editors/lexical/common/index.ts", + "packages/canvas/src/addons/core/index.ts", + "packages/canvas/src/addons/core/mouse/index.ts", + "packages/canvas/src/addons/core/mouse/right-click-pan/index.ts", + "packages/canvas/src/addons/core/mouse/right-click-pan/util.ts", + "packages/canvas/src/addons/index.ts", + "packages/canvas/src/addons/mermaid/extract-node-id.ts", + "packages/canvas/src/addons/mermaid/index.ts", + "packages/canvas/src/addons/mindmaps/constants.ts", + "packages/canvas/src/addons/mindmaps/index.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/labels/index.ts", + "packages/canvas/src/business/labels/types.ts", + "packages/canvas/src/business/smart-frameworks/index.ts", + "packages/canvas/src/business/smart-frameworks/types.ts", + "packages/canvas/src/business/system-of-record/index.ts" + ], + "total_files": 217, + "body_preview": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles remaining `high` priority dependencies.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\nTest env: https://migr" + }, + { + "number": 46742, + "title": "[NEXT-347] package room routes", + "branch": "feat/next-347-package-room-routes", + "merged_at": "2026-01-14", + "changed_files": 64, + "additions": 293, + "deletions": 164, + "packages_touched": [ + "billing", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/billing/jest.config.js", + "packages/billing/jest.setup.js", + "packages/billing/package.json", + "packages/billing/src/components/billing-variables.sass", + "packages/billing/src/components/ctas/index.ts", + "packages/billing/src/components/ctas/team-plus-trial-upgrade-button/index.tsx", + "packages/billing/src/components/ctas/team-plus-trial-upgrade-button/styles.module.sass", + "packages/billing/src/components/ctas/team-plus-trial-upgrade-button/team-plus-trial-upgrade-button.test.tsx", + "packages/billing/src/components/index.ts", + "packages/billing/src/components/upgrade-reminders/free-trial-upgrade.test.tsx", + "packages/billing/src/components/upgrade-reminders/free-trial-upgrade.tsx", + "packages/billing/src/components/upgrade-reminders/index.ts", + "packages/billing/src/components/upgrade-reminders/styles.module.sass", + "packages/billing/src/index.ts", + "packages/billing/src/utils/plan-utils.ts", + "packages/settings/settings-commons/jest.config.js", + "packages/settings/settings-commons/jest.setup.js", + "packages/settings/settings-commons/package.json", + "packages/settings/settings-commons/src/components/index.ts" + ], + "total_files": 64, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis is a near-complete effort to package all the code for the `/t/:team/r/:room/settings/*` family of routes. The final piece [is a modal dependency that unfortunately reaches deeply and broadly](https://mural.slack.com/archives/C09S4387H4Y/p1768408609377439?thread_ts=1768338247.323489&cid=C09S4387H4Y) into `src/billing` and `src/lib/billing`. Attempting to resolve all of those dependencies would balloon the scope and effort of this PR, so " + }, + { + "number": 46774, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-10", + "merged_at": "2026-01-14", + "changed_files": 47, + "additions": 221, + "deletions": 183, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/addons/core/export-selection/config.ts", + "packages/canvas/src/sdk/apis/dom/dom.ts", + "packages/canvas/src/sdk/apis/dom/index.ts", + "packages/canvas/src/sdk/state/dom/dom.ts", + "packages/canvas/src/sdk/state/dom/index.ts", + "packages/canvas/src/sdk/state/dom/responsive-size.test.ts", + "packages/canvas/src/sdk/state/dom/responsive-size.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/rightbar/index.ts", + "packages/canvas/src/sdk/state/rightbar/rightbar.ts", + "src/mural/addons/core/comments/comment-thread/index.tsx", + "src/mural/addons/core/comments/comments.tsx", + "src/mural/addons/core/export-troubleshooting/index.tsx", + "src/mural/addons/core/outline/index.tsx", + "src/mural/business/rightbar/open-rightbar.test.ts", + "src/mural/business/rightbar/open-rightbar.ts", + "src/mural/components/navigation/popup/index.tsx", + "src/mural/dispatcher/dom/index.ts", + "src/mural/dispatcher/dom/util.ts", + "src/mural/dispatcher/downloads/index.ts" + ], + "total_files": 47, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves to packages these parts of state:\r\n* `dom`\r\n* `rightbar`\r\n\r\nTypes `RightBarTab`, `CommentListTab`, and `ResponsibleSize` were also moved to the state from SDK API.\r\n\r\nThe environment: https://next-356-10.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Centralizes UI state under the canvas package and updates consumers accordingly.\n> \n> - Adds `sdk/state/dom` and `sdk/state" + }, + { + "number": 46762, + "title": "[NEXT-401] Move WidgetsApi to canvas package", + "branch": "refactor/widgets-api", + "merged_at": "2026-01-14", + "changed_files": 61, + "additions": 183, + "deletions": 159, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/resize-widgets/index.ts", + "packages/canvas/src/business/resize-widgets/types.ts", + "packages/canvas/src/dispatcher/widgets/index.ts", + "packages/canvas/src/dispatcher/widgets/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "src/modals/content-viewer/components/index.tsx", + "src/mural/addons/core/editors/inking/controller.tsx", + "src/mural/addons/core/editors/inking/view.tsx", + "src/mural/addons/core/editors/lexical/widget-editor/hooks/use-widget-plain-text-edition.ts", + "src/mural/addons/core/editors/lexical/widget-editor/hooks/use-widget-rich-text-edition.ts", + "src/mural/addons/core/fixed-widget-toolbar/drawing/index.ts", + "src/mural/addons/core/inking/color-panel.tsx", + "src/mural/addons/core/inking/index.tsx", + "src/mural/addons/core/inking/line-width.tsx", + "src/mural/addons/core/inking/settings-panel.tsx", + "src/mural/addons/core/toolbar/drawing/index.tsx", + "src/mural/addons/mermaid/render.test.ts", + "src/mural/business/add-widgets/index.ts" + ], + "total_files": 61, + "body_preview": "Test environment: https://widgets-api.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Consolidates widget dispatcher and SDK types under the canvas package and updates consumers accordingly.\n> \n> - Adds `packages/canvas` re-exports: `dispatcher/widgets/index.ts` now exposes `WidgetsApi`, `WidgetsPhotoApi`, `WidgetsTableCellApi`, `WidgetsInkingApi`, `EditingApi`, `InputType`, `SwitchTo`, `MouseEventPosition`, `AddWidgetsOptions`, `DropWidgetsOnCanvasOptions`, etc.; `sdk/apis/widge" + }, + { + "number": 46767, + "title": "[FEP-6334] - Remove depcheck script", + "branch": "remove-depcheck-script", + "merged_at": "2026-01-14", + "changed_files": 128, + "additions": 116, + "deletions": 383, + "packages_touched": [ + "accessibility", + "admin-reports", + "api", + "apps", + "authentication-lib", + "beacon", + "billing", + "browser-storage", + "canvas", + "canvas-asset-management", + "canvas-engine-types", + "canvas-widgets", + "claim", + "collaboration-insights", + "color-palette", + "company-template-collections", + "config", + "connection-verification", + "core-dispatcher", + "create-package", + "dashboard", + "deprecation", + "download-exports", + "embedly", + "enterprise-security", + "eslint-plugin-muralcoprivate", + "feature-celebrate", + "geometry", + "identity-and-access-management", + "iframe-event-dispatcher", + "integrations", + "integrations-platform", + "learning", + "legacy-ui", + "logger", + "media", + "modals-common", + "mural-state-container", + "mural-utils", + "native", + "navigate", + "optimizely", + "parking-lot", + "pdf-import", + "permissions", + "platform", + "playbooks", + "queries", + "realtime", + "realtime-client", + "refactoring-tools", + "route-about-you", + "route-access-required", + "route-bye", + "route-check-email", + "route-check-email-code", + "route-create-password", + "route-create-team", + "route-errors", + "route-invitation", + "route-invitation-verify-email", + "route-join-company-workspace", + "route-reset-password", + "route-signin", + "route-signup", + "route-terms-and-conditions", + "route-verify-code", + "route-verify-email", + "salesforce-chat", + "scim", + "settings", + "shared", + "state-api", + "telemetry", + "templates", + "test-mocks", + "testing-tools", + "theme-manager", + "toast", + "tools-api", + "tracking-lib", + "truncated", + "types", + "user" + ], + "files_sample": [ + ".cursor/rules/development-workflow.mdc", + ".github/workflows/quality.yml", + "CODEOWNERS", + "package-lock.json", + "package.json", + "packages/accessibility/package.json", + "packages/admin-reports/package.json", + "packages/api/package.json", + "packages/apps/package.json", + "packages/authentication-lib/package.json", + "packages/beacon/package.json", + "packages/billing/package.json", + "packages/browser-storage/package.json", + "packages/canvas-asset-management/package.json", + "packages/canvas-engine-types/package.json", + "packages/canvas-widgets/package.json", + "packages/canvas/package.json", + "packages/claim/package.json", + "packages/collaboration-insights/package.json", + "packages/color-palette/package.json" + ], + "total_files": 128, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6434](https://mural.atlassian.net/browse/FEP-6434)\r\n\r\n[https://linear.app/mural/issue/FEP-74/remove-depcheck-task-and-scripts](https://linear.app/mural/issue/FEP-74/remove-depcheck-task-and-scripts)\r\n\r\n# Depcheck Removal\r\n\r\nThis PR removes the `depcheck` script checker from the `murally` repository as part of the migration to `knip`.\r\n\r\n## Removed Depcheck References\r\n\r\n1. Removed the \"Check missing " + }, + { + "number": 46746, + "title": "Migrates \"high\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-priority-deps", + "merged_at": "2026-01-14", + "changed_files": 196, + "additions": 313, + "deletions": 383, + "packages_touched": [ + "api", + "canvas", + "realtime", + "route-join-company-workspace" + ], + "files_sample": [ + "packages/api/src/public.ts", + "packages/canvas/src/addons/core/editors/index.ts", + "packages/canvas/src/addons/core/editors/lexical/common/consts.ts", + "packages/canvas/src/addons/core/editors/lexical/common/index.ts", + "packages/canvas/src/addons/core/editors/lexical/index.ts", + "packages/canvas/src/addons/core/index.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/business/system-of-record/constants.ts", + "packages/canvas/src/business/system-of-record/index.ts", + "packages/canvas/src/business/tables/get-cell-format.ts", + "packages/canvas/src/business/tables/index.ts", + "packages/canvas/src/dispatcher/ai/index.ts", + "packages/canvas/src/dispatcher/ai/types.ts", + "packages/canvas/src/dispatcher/facilitation/index.ts", + "packages/canvas/src/dispatcher/facilitation/types.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/dispatcher/mural/index.ts", + "packages/canvas/src/dispatcher/mural/types.ts", + "packages/canvas/src/dispatcher/notifications/create.ts", + "packages/canvas/src/dispatcher/notifications/index.ts" + ], + "total_files": 196, + "body_preview": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles `high` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\n## What Was Migrated\n\n### Business Logic\n-" + }, + { + "number": 46725, + "title": "NEXT-115 - Package /join-company-workspace route", + "branch": "add/next-115-2", + "merged_at": "2026-01-13", + "changed_files": 29, + "additions": 299, + "deletions": 1, + "packages_touched": [ + "route-join-company-workspace" + ], + "files_sample": [ + "CODEOWNERS", + "package-lock.json", + "package.json", + "packages/route-join-company-workspace/.eslintrc.js", + "packages/route-join-company-workspace/README.md", + "packages/route-join-company-workspace/api-extractor.json", + "packages/route-join-company-workspace/build/webpack.config.js", + "packages/route-join-company-workspace/jest.config.js", + "packages/route-join-company-workspace/package.json", + "packages/route-join-company-workspace/src/AutoJoinOrJoinCompanyWorkspace.tsx", + "packages/route-join-company-workspace/src/JoinCompanyWorkspace.test.tsx", + "packages/route-join-company-workspace/src/JoinCompanyWorkspace.tsx", + "packages/route-join-company-workspace/src/defs.d.ts", + "packages/route-join-company-workspace/src/helpers.ts", + "packages/route-join-company-workspace/src/index.test.ts", + "packages/route-join-company-workspace/src/index.ts", + "packages/route-join-company-workspace/src/view-request-access/JoinCompanyWorkspaceRequestAccessView.module.sass", + "packages/route-join-company-workspace/src/view-request-access/JoinCompanyWorkspaceRequestAccessView.test.tsx", + "packages/route-join-company-workspace/src/view-request-access/JoinCompanyWorkspaceRequestAccessView.tsx", + "packages/route-join-company-workspace/src/view/JoinCompanyWorkspaceView.module.sass" + ], + "total_files": 29, + "body_preview": "Test env - https://next-115-2.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis pull request packages the `/join-company-workspace` route functionality into a new internal package `@muralco/route-join-company-workspace`. The changes migrate existing route code from `src/team/routes/` into a standalone package structure with proper TypeScript configuration, tests, and build tooling.\r\n\r\n**Key Changes:**\r\n- Creates new package structure with proper configuration files (tsconfig, jest, we" + }, + { + "number": 46716, + "title": "[FEP-6431] - move unlisted and and unused dependencies check to knip global configuration", + "branch": "knip-global-config", + "merged_at": "2026-01-13", + "changed_files": 31, + "additions": 282, + "deletions": 2507, + "packages_touched": [ + "api", + "beacon", + "connection-verification", + "dashboard", + "deprecation", + "identity-and-access-management", + "integrations", + "legacy-ui", + "media", + "mural-utils", + "optimizely", + "parking-lot", + "platform", + "playbooks", + "route-create-team", + "route-signup", + "route-terms-and-conditions", + "settings", + "templates", + "test-mocks", + "types", + "user" + ], + "files_sample": [ + ".knip.jsonc", + "build/knip-ci.sh", + "package-lock.json", + "package.json", + "packages/api/package.json", + "packages/beacon/package.json", + "packages/connection-verification/package.json", + "packages/dashboard/legacy-ui/package.json", + "packages/deprecation/package.json", + "packages/identity-and-access-management/package.json", + "packages/integrations/package.json", + "packages/legacy-ui/package.json", + "packages/media/package.json", + "packages/mural-utils/package.json", + "packages/optimizely/package.json", + "packages/parking-lot/package.json", + "packages/parking-lot/src/defs.d.ts", + "packages/platform/base-64/package.json", + "packages/platform/router/package.json", + "packages/playbooks/package.json" + ], + "total_files": 31, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6431](https://mural.atlassian.net/browse/FEP-6431)\r\n\r\nhttps://knip-global-config.mural.engineering/\r\n\r\n## Overview\r\n\r\nThis PR improves dependency management across the monorepo by leveraging Knip to identify and clean up unused dependencies, add missing dependencies, and configure proper ignore rules for false positives. The goal is to reduce bundle size, improve build performance, and maintain accur" + }, + { + "number": 46710, + "title": "[NEXT-MANY-TIX] Migrate all the error routes to packaging system", + "branch": "refactor/migrate-error-routes", + "merged_at": "2026-01-12", + "changed_files": 74, + "additions": 374, + "deletions": 233, + "packages_touched": [ + "billing", + "route-errors", + "settings" + ], + "files_sample": [ + "CODEOWNERS", + "features/error/permissions/access-denied.feature", + "features/security/network-restriction.feature", + "package-lock.json", + "package.json", + "packages/billing/src/utils/plan-utils.ts", + "packages/route-errors/.eslintrc.js", + "packages/route-errors/README.md", + "packages/route-errors/api-extractor.json", + "packages/route-errors/build/webpack.config.js", + "packages/route-errors/features/v2/access-denied.feature", + "packages/route-errors/jest.config.js", + "packages/route-errors/package.json", + "packages/route-errors/src/access-denied-anonymous.tsx", + "packages/route-errors/src/access-denied.tsx", + "packages/route-errors/src/account-locked.tsx", + "packages/route-errors/src/account-not-found.test.tsx", + "packages/route-errors/src/account-not-found.tsx", + "packages/route-errors/src/apps/permission-denied.tsx", + "packages/route-errors/src/browser-not-supported.tsx" + ], + "total_files": 74, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR moves all of the error routes (consolidated at `src/error`) to a new `@muralco/route-errors` package:\r\n- Moves an external referenced component (`WorkspaceActions`) that was living outside the `src/error` folder for some reason (no other references to it) into the fold\r\n- Moves the remaining external reference (a simple billing utility function) into the new `@muralco/billing` package and updates all references to that canonical de" + }, + { + "number": 46718, + "title": "NEXT-390 - Refactor /join-company-workspace route before packaging", + "branch": "add/next-390", + "merged_at": "2026-01-09", + "changed_files": 20, + "additions": 2322, + "deletions": 728, + "packages_touched": [], + "files_sample": [ + "src/team/routes/AutoJoinOrJoinCompanyWorkspace.tsx", + "src/team/routes/JoinCompanyWorkspace.test.tsx", + "src/team/routes/JoinCompanyWorkspace.tsx", + "src/team/routes/helpers.tsx", + "src/team/routes/index.tsx", + "src/team/routes/join-company-workspace/helpers.tsx", + "src/team/routes/view-request-access/JoinCompanyWorkspaceRequestAccessView.module.sass", + "src/team/routes/view-request-access/JoinCompanyWorkspaceRequestAccessView.test.tsx", + "src/team/routes/view-request-access/JoinCompanyWorkspaceRequestAccessView.tsx", + "src/team/routes/view/JoinCompanyWorkspaceView.module.sass", + "src/team/routes/view/JoinCompanyWorkspaceView.test.tsx", + "src/team/routes/view/JoinCompanyWorkspaceView.tsx", + "src/team/routes/view/WorkspaceCard.test.tsx", + "src/team/routes/view/WorkspaceCard.tsx", + "src/team/routes/workspace-sorting.test.ts", + "src/team/routes/workspace-sorting.ts", + "src/test/react-new/features/registration/join-company-workspace/join-company-workspace-autojoin.feature", + "src/test/react-new/features/registration/join-company-workspace/join-company-workspace-request-access.feature", + "src/test/react-new/features/registration/join-company-workspace/join-company-workspace-show-more.feature", + "src/test/react-new/features/registration/join-company-workspace/join-company-workspace.feature" + ], + "total_files": 20, + "body_preview": "[NEXT-390](https://mural.atlassian.net/browse/NEXT-390) - Refactor /join-company-workspace route before packaging\r\n[NEXT-394](https://mural.atlassian.net/browse/NEXT-394) - Migrate cucumber v2 tests for the route /join-company-workspace to jest\r\n~~[NEXT-393](https://mural.atlassian.net/browse/NEXT-393) - Replace withAuthenticatedUser HOC with RequireAuth for /join-company-workspace route~~\r\n\r\nTest env - https://next-390.mural.engineering\r\n\n\n[NEXT-390]: https://mural.atlassian.net/browse/NEXT-390" + }, + { + "number": 46684, + "title": "[NEXT-387] Move SDK Apis without external dependencies", + "branch": "refactor/sdk-api-type-9", + "merged_at": "2026-01-09", + "changed_files": 46, + "additions": 127, + "deletions": 133, + "packages_touched": [ + "canvas", + "types" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/downloads/index.ts", + "packages/canvas/src/dispatcher/downloads/types.ts", + "packages/canvas/src/sdk/apis/capabilities/index.ts", + "packages/canvas/src/sdk/apis/capabilities/types.ts", + "packages/canvas/src/sdk/apis/collaboration/collaboration.ts", + "packages/canvas/src/sdk/apis/collaboration/index.ts", + "packages/canvas/src/sdk/apis/direct-exports/index.ts", + "packages/canvas/src/sdk/apis/direct-exports/types.ts", + "packages/canvas/src/sdk/apis/downloads/downloads.ts", + "packages/canvas/src/sdk/apis/downloads/index.ts", + "packages/canvas/src/sdk/apis/downloads/types.ts", + "packages/canvas/src/sdk/apis/favorite/favorite.ts", + "packages/canvas/src/sdk/apis/favorite/index.ts", + "packages/canvas/src/sdk/apis/focus-mode/focus-mode.ts", + "packages/canvas/src/sdk/apis/focus-mode/index.ts", + "packages/canvas/src/sdk/apis/hidden-tooltips/hidden-tooltips.test.ts", + "packages/canvas/src/sdk/apis/hidden-tooltips/hidden-tooltips.ts", + "packages/canvas/src/sdk/apis/hidden-tooltips/index.ts", + "packages/canvas/src/sdk/apis/hover-feedback/hover-feedback.ts", + "packages/canvas/src/sdk/apis/hover-feedback/index.ts" + ], + "total_files": 46, + "body_preview": "Test environment:\r\nhttps://sdk-api-type-9.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> Modernizes SDK API boundaries and removes circular/external deps.\n> \n> - Centralizes `ExportSection` and `DownloadHint` into `@muralco/types` and updates all usages (dispatchers, addons, views, tests)\n> - Moves `BASE_FORMATS` (and base sections) into `sdk/state/downloads`; dispatcher now consumes from state; trims dispatcher re-exports\n> - Drops `DEFAULT_CAPABILITIES` from `sdk/apis/capabilitie" + }, + { + "number": 46678, + "title": "[NEXT-386] Migrate `src/mural/sdk/hooks` to `@muralco/canvas/sdk/hooks`", + "branch": "migrate-sdk-hook", + "merged_at": "2026-01-08", + "changed_files": 271, + "additions": 546, + "deletions": 464, + "packages_touched": [ + "canvas", + "modals-common" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/business/add-widgets/index.ts", + "packages/canvas/src/business/add-widgets/types.ts", + "packages/canvas/src/business/index.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/recursive-scope.ts", + "packages/canvas/src/register/extension-array.ts", + "packages/canvas/src/register/index.ts", + "packages/canvas/src/register/remove.ts", + "packages/canvas/src/sdk/apis/widgets/delete.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/hooks/activity/create.ts", + "packages/canvas/src/sdk/hooks/activity/index.ts", + "packages/canvas/src/sdk/hooks/activity/register.ts", + "packages/canvas/src/sdk/hooks/activity/state.ts", + "packages/canvas/src/sdk/hooks/activity/types.ts", + "packages/canvas/src/sdk/hooks/ai/create.ts", + "packages/canvas/src/sdk/hooks/ai/index.ts", + "packages/canvas/src/sdk/hooks/ai/register.ts" + ], + "total_files": 271, + "body_preview": "## Overview\n\nMigrates `sdk/hooks` and related utilities from `src/mural/` to the `packages/canvas/` package.\n\nThis PR refactors the hooks architecture to follow a clearer separation of concerns: each hook module now has a `create.ts` file containing the implementation (previously in `index.ts`), while `index.ts` serves as a barrel export for types only. This improves the package structure and makes the API boundaries clearer.\n\n## Changes\n\n### Package Migration\n- **SDK Hooks**: Moved from `src/mu" + }, + { + "number": 46689, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-9", + "merged_at": "2026-01-08", + "changed_files": 58, + "additions": 344, + "deletions": 322, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/menus/types.ts", + "packages/canvas/src/sdk/apis/onboarding/types.ts", + "packages/canvas/src/sdk/state/common-state/common-state.ts", + "packages/canvas/src/sdk/state/common-state/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/menus/index.ts", + "packages/canvas/src/sdk/state/menus/menus.ts", + "packages/canvas/src/sdk/state/menus/types.ts", + "packages/canvas/src/sdk/state/modals/index.ts", + "packages/canvas/src/sdk/state/modals/modals.ts", + "packages/canvas/src/sdk/state/notification-bar/index.ts", + "packages/canvas/src/sdk/state/notification-bar/notification-bar.ts", + "packages/canvas/src/sdk/state/notification/index.ts", + "packages/canvas/src/sdk/state/notification/notification.ts", + "packages/canvas/src/sdk/state/onboarding/index.ts", + "packages/canvas/src/sdk/state/onboarding/onboarding.ts", + "packages/canvas/src/sdk/state/operations/index.ts", + "packages/canvas/src/sdk/state/operations/operations.ts", + "packages/canvas/src/sdk/state/secondary-top-bar/index.ts", + "packages/canvas/src/sdk/state/secondary-top-bar/secondary-top-bar.ts" + ], + "total_files": 58, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these state parts:\r\n* `common-state`\r\n* `menus`\r\n* `modals`\r\n* `notification-bar`\r\n* `notification`\r\n* `onboarding`\r\n* `operations`\r\n* `secondary-top-bar`\r\n* `selection`\r\n\r\nThe environment: https://next-356-9.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Centralizes SDK state into `packages/canvas/src/sdk/state` and removes duplicated local definitions.\n> " + }, + { + "number": 46681, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-8", + "merged_at": "2026-01-07", + "changed_files": 53, + "additions": 231, + "deletions": 208, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/integrations/types.ts", + "packages/canvas/src/sdk/state/extensions/extensions.ts", + "packages/canvas/src/sdk/state/extensions/index.ts", + "packages/canvas/src/sdk/state/find-and-replace/find-and-replace.ts", + "packages/canvas/src/sdk/state/find-and-replace/index.ts", + "packages/canvas/src/sdk/state/find/find.ts", + "packages/canvas/src/sdk/state/find/index.ts", + "packages/canvas/src/sdk/state/focus-mode/focus-mode.ts", + "packages/canvas/src/sdk/state/focus-mode/index.ts", + "packages/canvas/src/sdk/state/focus/focus.ts", + "packages/canvas/src/sdk/state/focus/index.ts", + "packages/canvas/src/sdk/state/guidelines/guidelines.ts", + "packages/canvas/src/sdk/state/guidelines/index.ts", + "packages/canvas/src/sdk/state/hidden-tooltips/hidden-tooltips.ts", + "packages/canvas/src/sdk/state/hidden-tooltips/index.ts", + "packages/canvas/src/sdk/state/hover-feedback/hover-feedback.ts", + "packages/canvas/src/sdk/state/hover-feedback/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/integrations/index.ts", + "packages/canvas/src/sdk/state/integrations/integrations.ts" + ], + "total_files": 53, + "body_preview": "[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)\r\n\r\n**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these state parts:\r\n* `extensions`\r\n* `find-and-replace`\r\n* `find`\r\n* `focus-mode`\r\n* `focus`\r\n* `guidelines`\r\n* `hidden-tooltips`\r\n* `hover-feedback`\r\n* `integrations`\r\n* `interactive-display-bottom-panels`\r\n\r\nThe environment: https://next-356-8.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Modernizes SDK surface by consolidating exports and updating consumers.\n> \n> - Adds `reselect` dependency and re-exports new modules in `@muralco/canvas` (`register/components/action-bar`, `register/types/finder`, `sdk/apis/text`, `sdk/apis/find`, and selector exports for facilitation/participants/capabilities)\n> - Moves text types to `sdk/apis/text` (`TitleFormat`, `SelectionFormat`, `TextConte" + }, + { + "number": 46672, + "title": "[CAN-356] Move AI state into canvas package", + "branch": "fix/next-356-6", + "merged_at": "2026-01-07", + "changed_files": 17, + "additions": 160, + "deletions": 159, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/ai/types.ts", + "packages/canvas/src/sdk/state/ai/ai.ts", + "packages/canvas/src/sdk/state/ai/index.ts", + "packages/canvas/src/sdk/state/ai/types.ts", + "src/mural/addons/ai/ai-summarize/helpers.ts", + "src/mural/sdk/apis/actions-tracker/helpers.ts", + "src/mural/sdk/apis/actions-tracker/index.test.ts", + "src/mural/sdk/apis/actions-tracker/index.ts", + "src/mural/sdk/apis/actions-tracker/util.test.ts", + "src/mural/sdk/apis/actions-tracker/util.ts", + "src/mural/sdk/apis/ai/index.test.ts", + "src/mural/sdk/apis/ai/index.ts", + "src/mural/sdk/apis/ai/performance/index.test.ts", + "src/mural/sdk/apis/ai/performance/index.ts", + "src/mural/sdk/state/ai/index.ts", + "src/mural/sdk/state/index.ts", + "src/mural/sdk/state/public/types.ts" + ], + "total_files": 17, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves AI state into `@muralco/canvas` package.\r\n\r\nThe environment: https://next-356-6.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Centralizes AI state under `packages/canvas/src/sdk/state/ai/ai.ts` and re-exports via `@muralco/canvas/sdk/state`, removing legacy `src/mural/sdk/state/ai/*`.\n> \n> - Introduces namespaced initializers (e.g., `AIChatState.initial`, `AIClusterState" + }, + { + "number": 46580, + "title": "[NEXT-343] package workspace download route", + "branch": "feat/next-343-package-download-route", + "merged_at": "2026-01-07", + "changed_files": 55, + "additions": 671, + "deletions": 188, + "packages_touched": [ + "billing", + "download-exports" + ], + "files_sample": [ + "CODEOWNERS", + "package-lock.json", + "package.json", + "packages/billing/.eslintrc.js", + "packages/billing/README.md", + "packages/billing/api-extractor.json", + "packages/billing/build/webpack.config.js", + "packages/billing/jest.config.js", + "packages/billing/package.json", + "packages/billing/src/defs.d.ts", + "packages/billing/src/index.ts", + "packages/billing/src/utils/index.test.ts", + "packages/billing/src/utils/index.ts", + "packages/billing/tsconfig.jest.json", + "packages/billing/tsconfig.json", + "packages/download-exports/README.md", + "packages/download-exports/features/v1/download-landing-page.feature", + "packages/download-exports/features/v2/download-landing-page.feature", + "packages/download-exports/package.json", + "packages/download-exports/src/components/index.ts" + ], + "total_files": 55, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to #46478. Moves all code for rendering the workspace artifact dowload routes to the `@muralco/download-exports` package:\r\n- Moves final blocking external reference (a plan utility method) to ~`@muralco/parking-lot` where there are similar related utilities (sounds like Engagement team has it in their backlog to migrate eCommerce views/content to packages at some point / there are no existing packages for eCommerce code)~ `@mural" + }, + { + "number": 46631, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-5", + "merged_at": "2026-01-05", + "changed_files": 22, + "additions": 97, + "deletions": 86, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/engine-bridge/types.ts", + "packages/canvas/src/sdk/state/downloads/downloads.ts", + "packages/canvas/src/sdk/state/downloads/index.ts", + "packages/canvas/src/sdk/state/engine-bridge/engine-bridge.ts", + "packages/canvas/src/sdk/state/engine-bridge/index.ts", + "packages/canvas/src/sdk/state/experiments/experiments.ts", + "packages/canvas/src/sdk/state/experiments/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "src/mural/addons/core/export-selection/components/export-center/view/toolbar/index.tsx", + "src/mural/dispatcher/downloads/downloads.test.ts", + "src/mural/sdk/apis/downloads/index.ts", + "src/mural/sdk/apis/engine-bridge/index.ts", + "src/mural/sdk/state/downloads/index.ts", + "src/mural/sdk/state/downloads/types.ts", + "src/mural/sdk/state/engine-bridge/index.ts", + "src/mural/sdk/state/engine-bridge/types.ts", + "src/mural/sdk/state/experiments/index.ts", + "src/mural/sdk/state/experiments/types.ts", + "src/mural/sdk/state/index.ts", + "src/mural/sdk/state/internal/index.ts" + ], + "total_files": 22, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages state:\r\n* downloads\r\n* engine-bridge\r\n* experiments\r\n\r\nThe environment: https://next-356-5.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Consolidates state slices under packages for consistency and reuse.\n> \n> - Adds `DownloadsState`, `ExperimentsState`, and `EngineState`/`InternalEngineBridgeState` under `packages/canvas/src/sdk/state` with `initial` value" + }, + { + "number": 46625, + "title": "[NEXT-379] Migrate more sdk api types", + "branch": "refactor/sdk-api-type-7", + "merged_at": "2026-01-05", + "changed_files": 177, + "additions": 610, + "deletions": 438, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/register/types/ai.ts", + "packages/canvas/src/register/types/index.ts", + "packages/canvas/src/sdk/apis/ai/index.ts", + "packages/canvas/src/sdk/apis/ai/types.ts", + "packages/canvas/src/sdk/apis/content-extension/index.ts", + "packages/canvas/src/sdk/apis/content-extension/types.ts", + "packages/canvas/src/sdk/apis/facilitation/types.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/menus/index.ts", + "packages/canvas/src/sdk/apis/menus/types.ts", + "packages/canvas/src/sdk/apis/mural/index.ts", + "packages/canvas/src/sdk/apis/mural/types.ts", + "packages/canvas/src/sdk/apis/onboarding/index.ts", + "packages/canvas/src/sdk/apis/onboarding/types.ts", + "packages/canvas/src/sdk/state/ai/index.ts", + "packages/canvas/src/sdk/state/ai/types.ts", + "packages/canvas/src/sdk/state/content-extension/index.ts", + "packages/canvas/src/sdk/state/content-extension/types.ts", + "packages/canvas/src/sdk/state/engine-bridge/types.ts", + "packages/canvas/src/sdk/state/index.ts" + ], + "total_files": 177, + "body_preview": "Test environment: https://sdk-api-type-7.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Unifies SDK types under shared canvas exports and cleans up local duplicates; no functional changes expected.\n> \n> - Adds `packages/canvas/register/types/ai` and re-exports via `register/types/index`\n> - Introduces/expands SDK export surfaces: `sdk/apis/ai`, `content-extension`, `menus` (with `types`), `mural/types`, and updates `sdk/apis/index`\n> - Adds state export surfaces for `ai`, `content-e" + }, + { + "number": 46588, + "title": "[NEXT-368] Migrate src/mural/models to @muralco/canvas/models", + "branch": "mural-models-1", + "merged_at": "2026-01-05", + "changed_files": 69, + "additions": 507, + "deletions": 344, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/amp-core/index.ts", + "packages/canvas/src/amp-core/utils/can-request-widget-update.ts", + "packages/canvas/src/amp-core/utils/fill-default-values.ts", + "packages/canvas/src/amp-core/utils/get-widget-cluster.ts", + "packages/canvas/src/amp-core/utils/index.ts", + "packages/canvas/src/amp-core/utils/initialize-mural-model.ts", + "packages/canvas/src/amp-core/utils/initialize-widget-model.ts", + "packages/canvas/src/amp-core/utils/on-update-widget-request.ts", + "packages/canvas/src/amp-core/utils/patch-amp-widget.ts", + "packages/canvas/src/defs.d.ts", + "packages/canvas/src/helpers/index.ts", + "packages/canvas/src/helpers/urls.ts", + "packages/canvas/src/models/amp/fullscreen-manager.ts", + "packages/canvas/src/models/amp/get-mural-token.ts", + "packages/canvas/src/models/amp/index.ts", + "packages/canvas/src/models/amp/mural-base.ts", + "packages/canvas/src/models/amp/mural-content.test.ts", + "packages/canvas/src/models/amp/mural-content.ts" + ], + "total_files": 69, + "body_preview": "## Overview\r\n\r\nMigrates mural models from `src/mural/models/` to `packages/canvas/src/models/amp/` and modernizes exports to use named exports instead of default exports.\r\n\r\n## Changes\r\n\r\n### Model Migration\r\n- **Moved** all model files from `src/mural/models/` \u2192 `packages/canvas/src/models/amp/`\r\n- **Converted** all default exports to named exports (e.g., `export default Model` \u2192 `export const ModelName`)\r\n- **Updated** all imports throughout the codebase to use new locations and named exports\r" + }, + { + "number": 46624, + "title": "[NEXT-378] Migrate more sdk api types", + "branch": "refactor/sdk-api-type-6", + "merged_at": "2025-12-23", + "changed_files": 51, + "additions": 110, + "deletions": 95, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "linter/layers/index.js", + "packages/canvas/src/sdk/apis/engine-bridge/index.ts", + "packages/canvas/src/sdk/apis/engine-bridge/types.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/integrations/index.ts", + "packages/canvas/src/sdk/apis/integrations/types.ts", + "packages/canvas/src/sdk/apis/widgets/file/index.ts", + "packages/canvas/src/sdk/apis/widgets/file/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/table/index.ts", + "packages/canvas/src/sdk/apis/widgets/table/types.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "packages/canvas/src/sdk/state/engine-bridge/index.ts", + "packages/canvas/src/sdk/state/engine-bridge/types.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/integrations/index.ts", + "packages/canvas/src/sdk/state/integrations/types.ts", + "packages/canvas/src/sdk/state/widgets/index.ts", + "packages/canvas/src/sdk/state/widgets/types.ts", + "src/mural/addons/jira-cloud/jira-ticket/index.tsx" + ], + "total_files": 51, + "body_preview": "Test environment: https://sdk-api-type-6.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK API/state types under the canvas package and aligns consumers to new exports.\n> \n> - Adds `engine-bridge` and `integrations` exports to `@muralco/canvas/sdk/apis`; introduces `EngineBridgeSdkApi`/`EngineBridgeConnectFn` and `IntegrationsSdkApi`\n> - Adds `engine-bridge` and `integrations` state exports to `@muralco/canvas/sdk/state` (e.g., `EngineState`, `IntegrationsState`, `Remo" + }, + { + "number": 46622, + "title": "[NEXT-370] Move more sdk api types to canvas package", + "branch": "refactor/sdk-api-type-5", + "merged_at": "2025-12-23", + "changed_files": 81, + "additions": 147, + "deletions": 183, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "linter/layers/index.js", + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/apis/clipboard/index.ts", + "packages/canvas/src/sdk/apis/clipboard/types.ts", + "packages/canvas/src/sdk/apis/conference/index.ts", + "packages/canvas/src/sdk/apis/conference/types.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/native/bridge/index.ts", + "packages/canvas/src/sdk/apis/native/bridge/types.ts", + "packages/canvas/src/sdk/apis/native/index.ts", + "packages/canvas/src/sdk/apis/remote/index.ts", + "packages/canvas/src/sdk/apis/remote/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/types.ts", + "src/mural/addons/ai/ai-mindmaps/function-calls/create-mindmap.ts", + "src/mural/addons/ai/ai-spell-check/function-call.test.ts", + "src/mural/addons/ai/ai-translate/function-call.test.ts", + "src/mural/addons/core/context-menu/format-copy-paste-strategies/title-strategy.ts", + "src/mural/addons/core/editors/lexical/widget-editor/headless/index.ts" + ], + "total_files": 81, + "body_preview": "Test environment: https://sdk-api-type-5.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Shifts SDK surface to the canvas package and standardizes realtime typings.\n> \n> - Adds and exports `clipboard`, `conference`, `remote`, and `native/bridge` SDK API types in `@muralco/canvas`; introduces `TextContentType` under `widgets/types` and re-exports it\n> - Replaces internal `socket/connectivity/types` with direct imports from `@muralco/realtime`; deletes `src/mural/sdk/apis/socket/connec" + }, + { + "number": 46584, + "title": "NEXT-348 - Remove unused /verify-token route", + "branch": "add/next-348", + "merged_at": "2025-12-23", + "changed_files": 4, + "additions": 0, + "deletions": 96, + "packages_touched": [ + "platform" + ], + "files_sample": [ + "packages/platform/router/src/types.ts", + "src/common/routes.ts", + "src/registration/routes/index.tsx", + "src/registration/routes/verify-token.ts" + ], + "total_files": 4, + "body_preview": "### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15101)\r\n\r\n### Test env\r\n- https://next-348.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR removes the unused `/verify-token` route and its implementation as part of cleanup work. The route handled token verification and redirection logic for authentication flows, including mobile app integration, but is no longer in use.\r\n\r\n**Key changes:**\r\n- Deleted the entire `verify-token.ts` file containing the " + }, + { + "number": 46610, + "title": "Refactor moving integrations user settings to package", + "branch": "refactor/integrations-user-settings", + "merged_at": "2025-12-23", + "changed_files": 114, + "additions": 166, + "deletions": 311, + "packages_touched": [ + "integrations" + ], + "files_sample": [ + "features/integrations/github/integrations-page/connect-from-cta.feature", + "features/integrations/github/integrations-page/disconnect-from-cta.feature", + "package-lock.json", + "packages/integrations/README.md", + "packages/integrations/features/v1/user-settings/adobe/connect.feature", + "packages/integrations/features/v1/user-settings/catalog-in-mural-integration/connected-cards.feature", + "packages/integrations/features/v1/user-settings/catalog-in-mural-integration/explore-cards.feature", + "packages/integrations/features/v1/user-settings/catalog.feature", + "packages/integrations/features/v1/user-settings/client-apps-connected.feature", + "packages/integrations/features/v1/user-settings/client-apps.feature", + "packages/integrations/features/v1/user-settings/connected-cards.feature", + "packages/integrations/features/v1/user-settings/explore-cards.feature", + "packages/integrations/features/v1/user-settings/jira/connect.feature", + "packages/integrations/features/v1/user-settings/listing.feature", + "packages/integrations/features/v1/user-settings/request-integration.feature", + "packages/integrations/features/v2/user-settings/github/connect-from-cta.feature", + "packages/integrations/features/v2/user-settings/github/disconnect-from-cta.feature", + "packages/integrations/features/v2/user-settings/jira/connect.feature", + "packages/integrations/package.json", + "packages/integrations/src/company-settings/admin-config/instance-modal/index.tsx" + ], + "total_files": 114, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors integrations user settings functionality by moving it from `src/settings/user/integrations` to the `@muralco/integrations` package. \r\n\r\n**Key changes:**\r\n- Moved user settings components and logic to `packages/integrations/src/user-settings/`\r\n- Refactored logic to be part of the `shared-components` (because is used outside the package) and better `/lib/{integration}` structured logic. \r\n- Consolidated company settings integratio" + }, + { + "number": 46612, + "title": "Stable fix/support large font scaling", + "branch": "stable-fix/support-large-font-scaling", + "merged_at": "2025-12-23", + "changed_files": 6, + "additions": 238, + "deletions": 46, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/ai/ai-suggest-title/operation.ts", + "src/mural/addons/core/fixed-widget-toolbar/font-size/utils.ts", + "src/mural/business/text/font-resize/index.ts", + "src/mural/business/text/font-resize/steps.test.ts", + "src/mural/business/text/font-resize/steps.ts", + "src/mural/dispatcher/widgets/index.tsx" + ], + "total_files": 6, + "body_preview": "# What was changed and why? \ud83e\udd14 \r\n\r\nReference stable-fix PR: https://github.com/tactivos/murally/pull/46604#issue-3754308969\r\nSlack convo: https://mural.slack.com/archives/C02DGJRD397/p1765985240878229\r\n\r\nPlease note \u261d\ufe0f there are comments in another PR link within the aforementioned PR - please glance at everything to understand context.\r\n\r\nTL;DR\r\n\r\n- lower the smallest size from 8 to 4\r\n- increase the largest size to 5000 (10000 is maybe overkill)\r\n- use minor third scaling, statically defined as" + }, + { + "number": 46428, + "title": "[NEXT-340] migrates `src/models` to @muralco/canvas/amp-models`", + "branch": "update/migrate-src-models", + "merged_at": "2025-12-22", + "changed_files": 55, + "additions": 417, + "deletions": 293, + "packages_touched": [ + "canvas", + "tracking-lib" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/amp-models/ajax-config.ts", + "packages/canvas/src/amp-models/collection.ts", + "packages/canvas/src/amp-models/datatypes.ts", + "packages/canvas/src/amp-models/flags.ts", + "packages/canvas/src/amp-models/index.ts", + "packages/canvas/src/amp-models/invitees-derived.ts", + "packages/canvas/src/amp-models/member.ts", + "packages/canvas/src/amp-models/model.ts", + "packages/canvas/src/amp-models/notifications.ts", + "packages/canvas/src/amp-models/pricing/plan.ts", + "packages/canvas/src/amp-models/profile.ts", + "packages/canvas/src/amp-models/promises-mixin.ts", + "packages/canvas/src/amp-models/room/index.ts", + "packages/canvas/src/amp-models/room/invitee-collection.ts", + "packages/canvas/src/amp-models/room/room-collection.ts", + "packages/canvas/src/amp-models/room/room-member-collection.ts", + "packages/canvas/src/amp-models/room/room-member.ts", + "packages/canvas/src/amp-models/room/room.ts" + ], + "total_files": 55, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMigrates the `src/models` directory into the `canvas/amp-models`\r\n- updates import paths and dependencies\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-340) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this cha" + }, + { + "number": 46515, + "title": "Refactor user /me shell to simplify moving code to packages", + "branch": "refactor/me-shell-simplified", + "merged_at": "2025-12-19", + "changed_files": 53, + "additions": 390, + "deletions": 693, + "packages_touched": [ + "enterprise-security", + "legacy-ui", + "mural-utils", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/enterprise-security/package.json", + "packages/enterprise-security/src/data-subject-request/index.test.tsx", + "packages/enterprise-security/src/data-subject-request/index.tsx", + "packages/legacy-ui/src/ui/components/link/index.tsx", + "packages/mural-utils/src/navigation/zoom-options.tsx", + "packages/settings/settings-commons/src/index.ts", + "packages/settings/settings-commons/src/user/index.ts", + "packages/settings/settings-commons/src/user/types.ts", + "src/common/workspace/list/index.tsx", + "src/common/workspace/list/info.tsx", + "src/common/workspace/list/leave-button.tsx", + "src/common/workspace/list/row.tsx", + "src/modals/delete-account/index.tsx", + "src/modals/delete-account/leave.tsx", + "src/mural/addons/jira-legacy/apps-catalog-page-content/index.tsx", + "src/mural/components/navigation/popup/index.tsx", + "src/mural/components/navigation/popup/view/index.tsx", + "src/settings/routes/me.tsx", + "src/settings/user/common/tabs.ts" + ], + "total_files": 53, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors the user settings architecture by consolidating shared types into `@muralco/settings-commons`, removing prop drilling, and simplifying component interfaces to prepare the field for extracting current settings into a package. Next PRs depend on these changes. \r\n\r\nKey changes include:\r\n- Migrating types (Tab \u2192 UserSettingsTab, TabId \u2192 UserSettingsTabId, etc.) to shared settings-commons package and renaming to improve consistency.\r\n" + }, + { + "number": 46573, + "title": "[NEXT-356] Move state into packages", + "branch": "fix/next-356-3", + "merged_at": "2025-12-19", + "changed_files": 127, + "additions": 577, + "deletions": 501, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/state/app/app.ts", + "packages/canvas/src/sdk/state/app/index.ts", + "packages/canvas/src/sdk/state/apps/apps.ts", + "packages/canvas/src/sdk/state/apps/index.ts", + "packages/canvas/src/sdk/state/canvas/canvas.ts", + "packages/canvas/src/sdk/state/canvas/index.ts", + "packages/canvas/src/sdk/state/capabilities/capabilities.ts", + "packages/canvas/src/sdk/state/capabilities/index.ts", + "packages/canvas/src/sdk/state/content-viewer/content-viewer.ts", + "packages/canvas/src/sdk/state/content-viewer/index.ts", + "packages/canvas/src/sdk/state/dragging/dragging.ts", + "packages/canvas/src/sdk/state/dragging/index.ts", + "packages/canvas/src/sdk/state/facilitation/facilitation.ts", + "packages/canvas/src/sdk/state/facilitation/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/labels/index.ts", + "packages/canvas/src/sdk/state/labels/labels.ts", + "packages/canvas/src/sdk/state/modal/index.ts" + ], + "total_files": 127, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages state for:\r\n* participants\r\n* undo-redo\r\n* video\r\n* modal\r\n* socket\r\n* dragging\r\n* preview-mode\r\n* navigation\r\n* labels\r\n* facilitation\r\n* content-viewer\r\n* popover\r\n* capabilities\r\n* app\r\n* apps\r\n* canvas\r\n\r\nThe environment: https://next-356-3.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves multiple SDK state slices into `@muralco/canvas/sdk/state` wit" + }, + { + "number": 46569, + "title": "Migrating more dispatcher types to `@muralco/canvas/dispatcher`", + "branch": "more-dispatcher-types", + "merged_at": "2025-12-19", + "changed_files": 62, + "additions": 115, + "deletions": 76, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/actions-tracker/types.ts", + "packages/canvas/src/dispatcher/async/types.ts", + "packages/canvas/src/dispatcher/downloads/types.ts", + "packages/canvas/src/dispatcher/extensions/types.ts", + "packages/canvas/src/dispatcher/find-and-replace/types.ts", + "packages/canvas/src/dispatcher/hidden-tooltips/types.ts", + "packages/canvas/src/dispatcher/hover-feedback/types.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/dispatcher/input/index.ts", + "packages/canvas/src/dispatcher/input/mouse/index.ts", + "packages/canvas/src/dispatcher/input/mouse/types.ts", + "packages/canvas/src/dispatcher/input/types.ts", + "packages/canvas/src/dispatcher/interactive-display-bottom-panels/index.ts", + "packages/canvas/src/dispatcher/interactive-display-bottom-panels/types.ts", + "packages/canvas/src/dispatcher/network/index.ts", + "packages/canvas/src/dispatcher/network/types.ts", + "packages/canvas/src/dispatcher/notifications/index.ts", + "packages/canvas/src/dispatcher/notifications/types.ts", + "packages/canvas/src/dispatcher/popover/index.ts", + "packages/canvas/src/dispatcher/popover/types.ts" + ], + "total_files": 62, + "body_preview": "Refactors dispatcher type definitions by moving them from `src/mural/dispatcher/` to `packages/canvas/src/dispatcher/` to improve code organization and package boundaries.\r\n\r\n**Types Moved to Canvas Package:**\r\n- `input/` - Input handling types including `MouseApi`, `KeyboardHandler`, and `MouseProcessor`\r\n- `interactive-display-bottom-panels/` - `InteractiveDisplayBottomPanelsApi` and `BottomPanelTab` types\r\n- `network/` - `NetworkApi` and `RequestStatus` types\r\n- `notifications/` - `Notificati" + }, + { + "number": 46478, + "title": "[NEXT-318] Refactor download workspace csv routes", + "branch": "feat/next-318-refactor-download-routes", + "merged_at": "2025-12-18", + "changed_files": 16, + "additions": 958, + "deletions": 84, + "packages_touched": [ + "download-exports", + "queries" + ], + "files_sample": [ + "packages/download-exports/src/components/file-downloader/controller.tsx", + "packages/download-exports/src/components/file-downloader/index.tsx", + "packages/download-exports/src/components/file-downloader/view.tsx", + "packages/download-exports/src/components/index.ts", + "packages/download-exports/src/index.ts", + "packages/queries/src/hooks/index.ts", + "packages/queries/src/hooks/useFetchWorkspace.ts", + "packages/queries/src/hooks/useFetchWorkspaceMemberCounts.ts", + "packages/queries/src/keys.ts", + "src/downloads/components/download-workspace-csv.test.tsx", + "src/downloads/components/download-workspace-csv.tsx", + "src/downloads/hooks/use-workspace-download-permissions.test.tsx", + "src/downloads/hooks/use-workspace-download-permissions.ts", + "src/downloads/routes/download-csv.ts", + "src/downloads/routes/index.tsx", + "src/route-config.tsx" + ], + "total_files": 16, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the logic around a route with branching for two different query strings for downloading a CSV file with data on a workspace:\r\n\r\n- Removes the use of hard to follow frontend \"middleware\" pattern in favor of an existing HOC and a custom hook for checking permission logic / executing potential redirects\r\n- Updates the landing page of the route to reuse a more user friendly \"loading\" experience with a progress indicator for s" + }, + { + "number": 46549, + "title": "[NEXT-366] Break apart & migrate `src/mural/register/types` to `@muralco/canvas/register` part 2", + "branch": "split-register-types-2", + "merged_at": "2025-12-18", + "changed_files": 199, + "additions": 958, + "deletions": 900, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/dispatcher/actions-tracker/index.ts", + "packages/canvas/src/dispatcher/actions-tracker/types.ts", + "packages/canvas/src/dispatcher/async/index.ts", + "packages/canvas/src/dispatcher/async/types.ts", + "packages/canvas/src/dispatcher/downloads/index.ts", + "packages/canvas/src/dispatcher/downloads/types.ts", + "packages/canvas/src/dispatcher/extensions/index.ts", + "packages/canvas/src/dispatcher/extensions/types.ts", + "packages/canvas/src/dispatcher/find-and-replace/index.ts", + "packages/canvas/src/dispatcher/find-and-replace/types.ts", + "packages/canvas/src/dispatcher/hidden-tooltips/index.ts", + "packages/canvas/src/dispatcher/hidden-tooltips/types.ts", + "packages/canvas/src/dispatcher/hover-feedback/index.ts", + "packages/canvas/src/dispatcher/hover-feedback/types.ts", + "packages/canvas/src/dispatcher/index.ts", + "packages/canvas/src/register/types/clipboard.ts", + "packages/canvas/src/register/types/context-menu.ts", + "packages/canvas/src/register/types/extensions.ts", + "packages/canvas/src/register/types/filter.ts", + "packages/canvas/src/register/types/iframe.ts" + ], + "total_files": 199, + "body_preview": "## Summary\r\nContinues migrating registration types from `src/mural/register/types` to `@muralco/canvas/register` package. This PR is breaking up the types monolith of `src/mural/register/types`. \r\n\r\n## Changes\r\n**Break apart and migrated the following types to `@muralco/canvas/register`:**\r\n- `clipboard.ts` - Clipboard data and paste handler types\r\n- `context-menu.ts` - Context menu specifications and menu items\r\n- `filter.ts` - Find/filter widget types and interfaces\r\n- `iframe.ts` - iframe com" + }, + { + "number": 46552, + "title": "[NEXT-364] Migrate widget SDK API types that only have external dependencies", + "branch": "refactor/sdk-api-type-4", + "merged_at": "2025-12-18", + "changed_files": 146, + "additions": 222, + "deletions": 181, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/widgets/area/index.ts", + "packages/canvas/src/sdk/apis/widgets/area/types.ts", + "packages/canvas/src/sdk/apis/widgets/changes/derivatives/index.ts", + "packages/canvas/src/sdk/apis/widgets/changes/derivatives/types.ts", + "packages/canvas/src/sdk/apis/widgets/changes/index.ts", + "packages/canvas/src/sdk/apis/widgets/changes/systems/absorption/index.ts", + "packages/canvas/src/sdk/apis/widgets/changes/systems/absorption/types.ts", + "packages/canvas/src/sdk/apis/widgets/changes/systems/index.ts", + "packages/canvas/src/sdk/apis/widgets/changes/systems/types.ts", + "packages/canvas/src/sdk/apis/widgets/connector/arrow-state/index.ts", + "packages/canvas/src/sdk/apis/widgets/connector/arrow-state/types.ts", + "packages/canvas/src/sdk/apis/widgets/connector/index.ts", + "packages/canvas/src/sdk/apis/widgets/connector/types.ts", + "packages/canvas/src/sdk/apis/widgets/custom-handle/index.ts", + "packages/canvas/src/sdk/apis/widgets/custom-handle/types.ts", + "packages/canvas/src/sdk/apis/widgets/hover/index.ts", + "packages/canvas/src/sdk/apis/widgets/hover/types.ts", + "packages/canvas/src/sdk/apis/widgets/index.ts", + "packages/canvas/src/sdk/apis/widgets/photo/index.ts" + ], + "total_files": 146, + "body_preview": "https://sdk-api-type-4.mural.engineering\r\n\r\n" + }, + { + "number": 46538, + "title": "[NEXT-363] Migrate SDK Apis outline - workspace (minus widgets) that only have external dependencies", + "branch": "refactor/sdk-api-type-3", + "merged_at": "2025-12-17", + "changed_files": 125, + "additions": 215, + "deletions": 160, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/guidelines/index.ts", + "packages/canvas/src/sdk/apis/guidelines/types.ts", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/outline/index.ts", + "packages/canvas/src/sdk/apis/outline/types.ts", + "packages/canvas/src/sdk/apis/popover/index.ts", + "packages/canvas/src/sdk/apis/popover/types.ts", + "packages/canvas/src/sdk/apis/preview-mode/index.ts", + "packages/canvas/src/sdk/apis/preview-mode/types.ts", + "packages/canvas/src/sdk/apis/room/index.ts", + "packages/canvas/src/sdk/apis/room/types.ts", + "packages/canvas/src/sdk/apis/secondaryTopBar/index.ts", + "packages/canvas/src/sdk/apis/secondaryTopBar/types.ts", + "packages/canvas/src/sdk/apis/selection/index.ts", + "packages/canvas/src/sdk/apis/selection/types.ts", + "packages/canvas/src/sdk/apis/settings/index.ts", + "packages/canvas/src/sdk/apis/settings/types.ts", + "packages/canvas/src/sdk/apis/share/index.ts", + "packages/canvas/src/sdk/apis/share/types.ts", + "packages/canvas/src/sdk/apis/snap-to-grid/index.ts" + ], + "total_files": 125, + "body_preview": "https://sdk-api-type-3.mural.engineering" + }, + { + "number": 46523, + "title": "[NEXT-361] Migrate SDK APIs without external dependencies (engine - operations)", + "branch": "refactor/sdk-api-type-2", + "merged_at": "2025-12-17", + "changed_files": 234, + "additions": 422, + "deletions": 313, + "packages_touched": [ + "canvas", + "integrations" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/downloads/index.ts", + "packages/canvas/src/sdk/apis/downloads/types.ts", + "packages/canvas/src/sdk/apis/engine/index.ts", + "packages/canvas/src/sdk/apis/engine/types.ts", + "packages/canvas/src/sdk/apis/experiments/index.ts", + "packages/canvas/src/sdk/apis/experiments/types.ts", + "packages/canvas/src/sdk/apis/export/index.ts", + "packages/canvas/src/sdk/apis/export/types.ts", + "packages/canvas/src/sdk/apis/extensions/index.ts", + "packages/canvas/src/sdk/apis/extensions/types.ts", + "packages/canvas/src/sdk/apis/facilitation/celebrate/index.ts", + "packages/canvas/src/sdk/apis/facilitation/celebrate/types.ts", + "packages/canvas/src/sdk/apis/facilitation/cursors/index.ts", + "packages/canvas/src/sdk/apis/facilitation/cursors/types.ts", + "packages/canvas/src/sdk/apis/facilitation/follow/index.ts", + "packages/canvas/src/sdk/apis/facilitation/follow/types.ts", + "packages/canvas/src/sdk/apis/facilitation/index.ts", + "packages/canvas/src/sdk/apis/facilitation/laser/index.ts", + "packages/canvas/src/sdk/apis/facilitation/laser/types.ts", + "packages/canvas/src/sdk/apis/facilitation/live-reactions/index.ts" + ], + "total_files": 234, + "body_preview": "https://sdk-api-type-2.mural.engineering\r\n\r\n" + }, + { + "number": 46506, + "title": "Refactor user/developer to apps package", + "branch": "refactor/user-develop-to-pkg", + "merged_at": "2025-12-17", + "changed_files": 8, + "additions": 112, + "deletions": 134, + "packages_touched": [], + "files_sample": [ + "src/common/user/util.ts", + "src/settings/user/developers/app-sections/basic-information.tsx", + "src/settings/user/developers/form/app-sharing-form.tsx", + "src/settings/user/developers/form/checkbox-description-list/index.tsx", + "src/settings/user/developers/form/checkbox-description-list/style.sass", + "src/settings/user/developers/index.tsx", + "src/settings/user/developers/tracking/index.ts", + "src/ui/checkbox/description-list/index.tsx" + ], + "total_files": 8, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactor _developer/app-related_ code by moving logic and deps from generic locations into the src/settings/user/developers package, improving code organization and reducing coupling between different parts of the codebase. This is an initial step to move that into a specific package.\r\n\r\n**Key changes:**\r\n\r\n- Moved app registration tracking functions from src/tracking/app-registration to src/settings/user/developers/tracking\r\n- Relocated a" + }, + { + "number": 46518, + "title": "Migrate copy & unified-images register types to `@muralco/canvas/register`", + "branch": "register-types", + "merged_at": "2025-12-16", + "changed_files": 48, + "additions": 76, + "deletions": 70, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/register/clipboard/copy/index.ts", + "packages/canvas/src/register/clipboard/copy/types.ts", + "packages/canvas/src/register/clipboard/index.ts", + "packages/canvas/src/register/index.ts", + "packages/canvas/src/register/text/index.ts", + "packages/canvas/src/register/text/types/index.ts", + "packages/canvas/src/register/text/types/types.ts", + "packages/canvas/src/register/unified-images/index.ts", + "packages/canvas/src/register/unified-images/types.ts", + "src/mural/addons/core/concealed-data/html-concealed-data/index.test.ts", + "src/mural/addons/core/concealed-data/html-concealed-data/index.ts", + "src/mural/addons/core/concealed-data/index.ts", + "src/mural/addons/core/content-extensions/copy-paste/copy-content-extension-data.ts", + "src/mural/addons/core/copy/mode/default.ts", + "src/mural/addons/core/editors/lexical/common/commands/format.tsx", + "src/mural/addons/core/editors/lexical/common/commands/index.tsx", + "src/mural/addons/core/editors/lexical/common/commands/keyboard.tsx", + "src/mural/addons/core/editors/lexical/common/commands/lists.tsx", + "src/mural/addons/core/editors/lexical/common/commands/selection-fix.tsx", + "src/mural/addons/core/editors/lexical/common/commands/types.ts" + ], + "total_files": 48, + "body_preview": "## Pull request overview\r\n\r\nThis PR migrates type definitions for clipboard copy operations, text editor features, and unified images panel from local register directories to the centralized `@muralco/canvas/register` package. This consolidation improves code organization and makes these types available as a shared package dependency.\r\n\r\n**Key Changes:**\r\n- Moved `CopyHandler`, `CopyMetadata`, `CopyFn`, and `ClipboardBuckets` types to `@muralco/canvas/register`\r\n- Moved `TextEditorFeatures` and " + }, + { + "number": 46443, + "title": "Refactor user integrations routes to be moved to a package", + "branch": "refactor/user-integration-routes", + "merged_at": "2025-12-15", + "changed_files": 42, + "additions": 266, + "deletions": 368, + "packages_touched": [ + "integrations", + "settings" + ], + "files_sample": [ + "packages/integrations/src/tracking/index.ts", + "packages/integrations/src/tracking/slack.ts", + "packages/settings/settings-commons/src/components/app-icon/index.tsx", + "packages/settings/settings-commons/src/components/index.ts", + "src/icons/no-image-icon.tsx", + "src/settings/user/developers/table/app-table.tsx", + "src/settings/user/integrations/app/app-connected-props.ts", + "src/settings/user/integrations/app/connected.tsx", + "src/settings/user/integrations/app/index.tsx", + "src/settings/user/integrations/card/common-styles.sass", + "src/settings/user/integrations/card/connected/index.tsx", + "src/settings/user/integrations/card/connected/style.sass", + "src/settings/user/integrations/card/explore/index.tsx", + "src/settings/user/integrations/card/request/index.tsx", + "src/settings/user/integrations/connect-buttons/index.tsx", + "src/settings/user/integrations/explore/controllers/github.tsx", + "src/settings/user/integrations/explore/controllers/jira-legacy.tsx", + "src/settings/user/integrations/explore/controllers/link.tsx", + "src/settings/user/integrations/explore/controllers/slack.tsx", + "src/settings/user/integrations/index.tsx" + ], + "total_files": 42, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFirst effort to refactor user settings-related code to make it easier to move it to a package. Involves consolidating user integration routes within the `src/settings/user/integrations/` directory structure and replacing legacy UI definitions by UI Toolkit.\r\n\r\nKey changes include:\r\n- Migration of integration cards (connected, explore, request) from views to settings/user/integrations\r\n- Replacement of legacy UI components with modern UI To" + }, + { + "number": 46454, + "title": "[NEXT-360] Move SDK api types A-D with only external dependencies", + "branch": "refactor/sdk-api-type-1", + "merged_at": "2025-12-15", + "changed_files": 173, + "additions": 307, + "deletions": 222, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/src/sdk/apis/absorption-feedback/index.ts", + "packages/canvas/src/sdk/apis/absorption-feedback/types.ts", + "packages/canvas/src/sdk/apis/actions-tracker/index.ts", + "packages/canvas/src/sdk/apis/actions-tracker/types.ts", + "packages/canvas/src/sdk/apis/activity/index.ts", + "packages/canvas/src/sdk/apis/activity/types.ts", + "packages/canvas/src/sdk/apis/apps/index.ts", + "packages/canvas/src/sdk/apis/apps/types.ts", + "packages/canvas/src/sdk/apis/assets/index.ts", + "packages/canvas/src/sdk/apis/assets/types.ts", + "packages/canvas/src/sdk/apis/async/index.ts", + "packages/canvas/src/sdk/apis/async/types.ts", + "packages/canvas/src/sdk/apis/callout-scheduler/index.ts", + "packages/canvas/src/sdk/apis/callout-scheduler/types.ts", + "packages/canvas/src/sdk/apis/callouts/index.ts", + "packages/canvas/src/sdk/apis/callouts/types.ts", + "packages/canvas/src/sdk/apis/capabilities/index.ts", + "packages/canvas/src/sdk/apis/capabilities/types.ts", + "packages/canvas/src/sdk/apis/collaboration/index.ts", + "packages/canvas/src/sdk/apis/collaboration/types.ts" + ], + "total_files": 173, + "body_preview": "Test env: https://sdk-api-type-1.mural.engineering/" + }, + { + "number": 46503, + "title": "[NEXT-356] Move resize/user/outline/network state into packages", + "branch": "fix/next-356-2", + "merged_at": "2025-12-15", + "changed_files": 62, + "additions": 219, + "deletions": 205, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/sdk/apis/index.ts", + "packages/canvas/src/sdk/apis/network/index.ts", + "packages/canvas/src/sdk/apis/network/network.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/network/index.ts", + "packages/canvas/src/sdk/state/network/network.ts", + "packages/canvas/src/sdk/state/outline/index.ts", + "packages/canvas/src/sdk/state/outline/outline.ts", + "packages/canvas/src/sdk/state/resize/index.ts", + "packages/canvas/src/sdk/state/resize/resize.ts", + "packages/canvas/src/sdk/state/snippets/index.ts", + "packages/canvas/src/sdk/state/snippets/snippets.ts", + "packages/canvas/src/sdk/state/user/index.ts", + "packages/canvas/src/sdk/state/user/user.ts", + "src/mural/addons/jira-cloud/jira-ticket/index.tsx", + "src/mural/addons/jira-legacy/apps-catalog-page-content/index.tsx", + "src/mural/addons/microsoft-teams/apps-catalog-page-button/index.tsx", + "src/mural/business/mural.ts" + ], + "total_files": 62, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR move into packages:\r\n* Resize state\r\n* User state\r\n* Outline state\r\n* Network state and SDK\r\n\r\nThe environment: https://next-356-2.mural.engineering/" + }, + { + "number": 46453, + "title": "[NEXT-351] Migrate lots of `dispatcher` types to `@muralco/canvas/dispatcher`", + "branch": "dispatcher-types", + "merged_at": "2025-12-12", + "changed_files": 194, + "additions": 292, + "deletions": 200, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "package-lock.json", + "packages/canvas/package.json", + "packages/canvas/src/dispatcher/activity/index.ts", + "packages/canvas/src/dispatcher/activity/types.ts", + "packages/canvas/src/dispatcher/billing/index.ts", + "packages/canvas/src/dispatcher/billing/types.ts", + "packages/canvas/src/dispatcher/canvas/index.ts", + "packages/canvas/src/dispatcher/canvas/types.ts", + "packages/canvas/src/dispatcher/clipboard/index.ts", + "packages/canvas/src/dispatcher/clipboard/types.ts", + "packages/canvas/src/dispatcher/educational/index.ts", + "packages/canvas/src/dispatcher/educational/types.ts", + "packages/canvas/src/dispatcher/experiments/index.ts", + "packages/canvas/src/dispatcher/experiments/types.ts", + "packages/canvas/src/dispatcher/facilitation/index.ts", + "packages/canvas/src/dispatcher/facilitation/timer/index.ts", + "packages/canvas/src/dispatcher/facilitation/timer/types.ts", + "packages/canvas/src/dispatcher/features/index.ts", + "packages/canvas/src/dispatcher/features/types.ts", + "packages/canvas/src/dispatcher/file-preview/index.ts" + ], + "total_files": 194, + "body_preview": "This PR modularizes all `dispatcher` types that were decoupled from any external dependencies.\r\n\r\n### Dispatcher Types Migrated\r\n\r\n\r\n- canvas\r\n- activity\r\n- billing\r\n- clipboard\r\n- educational\r\n- experiments\r\n- features\r\n- file-preview\r\n- find\r\n- focus-mode\r\n- gridlines\r\n- integrations\r\n- members\r\n- modals\r\n- moveEditMode\r\n- navigation\r\n- notification-bar\r\n- outline\r\n- permissions\r\n- screen-reader\r\n- selection\r\n- snippets\r\n- tags\r\n- temporary-mural\r\n- themes\r\n- ticket\r\n- video\r\n- view\r\n- viewpor" + }, + { + "number": 46483, + "title": "[NEXT-356] Move `src/mural/sdk/state/*` into `canvas` package", + "branch": "fix/next-356", + "merged_at": "2025-12-12", + "changed_files": 66, + "additions": 194, + "deletions": 175, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/.eslintrc.js", + "packages/canvas/src/sdk/state/config/config.ts", + "packages/canvas/src/sdk/state/config/index.ts", + "packages/canvas/src/sdk/state/features/features.ts", + "packages/canvas/src/sdk/state/features/index.ts", + "packages/canvas/src/sdk/state/index.ts", + "packages/canvas/src/sdk/state/mouse/index.ts", + "packages/canvas/src/sdk/state/mouse/mouse.ts", + "packages/canvas/src/sdk/state/share/index.ts", + "packages/canvas/src/sdk/state/share/share.ts", + "packages/canvas/src/sdk/state/snap-to-grid/index.ts", + "packages/canvas/src/sdk/state/snap-to-grid/snap-to-grid.ts", + "packages/canvas/src/sdk/state/snapping/index.ts", + "packages/canvas/src/sdk/state/snapping/snapping.ts", + "packages/canvas/src/sdk/state/viewport/index.ts", + "packages/canvas/src/sdk/state/viewport/viewport.ts", + "packages/canvas/src/sdk/state/widget-toolbar/index.ts", + "packages/canvas/src/sdk/state/widget-toolbar/widget-toolbar.ts", + "src/mural/addons/smart-containers/selectors.ts", + "src/mural/sdk/apis/config/index.ts" + ], + "total_files": 66, + "body_preview": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis is the first PR for moving state into packages.\r\n\r\nIt moves state for:\r\n* config\r\n* features\r\n* mouse\r\n* share\r\n* snap-to-grid\r\n* snapping\r\n* viewport\r\n* widget-toolbar\r\n\r\n" + }, + { + "number": 46466, + "title": "Enhance date filters by setting max and min date", + "branch": "feat/ipa-254", + "merged_at": "2025-12-11", + "changed_files": 6, + "additions": 154, + "deletions": 0, + "packages_touched": [ + "admin-reports" + ], + "files_sample": [ + "packages/admin-reports/src/components/filters/created-from-date-filter.tsx", + "packages/admin-reports/src/components/filters/created-to-date-filter.tsx", + "packages/admin-reports/src/components/filters/filters.test.tsx", + "packages/admin-reports/src/components/filters/last-activity-from-date-filter.tsx", + "packages/admin-reports/src/components/filters/last-activity-to-date-filter.tsx", + "packages/admin-reports/src/components/filters/scheduled-report-end-date-filter.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\n---\n\n> [!NOTE]\n> Moves widget proto types/guards to `@muralco/canvas/models` and updates all references; removes proto definitions from dispatcher.\n> \n> - **Mo" + }, + { + "number": 46297, + "title": "feat(admin-reports): add ScheduledDynamicDateFilter to report filters", + "branch": "feat/ipa-236-add-dynamic-date-ranges", + "merged_at": "2025-12-04", + "changed_files": 15, + "additions": 589, + "deletions": 150, + "packages_touched": [ + "admin-reports" + ], + "files_sample": [ + "packages/admin-reports/src/components/create-report-modal.test.tsx", + "packages/admin-reports/src/components/create-report-modal.tsx", + "packages/admin-reports/src/components/filters/filters.test.tsx", + "packages/admin-reports/src/components/filters/index.ts", + "packages/admin-reports/src/components/filters/plan-filter.tsx", + "packages/admin-reports/src/components/filters/scheduled-dynamic-date-filter.tsx", + "packages/admin-reports/src/components/filters/scheduled-dynamic-date-options.ts", + "packages/admin-reports/src/components/filtersByReport/mural-memberships-report-filters.tsx", + "packages/admin-reports/src/components/filtersByReport/murals-report-filters.tsx", + "packages/admin-reports/src/components/filtersByReport/room-memberships-report-filters.tsx", + "packages/admin-reports/src/components/filtersByReport/rooms-report-filters.tsx", + "packages/admin-reports/src/components/filtersByReport/workspace-memberships-report-filters.tsx", + "packages/admin-reports/src/components/filtersByReport/workspaces-report-filters.tsx", + "packages/admin-reports/src/components/modal.tsx", + "packages/admin-reports/src/utils/types.ts" + ], + "total_files": 15, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n\n> [!NOTE]\n> Moves template-library hooks and types into the shared @muralco/templates-modals package, tightens types/APIs, and updates all consumers and tests.\n> \n> - **Packages: @muralco/templates-modals**\n> - **New Module: `template-library`**\n> - Adds `types`, `use-auto-scroll` (null-safe container), `use-company-templates-collections` (error handling + state reset), `use-templates` (stricter types, combined map typing, MFS filtering + search tracking), `use-use-" + }, + { + "number": 46248, + "title": "Feat/ipa 307 refactor reporting filters", + "branch": "feat/ipa-307-refactor-reporting-filters", + "merged_at": "2025-11-28", + "changed_files": 47, + "additions": 2906, + "deletions": 1399, + "packages_touched": [ + "admin-reports" + ], + "files_sample": [ + "package-lock.json", + "packages/admin-reports/package.json", + "packages/admin-reports/src/components/create-report-modal.test.tsx", + "packages/admin-reports/src/components/create-report-modal.tsx", + "packages/admin-reports/src/components/filter.test.tsx", + "packages/admin-reports/src/components/filter.tsx", + "packages/admin-reports/src/components/filters/admin-emails-filter.tsx", + "packages/admin-reports/src/components/filters/created-from-date-filter.tsx", + "packages/admin-reports/src/components/filters/created-to-date-filter.tsx", + "packages/admin-reports/src/components/filters/filter-error-message.tsx", + "packages/admin-reports/src/components/filters/filter-field-wrapper.tsx", + "packages/admin-reports/src/components/filters/filters.test.tsx", + "packages/admin-reports/src/components/filters/index.ts", + "packages/admin-reports/src/components/filters/last-activity-from-date-filter.tsx", + "packages/admin-reports/src/components/filters/last-activity-to-date-filter.tsx", + "packages/admin-reports/src/components/filters/mural-id-filter.tsx", + "packages/admin-reports/src/components/filters/plan-filter.tsx", + "packages/admin-reports/src/components/filters/room-id-filter.tsx", + "packages/admin-reports/src/components/filters/room-type-filter.tsx", + "packages/admin-reports/src/components/filters/scheduled-report-end-date-filter.tsx" + ], + "total_files": 47, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nReplace the legacy dynamic filter renderer with dedicated, typed filter components under packages/admin-reports/src/components/filters/**, plus matching filtersByReport/* grouping components.\r\n\r\nSimplify useReports, reducer, modal, and async-reports page by removing the \u201cenriched filters\u201d plumbing, tracking form data directly, and introducing buildFiltersFormData + shared prop types.\r\n\r\nRefresh styles and modal layout for the new filters, an" + }, + { + "number": 46253, + "title": "[NEXT-267] - add webpack plugin to externalize relative imports from subpaths", + "branch": "feat/canvas-package-subpaths", + "merged_at": "2025-11-27", + "changed_files": 4, + "additions": 735, + "deletions": 29, + "packages_touched": [ + "canvas" + ], + "files_sample": [ + "packages/canvas/ARCHITECTURE.md", + "packages/canvas/README.md", + "packages/canvas/build/RelativeSubpathExternalizerPlugin.js", + "packages/canvas/build/webpack.config.js" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[NEXT-267](https://mural.atlassian.net/browse/NEXT-267)\r\n\r\nThis PR introduces a modular subpath exports architecture for the @muralco/canvas package.\r\n\r\n\u2022 Implemented subpath exports system allowing consumers to import specific modules (e.g., @muralco/canvas/sdk/state, @muralco/canvas/business) instead of the entire package.\r\n\r\n\u2022 Added `RelativeSubpathExternalizerPlugin` - Custom webpack plugin that prevents cross-subpath imports from bein" + }, + { + "number": 46227, + "title": "[NEXT-313][NEXT-314] Colocate Color Palette & Common Mural Hooks to src/mural", + "branch": "colocate-mural-components", + "merged_at": "2025-11-25", + "changed_files": 194, + "additions": 270, + "deletions": 262, + "packages_touched": [], + "files_sample": [ + "src/common/integrations/sync/ticket-text-editor-with-label.test.tsx", + "src/common/integrations/sync/ticket-text-editor.tsx", + "src/common/template-library/utils.ts", + "src/dashboard/components/mural-location/index.tsx", + "src/lib/tools-api/renderers/button/index.test.tsx", + "src/lib/tools-api/renderers/button/index.tsx", + "src/lib/tools-api/renderers/toolbar/container.tsx", + "src/lib/tools-api/renderers/toolbar/index.test.tsx", + "src/lib/tools-api/renderers/toolbar/index.tsx", + "src/lib/tools-api/wellknown-toolbars/fixed-widget-toolbar.test.tsx", + "src/lib/tools-api/wellknown-toolbars/fixed-widget-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/mural-actions-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/navigation-toolbar.tsx", + "src/lib/tools-api/wellknown-toolbars/utilities-toolbar.tsx", + "src/modals/app-request/index.test.tsx", + "src/modals/app-request/index.tsx", + "src/modals/apps-catalog/app-page/app-request-footer.tsx", + "src/modals/apps-catalog/app-page/index.test.tsx", + "src/modals/apps-catalog/app-page/index.tsx", + "src/modals/apps-catalog/apps-list/index.tsx" + ], + "total_files": 194, + "body_preview": "Intermediary modularization step to help ease the migration of `src/mural`. This PR is moving common canvas code (color palette, mural hooks) to `src/mural` to reduce external dependencies from outside of that directory. The `src/mural/hooks` directory will eventually become `@muralco/canvas/hooks`. \r\n\r\nZero functional changes, a simple lift and shift of files to different directories. \r\n\r\nUpdates made: \r\n- `src/common/components/color-palette`, moved with other mural specific components in `src" + }, + { + "number": 46082, + "title": "[FEP-6416] - update MrlToast custom notifications", + "branch": "refactor/toast-notification-styles", + "merged_at": "2025-11-25", + "changed_files": 18, + "additions": 107, + "deletions": 83, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/mural/addons/widget-compositors/enhanced-kanban-board/information-panel/styles.module.sass", + "src/mural/addons/widget-compositors/enhanced-kanban-board/pendo-utils.tsx", + "src/mural/components/feedback-toast/index.tsx", + "src/mural/components/feedback-toast/styles.module.sass", + "src/mural/dispatcher/billing/toasts/limitedMemberReverseTrialContent.tsx", + "src/mural/dispatcher/billing/toasts/styles.module.sass", + "src/mural/dispatcher/selection/education.module.sass", + "src/mural/dispatcher/selection/education.tsx", + "src/views/mural/modals/share/share-mural/styles.module.sass", + "src/views/mural/tips/edit-mode/index.tsx", + "src/views/mural/tips/edit-mode/styles.module.sass", + "src/views/mural/tips/focus-mode/index.tsx", + "src/views/mural/ui/follow-layer/style.sass", + "src/views/mural/ui/notification/following-notifications/asked-to-be-followed-notification/index.tsx", + "src/views/mural/ui/notification/following-notifications/follow-layer-notification/index.tsx", + "src/views/mural/ui/notification/following-notifications/follow-layer-notification/styles.module.sass" + ], + "total_files": 18, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6416](https://mural.atlassian.net/browse/FEP-6416)\r\n\r\n[https://toast-notification-styles.mural.engineering/](https://toast-notification-styles.mural.engineering/)\r\n\r\nThis PR updates all of the `MrlToast` notifications that have a custom implementation. These toast notification instances use `primaryMessage` or `secondaryMessage` to support passing a custom React component to the `MrlToast` notification. We made an [update](https://git" + }, + { + "number": 46225, + "title": "[NEXT-312] Migrates src/common/components to packages", + "branch": "src-common-components", + "merged_at": "2025-11-25", + "changed_files": 55, + "additions": 81, + "deletions": 94, + "packages_touched": [ + "integrations", + "legacy-ui", + "types" + ], + "files_sample": [ + "package-lock.json", + "packages/integrations/package.json", + "packages/integrations/src/components/dotted-container/dotted-container.tsx", + "packages/integrations/src/components/dotted-container/index.ts", + "packages/integrations/src/components/dotted-container/styles.module.sass", + "packages/integrations/src/components/index.ts", + "packages/integrations/src/index.ts", + "packages/integrations/src/views/company-settings/development/integrations/types.ts", + "packages/legacy-ui/package.json", + "packages/legacy-ui/src/helpers/default-theme-size.ts", + "packages/legacy-ui/src/icons/index.ts", + "packages/legacy-ui/src/icons/user-link.tsx", + "packages/legacy-ui/src/index.ts", + "packages/legacy-ui/src/mural/sdk/apis/modal/types.ts", + "packages/legacy-ui/src/ui/components/empty-loading/empty-loading.tsx", + "packages/legacy-ui/src/ui/components/empty-loading/index.ts", + "packages/legacy-ui/src/ui/components/index.ts", + "packages/legacy-ui/src/ui/components/legacy-form/avatar-field.tsx", + "packages/legacy-ui/src/ui/components/legacy-form/index.ts", + "packages/legacy-ui/src/ui/components/legacy-form/input-field.tsx" + ], + "total_files": 55, + "body_preview": "## Pull request overview\r\n\r\nThis PR migrates common components from `src/common/components` to internal packages (`@muralco/legacy-ui`, `@muralco/integrations`, and `@muralco/types`), improving code organization and reusability across the monorepo. The migration includes updating import paths throughout the codebase to reference the new package locations.\r\n\r\n**Key Changes:**\r\n- Components migrated to `@muralco/legacy-ui`: `EmptyLoading`, `VisitorsLinkText`, `LegacyInputField`, `LegacyAvatarField" + }, + { + "number": 46217, + "title": "[NEXT-256] Remove `setSdkContextForAmpHelpers`", + "branch": "fix/next-256-2", + "merged_at": "2025-11-25", + "changed_files": 20, + "additions": 124, + "deletions": 107, + "packages_touched": [], + "files_sample": [ + "src/amp/apply-changes-to-mural.ts", + "src/amp/helpers.ts", + "src/mural/models/mural.test.ts", + "src/mural/routes/mural.tsx", + "src/mural/routes/template.tsx", + "src/mural/routes/temporary-mural.tsx", + "src/mural/sdk/apis/index.ts", + "src/mural/sdk/apis/mural/index.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/create-widgets.test.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/create-widgets.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/delete-widgets.test.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/delete-widgets.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/update-widgets.test.ts", + "src/mural/sdk/apis/widgets/changes/apply-changes/update-widgets.ts", + "src/mural/sdk/apis/widgets/changes/types.ts", + "src/mural/sdk/apis/widgets/index.ts", + "src/test/react/main.ts", + "src/test/react/step-definitions/util.ts", + "src/test/react/step-definitions/when/widget.ts", + "src/test/unit/mocks/widget-changes-api-mocks.ts" + ], + "total_files": 20, + "body_preview": "**[NEXT-256 Remove easy to replace functions from apm, use SDK](https://mural.atlassian.net/browse/NEXT-256)**\r\n\r\nThis PR removes global variable + getter/setter for SDK context. The last call to it was inside of `onUpdateWidgetRequest`. In most cases it was easy to provide SDK, except the case `widget.patch() -> patchAmpWidget() -> onUpdateWidgetRequest() -> debouncedApplyChangesToMural(globalSdk)`. So, moved the call requiring SDK out of `onUpdateWidgetRequest` and call `debouncedApplyChangesT" + }, + { + "number": 46197, + "title": "[NEXT-272] Migrate misc standalone files from src/common", + "branch": "package-src-common-directories", + "merged_at": "2025-11-24", + "changed_files": 39, + "additions": 36, + "deletions": 85, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "packages/legacy-ui/src/helpers/help-menu/helpers.ts", + "packages/legacy-ui/src/helpers/help-menu/index.ts", + "packages/legacy-ui/src/helpers/index.ts", + "packages/legacy-ui/src/ui/components/index.ts", + "packages/legacy-ui/src/ui/components/satismeter/index.ts", + "packages/legacy-ui/src/ui/components/satismeter/satismeter.tsx", + "src/common/help-menu/style.sass", + "src/company/controller.tsx", + "src/dashboard/components/view.tsx", + "src/dashboard/layout/config-menu/use-action-handler.ts", + "src/mural/addons/core/help/index.tsx", + "src/mural/addons/core/outline/instructions/editor/video-list/index.tsx", + "src/mural/addons/core/realtime/editing.ts", + "src/mural/components/preview/index.tsx", + "src/mural/dispatcher/outline/index.test.ts", + "src/mural/dispatcher/outline/index.ts", + "src/mural/helpers/time-constants.ts", + "src/mural/sdk/apis/socket/index.ts", + "src/mural/sdk/apis/video/index.ts" + ], + "total_files": 39, + "body_preview": "## Migrate misc standalone files from src/common\r\n\r\nRefactors standalone files from `src/common` into more appropriate locations within the monorepo structure.\r\n\r\n### Changes\r\n\r\n- **Help menu helpers** \u2192 `packages/legacy-ui/src/helpers/help-menu/`\r\n - Moved `handleClickHelpCenter` and `handleClickEmailCS` to the legacy-ui package\r\n - Removed unused `style.sass` file\r\n\r\n- **Satismeter component** \u2192 `packages/legacy-ui/src/ui/components/satismeter/`\r\n - Moved component to legacy-ui package stru" + }, + { + "number": 46220, + "title": "Tiger team codeowners", + "branch": "tiger-team-codeowners", + "merged_at": "2025-11-24", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "packages_touched": [], + "files_sample": [ + "CODEOWNERS" + ], + "total_files": 1, + "body_preview": "This PR adds the `@tactivos/modularization-tiger-team` to the CODEOWNERS for `package.json` and `package-lock.json` files, allowing the tiger team to approve dependency-related changes alongside FEP and Platform Engineering teams.\r\n\r\n- Added tiger team as a third approver group for all `package.json` and `package-lock.json` files\n\n\n---\n\n> [!NOTE]\n> Adds `@tactivos/modularization-tiger-team` as co-owners for all `**/package.json` and `package-lock.json` entries in `CODEOWNE" + }, + { + "number": 46198, + "title": "[NEXT-269] Adds core dispatcher module", + "branch": "add/core-dispatcher-module", + "merged_at": "2025-11-24", + "changed_files": 129, + "additions": 673, + "deletions": 143, + "packages_touched": [ + "core-dispatcher" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/core-dispatcher/.eslintrc.js", + "packages/core-dispatcher/README.md", + "packages/core-dispatcher/api-extractor.json", + "packages/core-dispatcher/build/webpack.config.js", + "packages/core-dispatcher/jest.config.js", + "packages/core-dispatcher/package.json", + "packages/core-dispatcher/src/connect-to-dispatcher.ts", + "packages/core-dispatcher/src/connect-to-selector.ts", + "packages/core-dispatcher/src/connect.test.tsx", + "packages/core-dispatcher/src/connect.tsx", + "packages/core-dispatcher/src/get-state.ts", + "packages/core-dispatcher/src/index.test.ts", + "packages/core-dispatcher/src/index.ts", + "packages/core-dispatcher/src/slice-inspector-diff-data.ts", + "packages/core-dispatcher/src/types.ts", + "packages/core-dispatcher/tsconfig.jest.json", + "packages/core-dispatcher/tsconfig.json", + "src/common/mural/hooks/use-mural-state.ts" + ], + "total_files": 129, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSummary:\r\n\r\nExtracts dispatcher connection utilities into a new @muralco/core-dispatcher package and migrates the codebase to use it. This centralizes state management connection logic and improves maintainability.\r\n\r\nChanges:\r\n\r\n- New Package: `@muralco/core-dispatcher`\r\nA framework-agnostic state management library providing:\r\n- React Component Connection: connectComponent HOC for connecting React components to dispatcher state using a s" + }, + { + "number": 46170, + "title": "[NEXT-262] Migrate common HOC's to @muralco/legacy-ui", + "branch": "common-legacy-ui", + "merged_at": "2025-11-20", + "changed_files": 99, + "additions": 146, + "deletions": 149, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "packages/legacy-ui/package.json", + "packages/legacy-ui/src/legacy-hoc/index.ts", + "packages/legacy-ui/src/legacy-hoc/pure/index.ts", + "packages/legacy-ui/src/legacy-hoc/pure/pure.test.tsx", + "packages/legacy-ui/src/legacy-hoc/pure/pure.tsx", + "packages/legacy-ui/src/legacy-hoc/with-form-rules/index.ts", + "packages/legacy-ui/src/legacy-hoc/with-form-rules/with-form-rules.tsx", + "packages/legacy-ui/src/legacy-hoc/with-state/index.ts", + "packages/legacy-ui/src/legacy-hoc/with-state/with-state.tsx", + "src/billing/components/account/account-price.tsx", + "src/common/integrations/sync/info-panel-notification.tsx", + "src/common/integrations/sync/ticket-text-editor-with-label.tsx", + "src/common/integrations/sync/ticket-text-editor.tsx", + "src/common/user/trigger.tsx", + "src/dashboard/menu/index.tsx", + "src/error/access-denied-anonymous.tsx", + "src/modals/bulk/convert-to-guest/index.tsx", + "src/modals/bulk/user-summary/old/index.tsx", + "src/modals/bulk/user-summary/old/multiple.tsx" + ], + "total_files": 99, + "body_preview": "Migrates common legacy HOC's from `src/common` to `@muralco/legacy-ui`. \n\n\n---\n\n> [!NOTE]\n> Moves legacy HOCs (`pure`, `with-form-rules`, `with-state`) into `@muralco/legacy-ui` and refactors app-wide imports/usages, adding tests and minor type/name adjustments.\n> \n> - **Legacy UI package**:\n> - Export and implement `legacy-hoc` utilities: `pure`, `with-form-rules` (with `FormRule`, `FormRulesInjectedProps`), and `with-state`.\n> - Convert `pure` to a named export; add " + }, + { + "number": 46177, + "title": "[NEXT-211] Migrate withJiraLegacy to @muralco/integrations", + "branch": "migrate-with-jira-legacy", + "merged_at": "2025-11-20", + "changed_files": 4, + "additions": 11, + "deletions": 8, + "packages_touched": [ + "integrations" + ], + "files_sample": [ + "packages/integrations/src/hoc/index.ts", + "packages/integrations/src/hoc/with-jira-legacy.tsx", + "packages/integrations/src/index.ts", + "src/settings/user/integrations/common/jira-legacy/ui/workspace-with-url.tsx" + ], + "total_files": 4, + "body_preview": "Migrate `withJiraLegacy` to `@muralco/integrations`\n\n\n---\n\n> [!NOTE]\n> Moves `withJiraLegacy` HOC into `@muralco/integrations`, exports it (and `Jira`), and updates the Jira workspace UI to consume it.\n> \n> - **Integrations package**:\n> - **HOC added/moved**: Add `hoc/with-jira-legacy.tsx` and export `withJiraLegacy` and `Jira` via `hoc/index.ts` and root `index.ts`.\n> - **Internal imports**: Switch to package-local `../constants` and `../tracking`.\n> - **Settings UI**" + }, + { + "number": 46136, + "title": "Add profile widget examples for Salesforce Contact and Lead", + "branch": "feature/add-profile-widget-examples-salesforce", + "merged_at": "2025-11-20", + "changed_files": 4, + "additions": 75, + "deletions": 5, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/system-of-record/common/app-catalog-page.tsx", + "src/mural/business/system-of-record/integrations/index.ts", + "src/mural/business/system-of-record/integrations/salesforce/common/example-widget.ts", + "static/images/profile-widget/profile-example.png" + ], + "total_files": 4, + "body_preview": "This PR adds example profile widgets for Salesforce contact and lead records in the System of Record (SOR) app catalog page. It introduces a reusable factory function for creating Salesforce profile widget examples and updates the app catalog page to support custom example widgets.\r\n\r\nhttps://mural.atlassian.net/browse/PLAY-670\r\n\r\nloom.com/share/3db90ca0f33e4988b0f1c466606c0b9d?from_recorder=1&focus_title=1\r\n\r\n\"image\" \r\n Now, with these changes, \r\n-->\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or up" + }, + { + "number": 46134, + "title": "Remove team from CODEOWNERS for package.json files", + "branch": "fix/codeowner-error", + "merged_at": "2025-11-18", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "packages_touched": [], + "files_sample": [ + "CODEOWNERS" + ], + "total_files": 1, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nRemove tactivos/modularization-tiger-team from CODEOWNERS to make it valid again\r\n" + }, + { + "number": 46110, + "title": "[NEXT-110] Move `src/common/state` with other SDK state", + "branch": "relocate-common-state", + "merged_at": "2025-11-17", + "changed_files": 23, + "additions": 31, + "deletions": 37, + "packages_touched": [], + "files_sample": [ + "src/common/state/types.ts", + "src/mural/sdk/apis/create-mural-state.ts", + "src/mural/sdk/apis/modal/index.ts", + "src/mural/sdk/apis/modals/index.ts", + "src/mural/sdk/apis/notifications/index.ts", + "src/mural/sdk/apis/share/index.ts", + "src/mural/sdk/apis/socket/index.ts", + "src/mural/sdk/state/common-state/index.ts", + "src/mural/sdk/state/common-state/types.ts", + "src/mural/sdk/state/index.ts", + "src/mural/sdk/state/internal/index.ts", + "src/mural/sdk/state/internal/types.ts", + "src/mural/sdk/state/modal/index.ts", + "src/mural/sdk/state/modal/types.ts", + "src/mural/sdk/state/modals/index.ts", + "src/mural/sdk/state/modals/types.ts", + "src/mural/sdk/state/notification/index.ts", + "src/mural/sdk/state/notification/types.ts", + "src/mural/sdk/state/share/index.ts", + "src/mural/sdk/state/share/types.ts" + ], + "total_files": 23, + "body_preview": "This PR refactors the codebase by moving the state management code from `src/common/state` to `src/mural/sdk/state`, consolidating common state with other SDK state modules. The refactoring improves code organization by placing all SDK state in a single location.\r\n\r\nKey changes:\r\n\r\n- Moved `src/common/state` to `src/mural/sdk/state/common-state`\r\n- Created separate state modules (modal, modals, notification, share, socket) as siblings to common-state\r\n- Updated all import paths throughout the co" + }, + { + "number": 46081, + "title": "[NEXT-209] Migrate Github Connect + Tracking Integrations to @muralco/integrations", + "branch": "migrate-tracking-integrations", + "merged_at": "2025-11-14", + "changed_files": 23, + "additions": 30, + "deletions": 23, + "packages_touched": [ + "integrations", + "parking-lot" + ], + "files_sample": [ + "packages/integrations/src/constants/index.ts", + "packages/integrations/src/constants/integration-window/index.ts", + "packages/integrations/src/constants/integration-window/integration-window-opts.ts", + "packages/integrations/src/github/connect.ts", + "packages/integrations/src/github/index.ts", + "packages/integrations/src/index.ts", + "packages/integrations/src/tracking/index.ts", + "packages/integrations/src/tracking/integration.ts", + "packages/integrations/src/tracking/jira-cloud.ts", + "packages/parking-lot/src/helpers/index.ts", + "src/common/hoc/with-jira-legacy.tsx", + "src/mural/addons/github/apps-catalog-page-button/index.tsx", + "src/mural/addons/internal-integrations/github/content-menu.tsx", + "src/mural/addons/internal-integrations/jira/context-menu.tsx", + "src/settings/user/integrations/common/jira-legacy/ui/workspace-with-url.tsx", + "src/settings/user/integrations/common/slack/connect.ts", + "src/settings/user/integrations/explore/controllers/github.tsx", + "src/settings/user/integrations/manage/controllers/adobe-cc/common/connect.ts", + "src/settings/user/integrations/manage/controllers/adobe-cc/common/tracking.ts", + "src/settings/user/integrations/manage/controllers/github.tsx" + ], + "total_files": 23, + "body_preview": "Refactors integration tracking and related code into the @muralco/integrations package and migrates tracking to @muralco/tracking-lib.\r\n\r\nChanges:\r\n- Moves tracking code from src/tracking/ to packages/integrations/src/tracking/\r\n- Moves GitHub integration helpers from src/common/integrations/ to packages/integrations/src/github/\r\n- Moves integration window constants from @muralco/parking-lot to @muralco/integrations\r\n- Updates imports across the codebase to use @muralco/integrations\r\n- Migrates " + }, + { + "number": 46054, + "title": "[NEXT-107] Package common types", + "branch": "package-common-types", + "merged_at": "2025-11-14", + "changed_files": 110, + "additions": 141, + "deletions": 174, + "packages_touched": [ + "types" + ], + "files_sample": [ + "linter/layers/index.js", + "packages/types/README.md", + "packages/types/package.json", + "packages/types/src/common/axis2d.ts", + "packages/types/src/common/deep-read.ts", + "packages/types/src/common/index.ts", + "packages/types/src/common/json-mergepath.ts", + "packages/types/src/common/orientation.ts", + "packages/types/src/common/partial-partial.ts", + "packages/types/src/common/rect.ts", + "packages/types/src/common/time.ts", + "packages/types/src/common/with-props.ts", + "packages/types/tsconfig.json", + "src/common/types.ts", + "src/lib/components/shared/incremental-input/index.tsx", + "src/modals/add-workspace-admins/controller.tsx", + "src/modals/add-workspace-admins/emails-list/index.tsx", + "src/mural/addons/ai/ai-cluster/create-cluster-area.ts", + "src/mural/addons/context/types.ts", + "src/mural/addons/core/editors/lexical/widget-editor/helpers/get-text-editor-position.ts" + ], + "total_files": 110, + "body_preview": "This PR migrates common type definitions from `src/common/types.ts` to a dedicated `@muralco/types `package, improving code organization and making these types available as a reusable internal package.\r\n\r\nKey Changes:\r\n\r\n- Migrated all type definitions from `src/common/types.ts` to `packages/types/src/common/`\r\n- Updated 100+ import statements across the codebase to use `@muralco/types`\r\n- Improved package configuration with proper exports and build settings" + }, + { + "number": 46084, + "title": "Add tiger team as CODEOWNER for package.json", + "branch": "update-codeowners-package", + "merged_at": "2025-11-13", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "packages_touched": [], + "files_sample": [ + "CODEOWNERS" + ], + "total_files": 1, + "body_preview": "Adds `@tactivos/modularization-tiger-team` to `package.json` reviews" + }, + { + "number": 45885, + "title": "[research-agent][cleanup] move from sdk.ai to sdk.operations", + "branch": "refactor/generate-research", + "merged_at": "2025-11-06", + "changed_files": 11, + "additions": 99, + "deletions": 95, + "packages_touched": [ + "api", + "realtime" + ], + "files_sample": [ + "packages/api/src/content/content.ts", + "packages/api/src/content/types.ts", + "packages/api/src/murals/types/operations.ts", + "packages/realtime/src/index.ts", + "src/mural/addons/core/realtime/processor.ts", + "src/mural/addons/research-mural/research-mural-ui/business.test.ts", + "src/mural/addons/research-mural/research-mural-ui/business.ts", + "src/mural/addons/research-mural/research-mural-ui/operation.tsx", + "src/mural/addons/research-mural/research-mural-ui/types.ts", + "src/mural/sdk/apis/ai/types.ts", + "src/mural/sdk/apis/operations/types.ts" + ], + "total_files": 11, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we were using the sdk.ai surface area. This was fine but it limits our ownership and ability to make adjustments. This is a highly used abstraction and we do not own it.\r\n\r\nNow, we use the sdk.operations surface area which is owned by us. We created it after the pattern of sdk.ai but its a way for us to make tweaks as necessary without interfering with the ai implementation.\r\n\r\nIn a future commit, we will use the op" + }, + { + "number": 45953, + "title": "[ENGAGE-1161] Migrate /check-email route to @muralco/route-check-email package", + "branch": "migrate/package-check-email", + "merged_at": "2025-11-05", + "changed_files": 24, + "additions": 290, + "deletions": 11, + "packages_touched": [ + "route-check-email" + ], + "files_sample": [ + "CODEOWNERS", + "package-lock.json", + "packages/route-check-email/.eslintrc.js", + "packages/route-check-email/README.md", + "packages/route-check-email/api-extractor.json", + "packages/route-check-email/build/webpack.config.js", + "packages/route-check-email/jest.config.js", + "packages/route-check-email/jest.setup.js", + "packages/route-check-email/package.json", + "packages/route-check-email/src/CheckEmail.test.tsx", + "packages/route-check-email/src/CheckEmail.tsx", + "packages/route-check-email/src/CheckEmailWrapper.tsx", + "packages/route-check-email/src/components/CountdownBySeconds.test.tsx", + "packages/route-check-email/src/components/CountdownBySeconds.tsx", + "packages/route-check-email/src/components/timed-helpers.test.tsx", + "packages/route-check-email/src/components/timed-helpers.ts", + "packages/route-check-email/src/defs.d.ts", + "packages/route-check-email/src/index.ts", + "packages/route-check-email/src/styles.module.sass", + "packages/route-check-email/src/utils/ensureValidEmail.ts" + ], + "total_files": 24, + "body_preview": "\"image\"\r\n\r\n\r\nhttps://package-check-email.mural.engineering/\r\n\r\n- Create new @muralco/route-check-email package following route package pattern\r\n- Migrate CheckEmail, CheckEmailWrapper, CountdownBySeconds components\r\n- Migrate ensureValidEmail utility and timed-helpers\r\n- Extract .toast style to package-specific styles module\r\n- Update imports in src/registration/routes/ind" + }, + { + "number": 45865, + "title": "Update UI Toolkit : Improved Menu + Modal Focus Management & ARIA Support", + "branch": "update-uik-modal-focus", + "merged_at": "2025-10-30", + "changed_files": 40, + "additions": 297, + "deletions": 26, + "packages_touched": [ + "dashboard", + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/context/src/stores/ActionsManager.tsx", + "packages/dashboard/context/src/stores/RoomActionsManager.tsx", + "packages/dashboard/universal-card/src/card-actions/card-actions.test.tsx", + "packages/dashboard/universal-card/src/card-actions/card-actions.tsx", + "packages/dashboard/universal-card/src/universal-card.test.tsx", + "packages/legacy-ui/src/ui/components/modal/message.tsx", + "src/apps/web/dashboard/mural-actions/archive-menu-registration.tsx", + "src/apps/web/dashboard/mural-actions/deleteActionRegistration.tsx", + "src/apps/web/dashboard/mural-actions/duplicate-menu-registration.tsx", + "src/apps/web/dashboard/mural-actions/info-registration.tsx", + "src/apps/web/dashboard/mural-actions/insights-registration.tsx", + "src/apps/web/dashboard/mural-actions/leave-menu-registration.tsx", + "src/apps/web/dashboard/mural-actions/move-menu-registration.tsx", + "src/apps/web/dashboard/mural-actions/renameActionRegistration.tsx", + "src/apps/web/dashboard/mural-actions/restore-menu-registration.tsx", + "src/apps/web/dashboard/mural-actions/star-registration.tsx", + "src/apps/web/dashboard/mural-actions/unstar-registration.tsx", + "src/apps/web/dashboard/room/actions/roomMembersMenuRegistration.ts" + ], + "total_files": 40, + "body_preview": "## Update UI Toolkit: Improved Menu + Modal Focus Management & ARIA Support\r\n\r\nThis PR updates `@muraldevkit/ui-toolkit` from v4.52.3 to v4.52.4, bringing enhanced accessibility features and improved focus management.\r\n\r\nThe changes fix an underlying issue where a keyboard user loses focus if they open a modal from a menu and then close the menu. With these changes focus will be returned back to the menu trigger when the modal is dismissed instead of becoming lost. \r\n\r\n### Key Changes\r\n\r\n**Acces" + }, + { + "number": 45784, + "title": "[FEP-6404] - update copy button implementations with MrlProcessingButton", + "branch": "feat/mrl-processing-button", + "merged_at": "2025-10-29", + "changed_files": 18, + "additions": 352, + "deletions": 445, + "packages_touched": [ + "identity-and-access-management", + "settings" + ], + "files_sample": [ + "features/account-settings/client-app-registration/basic-information.feature", + "packages/identity-and-access-management/src/company/security/provisioning/copy-button.tsx", + "packages/identity-and-access-management/src/company/security/provisioning/modals/generate-key-modal/generate-apikey-modal.tsx", + "packages/identity-and-access-management/src/company/security/provisioning/scim/base-url.test.tsx", + "packages/identity-and-access-management/src/company/security/provisioning/scim/base-url.tsx", + "packages/settings/company-settings/src/development/api-key/modals/show-api-key/copy-button/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/show-api-key/index.tsx", + "src/common/template-library/components/preview/footer.tsx", + "src/company/security/tests/generate-apikey-modal.test.tsx", + "src/dashboard/learning/modals/share-modal.tsx", + "src/dashboard/learning/modals/style.sass", + "src/lib/components/shared/copy-button/index.tsx", + "src/settings/user/developers/form/app-sharing-form.tsx", + "src/settings/user/developers/form/clientAppCredentials.tsx", + "src/test/react-new/features/canvas/share-modal/copy-link.feature", + "src/views/mural/modals/share/share-mural/copy-link.tsx", + "src/views/mural/modals/share/share-mural/views/share-link.tsx", + "src/views/mural/modals/share/share-mural/views/styles.module.sass" + ], + "total_files": 18, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6404](https://mural.atlassian.net/browse/FEP-6404)\r\n\r\n[https://mrl-processing-button.mural.engineering/](https://mrl-processing-button.mural.engineering/)\r\n\r\nThis PR updates the following copy button implementations to use `MrlProcessingButton`.\r\n\r\n- SCIM API key modal.\r\n- Identity and access page, provisioning - automatic, base url copy button.\r\n- API Keys, copy api key button.\r\n- Template library footer, \"Copy share link\" button.\r\n-" + }, + { + "number": 45838, + "title": "[FEP-6331] Canvas Context Menu : Fixes keyboard & screen reader interactions for menu checkbox and radioelements", + "branch": "update-uik-menu-roles", + "merged_at": "2025-10-28", + "changed_files": 10, + "additions": 28, + "deletions": 5, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/lib/tools-api/adapters/menu/ToolbarMenuAdapterItem/index.tsx", + "src/lib/tools-api/renderers/toolbar/utils.ts", + "src/lib/tools-api/types/index.ts", + "src/mural/addons/core/context-menu/gridlines.tsx", + "src/mural/addons/core/context-menu/snap-to-grid.tsx", + "src/mural/dispatcher/menus/util.tsx", + "src/mural/register/types.ts", + "src/views/mural/ui/context-menu/inner-context-menu.tsx" + ], + "total_files": 10, + "body_preview": "## Pull Request Overview\r\n\r\nThis PR enhances accessibility for menu checkbox and radio elements in the Canvas Context Menu by fixing keyboard and screen reader interactions. The changes ensure proper ARIA roles are applied to menu items with selection states.\r\n\r\n### Key Changes\r\n\r\n#### Murally\r\n- Updates `tools-api` to support `role` value to be used in the `ToolbarMenuItem` \r\n\r\n#### UI Toolkit Update\r\n- Applies proper `role` attribute to menu items that are a checkbox or radio element\r\n- Improv" + }, + { + "number": 45756, + "title": "[FEP-6323][FEP-6324][FEP-6325] UI Toolkit Tooltip + Input Accessibility Updates & Fixes to Search Input Screen Reader support", + "branch": "update-tooltip-toolkit", + "merged_at": "2025-10-25", + "changed_files": 7, + "additions": 51, + "deletions": 34, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/settings/company-settings/src/views/company-workspaces/unlinked-workspaces/columns.test.tsx", + "src/apps/web/dashboard/pages/content-renderer/v2/ContentRender.integration.test.tsx", + "src/apps/web/dashboard/shell/layout/sidebar/create-mural-button/create-mural-button.test.tsx", + "src/apps/web/dashboard/shell/layout/topbar/search-input/index.tsx", + "src/dashboard/grid/murals.test.tsx" + ], + "total_files": 7, + "body_preview": "This PR updates the UI Toolkit to version `4.51.3`, which includes accessibility improvements for `MrlTooltip` and `MrlTextInput` components. The changes enhance screen reader support and modernize the search input implementation by removing the deprecated `attrs` pattern.\r\n\r\nMurally Changes:\r\n\r\n- Upgraded `@muraldevkit/ui-toolkit` from `4.50.0` to `4.51.3`\r\n- Refactored search input to use direct props instead of attrs pattern\r\n- Updated tests to align with new tooltip accessibility behavior\r\n\r" + }, + { + "number": 45774, + "title": "[EN-2240] Add components and room instance for room role explainer modal", + "branch": "feat/en-2240-add-footer-and-modal", + "merged_at": "2025-10-24", + "changed_files": 25, + "additions": 869, + "deletions": 11, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/room-settings/src/views/room-users/columns/index.tsx", + "packages/settings/room-settings/src/views/room-users/columns/styles.module.sass", + "packages/settings/room-settings/src/views/room-users/index.tsx", + "packages/settings/room-settings/src/views/room-users/lists/users/index.tsx", + "packages/settings/room-settings/src/views/room-users/modals/room-role-info/columns.ts", + "packages/settings/room-settings/src/views/room-users/modals/room-role-info/constants.tsx", + "packages/settings/room-settings/src/views/room-users/modals/room-role-info/index.tsx", + "packages/settings/room-settings/src/views/room-users/modals/room-role-info/items.ts", + "packages/settings/room-settings/src/views/room-users/modals/room-role-info/styles.module.sass", + "packages/settings/room-settings/src/views/room-users/reducer.ts", + "packages/settings/settings-commons/src/components/index.ts", + "packages/settings/settings-commons/src/components/role-selector/index.tsx", + "packages/settings/settings-commons/src/components/role-selector/styles.module.sass", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/disclaimer-message/disclaimer-message.tsx", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/disclaimer-message/index.tsx", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/disclaimer-message/styles.module.sass", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/index.ts", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/styles.module.sass", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/user-role-permission-matrix-modal.tsx", + "packages/settings/settings-commons/src/components/user-role-permission-matrix-modal/user-role-permission-matrix/index.tsx" + ], + "total_files": 25, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a custom footer to the role dropdown with a link that opens a modal to explain how roles map to permissions:\r\n- Modal renders content dynamically based on company billing model\r\n- Dropdown control rerenders table content based on user type \r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2240) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https:" + }, + { + "number": 45757, + "title": "[ENGAGE-780] Add/package dashboard cards", + "branch": "add/package-dashboard-cards", + "merged_at": "2025-10-22", + "changed_files": 22, + "additions": 309, + "deletions": 31, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/cards/.eslintrc.js", + "packages/dashboard/cards/README.md", + "packages/dashboard/cards/api-extractor.json", + "packages/dashboard/cards/build/webpack.config.js", + "packages/dashboard/cards/jest.config.js", + "packages/dashboard/cards/package.json", + "packages/dashboard/cards/src/actions.ts", + "packages/dashboard/cards/src/defs.d.ts", + "packages/dashboard/cards/src/index.test.ts", + "packages/dashboard/cards/src/index.ts", + "packages/dashboard/cards/src/mural-card.tsx", + "packages/dashboard/cards/src/utils.ts", + "packages/dashboard/cards/tsconfig.jest.json", + "packages/dashboard/cards/tsconfig.json", + "src/apps/web/dashboard/pages/content-renderer/components/v2/content-items.tsx", + "src/apps/web/dashboard/pages/search/components/results/results.tsx", + "src/dashboard/grid/mural-actions.test.tsx", + "src/dashboard/grid/murals.tsx" + ], + "total_files": 22, + "body_preview": "Move `MuralCard` and some related functions to new package `@muralco/dashboard-cards`.\r\n\r\nThis package can contain other cards (Room, People, etc) in the future.\r\n\r\ntest-env: https://package-dashboard-cards.mural.engineering/" + }, + { + "number": 45657, + "title": "[CAN-7896] Support legacy bundler for mural-render", + "branch": "update/move-to-packages-2", + "merged_at": "2025-10-22", + "changed_files": 10, + "additions": 127, + "deletions": 117, + "packages_touched": [ + "testing-tools" + ], + "files_sample": [ + "packages/testing-tools/src/index.ts", + "src/mural/components/preview/init.test.ts", + "src/mural/routes/embed.tsx", + "src/mural/routes/engine-helpers.ts", + "src/mural/sdk-context/index.test.ts", + "src/test/react-new/index.js", + "src/test/react-new/mocks/network-api/bundle-hash.ts", + "src/test/react-new/mocks/network-api/index.ts", + "src/test/react-new/mocks/network/render-engine.ts", + "src/views/mural/ui/widgets-container/engine-canvas-layer/engine-canvas-types.ts" + ], + "total_files": 10, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR includes changes to the engine loading mechanism to consume the output of the `legacy-bundler` in https://github.com/tactivos/mural-render/pull/1430\r\n\r\nMore specifically, it moves the gif-worker loading to be orchestrated by _murally_ (with a better fallback mechanism).\r\n\r\nThis is a stop-gap solution before we move `murally` to directly consume the npm package `@tactivos/mural-render-engine`.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please " + }, + { + "number": 45738, + "title": "[FEP-6333] Fix outline keyboard navigation + screen reader announcements", + "branch": "outline-keyboard-focus", + "merged_at": "2025-10-21", + "changed_files": 5, + "additions": 24, + "deletions": 7, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/core/outline/item/outline-item.tsx", + "src/mural/addons/core/outline/item/style.sass", + "src/mural/dispatcher/outline/index.ts", + "src/views/mural/ui/outline/index.tsx", + "src/views/mural/ui/outline/style.sass" + ], + "total_files": 5, + "body_preview": "This PR fixes keyboard navigation and screen reader accessibility for the outline panel during presentation mode. The changes ensure proper focus management when navigating between outline items and improve ARIA announcements for assistive technologies.\r\n\r\nKey Changes:\r\n\r\n- Added focus tracking state to manage which outline item is currently focused\r\n- Improved keyboard navigation by programmatically focusing items during presentation navigation\r\n- Enhanced accessibility with proper ARIA attribu" + }, + { + "number": 45663, + "title": "Deprecate mural-image usage", + "branch": "deprecate/mural-image", + "merged_at": "2025-10-17", + "changed_files": 19, + "additions": 46, + "deletions": 75, + "packages_touched": [ + "api", + "canvas-engine-types", + "color-palette", + "dashboard", + "enterprise-security", + "legacy-ui", + "media", + "mural-utils", + "parking-lot", + "playbooks", + "route-create-password", + "route-signup", + "settings" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/api/src/config.ts", + "packages/canvas-engine-types/package.json", + "packages/canvas-engine-types/src/utils/types.ts", + "packages/color-palette/package.json", + "packages/dashboard/archived-murals/package.json", + "packages/enterprise-security/package.json", + "packages/legacy-ui/package.json", + "packages/media/package.json", + "packages/mural-utils/package.json", + "packages/mural-utils/src/get-cached-image-url.ts", + "packages/parking-lot/package.json", + "packages/playbooks/package.json", + "packages/route-create-password/package.json", + "packages/route-signup/package.json", + "packages/settings/mural-settings/package.json", + "src/mural/addons/core/context-menu/download-image.tsx", + "src/test/react-new/mocks/entities/initial-setup.ts" + ], + "total_files": 19, + "body_preview": "Partially close: [mural.atlassian.net/browse/CWI-2258](https://mural.atlassian.net/browse/CWI-2258)\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR deprecates the usage of `mural-image` by replacing the legacy `imageProxy` configuration with a new `cloudImageUrl` configuration and updating all packages to use the latest version of `@tactivos/mural-shared` (2.11.0).\r\n\r\n- Replaces `imageProxy` with `cloudImageUrl` in configuration interfaces and usage\r\n- Updates package depende" + }, + { + "number": 45634, + "title": "[EN-3026] Finish packaging company dashboard integrations view", + "branch": "feat/en-3026-finish-integ-pckging", + "merged_at": "2025-10-16", + "changed_files": 47, + "additions": 104, + "deletions": 86, + "packages_touched": [ + "enterprise-security", + "integrations", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/enterprise-security/src/files/index.tsx", + "packages/enterprise-security/src/guest-domain-restrictions/settings/index.tsx", + "packages/enterprise-security/src/ip-allowlist/index.tsx", + "packages/integrations/package.json", + "packages/integrations/src/views/company-settings/development/integrations/admin-config/instance-modal/index.tsx", + "packages/integrations/src/views/company-settings/development/integrations/admin-config/instance-modal/styles.module.sass", + "packages/integrations/src/views/company-settings/development/integrations/admin-config/link.tsx", + "packages/integrations/src/views/company-settings/development/integrations/app-admin-link.tsx", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/index.tsx", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/rpc/is-allowed-host.test.ts", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/rpc/is-allowed-host.ts", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/rpc/rpc-server.test.ts", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/rpc/rpc-server.ts", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-host/style.sass", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-modal/index.tsx", + "packages/integrations/src/views/company-settings/development/integrations/components/in-mural-integration-modal/style.sass", + "packages/integrations/src/views/company-settings/development/integrations/components/index.ts", + "packages/integrations/src/views/company-settings/development/integrations/index.ts", + "packages/integrations/src/views/company-settings/development/integrations/integrations.tsx" + ], + "total_files": 47, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis PR moves all additional code needed to render the `Integrations` view within the company settings dashboard out of the `src` folder and into the `@muralco/integrations` package. In addition to encapsulating the view in a single package with clear ownership, this gets us closer to packaging the entire company dashboard / unblocks packaging parent level routing code.\r\n\r\nThis required some standard package migration necessities:\r\n- Identif" + }, + { + "number": 45704, + "title": "[bug][profile-widget][placeholder] restore apply() for placeholder creation", + "branch": "refactor/profile-placeholder", + "merged_at": "2025-10-16", + "changed_files": 7, + "additions": 11, + "deletions": 14, + "packages_touched": [], + "files_sample": [ + "src/mural/business/add-widgets/util/process-link-with-widget-id.test.ts", + "src/mural/business/integrations/linkedin/enrich-widget-util.test.ts", + "src/mural/business/integrations/linkedin/enrich-widget-util.ts", + "src/mural/business/integrations/linkedin/linkedin-profile-company.test.ts", + "src/mural/business/integrations/linkedin/linkedin-profile-user.test.ts", + "src/mural/business/profile-widget.test.ts", + "src/mural/business/profile-widget.ts" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we were adding the profile widget to the mural directly using the engine. The benefit of this approach was that it allowed us to ensure that the activity log captures the final version of the widget, not the placeholder version, when it takes a snapshot of the \"create-widget\" event.\r\n\r\nHowever, the drawback for this was that we no longer benefited from the UX consistencies which occur when adding a widget to the can" + }, + { + "number": 45535, + "title": "[ENGAGE-1268][ENGAGE-1269] Add/content renderer package", + "branch": "add/content-renderer-package", + "merged_at": "2025-10-15", + "changed_files": 50, + "additions": 326, + "deletions": 73, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/content-renderer/.eslintrc.js", + "packages/dashboard/content-renderer/README.md", + "packages/dashboard/content-renderer/api-extractor.json", + "packages/dashboard/content-renderer/build/webpack.config.js", + "packages/dashboard/content-renderer/jest.config.js", + "packages/dashboard/content-renderer/package.json", + "packages/dashboard/content-renderer/src/components/scroll-row.module.sass", + "packages/dashboard/content-renderer/src/components/scroll-row.tsx", + "packages/dashboard/content-renderer/src/components/skeletons/skeleton-animate.tsx", + "packages/dashboard/content-renderer/src/components/skeletons/skeleton-folder.tsx", + "packages/dashboard/content-renderer/src/components/skeletons/skeleton-title.tsx", + "packages/dashboard/content-renderer/src/components/skeletons/style.sass", + "packages/dashboard/content-renderer/src/defs.d.ts", + "packages/dashboard/content-renderer/src/icons/row-arrow-icon.tsx", + "packages/dashboard/content-renderer/src/index.test.ts", + "packages/dashboard/content-renderer/src/index.ts", + "packages/dashboard/content-renderer/src/types.ts", + "packages/dashboard/content-renderer/src/utils/dashboard-carousel.ts" + ], + "total_files": 50, + "body_preview": "Packaging `ScrollRow` and dependencies.\r\nCreate new package `@muralco/dashboard-content-renderer`\r\n\r\nComponents Moved:\r\n* ScrollRow\r\n* SkeletonAnimate\r\n* SkeletonFolder\r\n* SkeletonTitle\r\n* RowArrow\r\n* updateCarousel\r\n* types: RowTypes, Context, ContextOld\r\n\r\ntest-env https://content-renderer-package.mural.engineering/\r\n\r\nAdditional changes:\r\n* The css for SeeAllButton was moved to a new sass module specific to that component. Class `scrollItem` was moved from scrollrow module into this new SeeAl" + }, + { + "number": 45630, + "title": "[FEP-6348] a11y panel fixes - update UI Toolkit", + "branch": "update-ui-toolkit-panels", + "merged_at": "2025-10-14", + "changed_files": 4, + "additions": 17, + "deletions": 5, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/universal-card/package.json", + "src/test/react-new/features/canvas/widgets/ticket-tasks/ticket-tasks.feature" + ], + "total_files": 4, + "body_preview": "This PR updates the @muraldevkit/ui-toolkit dependency from version 4.49.2 to 4.49.4 to address accessibility panel fixes as indicated by the FEP-6348 ticket reference.\r\n\r\nUpdates UI Toolkit dependency to incorporate accessibility improvements" + }, + { + "number": 45555, + "title": "Add/package dashbaord legacy UI", + "branch": "add/package-dashbaord-legacy-ui", + "merged_at": "2025-10-03", + "changed_files": 14, + "additions": 279, + "deletions": 1, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/legacy-ui/.eslintrc.js", + "packages/dashboard/legacy-ui/README.md", + "packages/dashboard/legacy-ui/api-extractor.json", + "packages/dashboard/legacy-ui/build/webpack.config.js", + "packages/dashboard/legacy-ui/jest.config.js", + "packages/dashboard/legacy-ui/package.json", + "packages/dashboard/legacy-ui/src/components/universal-card/styles.sass", + "packages/dashboard/legacy-ui/src/defs.d.ts", + "packages/dashboard/legacy-ui/src/index.test.ts", + "packages/dashboard/legacy-ui/src/index.ts", + "packages/dashboard/legacy-ui/tsconfig.jest.json", + "packages/dashboard/legacy-ui/tsconfig.json" + ], + "total_files": 14, + "body_preview": "A new package that allows sass to be exported.\r\nSimilar to `@muralco/legacy-ui` but specific to dashboard\r\n\r\nNow contains UniversalCard sass\r\n\r\n\r\nThe original sass is still in src/ so this wont create any changes in the app yet. just prep for a followup pr when packaging UniversalCard\r\n\r\ntest-env\r\nhttps://package-dashbaord-legacy-ui.mural.engineering/" + }, + { + "number": 45532, + "title": "[FEP-6391] packages/media : Fixes issues reported by Jest --detectOpenHandles", + "branch": "media-package-memory-fixes", + "merged_at": "2025-10-02", + "changed_files": 5, + "additions": 60, + "deletions": 9, + "packages_touched": [ + "media" + ], + "files_sample": [ + "packages/media/src/link-processor/imgur-link-processor.test.ts", + "packages/media/src/utils/calculate-files-position.test.ts", + "packages/media/src/utils/get-file-meta-data.test.ts", + "packages/media/src/utils/get-image-attributes.test.ts", + "packages/media/src/utils/get-image-size.test.ts" + ], + "total_files": 5, + "body_preview": "This PR patches potential issues in the `packages/media` package detected by `jest --detectOpenHandles` that can cause test timeouts. The following message is repeated for every package when running our `package:tests` command:\r\n\r\n> A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks. Active timers can also cause this, ensure that .unref() was called on them." + }, + { + "number": 45507, + "title": "[CPT-2350] Refactor- removes feature flag for template videos", + "branch": "refactor/remove-template-video-flag", + "merged_at": "2025-10-02", + "changed_files": 4, + "additions": 42, + "deletions": 30, + "packages_touched": [ + "optimizely" + ], + "files_sample": [ + "packages/optimizely/src/utils/optimizely-constants.ts", + "src/common/template-library/components/preview/index.tsx", + "src/common/template-library/components/preview/template-info.tsx", + "src/mural/addons/templates/components/template-library-addon.test.tsx" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoves FF for template videos.\r\nAlso removes the User prop from the TemplateInfo component, because it was used only to fetch the feature flag.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to " + }, + { + "number": 45514, + "title": "[FEP-6383] - update menu and menu item styles", + "branch": "feat/update-menu-styles", + "merged_at": "2025-10-01", + "changed_files": 5, + "additions": 18, + "deletions": 33, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/lib/tools-api/adapters/menu/ToolbarMenuAdapterItem/index.tsx", + "src/lib/tools-api/adapters/menu/ToolbarMenuAdapterItem/styles.module.sass", + "src/lib/tools-api/adapters/menu/ToolbarMenuAdapterItemGroup/index.tsx" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6383](https://mural.atlassian.net/browse/FEP-6383)\r\n\r\n[https://update-menu-styles.mural.engineering/](https://update-menu-styles.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](ht" + }, + { + "number": 45477, + "title": "Cursor Instructions : Cleaning up high level murally files", + "branch": "murally-instructions-updates", + "merged_at": "2025-09-30", + "changed_files": 7, + "additions": 354, + "deletions": 534, + "packages_touched": [], + "files_sample": [ + ".cursor/rules/cursor-instructions-files.mdc", + ".cursor/rules/murally-development-standards.mdc", + ".cursor/rules/murally-environment.mdc", + ".cursor/rules/murally-overview.mdc", + ".cursor/rules/react-component-patterns.mdc", + ".cursor/rules/styling-standards.mdc", + "AGENTS.md" + ], + "total_files": 7, + "body_preview": "### What\u2019s New\r\n- Added `cursor-instructions-files.mdc` for evaluating Cursor instruction files. This includes Cursor-specific considerations. \r\n- Added `AGENTS.md` file to provide engagement rules for agent behavior and communication \r\n\r\n### Refactors\r\n- **`murally-overview.mdc`**: Now serves only as a navigation hub. Removed duplicate content. \r\n- **`murally-environment.mdc`**: Focused on setup and troubleshooting. Removed code quality sections. \r\n- **`murally-development-standards.mdc`**: " + }, + { + "number": 45486, + "title": "[EN-3408] Room/Mural settings: use RequireAuth to provide user instead of bare hook", + "branch": "refactor/en-3408", + "merged_at": "2025-09-30", + "changed_files": 7, + "additions": 20, + "deletions": 42, + "packages_touched": [ + "queries" + ], + "files_sample": [ + "packages/queries/src/hooks/index.ts", + "packages/queries/src/hooks/useCurrentUserQuery.ts", + "packages/queries/src/keys.ts", + "src/mural/routes/index.tsx", + "src/mural/routes/mural-settings/index.tsx", + "src/settings/room/index.tsx", + "src/settings/routes/room.tsx" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nChanges to use the existing RequireAuth/useAuthenticatedUser pairing to get the current user so we can remove `useCurrentUserQuery`. No change in behavior\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3408) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment" + }, + { + "number": 45483, + "title": "[FEP-6381] - update ui-toolkit with focus trap fix", + "branch": "fix-focus-trap", + "merged_at": "2025-09-26", + "changed_files": 5, + "additions": 6, + "deletions": 10, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/company/pages/async-reports/components/create-report-modal.tsx", + "src/company/pages/async-reports/components/filter.tsx", + "src/company/pages/async-reports/types.ts" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6381](https://mural.atlassian.net/browse/FEP-6381)\r\n\r\n[https://fix-focus-trap.mural.engineering/](https://fix-focus-trap.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to per" + }, + { + "number": 45481, + "title": "[EN-3479] conditionally render MURAL users view reactivation controls", + "branch": "feat/en-3479-conditional-react-cont", + "merged_at": "2025-09-26", + "changed_files": 6, + "additions": 398, + "deletions": 10, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/mural-settings/src/views/mural-users/columns/actions/helpers.test.tsx", + "packages/settings/mural-settings/src/views/mural-users/columns/actions/helpers.ts", + "packages/settings/mural-settings/src/views/mural-users/columns/index.test.tsx", + "packages/settings/mural-settings/src/views/mural-users/columns/index.tsx", + "packages/settings/mural-settings/src/views/mural-users/index.tsx", + "packages/settings/mural-settings/src/views/mural-users/lists/users/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nCompanion to #45478\r\n\r\nUpdates the logic for bulk and inline action generation in the mural users view to only show the guest reactivation controls when the associated company (if it exists) has enabled it \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3479) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3479-conditional-react-co" + }, + { + "number": 45453, + "title": "[IPA-262] Fix accessibility: Focus first input in create report modal ", + "branch": "ipa-262", + "merged_at": "2025-09-24", + "changed_files": 4, + "additions": 9, + "deletions": 5, + "packages_touched": [], + "files_sample": [ + "src/company/pages/async-reports/components/create-report-modal.tsx", + "src/company/pages/async-reports/components/filter.tsx", + "src/company/pages/async-reports/constants.ts", + "src/company/pages/async-reports/types.ts" + ], + "total_files": 4, + "body_preview": "## Summary\r\n\r\nFixes accessibility issue in the create report modal where focus was not properly set on the first input field when the modal opens, particularly when the first field is a date picker.\r\n\r\nPlus fixes some wording based on this convo => https://mural.slack.com/archives/C07LTN0R76K/p1758301684667749\r\n\r\nFixes: IPA-262" + }, + { + "number": 45454, + "title": "[EN-3476] Correct error notifications, minor style and grammar updates", + "branch": "feat/en-3476-error-notifications", + "merged_at": "2025-09-24", + "changed_files": 6, + "additions": 69, + "deletions": 51, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/mural-settings/src/views/mural-users/index.tsx", + "packages/settings/mural-settings/src/views/mural-users/modals/remove-mural-users/index.tsx", + "packages/settings/mural-settings/src/views/mural-users/modals/revoke-mural-invitation/index.tsx", + "packages/settings/settings-commons/src/components/change-permissions-modal/change-permissions-modal.tsx", + "packages/settings/settings-commons/src/components/change-permissions-modal/styles.module.sass", + "packages/settings/settings-commons/src/components/user-summary/styles.module.sass" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n- Adds an inline error banner to the change permissions modal for consistency with other error modal handling\r\n- Updates some vertical spacing/margins for content presentation in the change permissions modal\r\n- Removes duplicate background/main page error notification for remove user flow\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3476) to understand the context of this effort.\r" + }, + { + "number": 45382, + "title": "[EN-3389] Company members/workspaces: use shared BulkActionBar", + "branch": "refactor/en-3389", + "merged_at": "2025-09-24", + "changed_files": 33, + "additions": 273, + "deletions": 582, + "packages_touched": [ + "identity-and-access-management", + "settings" + ], + "files_sample": [ + "packages/identity-and-access-management/src/company/groups/group-detail/roles/bulk-actions/index.test.ts", + "packages/identity-and-access-management/src/company/groups/group-detail/roles/bulk-actions/index.ts", + "packages/identity-and-access-management/src/company/groups/group-detail/roles/index.tsx", + "packages/settings/company-settings/src/components/table/bulk-action-bar/index.tsx", + "packages/settings/company-settings/src/components/table/bulk-action-bar/styles.module.sass", + "packages/settings/company-settings/src/components/table/index.tsx", + "packages/settings/company-settings/src/development/api-key/index.test.tsx", + "packages/settings/company-settings/src/views/company-members/confirm-modals.tsx", + "packages/settings/company-settings/src/views/company-members/index.test.tsx", + "packages/settings/company-settings/src/views/company-members/index.tsx", + "packages/settings/company-settings/src/views/company-members/reducer.tsx", + "packages/settings/company-settings/src/views/company-members/types.ts", + "packages/settings/company-settings/src/views/company-workspaces/action-helpers.test.ts", + "packages/settings/company-settings/src/views/company-workspaces/action-helpers.ts", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/columns.tsx", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/components/bulk-action-bar/bulk-action-bar.module.sass", + "packages/settings/company-settings/src/views/company-workspaces/components/bulk-action-bar/bulk-action-bar.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/components/bulk-action-bar/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/components/index.ts" + ], + "total_files": 33, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nReplaces all uses of the company-settings BulkActionBar with the refactored and shared settings-commons BulkActionBar.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3389) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3389.mural.engineerin" + }, + { + "number": 45424, + "title": "[IPA-249] Remove legacy insights and clean up", + "branch": "beta-fix/remove-legacy-insights", + "merged_at": "2025-09-22", + "changed_files": 13, + "additions": 8, + "deletions": 279, + "packages_touched": [ + "api", + "settings", + "test-mocks" + ], + "files_sample": [ + "packages/api/src/companies.ts", + "packages/api/src/workspaces.ts", + "packages/settings/company-settings/features/v2/views/collaboration-insights/index.feature", + "packages/settings/company-settings/features/v2/views/insights/legacy-insights.feature", + "packages/settings/company-settings/src/views/internal-tools/feature-toggles/index.test.tsx", + "packages/settings/company-settings/src/views/internal-tools/feature-toggles/index.tsx", + "packages/test-mocks/src/test/unit/mocks/company-mocks.ts", + "src/company/internal-tools/notifications/dictionary.ts", + "src/company/pages/collaboration-insights/index.tsx", + "src/company/pages/insights/index.tsx", + "src/company/pages/insights/style.sass", + "src/company/view.tsx", + "src/dashboard/common/collaboration-insights/header/index.tsx" + ], + "total_files": 13, + "body_preview": "API side PR => https://github.com/tactivos/mural-api/pull/14483\r\n\r\nThis pull request removes the legacy \"Company Insights\" dashboard and all related feature flag code, UI, API, and tests. The main goal is to fully deprecate support for the old insights dashboard and clean up any toggles or references to it in the codebase.\r\n\r\nKey changes include:\r\n\r\n**Removal of Legacy Company Insights Feature and Feature Flag**\r\n\r\n- Removed the `enableOldCompanyInsights` feature flag from all TypeScript interfa" + }, + { + "number": 45372, + "title": "Update Cursor & Copilot Instructions to align with FEP", + "branch": "fe-instruction-updates", + "merged_at": "2025-09-16", + "changed_files": 8, + "additions": 1379, + "deletions": 631, + "packages_touched": [], + "files_sample": [ + ".cursor/rules/accessibility-standards.mdc", + ".cursor/rules/jest-testing.instructions.mdc", + ".cursor/rules/murally-development-standards.mdc", + ".cursor/rules/styling-standards.mdc", + ".cursor/rules/ui-toolkit-usage-guidelines.mdc", + ".github/instructions/accessibility-standards.md", + ".github/instructions/murally-development-standards.md", + ".github/instructions/ui-toolkit-usage.instructions.md" + ], + "total_files": 8, + "body_preview": "Update the existing accessibility & murally development Cursor and Copilot instructions to better align with frontend platform guidelines. " + }, + { + "number": 45363, + "title": "[FEP-6312] - update metrics plugin", + "branch": "metrics-plugin-part-2", + "merged_at": "2025-09-15", + "changed_files": 5, + "additions": 174, + "deletions": 20, + "packages_touched": [], + "files_sample": [ + "build/plugins/metrics/index.js", + "build/plugins/metrics/turbo-runs.js", + "build/plugins/turbo/builder.js", + "package-lock.json", + "package.json" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6312](https://mural.atlassian.net/browse/FEP-6312)\r\n\r\nThis PR updates the Webpack Metrics Plugin and integrates the `@tactivos/mdk-client` package to send metrics to Segment.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://y" + }, + { + "number": 45360, + "title": "[EN-3453] Company settings: unify settings notifications under shared hook & component", + "branch": "refactor/en-3453", + "merged_at": "2025-09-15", + "changed_files": 28, + "additions": 182, + "deletions": 308, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/company-settings/src/components/index.ts", + "packages/settings/company-settings/src/components/notification/index.tsx", + "packages/settings/company-settings/src/components/notification/styles.module.sass", + "packages/settings/company-settings/src/development/api-key/index.test.tsx", + "packages/settings/company-settings/src/development/api-key/index.tsx", + "packages/settings/company-settings/src/index.ts", + "packages/settings/company-settings/src/stores/index.ts", + "packages/settings/company-settings/src/stores/notifications/index.tsx", + "packages/settings/company-settings/src/views/company-billing/common/summary/index.tsx", + "packages/settings/company-settings/src/views/company-billing/tmp-model/index.tsx", + "packages/settings/company-settings/src/views/company-billing/tmp-model/sections/member-count-by-month/index.tsx", + "packages/settings/company-settings/src/views/company-billing/tmp-model/sections/member-count-by-month/member-count-by-month-csv.test.tsx", + "packages/settings/company-settings/src/views/company-billing/tmp-model/sections/member-count-by-month/member-count-by-month.test.tsx", + "packages/settings/company-settings/src/views/company-members/index.test.tsx", + "packages/settings/company-settings/src/views/company-members/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/index.test.tsx", + "packages/settings/company-settings/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/settings/company-settings/src/views/company-workspaces/unlinked-workspaces/index.tsx", + "packages/settings/settings-commons/src/components/notifications/index.tsx", + "packages/settings/settings-commons/src/stores/notifications/index.tsx" + ], + "total_files": 28, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nPreviously, company settings and all other settings used separate but nearly identical notifications components/stores. This PR changes this to consolidate the two to promote better code reuse and eliminate redundant code.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3453) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [*" + }, + { + "number": 45298, + "title": "[EN-3442] Company Billing: move QEM billing to company-settings package", + "branch": "refactor/en-3442", + "merged_at": "2025-09-10", + "changed_files": 63, + "additions": 155, + "deletions": 1148, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/company-settings/src/views/company-billing/common/chart/components/index.ts", + "packages/settings/company-settings/src/views/company-billing/common/chart/components/line-dot.tsx", + "packages/settings/company-settings/src/views/company-billing/common/chart/components/lines.tsx", + "packages/settings/company-settings/src/views/company-billing/common/chart/components/tooltip.tsx", + "packages/settings/company-settings/src/views/company-billing/common/chart/components/x-axis.tsx", + "packages/settings/company-settings/src/views/company-billing/common/chart/helpers.ts", + "packages/settings/company-settings/src/views/company-billing/common/chart/line-chart.tsx", + "packages/settings/company-settings/src/views/company-billing/common/controls/chart-series/selector.tsx", + "packages/settings/company-settings/src/views/company-billing/common/footer/index.tsx", + "packages/settings/company-settings/src/views/company-billing/common/footer/styles.module.sass", + "packages/settings/company-settings/src/views/company-billing/common/helpers.ts", + "packages/settings/company-settings/src/views/company-billing/index.ts", + "packages/settings/company-settings/src/views/company-billing/member-model/insights/index.tsx", + "packages/settings/company-settings/src/views/company-billing/member-model/insights/view.tsx", + "packages/settings/company-settings/src/views/company-billing/qem-model/helpers/index.ts", + "packages/settings/company-settings/src/views/company-billing/qem-model/index.tsx", + "packages/settings/company-settings/src/views/company-billing/qem-model/insights/chart/index.tsx", + "packages/settings/company-settings/src/views/company-billing/qem-model/insights/chart/tooltip.tsx", + "packages/settings/company-settings/src/views/company-billing/qem-model/insights/index.tsx", + "packages/settings/company-settings/src/views/company-billing/qem-model/insights/styles.module.sass" + ], + "total_files": 63, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nMoves QEM billing to the company-settings package and refactors to remove dependency on a collaboration-insights table (UI Toolkit can do everything we need _and_ look better doing it \ud83d\ude0e)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3442) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please" + }, + { + "number": 45306, + "title": "[EN-3361] Add downgrade to free button to CX workspaces", + "branch": "feat/en-3361-downgrade", + "merged_at": "2025-09-10", + "changed_files": 6, + "additions": 255, + "deletions": 3, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/src/workspaces.ts", + "src/settings/user/cx-workspaces/info/billing/downgrade-workspace/confirm-downgrade-modal-content.tsx", + "src/settings/user/cx-workspaces/info/billing/downgrade-workspace/index.tsx", + "src/settings/user/cx-workspaces/info/billing/downgrade-workspace/success-modal-content.tsx", + "src/settings/user/cx-workspaces/info/billing/downgrade-workspace/types.ts", + "src/settings/user/cx-workspaces/info/billing/view.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd a button to let Customer Support downgrade workspaces to the free plan.\r\n\r\n#### Screenshots\r\n\r\n\"Screenshot\r\n\r\n_button added to the CX Workspaces view_\r\n\r\n\"Screenshot\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3441.mural.en" + }, + { + "number": 45269, + "title": "[FEP-6311] - update Testing Library ESLint plugin and rules", + "branch": "testing-library-eslint-rules", + "merged_at": "2025-09-05", + "changed_files": 7, + "additions": 345, + "deletions": 155, + "packages_touched": [ + "eslint-plugin-muralcoprivate" + ], + "files_sample": [ + "linter/overrides/tests-new-rig.js", + "linter/overrides/tests.js", + "package-lock.json", + "package.json", + "packages/eslint-plugin-muralcoprivate/package.json", + "src/mural/business/system-of-record/components/import-from-url-modal/index.test.tsx", + "src/mural/business/system-of-record/workato/embed-connection-modal/index.test.tsx" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6311](https://mural.atlassian.net/browse/FEP-6311)\r\n\r\nThis PR updates the `eslint-plugin-testing-library` to the latest version to align with the current version of Testing Library. All new rules are enabled as warnings and not errors.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all te" + }, + { + "number": 45232, + "title": "Updates Stylelint v14 to v16", + "branch": "update-stylelint", + "merged_at": "2025-09-03", + "changed_files": 6, + "additions": 512, + "deletions": 1512, + "packages_touched": [ + "settings" + ], + "files_sample": [ + ".stylelint/lint.js", + ".stylelintrc", + "lefthook.yml", + "package-lock.json", + "package.json", + "packages/settings/room-settings/src/views/room-users/index.test.tsx" + ], + "total_files": 6, + "body_preview": "Upgrading Stylelint to get rid of that pesky IDE warning (amongst other things). \r\n\r\nv16 introduces ESM and deprecates CJS. For the time being we will support CJS with the deprecation warnings suppressed. If we need to go to the next major version when CJS support is removed, we can evaluate if migrating to ESM is more realistic then. " + }, + { + "number": 45184, + "title": "TS Upgrade ++", + "branch": "ts-upgrade", + "merged_at": "2025-09-03", + "changed_files": 115, + "additions": 211, + "deletions": 267, + "packages_touched": [ + "accessibility", + "api", + "authentication-lib", + "browser-storage", + "canvas-asset-management", + "canvas-engine-types", + "claim", + "color-palette", + "config", + "create-package", + "dashboard", + "deprecation", + "embedly", + "enterprise-security", + "feature-celebrate", + "geometry", + "identity-and-access-management", + "integrations", + "learning", + "legacy-ui", + "logger", + "media", + "mural-state-container", + "mural-utils", + "native", + "navigate", + "optimizely", + "parking-lot", + "participant", + "pdf-import", + "permissions", + "platform", + "playbooks", + "queries", + "realtime", + "realtime-client", + "refactoring-tools", + "route-create-password", + "route-signin", + "route-signup", + "route-verify-code", + "salesforce-chat", + "scim", + "sdk-types", + "settings", + "state-api", + "telemetry", + "templates", + "test-mocks", + "testing-tools", + "theme-manager", + "tools-api", + "tracking-lib", + "types", + "user" + ], + "files_sample": [ + ".swcrc", + "CODEOWNERS", + "linter/layers/index.js", + "package-lock.json", + "package.json", + "packages/accessibility/tsconfig.jest.json", + "packages/api/jest.config.js", + "packages/api/package.json", + "packages/api/src/auth.test.ts", + "packages/api/tsconfig.jest.json", + "packages/api/tsconfig.json", + "packages/authentication-lib/tsconfig.jest.json", + "packages/browser-storage/tsconfig.jest.json", + "packages/canvas-asset-management/tsconfig.jest.json", + "packages/canvas-engine-types/tsconfig.jest.json", + "packages/claim/tsconfig.jest.json", + "packages/color-palette/jest.config.js", + "packages/color-palette/tsconfig.jest.json", + "packages/config/package.json", + "packages/config/typescript/tsconfig.jest.json" + ], + "total_files": 115, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis seems initially just another TS Upgrade, but it's a little more. \r\n\r\n* Upgrades to TS 5.6 and fixes offender new validations. Why 5.6 and not 5.9 (last one to date)? This version allowed me to PoC the `--noCheck` option to try to improve compiling perf without shifting to SWC (meaning, keeping the same mechanism we use to push code to prod). The results weren't as good as SWC, but initial number showed a 30% reduction. I'll follow up " + }, + { + "number": 45114, + "title": "[EN-3025] Company settings - API Keys: Refactor & package-ify", + "branch": "refactor/en-3025", + "merged_at": "2025-08-28", + "changed_files": 33, + "additions": 1078, + "deletions": 1055, + "packages_touched": [ + "api", + "settings" + ], + "files_sample": [ + "packages/api/src/apikey.ts", + "packages/settings/company-settings/src/development/api-key/index.test.tsx", + "packages/settings/company-settings/src/development/api-key/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/create-api-key/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/index.ts", + "packages/settings/company-settings/src/development/api-key/modals/remove-api-key/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/remove-api-key/styles.module.sass", + "packages/settings/company-settings/src/development/api-key/modals/show-api-key/copy-button/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/show-api-key/index.tsx", + "packages/settings/company-settings/src/development/api-key/modals/show-api-key/styles.module.sass", + "packages/settings/company-settings/src/development/api-key/styles.module.sass", + "packages/settings/company-settings/src/development/api-key/view.tsx", + "packages/settings/company-settings/src/development/index.ts", + "src/company/development/apikey/controller.tsx", + "src/company/development/apikey/index.tsx", + "src/company/development/apikey/style.sass", + "src/company/development/apikey/view.tsx", + "src/company/development/index.tsx", + "src/modals/create-apikeys/controller.tsx", + "src/modals/create-apikeys/index.tsx" + ], + "total_files": 33, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nRefactored API Keys view using UI Toolkit and some style tweaks\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review these tickets \ud83c\udff7\ufe0f to understand the context of this effort.\r\n - https://mural.atlassian.net/browse/EN-3025\r\n - https://mural.atlassian.net/browse/EN-3405\r\n\r\n\r\n[FEP-6301](https://mural.atlassian.net/browse/FEP-6301)\r\n\r\n[https://toggle-buttons-controlled-state.mural.engineering/](https://toggle-buttons-controlled-state.mural.engineering/)\r\n\r\nFix toggle state in:\r\n- mindmaps layout\r\n- text alignment\r\n- inking toolbar\r\n- grid layout toggle\r\n\r\nhttps://github.com/user-attachments/a" + }, + { + "number": 45034, + "title": "[EN-3421] last minute tweaks to new room settings view", + "branch": "feat/en-3421-final-tweaks-room-users", + "merged_at": "2025-08-19", + "changed_files": 6, + "additions": 61, + "deletions": 48, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/room-settings/src/views/room-users/columns/index.tsx", + "packages/settings/room-settings/src/views/room-users/index.tsx", + "packages/settings/room-settings/src/views/room-users/style.module.sass", + "packages/settings/settings-commons/src/components/pagination-controls/styles.module.sass", + "packages/settings/settings-commons/src/components/user-summary/index.test.tsx", + "packages/settings/settings-commons/src/components/user-summary/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFinal chance to make changes to the room settings view before we release. See AC of linked ticket\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3421) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3421-final-tweaks-room-users.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering)" + }, + { + "number": 45011, + "title": "[EN-3401] Mural/Room settings: consolidate UserSummary components", + "branch": "refactor/en-3401", + "merged_at": "2025-08-14", + "changed_files": 21, + "additions": 336, + "deletions": 192, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/room-settings/src/views/room-users/modals/change-permissions/index.tsx", + "packages/settings/room-settings/src/views/room-users/modals/change-permissions/styles.module.sass", + "packages/settings/room-settings/src/views/room-users/modals/change-permissions/summary.tsx", + "packages/settings/room-settings/src/views/room-users/modals/remove-room-users/index.tsx", + "packages/settings/settings-commons/src/components/index.ts", + "packages/settings/settings-commons/src/components/modals/approve-reactivation-request/index.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/index.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/multiple-user-summary.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/single-user-summary.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/style.module.sass", + "packages/settings/settings-commons/src/components/user-summary-bulk/user-summary-bulk.tsx", + "packages/settings/settings-commons/src/components/user-summary/index.test.tsx", + "packages/settings/settings-commons/src/components/user-summary/index.tsx", + "packages/settings/settings-commons/src/components/user-summary/styles.module.sass", + "packages/settings/settings-commons/src/components/user-summary/types.ts", + "packages/settings/settings-commons/src/helpers/permissions/helpers.ts", + "packages/settings/workspace-settings/src/views/pending-requests/modals/approve-membership-request/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/modals/decline-membership-request/index.tsx", + "src/settings/room/members/modals/change-permissions/index.tsx", + "src/settings/room/members/modals/change-permissions/summary.tsx" + ], + "total_files": 21, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nGets rid of `user-summary-bulk` and folds its functionality into the existing `user-summary` component in `@muralco/settings-commons`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3401) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3401.m" + }, + { + "number": 44971, + "title": "[EN-3281] Move new room members view into a package", + "branch": "feat/en-3281-move-room-members-code", + "merged_at": "2025-08-13", + "changed_files": 44, + "additions": 5300, + "deletions": 5339, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/settings/room-settings/.eslintrc.js", + "packages/settings/room-settings/README.md", + "packages/settings/room-settings/api-extractor.json", + "packages/settings/room-settings/build/webpack.config.js", + "packages/settings/room-settings/jest.config.js", + "packages/settings/room-settings/package.json", + "packages/settings/room-settings/src/defs.d.ts", + "packages/settings/room-settings/src/index.ts", + "packages/settings/room-settings/src/views/index.ts", + "packages/settings/room-settings/src/views/room-users/buttons/download-csv-button/index.tsx", + "packages/settings/room-settings/src/views/room-users/buttons/invite-people-button/index.tsx", + "packages/settings/room-settings/src/views/room-users/columns/actions/helpers.test.tsx", + "packages/settings/room-settings/src/views/room-users/columns/actions/helpers.ts", + "packages/settings/room-settings/src/views/room-users/columns/index.test.tsx", + "packages/settings/room-settings/src/views/room-users/columns/index.tsx", + "packages/settings/room-settings/src/views/room-users/columns/styles.module.sass", + "packages/settings/room-settings/src/views/room-users/counts/counts.tsx", + "packages/settings/room-settings/src/views/room-users/counts/styles.module.sass", + "packages/settings/room-settings/src/views/room-users/hooks/index.ts" + ], + "total_files": 44, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves the new room members view code into it's own package under the settings packages (`@muralco/room-settings`). Almost purely a refactoring PR, just had to make some minor unit test code adjustments to get them to run correctly\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3409) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en" + }, + { + "number": 44980, + "title": "Dashboard packages refactor: Rename files ", + "branch": "rename/dashboardpackage-files", + "merged_at": "2025-08-13", + "changed_files": 15, + "additions": 14, + "deletions": 15, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "packages/dashboard/content-hierarchy/src/ContentHierarchy/ContentHierarchy.sass", + "packages/dashboard/content-hierarchy/src/ContentHierarchy/hierarchy-icons/HierarchyIcon.tsx", + "packages/dashboard/content-hierarchy/src/ContentHierarchy/index.tsx", + "packages/dashboard/content-hierarchy/src/LocationSelector/LocationSelector.defaults.test.tsx", + "packages/dashboard/content-hierarchy/src/LocationSelector/LocationSelector.no-rooms.test.tsx", + "packages/dashboard/content-hierarchy/src/LocationSelector/LocationSelector.test.tsx", + "packages/dashboard/content-hierarchy/src/LocationSelector/LocationSelector.tsx", + "packages/dashboard/content-hierarchy/src/LocationSelector/index.ts", + "packages/dashboard/content-hierarchy/src/LocationSelector/style.sass", + "packages/dashboard/content-hierarchy/src/LocationSelector/utils.ts", + "packages/dashboard/content-hierarchy/src/index.ts", + "packages/dashboard/content-hierarchy/src/location-selector/index.ts", + "packages/dashboard/context/src/index.ts", + "packages/dashboard/context/src/stores/ActionsManager.tsx", + "packages/dashboard/context/src/stores/DashboardMuralEventStore.tsx" + ], + "total_files": 15, + "body_preview": "Rename to match casing with main file export\r\n\r\ntest env\r\nhttps://dashboardpackage-files.mural.engineering/\r\n" + }, + { + "number": 44944, + "title": "[FEP-6299] - add support for configuration file in the TurboBuildPlugin", + "branch": "update-turbo-webpack-plugin", + "merged_at": "2025-08-12", + "changed_files": 4, + "additions": 115, + "deletions": 9, + "packages_touched": [ + "README.md" + ], + "files_sample": [ + ".gitignore", + "build/plugins/turbo/builder.js", + "build/plugins/turbo/load-config.js", + "packages/README.md" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6299](https://mural.atlassian.net/browse/FEP-6299)\r\n\r\nThis pull request introduces support for customizing the Turbo build command during development by adding a configuration file, improving build performance for Murally's development server. The main changes include adding a new configuration loader, updating the Turbo build process to use custom arguments when available.\r\nThe Turbo build command now includes scopes and flags from t" + }, + { + "number": 44956, + "title": "Remove old amp prop from Workspace canDiscoverPublicRooms and use Permissions check instead", + "branch": "stable-fix/use-canpermission-workspace-roomsettings", + "merged_at": "2025-08-11", + "changed_files": 4, + "additions": 24, + "deletions": 8, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/src/workspaces.ts", + "src/settings/room/general/view.test.tsx", + "src/settings/room/general/view.tsx", + "src/settings/room/room-settings.tsx" + ], + "total_files": 4, + "body_preview": "Old workspace field only existed on the AmpTeam object, not on Workspaces that come from the api.\r\nThe AmpTeam was replaced recently.\r\n\r\nThis fix uses the proper Permissions.hasMemberPermission()\r\n\r\ntest-env https://use-canpermission-workspace-roomsettings.mural.engineering/\r\n" + }, + { + "number": 44938, + "title": "Implement not-found o11y logging", + "branch": "not-found-logger", + "merged_at": "2025-08-11", + "changed_files": 34, + "additions": 107, + "deletions": 66, + "packages_touched": [ + "platform", + "route-signin", + "route-verify-code" + ], + "files_sample": [ + "package-lock.json", + "packages/platform/history/package.json", + "packages/platform/history/src/router-utilities.ts", + "packages/route-signin/src/signin/controller/SignInController.tsx", + "packages/route-verify-code/src/VerifyCode.test.tsx", + "packages/route-verify-code/src/VerifyCode.tsx", + "src/apps/web/dashboard/room/index.tsx", + "src/company/pages/reports/index.tsx", + "src/company/with-company.tsx", + "src/dashboard/lib/utils.ts", + "src/dashboard/routes/learning/learning-pages.tsx", + "src/dashboard/routes/learning/video-controller.tsx", + "src/dashboard/routes/role/role.test.tsx", + "src/dashboard/routes/role/role.tsx", + "src/dashboard/routes/route-controller.tsx", + "src/dashboard/routes/use-case/use-case.test.tsx", + "src/dashboard/routes/use-case/use-case.tsx", + "src/downloads/components/download-export-controller.tsx", + "src/error/inactive-member/inactive-member.test.tsx", + "src/error/inactive-member/index.tsx" + ], + "total_files": 34, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request refactors the handling of \"not found\" navigation throughout the codebase to use an enhanced `notFound` utility. This new function now accepts an optional reason or error object and an action type, and logs additional context for easier debugging.\r\n\r\n#### Reviewer Resources\r\n* Relates to: https://mural.atlassian.net/browse/IAM-2090\r\n* Reimplement https://github.com/tactivos/murally/pull/44774\r\n* [Slack thread discuss](http" + }, + { + "number": 44899, + "title": "[EN-3403] Update bulk actions flow for new room members view", + "branch": "feat/en-3403-fix-permissions-modal", + "merged_at": "2025-08-07", + "changed_files": 6, + "additions": 474, + "deletions": 53, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "packages/settings/settings-commons/src/helpers/permissions/helpers.ts", + "src/settings/room/members/columns/actions/helpers.test.tsx", + "src/settings/room/members/columns/actions/helpers.ts", + "src/settings/room/members/columns/index.tsx", + "src/settings/room/members/index.test.tsx", + "src/settings/room/members/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Refactors/splits out the room user action generation functions to be consistent with the pending invite functions, require less optional props, etc\r\n- Adds visibility logic for bulk permissions and guest reactivation actions\r\n- Adds filtering logic to only send permission edits for eligible users\r\n- Some minor refactoring of the bulk invites generation function\r\n\r\nTwo somewhat unrelated changes but made since since touching the bulk gues" + }, + { + "number": 44861, + "title": "[EN-3995] Complete new room pending invitations tab functionality ", + "branch": "feat/en-3995-complete-pending-invites", + "merged_at": "2025-08-06", + "changed_files": 13, + "additions": 533, + "deletions": 216, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/settings/settings-commons/src/components/bulk-action-bar/index.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/index.tsx", + "packages/settings/settings-commons/src/components/user-summary-bulk/user-summary-bulk.tsx", + "src/settings/room/members/columns/actions/helpers.ts", + "src/settings/room/members/columns/index.test.tsx", + "src/settings/room/members/columns/index.tsx", + "src/settings/room/members/index.test.tsx", + "src/settings/room/members/index.tsx", + "src/settings/room/members/lists/pending-invitations/index.tsx", + "src/settings/room/members/lists/users/index.tsx", + "src/settings/room/members/modals/change-permissions/index.tsx", + "src/settings/room/members/modals/change-permissions/summary.tsx" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to #44815. Adds the remaining major pieces of fnality to the room pending invitations tabbed view:\r\n- Bulk permissions editing\r\n- Pagination controls (must be > default 50 items for controls to appear)\r\n\r\nAlso solves somewhat unrelated issue for both views: [7e9afea](https://github.com/tactivos/murally/pull/44861/commits/7e9afeafbdc57edcd66e88ef6f34a0ed614d23c5) causes the inline permissions edit button to become disabled when th" + }, + { + "number": 44864, + "title": "[FEP-6290] - Improve HMR in Webpack configuration for base mode (tsc)", + "branch": "hmr-webpack", + "merged_at": "2025-08-06", + "changed_files": 5, + "additions": 35, + "deletions": 5, + "packages_touched": [], + "files_sample": [ + "build/webpack.common.js", + "build/webpack.dev.js", + "build/webpack.dev.server.js", + "package-lock.json", + "package.json" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n[FEP-6290](https://mural.atlassian.net/browse/FEP-6290)\r\n\r\n[https://hmr-webpack.mural.engineering/](https://hmr-webpack.mural.engineering/)\r\n\r\nThis PR adds support for `ReactRefreshWebpackPlugin` when running `mdk` with the `base` mode (ts-loader). Previously this plugin was only available for the `swc` mode.\r\n\r\nWebpack Dev server should support HMR (hot module replacement) every time a script or a stylesheet changes and reload the page " + }, + { + "number": 44815, + "title": "[EN-3375] Add room pending invitations tab (PT I)", + "branch": "feat/en-3375-add-pending-invites-tab", + "merged_at": "2025-07-31", + "changed_files": 21, + "additions": 1328, + "deletions": 131, + "packages_touched": [ + "api", + "settings" + ], + "files_sample": [ + "packages/api/src/rooms.ts", + "packages/settings/settings-commons/src/components/permissions-disclaimer/index.tsx", + "packages/settings/settings-commons/src/components/table-actions/types.ts", + "src/settings/room/members/buttons/invite-people-button/index.tsx", + "src/settings/room/members/columns/actions/helpers.ts", + "src/settings/room/members/columns/index.test.tsx", + "src/settings/room/members/columns/index.tsx", + "src/settings/room/members/hooks/index.ts", + "src/settings/room/members/index.test.tsx", + "src/settings/room/members/index.tsx", + "src/settings/room/members/lists/pending-invitations/index.tsx", + "src/settings/room/members/lists/styles.module.sass", + "src/settings/room/members/lists/users/index.tsx", + "src/settings/room/members/modals/constants.ts", + "src/settings/room/members/modals/remove-room-users/index.tsx", + "src/settings/room/members/modals/revoke-room-invitation/index.tsx", + "src/settings/room/members/modals/revoke-room-invitation/styles.module.sass", + "src/settings/room/members/reducer.ts", + "src/settings/room/members/search-room-members/index.tsx", + "src/settings/room/members/types.ts" + ], + "total_files": 21, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds the pending invitations tab in the new room users view for showing a list of users that have invitations to join the room. Admin users viewing this tab should be able to see similar but more limited details about these users (e.g. only email) and perform similar actions (update permissions on granting of room membership, revoking of invitation, search for users based on email address, download csv data).\r\n\r\nWhat is NOT included in thi" + }, + { + "number": 44789, + "title": "[FEP-5830] - remove MkitPanel component and useMrlPanel flag from Tools API ", + "branch": "refactor/remove-usemrlpanel-flag", + "merged_at": "2025-07-30", + "changed_files": 44, + "additions": 75, + "deletions": 673, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/legacy-ui/src/mkit/components/MkitPanel/BlockingDialog.tsx", + "packages/legacy-ui/src/mkit/components/MkitPanel/PanelBackdrop.tsx", + "packages/legacy-ui/src/mkit/components/MkitPanel/index.tsx", + "packages/legacy-ui/src/mkit/components/MkitPanel/styles.module.sass", + "packages/legacy-ui/src/mkit/components/index.ts", + "src/mural/addons/ai/ai-chat/index.tsx", + "src/mural/addons/core/cheatsheet/index.tsx", + "src/mural/addons/core/comments/comment-thread/comment-thread-header.module.sass", + "src/mural/addons/core/comments/index.tsx", + "src/mural/addons/core/comments/style.sass", + "src/mural/addons/core/find-and-replace/index.tsx", + "src/mural/addons/core/find-filter/index.tsx", + "src/mural/addons/core/find-filter/text/index.tsx", + "src/mural/addons/core/frames/sidebar.tsx", + "src/mural/addons/core/outline/index.tsx", + "src/mural/addons/core/qr-visitor-link/index.tsx", + "src/mural/addons/core/shortcuts/index.tsx", + "src/mural/addons/core/sidebar/panels/diagramming/sidebar-button.tsx" + ], + "total_files": 44, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://remove-usemrlpanel-flag.mural.engineering/](https://remove-usemrlpanel-flag.mural.engineering/)\r\n\r\n[FEP-5830](https://mural.atlassian.net/browse/FEP-5830)\r\n\r\nThis PR removes the usage of the `useMrlPanel` flag in the rightbar and sidebar panels. This flag was introduced to ensure a smooth transition in the migration of Mkit to ui-toolkit, but it wasn't removed because some bugs appeared during the migration. \r\n\r\nThis PR also remov" + }, + { + "number": 44769, + "title": "Add salesforce get object schema endpoint", + "branch": "poc/salesforce-schema", + "merged_at": "2025-07-29", + "changed_files": 10, + "additions": 52, + "deletions": 45, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/src/salesforce/index.test.ts", + "packages/api/src/salesforce/index.ts", + "packages/api/src/salesforce/types.ts", + "packages/api/src/workato/types.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/custom-kinds/utils.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/linked-in/linkedin-salesforce-contact-manager.test.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/resources/contact-object-schema.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/salesforce-contact-manager.test.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/test-data.ts", + "src/mural/business/system-of-record/integrations/salesforce/contact/types.ts" + ], + "total_files": 10, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCreates generic 'getObject' recipe.\r\n\r\nBE PR: https://github.com/tactivos/mural-api/pull/14092\r\n \r\n\r\nInstead of generating a new recipe for each object type, use 1 generic recipe that takes the object to fetch as an arg" + }, + { + "number": 44711, + "title": "test: Feat/dashboard styles 2", + "branch": "feat/dashboard-styles-2", + "merged_at": "2025-07-28", + "changed_files": 60, + "additions": 217, + "deletions": 1690, + "packages_touched": [ + "legacy-styles", + "legacy-ui", + "native" + ], + "files_sample": [ + "packages/legacy-styles/sass/pages/general-layout.sass", + "packages/legacy-styles/sass/styleguide/modules/_typography.sass", + "packages/legacy-styles/sass/styleguide/partials/_global-classes.sass", + "packages/legacy-styles/sass/styleguide/partials/_variables.sass", + "packages/legacy-styles/sass/views/new-sass/components/_alerts-on.sass", + "packages/legacy-styles/sass/views/new-sass/components/_dashboard-container.sass", + "packages/legacy-styles/sass/views/new-sass/components/_main-content.sass", + "packages/legacy-styles/sass/views/new-sass/components/_new-grid.sass", + "packages/legacy-styles/sass/views/new-sass/components/_simple-dropdown.sass", + "packages/legacy-styles/sass/views/new-sass/components/_vnext-top-bar.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_dropdown-control.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_font-face.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_position.sass", + "packages/legacy-styles/sass/views/new-sass/modules/_message-alert.sass", + "packages/legacy-styles/sass/views/new-sass/pages/_oops.sass", + "packages/legacy-styles/sass/views/new-sass/pages/_pre-invite.sass", + "packages/legacy-ui/src/ui/components/orphans/variables.ts", + "packages/legacy-ui/src/ui/components/tooltip/with-portal/do-not-use.tsx", + "packages/legacy-ui/src/ui/components/tooltip/with-portal/style.sass", + "packages/native/electron/src/components/ElectronWrapper.tsx" + ], + "total_files": 60, + "body_preview": "" + }, + { + "number": 44566, + "title": "[FEP-6246] [AXE-CLASSIC]: update app.sass to move view styles in line with their view", + "branch": "feat/dashboard-styles", + "merged_at": "2025-07-28", + "changed_files": 60, + "additions": 217, + "deletions": 1690, + "packages_touched": [ + "legacy-styles", + "legacy-ui", + "native" + ], + "files_sample": [ + "packages/legacy-styles/sass/pages/general-layout.sass", + "packages/legacy-styles/sass/styleguide/modules/_typography.sass", + "packages/legacy-styles/sass/styleguide/partials/_global-classes.sass", + "packages/legacy-styles/sass/styleguide/partials/_variables.sass", + "packages/legacy-styles/sass/views/new-sass/components/_alerts-on.sass", + "packages/legacy-styles/sass/views/new-sass/components/_dashboard-container.sass", + "packages/legacy-styles/sass/views/new-sass/components/_main-content.sass", + "packages/legacy-styles/sass/views/new-sass/components/_new-grid.sass", + "packages/legacy-styles/sass/views/new-sass/components/_simple-dropdown.sass", + "packages/legacy-styles/sass/views/new-sass/components/_vnext-top-bar.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_dropdown-control.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_font-face.sass", + "packages/legacy-styles/sass/views/new-sass/mixins/_position.sass", + "packages/legacy-styles/sass/views/new-sass/modules/_message-alert.sass", + "packages/legacy-styles/sass/views/new-sass/pages/_oops.sass", + "packages/legacy-styles/sass/views/new-sass/pages/_pre-invite.sass", + "packages/legacy-ui/src/ui/components/orphans/variables.ts", + "packages/legacy-ui/src/ui/components/tooltip/with-portal/do-not-use.tsx", + "packages/legacy-ui/src/ui/components/tooltip/with-portal/style.sass", + "packages/native/electron/src/components/ElectronWrapper.tsx" + ], + "total_files": 60, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n1. Moves `app.sass` styles into correct views\r\n2. Removes global styles from app.sass\r\n3. Removes unused imports from app.sass\r\n4. Deletes dead code\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6246) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**]" + }, + { + "number": 44697, + "title": "[EN-3339] add functional inline permissions controls", + "branch": "feat/en-3339-add-permissions-controls", + "merged_at": "2025-07-25", + "changed_files": 19, + "additions": 656, + "deletions": 101, + "packages_touched": [ + "api", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/api/src/rooms.ts", + "packages/settings/settings-commons/package.json", + "packages/settings/settings-commons/src/components/table-actions/actions.test.tsx", + "packages/settings/settings-commons/src/components/table-actions/actions.tsx", + "packages/settings/settings-commons/src/helpers/index.ts", + "packages/settings/settings-commons/src/helpers/permissions/get-permission-text.tsx", + "packages/settings/settings-commons/src/helpers/permissions/index.ts", + "packages/settings/settings-commons/src/helpers/permissions/types.ts", + "packages/settings/settings-commons/src/index.ts", + "src/settings/components/members-list/columns/permission-checkbox/index.tsx", + "src/settings/room/members/columns/index.test.tsx", + "src/settings/room/members/columns/index.tsx", + "src/settings/room/members/hooks/index.ts", + "src/settings/room/members/index.test.tsx", + "src/settings/room/members/index.tsx", + "src/settings/room/members/reducer.ts", + "src/settings/room/members/types.ts", + "src/settings/room/members/users/index.tsx" + ], + "total_files": 19, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR makes the inline edit room member permissions controls functional for the new Room Users view, with a goal of having the same logic around disabling and enforcing permissions as the old view (see Loom demo for more detail).\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3339) to understand the context of this effort.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [*" + }, + { + "number": 44592, + "title": "add | downloads tab and table", + "branch": "feat/ipa-164", + "merged_at": "2025-07-15", + "changed_files": 15, + "additions": 380, + "deletions": 21, + "packages_touched": [ + "api", + "queries", + "settings" + ], + "files_sample": [ + "packages/api/src/async-reports/index.ts", + "packages/api/src/async-reports/types.ts", + "packages/queries/src/hooks/index.ts", + "packages/queries/src/hooks/useFetchCompanyReports.ts", + "packages/queries/src/keys.ts", + "packages/settings/company-settings/src/components/table/bulk-action-bar/index.tsx", + "packages/settings/company-settings/src/components/table/types.ts", + "src/company/pages/async-reports/Async-reports.test.tsx", + "src/company/pages/async-reports/components/create-report-modal.tsx", + "src/company/pages/async-reports/components/tab-navigation-content.tsx", + "src/company/pages/async-reports/components/table-cell.tsx", + "src/company/pages/async-reports/index.tsx", + "src/company/pages/async-reports/state/hooks/useReports.ts", + "src/company/pages/async-reports/state/reducer.ts", + "src/company/pages/async-reports/style.sass" + ], + "total_files": 15, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Introduced `getReports` function to fetch reports asynchronously.\r\n- Updated `APIReport` type to include structured `createdBy` information.\r\n- Enhanced the `useReports` hook to manage report fetching and pagination.\r\n- Added `DownloadsTabContent` for displaying downloadable reports.\r\n- Implemented rendering functions for report status and run type in the table.\r\n- Updated styles for report status indicators.\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6276) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://kill-themecontext.mur" + }, + { + "number": 44491, + "title": "[FEP-6275] [AXE-CLASSIC]: removes ThemeProvider and useTheme", + "branch": "feat/kill-classic-3", + "merged_at": "2025-07-07", + "changed_files": 8, + "additions": 9, + "deletions": 263, + "packages_touched": [ + "company-settings", + "identity-and-access-management", + "theme-manager" + ], + "files_sample": [ + "packages/company-settings/src/views/company-members/index.tsx", + "packages/company-settings/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/index.tsx", + "packages/identity-and-access-management/src/company/groups/index.tsx", + "packages/theme-manager/src/__snapshots__/provider.test.tsx.snap", + "packages/theme-manager/src/index.ts", + "packages/theme-manager/src/provider.test.tsx", + "packages/theme-manager/src/provider.tsx" + ], + "total_files": 8, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6275) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://kill-classic-3.mural." + }, + { + "number": 44513, + "title": "[EN-3337] Final updates for new Pending Requests view", + "branch": "feat/en-3337-polish-feature-parity", + "merged_at": "2025-07-03", + "changed_files": 8, + "additions": 45, + "deletions": 11, + "packages_touched": [ + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/settings/workspace-settings/package.json", + "packages/settings/workspace-settings/src/components/search-requests/index.tsx", + "packages/settings/workspace-settings/src/components/search-requests/styles.module.sass", + "packages/settings/workspace-settings/src/utils/tracking/index.ts", + "packages/settings/workspace-settings/src/views/pending-requests/index.tsx", + "src/settings/workspace/pending-requests/index.tsx", + "src/tracking/workspace.ts" + ], + "total_files": 8, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPolishing items for the impending release of the new Pending Requests view:\r\n- Adds back tracking calls on approval/rejection of membership requests\r\n- Makes some [presentation tweaks ](https://mural.slack.com/archives/G6Z6CS7CP/p1750286766053229?thread_ts=1750282616.395599&cid=G6Z6CS7CP)to the search feature\r\n- Adds some techdebt cleanup comments for feature flag code removal\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA tick" + }, + { + "number": 44382, + "title": "[FEP-6271] [AXE CLASSIC] deletes more classic code", + "branch": "feat/kill-classic-2", + "merged_at": "2025-07-02", + "changed_files": 75, + "additions": 783, + "deletions": 1342, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "packages/legacy-ui/src/mkit/components/MkitModal/index.tsx", + "packages/legacy-ui/src/ui/components/loading-spinner/index.tsx", + "packages/legacy-ui/src/ui/components/modal/confirm.tsx", + "packages/legacy-ui/src/ui/components/modal/message.tsx", + "src/company/development/index.tsx", + "src/company/internal-tools/index.tsx", + "src/company/pages/async-reports/index.tsx", + "src/company/pages/billing/index.tsx", + "src/company/pages/insights/index.tsx", + "src/company/pages/reports/index.tsx", + "src/company/security/index.tsx", + "src/company/settings/index.tsx", + "src/company/view.tsx", + "src/dashboard/grid/mural-modals.tsx", + "src/icons/reactions-icon.tsx", + "src/modals/actions/archive-mural.ts", + "src/modals/actions/delete-mural.ts", + "src/modals/duplicate-mural/mural-full-modal.tsx", + "src/modals/error-modal/controller.tsx", + "src/modals/error-modal/view.tsx" + ], + "total_files": 75, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nDeletes more classic code\r\n\r\n#### Reviewer Resources\r\n- Jira ticket: https://mural.atlassian.net/browse/FEP-6271\r\n- \ud83e\uddea Please use this [**testing environment**](https://kill-classic-2.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were add" + }, + { + "number": 44412, + "title": "add | create report modal with filters", + "branch": "feat/ipa-150", + "merged_at": "2025-06-26", + "changed_files": 18, + "additions": 1329, + "deletions": 40, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/package.json", + "packages/api/src/async-reports/index.ts", + "packages/api/src/async-reports/types.ts", + "src/company/pages/async-reports/Async-reports.test.tsx", + "src/company/pages/async-reports/components/create-report-modal.tsx", + "src/company/pages/async-reports/components/filter.tsx", + "src/company/pages/async-reports/components/modal.tsx", + "src/company/pages/async-reports/components/page-subtitle.tsx", + "src/company/pages/async-reports/components/tab-navigation-content.tsx", + "src/company/pages/async-reports/components/table.tsx", + "src/company/pages/async-reports/constants.ts", + "src/company/pages/async-reports/index.tsx", + "src/company/pages/async-reports/state/hooks/useReports.ts", + "src/company/pages/async-reports/state/reducer.test.ts", + "src/company/pages/async-reports/state/reducer.ts", + "src/company/pages/async-reports/style.sass", + "src/company/pages/async-reports/types.ts", + "src/company/view.tsx" + ], + "total_files": 18, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nAdded create report modal, filters by report, types and backend call.\r\n\"Screenshot\r\n\r\n\r\nAdded test cases for AsyncReports component and reducer.\r\n\"Screenshot\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://two-column-settings.mural.engineering) to perform a smoke test. ([all testing" + }, + { + "number": 44393, + "title": "Feat/ipa 149 add generate tab", + "branch": "feat/ipa-149-add-generate-tab", + "merged_at": "2025-06-23", + "changed_files": 10, + "additions": 322, + "deletions": 0, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/src/async-reports/index.ts", + "packages/api/src/async-reports/types.ts", + "src/company/pages/async-reports/components/tab-navigation-content.tsx", + "src/company/pages/async-reports/components/tab-navigation.tsx", + "src/company/pages/async-reports/components/table-cell.tsx", + "src/company/pages/async-reports/components/table.tsx", + "src/company/pages/async-reports/constants.ts", + "src/company/pages/async-reports/index.tsx", + "src/company/pages/async-reports/state/index.ts", + "src/company/pages/async-reports/state/reducer.ts" + ], + "total_files": 10, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nAdded table, tab-navigation components, some types and `Generate` tab.\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of t" + }, + { + "number": 44392, + "title": "Add Async Reports feature flag", + "branch": "feat/ipa-148-add-feature-flag", + "merged_at": "2025-06-20", + "changed_files": 4, + "additions": 50, + "deletions": 6, + "packages_touched": [ + "optimizely" + ], + "files_sample": [ + "packages/optimizely/src/utils/optimizely-constants.ts", + "src/company/pages/async-reports/index.tsx", + "src/company/pages/async-reports/style.sass", + "src/company/view.tsx" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nAdded new optimizely feature flag and async-reports new page\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort" + }, + { + "number": 44342, + "title": "[FEP-6209]: update global admins page with UI Toolkit", + "branch": "feat/global-admins", + "merged_at": "2025-06-18", + "changed_files": 13, + "additions": 168, + "deletions": 144, + "packages_touched": [], + "files_sample": [ + "src/icons/edit-icon.tsx", + "src/icons/view-only-icon.tsx", + "src/modals/add-global-admins/emails-list/email-input.tsx", + "src/modals/add-global-admins/emails-list/index.tsx", + "src/settings/user/global-admins/controller.tsx", + "src/settings/user/global-admins/index.tsx", + "src/settings/user/global-admins/permission-column.tsx", + "src/settings/user/global-admins/permission-dropdown/index.tsx", + "src/settings/user/global-admins/permission-readonly/index.tsx", + "src/settings/user/global-admins/view.tsx", + "src/settings/user/style.sass", + "src/ui/members-list/index.tsx", + "src/ui/members-list/navigation/index.tsx" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates `/me/global-admins` route to use UI Toolkit where easily applicable\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6209) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://global-admins.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r" + }, + { + "number": 44335, + "title": "[FEP-6239] - React 18: remove react-custom-scrollbars ", + "branch": "refactor/remove-react-custom-scrollbars", + "merged_at": "2025-06-18", + "changed_files": 5, + "additions": 48, + "deletions": 119, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/mural/addons/core/toolbar/grid-submenu/index.tsx", + "src/mural/addons/core/toolbar/grid-submenu/styles.module.sass", + "src/views/mural/ui/connect-menu/view/index.tsx" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6239](https://mural.atlassian.net/browse/FEP-6239)\r\n\r\nTest env: http://remove-react-custom-scrollbars.mural.engineering\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([" + }, + { + "number": 44324, + "title": "[EN-3291] Refactors create company modal, fixes error handling", + "branch": "refactor/en-3291-create-company-modal", + "merged_at": "2025-06-13", + "changed_files": 6, + "additions": 180, + "deletions": 193, + "packages_touched": [], + "files_sample": [ + "src/settings/user/companies/create/index.tsx", + "src/settings/user/companies/domain-list/header.tsx", + "src/settings/user/companies/domain-list/index.tsx", + "src/settings/user/companies/domain-list/item.tsx", + "src/settings/user/companies/domain-selector/index.tsx", + "src/settings/user/companies/view.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors the create company modal without class components and legacy UI elements. Also fixes error handling so that error messages are properly displayed.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3291) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environ" + }, + { + "number": 44322, + "title": "[FEP-6243] - React 18: remove react-masonry-component dependency", + "branch": "refactor/remove-react-masonry-component", + "merged_at": "2025-06-13", + "changed_files": 7, + "additions": 17, + "deletions": 89, + "packages_touched": [], + "files_sample": [ + "package-lock.json", + "package.json", + "src/mural/addons/core/image-search/search-image.tsx", + "src/ui/masonry-layout/index.tsx", + "src/ui/masonry-layout/styles.module.sass", + "src/views/mural/ui/tabs/image-tab/image-tab-item-list.tsx", + "src/views/mural/ui/tabs/widget-proto-view.tsx" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6243](https://mural.atlassian.net/browse/FEP-6243)\r\n\r\n[https://remove-react-masonry-component.mural.engineering/](https://remove-react-masonry-component.mural.engineering/)\r\n\r\nThis PR removes the `react-masonry-component` dependency from the codebase. It's a dependency that presents some issues with React 18 and is not actively maintained anymore. This component was only used in the Adobe Creative Cloud image tab. The other image libr" + }, + { + "number": 44307, + "title": "[EN-3014 EN-3316] backfill pagination for pending request tables", + "branch": "feat/en-3316-backfill-pagination", + "merged_at": "2025-06-12", + "changed_files": 9, + "additions": 309, + "deletions": 48, + "packages_touched": [ + "company-settings", + "settings" + ], + "files_sample": [ + "packages/company-settings/src/components/table/pagination-controls/index.tsx", + "packages/company-settings/src/hooks/index.ts", + "packages/company-settings/src/hooks/use-client-pagination.ts", + "packages/company-settings/src/views/company-members/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/columns/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/membership-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/reactivation-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/reducer.ts" + ], + "total_files": 9, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #44176 and #44254. Both the Membership and Reactivation requests tabbed views are currently populated from a list api endpoint that gives the entire collection of requests back in the response, so we have to implement pagination on the client. This PR integrates standard pagination controls with the existing table data manipulation controls (sorting, searching) to both the updated views behind the feature flag \r\n\r\n#### Reviewe" + }, + { + "number": 44280, + "title": "[FEP-6251]: responsive behavior in account settings search bars", + "branch": "feat/settings-search-responsive", + "merged_at": "2025-06-12", + "changed_files": 8, + "additions": 82, + "deletions": 77, + "packages_touched": [], + "files_sample": [ + "src/settings/user/companies/view.tsx", + "src/settings/user/cx-workspaces/helmet/index.tsx", + "src/settings/user/developers/form/app-sharing-form.tsx", + "src/settings/user/developers/form/clientAppCredentials.tsx", + "src/settings/user/developers/index.tsx", + "src/settings/user/developers/input/multiple-inputs.tsx", + "src/settings/user/style.sass", + "src/settings/user/teams/index.tsx" + ], + "total_files": 8, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixes search bars in account settings pages\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6251) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://settings-search-responsive.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests" + }, + { + "number": 44243, + "title": "[ENGAGE-992] package room members list", + "branch": "update/package-room-members-list", + "merged_at": "2025-06-12", + "changed_files": 19, + "additions": 331, + "deletions": 2, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/dashboard/room-page/.eslintrc.js", + "packages/dashboard/room-page/README.md", + "packages/dashboard/room-page/api-extractor.json", + "packages/dashboard/room-page/build/webpack.config.js", + "packages/dashboard/room-page/jest.config.js", + "packages/dashboard/room-page/jest.setup.js", + "packages/dashboard/room-page/package.json", + "packages/dashboard/room-page/src/defs.d.ts", + "packages/dashboard/room-page/src/index.ts", + "packages/dashboard/room-page/src/members/summary/index.tsx", + "packages/dashboard/room-page/src/members/summary/item.tsx", + "packages/dashboard/room-page/src/members/summary/room-members-summary.test.tsx", + "packages/dashboard/room-page/src/members/summary/styles.module.sass", + "packages/dashboard/room-page/tsconfig.jest.json", + "packages/dashboard/room-page/tsconfig.json", + "src/lib/dashboard/common/components/room-view/room-header/RoomHeader.stories.tsx", + "src/lib/dashboard/common/components/room-view/room-header/index.tsx" + ], + "total_files": 19, + "body_preview": "Adds new package `dashboard-room-page` that can hold any component specific to the room page in the future but for now this PR moves the MembersSummary button/popover to the package.\r\n\r\nWhile the \"main\" code had no non-packaged-dependencies, the tests did.\r\nThe first two commit here are cherrypicked from a [prequel PR](https://github.com/tactivos/murally/pull/44242) that should merge before this one\r\n\r\n\r\nTest-env \r\nhttps://package-room-members-list.mural.engineering/\r\n" + }, + { + "number": 44254, + "title": "[EN-3014 EN-3303] feat: add rebuilt Reactivation Requests view", + "branch": "feat/en-3303-migrate-reactivation-reqs", + "merged_at": "2025-06-11", + "changed_files": 20, + "additions": 1099, + "deletions": 342, + "packages_touched": [ + "api", + "company-settings", + "legacy-ui", + "settings" + ], + "files_sample": [ + "package-lock.json", + "packages/api/src/workspaces.ts", + "packages/company-settings/src/components/index.ts", + "packages/company-settings/src/components/table/index.tsx", + "packages/legacy-ui/src/settings/components/members-list/member-type.tsx", + "packages/settings/workspace-settings/package.json", + "packages/settings/workspace-settings/src/components/search-requests/styles.module.sass", + "packages/settings/workspace-settings/src/views/pending-requests/actions/index.ts", + "packages/settings/workspace-settings/src/views/pending-requests/columns/columns.test.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/columns/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/columns/styles.module.sass", + "packages/settings/workspace-settings/src/views/pending-requests/hooks.ts", + "packages/settings/workspace-settings/src/views/pending-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/membership-requests/columns.test.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/membership-requests/columns.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/membership-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/reactivation-requests/index.tsx", + "packages/settings/workspace-settings/src/views/pending-requests/reducer.ts", + "packages/settings/workspace-settings/src/views/pending-requests/styles.module.sass", + "packages/settings/workspace-settings/src/views/pending-requests/types.ts" + ], + "total_files": 20, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to #44176. This PR rebuilds the second tabbed table view in the Workspace Pending Requests settings page (Reactivation Requests). This page is similar to the `Membership Requests` in terms of column and action types, with some small differences that would be good to check for parity with the old/existing view:\r\n- There is no ability to change permissions or do any additional config on a reactivation, so there are no modals for t" + }, + { + "number": 44259, + "title": "[FEP-6208]: update all companies page of account settings with UI Toolkit", + "branch": "feat/all-companies", + "merged_at": "2025-06-09", + "changed_files": 29, + "additions": 139, + "deletions": 208, + "packages_touched": [], + "files_sample": [ + "src/settings/user/companies/controller.tsx", + "src/settings/user/companies/index.tsx", + "src/settings/user/companies/list/head.tsx", + "src/settings/user/companies/list/index.tsx", + "src/settings/user/companies/list/row.tsx", + "src/settings/user/companies/search.tsx", + "src/settings/user/companies/view.tsx", + "src/settings/user/cx-workspaces/index.tsx", + "src/settings/user/developers/index.tsx", + "src/settings/user/global-admins/index.tsx", + "src/settings/user/integrations/index.tsx", + "src/settings/user/notifications/index.tsx", + "src/settings/user/profile/index.test.tsx", + "src/settings/user/profile/index.tsx", + "src/settings/user/style.sass", + "src/settings/user/teams/index.tsx", + "src/settings/user/view.tsx", + "src/test/react/mocks/client-apps.ts", + "src/test/react/mocks/network-mock.ts", + "src/test/react/pages/integrations/settings/index.tsx" + ], + "total_files": 29, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdating the `/me/companies` route to\r\n\r\n- Use UI Toolkit\r\n- Remove dead code\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6208) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://all-companies.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Autho" + }, + { + "number": 44176, + "title": "[EN-3014 EN-3302] migrate existing Membership Requests view", + "branch": "feat/en-3302-migrate-membership-reqs", + "merged_at": "2025-06-04", + "changed_files": 47, + "additions": 1830, + "deletions": 80, + "packages_touched": [ + "api", + "company-settings", + "queries", + "settings" + ], + "files_sample": [ + "CODEOWNERS", + "package-lock.json", + "package.json", + "packages/api/src/users.ts", + "packages/api/src/workspaces.ts", + "packages/company-settings/src/stores/notifications/index.tsx", + "packages/queries/src/hooks/index.ts", + "packages/queries/src/hooks/useFetchWorkspace.ts", + "packages/queries/src/hooks/useFetchWorkspaceRequests.ts", + "packages/queries/src/keys.ts", + "packages/settings/workspace-settings/.eslintrc.js", + "packages/settings/workspace-settings/README.md", + "packages/settings/workspace-settings/api-extractor.json", + "packages/settings/workspace-settings/build/webpack.config.js", + "packages/settings/workspace-settings/jest.config.js", + "packages/settings/workspace-settings/package.json", + "packages/settings/workspace-settings/src/components/index.ts", + "packages/settings/workspace-settings/src/components/notification/index.tsx", + "packages/settings/workspace-settings/src/components/notification/styles.module.sass", + "packages/settings/workspace-settings/src/components/search-requests/index.tsx" + ], + "total_files": 47, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFirst of (ideally) three PRs to tackle the parent ticket:\r\n- Sets up a [feature flag](https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-user-new-pending-requests-view/rules/development) to guard the WIP / incremental overhaul of the Pending requests view\r\n- Recreates all the existing functionality (see ticket for details) of the Membership requests tab within that view in a new `@muralco/workspace-settings` package using" + }, + { + "number": 44179, + "title": "[FEP-6210]: use UI Toolkit throught CX Workspaces settings pages", + "branch": "feat/cx-workspaces-update", + "merged_at": "2025-06-04", + "changed_files": 31, + "additions": 290, + "deletions": 257, + "packages_touched": [], + "files_sample": [ + "src/icons/workspace.tsx", + "src/settings/user/cx-workspace-entitlements/index.tsx", + "src/settings/user/cx-workspaces/helmet/index.tsx", + "src/settings/user/cx-workspaces/helmet/search/index.tsx", + "src/settings/user/cx-workspaces/helmet/style.sass", + "src/settings/user/cx-workspaces/info/billing/view.tsx", + "src/settings/user/cx-workspaces/info/guests/index.tsx", + "src/settings/user/cx-workspaces/info/guests/view.tsx", + "src/settings/user/cx-workspaces/info/index.tsx", + "src/settings/user/cx-workspaces/info/members/admins/controller.tsx", + "src/settings/user/cx-workspaces/info/members/admins/index.tsx", + "src/settings/user/cx-workspaces/info/members/admins/view.tsx", + "src/settings/user/cx-workspaces/info/members/index.tsx", + "src/settings/user/cx-workspaces/info/members/view.tsx", + "src/settings/user/cx-workspaces/info/migration-status/index.tsx", + "src/settings/user/cx-workspaces/info/name-status/index.tsx", + "src/settings/user/cx-workspaces/info/region/index.tsx", + "src/settings/user/cx-workspaces/info/save/style.sass", + "src/settings/user/cx-workspaces/info/save/view.tsx", + "src/settings/user/cx-workspaces/info/view.tsx" + ], + "total_files": 31, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6210) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://cx-workspaces-update.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.e" + }, + { + "number": 44189, + "title": "Consolidate duplicated createRoom tracking functions", + "branch": "refactor/consolidate-duplicate-tracking", + "merged_at": "2025-06-02", + "changed_files": 7, + "additions": 7, + "deletions": 13, + "packages_touched": [ + "dashboard" + ], + "files_sample": [ + "package-lock.json", + "packages/dashboard/content-hierarchy/package.json", + "packages/dashboard/content-hierarchy/src/location-selector/utils.ts", + "packages/dashboard/tracking/src/tracking/dashboard.ts", + "packages/dashboard/tracking/src/tracking/index.ts", + "src/modals/create-room/index.tsx", + "src/tracking/rooms.ts" + ], + "total_files": 7, + "body_preview": "During a review of a knip upgrade PR i noticed that `recordCreateRoom` was defined in two locations.\r\n\r\nI started this PR by consolidating those to a single location, then realized the use in CreateMural flow where a room is auto-created should not be recording this `record-new-room-button` event in segment so I removed that call." + }, + { + "number": 44085, + "title": "[FEP-6206] [FEP-6223]: use UI Toolkit components and tokens in My Apps page", + "branch": "feat/apps-settings", + "merged_at": "2025-05-30", + "changed_files": 37, + "additions": 1188, + "deletions": 1647, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "features/account-settings/client-app-registration/app-sharing.feature", + "features/account-settings/client-app-registration/list.feature", + "features/account-settings/client-app-registration/misc.feature", + "packages/legacy-ui/src/ui/components/modal/confirm-with-cancel.tsx", + "packages/legacy-ui/src/ui/components/modal/confirm-with-input.tsx", + "src/icons/app-table-delete-icon.tsx", + "src/icons/app-table-edit-icon.tsx", + "src/settings/user/companies/view.tsx", + "src/settings/user/cx-workspaces/helmet/index.tsx", + "src/settings/user/developers/app-sections/access.tsx", + "src/settings/user/developers/app-sections/app-sharing.tsx", + "src/settings/user/developers/app-sections/basic-information.tsx", + "src/settings/user/developers/form/app-sharing-form.tsx", + "src/settings/user/developers/form/clientAppCredentials.tsx", + "src/settings/user/developers/form/distribution-switch.tsx", + "src/settings/user/developers/form/form-field.tsx", + "src/settings/user/developers/form/tooltips.tsx", + "src/settings/user/developers/index.tsx", + "src/settings/user/developers/input/input-tooltip.tsx", + "src/settings/user/developers/input/multiple-inputs.tsx" + ], + "total_files": 37, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUses UI Toolkit components and tokens in `/me/apps` route\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f **JIRA tickets to understand the context of this effort.\r\n - [FEP-6206](https://mural.atlassian.net/browse/FEP-6206)\r\n - [FEP-6223](https://mural.atlassian.net/browse/FEP-6223) \r\n- \ud83e\uddea Please use this [**testing environment**](https://apps-settings.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-env" + }, + { + "number": 44142, + "title": "Improve Knip detection in workspaces configuration", + "branch": "improve-knip", + "merged_at": "2025-05-30", + "changed_files": 134, + "additions": 535, + "deletions": 1250, + "packages_touched": [ + "api", + "authentication-lib", + "browser-storage", + "company-settings", + "dashboard", + "identity-and-access-management", + "integrations", + "legacy-ui", + "media", + "mural-state-container", + "mural-utils", + "parking-lot", + "platform", + "realtime-client", + "route-signup", + "shared", + "templates", + "test-mocks", + "types", + "user" + ], + "files_sample": [ + ".knip.jsonc", + "build/knip-ci.sh", + "linter/layers/index.js", + "package-lock.json", + "package.json", + "packages/api/src/config.ts", + "packages/authentication-lib/src/utils/auth.ts", + "packages/browser-storage/build/webpack.config.js", + "packages/company-settings/src/common/company-response-errors.ts", + "packages/company-settings/src/common/index.ts", + "packages/company-settings/src/common/new-layout-context.tsx", + "packages/company-settings/src/common/types.ts", + "packages/company-settings/src/utils/company-workspace.ts", + "packages/dashboard/content-hierarchy/src/location-selector/utils.ts", + "packages/dashboard/data-workspace/src/config/types.ts", + "packages/dashboard/tracking/src/tracking/context.ts", + "packages/dashboard/tracking/src/tracking/index.ts", + "packages/dashboard/tracking/src/types.ts", + "packages/identity-and-access-management/src/company/common/index.ts", + "packages/identity-and-access-management/src/company/common/layout/header-with-subtitle.tsx" + ], + "total_files": 134, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis is a clean-a-thon follow-up PR that was sparked by some discussions in Slack [refs [1](https://mural.slack.com/archives/C07T0HZTZSL/p1747334874699229), [2](https://mural.slack.com/archives/C07T0HZTZSL/p1748348334047979)] around the precision of knip. During the investigation discovered dead code and unused types that proving that the current configuration wasn't playing nice with workspaces. So:\r\n\r\n1. Upgrade to the latest version of Kn" + }, + { + "number": 44114, + "title": "[EN-3277] feat: use color and format for unlinked workspaces count", + "branch": "feat/en-3277-color", + "merged_at": "2025-05-27", + "changed_files": 5, + "additions": 27, + "deletions": 16, + "packages_touched": [ + "company-settings" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/company-settings/src/views/company-workspaces/styles.module.sass", + "packages/company-settings/src/views/company-workspaces/tab-navigation.test.tsx", + "packages/company-settings/src/views/company-workspaces/tab-navigation.tsx" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n> [!IMPORTANT]\r\n> This requires https://github.com/tactivos/ui-toolkit/pull/684 to be merged and `ui-toolkit` to be bumped in [tactivos/murally](https://github.com/tactivos/murally) before merging! So it's **expected** that the build is failing for now.\r\n\r\nFollow up from https://github.com/tactivos/murally/pull/43919. Format the number of unlinked workspaces (`1234` becomes `1,234`) and use `--mrl-status-error` for the color.\r\n\r\n![Screensh" + }, + { + "number": 44075, + "title": "[EN-3279] feat: add new columns to unlinked workspaces view", + "branch": "feat/en-3279-new-fields", + "merged_at": "2025-05-26", + "changed_files": 6, + "additions": 210, + "deletions": 6, + "packages_touched": [ + "api", + "company-settings" + ], + "files_sample": [ + "packages/api/src/companies.ts", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/columns.test.tsx", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/columns.tsx", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/index.tsx", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/reducer.ts", + "packages/company-settings/src/views/company-workspaces/unlinked-workspaces/styles.module.sass" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd the following columns that are not present in `product_unlinked_workspaces` view in Databricks:\r\n\r\n- `workspace_plan`\r\n- `workspace_subscription_end_date`\r\n- `workspace_members`\r\n- `workspace_last_activity_date`\r\n\r\n![Screenshot 2025-05-21 at 18-41-17 Mural](https://github.com/user-attachments/assets/6507d4af-afa6-4f4f-a987-6117e49114eb)\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**EN-3279**](https://mural.atlassian.net/browse/EN-3279/)\r\n- \ud83e\uddea [" + }, + { + "number": 44106, + "title": "[EN-3258] Validation rule when deleting a large workspace", + "branch": "feat/en-3258-del-workspaces", + "merged_at": "2025-05-26", + "changed_files": 6, + "additions": 98, + "deletions": 0, + "packages_touched": [ + "api", + "company-settings" + ], + "files_sample": [ + "packages/api/src/config.ts", + "packages/company-settings/src/views/company-workspaces/modals/cannot-delete.tsx", + "packages/company-settings/src/views/company-workspaces/modals/confirm-bulk-action.test.tsx", + "packages/company-settings/src/views/company-workspaces/modals/confirm-bulk-action.tsx", + "packages/company-settings/src/views/company-workspaces/modals/delete.tsx", + "packages/company-settings/src/views/company-workspaces/rules/deny-workspace-deletion.ts" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrevent a company admin from deleting a workspace with more than 500 members (this value is configurable and returned by the API).\r\n\r\n![Screenshot 2025-05-26 at 13 37 38](https://github.com/user-attachments/assets/8a4055d0-75ad-431e-aca5-d9756bdf9717)\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**EN-3258**](https://mural.atlassian.net/browse/EN-3258)\r\n- \ud83e\uddea [**en-3258-del-workspaces.mural.engineering**](https://en-3258-del-workspaces.mural.engineeri" + }, + { + "number": 44048, + "title": "[FEP-6220][FEP-6221] Migrate remaining MultiSelect's and remove react-select@1.0.0", + "branch": "fix/migrate-multi-selects", + "merged_at": "2025-05-23", + "changed_files": 19, + "additions": 156, + "deletions": 410, + "packages_touched": [ + "enterprise-security", + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/enterprise-security/src/files/mime-type-select/index.tsx", + "packages/enterprise-security/src/files/style.sass", + "packages/legacy-ui/package.json", + "packages/legacy-ui/src/ui/components/dropdown/select/index.ts", + "packages/legacy-ui/src/ui/components/dropdown/select/multi/index.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/multi/styles.sass", + "packages/legacy-ui/src/ui/components/dropdown/select/types.ts", + "packages/legacy-ui/src/ui/components/dropdown/select/with-option-component.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/with-value-component.tsx", + "packages/legacy-ui/src/ui/components/index.ts", + "packages/legacy-ui/src/ui/components/tag/index.tsx", + "packages/legacy-ui/src/ui/components/tag/types.ts", + "src/ui/dropdown/select/members/option.tsx", + "src/views/mural/integrations/github/labels/index.tsx", + "src/views/mural/integrations/github/labels/label-options.tsx", + "src/views/mural/integrations/github/labels/label-value.tsx", + "src/views/mural/integrations/github/labels/types.ts" + ], + "total_files": 19, + "body_preview": "This pull request focuses on modernizing the codebase by replacing the deprecated `react-select-1.0.0` library with the newer `MrlMultiSelect` component from `@muraldevkit/ui-toolkit`. It also removes legacy code related to `react-select-1.0.0` and simplifies the implementation of multi-select functionality across the application. Below are the most important changes grouped by theme:\r\n\r\nTesting env: https://migrate-multi-selects.mural.engineering\r\n\r\n### Migration to `MrlMultiSelect`\r\n\r\n* Replac" + }, + { + "number": 43817, + "title": "[EN-3041] Remove room, workspace members fetches from mural members view", + "branch": "refactor/en-3041-mural-members-api-calls", + "merged_at": "2025-05-22", + "changed_files": 12, + "additions": 43, + "deletions": 151, + "packages_touched": [], + "files_sample": [ + "src/mural/routes/mural-settings/mural-settings.tsx", + "src/settings/components/members-list/hooks/use-fetch-items.tsx", + "src/settings/components/members-list/index.tsx", + "src/settings/components/members-list/members-list.test.tsx", + "src/settings/components/members-list/view.tsx", + "src/settings/mural/members/controller.tsx", + "src/settings/mural/members/index.tsx", + "src/settings/mural/members/view.tsx", + "src/settings/room/members/index.tsx", + "src/settings/room/members/view.tsx", + "src/settings/workspace/members/controller.tsx", + "src/settings/workspace/members/view.tsx" + ], + "total_files": 12, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoves room members and workspace members fetches from the mural members view. Also utilizes https://github.com/tactivos/mural-api/pull/13562 to get `roomAdmin` properties on mural members.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3041) to understand the" + }, + { + "number": 44031, + "title": "[FEP-6194] Update JIRA Legacy + Remove Legacy UI Single Select", + "branch": "fix/migrate-jira-selects", + "merged_at": "2025-05-21", + "changed_files": 53, + "additions": 350, + "deletions": 620, + "packages_touched": [ + "identity-and-access-management", + "legacy-ui" + ], + "files_sample": [ + "packages/identity-and-access-management/src/mfa/registration/mfa/bypass/bypass.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/index.ts", + "packages/legacy-ui/src/ui/components/dropdown/select/single/common.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/single/create-select.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/single/index.ts", + "packages/legacy-ui/src/ui/components/dropdown/select/single/styles.sass", + "src/company/pages/collaboration-insights/common/date-filter.ts", + "src/company/pages/collaboration-insights/index.tsx", + "src/company/pages/collaboration-insights/insights-list/guests/guests-list.tsx", + "src/company/pages/collaboration-insights/insights-list/overview/overview-list.tsx", + "src/company/pages/collaboration-insights/insights-list/templates/templates-list.tsx", + "src/company/pages/collaboration-insights/insights-overview/guest-tab.tsx", + "src/company/pages/collaboration-insights/insights-overview/index.tsx", + "src/company/pages/collaboration-insights/insights-overview/member-tab.tsx", + "src/company/pages/collaboration-insights/insights-overview/mural-tab.tsx", + "src/company/pages/collaboration-insights/insights-overview/overview-tab.tsx", + "src/company/pages/collaboration-insights/insights-overview/tab.tsx", + "src/company/pages/collaboration-insights/insights-overview/template-tab.tsx", + "src/company/types.ts", + "src/dashboard/common/collaboration-insights/header/index.tsx" + ], + "total_files": 53, + "body_preview": "This pull request updates the JIRA legacy integration's`react-select@1.0.0` instances to use `react-select@5.3.2`. \r\n\r\nIt also refactors the `Common` interface usage across several files and removes deprecated code related to the `single` dropdown component in the `legacy-ui` package. The `Common` interface is replaced with a new `DateSelectorType` interface, and unused or outdated code for the `single` dropdown component is removed to streamline the codebase.\r\n\r\nTest env: https://migrate-jira-s" + }, + { + "number": 44044, + "title": "[FEP-6202]: use UI Toolkit in notification page of account settings ", + "branch": "feat/notification-settings", + "merged_at": "2025-05-21", + "changed_files": 13, + "additions": 103, + "deletions": 226, + "packages_touched": [], + "files_sample": [ + "features/account-settings/notifications/notifications.feature", + "src/icons/envelope-icon.tsx", + "src/icons/ms-teams-icon.tsx", + "src/icons/slack-color-icon.tsx", + "src/icons/slack-mono-icon.tsx", + "src/settings/user/common/link.tsx", + "src/settings/user/notifications/banner.tsx", + "src/settings/user/notifications/header.tsx", + "src/settings/user/notifications/notification-row.tsx", + "src/settings/user/notifications/style.sass", + "src/settings/user/view.tsx", + "src/test/react-new/features/account-settings/notifications/notifications.feature", + "src/ui/navigation/settings/index.tsx" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdate `/me/notifications` route to use UI Toolkit\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6202) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://notification-settings.mural.engineering/) to perform a smoke test. \r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were add" + }, + { + "number": 44071, + "title": "[FEP-6205]: use UI Toolkit in account settings integrations page", + "branch": "feat/integrations-settings", + "merged_at": "2025-05-21", + "changed_files": 12, + "additions": 166, + "deletions": 226, + "packages_touched": [], + "files_sample": [ + "features/integrations/integrations-settings/request-integration.feature", + "src/settings/user/integrations/explore/controllers/jira-legacy.tsx", + "src/settings/user/integrations/index.tsx", + "src/settings/user/integrations/manage/controllers/jira-legacy.tsx", + "src/settings/user/integrations/style.sass", + "src/test/react/pages/integrations/settings/index.tsx", + "src/views/integrations/card/connected/index.tsx", + "src/views/integrations/card/connected/style.sass", + "src/views/integrations/card/explore/index.tsx", + "src/views/integrations/card/explore/style.sass", + "src/views/integrations/card/request/index.tsx", + "src/views/integrations/card/request/style.sass" + ], + "total_files": 12, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates `/me/integrations` with UI Toolkit components and design tokens\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6205) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://integrations-settings.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Aut" + }, + { + "number": 44041, + "title": "[FEP-6204]: update workspaces page in account settings route", + "branch": "feat/workspace-settings", + "merged_at": "2025-05-21", + "changed_files": 18, + "additions": 303, + "deletions": 316, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "packages/legacy-ui/src/ui/components/avatar/style.sass", + "src/common/workspace/list/info.tsx", + "src/common/workspace/list/leave-button.tsx", + "src/common/workspace/list/manage-button.tsx", + "src/common/workspace/list/row.tsx", + "src/common/workspace/list/style.sass", + "src/settings/user/companies/view.tsx", + "src/settings/user/cx-workspaces/helmet/index.tsx", + "src/settings/user/style.sass", + "src/settings/user/teams/index.tsx", + "src/settings/user/teams/style.sass", + "src/ui/admin-members-summary/index.tsx", + "src/ui/admin-members-summary/style.sass", + "src/ui/members-list/navigation/index.tsx", + "src/workspaces/actions/style.sass", + "src/workspaces/card.tsx", + "src/workspaces/list.tsx", + "src/workspaces/style.sass" + ], + "total_files": 18, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates `/me/teams` route to use UI Toolkit components\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6204) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://workspace-settings.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit test" + }, + { + "number": 44043, + "title": "Apply new changes with the npm lib check-branch", + "branch": "stable-fix/new-check-branch-integration", + "merged_at": "2025-05-19", + "changed_files": 8, + "additions": 52, + "deletions": 44, + "packages_touched": [], + "files_sample": [ + ".github/pull_request_template.md", + ".github/workflows/build-test-image.yml", + ".github/workflows/check-base.yml", + ".github/workflows/validate-branch-name.yml", + ".lefthook/pre-push/check-branch.sh", + "package-lock.json", + "package.json", + "scripts/check-branch-name.js" + ], + "total_files": 8, + "body_preview": "### Changes\r\n\r\nAdd npm validation in pre-push and use the new private-action to validate branch name in the CI\r\nThis will allow us to deprecate a golang repository\r\n\r\nPre-push example:\r\n\"image\"\r\n" + }, + { + "number": 44013, + "title": "[FEP-6207]: update navigation settings to use UI Toolkit components", + "branch": "feat/update-profile-navigation", + "merged_at": "2025-05-16", + "changed_files": 13, + "additions": 110, + "deletions": 386, + "packages_touched": [], + "files_sample": [ + "src/mural/components/navigation/popup/view/index.tsx", + "src/settings/user/integrations/style.sass", + "src/settings/user/navigation/index.tsx", + "src/settings/user/profile/index.tsx", + "src/settings/user/profile/style.sass", + "src/settings/user/style.sass", + "src/settings/user/view.tsx", + "src/ui/navigation/settings/image.tsx", + "src/ui/navigation/settings/index.tsx", + "src/ui/navigation/settings/item.tsx", + "src/ui/navigation/settings/style.sass", + "src/views/integrations/card/explore/style.sass", + "styles/sass/views/dashboard/settings/settings.sass" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates `Navigation Settings` content to use UI Toolkit components\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6207) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://update-profile-navigation.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Auth" + }, + { + "number": 43960, + "title": "[FEP-1696]: user UI Toolkit containers in /me route", + "branch": "feat/update-me-countainer", + "merged_at": "2025-05-15", + "changed_files": 30, + "additions": 470, + "deletions": 404, + "packages_touched": [ + "legacy-ui" + ], + "files_sample": [ + "features/account-settings/client-app-registration/misc.feature", + "packages/legacy-ui/src/mkit/components/MkitBackButton/index.tsx", + "packages/legacy-ui/src/mkit/components/MkitBackButton/styles.module.sass", + "src/common/components/sidebar-back.tsx", + "src/modals/apps-catalog/apps-list/index.tsx", + "src/settings/user/common/header.tsx", + "src/settings/user/common/tabs.ts", + "src/settings/user/common/title.tsx", + "src/settings/user/common/types.ts", + "src/settings/user/companies/style.sass", + "src/settings/user/companies/view.tsx", + "src/settings/user/cx-workspace-entitlements/index.tsx", + "src/settings/user/cx-workspaces/helmet/index.tsx", + "src/settings/user/developers/wrapper.tsx", + "src/settings/user/global-admins/view.tsx", + "src/settings/user/integrations/index.tsx", + "src/settings/user/membership-search/index.tsx", + "src/settings/user/membership-search/styles.module.sass", + "src/settings/user/navigation/index.tsx", + "src/settings/user/notifications/index.tsx" + ], + "total_files": 30, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates user settings pages to use UI Toolkit containers and some delete classic code\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6196 to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://update-me-countainer.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://update-me-route.mural.engineering) to perform a smoke test. ([al" + }, + { + "number": 43748, + "title": "Replace/clone element w dashboard props", + "branch": "replace/clone-element-w-dashboard-props", + "merged_at": "2025-05-05", + "changed_files": 39, + "additions": 314, + "deletions": 484, + "packages_touched": [ + "mural-state-container", + "route-signin" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/mural-state-container/package.json", + "packages/mural-state-container/src/context/createContextSafe.test.tsx", + "packages/mural-state-container/src/context/createContextSafe.tsx", + "packages/route-signin/src/signin/controller/SignInController.tsx", + "packages/route-signin/src/signin/view/PasswordInput.test.tsx", + "packages/route-signin/src/signin/view/SignInView.test.tsx", + "src/apps/web/dashboard/pages/content-renderer/v2/content-render.tsx", + "src/apps/web/dashboard/pages/content-renderer/v2/page-render.tsx", + "src/apps/web/dashboard/pages/dashboard-page/index.tsx", + "src/apps/web/dashboard/pages/rooms/overview/index.tsx", + "src/apps/web/dashboard/pages/search/components/results/results.tsx", + "src/apps/web/dashboard/pages/search/index.tsx", + "src/apps/web/dashboard/pages/search/view.test.tsx", + "src/apps/web/dashboard/room/index.tsx", + "src/dashboard/components/dashboard-props-store.tsx", + "src/dashboard/components/view.tsx", + "src/dashboard/components/workspace-dashboard.tsx", + "src/dashboard/routes/company-templates.test.tsx" + ], + "total_files": 39, + "body_preview": "# Get rid of react.cloneElement() in DashboardView\r\nThe main change in this PR is to create a DashboardPropsContext that contains all the of high level DashboardView fields and functions that used to be prop-drilled in to each route component.\r\n![image](https://github.com/user-attachments/assets/22ab1c8b-697c-45c4-a940-a102dc89b49e)\r\n\r\n\r\n### Additional changes\r\nMany of the props were either 1\ufe0f\u20e3 already in another store or 2\ufe0f\u20e3 not used at all. The props were completely removed _or_ updated to now" + }, + { + "number": 43420, + "title": "[CPT-2216] Refactor template dashboard page", + "branch": "refactor/template-dashboard-page", + "merged_at": "2025-04-28", + "changed_files": 44, + "additions": 3355, + "deletions": 108, + "packages_touched": [ + "api", + "optimizely", + "templates" + ], + "files_sample": [ + "CODEOWNERS", + "package-lock.json", + "package.json", + "packages/api/src/templates.ts", + "packages/optimizely/src/utils/optimizely-constants.ts", + "packages/templates/testing/.eslintrc.js", + "packages/templates/testing/README.md", + "packages/templates/testing/api-extractor.json", + "packages/templates/testing/build/webpack.config.js", + "packages/templates/testing/jest.config.js", + "packages/templates/testing/package.json", + "packages/templates/testing/src/index.ts", + "packages/templates/testing/src/mocks/company-template.ts", + "packages/templates/testing/src/mocks/index.ts", + "packages/templates/testing/src/mocks/template.test.ts", + "packages/templates/testing/src/mocks/template.ts", + "packages/templates/testing/tsconfig.jest.json", + "packages/templates/testing/tsconfig.json", + "src/apps/web/dashboard/pages/content-renderer/components/v2/content-items.tsx", + "src/apps/web/dashboard/shell/layout/constants.tsx" + ], + "total_files": 44, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n- Adds `feat-user-template-dashboard-revamp` flag\r\n- Adds logic to move the Templates section to the top section of the sidebar above the workspace selector if the flag is on\r\n- Adds image assets for the new Templates section\r\n- Cleans up the classnames in ScrollRow since we're using it (gesture of good faith to Engagement team)\r\n- Adds functions to query the new `listWorkspaceTemplates` endpoint\r\n- Moves Template Dashboard to its own folder" + }, + { + "number": 43797, + "title": "Create Company : Update modal + domain selector with UI Toolkit", + "branch": "toolkit-create-company", + "merged_at": "2025-04-24", + "changed_files": 6, + "additions": 121, + "deletions": 132, + "packages_touched": [], + "files_sample": [ + "src/settings/user/companies/create/style.sass", + "src/settings/user/companies/create/view.tsx", + "src/ui/dropdown/select/domains/index.tsx", + "src/ui/dropdown/select/domains/option.tsx", + "src/ui/dropdown/select/domains/style.sass", + "src/views/company/domain-selector/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all te" + }, + { + "number": 43783, + "title": "[FEP-6083]: move amp dependencies to packages (part 2)", + "branch": "feat/amp-deps-2", + "merged_at": "2025-04-23", + "changed_files": 118, + "additions": 175, + "deletions": 155, + "packages_touched": [ + "api", + "types" + ], + "files_sample": [ + "packages/api/src/murals/index.ts", + "packages/types/common/deep-read.ts", + "packages/types/common/index.ts", + "src/amp/types/index.ts", + "src/common/template-library/components/preview/template-preview-view.tsx", + "src/common/types.ts", + "src/mural/addons/core/context-menu/util.ts", + "src/mural/addons/core/editors/drawing/index.tsx", + "src/mural/addons/core/editors/inking/controller.tsx", + "src/mural/addons/core/editors/inking/index.tsx", + "src/mural/addons/core/editors/inking/view.tsx", + "src/mural/addons/core/facilitation/voting/voting-toolbar/components/configure-voting-session.tsx", + "src/mural/addons/core/mouse/mouse-manager.tsx", + "src/mural/addons/core/paste-as/post-paste-menu/index.tsx", + "src/mural/addons/core/popover/reactions/reactions-menu.test.tsx", + "src/mural/addons/core/realtime/widget-dragging.ts", + "src/mural/addons/core/snipping-selection/component/view.test.tsx", + "src/mural/addons/dev/dev-visual-layer/layer.tsx", + "src/mural/addons/widget-compositors/enhanced-kanban-board/mouse/utils.test.ts", + "src/mural/business/drag-selected-widgets/index.ts" + ], + "total_files": 118, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves `src/amp` dependencies into packages in order to make the `@muralco/amp` package easier to create.\r\n\r\nThis will be a multi-step process.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6083) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://amp-deps-2.mural.engineering) to perform a smoke test. ([all testing envs](https://testin" + }, + { + "number": 43751, + "title": "[FEP-6083]: move amp dependencies to packages (part 1)", + "branch": "feat/amp-deps-1", + "merged_at": "2025-04-23", + "changed_files": 15, + "additions": 48, + "deletions": 42, + "packages_touched": [ + "api" + ], + "files_sample": [ + "packages/api/src/config.ts", + "packages/api/src/types.ts", + "src/amp/apply-changes-to-mural.ts", + "src/amp/get-token.ts", + "src/amp/helpers.ts", + "src/amp/types/techdebt.app.ts", + "src/amp/update-visitor-member.ts", + "src/mural/addons/internal-integrations/google/util.ts", + "src/mural/sdk-context/index.ts", + "src/mural/sdk/apis/config/index.ts", + "src/mural/sdk/apis/config/selectors.ts", + "src/mural/sdk/apis/config/types.ts", + "src/mural/sdk/apis/index.ts", + "src/mural/sdk/apis/participants/index.ts", + "src/mural/sdk/apis/types.ts" + ], + "total_files": 15, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves `src/amp` dependencies into packages in order to make the `@muralco/amp` package easier to create.\r\n\r\nThis will be a multi-step process.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/FEP-6083) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://amp-deps-1.mural.engineering) to perform a smoke test. ([all testing envs](https://testin" + }, + { + "number": 43655, + "title": "[EN-2991] Remove feature flag branching for new company dashboard layout", + "branch": "feat/en-2991-remove-ff-branching", + "merged_at": "2025-04-22", + "changed_files": 292, + "additions": 1109, + "deletions": 11841, + "packages_touched": [ + "admin", + "company-settings", + "enterprise-security", + "identity-and-access-management" + ], + "files_sample": [ + "features/company/actions/reactivate-members.feature", + "features/company/pages/billing/banner.feature", + "features/company/pages/billing/index.feature", + "features/company/pages/billing/insights/index.feature", + "features/company/pages/collaboration-insights/index.feature", + "features/company/pages/development/api-key/create-api-key.feature", + "features/company/pages/development/api-key/index.feature", + "features/company/pages/development/app-settings/index.feature", + "features/company/pages/development/integrations/client-apps/index.feature", + "features/company/pages/development/integrations/dashboard/index.feature", + "features/company/pages/development/integrations/giphy/disable.feature", + "features/company/pages/development/integrations/giphy/enable.feature", + "features/company/pages/development/integrations/giphy/index.feature", + "features/company/pages/development/integrations/index.feature", + "features/company/pages/development/integrations/msTeams/disable.feature", + "features/company/pages/development/integrations/msTeams/enable.feature", + "features/company/pages/development/integrations/msTeams/index.feature", + "features/company/pages/development/integrations/slack/disable.feature", + "features/company/pages/development/integrations/slack/enable.feature", + "features/company/pages/development/integrations/slack/index.feature" + ], + "total_files": 292, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR:\r\n- Removes all branching code around the `feat-user-ui-toolkit-layout-for-company-settings` feature flag that we released for 100% GA on April 7\r\n- Removes all downstream dead \ud83d\udc80 code associated with the `false` path of that branching (i.e. old company dashboard views that were upgraded) \ud83c\udf89 \r\n- Updates Rig V2 tests and feature code as needed to align them / properly exercise those test cases\r\n- **Deletes** any already migrated Rig V" + }, + { + "number": 43741, + "title": "[POC] Murally MPA", + "branch": "poc/mpa", + "merged_at": "2025-04-22", + "changed_files": 13, + "additions": 126, + "deletions": 251, + "packages_touched": [ + "deprecation" + ], + "files_sample": [ + "package-lock.json", + "packages/deprecation/features/v2/deprecations.feature", + "packages/deprecation/package.json", + "packages/deprecation/src/controller/deprecation-controller.test.tsx", + "packages/deprecation/src/controller/index.tsx", + "packages/deprecation/src/process.ts", + "packages/deprecation/src/routes/index.tsx", + "packages/deprecation/src/types.ts", + "packages/deprecation/src/view/index.tsx", + "packages/deprecation/src/view/styles.module.sass", + "src/route-config.tsx", + "src/ui/pages/information.tsx", + "src/ui/pages/style.sass" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\n\n\n\n#### Reviewer Resources\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\n\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs" + }, + { + "number": 43766, + "title": "Improve deprecation route to simplify MPA PoC", + "branch": "refactor/deprecation-route", + "merged_at": "2025-04-22", + "changed_files": 13, + "additions": 126, + "deletions": 251, + "packages_touched": [ + "deprecation" + ], + "files_sample": [ + "package-lock.json", + "packages/deprecation/features/v2/deprecations.feature", + "packages/deprecation/package.json", + "packages/deprecation/src/controller/deprecation-controller.test.tsx", + "packages/deprecation/src/controller/index.tsx", + "packages/deprecation/src/process.ts", + "packages/deprecation/src/routes/index.tsx", + "packages/deprecation/src/types.ts", + "packages/deprecation/src/view/index.tsx", + "packages/deprecation/src/view/styles.module.sass", + "src/route-config.tsx", + "src/ui/pages/information.tsx", + "src/ui/pages/style.sass" + ], + "total_files": 13, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is a pure refactoring PR to make the deprecation route easier to be part of the MPA PoC. Thinking of a Step 0: preparing your code to be extracted as a page, including.\r\n\r\n* Reduced as much the dependency injection. All the deps, except one function, comes from other packages\r\n* Refactored the UI to use the UI-Toolkit library, removing ad-hoc legacy code.\r\n* Refactored and improved Tests\r\n\r\n\"image\" \r\n Now, with these changes, \r\n-->\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]https://mural.a" + }, + { + "number": 43474, + "title": "[EN-3174] style tweaks for workspace consolidation view", + "branch": "feat/en-3174-wc-polishing-items", + "merged_at": "2025-03-27", + "changed_files": 4, + "additions": 11, + "deletions": 6, + "packages_touched": [ + "admin" + ], + "files_sample": [ + "packages/admin/src/views/company-workspaces/all-workspaces/styles.module.sass", + "packages/admin/src/views/company-workspaces/components/search-filter-create-bar/index.tsx", + "packages/admin/src/views/company-workspaces/components/search-filter-create-bar/styles.module.sass", + "packages/admin/src/views/company-workspaces/unlinked-workspaces/search-input.tsx" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nSome requests from Luke\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3174) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3174-wc-polishing-items.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [" + }, + { + "number": 43475, + "title": "[EN-3190][EN-3191] chore: space between client app description and link", + "branch": "en-3190/ui-chores", + "merged_at": "2025-03-27", + "changed_files": 5, + "additions": 33, + "deletions": 24, + "packages_touched": [ + "admin", + "company-settings" + ], + "files_sample": [ + "packages/admin/src/views/company-workspaces/components/search-filter-create-bar/index.tsx", + "packages/admin/src/views/company-workspaces/unlinked-workspaces/search-input.tsx", + "packages/company-settings/src/views/internal-tools/feature-toggles/index.tsx", + "packages/company-settings/src/views/internal-tools/feature-toggles/styles.module.sass", + "src/company/development/integrations/index.tsx" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- [x] Missing space between _client app_ summary and _learn more_ link\r\n- [x] Do not show clear icon when search input is empty\r\n- [x] Dependent checkbox should be indented\r\n\r\n\"Screenshot\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**EN-3190**](https://mural.atlassian.net/browse/EN-3190) Feature toggles - enable com" + }, + { + "number": 43421, + "title": "[PE-5174] Remove Rollbar", + "branch": "remove-rollbar-artifacts", + "merged_at": "2025-03-25", + "changed_files": 11, + "additions": 3, + "deletions": 144, + "packages_touched": [], + "files_sample": [ + ".github/workflows/build-test-image.yml", + ".github/workflows/production-build.yml", + "docker/single.Dockerfile", + "features/addons/integrations/catalog-loader.feature", + "features/canvas/exports/direct-export.feature", + "features/canvas/upload/file-upload.feature", + "linter/overrides/typescript.js", + "package-lock.json", + "package.json", + "src/test/react/step-definitions/then/index.ts", + "src/test/react/step-definitions/then/rollbar.ts" + ], + "total_files": 11, + "body_preview": "As part of the effort to deprecate Rollbar, this PR removes all references to Rollbar within `murally`. Regarding the tests, since rig v1 is being deprecated soon, I simply removed the Rollbar assertions completely." + }, + { + "number": 43423, + "title": "Beta fix/stt 113", + "branch": "beta-fix/stt-113", + "merged_at": "2025-03-25", + "changed_files": 14, + "additions": 113, + "deletions": 20, + "packages_touched": [ + "tracking-lib" + ], + "files_sample": [ + "features/canvas/topbar-template/hana-toolbars.feature", + "packages/tracking-lib/src/utils/events/mural/presentation-mode/types.ts", + "src/mural/addons/core/canvas-presentation-experiment/index.tsx", + "src/mural/addons/core/canvas-presentation-experiment/keyboard-handlers.ts", + "src/mural/addons/core/canvas-presentation-experiment/update-facilitate-menu.tsx", + "src/mural/addons/core/canvas-presentation-experiment/update-outline-location.tsx", + "src/mural/addons/core/canvas-presentation-experiment/update-present-button.tsx", + "src/mural/addons/core/canvas-presentation-experiment/update-present-ia.tsx", + "src/mural/addons/core/canvas-presentation-experiment/update-topbar-icon.ts", + "src/mural/addons/core/index.ts", + "src/mural/addons/core/outline/index.tsx", + "src/mural/dispatcher/outline/index.ts", + "src/mural/dispatcher/outline/types.ts", + "src/mural/sdk/apis/facilitation/presentation-mode/selectors.ts" + ], + "total_files": 14, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThese changes update location of\r\n- outline\r\n- facilitate menu\r\n- present button in IA\r\nAlso added a new selector for the new presentation experiment. \r\n\r\nWe also updated the outline tools to have unique names and updated the tracking to include the origin of the outline.\r\n\r\nhttps://mural.atlassian.net/browse/STT-133\r\nhttps://www.loom.com/share/12485a5fce4a4617b2e563a11cf8b16c" + }, + { + "number": 43357, + "title": "[EN-3173] Invalidate search queries after succesful mutations", + "branch": "feat/en-3173-invalidate-queries", + "merged_at": "2025-03-21", + "changed_files": 4, + "additions": 112, + "deletions": 71, + "packages_touched": [ + "admin", + "queries" + ], + "files_sample": [ + "packages/admin/src/views/company-workspaces/hooks.ts", + "packages/admin/src/views/company-workspaces/unlinked-workspaces/index.tsx", + "packages/queries/src/hooks/useSearchCompanyWorkspaces.ts", + "packages/queries/src/hooks/useSearchUnlinkedWorkspaces.tsx" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors and updates the mutation hooks used to make changes to company workspaces via the new Company Workspaces view. Main goals:\r\n- Add fuzzy query invalidation logic to post-mutation handlers. This is important to avoid the scenario described in the ticket where a user will see accurate data after a mutation due to the optimistic update but might then see stale/cached data if they change to a search that contains the mutated d" + }, + { + "number": 43350, + "title": "[PE-5247] Reenable Rig v1 tests", + "branch": "reenable-rig-v1-test", + "merged_at": "2025-03-21", + "changed_files": 143, + "additions": 999, + "deletions": 3, + "packages_touched": [], + "files_sample": [ + ".github/workflows/quality.yml", + "build/test-react.sh", + "features/addons/integrated-client/visitor-handler.feature", + "features/addons/integrations/catalog-loader.feature", + "features/billing/dashboard-dropdown-menu-cta.feature", + "features/billing/external-link-billing.feature", + "features/billing/failed-payment-alert.feature", + "features/billing/main-page.feature", + "features/billing/pay-invoice-notification.feature", + "features/billing/sidebar-upgrade-card.feature", + "features/billing/two-screen-purchase-flow/buy-now.feature", + "features/billing/two-screen-purchase-flow/in-settings.feature", + "features/billing/two-screen-purchase-flow/modal.feature", + "features/billing/two-screen-purchase-flow/paid-to-paid.feature", + "features/billing/two-screen-purchase-flow/small-screen-view.feature", + "features/billing/two-screen-purchase-flow/two-screen-validations.feature", + "features/canvas/ai/sentiment-classification/sentiment-classification.feature", + "features/canvas/keyboard/connector.feature", + "features/canvas/keyboard/facilitation/laser.feature", + "features/canvas/keyboard/text-format-bold.feature" + ], + "total_files": 143, + "body_preview": "On Feb 5 all the tests under `features/` stopped running after [this PR was merged](https://github.com/tactivos/murally/pull/42723)\r\n\r\nFor about 45 days this went unnoticed and [around 800 tests started failing](https://docs.google.com/spreadsheets/d/1vz5xHDob0rGc6VDXO5f2pf2ELVg6UjbAKQ7owc855nI/edit?gid=410447997#gid=410447997)\r\n\r\n**This pull requests reenable all the tests, and disable the failing ones to stop the bleeding**\r\n\r\n[Ticket](https://mural.atlassian.net/browse/PE-5247)" + }, + { + "number": 43266, + "title": "Removes legacy performance test tooling.", + "branch": "remove-perf-tests", + "merged_at": "2025-03-19", + "changed_files": 16, + "additions": 0, + "deletions": 450, + "packages_touched": [], + "files_sample": [ + ".github/perf-tests/docker-compose.yml", + ".github/perf-tests/docker/mongo-seeder/Dockerfile", + ".github/perf-tests/docker/mongo-seeder/populate-db.sh", + ".github/perf-tests/docker/ui-tests/geckodriver_template", + ".github/perf-tests/docker/ui-tests/get-deps.sh", + ".github/perf-tests/docker/ui-tests/run-calibration.sh", + ".github/perf-tests/docker/ui-tests/run.sh", + ".github/perf-tests/docker/ui-tests/vglchrome", + ".github/perf-tests/docker/ui-tests/vglfirefox", + ".github/perf-tests/generate_env_file.sh", + ".github/perf-tests/ui-commons/docker/haproxy/Dockerfile", + ".github/perf-tests/ui-commons/docker/haproxy/config/haproxy.cfg", + ".github/perf-tests/ui-commons/docker/web/endpoints.json", + "src/mural/addons/index.ts", + "src/mural/addons/perf-tests-sdk-adapter/index.ts", + "src/mural/addons/perf-tests-sdk-adapter/types.ts" + ], + "total_files": 16, + "body_preview": "This performance test code is part of an old legacy project. Let's remove it. I will also archive https://github.com/tactivos/mural-perf-tests." + }, + { + "number": 43242, + "title": "STT-38: [presentation-mode] update ui for thumbnail view", + "branch": "stt-38", + "merged_at": "2025-03-18", + "changed_files": 4, + "additions": 164, + "deletions": 101, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/core/outline/item/outline-item.tsx", + "src/mural/addons/core/outline/item/outline-options.tsx", + "src/mural/addons/core/outline/item/outline-title/styles.module.sass", + "src/mural/addons/core/outline/item/style.sass" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThese changes update the UI for the thumbnail view by\r\n- removing titles from the outline in thumbnail view\r\n- moving the hide icon into the three dots menu in thumbnail view\r\n- moving the slide number to outside the button in both views\r\n\r\nhttps://stt-38.mural.engineering/\r\n\r\nhttps://mural.atlassian.net/browse/STT-38\r\n\r\nhttps://github.com/user-attachments/assets/1f32399c-79f6-4819-8bdd-df036d35675f\r\n\r\n" + }, + { + "number": 43312, + "title": "Beta-fix: Non facilitators can see the outline when there are no outline items", + "branch": "beta-fix/stt-114-v2", + "merged_at": "2025-03-18", + "changed_files": 6, + "additions": 47, + "deletions": 21, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/core/canvas-presentation-experiment/blank-state.sass", + "src/mural/addons/core/canvas-presentation-experiment/blank-state.tsx", + "src/mural/addons/core/canvas-presentation-experiment/index.tsx", + "src/mural/addons/core/canvas-presentation-experiment/update-present-button.tsx", + "src/mural/addons/core/outline/index.tsx", + "src/mural/addons/core/presentation-mode/index.tsx" + ], + "total_files": 6, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, non-facilitators could not see the outline if there was nothing in the outline. \r\nNow with these changes, non-facilitators can see the outline if there was nothing in the outline which enables them to launch single player presentation mode. \r\n\r\n\"image\"\r\n\r\n\r\nhttps://mural.atlassian.net/browse/STT-114\r\nhttps:" + }, + { + "number": 43288, + "title": "Toolbar IA Clean up", + "branch": "bug/show-on-hover", + "merged_at": "2025-03-17", + "changed_files": 4, + "additions": 22, + "deletions": 27, + "packages_touched": [], + "files_sample": [ + "src/views/mural.v2/toolbars/styles-deprecated.module.sass", + "src/views/mural.v2/toolbars/styles.module.sass", + "src/views/mural.v2/toolbars/web/index.tsx", + "src/views/mural.v2/toolbars/web/web-styles.module.sass" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we had the styles defined in the `layout` style\r\nsheet. The core team is releasing an Information Architecture (IA)\r\nupdate which complicates our change.\r\n\r\nSpecifically, it complicates our concern because they are dynamically\r\nchoosing between one of two style sheets. One assuming the new IA, the\r\nother assuming the old IA.\r\n\r\nSince we are using CSS modules, in our markup we import the new style-\r\nsheet and associa" + }, + { + "number": 43247, + "title": "[STT-106] polish styles of show on hover bottom bar during single-screen presentation", + "branch": "bug/show-on-hover", + "merged_at": "2025-03-14", + "changed_files": 5, + "additions": 48, + "deletions": 33, + "packages_touched": [], + "files_sample": [ + "src/mural/sdk/apis/facilitation/presentation-mode/selectors.ts", + "src/views/mural.v2/toolbars/index.test.tsx", + "src/views/mural.v2/toolbars/layout.tsx", + "src/views/mural.v2/toolbars/web/index.tsx", + "src/views/mural/mural.tsx" + ], + "total_files": 5, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nsmall styling changes for safari\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/STT-106) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/b2356fb80ec145c888d0d44d0aa187a4) of the acceptance criteria for the above ticket -->\r\n- \ud83e\uddea ~Please use this [**testing environment**](https://show-on-hover.mural.engineering) to perform a smoke tes" + }, + { + "number": 43250, + "title": "Presentation Mode: STT 104 update toolbars for present full screen", + "branch": "stt-104", + "merged_at": "2025-03-14", + "changed_files": 4, + "additions": 58, + "deletions": 17, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/core/outline/index.tsx", + "src/mural/addons/core/presentation-mode/end-presentation.tsx", + "src/mural/addons/core/presentation-mode/index.tsx", + "src/mural/addons/core/presentation-mode/settings.tsx" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we had removed the exit presentation tool and the outline from present full screen.\r\nNow with these changes we added them back in. \r\n\r\nWe also had to do some custom logic so that end presentation would exit full screen mode if we were in full screen. \r\n\r\nhttps://mural.atlassian.net/browse/STT-104\r\n\r\nhttps://stt-104.mural.engineering/\r\n\r\nhttps://github.com/user-attachments/assets/698e7d40-1a5c-4b9f-808c-b296d9df24a7\r" + }, + { + "number": 43232, + "title": "[EN-3169] force hana theme on new company settings layout", + "branch": "feat/en-3169-force-hana-theme", + "merged_at": "2025-03-13", + "changed_files": 18, + "additions": 543, + "deletions": 414, + "packages_touched": [ + "company-settings" + ], + "files_sample": [ + "package-lock.json", + "packages/company-settings/src/components/page-title/index.tsx", + "packages/company-settings/src/views/general-settings/index.tsx", + "src/company/commons/header/index.tsx", + "src/company/development/index.tsx", + "src/company/development/integrations/index.tsx", + "src/company/internal-tools/company-admins/view.tsx", + "src/company/internal-tools/index.tsx", + "src/company/internal-tools/template-collections/index.tsx", + "src/company/pages/billing/header/header.tsx", + "src/company/pages/collaboration-insights/index.tsx", + "src/company/pages/collaboration-insights/style.sass", + "src/company/pages/insights/index.tsx", + "src/company/pages/reports/index.tsx", + "src/company/security/index.tsx", + "src/company/settings/index.tsx", + "src/dashboard/common/collaboration-insights/header/index.tsx", + "src/dashboard/common/collaboration-insights/header/style.sass" + ], + "total_files": 18, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\nThis PR is an attempt to clean get consistency across the company settings pages on the new layout in two areas:\r\n- No classic theming / force Hana for everything\r\n- At least get consistent header placement / remove any lingering styles that are affecting those\r\n\r\nAlso made some small improvements to some content rendering weirdness:\r\n- Fixes the \"double scroll\" issue with the General Settings page\r\n- Adds a header to the Jobs page / moves t" + }, + { + "number": 43128, + "title": "[EN-3121] use optimistic update pattern for actions", + "branch": "feat/en-3121-use-optimistic-updates", + "merged_at": "2025-03-13", + "changed_files": 7, + "additions": 289, + "deletions": 86, + "packages_touched": [ + "admin", + "api" + ], + "files_sample": [ + "packages/admin/src/views/company-workspaces/all-workspaces/index.tsx", + "packages/admin/src/views/company-workspaces/all-workspaces/reducer.ts", + "packages/admin/src/views/company-workspaces/components/search-filter-create-bar/index.tsx", + "packages/admin/src/views/company-workspaces/hooks.ts", + "packages/admin/src/views/company-workspaces/modals/confirm-bulk-action.test.tsx", + "packages/admin/src/views/company-workspaces/modals/confirm-bulk-action.tsx", + "packages/api/src/companies.ts" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates the five existing data mutations (suspend, restore, change end date, upgrade and delete) to optimistically update the table data when a mutation is triggered, only rolling it back if an error is encountered. This is necessary as the update company workspaces endpoint is asynchronous / updated data will generally not be immediately available for reading when the response comes back from a successful update. There is a cavea" + }, + { + "number": 43219, + "title": "Beta fix: [presentataion-mode] udpate styling so that presenter view always has the toolbar", + "branch": "beta-fix/stt-93", + "merged_at": "2025-03-13", + "changed_files": 8, + "additions": 48, + "deletions": 2, + "packages_touched": [], + "files_sample": [ + "src/mural/dispatcher/index.ts", + "src/mural/dispatcher/presentation-mode/index.ts", + "src/mural/dispatcher/presentation-mode/types.ts", + "src/mural/dispatcher/types.ts", + "src/mural/sdk/apis/facilitation/presentation-mode/index.ts", + "src/mural/sdk/apis/facilitation/presentation-mode/types.ts", + "src/views/mural.v2/toolbars/index.test.tsx", + "src/views/mural.v2/toolbars/web/index.tsx" + ], + "total_files": 8, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[presentataion-mode] udpate styling so that presenter view always has the toolbar\r\n\r\nhttps://mural.atlassian.net/browse/STT-93\r\n\r\nhttps://stt-93.mural.engineering/\r\n\r\nhttps://github.com/user-attachments/assets/582f3173-841e-413d-a5b2-c1f7eda3c407\r\n\r\n\r\n\r\n\r\n" + }, + { + "number": 43218, + "title": "[beta-fix] presentation mode default setting for participants to follow is now outline rather than user", + "branch": "beta-fix/follow-outline-default", + "merged_at": "2025-03-12", + "changed_files": 4, + "additions": 21, + "deletions": 9, + "packages_touched": [], + "files_sample": [ + "src/amp/mural.ts", + "src/mural/addons/core/canvas-presentation-experiment/index.tsx", + "src/mural/addons/core/canvas-presentation-experiment/utils.ts", + "src/mural/sdk/apis/facilitation/selectors.ts" + ], + "total_files": 4, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we would always follow the presenter.\r\nNow, we actually confirm first that that is the current setting.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://follow-outline-default.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Requi" + }, + { + "number": 43143, + "title": "remove createSelect - part 03", + "branch": "refactor/remove-create-select-03", + "merged_at": "2025-03-12", + "changed_files": 14, + "additions": 159, + "deletions": 365, + "packages_touched": [ + "identity-and-access-management", + "legacy-ui" + ], + "files_sample": [ + "packages/identity-and-access-management/src/mfa/registration/mfa/bypass/enrollment.tsx", + "packages/legacy-ui/src/ui/components/dropdown/select/single/common.tsx", + "src/modals/duplicate-move-mural/types.ts", + "src/modals/duplicate-move-room/types.ts", + "src/modals/duplicate-move-room/view.tsx", + "src/modals/team-role/dropdown-with-custom-input/index.tsx", + "src/modals/team-role/dropdown-with-custom-input/style.sass", + "src/modals/team-role/index.tsx", + "src/mural/addons/adobe-cc/image-library/library-selector.tsx", + "src/team/routes/settings/join-workspace-settings/index.tsx", + "src/test/react-new/commonActions/elements-utils.ts", + "src/test/react-new/features/profile/index.feature", + "src/ui/dropdown/select/workspace.tsx", + "src/views/team/settings/invite-settings/invitation/index.tsx" + ], + "total_files": 14, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6141](https://mural.atlassian.net/browse/FEP-6141)\r\n\r\n[https://remove-create-select-03.mural.engineering/](https://remove-create-select-03.mural.engineering/)\r\n\r\nThis PR removes instances of `createSelect` and replaces them with `MrlSelect`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://muralco-state-api.mural.engineering) to perform a smoke test. ([all" + }, + { + "number": 42962, + "title": "Refactor ActionBuilder to make it more powerful", + "branch": "refactor/action-builder-on-steroids", + "merged_at": "2025-02-24", + "changed_files": 38, + "additions": 280, + "deletions": 166, + "packages_touched": [], + "files_sample": [ + "src/mural/addons/mindmaps/append-mindmap-node.ts", + "src/mural/addons/mindmaps/drag-with-actions.ts", + "src/mural/addons/mindmaps/orientation.ts", + "src/mural/business/add-widgets/persistThirdPartyImage.ts", + "src/mural/business/add-widgets/util/index.ts", + "src/mural/business/drag-widgets-over-cluster.ts", + "src/mural/business/replace-widget.ts", + "src/mural/dispatcher/file-preview/index.test.ts", + "src/mural/dispatcher/file-preview/index.ts", + "src/mural/dispatcher/widgets/index.tsx", + "src/mural/sdk/apis/dragging/index.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-color.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-direction.test.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-direction.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-labels.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-points.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-reference.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/arrow/set-arrow-start-and-end.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/catalog.ts", + "src/mural/sdk/apis/widgets/changes/action-builder/comment/set-comment-message.ts" + ], + "total_files": 38, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR has some typescript porn, beware.\r\n\r\nThe idea behind this is to make our `ActionBuilder` be more intuitive and smart about its usage.\r\n\r\nSo, these are the things that we can do now with these changes:\r\n\r\n### Force to set an initial widget to operate on\r\n- Before this PR you could do something like this:\r\n```ts\r\nnew ActionBuilder(store).moveTo(10, 10);\r\n```\r\nwhich makes no sense, because you're saying `moveTo` but not telling who.\r\n" + }, + { + "number": 42942, + "title": "[presentation-mode] Set Audience View Without Reload", + "branch": "beta-fix/set-audience-view", + "merged_at": "2025-02-21", + "changed_files": 7, + "additions": 144, + "deletions": 27, + "packages_touched": [ + "realtime" + ], + "files_sample": [ + "packages/realtime/src/index.ts", + "src/mural/addons/core/canvas-presentation-experiment/remote-hooks/index.ts", + "src/mural/addons/core/canvas-presentation-experiment/remote-hooks/util.ts", + "src/mural/sdk/apis/facilitation/selectors.test.ts", + "src/mural/sdk/apis/facilitation/selectors.ts", + "src/mural/sdk/state/engine-bridge/types.ts", + "src/views/mural/ui/widgets-container/engine-canvas-layer/effects/compute-engine-update-effects.ts" + ], + "total_files": 7, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, when some other user started a presentation, a participant would have to reload the page to see the stage etc... This is because we had some very defensive code in place that only applied the stage view and so on if the selector `isViewer` returned true.\r\n\r\nThis selector was returning `false` because we need to set the viewer mode concurrently with actually setting the application state to an active presentation.\r\n\r" + }, + { + "number": 42915, + "title": "[FEP-6106] - rename MrlSelect to MrlLegacySelect", + "branch": "refactor/rename-mrl-select", + "merged_at": "2025-02-21", + "changed_files": 48, + "additions": 427, + "deletions": 410, + "packages_touched": [ + "admin", + "claim", + "company-settings", + "enterprise-security", + "legacy-ui" + ], + "files_sample": [ + "package-lock.json", + "package.json", + "packages/admin/src/views/company-workspaces/unlinked-workspaces/index.tsx", + "packages/claim/src/components/view.tsx", + "packages/company-settings/src/views/general-settings/ai-settings/index.tsx", + "packages/company-settings/src/views/general-settings/allow-visitor-invitations/default-allow-anonymous-alias.tsx", + "packages/company-settings/src/views/general-settings/allow-visitor-invitations/default-allow-anonymous-editors.tsx", + "packages/company-settings/src/views/general-settings/allow-visitor-invitations/visitor-link-expiration/index.tsx", + "packages/company-settings/src/views/general-settings/components/default-permissions-selector/permissions/index.tsx", + "packages/company-settings/src/views/general-settings/components/workspace-selector/index.tsx", + "packages/company-settings/src/views/general-settings/embed-settings/default-enabled.tsx", + "packages/enterprise-security/src/ale-byok/kms-key/dropdown.tsx", + "packages/enterprise-security/src/ale-byok/kms-key/list.tsx", + "packages/enterprise-security/src/files/restrict-downloads.tsx", + "packages/legacy-ui/src/mkit/components/MkitSelect/index.tsx", + "packages/legacy-ui/src/modals/select-workspace/index.tsx", + "src/company/pages/billing/overview/common/controls/year-selector/index.tsx", + "src/company/pages/billing/overview/tmp-model/sections/chart-helpers/data-range-selector.tsx", + "src/company/security/identity-and-access/sessions/timepicker/index.tsx", + "src/dashboard/common/collaboration-insights/header/index.tsx" + ], + "total_files": 48, + "body_preview": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6106](https://mural.atlassian.net/browse/FEP-6106)\r\n\r\n[https://rename-mrl-select.mural.engineering/](https://rename-mrl-select.mural.engineering/)\r\n\r\nThis PR updates ui-toolkit version and renames `MrlSelect` imports to `MrlLegacySelect`.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.at", + "labels": [] + }, + { + "number": 47152, + "title": "[NEXT-168][NEXT-166] Move RoomRoute to it's own package ", + "branch": "move/room-route-package", + "merged_at": "2026-02-13T23:42:18Z", + "changed_files": 16, + "additions": 242, + "deletions": 3, + "body": "RoomRoute is now in it's own package `@muralco/dashboard-room-route`\r\n\r\nJoinRoom is moved with it. It's a super small component that RoomRoute depends on. Didn't make sense to put it anywhere else.\r\n\r\n\r\nThis is the first dashboard route to be completely packaged \ud83c\udf89 \r\n\"image\"\r\n\r\n\r\ntest-env\r\nhttps://room-route-package.mural.engineering/", + "labels": [] + }, + { + "number": 47146, + "title": "[NEXT-172] Move RoomPage to package", + "branch": "move/roompage-package", + "merged_at": "2026-02-13T22:31:10Z", + "changed_files": 10, + "additions": 31, + "deletions": 36, + "body": "Move RoomPage to package.\r\nThis completes the package `muralco/dashboard-room-page`\r\n\r\nAfter this, we can move the entire RoomRoute to a package ", + "labels": [] + }, + { + "number": 47160, + "title": "[CAN-8396] Add tracking when absorption happens", + "branch": "add/absorption-tracking", + "merged_at": "2026-02-13T20:02:37Z", + "changed_files": 35, + "additions": 675, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds a new tracking event that's triggered every time there's an absorption happening as a consequence of an user action.\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8396)\r\n- \ud83e\uddea [**Testing environment**](https://absorption-tracking.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 47140, + "title": "chore: migrate ui-toolkit-usage-guidelines rule to agent skill", + "branch": "migrate/ui-toolkit-rule-to-skill", + "merged_at": "2026-02-13T19:04:24Z", + "changed_files": 3, + "additions": 128, + "deletions": 4, + "body": "## Summary\r\nMigrate the UI Toolkit usage guidelines from a Cursor rule (`.cursor/rules/ui-toolkit-usage-guidelines.mdc`) to a shared agent skill (`.agents/skills/ui-toolkit-usage-guidelines/SKILL.md`).\r\n\r\n## Changes\r\n- **Add** `.agents/skills/ui-toolkit-usage-guidelines/SKILL.md` with full content (available components, core rules, migration checklist, best practices)\r\n- **Remove** `.cursor/rules/ui-toolkit-usage-guidelines.mdc`\r\n- **Update** `.cursor/rules/murally-overview.mdc`: add skill to Core Development Standards and Quick Start\r\n\r\n## Verification\r\n- New skill discoverable via symlinks (e.g. `.cursor/skills` \u2192 `.agents/skills`)\r\n- No `.github/instructions` file existed for `ui-toolkit-usage-guidelines` (only `ui-toolkit-usage.instructions.md`), so none deleted\r\n\r\nMade with [Cursor](https://cursor.com)\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Documentation/agent-skill changes only; no runtime code paths or production behavior are modified.\n> \n> **Overview**\n> Moves UI Toolkit usage guidance from a Cursor rule into a shared agent skill (`.agents/skills/ui-toolkit-usage-guidelines/SKILL.md`) so it can be reused across tooling, and updates `murally-overview.mdc` to reference the new skill.\n> \n> Adds a new `git-commit` agent skill that standardizes commits via Conventional Commits guidance (diff analysis, staging workflow, and safety rules).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f971093a9df4c0eff20ea1a99558b4531379ac98. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47157, + "title": "adds user table visit tracking back in to new user tables", + "branch": "fix/readd-user-table-visit-tracking", + "merged_at": "2026-02-13T18:25:11Z", + "changed_files": 8, + "additions": 166, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking events to help us build a baseline of page views ahead of RBAC launch.\r\n\r\nPAGE_VIEWS HOC does not seem to be appropriately tracking visits; so adding these discreet events.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Di", + "labels": [] + }, + { + "number": 47158, + "title": "[NEXT-451] Move `remote` SDK into packages", + "branch": "fix/next-451", + "merged_at": "2026-02-13T17:26:39Z", + "changed_files": 4, + "additions": 28, + "deletions": 30, + "body": "**[NEXT-451 Move `remote` SDK into packages](https://mural.atlassian.net/browse/NEXT-451)**\r\n\r\nThis PR moves `remote` SDK into packages.\r\n\r\nThe environment: https://next-451.mural.engineering/", + "labels": [] + }, + { + "number": 47101, + "title": "[CWI-2588] Render tabs only when active; Cache network requests", + "branch": "update/cwi-2588-active-render", + "merged_at": "2026-02-13T16:54:22Z", + "changed_files": 12, + "additions": 498, + "deletions": 780, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Render tabs only when active\r\n- Added new search hook that uses useQuery to handle caching of repeated network requests\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2588 to understand the context of this effort.\r\n- Please see https://www.loom.com/share/b03b7222c3e44f44a8dc508663c0ad46\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 47096, + "title": "Fix ai clustering with Kanban tickets - CWI-2474", + "branch": "fix/kanban-clustering", + "merged_at": "2026-02-13T16:44:22Z", + "changed_files": 11, + "additions": 221, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdded hooks for ai-clustering.\r\nSubscribed to new hooks in kanban to handle ai-clustering accept or dismiss actions.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827", + "labels": [] + }, + { + "number": 47107, + "title": "[NEXT-442] Migrate low import addons to canvas package", + "branch": "update/migrate-low-priority-addons", + "merged_at": "2026-02-13T16:32:50Z", + "changed_files": 187, + "additions": 484, + "deletions": 184, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoves addon code from src/mural/addons/ into @muralco/canvas (and one move to the integrations package) to support the canvas modularization effort.\r\n\r\n#### Changes\r\n- Canvas package (@muralco/canvas/addons)\r\nMigrated addon modules (via move-to-package and manual fixes):\r\n - Navigation improvements: rollout callouts (try-latest-navigation, zoom-pan-settings-rollback), storage (after-reload-schedule, zoom-initialization)\r\n - Profiler: fps-threshold-profiler, realtime-profiler, render-reasons\r\n - Research mural: research-mural-ui/components/storage\r\n - Smart containers: selectors\r\n - Tables: content-library, icons\r\n - Timer: helpers\r\n - Untangle: types\r\n - Addons root: utils (widget creation handlers)\r\n - Widget compositors: planner-board/board/is-external, columns/types, enhanced-kanban information-panel (drag-item, color-chip-icon)\r\n- Integrations package\r\nMoved addon/github into the integrations package to resolve a circular dependency.\r\n- Other\r\nEarlier commits on this branch also moved AI, Azure DevOps, canvas-onboarding, connectors, context, mindmaps, and related addon files into @muralco/canvas.\r\n\r\n#### Follow-ups\r\n- Replaced @muralco/canvas imports inside the canvas package with relative paths.\r\n- Updated Jest mocks in src/ to use @muralco/canvas/addons (and jest.requireActual where needed).\r\n- Ensured barrel exports and consumer imports are updated for the moved modules.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-442) to understand the context of this effort.\r\n\r\n```\r\nnpm run build:packages\r\nnpm run typecheck\r\nnpm run lint\r\nTests in packages/canvas and affected addon tests in src/\r\n```\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [ + "frontend-next" + ] + }, + { + "number": 47156, + "title": "[NEXT-450] Move `snap` SDK into packages", + "branch": "fix/next-450", + "merged_at": "2026-02-13T16:20:48Z", + "changed_files": 28, + "additions": 344, + "deletions": 324, + "body": "**[NEXT-450 Move `snap` SDK into packages](https://mural.atlassian.net/browse/NEXT-450)**\r\n\r\nIn this PR:\r\n* Move `snap` SDK and related helpers into packages\r\n* Made `primitive` SDK accessible via `SubSdk`\r\n* Replaces `WidgetsSdkApi` with `PrimitiveApis` in some helpers\r\n\r\nThe environment: https://next-450.mural.engineering/", + "labels": [] + }, + { + "number": 47098, + "title": "[CWI-2603] Add QuickConnectionsSwitch in Shapes & Diagramming panel", + "branch": "add/cwi-2603", + "merged_at": "2026-02-13T15:26:44Z", + "changed_files": 3, + "additions": 54, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd QuickConnectionsSwitch in Shapes & Diagramming panel\r\n\r\n\"Screenshot\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2603", + "labels": [] + }, + { + "number": 47135, + "title": "[CWI-2505] Handle Jira connection lost + retry request if access token invalid", + "branch": "fix/cwi-2505", + "merged_at": "2026-02-13T14:28:35Z", + "changed_files": 5, + "additions": 39, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\nHandle Jira connection lost + retry request if access token invalid\r\n\r\n[Screencast from 02-12-2026 09:59:15 AM.webm](https://github.com/user-attachments/assets/45416cf0-217d-4b57-88db-62e92d581065)\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2505\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-integrations/pull/1683\r\n\r\n", + "labels": [] + }, + { + "number": 47149, + "title": "[beta-fix][CWI-2572] Fix to not use doc format for JDC textarea", + "branch": "beta-fix/cwi-2572-textarea", + "merged_at": "2026-02-13T14:03:02Z", + "changed_files": 3, + "additions": 36, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Jira Data Center does not accept Atlassian Document Format (ADF) for textarea fields.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2572 to understand the context of this effort.\r\n- Demo: https://www.loom.com/share/c8952358739d401dba66457b3a4ab87b\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 47117, + "title": "[SCQM-1641] Send `usage` and `cost` in AI feature responses", + "branch": "add/scqm-1641-chatmsg-cost", + "merged_at": "2026-02-13T11:50:08Z", + "changed_files": 26, + "additions": 340, + "deletions": 125, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds `usage` and `cost` to `AIFunctionResult` and all makes all the function calls that resolve through an AI operation report their usage and cost back to the AI Chat along with their function call response message.\r\n\r\nIt can be followed commit by commit. The first one adds the new `AIFunctionExecutionResult` type and implements sending the new props when received. The rest of the commits add the new props to the features that need them, one feature per commit.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1641) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1641-chatmsg-cost.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\nRun all of the following AI features and confirm that on their call to the `/ai/chat` endpoint, the payload includes `usage` and `cost` accordingly:\r\n- [ ] Cluster by topic\r\n- [ ] Generate ideas\r\n- [ ] Generate mindmaps\r\n- [ ] Summarize\r\n- [ ] Suggest title\r\n- [ ] Classify by sentiment\r\n- [ ] Translate\r\n\r\n**NOTE**: other features, like Spell check or Mermaid diagrams, don't incur external usage/cost because they are either handled by the chat itself or don't require external AI calls to resolve.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15390)", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 47141, + "title": "[NEXT-172] Move RoomRoute final deps", + "branch": "move/roomroute-final-deps", + "merged_at": "2026-02-12T22:25:22Z", + "changed_files": 5, + "additions": 5, + "deletions": 4, + "body": "", + "labels": [] + }, + { + "number": 47129, + "title": "[NEXT-448] Move mural limit modal to new DashboardModalsManager pattern", + "branch": "update/mural-limit-modal-pattern", + "merged_at": "2026-02-12T22:03:53Z", + "changed_files": 20, + "additions": 323, + "deletions": 53, + "body": "Move reachedMuralLimit modal opening logic into DashboardModalsManager pattern\r\n\r\ntest with a non-mural.co account to get the free user experience.... modal opens when trying to create 4th mural\r\n\r\ntest-env \r\nhttps://mural-limit-modal-pattern.mural.engineering", + "labels": [] + }, + { + "number": 47150, + "title": "Renames agentic-dev-platform to ai-tools in CODEOWNERS", + "branch": "stable-fix/codeowners-team-rename", + "merged_at": "2026-02-12T21:47:55Z", + "changed_files": 1, + "additions": 9, + "deletions": 9, + "body": "## Summary\r\n\r\n- The GitHub team `agentic-dev-platform` was renamed to `ai-tools` in the org at 2026-02-12T20:12Z\r\n- This broke `test-lint-codeowners` on all branches since the old slug no longer resolves\r\n- Updates all 9 references in CODEOWNERS from `@tactivos/agentic-dev-platform` to `@tactivos/ai-tools`\r\n- Mirrors the fix already on master via #47147", + "labels": [] + }, + { + "number": 47147, + "title": "Renames agentic-dev-platform to ai-tools in CODEOWNERS", + "branch": "fix/codeowners-rename-agentic-dev-platform", + "merged_at": "2026-02-12T21:10:47Z", + "changed_files": 1, + "additions": 9, + "deletions": 9, + "body": "## Summary\r\n\r\n- The GitHub team `agentic-dev-platform` was renamed to `ai-tools` in the org at 2026-02-12T20:12Z\r\n- This broke `test-lint-codeowners` on master and all subsequent branch pushes since the old slug no longer resolves\r\n- Updates all 9 references in CODEOWNERS from `@tactivos/agentic-dev-platform` to `@tactivos/ai-tools`", + "labels": [] + }, + { + "number": 47042, + "title": "[NEXT-438] Finish packaging: duplicateRoom, moveRoom, roomMember, roomSetting, shareMenu, star/unstar, delete, leave", + "branch": "move/room-actionsregistrations", + "merged_at": "2026-02-12T20:27:26Z", + "changed_files": 46, + "additions": 165, + "deletions": 116, + "body": "Finish packaging for: \r\n* DuplicateRoom\r\n* MoveRoom\r\n* RoomMember\r\n* RoomSetting\r\n* ShareMenu\r\n* Star/unstar\r\n* Delete\r\n* Leave\r\n\r\nModals and dashboard actionregistrations all moved\r\n\r\ntest-env\r\nhttps://room-actionsregistrations.mural.engineering/", + "labels": [] + }, + { + "number": 47143, + "title": "[NEXT-446] Move viewport SDK into packages", + "branch": "fix/next-446", + "merged_at": "2026-02-12T18:47:31Z", + "changed_files": 4, + "additions": 29, + "deletions": 30, + "body": "**[NEXT-446 Move viewport SDK into packages](https://mural.atlassian.net/browse/NEXT-446)**\r\n\r\nThis PR moves viewport SDK implementation into packages.\r\n\r\nThe environment: https://next-446.mural.engineering/", + "labels": [] + }, + { + "number": 47103, + "title": "Migrate `src/mural/components` to `@muralco/canvas` and `@muralco/legacy-ui`", + "branch": "mural-components", + "merged_at": "2026-02-12T17:11:19Z", + "changed_files": 102, + "additions": 531, + "deletions": 132, + "body": "### Summary\r\n\r\nThis PR migrates mural-related components and supporting code from `src/` into `@muralco/canvas`, extracts the Lottie player into a new `@muralco/lottie` package, restructures the legacy-ui loading component, and updates all callers to use the new package exports.\r\n\r\n### New package: `@muralco/lottie`\r\nDecouples `lottie` from `@muralco/route-signup` by creating lottie package. \r\n- `packages/route-signup` Lottie player \u2192 `packages/lottie/src/player/` (lottie-player.tsx, lottie-player.sass)\r\n\r\n\r\n### Files moved (into `packages/canvas`)\r\n\r\n#### Components\r\n- Draggable: `mouse.tsx`, `pointer.tsx`, `styles.module.sass` \u2192 `packages/canvas/src/components/draggable/` (+ index.ts)\r\n- Feedback toast: component, test, styles \u2192 `packages/canvas/src/components/feedback-toast/` (+ index.ts)\r\n- Participant avatar: avatar.tsx, test, styles \u2192 `packages/canvas/src/components/participant-avatar/` (+ index.ts)\r\n- Widgets: photo (image, info, index), sticky (container, view, style, index), textbox (container, view, style, index), `util.ts` \u2192 `packages/canvas/src/components/widgets/`\r\n\r\n#### Helpers\r\n- External link helpers \u2192 `packages/canvas/src/helpers/external-link-helpers.ts`\r\n\r\n### packages/legacy-ui Loading\r\n\r\n- `src/mural/components/loading` \u2192 `packages/legacy-ui/src/ui/components/loading/` including all subcomponents ", + "labels": [] + }, + { + "number": 47127, + "title": "Updates `package/canvas` relative barrel imports to be explicit", + "branch": "fix-barrel-imports", + "merged_at": "2026-02-12T16:57:08Z", + "changed_files": 13, + "additions": 39, + "deletions": 31, + "body": "Updates all relative imports in `@muralco/canvas` to point directly to the file exporting the symbol needed, instead of using a top level barrel. This will help reduce potential circular dependencies and unwanted code being included in subpath packages. ", + "labels": [] + }, + { + "number": 47124, + "title": "Increase beta deploy watcher to 45 minutes.", + "branch": "beta-fix/increase-beta-deployment-timeout", + "merged_at": "2026-02-12T16:43:58Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "On backmerges some times a full build is required before the deploy,\ngenerating false negatives.\n", + "labels": [] + }, + { + "number": 47134, + "title": "[NEXT-444] Move ported SDK part into packages", + "branch": "fix/next-444", + "merged_at": "2026-02-12T16:21:13Z", + "changed_files": 84, + "additions": 442, + "deletions": 404, + "body": "**[NEXT-444 Move ported SDK part into packages](https://mural.atlassian.net/browse/NEXT-444)**\r\n\r\nThis PR introduces `CanvasSdkApis` that represents SDKs subset moved into packages. `SdkApis` extends it.\r\nAlso `SubSdk<'sdk1' | 'sdk2'>` was added to specify SDK subsets.\r\n\r\nThe environment: https://next-444.mural.engineering/", + "labels": [] + }, + { + "number": 47108, + "title": "[NEXT-440] Phase 1 of moving sdk/apis/widgets/changes/systems", + "branch": "move/sdk-apis-cont-3", + "merged_at": "2026-02-12T15:43:34Z", + "changed_files": 73, + "additions": 384, + "deletions": 280, + "body": "Test env: https://sdk-apis-cont-3.mural.engineering\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor across absorption/connector systems and helper exports; while largely import-path and module-boundary changes, it touches core widget-parenting/stacking logic and could cause subtle runtime regressions if any exports or paths are missed.\n> \n> **Overview**\n> Moves significant portions of `sdk/apis/widgets/changes/systems` (notably absorption and comment-tracking-related utilities) from the app layer into `packages/canvas`, rewriting many imports to use new local `types`, `util`, and primitives paths and expanding public exports (e.g., `absorbAndExpelAllOrNothingSystem`, stacking-order systems, connector helpers).\n> \n> Extracts `canClusterWidget` into `packages/canvas` helpers and updates multiple Mural entry points (context menu, absorption flows, sidebar, table overlap checks) to consume it from `@muralco/canvas/helpers` instead of app-local helpers.\n> \n> Improves test infrastructure by adding `packages/canvas/src/tests/custom-matchers.ts` (wired via Jest `setupFilesAfterEnv`) with a `toContainChanges` matcher, and adjusts/extends absorption tests accordingly (including a new unit test for `isAllOrNothingAffectingOperation` delegation behavior).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 2161f16a01da9c44e3a658cbe5e70f18bc256745. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47113, + "title": "[BC-1273] Remove widgets from create mural API response.", + "branch": "remove/widgets-create-mural", + "merged_at": "2026-02-12T15:09:42Z", + "changed_files": 7, + "additions": 15, + "deletions": 25, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 47083, + "title": "[CAN-8367] Move zoom-to-selection tool to the navigation zoom menu", + "branch": "add/can-8367", + "merged_at": "2026-02-12T14:45:50Z", + "changed_files": 8, + "additions": 37, + "deletions": 196, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves Zoom-to-selection to the zoom menu in the navigation toolbar and removes it from the widget toolbar.\r\n\r\n[Test Env](https://can-8367.mural.engineering/)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8367)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference be", + "labels": [] + }, + { + "number": 46990, + "title": "[IAM-2011] share modal member and invite role id", + "branch": "add/iam-2011-share-roles", + "merged_at": "2026-02-12T14:36:46Z", + "changed_files": 26, + "additions": 827, + "deletions": 111, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates share modal email list and member access permission dropdowns to be role dropdowns when RBAC is enabled.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2011) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2011-share-roles.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15309)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassi", + "labels": [] + }, + { + "number": 47064, + "title": "[EN-3571] add first screen for new workspace consolidation modal", + "branch": "feat/en-3571-first-wc-screen", + "merged_at": "2026-02-12T00:07:37Z", + "changed_files": 16, + "additions": 1234, + "deletions": 1003, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds a functional first screen to the new workspace consolidation modal\r\n- Reflects either the inline or bulk selection of workspaces selected by the user in table format, with some metadata information\r\n- Generates a list of eligible destination workspaces based on a composition of a query and an exclusion of currently selected source workspaces\r\n- Graceful query loading and error states\r\n- Stores destination workspace selection in a top level modal local form state object, for further augmentation in downstream screens\r\n- Manages modal form state with `react-hook-form` for standardized validation, state management, etc\r\n- Removes an extra step in the modal process and adjusts all associated logic\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3571) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3571-first-wc-screen.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nAs a global admin user, you can use the [following link in the test env ](https://en-3571-first-wc-screen.mural.engineering/c/middleearth/company/workspaces)for testing / verification that:\r\n- Bulk or inline selection appears accurately in the modal table\r\n- Destination dropdown options are mutually exclusive to selection (cannot consolidate a workspace onto itself)\r\n- If the query to get eligible target workspaces fails, error message appears with retry option (can use network request blocking of the `/api/v0/companies/${companyId}/workspaces/consolidate/eligible-targets` to simulate this)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some fla", + "labels": [] + }, + { + "number": 47125, + "title": "[CAN-8395] Track nested and descendant information when dragging", + "branch": "add/nested-drag-tracking", + "merged_at": "2026-02-11T22:05:51Z", + "changed_files": 3, + "additions": 382, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds two new pieces of information regarding the tracking of a dragging event:\r\n\r\n- `descendantWidgetCount`: tracks the number of descendants a dragging widget has. It includes all levels of descendants but excludes table cells and groups, as they are not considered \"value\" widgets (they only exist to complement other widgets)\r\n- `areaDescendantAreas`: tracks the number of nested areas included in a dragging area\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8395)\r\n- \ud83e\uddea [**Testing environment**](https://nested-drag-tracking.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 47036, + "title": "[FEP-6441] - fix tooltip hover in floating widget toolbar", + "branch": "fix/tooltip-hover-widget-toolbar", + "merged_at": "2026-02-11T21:23:47Z", + "changed_files": 9, + "additions": 29, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Test Environment](https://tooltip-hover-widget-toolbar.mural.engineering)\r\n\r\n[JIRA Issue - FEP-6441](https://mural.atlassian.net/browse/FEP-6441)\r\n\r\n### Problem Statement\r\n\r\n**Widget toolbar tooltips interfere with canvas interactions**\r\n\r\nWhen users hover over tooltips in widget toolbars, canvas panning and zooming become unresponsive. \r\n\r\n\r\nhttps://github.com/user-attachments/assets/62afdbff-d537-4c5a-a0c4-e02766ffc749\r\n\r\n\r\nThis issue occurs because:\r\n- Tooltips are rendered in a separate DOM layer from the canvas\r\n- The tooltip layer captures mouse wheel events before they reach the canvas\r\n- The canvas `WheelManager` cannot process these events, disabling pan/zoom functionality, when hovering over tooltips, See [@micaelbergeron comment](https://mural.atlassian.net/browse/FEP-6441?focusedCommentId=368061) for more details\r\n\r\n### Solution Approach\r\n\r\nAfter evaluating multiple approaches, we implemented a targeted solution:\r\n\r\n**Option 1:** Move tooltip rendering inside the canvas container\r\n- Would ensure proper event delegation to `WheelManager`\r\n- Risk: Significant changes to tooltip positioning logic and potential rendering bugs\r\n\r\n**Option 2 (Implemented):** Disable tooltip hover behavior for widget toolbars\r\n- Maintains existing tooltip positioning and rendering\r\n- Minimal risk and focused scope\r\n\r\nhttps://github.com/user-attachments/assets/608d65c8-6b2c-424c-a83d-ccad8f26a6ce\r\n\r\n### Implementation Details\r\n\r\nThis PR introduces the `disableTooltipHover` prop that prevents tooltips from capturing hover events, allowing mouse interactions to pass through to the canvas.\r\n\r\n**Key Changes:**\r\n1. **Core Toolbar Component** - Added `disableTooltipHover` prop to the main `Toolbar` component ([src/lib/tools-api/renderers/toolbar/index.tsx](src/lib/tools-api/renderers/toolbar/index.tsx))\r\n\r\n2. **Targeted Application** - Enabled only for widget-specific toolbars:\r\n - Fixed widget toolbar (`WIDGET_FIXED`)\r\n - ", + "labels": [] + }, + { + "number": 47058, + "title": "[bug][connection-verification] production realtime /ping refactor, regional URL exceptions, CORS troubleshooting", + "branch": "bug/connection-verification-pt-i", + "merged_at": "2026-02-11T21:15:23Z", + "changed_files": 5, + "additions": 412, + "deletions": 49, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we relied on the `ping` endpoint in the production realtime service.\r\nHaving been told this endpoint is disabled in production due to some custom haproxy implementation,\r\nwe're implementing a work around.\r\n\r\nNow, with these changes, we rely on the user channel to confirm connection to realtime. In the future, it would be wise to go back to the `/ping` impelmentation for greater assurance that a user can connect\r\nto the realtime service.\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://connection-verification-pt-i.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- [DEMO](https://www.loom.com/share/497a5dda499946d8b94c56097520d95b)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Un", + "labels": [] + }, + { + "number": 47114, + "title": "Update selects in Jira Send to modal", + "branch": "beta-fix/cwi-2607", + "merged_at": "2026-02-11T21:06:39Z", + "changed_files": 6, + "additions": 50, + "deletions": 20, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUpdate selects in Jira Send to modal\r\n\r\n\"image\"\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2607\r\n", + "labels": [] + }, + { + "number": 47111, + "title": "[CWI-2606] Fix flash of sidebar when clicking on photo widgets from Unsplash", + "branch": "fix/cwi-2606", + "merged_at": "2026-02-11T20:58:13Z", + "changed_files": 1, + "additions": 9, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix flash of sidebar when clicking on photo widgets from Unsplash\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2606", + "labels": [] + }, + { + "number": 47106, + "title": "[BOP-155] Customer research citations updates and bugfixes", + "branch": "add/customer-research-citations", + "merged_at": "2026-02-11T20:49:37Z", + "changed_files": 1, + "additions": 18, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR improves the function to fill out the account plan, including citations in the follow ways:\r\n\r\n- Fixes a bug that makes the whole board blank when any section is not a string. This was an issue with citations, which were in an array. If this section wasn't handled properly, the whole board would be blank.\r\n- Checks for the citations widget dynamically, and removes it if the FF is turned off. Before we were checking for the exact widget IDs, but those could change when more than one template is added to the canvas, in the case of the secondary template.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://linear.app/mural/issue/BOP-155/fix-account-plan-widget-fill-loop-for-non-string-values) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're ", + "labels": [] + }, + { + "number": 47126, + "title": "[Stable-fix] Remove noisy private time log", + "branch": "stable-fix/remove-private-log", + "merged_at": "2026-02-11T20:10:41Z", + "changed_files": 1, + "additions": 0, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\nRemoves a log I recently added that is causing millions of logs to pile up.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47099, + "title": "[MFRD-101] Reverse company colors order in color-palette component", + "branch": "add/mfrd-101", + "merged_at": "2026-02-11T18:51:39Z", + "changed_files": 1, + "additions": 8, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the color picker displayed the company colors just as the Company admin view, from last added to first: [3], [2], [1]. With these changes we reverse the order only for the color picker (color-palette component) for them to appear as [1], [2], [3].\r\n\r\nCompany settings:\r\n\"image\"\r\n\r\nColor picker:\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-101) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mfrd-101.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering)) Use your @mural.co if you want to test, I've added company colors as shown on the screenshots above.\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47116, + "title": "Use always latest @tactivos/check-branch-name", + "branch": "fix/use-latest-check-branch-name-murally", + "merged_at": "2026-02-11T18:40:35Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "", + "labels": [] + }, + { + "number": 47104, + "title": "[MFRD-107] Fix width of custom toolbar container", + "branch": "fix/custom-toolbar-width", + "merged_at": "2026-02-11T17:49:14Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd max-width to prevent section from overflowing parent width. \r\n\r\nBefore:\r\n\"Screenshot\r\nAfter:\r\n\"Screenshot\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-107) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://custom-toolbar-width.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46933, + "title": "[CWI-2566] Integrations Platform - Add support for admin configuration in the connections system", + "branch": "add/cwi-2566", + "merged_at": "2026-02-11T17:19:34Z", + "changed_files": 44, + "additions": 885, + "deletions": 230, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Add support for admin configuration in the connections system\r\n\r\n[Screencast from 01-28-2026 12:59:24 PM.webm](https://github.com/user-attachments/assets/e85b0f76-5d1b-4a2c-834f-dbb95f8dd9b2)\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2566\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-api/pull/15278", + "labels": [] + }, + { + "number": 47112, + "title": "Add accessibility standards as shared agent skill", + "branch": "add/accessibility-standards-agent-skill", + "merged_at": "2026-02-11T16:31:53Z", + "changed_files": 6, + "additions": 121, + "deletions": 262, + "body": "Migrate accessibility standards from Cursor rules and GitHub instructions to a shared agent skill at `.agents/skills/accessibility-standards/`, following the pattern from the jest-testing migration (PR #47061).\n\n## Summary\n- **Add** `.agents/skills/accessibility-standards/SKILL.md` with WCAG 2.2 AA guidelines (name/description frontmatter, full content)\n- **Remove** `.cursor/rules/accessibility-standards.mdc` and `.github/instructions/accessibility-standards.md`\n- **Update** murally-overview.mdc, cursor-instructions-files.mdc, and copilot-instructions-files.instructions.md to reference the skill and remove deleted-file examples\n- **Add** `.cursor/commands/migrate-rule-to-agent-skill.md` \u2014 reusable command prompt for migrating any rule to `.agents/skills` (placeholders, steps, file summary, verification, usage)\n\nThe skill is discoverable via existing symlinks (.cursor/skills, .claude/skills, .codex/skills, .github/skills \u2192 .agents/skills).\n\nMade with [Cursor](https://cursor.com)", + "labels": [] + }, + { + "number": 47084, + "title": "[ESC-1886] Add data classification feature flag to enable the feature company-wise", + "branch": "add/data-classif-ff-esc-1886", + "merged_at": "2026-02-11T15:05:15Z", + "changed_files": 5, + "additions": 44, + "deletions": 0, + "body": "#### Description\r\n\r\nAdd feature flag and be able to toggle it in the company dashboard\r\n\r\n#### Reviewer Resources\r\n\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1886) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://data-classif-ff-esc-1886.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n\r\n- [x] Unit tests were added/updated\r\n\r\n- [x] No new cucumber tests were added\r\n\r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15383)\r\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Adds a new boolean flag and UI wiring without changing existing authorization or data-processing flows; risk is mainly missing downstream consumers expecting the new setting key.\n> \n> **Overview**\n> Adds a new company settings flag, `enableDataClassification`, to control data classification on a per-company basis.\n> \n> Exposes the flag in the internal tools feature toggles UI with a new checkbox (plus updated unit test coverage), and wires it into both internal-tools and settings change-notification dictionaries so confirm-change modals display the correct messaging when the flag is toggled.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 552fe89cc07ca0388d49f28463fe54970f3e6e3c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47110, + "title": "[CAN-8337] Move `stageManager` global variable into CET SDK instance", + "branch": "fix/can-8337", + "merged_at": "2026-02-11T14:38:52Z", + "changed_files": 10, + "additions": 36, + "deletions": 30, + "body": "**[CAN-8337 Move `stageManager` global variable into SDK](https://mural.atlassian.net/browse/CAN-8337)**\r\n\r\nThis PR moves `stageManager` global variable into SDK instance.\r\n\r\nThe environment: https://can-8337.mural.engineering/", + "labels": [] + }, + { + "number": 47033, + "title": "[NEXT-434] Move mural action registrations", + "branch": "move/mural-actionregistrations", + "merged_at": "2026-02-11T06:14:52Z", + "changed_files": 20, + "additions": 89, + "deletions": 66, + "body": "Move all the MuralCard Action Registration components to package.\r\n\r\nThe modals had previously been moved. The dashboard component that registers the card actions is all that's moving in this PR\r\n\r\ntest env\r\nhttps://mural-actionregistrations.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Primarily a packaging/import refactor with minimal logic changes, but it touches widely-used action registration wiring so regressions would show up as missing/incorrect mural card actions or modals.\n> \n> **Overview**\n> Moves mural card action registrations (archive/delete/duplicate/info/insights/leave/move/rename/restore/star/unstar) into `@muralco/dashboard-modals-mural` and re-exports them via a new `src/actions` barrel.\n> \n> Updates dashboard entry points (`page-render`, search results, see-all route, room-v2, and `mural-actions` test) to import these registrations from the package instead of local `mural-actions` modules, and adjusts registrations to render the package\u2019s specific modal components directly. Adds `@muralco/dashboard-mural-location` as a dependency to support the new `infoRegistration` popover.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 22b5c48e6ba77749732f0d4169dda2ed28898cee. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47000, + "title": "[NEXT-432] Move move-folder and delete-folder modals and associated components", + "branch": "move/delete-move-folder-modals", + "merged_at": "2026-02-10T22:45:32Z", + "changed_files": 24, + "additions": 34, + "deletions": 16, + "body": "Package MoveFolder and DeleteFolder modals and registration components.\r\n\r\ntest env\r\nhttps://delete-move-folder-modals.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Moderate risk because it changes how core folder actions/modals are wired and exported across packages; breakage would surface as missing/incorrect folder action menu items or runtime import errors.\n> \n> **Overview**\n> Packages the **Move Folder** and **Delete Folder** modals (and their folder action registrations) into `@muralco/dashboard-modals-room`, adding new public exports (`MoveFolderModal`, `MoveFolderForm`, `DeleteFolderModal`, and `move/rename/deleteFolderActionRegistration`) and adjusting internal imports accordingly.\n> \n> Updates app code and tests to consume these registrations/modals from the package (including `room-v2`\u2019s `FolderActionsManager` registrations), and trims shared modal styles by removing the `.modals-delete-folder` block from `src/modals/style.sass`.\n> \n> Adds required package dependencies (`@muralco/history`, `@muralco/logger`, `@muralco/toast`, `@muralco/dashboard-data-workspace`, `lodash`, etc.) to support the moved components.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e3549d3a106899280d6b59a45700f862f3e50850. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47062, + "title": "[ENGAGE-1482] Add \u201cCreated by\u201d filter to search", + "branch": "add/created-by-filter", + "merged_at": "2026-02-10T22:32:27Z", + "changed_files": 8, + "additions": 247, + "deletions": 56, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nJIRA: https://mural.atlassian.net/browse/ENGAGE-1482\r\n\r\n\r\nSearch results can be filtered by creator via a new \u201cCreated by\u201d dropdown (`All creators` / `Me` / `frequent collaborators`). Gated by the `feat-user-search-adjustments-dev` feature flag.\r\n\r\n\"image\"\r\n\r\n\r\n- `API` \u2013 Add `createdBy` to workspace search in `packages/api` (`workspaces.ts`).\r\n- Feature flag & data \u2013 Add `ENABLE_SEARCH_ADJUSTMENTS_DEV` (`feat-user-search-adjustments-dev`) and thread `createdBy` through `useSearch` (`params, state, request`).\r\n- Use `api/v0/profile/content/cross-workspace-frequent-collaborators/` to retrieve frequent collaborators to populate the `Created-by` selector.\r\n\"image\"\r\n\r\n- `Created-by` selector \u2013 New `SearchCreatedBySelectorMenu` component.\r\n- Integration \u2013 Read `createdBy` from `URL` in `search route`, pass through `useSearch` and into results.\r\n- Shows `createdBy` dropdown when flag is enabled\r\n\r\n\r\nOptimizely flag: https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-user-search-adjustments-dev/rules/development\r\n\r\nMocks: https://beta.mural.co/t/murally-org/m/murally-org/1769539471970/3202b501778d071c987c5e3a0c10413e73f1f7d5?wid=0-1769778754082\r\n\r\n> [!NOTE]\r\n> This is v1. This PR focuses on adding the basic functionality for searching for murals based on the `createdBy` user. \r\n\r\n#### Reviewer Resources\r\nENV: https://created-by-filter.mural.engineering/t/salstestyworkspace9064/home\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\r\n---\r\n\r\n> [!NOTE]\r\n> **Medium Risk**\r\n> Touches search query", + "labels": [] + }, + { + "number": 47087, + "title": "Common, Tools API migration + cleanup, prereqs for Tools API, + misc cleanup", + "branch": "common-misc-cleanup", + "merged_at": "2026-02-10T21:41:38Z", + "changed_files": 77, + "additions": 405, + "deletions": 187, + "body": "### Summary\r\n\r\nThis PR handles migrating `src/hooks/api` to `@muralco/api-client-handlers`. As well as moving prerequisites to Tools API, toolbars, implementation. Plus some additional miscellaneous cleanup that occurred along the way to prepare files to be modularized. \r\n\r\n### New package: `@muralco/api-client-handlers`\r\n\r\n- `src/hooks/api/on-mural-down.ts` \u2192 `packages/api-client-handlers/src/on-mural-down.ts`\r\n- `src/hooks/api/on-refresh-error.ts` (+ test) \u2192 `packages/api-client-handlers/src/on-refresh-error.ts`\r\n- `packages/api-client-handlers/src/on-unauthorized-exception.ts` (+ test) \u2192 moved from `src/hooks/api`\r\n- New package config: `package.json`, `tsconfig.json`, `tsconfig.jest.json`, `jest.config.js`, `webpack.config.js`, `.eslintrc.js`, `README.md`\r\n\r\n### Files moved (into `packages/canvas`)\r\n\r\n#### Business\r\n- `src/mural/business/labels/add-or-replace-label.ts` \u2192 `packages/canvas/src/business/labels/add-or-replace-label.ts`\r\n- New: `packages/canvas/src/business/toolbar/getSelectedWidgetTypes.ts`, `packages/canvas/src/business/toolbar/index.ts`\r\n\r\n#### Helpers\r\n- `src/views/mural/ui/toolbar/...` / related \u2192 `packages/canvas/src/helpers/file-upload.ts`\r\n- `src/views/.../fullscreen` \u2192 `packages/canvas/src/helpers/use-fullscreen.tsx`\r\n\r\n#### Views\r\n- `src/views/mural.v2/toolbars/fixed-toolbar/` \u2192 `packages/canvas/src/views/mural.v2/toolbars/fixed-toolbar/` (fixed-toolbar.tsx, styles.module.sass)\r\n- New: `packages/canvas/src/views/mural.v2/index.ts`, `packages/canvas/src/views/mural.v2/toolbars/index.ts`, `fixed-toolbar/index.ts`\r\n\r\n### Other changes\r\n\r\n- **common**: relocated `routes.ts` to register implementation and renamed `auth.ts`\r\n- **common**: `expose-sdk-context.ts` and `index.ts` updated to use `@muralco/api-client-handlers`; common no longer re-exports the moved handlers\r\n- **tools-api**: Removed `ToolbarMenuAdapter/helper.ts`; adapters, renderers (button, divider, toolbar), and wellknown-toolbars updated to use `@muralco/canvas` where applicable\r", + "labels": [] + }, + { + "number": 46860, + "title": "[TEM-100] Add public template sidebar", + "branch": "add/public-template-sidebar", + "merged_at": "2026-02-10T20:24:15Z", + "changed_files": 10, + "additions": 350, + "deletions": 78, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds a sidebar with template info in the public template preview.\r\nFigma: https://www.figma.com/design/2vJHxBKrsoAAns4E5yjaVH/Templates-in-the-canvas?node-id=5877-7598&p=f&m=dev\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://linear.app/mural/issue/TEM-100/public-template-preview-sidebar) to understand the context of this effort.\r\n- \ud83e\uddea Please use this links below ([all testing envs](https://testing-envs.mural.engineering))\r\n--Global template public link: https://public-template-sidebar.mural.engineering/template-preview/5ae6c031-d8a5-4b1d-8be8-03ef6516d7c2/c7cd83e4-a249-4f4e-b360-0488049b8a45\r\n--Custom template public link: https://public-template-sidebar.mural.engineering/template-preview/7461d394-4961-450c-94f0-fbf8ae1d7110/7810bb2b-a8a4-4ce8-8698-9f5a79f0d6c7\r\n\r\n\r\n### Known Limitations / Future Work\r\n> Note on Anonymous Template Session Endpoint: While implementing full anonymous session support would enhance this feature (e.g., allowing anonymous users to interact more deeply with templates), the backend endpoint for anonymous template sessions has not been merged yet. [A separate ticket](https://mural.atlassian.net/browse/CPT-2487?atlOrigin=eyJpIjoiNDkzYmVlMjY3ZjBhNDIyZGE0ODg3NTY4NGVjNjgwODciLCJwIjoiaiJ9) was created to address this integration once the endpoint is available. This PR focuses on the frontend implementation that works with the current public template API.\r\n\r\n### Q&A\r\nQ: If the backend work isn't connected, how are you able to test the template preview page via a public link?\r\nA: Right now, without the backend connected, unauthenticated users are redirected to the sign-in page on template-preview (signed-in users can access it\u2014this is the loophole I flagged last week). I also mentioned that i found a fix for this loophole and included ", + "labels": [] + }, + { + "number": 47097, + "title": "[NEXT-441] Migrate low priority dispatcher functions", + "branch": "update/migrate-low-dispatcher-functions", + "merged_at": "2026-02-10T19:59:38Z", + "changed_files": 33, + "additions": 52, + "deletions": 70, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR continues the migration of \u201clow priority\u201d dispatcher utilities from the app-level mural dispatcher into the shared @muralco/canvas/dispatcher package, updating app code and tests to consume the new shared exports.\r\n\r\nChanges:\r\n\r\n- Repointed multiple call sites to import dispatcher utilities/constants from @muralco/canvas/dispatcher (keyboard, quick-add padding, labels API types, markdown detection, timer helper, file-preview range helpers).\r\n- Added/expanded canvas-dispatcher exports (labels, quick-add defaults, file-preview utils, timer helper, clipboard markdown utils).\r\n- Introduced new shared utility implementations in packages/canvas for file-preview range handling and markdown detection.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-441) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "frontend-next" + ] + }, + { + "number": 47095, + "title": "ECOMM-320 Remove config flag and delete branching code ", + "branch": "add/downgrade-cleanup", + "merged_at": "2026-02-10T19:29:44Z", + "changed_files": 7, + "additions": 43, + "deletions": 166, + "body": "## Pull request overview\r\n\r\nThis PR removes the `downgradeAtRenewalEnabled` feature flag from the UI codebase, making the downgrade-at-renewal functionality permanently enabled. The feature flag was previously used to gate the detection of conflicting changes during billing plan updates and scheduled downgrades.\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-403\r\n\r\nTest Env: https://downgrade-cleanup.mural.engineering\r\n\r\n**Changes:**\r\n- Removed `downgradeAtRenewalEnabled` feature flag checks from conflict detection and scheduled downgrade logic\r\n- Cleaned up associated test mocks and feature flag-specific test cases\r\n- Removed the flag definition from the config TypeScript interface\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 6 out of 6 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/billing/components/two-screen-purchase-flow/utils.ts` | Removed feature flag check from `detectConflictingChanges`, now always executes conflict detection |\r\n| `src/billing/components/two-screen-purchase-flow/utils.test.ts` | Removed `getConfig` mock setup and flag-related test boilerplate |\r\n| `src/billing/components/two-screen-purchase-flow/components/plan-details-panel/write.test.tsx` | Removed feature flag-specific tests and mock setup, retained core conflict detection tests |\r\n| `packages/billing/src/utils/plan-utils.ts` | Removed feature flag check from `isScheduledDowngrade`, updated JSDoc to remove flag reference |\r\n| `packages/billing/src/utils/plan-utils.test.ts` | Removed feature flag mock setup and flag-specific test case |\r\n| `packages/api/src/config.ts` | Removed `downgradeAtRenewalEnabled` property from config interface |\r\n
\r\n", + "labels": [] + }, + { + "number": 47092, + "title": "[MFRD-94] Add company colors usage tracking", + "branch": "add/mfrd-94", + "merged_at": "2026-02-10T18:49:32Z", + "changed_files": 12, + "additions": 216, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd company colors and themes usage tracking:\r\n\"image\"\r\n\r\n- Using a company color through the widget toolbar (both fixed and floating)\r\n`[tracking] Tracking segment only Event: \"company_color_selected\" with {\"colorId\":\"3fc95fbf-db04-41d5-a772-cf8ee97cd3a7\",\"colorName\":\"Test\"}`\r\n\r\n\"image\"\r\n\r\n- Using the company themes on a multiple selection through the widget toolbar (both fixed and floating)\r\n`[tracking] Tracking segment only Event: \"apply_custom_theme\" with {\"id\":\"company_theme\",\"themeName\":\"Test\"}`\r\n\r\n- Using 'Other themes'\r\n`[tracking] Tracking segment only Event: \"apply_custom_theme\" with {\"id\":\"Coastal calm\",\"themeName\":\"Coastal calm\"}`\r\n\r\n- Undoing the use of company theme\r\n`[tracking] Tracking segment only Event: \"apply_custom_theme_undo\" with {\"id\":\"company_theme\",\"themeName\":\"Test\"}`\r\n\r\n- Undoing the user of 'Other themes'\r\n`[tracking] Tracking segment only Event: \"apply_custom_theme_undo\" with {\"id\":\"Coastal calm\",\"themeName\":\"Coastal calm\"}`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-94) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://mfrd-94.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering)), I already created company colors and a company theme for testing purposes which should be available as long as you use your @mural.co email to create your test user.\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47059, + "title": "[NEXT-435] Move `primitives` SDK into packages", + "branch": "fix/next-435", + "merged_at": "2026-02-10T18:18:57Z", + "changed_files": 349, + "additions": 826, + "deletions": 1054, + "body": "**[NEXT-435 Move `primitives` SDK into packages](https://mural.atlassian.net/browse/NEXT-435)**\r\n\r\nIn this PR:\r\n* Moved `primitive` SDK into packages (the main target of this PR)\r\n* Fixed `WidgetStore.getAabb` results inconsistency for cases when one id passed, or an array of ids\r\n* Removed `sanitizeWidgetBbox`, `internalComputeBounds`, `internalGetInaccurateAbsolutePosition`, and `getBounds` from primitives SDK \r\n* Simplified `getWidgetsWithinAabb`, now it uses WidgetStore\r\n* Moved `isBeingDragged` from primitives into widgets SDK since it uses selection and cant be moved into packages now\r\n* Moved `addWidgetsToMural` function from primitives into widgets SDK\r\n* Simplified `containsPoint` method in in primitives API by using Obb\r\n\r\nThe environment: https://next-435.mural.engineering/", + "labels": [] + }, + { + "number": 47089, + "title": "Move mockedLogger to test-mocks", + "branch": "move/mock-logger", + "merged_at": "2026-02-10T17:40:37Z", + "changed_files": 12, + "additions": 34, + "deletions": 28, + "body": "Move test mock logger to package `@muralco/test-mocks`\r\n\r\nTest now use it as `mocks.logger`\r\n\r\njest.config.js now imports the logger mock setup directly from the package", + "labels": [] + }, + { + "number": 47073, + "title": "[MFRD-93] Fallback to `img` tag for rending external photo links in Activity Log", + "branch": "fix/activity-log-img", + "merged_at": "2026-02-10T16:50:18Z", + "changed_files": 5, + "additions": 145, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\nWhen you add a photo widget via an external link to the canvas, in the backend this is the order of events:\r\n1. The widget gets created **with the external link as the thumbnail**\r\n2. **The creation activity is added to the activity log** ****\r\n3. A callback called `updatePhotoWidgetWithInternalAsset` runs to update the widget, replacing the external link with an internal asset path. \r\n\r\nThis means that when you open the activity log, the widget data stored still has the **external** link to the image. When the `RenderWidget` component uses the engine to load and take a snapshot of it (a change made last October), the `toDataURL()` call to read from the canvas throws a security error because it's cross origin. The other places that use `RenderWidget` (outline / voting results) are not impacted since they use the current widget data (with the internal asset) and not a snapshot of the widget prior to that callback. \r\n\r\nTLDR: This change specifically looks for photo widgets with an external link and reverts to using an `img` tag to load them in the activity log. The solution to get it to render the way the rest of the widgets do with `RenderWidget` would likely include making changes to the create widget flow in the backend - since this is not a high priority feature I was hesitant to go tinkering with a critical path. \r\n\r\nLoom: https://www.loom.com/share/3ff5a470148949849f57dac7a498ae71\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-93) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://activity-log-img.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n1. Paste a link to an external image on the canvas\r\n2. Open the activity log and verify it shows up correctly", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47076, + "title": "Add/en 3572 consolidate step 2", + "branch": "add/en-3572-consolidate-step-2", + "merged_at": "2026-02-10T16:33:15Z", + "changed_files": 6, + "additions": 918, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR consolidates \u201cStep 2\u201d of the workspace consolidation flow by replacing placeholder content with a real \u201cmigration timing\u201d step (immediate vs scheduled), including validation and UI layout updates in the company settings consolidation modal.\r\n\r\n### Changes:\r\n\r\n- Replaces consolidate modal step 2 placeholder with a new ConsolidationTimeStep component and adds step gating (disable \u201cContinue\u201d when timing is invalid).\r\n- Introduces validation logic + unit tests for scheduled migration timing (time format + min/max schedule window).\r\n- Adds modal/content styling to support the new radio group + date/time inputs layout.\r\n\r\n\"image\"\r\n\"image\"\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3572) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3572-consolidate-step-2.mural.engineering/) to perform a smoke test. ([all testing envs](https://en-3572-consolidate-step-2.mural.engineering/))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that fai", + "labels": [] + }, + { + "number": 47054, + "title": "Added extended tracking for autoresize ussage", + "branch": "feat/can-8374", + "merged_at": "2026-02-10T14:29:07Z", + "changed_files": 4, + "additions": 138, + "deletions": 13, + "body": "## Summary of Changes and Resources for the Reviewer\r\nAdded improved telemetry around table cell auto-resize usage:\r\n\r\n- New table_autoresize_toggled event emitted from the widget toolbar toggle with precision if event was toggled on or off.\r\n- New table_autoresize_resized event emitted when autoResize=true and fitting content actually changes table layout, with aggregated resize impact fields (counts + total deltas).\r\n\r\n## Case Solved\r\nWe needed better observability to evaluate the risks/benefits of permanently disabling/removing auto-resize. Previously, we could only infer usage from the generic toolbar_button_pressed event (no \u201cfrom/to\u201d state), and we had no tracking for actual resize operations caused by autoResize=true.\r\n\r\n## How the Change Fixes It\r\n\r\n**Toggle telemetry:**\r\n\r\n- When the user clicks the toolbar toggle, we capture the current table autoResize state and emit a dedicated event including both from and to, so we can distinguish on\u2192off vs off\u2192on.\r\n\r\n**Resize telemetry:**\r\n\r\n- In fitTableCellsToContent, after computing the resulting newColumns/newRows, we compare against the original dimensions.\r\n\r\n- We only emit table_autoresize_resized when:\r\n -- autoResize is enabled,\r\n -- child widgets are considered (ignoreChildren=false),\r\n -- and at least one row/column dimension actually changes.\r\n- Payload summarizes impact (how many rows/cols changed + total deltas) and whether any fitted cell had child widgets.\r\n\r\n## Reviewer Resources\r\n- \ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8374)\r\n- \ud83e\uddea [ENV](https://can-8374.mural.engineering)", + "labels": [] + }, + { + "number": 47032, + "title": "[MFRD-2] Add action to enter presentation mode", + "branch": "add/present-action", + "merged_at": "2026-02-10T12:59:43Z", + "changed_files": 5, + "additions": 33, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds a way to enter presentation mode from the actions bar, accessible in the top left toolbar. \r\nhttps://www.loom.com/share/14be899f3cd14931ab38b622ffdb12c0\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-2) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://present-action.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47069, + "title": "[FEP-6440] - fix packages unit tests performance", + "branch": "fix/packages-unit-tests-performance", + "merged_at": "2026-02-10T12:27:23Z", + "changed_files": 12, + "additions": 167, + "deletions": 19, + "body": "# Improve packages unit tests performance\r\n\r\n## Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6440](https://mural.atlassian.net/browse/FEP-6440)\r\n[https://packages-unit-tests-performance.mural.engineering/](https://packages-unit-tests-performance.mural.engineering/)\r\n\r\n**Prior to these changes:** Package unit tests in CI ran with `--runInBand` (single Jest worker per package), and individual test files used a mix of local timeouts. There was no shared CI-specific Jest configuration or visibility into slow tests and memory usage.\r\n\r\n**With these changes:** Package tests run in parallel (no `--runInBand`), use a shared CI Jest config with configurable timeout and worker limits, report memory and test duration (slowest first), and rely on a single global timeout instead of per-test overrides. This improves CI runtime and reduces risk of OOM while making slow tests visible.\r\n\r\n### Changes\r\n\r\n- CI workflow\r\n - Removed `--runInBand` from the \"Package tests\" job in `.github/workflows/quality.yml` so packages can run with multiple Jest workers when `npm run test:packages -- --concurrency=4` runs.\r\n\r\n- Shared Jest CI config (`packages/config/jest/`)\r\n - `jest.ci.config.js` (new): Central CI config used when `CI=true`. Sets:\r\n - `testTimeout`: 30s default (override via `JEST_TEST_TIMEOUT`)\r\n - `maxWorkers`: 50% of CPU (override via `JEST_MAX_WORKERS`, e.g. `75%` or `12`)\r\n - `workerIdleMemoryLimit: '75%'` to recycle memory-heavy workers\r\n - `workerThreads: true` for lower memory and faster worker startup\r\n - Custom reporter: `memory-and-time-reporter.js`, it will report the 5 slowest tests in a package.\r\n - `jest.react.config.js` and `jest.ts-library.config.js`: Spread `jestCiConfig` when `CI === 'true'`.\r\n\r\n- Global timeout instead of per-test timeouts\r\n - Replaced local timeouts in 7 test files with the global `testTimeout` from the CI config so behavior is consistent and CI doesn\u2019t hang on stuck tests:\r\n ", + "labels": [] + }, + { + "number": 47018, + "title": "[IAM-2319] feat: role for workspace pending invitations", + "branch": "feat/iam-2319-wp-inv", + "merged_at": "2026-02-10T08:54:35Z", + "changed_files": 13, + "additions": 395, + "deletions": 99, + "body": "### Summary of changes\r\n\r\nHandle workspace pending invitations when the company is using RBAC.\r\n\r\n#### Reviewer resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2319**](https://mural.atlassian.net/browse/IAM-2319)\r\n- \ud83e\uddea [**iam-2319-wp-inv.mural.engineering**](https://iam-2319-wp-inv.mural.engineering)\r\n\r\nYou can also access the following workspace as a global admin to see some existing pending invitation for a company with RBAC enabled:\r\nhttps://iam-2319-wp-inv.mural.engineering/t/alphaworkspace9718/settings/members\r\n\r\n\"Screenshot\r\n\r\n### Related\r\n\r\n- https://github.com/tactivos/mural-api/pull/15362", + "labels": [] + }, + { + "number": 47081, + "title": "[CWI-2597] Add commit after applying afterDragEnd hook", + "branch": "beta-fix/cwi-2597", + "merged_at": "2026-02-09T21:07:23Z", + "changed_files": 2, + "additions": 1, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd commit after applying `afterDragEnd` hook\r\n\r\nSome changes were never committed after dragging a sticky note from a column to another. So the changes were not visible to the other participants in the mural until a commit was done (Probably on the next widget changes).\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2597\r\n\r\n", + "labels": [] + }, + { + "number": 47082, + "title": "Fix current zoom tool not showing child tools", + "branch": "stable-fix/current-zoom-childtools", + "merged_at": "2026-02-09T20:37:26Z", + "changed_files": 1, + "additions": 1, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFix current zoom tool not showing child tools, we forgot to remove a check that's no longer needed and is causing the current zoom tool to be inaccessible\r\n\r\nFixed:\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 47026, + "title": "[CWI-2581] Add transaction on Jira ticket updates", + "branch": "fix/cwi-2581", + "merged_at": "2026-02-09T20:13:05Z", + "changed_files": 15, + "additions": 561, + "deletions": 335, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR add transactional support to Jira sync to prevent inconsistent states, especially during undo/redo operations.\r\n\r\nThere was likely a synchronization issue where the ticket CE was not updated while the Widget and Jira CE were. This may have occurred during an undo/redo operation, since Jira sync does not currently use transactions.\r\n\r\nAs a result, when syncing, the outdated ticket CE is treated as a local change and the next sync pushes the old status back to Jira.\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2581", + "labels": [] + }, + { + "number": 47024, + "title": "[notetaker] remove mock data for note detail modal + implement \"add summary to modal\"", + "branch": "add/notetaker-add-summary-to-mural", + "merged_at": "2026-02-09T20:01:01Z", + "changed_files": 7, + "additions": 673, + "deletions": 149, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Removes mock data with actual payload from api\r\n- Hooks up \"add summary to mural\" button\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nDepends on an API PR (yet to be opened)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 47071, + "title": "Migrate core register functionality and dispatcher + tools api prereqs", + "branch": "register-dispatcher-files", + "merged_at": "2026-02-09T18:28:04Z", + "changed_files": 208, + "additions": 316, + "deletions": 274, + "body": "### Summary\r\n\r\nMigrates core register and dispatcher into `@muralco/canvas`, and moves tools-api builders into the canvas package as `@muralco/canvas/tools-api`. Consumers now import from canvas instead of `src/` paths.\r\n\r\nThe `@muralco/canvas/tools-api` package will be used for tools api functionality that is canvas specific. There are some usages of ToolsAPI related interfaces and functionality in non canvas parts of the product, these need to live in the `@muralco/tools-api` package. \r\n\r\n### Files moved (into `packages/canvas`)\r\n\r\n#### Dispatcher\r\n- `src/mural/dispatcher/extension-points.ts` \u2192 `packages/canvas/src/dispatcher/extension-points.ts`\r\n\r\n#### Register\r\n- `src/mural/register/index.ts` \u2192 `packages/canvas/src/register/create.ts`\r\n- `src/mural/register/util.ts` \u2192 `packages/canvas/src/register/util.ts`\r\n\r\n#### Helpers\r\n- `src/views/mural/ui/toolbar/button/util.ts` \u2192 `packages/canvas/src/helpers/toolbar-utils.ts`\r\n\r\n#### Tools API\r\n- `src/lib/tools-api/builders/selectors.ts` \u2192 `packages/canvas/src/tools-api/builders/selectors.ts`\r\n- `src/lib/tools-api/builders/tool/index.ts` \u2192 `packages/canvas/src/tools-api/builders/tool/tool.ts` (+ new `tool/index.ts`)\r\n- `src/lib/tools-api/builders/toolbar/index.ts` \u2192 `packages/canvas/src/tools-api/builders/toolbar/tool-instance.ts` (+ new `toolbar/index.ts`)\r\n- `src/lib/tools-api/builders/toolbar/index.test.ts` \u2192 `packages/canvas/src/tools-api/builders/toolbar/tool-instance.test.ts`\r\n- New: `packages/canvas/src/tools-api/index.ts`, `packages/canvas/src/tools-api/builders/index.ts`\r\n\r\n### Other changes\r\n\r\n- Imports in `src/` updated to `@muralco/canvas/register`, `@muralco/canvas/dispatcher`, `@muralco/canvas/helpers`, and `@muralco/canvas/tools-api`\r\n- Canvas webpack config and `package.json` updated for the `tools-api` entry", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 47045, + "title": "[ESC-1874] archived murals: Add tracking events", + "branch": "add/esc-1874-archived-mural-tracking", + "merged_at": "2026-02-09T16:04:34Z", + "changed_files": 17, + "additions": 708, + "deletions": 24, + "body": "Jira: [ESC-1874](https://mural.atlassian.net/browse/ESC-1874)\r\nTesting environment: https://esc-1874-archived-mural-tracking.mural.engineering/\r\n\r\n## Summary\r\n\r\nAdd tracking events related to actions on the Archived murals page and the archived mural notification bar:\r\n\r\n#### Archived murals page\r\n- page is viewed\r\n- unarchive mural\r\n- request unarchive mural\r\n- export mural\r\n- delete mural\r\n\r\n#### Archived mural notification bar\r\n- export mural\r\n- unarchive mural\r\n\r\nhttps://github.com/user-attachments/assets/7fd20998-7478-4c83-8dc1-bf124492252e\r\n\r\nhttps://github.com/user-attachments/assets/c5fe21bc-72ca-466a-8840-a5f3ac8fe420\r\n\r\nhttps://github.com/user-attachments/assets/98abab6b-c987-497e-847a-f7c92c0d934f\r\n\r\n\r\n[ESC-1874]: https://mural.atlassian.net/browse/ESC-1874?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46795, + "title": "TEM-105/update template sharing modal window to reflect \"truly public link\" behavior", + "branch": "add/update-template-modal-window", + "merged_at": "2026-02-09T15:43:37Z", + "changed_files": 12, + "additions": 331, + "deletions": 31, + "body": "[CPT-2484](https://mural.atlassian.net/browse/CPT-2484?atlOrigin=eyJpIjoiZjlkZTJhZGQxZDNjNDk1YmE0NTQzN2E3Yzk2ZDU5OGIiLCJwIjoiaiJ9)\r\nor [TEM-105](https://linear.app/mural/issue/TEM-105/update-template-sharing-modal-window-to-reflect-truly-public-link)\r\n\r\nUpdates\u00a0the template\u00a0share\u00a0link description\u00a0text\u00a0to support\u00a0the\u00a0\"Truly Public Template\u00a0Previews\" feature flag, while\u00a0ensuring\u00a0company-restricted links\u00a0retain\u00a0their original behavior.\r\n\r\n- Public links (feature flag ON): Show the new \"truly public\" wording \u2192 \"anyone\"\r\n- Company links (feature flag ON): Continue showing the original wording \u2192 \"anyone in your company with a Mural account\"\r\n- All links (feature flag OFF): Show original behavior (unchanged)\r\n\r\n

Logic\u00a0Overview

\r\n

Decision\u00a0Matrix

\r\n\r\nScenario | Feature\u00a0Flag | Link\u00a0Type | Description\u00a0Shown\r\n-- | -- | -- | --\r\nLink\u00a0exists | ON | Public | \"Share\u00a0this link to let\u00a0anyone\u00a0preview this template...\"\r\nLink exists | ON | Company | \"Share this link to bring\u00a0anyone in\u00a0your company with a Mural account\u00a0to this template...\"\r\nLink exists | OFF | Either | Original\u00a0description based on link\u00a0type\r\nNo\u00a0link, owned by me | ON | Public | \"Share\u00a0this link to let\u00a0anyone\u00a0preview\u00a0this template...\"\r\nNo link, owned by me | ON | Company | \"Share this link to bring\u00a0anyone in your company with a Mural account\u00a0to this template...\"\r\nNo link, not\u00a0owned by me | ON | Public | \"Public\u00a0links allow\u00a0anyone\u00a0to use this\u00a0template...\"\r\nNo link, not owned by me | ON | Company | \"Company\u00a0links allow\u00a0anyone in your company with\u00a0a Mural account\u00a0to use\u00a0this template...\"\r\n\r\n

Validation Video

\r\nI know this is a lot to digest! To make it a little easier, I\u2019ve recorded a video that walks you through my validation process. \r\nPlease watch this \ud83c\udfac loom video of the acceptance criteria for the above ticket : https://www.loom.com/share/b63f44b7d0e34d0da967dcff810a5236\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [CPT-2484](https://mural.at", + "labels": [] + }, + { + "number": 47079, + "title": "[stable-fix] Fix sending of empty key", + "branch": "stable-fix/jira-send-empty-key", + "merged_at": "2026-02-09T14:36:30Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Fix sending of empty key. This was accidentally introduced during a fix likely for resolving transient type errors while making changes.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 47068, + "title": "Fix git rev-parse for merge commits, add informative fallback log", + "branch": "stable-fix/better-deployment-watcher", + "merged_at": "2026-02-09T13:09:29Z", + "changed_files": 3, + "additions": 6, + "deletions": 3, + "body": "## Summary\n\n- **execSync array form**: Use `execSync('git', ['rev-parse', sha+'^2'])` to avoid shell interpreting `^` in `SHA^2`\n- **fetch-depth: 0**: Set in beta and stable deployment workflows so the second parent is available for merge commits\n- **Informative fallback log**: Log when second parent cannot be resolved (not a merge or shallow clone)\n- **Keep stderr visible**: Do not suppress git errors for debugging\n\nMade with [Cursor](https://cursor.com)", + "labels": [] + }, + { + "number": 47038, + "title": "[MFRD-3] Refactor the presentation mode toolbar so it stops blocking mouse events", + "branch": "fix/mfrd-3", + "merged_at": "2026-02-09T12:46:51Z", + "changed_files": 6, + "additions": 387, + "deletions": 47, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the presentation mode toolbar to prevent it from blocking mouse events. The previous implementation used a full-width transparent wrapper with opacity transitions that interfered with mouse interactions even when hidden. The new approach moves the toolbar into its own dedicated component with proper show/hide logic triggered by mouse proximity and hover states.\r\n\r\nChanges:\r\n\r\nRemoved the old full-width wrapper approach that was blocking mouse events\r\nCreated a dedicated PresentationControlsToolbar component with mouse/keyboard interaction handling\r\nImplemented proper auto-hide animation with throttled mouse move detection and hover state management\r\n\r\nLoom demo: https://www.loom.com/share/8a7e5148f04a45859f267b215082400d\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-3) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mfrd-3.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. ", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47039, + "title": "Update Suggest Title response schema", + "branch": "add/scqm-1640-aifeature-cost", + "merged_at": "2026-02-08T22:13:52Z", + "changed_files": 4, + "additions": 48, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR updates the Suggest Title response structure to match the changes in API, and adds the new `BaseAIOperationResponse` base type for all AI feature responses to extend for.\r\n\r\n**NOTE**: The new `usage` and `cost` props introduced here are to be used in a follow up effort.\r\n\r\nSee the [mural-api PR](https://github.com/tactivos/mural-api/pull/15356) for details on the important work of this effort.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1640) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1640-aifeature-cost.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15356)\r\n\r\n", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 47015, + "title": "[MFRD-99] Private mode logging and addition of \"activating\" state", + "branch": "update/activating-private-mode", + "merged_at": "2026-02-07T00:29:18Z", + "changed_files": 8, + "additions": 161, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis pr does two things: \r\n\r\n1. Adds an intermediary \"activating\" state that hides users typing while we're waiting for the private time initiation to begin with the intent that for very large murals with lots of stickies and people typing, this _may_ fix any typing that users see while private mode is activating in an environment that is moving a bit more slow / misconstrue as private mode not working. \r\n\r\n2. Adds logging to two areas for more insight into possible private mode issues:\r\n - The backend returning an undefined timestamp from the call to begin private time (i don't think this is happening often if ever, but I'd like to see) \r\n - I was pulling on a thread around timestamp skew between the client and the server potentially causing some of the issues we've heard reported so I added logging *after private mode begins* if you're actively updating a widget and its lastUpdated timestamp is somehow _prior_ to the private mode initial timestamp - meaning it could get filtered out of the widgets we update to appear hidden\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-99) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://activating-private-mode.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nRegression test private mode with multiple users. (I'll probably make the team test it out as a whole in our meeting tomorrow)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47061, + "title": "Add cursor skills for Jest testing, PR creation, and test generation", + "branch": "add/cursor-skills-and-tests", + "merged_at": "2026-02-06T20:56:06Z", + "changed_files": 7, + "additions": 16, + "deletions": 319, + "body": "Getting started migrating instructions to skills!\r\n\r\n- Add .agents/skills/jest-testing with SKILL.md (name/description frontmatter)\r\n- Link .cursor, .claude, .codex, .github skills dirs to .agents/skills\r\n- Remove .github/instructions/jest-testing.instructions.md\r\n- Add avoid any/unknown typings and Writing Tests section\r\n- Document test:unit:specific usage and typecheck-prevented test guidance\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Documentation/metadata and repository-structure changes only; main risk is misconfigured skill directory pointers or ownership patterns impacting tooling expectations.\n> \n> **Overview**\n> Migrates Jest/RTL testing guidance from `.github/instructions/jest-testing.instructions.md` into a new skill file `.agents/skills/jest-testing/SKILL.md` with skill `name`/`description` frontmatter, and wires multiple tool-specific `skills` directories (`.cursor`, `.claude`, `.codex`, `.github`) to point at the shared `.agents/skills` location.\n> \n> Extends the Jest guidance with a new *Writing Tests* section (including `test:unit:specific` invocation advice) and tightens mock-typing guidance by explicitly discouraging `any`/`unknown`. Updates `CODEOWNERS` to cover `SKILL.md`/`skills` and the new dot-directories.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e1e3fb98e0d6779bd825e75fe760f4084b8153d2. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47070, + "title": "[ESC-1874]-related Fix tracking dashboard events", + "branch": "fix/esc-1874-dashboard-tracking", + "merged_at": "2026-02-06T20:45:18Z", + "changed_files": 1, + "additions": 3, + "deletions": 0, + "body": "Jira: [ESC-1874](https://mural.atlassian.net/browse/ESC-1874)-related\r\nTesting environment: https://esc-1874-dashboard-tracking.mural.engineering/\r\n\r\n### Summary\r\n\r\nFix tracking dashboard events by adding an `identify()` call in `AuthenticatedUserConsumer`.\r\n\r\nCommit 0e0d7650787b5295e119b48d6ac016509766c9d9 introduced a regression where `identify()` is no longer called when loading the dashboard. Because the event tracker sends events for authenticated users only after `identify()` has been called[^1], it silently dropped dashboard events unless `identify()` was called in another area of the code. For example, if a user opened a mural from the dashboard, the mural view calls `identify()`, and dashboard events would be tracked once the user returns to the dashboard.\r\n\r\nMore specifically, loading the dashboard used to call `fetchUser()` to retrieve load the user data; that calls `identify()`. After the dashboard changed to use `AuthenticatedUserConsumer` to load the user data, `identify()` is not called and dashboard events are not tracked.\r\n\r\n### Testing\r\n\r\nTo reproduce, show verbose logs in the browser console, sign in to Mural and wait for the dashboard to load. Reload the page. Before this change, events are not tracked after reloading the page. After this change, events are tracked after reloading the page.\r\n\r\n### Example\r\n\r\nAs an example, the `VIEWED_ITEM_IN_DASHBOARD` event count dropped by about 25% after the regression was deployed on Oct. 30, 2025:\r\n\r\n\"viewed_item_in_dashboard_count\"\r\n\r\n
\r\nDatabricks query\r\n\r\n```sql\r\nselect action_date, count(*) from prod.cdp.fe_event\r\nwhere action_type_performed = 'VIEWED_ITEM_IN_DASHBOARD'\r\nand action_date > '2025-09-01'\r\nand action_date < '2026-02-01'\r\ngroup by 1\r\norder by 1\r\n```\r\n
\r\n\r\n[^1]: https://github.com/tactivos/murally/blob/b51e7b0c39bb18f1fa08b316acefa13b4", + "labels": [] + }, + { + "number": 47030, + "title": "[NEXT-429] refactor: migrate canvas sor business rules to integrations-platform", + "branch": "update/migrate-canvas-sor-to-integrations", + "merged_at": "2026-02-06T20:06:32Z", + "changed_files": 180, + "additions": 284, + "deletions": 284, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis pull request migrates System of Record (SOR) business rules, utilities, types, and test fixtures from @muralco/canvas/business to @muralco/integrations-platform/platform. The migration aims to decouple SOR functionality from the canvas package and consolidate it into a dedicated integrations platform package.\r\n\r\nChanges:\r\n- Migrated SOR utility functions (getWidgetGridPositions, isLatestSorModelVersion, isValidSorModelVersion) and types (GridPositionOptions, FieldIdentifier, CustomFieldIdentifier) from canvas to integrations-platform\r\n- Moved test utilities and types (TestRecordTypeBundle, TestContentExtension, etc.) to integrations-platform for better reusability\r\n- Migrated integration-specific test data and types for Salesforce, Rally, Asana, and Microsoft Planner\r\n- Updated all import statements across the codebase to reference the new package location\r\n- Added @muraldevkit/ui-toolkit as a peer dependency and @muralco/geometry as a regular dependency for integrations-platform\r\n- Updated TypeScript configuration to use React-specific config since the package now contains React components\r\n- Removed exported SOR business rules from the canvas package\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-429) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "frontend-next" + ] + }, + { + "number": 47060, + "title": "[CWI-2430] Update @muraldevkit/ui-toolkit to 4.61.2", + "branch": "update/cwi-2430", + "merged_at": "2026-02-06T19:29:25Z", + "changed_files": 2, + "additions": 5, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUpdate @muraldevkit/ui-toolkit to 4.61.2\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2430\r\n", + "labels": [] + }, + { + "number": 47063, + "title": "Move test specific dependencies to `devDependencies`", + "branch": "fix-mocks-deps", + "merged_at": "2026-02-06T18:56:48Z", + "changed_files": 4, + "additions": 78, + "deletions": 12, + "body": "Moves test specific packages from `dependencies` to `devDependencies`. ", + "labels": [] + }, + { + "number": 47065, + "title": "Improve wait-for-deployment: merge commits, docstrings, retagger gotchas", + "branch": "stable-fix/better-deployment-watcher", + "merged_at": "2026-02-06T18:39:13Z", + "changed_files": 1, + "additions": 62, + "deletions": 4, + "body": "## Summary\n\nImprovements to `scripts/wait-for-deployment.js`:\n\n- **Merge commit handling**: Accept the second parent (merged branch head) when the expected SHA is a merge commit, since the retagger retags without rebuilding and the container may have the pre-merge hash.\n- **JSDoc docstrings**: Add docstrings to all functions (`getAcceptableShas`, `getVersionFromUrl`, `sleep`, `main`).\n- **Retagger gotchas**: Document in the module header that the retagger only retags (no rebuild), reuses existing tree images, and may serve the original build hash.\n- **Inline comment**: Explain `git rev-parse ^2` (second parent of merge commit).\n\nMade with [Cursor](https://cursor.com)", + "labels": [] + }, + { + "number": 47057, + "title": "Add deployment watcher for beta and stable", + "branch": "stable-fix/better-deployment-watcher", + "merged_at": "2026-02-06T17:20:37Z", + "changed_files": 5, + "additions": 145, + "deletions": 38, + "body": "## Summary\n\nAdds a deployment watcher that polls the deployed app until the version comment in the HTML matches the pushed commit SHA.\n\n### Changes\n- **scripts/wait-for-deployment.js**: Node.js script that polls a URL, extracts `` from the HTML, and exits when it matches the expected commit\n- **beta-deployment.yml**: Waits for beta.mural.co to serve the pushed commit; cancels in-progress runs when a new push lands\n- **stable-deployment.yml**: Waits for app.mural.co to serve the pushed commit; cancels in-progress runs when a new push lands\n- **Removed**: alpha-deployment.yml, master-deployment.yml\n\n### Behavior\n- Polls every 30s, up to 15 minutes (configurable via env)\n- Concurrency: when a new push triggers a deployment, the previous run is canceled\n- Clear success/failure messages with the environment URL\n\nMade with [Cursor](https://cursor.com)", + "labels": [] + }, + { + "number": 47055, + "title": "[beta-fix] [CWI-2572] Handle required field errors", + "branch": "beta-fix/cwi-2572", + "merged_at": "2026-02-06T17:05:35Z", + "changed_files": 11, + "additions": 161, + "deletions": 152, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWhen we receive an error on submission for a field that indicates it is required, we now display that field so a user can fill it out. Jira Data Center does not reliably return required field information depending on instance/project configurations. This allows us to adapt to required fields without having to display _all_ possible fields a user could fill out (which would not be able to mark as required properly anyway).\r\n\r\nExisting code patterns for requiredFields was duplicated. It is not ideal and this whole component really needs a significant refactor but this did not seem the right time to do it for the goal of this fix.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the to understand the context of this effort.\r\n- Please see https://www.loom.com/share/fe079f2b621e45c7b25e00827a9c0dbe of the acceptance criteria for the above ticket\r\n- https://www.loom.com/share/a77d225d8b704bf9931122a185831b96 shows the fix still working after some refactoring\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-integrations/pull/1679\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r", + "labels": [] + }, + { + "number": 47053, + "title": "Improve CEs empty widget handling", + "branch": "fix/potential-issue", + "merged_at": "2026-02-06T15:21:07Z", + "changed_files": 3, + "additions": 20, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImplements defensive programming CEs handling for `duplicateWidgetsCEs` and improves fn documentation.\r\n\r\n#### Reviewer Resources\r\n- Relates to: https://github.com/tactivos/murally/pull/47029#discussion_r2773987432\r\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Small defensive guard and comment/docs updates in CE duplication/JMP helper layer; behavior only changes for empty `widgetIdRefs` inputs.\n> \n> **Overview**\n> Prevents no-op/invalid content-extension duplication by making `duplicateWidgetsCEs` return early when `widgetIdRefs` is empty.\n> \n> Improves developer-facing documentation for `getWidgetsCEsJMP` and `updateWidgetsCEsFromJMP`, clarifying behavior when widget IDs are omitted/empty (apply to all CEs vs. apply patch without ID replacement) and standardizing wording around JMP-related hooks.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 62129ff80fc63b95847a197f2a6e9c303297a3de. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47049, + "title": "Disable trackpad detection", + "branch": "fix/disable-trackpad-detection", + "merged_at": "2026-02-06T15:11:22Z", + "changed_files": 4, + "additions": 63, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis change is disruptive enough that it should be part of the rollout process of navigation changes\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+", + "labels": [] + }, + { + "number": 47056, + "title": "Remove paths to run in any situation", + "branch": "stable-fix/coforever", + "merged_at": "2026-02-06T14:30:17Z", + "changed_files": 1, + "additions": 0, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request makes a minor update to the workflow configuration for linting the `CODEOWNERS` file. The change removes the restriction that only pushes affecting the `CODEOWNERS` file or the workflow file itself trigger the workflow.", + "labels": [] + }, + { + "number": 47029, + "title": "Add CE support for duplicate actions", + "branch": "fix/ces-duplication", + "merged_at": "2026-02-06T12:58:57Z", + "changed_files": 6, + "additions": 100, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds Content Extension (CE) support for widget duplication actions, enabling CE data to be duplicated along with widgets when users duplicate them via keyboard shortcut (CMD+D) or drag-and-drop (ALT+drag).\r\n\r\n**Changes:**\r\n- Implements CE duplication logic through a new `duplicateWidgetsCEs` function that leverages existing JMP (JSON Merge Patch) infrastructure\r\n- Integrates CE duplication into both keyboard shortcut and drag-and-drop duplicate workflows\r\n- Fix a slight bug in the code that allowed re-enabling a previously disabled test\r\n\r\n#### Reviewer Resources\r\n- Closes https://mural.atlassian.net/browse/CWI-2279\r\n- Test Env: https://ces-duplication.mural.engineering/\r\n- How to smoke test in the test env? Check the [new scenarios added](https://github.com/tactivos/murally/pull/47029/changes#diff-f50ca9fa9c635ce6567cd15cd339ab5c98d9533370b070483d8188f5c6f953d4R35-R80) and replicate as much as possible manually... \r\n \n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Touches core duplication workflows and adds new CE update calls during duplicate/commit, which could impact persistence/performance or hook ordering for widgets with extensions.\n> \n> **Overview**\n> Widget duplication now also duplicates associated Content Extension (CE) data for both keyboard duplicate (`CMD+D`) and alt-drag duplication flows.\n> \n> This introduces `duplicateWidgetsCEs` (JMP-based) and wires it into `duplicate-selected-widgets` and `drag-selected-widgets` using the old\u2192new widget ID map, plus adds/updates tests (including re-enabling the previously disabled alt-drag persistence scenario) to assert CE payload cloning and grouped `PATCH /extensions` behavior.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit db6161d82ad21c208cc99c7003a86e1855c43a90. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47052, + "title": "Fix CODEOWNERS issues", + "branch": "fix/codeowners", + "merged_at": "2026-02-06T12:48:44Z", + "changed_files": 1, + "additions": 1, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request updates the `CODEOWNERS` to fix master related issues to this changes made as stablefix: https://github.com/tactivos/murally/pull/47044", + "labels": [] + }, + { + "number": 47051, + "title": "Backmerge conflict 2026-02-06", + "branch": "beta-fix/conflict-0a9abf7-b257aa4", + "merged_at": "2026-02-06T12:33:57Z", + "changed_files": 36, + "additions": 59, + "deletions": 39, + "body": "Unable to automatically merge 'stable' into 'beta' due to merge conflicts.\n\nHey please fix conflicts and merge this PR into beta\n\n# Merge instructions\n## Always use MERGE and do not SQUASH nor REBASE :point_down:\n```bash\ngit fetch\ngit checkout beta-fix/conflict-0a9abf7-b257aa4\ngit merge origin/beta\n```\n\n**Actually fix the conflict**\n```bash\ngit commit\ngit push origin HEAD\n```\n\n**Do not squash/rebase your commits.**\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Main risk is CI/tooling behavior changes (new workflow, split lint jobs, cache keys, broader lint scopes) which can cause unexpected CI failures or longer runtimes; runtime code changes are minimal beyond a dependency addition.\n> \n> **Overview**\n> Adds a new GitHub Action workflow to lint `CODEOWNERS` on pushes that touch the file, using a dedicated token secret.\n> \n> Updates the quality CI to split JS linting into separate `src` and `packages` tasks with independent eslint caches, and extends local tooling (`build/lint.sh`, `package.json` scripts, `lefthook.yml` globs) to support linting a configurable path and include `packages/` in prettier/stylelint runs.\n> \n> Includes merge-resolution style cleanups: CODEOWNERS rule adjustments, a few eslint suppression comments/newline fixes, minor formatting changes (e.g., `10 **`), and adds `react-router-dom` (+ types) to `packages/canvas` (and lockfile).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0505c97b3e4b8760379ddfbe7ee5b5dc691df916. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "beta-fix", + "backmerge-conflict" + ] + }, + { + "number": 47044, + "title": "Improve QA Validations", + "branch": "stable-fix/qa-improvements", + "merged_at": "2026-02-06T12:10:54Z", + "changed_files": 36, + "additions": 111, + "deletions": 41, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIntroduces new linting rules to improve project QA.\r\n- ESLint packages related code. And fixes the current offender code.\r\n- CODEOWNERS linting action. And fixes the current errors\r\n- Improves lefthooks to also run for packages\r\n\r\n#### Reviewer Resources\r\n- If it builds, works. Only cosmetic code changes\r\n- [Jira Ticket](https://www.youtube.com/watch?v=H3KpR6EyZX0)\r\n", + "labels": [] + }, + { + "number": 47028, + "title": "[NEXT-433] Continue moving sdk apis files", + "branch": "move/sdk-api-priority-2", + "merged_at": "2026-02-05T23:23:44Z", + "changed_files": 151, + "additions": 429, + "deletions": 349, + "body": "Test env: https://sdk-api-priority-2.mural.engineering\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Primarily a refactor/re-export move, but it changes public SDK surface area and import paths across many modules, so any missed export or subtle type/behavior mismatch could cause runtime breakages or downstream build failures.\n> \n> **Overview**\n> Continues the migration of SDK APIs into `packages/canvas`, **centralizing exports** so app code imports functionality from `@muralco/canvas/sdk/apis` rather than `src/mural`-local files.\n> \n> This exposes additional APIs/utilities via new or expanded barrel exports (AI chat dev history helpers + AI performance API, facilitation API factories/selectors, voting session proto helpers + vote calculator, theme minimap defaults + `selectActiveTheme`, content-extension selectors, widgets helpers like `addUpdateInfoToChanges`, `StrokeCache`, connector/quick-add/resize factories, remote-dragging cleanup, and multiple widget-change systems utilities).\n> \n> Several types are relocated into `packages/canvas` (notably `SidebarSdkApi` and `TranscriptSdkApi`) with corresponding deletions from `src/mural`, and downstream code/tests are updated to consume the new exported symbols and adjusted relative imports.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 765a4af992dcb4c92c3ca48d824f173fd8ef31d1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 47020, + "title": "[CWI-2477] [CWI-2540] Remove old Image Panel", + "branch": "remove/cwi-2477", + "merged_at": "2026-02-05T22:48:27Z", + "changed_files": 95, + "additions": 53, + "deletions": 3457, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Remove old Image Panel and related resources.\r\n- Remove Bing web search.\r\n- Remove old Giphy front-end.\r\n- Remove old Unsplash front-end.\r\n- Remove Adobe CC (Creative Cloud). Integration has already been disabled.\r\n\r\nThis is removing all of the old image panel in addition to just Bing search as much of it was related and there were shared imports across the components.\r\n\r\nThere is no intended change to the product experience. This is removing now unused code.\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use https://cwi-2477.mural.engineering/ to perform a smoke test.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/15345\r\n- https://github.com/tactivos/mural-integrations/pull/1677\r\n- https://mural.atlassian.net/browse/CWI-2477\r\n- https://mural.atlassian.net/browse/CWI-2540\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2", + "labels": [] + }, + { + "number": 47031, + "title": "[EN-3636] add workspace consolidation modal shell", + "branch": "feat/en-3636-add-modal-shell", + "merged_at": "2026-02-05T21:57:45Z", + "changed_files": 7, + "additions": 393, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds a shell modal for filling out the content of the new workspace consolidation modal\r\n- Works with both inline and bulk action flow triggers\r\n- Controls and local state for tracking the step/stage of the modal flow\r\n- Dynamic title/button content, back button visibility etc based on modal step\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3636) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nI've set up some workspaces under [internal-sso for convenience here](https://en-3636-add-modal-shell.mural.engineering/c/internal-sso/company/workspaces)\r\n- Ensure modal appears from both the bulk selection bar button and the inline action button\r\n- Ensure modal can be dismissed via cancel button and X icon\r\n- Ensure Back button and Continue buttons work as expected to advance/retreat in modal flow\r\n- Ensure title and button copy is updated as appropriate\r\n- Ensure no out-of-range error behavior (e.g. being able to go \"back\" past the initial screen)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### Ho", + "labels": [] + }, + { + "number": 47013, + "title": "Migrate helpers + SDK Context Prereqs", + "branch": "sdk-context-prereq", + "merged_at": "2026-02-05T21:24:21Z", + "changed_files": 131, + "additions": 345, + "deletions": 275, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n#### Files moved\r\n\r\nCode was moved into `packages/canvas` and re-exported so SDK/context code can depend on the canvas package instead of `src/mural`.\r\n\r\n**1. General helpers** \r\n`src/mural/helpers/` \u2192 `packages/canvas/src/helpers/`\r\n\r\n- `engine-positioning.ts`\r\n- `file-icon-catalog.ts`\r\n- `get-clusters-in-rect.ts`\r\n- `get-instruction-base64.ts`\r\n- `get-text-decoration.ts`\r\n- `gifs-surveillance.ts`\r\n- `image-lod.ts`\r\n- `is-array-different.ts`\r\n- `is-over-mural.ts`\r\n- `path-math.ts`\r\n- `sanitize-pasted-widgets.ts`\r\n- `shapes/get-shape-viewbox.ts`\r\n- `widgets-almost-equal.ts`\r\n- `widgets-format.ts`\r\n- `widgets-surveillance.ts`\r\n- `with-close-on-click-outside.tsx`\r\n\r\n**2. Facilitation helpers** \r\n`src/mural/helpers/facilitation/` \u2192 `packages/canvas/src/helpers/facilitation/`\r\n\r\n- `canvas-reactions/get-reaction-tooltip-text.ts` + canvas-reactions logic (old `canvas-reactions/index.ts` removed)\r\n- `follow/follow.ts`\r\n**3. Canvas views (reorg)** \r\nWithin `packages/canvas/src/views/`\r\n- `helpers.ts` moved into `views/helpers/`\r\n", + "labels": [] + }, + { + "number": 47040, + "title": "Rollout copy changes", + "branch": "fix/nav-onboarding-copy", + "merged_at": "2026-02-05T20:15:35Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMinor rollout copy changes\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 47019, + "title": "[NEXT-382] Remove redundant `getSelectionBoundingRect` function", + "branch": "fix/next-382", + "merged_at": "2026-02-05T18:58:35Z", + "changed_files": 15, + "additions": 70, + "deletions": 97, + "body": "**[NEXT-382 Inspect `helpers` folder and move geometry/math related functions into geometry package](https://mural.atlassian.net/browse/NEXT-382)**\r\n\r\nThis PR removes `getSelectionBoundingRect` in favor of `sdk.selection.getBounds()`, `sdk.widgets.getAabb()` or `widgetStore.getAabb()`. \r\n\r\nUpdated `Aabb.isEmpty()` function to work correctly with `NaN`.\r\n\r\nThe environment: https://next-382.mural.engineering/", + "labels": [] + }, + { + "number": 47041, + "title": "Refactor: move engine effects to Effects namespace", + "branch": "fix/simplify-engine-effects", + "merged_at": "2026-02-05T18:48:23Z", + "changed_files": 45, + "additions": 600, + "deletions": 741, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes an extraneous layer of abstraction in the engine-bridge effects.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatch", + "labels": [] + }, + { + "number": 46987, + "title": "[CWI-2429] Add alternative names to shapes so that they show up in search results", + "branch": "add/cwi-2429", + "merged_at": "2026-02-05T18:39:34Z", + "changed_files": 7, + "additions": 117, + "deletions": 83, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd alternative names to shapes so that they show up in search results\r\n\r\n[Screencast from 02-02-2026 04:00:49 PM.webm](https://github.com/user-attachments/assets/57c004c5-4970-4393-88ca-b855880fff1a)\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2429", + "labels": [] + }, + { + "number": 47037, + "title": "StickyNoteToJira - Reduce batch from 100 to 20", + "branch": "beta-fix/reduce-jira-batch", + "merged_at": "2026-02-05T18:25:23Z", + "changed_files": 1, + "additions": 2, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nStickyNoteToJira - Reduce batch from 100 to 20", + "labels": [] + }, + { + "number": 46859, + "title": "[BOP-74] Adds a function to handle citation formatting for Account Overview", + "branch": "add/account-plan-citations", + "merged_at": "2026-02-05T16:59:08Z", + "changed_files": 3, + "additions": 158, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWe added some instructions to the prompt to return a JSON object for all the sources used when creating the account overview.\r\n\r\nThis PR adds a function to handle that object and format it correctly in the text box of the template.\r\n\r\n\r\n### FEATURE FLAG:\r\nhttps://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-mu-mural-for-sales-citations/rules/development\r\n\r\n\r\n### NOTE:\r\nThis requires some infra changes, i.e. a change to the prompt in beta/ prod and a change to the template, to add the citations section.\r\n\r\nPlease DO NOT MERGE this PR until those changes are made.\r\n\r\nOnce the template is updated in prod, the code here should be updated to replace the CITATIONS_WIDGET_ID with the one from production.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://account-plan-citations.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. ", + "labels": [] + }, + { + "number": 46929, + "title": "Refine/unify add image logic", + "branch": "refine/unify-add-image-logic", + "merged_at": "2026-02-05T15:48:34Z", + "changed_files": 60, + "additions": 6039, + "deletions": 288, + "body": "## Ticket \ud83c\udfab \r\n\r\nhttps://mural.atlassian.net/browse/CWI-2567\r\n\r\n## What was changed and why? \ud83e\udd14 \r\n\r\nDemo Loom: https://www.loom.com/share/6aa0a2b3657d4fe6be603b15528096c6\r\n\r\nIt seems that Google has changed the html layout of their image search results, and when a user drags the images from the search results onto the canvas, they fail to upload onto the canvas.\r\n\r\nThis is because the urls for these images are now base64 encoded, and this was breaking uploads.\r\n\r\nIn order to handle this properly, we needed to make sure have the base64 asset go through the entire upload file flow, rather than adhoc, since we need to make sure users don't upload base64 data that is not supported by Mural.\r\n\r\n## Testing \ud83e\udd16 \r\n\r\n- Test Env: https://unify-add-image-logic.mural.engineering/\r\n- Added unit tests\r\n- Tested manually (see Loom)\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Refactors core mural upload paths (files/URLs) and introduces new base64 parsing/conversion that impacts user-facing uploads; broad changes are covered by new unit tests but could still affect edge-case upload behavior and notifications.\n> \n> **Overview**\n> Refactors mural asset uploading to a new `createUploadAssetsApi` pipeline, replacing the large inline `uploadAssets` implementation with composable steps for `byFiles` and `byUrls` (notifications, blocked/too-many checks, metadata extraction/positioning, sequential uploading, and error handling).\n> \n> Adds base64 data-URL support for URL uploads (e.g., Google image drag results) by introducing `@muralco/base-64` helpers `isBase64` and `base64ToFile`, and routing base64 links through the standard file-upload flow rather than ad-hoc URL handling.\n> \n> Moves/updates call sites (`file-preview`, `persistThirdPartyImage`, `update-natural-dimensions`) to use the new upload-assets utilities and exports `ByUrlMetaData` from canvas dispatcher types.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4644e98723daeff", + "labels": [] + }, + { + "number": 46983, + "title": "[IAM-2328] Couple UI changes to workspace users when on RBAC", + "branch": "fix/iam-2328-minor-ui", + "merged_at": "2026-02-05T14:08:02Z", + "changed_files": 7, + "additions": 37, + "deletions": 45, + "body": "### Summary of changes\r\n\r\n- When the company is using RBAC, use the \u201cRole\u201d\u00a0column and allow sorting by it\r\n- For the \u201cLicense\u201d column, only show two values: Member / Guest\r\n- Revert back the quick filter to filter by \u201cLicense\u201d (All / Member / Guest)\r\n\r\n#### Reviewer resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2328**](https://mural.atlassian.net/browse/IAM-2328/)\r\n- \ud83e\uddea [**iam-2328-minor-ui.mural.engineering**](https://iam-2328-minor-ui.mural.engineering/)\r\n\r\nYou can also use this workspace directly if you are a **Global Admin** to see the changes:\r\nhttps://iam-2328-minor-ui.mural.engineering/t/alphaworkspace4468/settings/members\r\n\r\n\"Screenshot\r\n\r\n### Related\r\n\r\n- https://github.com/tactivos/mural-api/pull/15305", + "labels": [] + }, + { + "number": 47034, + "title": "[CAN-8206] Fix arrow absorption when connecting to grouped widgets (continued)", + "branch": "fix/arrow-absorption-desc", + "merged_at": "2026-02-05T13:03:38Z", + "changed_files": 1, + "additions": 12, + "deletions": 21, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIn the [previous PR](https://github.com/tactivos/murally/pull/47025) we implemented a fix to an issue regarding absorbed arrows interacting with grouped widgets.\n\nThe fix consisted in having grouped widgets inside a cluster to be considered as part of the cluster too.\n\nHowever, a review made a note that the same issue applied with nested areas too, making it aware that this was an issue for all kind of nested clustering, not just groups.\n\nTherefore, a second fix was applied to use ancestor lookup instead of direct parent.\n\n---\n\nI got to thinking over night about this: if this now applies to all types of nested clustering, wouldn't that apply to grouped widgets as well without needing to make a special consideration for them?\n\nYes. Yes they would.\n\nThat is why this PR removes the group specific case and generalizes the behavior.\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8206)\r\n- \ud83e\uddea [**Testing environment**](https://arrow-absorption-desc.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 47027, + "title": "Update `move-to-package` to handle converting internal package imports to relative paths. ", + "branch": "move-to-package-package-imports", + "merged_at": "2026-02-04T23:39:48Z", + "changed_files": 6, + "additions": 1136, + "deletions": 7, + "body": "## Pull request overview\r\n\r\nThis PR enhances the `move-to-package` refactoring tool to handle internal package imports when moving files into a package. \r\n\r\nExample: when a file is moved into `@muralco/utils` and imports symbols from that same package (e.g., `import { X } from '@muralco/utils'`), those imports are now converted to relative imports pointing to the actual defining files (e.g., `import { X } from './path/to/x'`).\r\n\r\n## Summary\r\n- Adds support for converting package barrel imports to relative imports when moving files into a package\r\n- When a file is moved into `@muralco/utils`, imports like `import { X } from '@muralco/utils'` are now converted to `import { X } from './path/to/x'` pointing at the actual defining file\r\n- Introduces new `move-to-package-internal-imports.ts` module with symbol resolution logic that follows re-exports to find original definitions\r\n- Handles edge cases: dist/.d.ts to src/.ts path normalization, multi-file symbol splitting, type-only imports", + "labels": [] + }, + { + "number": 47022, + "title": "[NEXT-424] migrate all companies global admin view (take 2 \ud83d\ude44)", + "branch": "feat/next-424-migrate-all-comps", + "merged_at": "2026-02-04T23:23:19Z", + "changed_files": 30, + "additions": 283, + "deletions": 225, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoves all **view** level code and dependencies (components, helpers, etc.) for the `/me/companies` route to the `@muralco/company-settings` package\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-424) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-424-migrate-all-comps.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nMostly moving files around, and I was able to migrate some old V1 tests \ud83c\udf89 but we should thoroughly [test the affected view](https://next-424-migrate-all-comps.mural.engineering/me/companies) (you will need to be a global admin to access - can modify your user's `profiles` document with `globalAdmin: 'edit'` in the db if needed).\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] Old cucumber tests migrated or deleted\r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+princip", + "labels": [] + }, + { + "number": 47021, + "title": "[FEP-6425] - remove packages docs script", + "branch": "remove-packages-docs-script", + "merged_at": "2026-02-04T22:28:03Z", + "changed_files": 241, + "additions": 108, + "deletions": 1743, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6425](https://mural.atlassian.net/browse/FEP-6425)\r\n\r\n#### Remove docs script and api-extractor / api-documenter\r\n \r\n- Stop generating API docs via api-extractor and api-documenter.\r\n- Remove all related config, scripts, and dependencies from the repo.\r\n\r\n#### Summary of changes\r\n\r\n- Dropped the root docs script and the CI job that ran it; removed the generate-docs shell script and the turbo docs task.\r\n- Removed the docs script and @microsoft/api-extractor devDependency from all packages, and deleted every package-level api-extractor.json.\r\n- Removed shared api-extractor config from @muralco/config and the api-documenter ignore from Knip.\r\n- Removed @microsoft/api-documenter from root devDependencies.\r\n- Updated root and package READMEs so they no longer mention npm run docs, api-extractor, or api-documenter.", + "labels": [] + }, + { + "number": 47025, + "title": "[CAN-8206] Fix arrow absorption when connecting to grouped widgets", + "branch": "fix/arrow-absorption-with-groups", + "merged_at": "2026-02-04T22:20:42Z", + "changed_files": 2, + "additions": 177, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug when trying to connect an arrow inside an area to a grouped widget inside the same area.\r\n\r\n_This PR:_\r\n![Feb-04-2026 16-21-56](https://github.com/user-attachments/assets/84d1efb4-6a3a-4104-a183-33a881fea163)\r\n\r\n_Master:_\r\n![Feb-04-2026 16-21-48](https://github.com/user-attachments/assets/9a4db3b7-3844-4a58-b532-fb6f3c61c6c0)\r\n\r\n### The issue\r\nThe problem was in the connector absorption system. This system runs an algorithm to find, according to some specific rules, the best suitable widget to parent the arrow after an action has taken place.\r\n\r\nOne of these rules state that an arrow should be absorbed by a parent P if it's connected on one side to a widget inside P.\r\n\r\nBecause of this rule, when moving the arrow near the grouped widget we were switching back and forth between connecting to a widget inside P (the group) and a widget _not_ inside P (the grouped widget whose true parent is the group, not P).\r\n\r\nThe fix consists in adding a consideration for grouped widgets: if a widget W is inside a group G, and the group G is inside parent P, we'll consider W to be inside P _only for this best suitable parent lookup_.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8206)\r\n- \ud83e\uddea [**Testing environment**](https://arrow-absorption-with-groups.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46985, + "title": "[BOP-147] Add company website field to LinkedIn import flow", + "branch": "add/company-website-to-person-search", + "merged_at": "2026-02-04T20:52:47Z", + "changed_files": 7, + "additions": 70, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR wires companyWebsite through the API so the worker receives it: the route and dispatcher handler now pass companyWebsite into the FETCH_LINKEDIN_BY_NAME operation and queue payload. On the worker, company-website matching only runs when normalization succeeds; normalizeWebsiteUrl was moved to a helper that returns null on parse failure so we skip the website clause instead of sending a bad hostname. Normalization strips common subdomains (e.g. corporate, www) so URLs like https://corporate.exxonmobil.com/ become exxonmobil.com, and the Coresignal query matches both experience.company_website.domain_only and experience.company_website with that normalized value. Tests were added for normalizeWebsiteUrl.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://linear.app/mural/issue/BOP-147/coresignal-updates-add-company-website-field-to-linkedin-import-flow) to understand the context of this effort.\r\n Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/4677405ca76146629b2c06a426ff8185) of the acceptance criteria for the above ticket \r\n- \ud83e\uddea Please use this [**testing environment**](https://company-website-to-person-search.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15307)\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Medium risk because it changes the request contract for the `FETCH_LINKEDIN_BY_NAME` operation by threading an optional `companyWebsite` through multiple layers; mismatches with backend expectations or falsy/empty handling could affect enrichment results.\n> \n> **Overview**\n> Adds optional `companyWebsite` support to the LinkedIn \u201cuser by name\u201d operation: the content API client (`getLinkedInUserByName`) and ", + "labels": [ + "bop" + ] + }, + { + "number": 47017, + "title": "[MFRD-23] Hide comment widgets while in presentation mode", + "branch": "fix/mfrd-23", + "merged_at": "2026-02-04T20:28:20Z", + "changed_files": 2, + "additions": 161, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nComments are now automatically hidden from the canvas when entering presentation mode through the existing presentation mode hook handler, using the engine hide/show API.\r\n\r\nBefore change:\r\n\"Screenshot\r\n\r\n\r\nAfter change:\r\n![2026-02-04 11 46 48](https://github.com/user-attachments/assets/20144669-da0c-4e85-8a22-4f59dd7c0c8a)\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-23) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mfrd-23.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you sh", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47003, + "title": "ESC-1898: data retention copy changes", + "branch": "add/esc-1898", + "merged_at": "2026-02-04T20:18:55Z", + "changed_files": 13, + "additions": 81, + "deletions": 76, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Copy Changes for data retention\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Mostly text/copy updates across modals and cards, plus a small JobRuns rendering tweak to show an explicit empty state when no jobs exist; low risk with minor UX/regression potential around conditional rendering and tests.\n> \n> **Overview**\n> Updates UI copy across data-retention flows (policy creation/editing, run-job scheduling, cancel-schedule confirmation, job results) and the archived murals unarchive modal.\n> \n> Improves the jobs table UX by rendering it whenever a retention `policy` exists (not only when job runs exist) and adds an explicit `MrlTableEmptyState` message for \u201cno jobs yet\u201d; associated tests and a small style tweak (`.policy-description` centering) are updated accordingly.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 020d2538de4fce43c517f86f5270c7a351a68b29. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46970, + "title": "Improved text handling when merging cells. Now texts that are not in the default cell are merged in the remaining cell too when the remaining cell has no text.", + "branch": "fix/can-8310", + "merged_at": "2026-02-04T19:19:00Z", + "changed_files": 3, + "additions": 222, + "deletions": 6, + "body": "## Summary of Changes\r\nPreserved table\u2011cell text when merging by copying the first non\u2011empty cell\u2019s textContent in reading order into the keep (top\u2011left) cell when the keep cell is empty. Added unit tests for copy behavior, keep\u2011cell preservation, and reading\u2011order selection, plus updated table\u2011cell text mocks in the merge\u2011cells tests.\r\n\r\n## Case Solved\r\nMerging cells ignored text in non top\u2011left cells when the top\u2011left cell was empty, so the merged cell ended up blank even though one of the merged cells had content.\r\n\r\n## How the Change Fixes It\r\nBefore deleting merged cells, the merge flow now:\r\n\r\n- Checks if the kept cell has text.\r\n- If not, sorts the selected cells by row/column index (reading order) and picks the first non\u2011empty cell.\r\n- Copies that cell\u2019s full textContent (text + format) into the keep cell, then proceeds with the merge in the same transaction (so undo/redo includes it).\r\n\r\n## Tests\r\n- Tests validate the new behavior and ensure keep\u2011cell content isn\u2019t overwritten when it already has text.\r\n- \r\nReviewer Resources\r\n\ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8310)\r\n\ud83e\uddea [ENV](https://can-8310.mural.engineering/)\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Changes merge behavior to copy formatted `textContent` from another selected cell into the keep cell, which can affect user-visible table content and undo/redo/persistence ordering. Risk is mitigated by added unit coverage, but edge cases around reading-order selection and text-source choice (local/editing only) could surface.\n> \n> **Overview**\n> Preserves table-cell text when merging by **copying the first non-empty selected cell (in row/column reading order) into the keep/top-left cell** when the keep cell has no text, including format via `getCellFormat` and using only local/editing text (not remote).\n> \n> Adds targeted unit tests covering text-copy behavior, keep-cell non-overwrite, and reading-order selection, and updates merge-cell test mocks to model `tableCell.getTe", + "labels": [] + }, + { + "number": 47002, + "title": "[MFRD-28] Deleted ignored test", + "branch": "add/mfrd-28", + "merged_at": "2026-02-04T19:01:29Z", + "changed_files": 1, + "additions": 3, + "deletions": 161, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR re-writes an existing ignored test for the buffer management of the realtime presence avatars.\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47023, + "title": "Extend number of prev wheel events to 4 to cover trackpad inertia in Firefox Mac", + "branch": "fix/wheel-trackpad-detection-mac-firefox", + "merged_at": "2026-02-04T18:32:23Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, when swiping with the trackpad producing some inertial panning in Firefox Mac, a zoom might accidentally happen. Processing four events instead of three is enough to avoid that.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the", + "labels": [] + }, + { + "number": 46963, + "title": "[CAN-8276] Move widgets to top after dropping and absorbing", + "branch": "fix/ordering-resizing", + "merged_at": "2026-02-04T18:18:59Z", + "changed_files": 26, + "additions": 702, + "deletions": 392, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR implements a new business rule that is triggered every time there's an absorption happening as a consequence of a user action.\r\nThis business rule will proceed to move widgets to the top of the stacking order when they get a new parent, making sure that they maintain their relative ordering when more than one widget is contained within the same operation.\r\n\r\nThis rule is only executed when the `ENABLE_STACKING_ORDER` system is disabled, since that system executes the same logic but as a system side-effect.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8276)\r\n- \ud83e\uddea [**Testing environment**](https://ordering-resizing.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 47007, + "title": "[BC-1259] Remove widgets from embed endpoint response", + "branch": "refactor/embed-content", + "merged_at": "2026-02-04T18:04:24Z", + "changed_files": 3, + "additions": 10, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n`/api/v0/murals/:muralId/embed` and `/api/v0/templates/:templateId/embed` should not return `widgets` as it is not a content endpoint.\r\n\r\nThis PR updates the types to reflect that.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatch", + "labels": [] + }, + { + "number": 47011, + "title": "CAN-8380 Add detection of trackpad wheel events for Windows Chrome, Edge and Firefox", + "branch": "fix/wheel-trackpad-detection-win", + "merged_at": "2026-02-04T17:29:19Z", + "changed_files": 6, + "additions": 263, + "deletions": 92, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the heuristic for detection vertical only trackpad wheel events worked only for Mac Chrome, Safari and Firefox\r\nNow, with these changes, it also works detecting those events in Windows Chrome, Edge and Firefox. For Chrome and edge, wheel events are always fired as multiples of 100, for Firefox, trackpad events are fractional while wheel events are integers.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://wheel-trackpad-detection-win.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE", + "labels": [] + }, + { + "number": 46998, + "title": "[NEXT-430] Move SDK API files with 3 or more imports per Brandon's list", + "branch": "move/sdk-api-priority", + "merged_at": "2026-02-04T16:39:47Z", + "changed_files": 143, + "additions": 328, + "deletions": 268, + "body": "https://sdk-api-priority.mural.engineering\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor of the public `@muralco/canvas/sdk/apis` surface (many re-exports moved/removed) and widespread import rewrites, which can cause compile/runtime breakage if any consumers rely on the old paths/exports. Functional logic changes are minimal, but the change touches many integration points (widgets/changes, viewport, facilitation, content-extension).\n> \n> **Overview**\n> **SDK API surface reshuffle:** Promotes several previously deep/internal modules to first-class `@muralco/canvas/sdk/apis` exports (e.g. `createTextApi`, `createTableApi`, `RightBarSdkApi`, `selectIsLaserActive`, `selectAppMode`/`selectMuralSummary`, inking selectors, viewport `fitToContent`/`getStateFromViewportManager`, widget-changes apply helpers, and connector/absorption utilities) and updates many app/business/tests to import from the SDK barrel.\n> \n> **Cleanup + dependency:** Removes a handful of legacy/unused exports (e.g. `AIPillUsageInfo`, `CalloutFlow`, some feature/socket/share/native/onboarding/participants exports), makes some selectors internal-only, and adds `json-merge-patch` as a Canvas dependency to support the now-SDK-exported content-extension `patchCE`/staging utilities.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ee000466fa7e0e10c91e54c82d97f8de3826b61e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46989, + "title": "[ESC-1908] Add \"Archived murals\" menu item to canvas profile menu ", + "branch": "add/esc-1908-canvas-menu", + "merged_at": "2026-02-04T15:33:58Z", + "changed_files": 18, + "additions": 221, + "deletions": 78, + "body": "Jira: [ESC-1908](https://mural.atlassian.net/browse/ESC-1908)\r\nTesting environment: https://esc-1908-canvas-menu.mural.engineering/\r\n\r\n### Summary\r\n\r\nAdd \"Archived murals\" menu item to the canvas profile menu. Because we can't directly access company settings in the context of the canvas, change how we determine whether a user should see the Archived murals page. We now check the user's `view.archivedMurals` permission, which is connected to the company setting on the backend.\r\n\r\nTo continue to allow our team to see the Archived murals page during the development cycle, a user flag is supported to override the permission.\r\n\r\nhttps://github.com/user-attachments/assets/98d2db54-c454-4c82-87df-259b65092992\r\n\r\n\r\n### Companion pull requests\r\n\r\n- https://github.com/tactivos/mural-api/pull/15308\r\n\r\n[ESC-1908]: https://mural.atlassian.net/browse/ESC-1908?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 47009, + "title": "Fix edit right bar experience", + "branch": "fix/rightbar-editor", + "merged_at": "2026-02-04T14:28:34Z", + "changed_files": 4, + "additions": 163, + "deletions": 122, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixes the edit right bar experience by preventing conflicting editor states when users interact with ticket text fields. When a user focuses on a ticket text input, any currently active widget editor is now stopped, preventing UI conflicts. The tab before this changes produced text lost and the creation of a new widget.\r\n\r\n**Changes:**\r\n- Added `onFocus` handler to `TicketTextEditor` that stops current widget editing when the text field receives focus.\r\n- Reorganized test files: moved tests from `ticket-text-editor-with-label.test.tsx` to a new `ticket-text-editor.test.tsx` file with improved test coverage\r\n- Other minor stuff\r\n\r\n#### Reviewer Resources\r\n- Partially closes: https://mural.atlassian.net/browse/CWI-2535\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### How to test this?\r\n\r\nScenario 1. The current ticket workflow is not affected\r\n1. Create a planner. \r\n2. Create a ticket in the planner (double-click on it). \r\n3. Edit the text within the ticket editor. Hit tab and continue creating. \r\n4. The experience is the same as any other ticket, and the right bar reflects this data\r\n\r\nScenario 2. Right bar task control over widget edition\r\n1. Create a planner. \r\n2. Create a ticket in the planner (double-click on it). \r\n3. Focus on the Right bar Summary. Edit it.\r\n4. Lose the focus (click out or tab). The content should be reflected in the canvas. The tab move to the next dom component\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Touches ticket text editing behavior by calling `dispatcher.widgets.edit.stopCurrent()` on focus, which could affect editor-state coordination and requires the dispatcher to expose `widgets.edit` in all contexts. Test updates reduce regressi", + "labels": [] + }, + { + "number": 47012, + "title": "[CWI-2554] Remove legacy masonry; Fix spacing", + "branch": "add/cwi-2554", + "merged_at": "2026-02-04T14:00:19Z", + "changed_files": 4, + "additions": 21, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n- Remove use of legacy masonry component. Flex allows for variable columns based on content dimensions. Content no longer \"jumps\" during infinite scroll when masonry recomputes.\r\n- Fix spacing\r\n- Remove link in photo attribution. Link to profile is in photo viewer. This prevents accidental opening of tab when trying to add an image.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2554 to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murall", + "labels": [] + }, + { + "number": 46986, + "title": "Migrates Share Modal from `src/views/mural/share` to `@muralco/share-modal`", + "branch": "share-modal-package", + "merged_at": "2026-02-04T00:12:40Z", + "changed_files": 166, + "additions": 578, + "deletions": 380, + "body": "## Summary\r\n\r\nThis PR extracts the share modal functionality into a standalone reusable package (`@muralco/share-modal`). This architectural change improves code organization, enables better separation of concerns, and allows the share modal to be consumed by different parts of the application (canvas, dashboard) through a clean API.\r\n\r\nTest env: https://share-modal-package.mural.engineering\r\n\r\n### Key Changes\r\n\r\n- **New Package**: Created `packages/share-modal/` with proper package configuration (webpack, jest, typescript, eslint)\r\n- **Component Migration**: Moved share modal components from `src/views/mural/modals/share/` to the new package\r\n- **Shared Test Utilities**: Moved permission-related test helpers to `@muralco/test-mocks` for reuse across packages\r\n- **Integration Layer**: Added new entry point in `packages/canvas/src/views/share-modal/` to connect the package with canvas state\r\n\r\n### Package Structure\r\n\r\n```\r\npackages/share-modal/\r\n\u251c\u2500\u2500 src/\r\n\u2502 \u251c\u2500\u2500 canvas/ # Main share modal components\r\n\u2502 \u2502 \u251c\u2500\u2500 components/ # Reusable subcomponents (dropdown, link-invite-widget)\r\n\u2502 \u2502 \u251c\u2500\u2500 share-modal.tsx\r\n\u2502 \u2502 \u251c\u2500\u2500 permissions.tsx\r\n\u2502 \u2502 \u251c\u2500\u2500 members-list.tsx\r\n\u2502 \u2502 \u2514\u2500\u2500 ...\r\n\u2502 \u251c\u2500\u2500 types/ # TypeScript type definitions\r\n\u2502 \u2514\u2500\u2500 utils/ # Utility functions (validation, settings, csv, etc.)\r\n\u2514\u2500\u2500 package.json\r\n```", + "labels": [] + }, + { + "number": 47010, + "title": "Updates Test Rigs to have default `cacheTime` of 0", + "branch": "test-rig-query-cache", + "merged_at": "2026-02-03T21:46:18Z", + "changed_files": 4, + "additions": 22, + "deletions": 5, + "body": "Test env: https://test-rig-query-cache.mural.engineering", + "labels": [] + }, + { + "number": 46932, + "title": "Fixed issue where merging row/column with interconnected widgets breaks the connection", + "branch": "fix/can-8337", + "merged_at": "2026-02-03T21:07:51Z", + "changed_files": 7, + "additions": 556, + "deletions": 14, + "body": "## Summary of Changes\r\nReworked table cell merge persistence and undo/redo to keep collaborator views consistent without changing realtime update behavior. Updates now persist in two phases (updates before deletes), and undo/redo replays the same ordering via a dedicated MergeCellsStep.\r\n\r\n## Case Solved\r\nMerging table cells with child widgets (including connectors) could leave collaborators with missing widgets or detached connections until a refresh or local movement. This could also affect the originator in certain undo/redo paths, not just synced users.\r\n\r\n## How the Change Fixes It\r\n\r\n### Fix undo ordering by splitting persistence into two commits inside the same transaction:\r\n\r\n- **Persist updates before deletes** so remote clients receive reparent/span updates before the merged-away cell is removed (persistence applies deletes before updates within a commit).\r\n- **Split commits:** update commit (span + reparent + system-derived changes), then delete commit.\r\n- **Dedicated undo/redo step (MergeCellsStep)** replays the same order on redo and restores deleted cells with keepPartOfId on undo, preventing invalid table states after refresh.\r\n- **Realtime remains authoritative:** no systems are run on remote UPDATE_WIDGET paths; the server patch is the source of truth.\r\n\r\n### Tests\r\n- Added a regression assertion for persistence call ordering (updates before deletes)\r\n- Updated the undo persistence test harness to correctly accumulate diffs across multiple commits within a single transaction\r\n- Added regression coverage for realtime table-cell `colSpan`/`rowSpan` updates using the systems path\r\n\r\n## Reviewer Resources\r\n\ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8336)\r\n\ud83e\uddea [ENV](https://can-8337.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 47008, + "title": "Small improvements on the `Hints` section of the widget inspector", + "branch": "refactor/hints-inspector", + "merged_at": "2026-02-03T19:35:07Z", + "changed_files": 4, + "additions": 23, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds some minor improvements to the `Hints` section of the widget inspector to give it less relevance than what it has right now.\r\nIt basically has a smaller size, it starts collapsed by default and then some minor visual tweaks.\r\n\r\nThe idea behind this is to give more relevance to the widget properties, which is the main usage we give to the widget inspector\r\n\r\n\ud83c\udf0e **Test env**: https://hints-inspector.mural.engineering/\r\n\r\n_This PR:_\r\n![Feb-03-2026 14-37-12](https://github.com/user-attachments/assets/a73ae80f-4a82-413a-b55c-c2a4f9b9651b)\r\n\r\n_Master:_\r\n![Feb-03-2026 14-37-20](https://github.com/user-attachments/assets/de5b9a78-4885-4e0a-967e-3b6790e792a0)\r\n", + "labels": [] + }, + { + "number": 46966, + "title": "[CWI-2427] Fix issue with collapsing sections in search results", + "branch": "fix/cwi-2427", + "merged_at": "2026-02-03T19:17:21Z", + "changed_files": 22, + "additions": 299, + "deletions": 312, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix issue with collapsing sections in search results\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2427", + "labels": [] + }, + { + "number": 46984, + "title": "[NEXT-428] Move selection/selectors to package", + "branch": "move/selection-selectors", + "merged_at": "2026-02-03T19:06:03Z", + "changed_files": 93, + "additions": 239, + "deletions": 181, + "body": "Test environment:\r\nhttps://selection-selectors.mural.engineering\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor of shared selection selectors and imports across many toolbar/AI modules; while logic is largely unchanged, mis-typed state shapes or missing exports could break selection-dependent UI in subtle ways.\n> \n> **Overview**\n> **Selection selectors are now exported from `@muralco/canvas/sdk/apis`.** `packages/canvas/src/sdk/apis/selection/index.ts` re-exports selection selectors (e.g. `selectSelectedWidgets`, `selectSelectionBounds`, `selectOnlyArrowsSelected`).\n> \n> **Consumers are migrated to the new import path.** Many AI addons, toolbar/fixed-toolbar tools, and view components switch from local `mural/sdk/apis/selection/selectors` imports to `@muralco/canvas/sdk/apis`, and related tests update mocks accordingly.\n> \n> **Selector implementation is relocated/decoupled.** `packages/canvas` selection selectors update their internal imports (helpers, primitives, state slices, viewport selectors) and adjust some selector inputs/typing, without changing the overall selection computation behavior.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 57fa40b1e4dc5358718cd9e22c60c3250218dce7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46955, + "title": "[CWI-2561] Add annotations for emojis", + "branch": "add/cwi-2561-annotations", + "merged_at": "2026-02-03T18:22:16Z", + "changed_files": 10, + "additions": 334, + "deletions": 174, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Add English annotations for emojis as static resource to murally.\r\n- Add loading of annotations when Image Panel is mounted.\r\n- Add matching on annotations based on user search query. If annotations are unavailable for some reason they are not factored into the search.\r\n- Move debounce to user input from search. This ensure all side-effects of user input are triggered consistently and do not have to be individually managed.\r\n- Cache annotations locally. localStorage cache expires after 1 day.\r\n\r\nBefore:\r\n\"image\"\r\n\r\n\r\nAfter:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2561 to understand the context of this effort.\r\n- Please see https://www.loom.com/share/64285abca5794a739ad4ad6a0ee7b29c of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use https://cwi-2561-annotations.mural.engineering to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug", + "labels": [] + }, + { + "number": 46999, + "title": "CAN-8379 More reliable trackpad wheel event detection", + "branch": "fix/wheelevent-trackpad-detection", + "merged_at": "2026-02-03T17:54:43Z", + "changed_files": 1, + "additions": 48, + "deletions": 26, + "body": "Prior to this changes, trackpad detection considered any dual axis event coming in the last second as an indicator. But this meant that Magic Mouse users had an erratic behavior, where they often get a few moments of wheel to zoom until any horizontal axis movement happens which moves to pan. \r\n\r\nNow, with these changes, we detect any dual axis event as a trackpad event, but added special heuristics to detect single axis events that are likely from a trackpad. In Mac, trackpad events are always integers in both Chrome and Safari, while mouse wheel events have decimal points. In Mac Firefox, mouse wheel events are also integers but always multiple of 16, so we have a special case to detect that.\r\n\r\nThis has been tested with Mac Chrome, Mac Safari and Mac Firefox with a Magic Mouse, a Macbook Trackpad and a Logitech wheel mouse. \r\n\r\nFurther work is needed to add heuristics for high precision trackpads in windows Chrome, Edge and Firefox.\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` ta", + "labels": [] + }, + { + "number": 47005, + "title": "[CWI-2579] Fix - Bulk sync issue when record not found", + "branch": "beta-fix/cwi-2579", + "merged_at": "2026-02-03T17:31:44Z", + "changed_files": 2, + "additions": 15, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - Bulk sync issue when record not found\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2579", + "labels": [] + }, + { + "number": 46992, + "title": "[MFRD-47] Prevent timer popover keyboard focus outline from being clipped", + "branch": "fix/timer-overflow", + "merged_at": "2026-02-03T17:23:25Z", + "changed_files": 2, + "additions": 7, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThere's some styling from the `MrlPopover` component that's causing the keyboard focus on the timer menu buttons from getting cut off. Adding a new wrapper to override it. \r\n\r\nBefore:\r\n\"Screenshot\r\n\r\nAfter:\r\n\"Screenshot\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-47) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://timer-overflow.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nTo test:\r\n1. Open timer\r\n2. Use tab key to navigate to the timer controls \r\n3. Verify the highlight is no longer clipped\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 47001, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-final", + "merged_at": "2026-02-03T16:48:33Z", + "changed_files": 307, + "additions": 791, + "deletions": 870, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `RegisterState` and `MuralState` into canvas package.\r\n\r\nThe environment: https://next-356-final.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Medium risk due to a broad refactor that touches many imports and state initialization paths; any mismatch in the new exported `MuralState.getInitial`/`RegisterState.initial` shapes could cause runtime regressions despite mostly type-level changes.\n> \n> **Overview**\n> Moves the canonical `MuralState` and `RegisterState` definitions (plus initial-state builders) into `packages/canvas/src/sdk/state` and exports them via `@muralco/canvas/sdk/state`, including new `mural` and `register` state modules.\n> \n> Updates the app and tests to consume these new exports (replacing `mural/sdk/state/types`, `register/types`, and the local tools-api `RegistrableTool` types), deletes the old `src/lib/tools-api/registration/types.ts`, and adds `@muralco/tools-api` as a `packages/canvas` dependency.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f89870cdd84ad49c8e9334d17d5f3f603b09368f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46923, + "title": "[BOP-101] companyResearch API files and functions should be renamed to account for accountResearch", + "branch": "update/research-company-name", + "merged_at": "2026-02-03T16:37:53Z", + "changed_files": 7, + "additions": 21, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis FE PR is supporting BE naming changes made in https://github.com/tactivos/mural-api/pull/15264\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://linear.app/mural/issue/BOP-101/companyresearch-api-files-and-functions-should-be-renamed-to-account) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://research-company-name.mural.engineering)\r\ndemo: https://www.loom.com/share/4f047377d34e412280f8df6f231ca47d\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15264)\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Medium risk because it changes the realtime action name for a worker-delivered operation and updates shared SDK typings; mismatches between FE/BE event names or payload shape could break research result delivery.\n> \n> **Overview**\n> Updates the \u201ccompany research\u201d realtime operation to use **sales-intelligence** naming across the shared API/realtime/canvas types: `CompanyResearchResponse` becomes `SalesIntelligenceResponse`, and the success event/action switches from `COMPANY_RESEARCH_READY` to `SALES_INTELLIGENCE_READY`.\n> \n> Propagates the new event/type through the canvas operations SDK and the mural client realtime processor, and updates the research-mural UI code/tests to consume the renamed response type.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 32020d45a91030b90d51b905e49f925c8e9550b9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46968, + "title": "[CWI-2421] Fix margin/spacing/sizing issues in panel", + "branch": "update/cwi-2421", + "merged_at": "2026-02-03T15:45:01Z", + "changed_files": 4, + "additions": 42, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix margin/spacing/sizing issues in panel\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2421", + "labels": [] + }, + { + "number": 46964, + "title": "[ESC-1906] Data retention: remove beta badge from data retention sidebar & archived murals", + "branch": "update/esc-1906", + "merged_at": "2026-02-03T15:15:00Z", + "changed_files": 4, + "additions": 1, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAs title says. Removes beta badges for data retention features & archived murals\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\r\n\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3576) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation ", + "labels": [] + }, + { + "number": 46995, + "title": "Fixes github-script result output for find-PR step", + "branch": "fix/comment-unowned-result-output", + "merged_at": "2026-02-02T23:33:44Z", + "changed_files": 1, + "additions": 7, + "deletions": 6, + "body": "## Summary\r\n- Use script return value instead of `core.setOutput` (github-script only exposes `result`)\r\n- Add `result-encoding: string` and `return ''` when no PR for reliable downstream condition\r\n- Downstream steps use `steps.find-pr.outputs.result` for `issue-number`", + "labels": [] + }, + { + "number": 46994, + "title": "Fixes gh CLI dependency for self-hosted runners", + "branch": "fix/comment-unowned-self-hosted-runner", + "merged_at": "2026-02-02T23:09:35Z", + "changed_files": 1, + "additions": 19, + "deletions": 10, + "body": "## Summary\n- Replaces `gh` CLI usage with `actions/github-script` for self-hosted runner compatibility in the comment-unowned workflow\n\n## Test plan\n- [ ] Verify workflow runs successfully on self-hosted runners\n- [ ] Confirm PR comments are created when unowned files are detected", + "labels": [] + }, + { + "number": 46988, + "title": "fix: update mural users modal form test to avoid timeouts", + "branch": "chore/fix-flaky-package-test", + "merged_at": "2026-02-02T22:40:14Z", + "changed_files": 1, + "additions": 16, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSplits a test with multiple UI interactions into multiple tests to avoid flakiness / timeouts\r\n\r\n#### Reviewer Resources\r\nTest code change only; passing build means \ud83d\udea2 it\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46991, + "title": "Switches CI workflows to self-hosted runners", + "branch": "fix/use-self-hosted-runners-for-ci-workflows", + "merged_at": "2026-02-02T22:06:30Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "## Summary\r\n\r\n- Switches `comment-unowned.yml` and `detect-conflict.yml` workflows from `ubuntu-latest` to `[self-hosted, linux, small]`\r\n\r\n## Why\r\n\r\nGitHub Actions hosted runners are currently experiencing a **major outage** (started 2026-02-02T19:03 UTC):\r\n- https://www.githubstatus.com/incidents/xwn6hjps36ty\r\n- Jobs are failing with \"job was not acquired by Runner of type hosted\"\r\n\r\nThese lightweight workflows can safely run on our self-hosted runners, consistent with the main build workflow which already uses self-hosted runners.\r\n\r\n## Changes\r\n\r\n| Workflow | Before | After |\r\n|----------|--------|-------|\r\n| `comment-unowned.yml` | `ubuntu-latest` | `[self-hosted, linux, small]` |\r\n| `detect-conflict.yml` | `ubuntu-latest` | `[self-hosted, linux, small]` |\r\n\r\n## Related\r\n\r\n- https://github.com/tactivos/mural-api/pull/15311", + "labels": [] + }, + { + "number": 46952, + "title": "[NEXT-280] package user profile view", + "branch": "feat/next-280-package-profile-view", + "merged_at": "2026-02-02T21:11:25Z", + "changed_files": 109, + "additions": 600, + "deletions": 1523, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR moves the view level code (and all sub components, utilities, etc.) for the `/me/profile` route to a new `@muralco/user-settings` package. This is an initial PR toward migrating the \"user dashboard\" family of routes (`/me/*` to the packaging system\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-280) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-280-package-profile-view.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nMostly moving files, so a passing build should give us some confidence, but a thorough smoke test of the `/me/profile` route in the testing environment would be good:\r\n- Trigger/walkthrough the \"cannot delete account\" modal\r\n- Trigger/walkthrough the \"change email confirmation\" modal\r\n- Trigger/walkthrough the \"delete account\" modal\r\n- Update avatar\r\n- Other?\r\n\r\n### Required Checklist for Author\r\n- [] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good", + "labels": [] + }, + { + "number": 46975, + "title": "[MFRD-100]Handle unauthed usage of authenticatedPost to get ABTesting variation when opening templates modal", + "branch": "fix/mfrd-100", + "merged_at": "2026-02-02T20:44:43Z", + "changed_files": 1, + "additions": 3, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nOpening the templates modal was causing unauthenticated visitors to be redirected to the sign-in page. The issue was we are calling the optimizelyApi when loading the templates modal, getProductLedGrowth3Variant is being called each time, which returns a 401 error code if the user hasn't signed in.\r\n\r\nOriginal Bug report: https://mural.atlassian.net/browse/MFRD-100\r\n\r\nWith these changes, we do not make the call if the user is not authenticated. I also shared this issue with the Growth team to review the experiment itself. We found out it's been running for 4 months, setting the same variant for all users, so it seems it can be refactored and no longer query optimizely, however this is not in the scope of this effort.\r\n\r\n\"image\"\r\n\r\n\r\nNotes: \r\nWhile the original task asked for the templates button to be hidden as a quick-fix, we decided to keep the button for now and go ahead with this fix to handle all cases where this might happen (both current and in the future), and if we decide to hide the button we will create a separate task.\r\n\r\nLoom demo: https://www.loom.com/share/9fff5fcea21048c1a8931e095d415027\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-100) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://MFRD-100.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this c", + "labels": [] + }, + { + "number": 46942, + "title": "[CWI-2422] Unified Shapes and Cloud Icons - Section header adjustments", + "branch": "update/cwi-2422", + "merged_at": "2026-02-02T20:09:13Z", + "changed_files": 9, + "additions": 23, + "deletions": 106, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUnified Shapes and Cloud Icons - Section header adjustments\r\n\r\n\"Screenshot\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2422", + "labels": [] + }, + { + "number": 46981, + "title": "[CAN-8369] Unlock widgets on editing stop", + "branch": "fix/can-8369", + "merged_at": "2026-02-02T19:27:50Z", + "changed_files": 1, + "additions": 2, + "deletions": 0, + "body": "**[CAN-8369 Unlocked sticky notes cannot be moved or edited](https://mural.atlassian.net/browse/CAN-8369)**\r\n\r\nThis PR fixes comparison for legacy `text` field. Now `undefined`, `null`, and `\"\"` are considered as the same empty value.\r\nPreviously because of different `text` the dited sticky was considered as modified. At the same time backend do not send any updates expected by other side.\r\n\r\n> [!WARNING] \r\n> We still have race condition. If server update comes faster then the realtime message, we have a locked widget.\r\n\r\nThe environment: https://can-8369.mural.engineering/\r\n\r\n## Before\r\n\r\n\r\n\r\n![2026-02-02 19 37 50](https://github.com/user-attachments/assets/ad06885d-009e-4bdb-8e01-7d7708d4d0c4)\r\n\r\n\r\n\r\n\r\n\r\n![2026-02-02 19 44 15](https://github.com/user-attachments/assets/7d9eaa0f-8912-4378-8f1c-6a75433643ae)\r\n\r\n\r\n\r\n## After\r\n\r\n\r\n\r\n![2026-02-02 19 40 45](https://github.com/user-attachments/assets/56103218-e86b-49aa-95b5-7e93fd97d2c7)\r\n\r\n\r\n\r\n\r\n\r\n![2026-02-02 19 47 34](https://github.com/user-attachments/assets/3a3d6d06-1323-4a6b-92ac-2c6481e871ab)\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Low risk: a small comparator change in sticky editing change-tracking that only affects whether an edit is considered modified when `text` is empty-ish.\n> \n> **Overview**\n> Prevents sticky notes from being marked as modified solely due to legacy `text` field differences by updating the tracked-property comparator to treat `undefined`/`null`/`\"\"` as equivalent empty values. This reduces false-positive \u201cchanged\u201d edits and helps avoid leaving widgets locked after editing ends when no real content change occurred.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit aea48731f59f6b7fb0306f3d7c3d22c9db55e0bf. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46950, + "title": "[CWI-2522] Fix - Shape panel search behavior", + "branch": "fix/cwi-2522", + "merged_at": "2026-02-02T18:42:42Z", + "changed_files": 12, + "additions": 108, + "deletions": 166, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - Shape panel search behavior\r\n\r\n[Screencast from 01-29-2026 01:37:13 PM.webm](https://github.com/user-attachments/assets/3e037f6c-e405-4f01-82e0-5a42d192bb6f)\r\n\r\n#### Jira Ticket\r\nhttp://mural.atlassian.net/browse/CWI-2522\r\n\r\n", + "labels": [] + }, + { + "number": 46958, + "title": "[NEXT-422] Migrate high and medium priority business rules", + "branch": "update/migrate-high-priority-business-rules", + "merged_at": "2026-02-02T18:32:20Z", + "changed_files": 82, + "additions": 198, + "deletions": 149, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR migrates high and medium priority business rules and utilities from local application directories to shared packages in @muralco/canvas. The migration improves code reusability and consolidates common functionality into a shared package that can be used across the codebase.\r\n\r\nChanges:\r\n\r\n- Migrated orthogonal arrow utilities from src/mural/components/widgets/arrow/orthogonal-util.ts to packages/canvas/src/components/widgets/arrow/orthogonal-util.ts with proper exports\r\n- Migrated label utility functions (getWidgetLabelId, isLabelType, etc.) from local business logic to packages/canvas/src/business/labels/utils.ts with proper exports\r\n- Migrated lineHeightToPixels helper from src/mural/helpers/line-height.ts to packages/canvas/src/helpers/line-height.ts and added to package exports\r\n- Migrated Salesforce common types from local integration files to packages/canvas/src/business/system-of-record/integrations/salesforce/common/types.ts\r\n- Migrated bottom-bar-menu utility functions to packages/canvas/src/addons/core/bottom-bar-menu/util.ts\r\n- Created and migrated StringFilterDefinition class to packages/canvas/src/business/system-of-record/types/search/filters/string.tsx\r\n- Migrated ExportRecordsWidgetInfo type to packages/canvas/src/business/system-of-record/components/export-records-modal/types.ts\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-422) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "frontend-next" + ] + }, + { + "number": 46978, + "title": "Code package analysis", + "branch": "code-package-analysis", + "merged_at": "2026-02-02T18:21:45Z", + "changed_files": 13, + "additions": 810, + "deletions": 0, + "body": "Migrating the **code package analysis** tool from local usage into the **murally** monorepo so it can be run via `npx muralco-refactoring-tools`.\r\n\r\n## What the utility does\r\n\r\nThe **code-packages** command analyzes how code is distributed between `src/` and `packages/` in the monorepo. It:\r\n\r\n- **Counts lines of code** in TypeScript, JavaScript, JSON, and SASS/SCSS under `src/` and under each package in `packages/`.\r\n- **Excludes** build artifacts (`dist`, `build`, `.turbo`), dependencies (`node_modules`), tests (`.test.*`, `.spec.*`, `test/`, `__tests__`), and generated files (`.d.ts`, `.min.js`).\r\n- **Prints a modularization report** to stdout with totals for `src/` vs `packages/`, per-package line/file counts, and a summary of the top packages by size.\r\n\r\nUsage: `npx muralco-refactoring-tools code-packages [--root=/path/to/monorepo]`. When run from within the murally repo without `--root`, it uses the repo root automatically.", + "labels": [] + }, + { + "number": 46980, + "title": "refactor: move src/lib/tools-api/well-known.ts to @muralco/tools-api \u2026", + "branch": "tools-api-well-known", + "merged_at": "2026-02-02T18:13:13Z", + "changed_files": 156, + "additions": 179, + "deletions": 176, + "body": "Moves `well-known.ts` tools-api definition to `packages/tools-api`", + "labels": [] + }, + { + "number": 46967, + "title": "[MFRD-54] Fix timer dropdown while running", + "branch": "fix/timer-dropdown-while-running", + "merged_at": "2026-02-02T17:46:55Z", + "changed_files": 2, + "additions": 124, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\nBug: Currently, when the timer is running, clicking the \"Timer\" option in the top bar facilitation menu does *not* open the timer menu. \r\n\r\nFix: I'm not sure historically how it ended up here - but that timer menu essentially got controlled by two sources of truth - facilitation state and local component state - and when they got out of sync it blocked the menu from opening. So my fix is to create a single source of truth - the facilitation state. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-54) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://timer-dropdown-while-running.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nTo test:\r\n1. Start a timer\r\n2. Open facilitation menu in top bar and select timer again \r\n3. Verify the menu actually opens\r\n4. Regression test the timer: start / pause / add and remove time / let the timer run out naturally / manually end\r\n\r\nhttps://www.loom.com/share/4aec5b73134243f0b96e6794a2bb685a\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46979, + "title": "[CWI-2578] Load jira-cloud CE data before showing migration prompt", + "branch": "beta-fix/cwi-2578", + "merged_at": "2026-02-02T17:32:22Z", + "changed_files": 2, + "additions": 3, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\nLoad jira-cloud CE data before showing migration prompt\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2578", + "labels": [] + }, + { + "number": 46974, + "title": "[CWI-2577] Remove company integrations settings for Giphy, Unsplash, Bing", + "branch": "remove/cwi-2577-unused-settings", + "merged_at": "2026-02-02T16:36:31Z", + "changed_files": 13, + "additions": 0, + "deletions": 544, + "body": "\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis only removes the settings. Full removal of settings/references to DB entries will be later.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2577 to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46957, + "title": "[NEXT-165] move create and rename folder modals ", + "branch": "move/create-rename-modals", + "merged_at": "2026-02-02T15:36:11Z", + "changed_files": 16, + "additions": 74, + "deletions": 11, + "body": "Move components and functions related to the folder modals Create and Rename to package muralco/dashboard-modals/room\r\n\r\nMoved\r\n* CreateFolder, CreateFolderRegistration\r\n* RenameFolder, RenameFolderRegistration\r\n* folder tracking functions (recordMoveFolder, recordCreateFolder, etc) \r\n\r\ntest-env\r\nhttps://create-rename-modals.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Moderate risk because it changes how core folder modals/actions are registered and how tracking is imported, which could break folder UI flows if exports or registrations are miswired. No new auth/data behavior is introduced beyond dependency and wiring changes.\n> \n> **Overview**\n> Centralizes the **Create Folder** modal registration and **Rename Folder** folder-action registration inside `@muralco/dashboard-modals-room`, and updates the room page and folder-actions tests to import these registrations from the package.\n> \n> Moves folder tracking helpers into the same package and switches the move-folder modal to call `tracking.recordMoveFolder()` from `@muralco/dashboard-modals-room`.\n> \n> Updates `dashboard-modals-room` dependencies/exports and adds unit tests to assert the new registration metadata contracts.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 716557b79c8f05914155c00e7a1b7cede9b4a7a5. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46940, + "title": "Add/en 3575 consolidate", + "branch": "add/en-3575-consolidate", + "merged_at": "2026-01-31T03:06:28Z", + "changed_files": 8, + "additions": 200, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds inline menu item to \"Consolidate\" workspace\r\nhttps://mural.atlassian.net/browse/EN-3575\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3575) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46971, + "title": "Update CODEOWNERS", + "branch": "update/codeowners-updates", + "merged_at": "2026-01-31T00:17:12Z", + "changed_files": 1, + "additions": 18, + "deletions": 85, + "body": "## Reasons for changes:\r\n\r\nfeatures/canvas/keyboard/in-canvas/facilitation -> src/test/react-new/features/canvas/keyboard/in-canvas/facilitation/:\r\n- [This PR](https://github.com/tactivos/murally/pull/43419/changes) migrated logic from rig 1 to rig 2\r\n\r\nRemoval of features/modals/mural-settings/themes/:\r\n- https://github.com/tactivos/murally/pull/43536/changes\r\n\r\npackages/admin -> packages/settings:\r\n- [Found a time when the admin package existed](https://github.com/tactivos/murally/tree/e5ff48a276bcc76d883b6dc2025238267d2a413c/packages/admin/src/views/general-settings) and realized the code was in packages/settings\r\n\r\nRemoval of packages/billing-utils:\r\n- https://github.com/tactivos/murally/pull/46680\r\n\r\nRemoval of packages/company-settings\r\n- There is no packages/company-settings. And this is a rule to state that it's unowned, so kind of unnecessary.\r\n\r\nOwnership of patches/@cucumber+cucumber+7.3.1.patch:\r\n- There was a typo.\r\n\r\nRemoval of src/company:\r\n- Lost track of the PR, but src/company turned into packages/settings/company-settings/src/views and packages/settings is already owned by tactivos/admin.\r\n\r\nRemoval of src/company/development/integrations:\r\n- [Found a time when it existed](https://github.com/tactivos/murally/blob/decfa50260ab23c55e908c1d8871518f87735ad1/src/company/development/integrations/integrations-list.tsx) and tracked the code down to packages/integrations, which workflows already owns.\r\n\r\nRemoval of src/company/pages/async-reports:\r\n- Now lives in packages/admin-reports, which data team already owns.\r\n\r\nRemoval of src/company/pages/reports:\r\n- Now lives in packages/admin-reports, which data team already owns.\r\n\r\nRemoval of src/lib/dragging-helpers:\r\n- Now lives in packages/canvas, which is already owned by canvas-core-nav\r\n\r\nRemoval of src/mural/addons/ai/ai-linkedin - \r\n- Removed in https://github.com/tactivos/murally/pull/46699/changes\r\n\r\nRemoval of src/mural/addons/core/canvas-presentation-experiment/:\r\n- Removed in https://github.com/ta", + "labels": [] + }, + { + "number": 46948, + "title": "[FIX SCQM-1620] Fix and change Semantic Search setting in company setting - global admins", + "branch": "fix/scqm-1620", + "merged_at": "2026-01-30T21:41:56Z", + "changed_files": 6, + "additions": 128, + "deletions": 59, + "body": "### Summary of Changes and Resources for the Reviewer\r\nhttps://mural.atlassian.net/browse/SCQM-1620\r\n\r\n\r\n## before\r\n\r\nhttps://github.com/user-attachments/assets/abe92c9e-9dbd-4afa-8b7a-c4f91029ae31\r\n\r\n## after\r\n\r\nhttps://github.com/user-attachments/assets/9a5b4efc-56dd-4f95-a9e5-c2ffb8f10fc7\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15295)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46916, + "title": "[NEXT-415] Continuing to migrate sdk apis", + "branch": "refactor/sdk-api-cont", + "merged_at": "2026-01-30T17:47:46Z", + "changed_files": 122, + "additions": 374, + "deletions": 308, + "body": "Test environment:\r\nhttps://sdk-api-cont.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor that moves/rewires many SDK APIs and selectors and updates dozens of imports; risk is mainly integration/typing mismatches or missed import paths rather than new business logic.\n> \n> **Overview**\n> Continues the SDK migration by moving additional APIs/selectors into `packages/canvas/src/sdk/apis` (including `apps`, `assets`, `clipboard`, `config`, `experiments`, `menus`, `mouse`, `notification-bar`, `onboarding`, `outline`, `preview-mode`, and a new `focus-mode` selector) and exporting them from `@muralco/canvas/sdk/apis`.\n> \n> Updates the app to consume these centralized exports (replacing various `src/mural/sdk/apis/*` selector imports), and removes legacy local implementations for `experiments`, `outline` selectors, and `focus-mode` selector.\n> \n> Adds new memoized selectors for outline widgets and preview-mode previewing widgets, adjusts some state typings in migrated APIs/tests, and adds `@muralco/media` as a canvas dependency to support asset upload tracking.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9dc018f33370355a7276117172a258843fe52f02. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46910, + "title": "[NEXT-420] Convert ErrorModalController to DashboardModalsManager pattern", + "branch": "move/errormodal-controller", + "merged_at": "2026-01-30T16:38:53Z", + "changed_files": 19, + "additions": 472, + "deletions": 400, + "body": "Move ErrorModal to new DashboardModalsManager pattern\r\n\r\ntest-env\r\nhttps://errormodal-controller.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Changes central error handling UI wiring across dashboard flows by replacing `ErrorModalController` with `DashboardModalsManager` registrations; regressions could prevent errors from being surfaced or closed correctly. Type signature changes to modal `open()` may break callers if not updated everywhere.\n> \n> **Overview**\n> **Migrates the dashboard error modal to the `DashboardModalsManager` pattern.** Adds a new `DashboardErrorModal` + `dashboardErrorModalRegistration` and wires an `error` modal into the workspace dashboard provider so consumers call `modalDefinitions.error.open({...})`.\n> \n> Replaces `ErrorModalController` usage in dashboard flows (e.g. search errors, rooms load failure, folder create/rename/move failures) with the new modal definition and uses the manager\u2019s `close()` to dismiss it.\n> \n> Refactors `DashboardModalsManager` typings to be generic per-modal (`DashboardModalRegistration`, `DashboardModalDefinition`) and introduces `DashboardErrorModalOpenArgs`; removes the old PubSub-based controller implementation and its tests, updating/adding tests accordingly.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d08e1bc94af7425c3251fb86b2ba7559512b49db. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46894, + "title": "[ESC-1871] Add scoped deletions to company deletion UI", + "branch": "add/esc-1871-scoped-deletions", + "merged_at": "2026-01-30T16:14:56Z", + "changed_files": 19, + "additions": 1538, + "deletions": 359, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the deletion scope shown was disabled.\r\nNow, with these changes: \r\n- The deletion scope is not disabled anymore\r\n- The deletion scope is shown in the dashboard table of the deletion tool\r\n- The deletion scope is sent to the schedule and data endpoints\r\n- The summary of each selected workspace entity counts is added on ws select\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical ", + "labels": [] + }, + { + "number": 46941, + "title": "[IAM-2326] fix: convert guest to member", + "branch": "fix/iam-2326-convert-member", + "merged_at": "2026-01-30T16:00:35Z", + "changed_files": 5, + "additions": 63, + "deletions": 0, + "body": "### Summary of changes and resources for the reviewer\r\n\r\nWhen the company is using RBAC, we do not need to ask for the discrete permissions that we are assigning to the member (create rooms, see open rooms, publish templates). So we are removing this step from the flow when the company is using RBAC.\r\n\r\n#### Reviewer resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2326**](https://mural.atlassian.net/browse/IAM-2326)\r\n- \ud83e\uddea [Workspace `alphaworkspace9647` on iam-2326-convert-member.mural.engineering](https://iam-2326-convert-member.mural.engineering/t/alphaworkspace9647)\r\n- \ud83c\udfac Demo below\r\n\r\n\r\nhttps://github.com/user-attachments/assets/d50d88b4-84c2-4fe5-aec4-1fdd6a61461d\r\n\r\n", + "labels": [] + }, + { + "number": 46962, + "title": "Remove isTeamPlusPlan from a/b experiment", + "branch": "stable-fix/a-b-test", + "merged_at": "2026-01-30T14:19:55Z", + "changed_files": 1, + "additions": 1, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nisTeamPlusPlan was on the A/B experiment when it shouldn't be so the optimizely values weren't working right.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Co", + "labels": [] + }, + { + "number": 46886, + "title": "Fix scale factor when adding widgets - CWI-2457", + "branch": "fix/scale-added-widgets", + "merged_at": "2026-01-30T13:52:36Z", + "changed_files": 16, + "additions": 578, + "deletions": 29, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nExplanation in previous closed PR: https://github.com/tactivos/murally/pull/46619\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatc", + "labels": [] + }, + { + "number": 46934, + "title": "Improve Cucumber Distributed Running Implementation", + "branch": "stable-fix/refactor-dist-cucumber", + "merged_at": "2026-01-30T11:11:35Z", + "changed_files": 20, + "additions": 390, + "deletions": 168, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nReorganizes and improves the Cucumber distributed test (AKA React Test Rig) runner infrastructure with a focus in improve clarity on discovering issues, and future improvements, and at the same time reducing duplicated config.\r\n\r\n**Changes:**\r\n- Reorganized cucumber-cluster directory structure with dedicated folders for common utilities, patch files, scripts, and reporters\r\n- Consolidated GitHub Actions workflows by creating a reusable `cucumber-rig-runner.yml` that handles both producer and consumer roles. Removed deprecated `cluster-runners.yml` workflow and theme configuration\r\n- Add notification and information of the dispatched consumer to allow traceability of errors for the remote workflow. For future reference, this could be improved once the next feature in API Workflow dispatch operation are released by GH:\r\n\t- https://github.com/orgs/community/discussions/9752\r\n\t- https://github.blog/news-insights/product-news/lets-talk-about-github-actions/ \r\n- Improve documentation around code and a proper `README.md`\r\n\r\n#### Reviewer Resources\r\n- No productive changes, so if it builds and executes the test, it works\r\n\r\n- The process would work as usual, except from some minimum changes\r\n\t- Now it's clear the role of the \"Producer\" and the \"Consumer\" in the run itself.\r\n\t- If a run is successful ([like this one](https://github.com/tactivos/murally/actions/runs/21451789569/job/61782476376?pr=46934)) then:\r\n\t\t- [x] The _Dispatched Consumer_ jobs inform the consumer's runs related to this execution\r\n\t- If a run fails ([like this one](https://github.com/tactivos/murally/actions/runs/21451262311/job/61780820443?pr=46881)), then:\r\n\t\t- [x] The _Producer run_ also informs of how to access the consumer's run if needed for troubleshooting.\r\n\r\n- Draft PR where this approach was tested in several scenarios: https://github.com/tactivos/murally/pull/46881\r\n\r\n- [Jira ticket](https://www.youtube.com/watch?v=HwVh8pmOot4) \r\n\r\n#### ", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46927, + "title": "Phase 2 : Migrate UI components from src/ui to @muralco/legacy-ui package", + "branch": "modularize-src-ui-2", + "merged_at": "2026-01-29T23:27:13Z", + "changed_files": 93, + "additions": 272, + "deletions": 318, + "body": "### Summary\r\n\r\nThis PR continues the modularization of UI code by moving additional components from `src/ui` into `packages/legacy-ui` (`@muralco/legacy-ui`), reorganizing existing legacy-ui components with proper barrels and exports, and updating all consumers across the monorepo.\r\n\r\n---\r\n\r\n### Migration Overview\r\n\r\n#### Components moved: `src` \u2192 `packages/legacy-ui`\r\n\r\n| Component | From (src) | To (packages/legacy-ui) |\r\n|-----------|-------------|-------------------------|\r\n| **Card** | `src/ui/card/` | `packages/legacy-ui/src/ui/components/card/` |\r\n| **File Uploader Experiment** | `src/ui/file-uploader-experiment/` | `packages/legacy-ui/src/ui/components/file-uploader-experiment/` |\r\n| **Dropdown / Select** | Added subfolders `select/folders/` and `select/members/` with index files; updated internal imports to use relative paths within the package instead of `@muralco/legacy-ui`. |\r\n| **Progress Bar** | Added `index.ts` barrel; now exported from main `packages/legacy-ui/src/ui/components/index.ts`. |\r\n\r\n#### New in `src`\r\n\r\n| Added | Purpose |\r\n|-------|---------|\r\n| `src/ui/skiplinks/dashboard-config.tsx` | Dashboard skiplinks extracted from `mural-config.tsx` so mural config only handles mural views. |\r\n\r\n---\r\n\r\n### Detailed file changes\r\n\r\n#### 1. Card (`src/ui/card` \u2192 `packages/legacy-ui/.../card`)\r\n\r\n| Action | File |\r\n|--------|------|\r\n| **Moved** | `body.tsx`, `card.tsx`, `footer.tsx`, `header.tsx`, `image.tsx`, `style.sass` |\r\n| **Added** | `index.ts` (barrel), `legacy-card.tsx` (wrapper preserving `Card` + `Card.Body` etc. API) |\r\n| **Deleted** | `src/ui/card/index.tsx` |\r\n\r\n---\r\n\r\n#### 2. File Uploader Experiment (`src/ui/file-uploader-experiment` \u2192 `packages/legacy-ui/.../file-uploader-experiment`)\r\n\r\n| Action | File |\r\n|--------|------|\r\n| **Moved** | `controller.tsx`, `csv.tsx`, `csv-errors.ts`, `uploader.tsx`, `view.tsx`, `style.sass`, `legacy-style.sass`, `message/file-message.tsx`, `message/style.sass` |\r\n| **Added** | `index.ts`, `message/ind", + "labels": [] + }, + { + "number": 46937, + "title": "[NEXT-421] Migrate critical business rules from `/src/mural`", + "branch": "update/migrate-critical-business-rules", + "merged_at": "2026-01-29T21:50:59Z", + "changed_files": 94, + "additions": 203, + "deletions": 193, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThree type modules were moved from `src/mural/business/system-of-record/` into `packages/canvas` under the `@muralco/canvas/business` subpath.\r\n\r\n## Files moved\r\n\r\n| From (src/) | To (packages/canvas/) |\r\n|-------------|------------------------|\r\n| `mural/business/system-of-record/utils/tests/types.ts` | `src/business/system-of-record/utils/tests/types.ts` |\r\n| `mural/business/system-of-record/integrations/rally/milestone/types.ts` | `src/business/system-of-record/integrations/rally/milestone/types.ts` |\r\n| `mural/business/system-of-record/integrations/microsoft-planner/task/types.ts` | `src/business/system-of-record/integrations/microsoft-planner/task/types.ts` |\r\n\r\n## Other changes\r\n\r\n- **Barrel:** `packages/canvas/src/business/system-of-record/index.ts` now re-exports `./utils/tests/types` so test types are available from `@muralco/canvas/business`.\r\n- **Imports:** All references in `src/` were updated to use `@muralco/canvas/business` instead of relative paths to the old locations.\r\n- **Lint:** Duplicate `@muralco/canvas/business` imports in `src/mural/business/system-of-record/integrations/index.ts` were merged into a single import.\r\n- No renames, default\u2192named export changes, or Jest mock updates were required.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-421) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [ + "frontend-next" + ] + }, + { + "number": 46946, + "title": "[NEXT-356] Move register state-related and tool-related types into packages", + "branch": "fix/next-356-register-tool", + "merged_at": "2026-01-29T20:02:04Z", + "changed_files": 61, + "additions": 172, + "deletions": 154, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `Tool` and `RegisterState` related types into packages.\r\n\r\nThe environment: https://next-356-register-tool.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Moderate risk due to widespread type/import rewiring across `canvas` register components and the Tools API; runtime behavior should be mostly unchanged, but incorrect exports/import paths could cause build-time or subtle UI regressions (e.g., toolbar badges/menus).\n> \n> **Overview**\n> Moves several *register* component/type definitions out of app-local files into `@muralco/canvas/register` (new exports for `navigation`, `sidebar`, `snipping-selection`, and `BottomBarPropTypes`), and updates consumers to import from the package instead of `src/mural/register/...`.\n> \n> Promotes more of the Tools API surface into `@muralco/tools-api`: adds `core` type exports (e.g., `Tool`, `ToolNode`, `ToolSpec`, `MenuSpacing`) and a new exported `Badge` renderer, then updates internal adapters/builders/addons/tests to consume these package exports and replaces the previous shared `isNumber` badge helper with a local numeric check.\n> \n> Adds `classnames` as a dependency of `@muralco/tools-api` and adjusts related imports/exports to support the moved badge renderer/styles.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ced7868ca058c7ad5012ee012d363802bbbeaffb. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46951, + "title": "Notetaker note detail view", + "branch": "feature/notetaker-note-detail-view", + "merged_at": "2026-01-29T19:49:57Z", + "changed_files": 10, + "additions": 729, + "deletions": 6, + "body": "## Summary\nAdds notetaker note detail modal and related UI.\n\n## Changes\n- Note detail modal UI\n- Fetch note by id (mocked)\n- Bottom bar avatar + menu\n- Notetaker addon registration and rightbar implementation\n- Static assets and styling updates\n\n## Branch\n`feature/notetaker-note-detail-view` \u2192 `master`", + "labels": [] + }, + { + "number": 46945, + "title": "[CWI-2570] Fix - Visitors are asked to sign in with adding an image to the mural", + "branch": "stable-fix/cwi-2570", + "merged_at": "2026-01-29T18:48:27Z", + "changed_files": 8, + "additions": 160, + "deletions": 79, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - Visitors are asked to sign in with adding an image to the mural\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2570\r\n\r\n", + "labels": [] + }, + { + "number": 46949, + "title": "[CAN-8346] Update callouts with final copy and design", + "branch": "add/can-8346", + "merged_at": "2026-01-29T18:06:23Z", + "changed_files": 7, + "additions": 17, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI am updating some of the callout titles and descriptions, you can see all the flows in the [linked demo](https://www.loom.com/share/65bd81c98545462ea35f1c1522f39c17)\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://can-8346.mural.engineering))\r\n", + "labels": [] + }, + { + "number": 46892, + "title": "[NEXT-409] move /trial-expired and remaining workspace block routes code", + "branch": "feat/next-409-pkg-expired-rte", + "merged_at": "2026-01-29T17:05:33Z", + "changed_files": 44, + "additions": 384, + "deletions": 398, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #46874 . Moves the final \"workspace blocked route\" (`/t/:tid/trial-expired`) to the packaging system:\r\n- Migrates a few more icon files to either `@muralco/legacy-ui` (had other references) or to `@muralco/workspace-settings` (only referenced for these routes)\r\n- Moves all components and other code related to rendering the above route and the collection of block routes to `@muralco/workspace-settings`\r\n- Updates `@muralco/workspace-settings` dependency list to add needed dependencies for correctly building the newly added route\r\n- Updates the public exports for `@muralco/workspace-settings` to only export things that are actually needed/consumed outside of the package\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-279) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-409-pkg-expired-rte.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n\r\nMostly moving files around / affects the singular route noted above, but as `route-config.tsx` was touched here (swapped out the old parallel `BlockRoutes` and BlockRoutesPackaged` rendering for a singular import from the packaging system), it would probably be good to do a light smoke test of all the routes exported from `@muralco/workspace-settings/src/routes/block-routes`:\r\n\r\n```\r\n/t/:team/account-locked\r\n/t/:team/workspace-suspended\r\n/t/:team/account-suspended\r\n/t/:team/soft-block-expired\r\n/t/:team/trial-expired\r\n```\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consi", + "labels": [] + }, + { + "number": 46943, + "title": "[ESC-1861] Change copy for unarchive modal", + "branch": "fix/esc-1861", + "merged_at": "2026-01-29T16:33:07Z", + "changed_files": 1, + "additions": 1, + "deletions": 4, + "body": "Changing the copy of unarchive modal to the comment\r\n\"image\"\r\n\r\n\r\nFigma: https://www.figma.com/design/CwmfDNoZsns1KiI0bENmKu/ESC-Content-Lifecycle?node-id=640-8752&m=dev#1551980382\r\nTicket: https://mural.atlassian.net/browse/ESC-1861\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Low risk copy-only change to a modal message with no logic, state, or data-flow modifications.\n> \n> **Overview**\n> Updates the `ConfirmUnarchiveModal` body text to a new, clearer prompt about restoring a mural from the archive, replacing the previous confirmation copy.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 83fcdbe4ed08fe03d428ac78c99752975e242add. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46926, + "title": "[SCQM-1489] Remove AI compositor creation", + "branch": "update/remove-ai-compositor-creation", + "merged_at": "2026-01-29T16:11:21Z", + "changed_files": 8, + "additions": 20, + "deletions": 223, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the `CompositorOverrideApi` facilitated the build-a-mural feature to override the default template creation and instead use a widget composition in its place.\r\n\r\nNow, with these changes, the `CompositorOverrideApi` is completely removed in preparation of build-a-mural being completely removed.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1489) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://remove-ai-compositor-creation.mural.engineering/) to perform a smoke test.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46878, + "title": "[CAN-8344] Navigation-improvements clean up for hand-off", + "branch": "add/can-8344", + "merged_at": "2026-01-29T14:31:20Z", + "changed_files": 65, + "additions": 1404, + "deletions": 798, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBefore anything else, we were planning on doing this work on the next sprints, but due to the re-org changes, I have to handoff the navigation-improvements, so I went ahead and did the two biggest changes we had planned:\r\n\r\n1) I migrated the navigation sidebar buttons to the tools API, so now the Select and Pan buttons are actually tools which make it easier to maintain and hopefully becomes to first step to migrating the whole sidebar. This can be found in the first commit ee4e8f1260453824c6bbd414ad3f49d8e762668b\r\n\r\n2) A big refactor of the callouts we have been implementing this past 2 weeks in preparation for the navigation-improvements:\r\n\r\nFor example:\r\n\"image\"\r\n\r\n\"image\"\r\n\r\nPrior to these changes, the callout system for canvas onboarding and navigation improvements had significant code duplication and complexity. Each flow type (onboarding vs rollout) required separate navigation logic, manual tracking in every callout, and inconsistent handler implementations. This made adding new flows or callouts error-prone and difficult to maintain.\r\n\r\nNow, with these changes, we have a unified flow architecture with a single registry, standardized handler factories, and automatic tracking. All callout flows share the same navigation functions, handlers are created with simple factory functions, and tracking happens automatically via SDK callbacks. This makes the system significantly simpler to understand, maintain, and extend.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**", + "labels": [] + }, + { + "number": 46918, + "title": "[MFRD-38] Add facilitation dispatcher fn to hide / show bottom bar follow notification", + "branch": "fix/follow-hiding-reactions", + "merged_at": "2026-01-28T23:24:46Z", + "changed_files": 9, + "additions": 41, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nCurrently: There's a bug where the bottom bar reactions menu gets hidden behind the follow notification. \r\n\r\nIn the past there were unsuccessful attempts to move the reactions menu so both could be visible that caused other issues, this solution is to make sure they're not displayed at the same time. \r\n\r\nWhen following someone, if you activate the reactions menu from the bottom bar, the follow notification should temporarily hide and only display the reactions menu. When the reactions menu closes, the follow notification should return. \r\n\r\nhttps://www.loom.com/share/c30f84c9d5c34e218398e5e4c5a2d2bc\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-38) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://follow-hiding-reactions.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- \r\n1. Add multiple users to a mural \r\n2. Follow another user\r\n3. Verify the follow notification shows up above the bottom bar\r\n4. Mouse enter the reactions menu item in the bottom bar\r\n5. Verify that the follow notification hides\r\n6. Verify that the full reactions menu is visible (and that you can react)\r\n7. Mouse exit the reactions menu item\r\n8. Verify the follow notification returns \r\n\r\nSame behavior should be shared when a user is summoned / receives a request to be followed.\r\n\r\nAdditional testing: \r\nVerify this flow works with the new IA flag enabled: `feat-mu-enable-ia-toolbars` \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Low Risk**\n> Low risk: adds a small UI state flag and wires it through existing f", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46935, + "title": "[MFRD-5] Add `isActionOnly` flag to presentation toolbar celebrate button", + "branch": "fix/pres-mode-celebrate-button", + "merged_at": "2026-01-28T20:23:30Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCelebrate option in the presentation mode toolbar currently has an ON / OFF state - this adds the flag that makes it just a button press rather than stateful. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-5) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://pres-mode-celebrate-button.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n1. Open presentation mode\r\n2. In the bottom toolbar, celebrate\r\n3. Verify the celebration occurs but the button does not retain an \"on\" / selected state \r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46909, + "title": "Phase 1 : Migrate UI components from src/ui to @muralco/legacy-ui package", + "branch": "modularize-src-ui", + "merged_at": "2026-01-28T20:10:05Z", + "changed_files": 152, + "additions": 568, + "deletions": 416, + "body": "## Summary of Changes and Resources for the Reviewer\n\n### What changed\n\nThis PR **modularizes `src/ui`** by moving shared UI components into the `packages/legacy-ui` package and updating all consumers.\n\n- **`packages/legacy-ui`**: Components moved/added under `src/ui/components/` with proper `index.ts` exports (checkbox, checkbox-with-description, form/section-box, indent, link, list, loading, notification-bar, pages). Tristate checkbox and indent were moved from `src/ui` into legacy-ui.\n- **`src/`**: All imports that previously pointed at `src/ui/...` now import from `@muralco/legacy-ui` (or the appropriate legacy-ui path). Deleted `src/ui/checkbox/tristate.tsx` and `src/ui/indent/index.tsx` in favor of the package.\n- **Scope**: 90 files touched across dashboard, modals, mural addons, settings, team routes, notifications, registration, and other areas that use these components.\n\n### Reviewer resources\n\n- Please review the [**JIRA ticket**]( ) to understand the context of this effort.\n- Please use this [**testing environment**](https://modularize-src-ui.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\n\n### Required checklist for author\n\n- [ ] Unit tests were added/updated\n- [ ] No new cucumber tests were added\n- [x] Exception: no unit tests were added or updated for this change\n\n### Relevant links\n\n- [**API PR**]( ) (if applicable)\n\n### FAQs\n\n**Why is my build failing?**\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\n- You have a TypeScript compilation error. Run `npm run typecheck`.\n- You have a lint error. Run `npm run lint`.\n\n**How can I debug my failing tests?**\nIf you're using VSCode, please see [thes", + "labels": [] + }, + { + "number": 46925, + "title": "[notetaker] show \"live\" transcription indicator", + "branch": "feature/notetaker-ui-pt-ii", + "merged_at": "2026-01-28T20:01:28Z", + "changed_files": 6, + "additions": 384, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://notetaker-ui-pt-ii.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3", + "labels": [] + }, + { + "number": 46915, + "title": "[NEXT-413] Update/modularize mural business rules", + "branch": "update/modularize-mural-business-rules", + "merged_at": "2026-01-28T19:27:49Z", + "changed_files": 147, + "additions": 258, + "deletions": 174, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors and modularizes mural business rules by extracting common business logic from src/mural/business/ into the shared @muralco/canvas package (packages/canvas/src/business/). This enables better code reuse across the codebase and improves the architectural separation of concerns.\r\n\r\nChanges:\r\n\r\n- Extracts reusable business logic functions and types from src/mural to packages/canvas/src/business\r\n- Updates all import statements across the codebase to reference the new centralized locations\r\n- Adds fast-url-parser dependency to the canvas package for URL parsing utilities\r\n- Creates proper TypeScript type definitions for the new fast-url-parser dependency\r\n- Updates test files to import from the new module locations\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-413) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Broad refactor touching many call sites (delete/clipboard/connectors/tables/system-of-record/integrations) by changing imports and public exports; behavior should be unchanged but regressions could come from incorrect re-exports or subtle package boundary differences.\n> \n> **Overview**\n> **Centralizes previously app-local \u201cbusiness rule\u201d utilities into `packages/canvas/src/business` and expands the `@muralco/canvas/business` public surface** (e.g., 2-way sync required-update calculation, absorption overlap helpers, connectors helpers, clipboard restriction messaging, delete restriction checks, drag-selected-widgets types, table helpers, ticket tracking/errors, and system-of-record utilities/types/test fixtures).\n> \n> **Updates the mural app to import these utilities from `@muralco/canva", + "labels": [ + "frontend-next" + ] + }, + { + "number": 46785, + "title": "Add/remove wta part4", + "branch": "add/remove-wta-part4", + "merged_at": "2026-01-28T19:09:44Z", + "changed_files": 22, + "additions": 144, + "deletions": 378, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoved widgetToolbarApi calls from \r\n\r\n- captions\r\n- drawings\r\n- arrange\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+S", + "labels": [] + }, + { + "number": 46913, + "title": "Add delete voting session to voting results panel", + "branch": "add/voting-delete-session", + "merged_at": "2026-01-28T17:19:26Z", + "changed_files": 2, + "additions": 58, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add a delete voting session to the voting panel highlights\r\n\r\n[Test Env](https://voting-delete-session.mural.engineering/)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8363)\r\n\r\nhttps://github.com/user-attachments/assets/cc7bac5e-37a9-470a-b7e1-adfa30fcc00b\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to", + "labels": [] + }, + { + "number": 46907, + "title": "[ESC-1880] archived murals: Determine available actions using mural permissions", + "branch": "update/esc-1880-archived-murals", + "merged_at": "2026-01-28T16:18:15Z", + "changed_files": 11, + "additions": 283, + "deletions": 198, + "body": "Jira: [ESC-1880](https://mural.atlassian.net/browse/ESC-1880)\r\nTesting environment: https://esc-1880-archived-murals.mural.engineering/\r\n\r\n### Summary\r\n\r\nOn the Archived murals page, determine the mural actions available to the user based on mural permissions instead of checking if the user is the mural creator.\r\n\r\nAs workspace admin (slightly outdated):\r\n\r\nhttps://github.com/user-attachments/assets/fd98cddf-a42e-45cd-8fa6-e193d283825f\r\n\r\nAs workspace member (slightly outdated):\r\n\r\nhttps://github.com/user-attachments/assets/1bbdbe2f-c320-442a-9393-b46321e0e7c5\r\n\r\n### Companion PRs\r\n\r\n- https://github.com/tactivos/mural-api/pull/15266\r\n\r\n[ESC-1880]: https://mural.atlassian.net/browse/ESC-1880?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Moves Archived Murals UI from owner-based checks to permission-based logic.\n> \n> - Use `@muralco/permissions` `can.mural(...)` to gate row actions (Unarchive/Request to Unarchive, Download, Delete) and bulk actions via a new `archivedMuralBulkActionMap`\n> - Simplifies state/props by removing `currentUsername` and `@muralco/dashboard-context`; action handlers now compute target IDs by permission\n> - Updates API typings: `getArchivedMurals` items may include `$permissions?: MuralComputedPermissions` and `title?`; UI `transformApiResponseToUiData` defaults missing permissions and titles\n> - Refreshes tests to validate permission-driven visibility and behavior (including export gating), plus adds test mocks dependency\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c58fd3f213e2f651f59b676214471ff4684fab2f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46912, + "title": "CAN-8362 Detect trackpad or magic mouse as panning when in Scroll to Zoom mode", + "branch": "poc/pan-if-scroll-isnt-vertical", + "merged_at": "2026-01-28T13:16:15Z", + "changed_files": 2, + "additions": 54, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46919, + "title": "[CAN-8361] Add new toggle to the new mouse settings modal", + "branch": "add/can-8361", + "merged_at": "2026-01-28T12:38:04Z", + "changed_files": 6, + "additions": 59, + "deletions": 26, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd new toggle to the new mouse settings modal to allow to decide what the mouse left click button does, also update tracking to show what was set and remove the 'tracking' argument for controls.save and updated the implementation since it was using the deprecated 'record' method.\r\n\r\nBefore:\r\n\"image\"\r\n\r\n\r\nNew:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8361) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8361.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.at", + "labels": [] + }, + { + "number": 46924, + "title": "Update CODEOWNERS for @tactivos/agentic-dev-platform", + "branch": "add/agentic-dev-platform-ownership", + "merged_at": "2026-01-27T22:04:39Z", + "changed_files": 1, + "additions": 8, + "deletions": 8, + "body": "Simple name change of `@tactivos/copilot-instructors` to `@tactivos/agentic-dev-platform` to better reflect domain. Old name was too specific to both Copilot and Instructions files.\n\n\n---\n\n> [!NOTE]\n> Updates `CODEOWNERS` to replace `@tactivos/copilot-instructors` with `@tactivos/agentic-dev-platform`.\n> \n> - Reassigns ownership for `AGENTS.md`, `SKILL.md`, `skills/`, `.claude/`, `.codex/`, `.cursor/`, and `.github/{copilot-instructions.md,instructions}`\n> - No other ownership changes\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1d45aabcbe7036882ea7f55bf52dd177b9c016ba. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46890, + "title": "[SCQM-1557] Remove Remaining Discovery Call Board and Content Extension Handler", + "branch": "update/remove-discovery-board", + "merged_at": "2026-01-27T21:56:08Z", + "changed_files": 27, + "additions": 9, + "deletions": 2221, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the discovery call compositor and content extension schema and handlers all were in the code.\r\n\r\nNow, with these changes, the discovery call board compositor, plugins, constants, schema, and CE extensions are all removed.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1557) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://remove-discovery-board.mural.engineering/) to perform a smoke test.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15255)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Removes all Discovery Call Board code paths and references.\n> \n> - Deletes `discovery-call-board` compositor, models, plugins, utils, and registry wiring; `COMPOSITOR_TYPES` no longer includes it\n> - Drops `discovery-call-board` content extension type, exports, and schema/handler from API and shared CE handlers\n> - Cleans feature-flag surface and overrides: removes unused flags and emptying AI compositor `TEMPLATE_OVERRIDE_MAP`\n> - Narrows Smart Frameworks to `kanban-board` only; updates related types and exports\n> - Updates unit test to include `title` when adding a new board; minor docstring tweaks in LinkedIn helper\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3d24a8a604276c5e7cb5c56f3ae4cfaecdc0f9fb. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46917, + "title": "[NEXT-416] Remove dispatcher dependency from edition protocol", + "branch": "fix/next-416-2", + "merged_at": "2026-01-27T21:18:26Z", + "changed_files": 22, + "additions": 97, + "deletions": 66, + "body": "**[NEXT-416 Remove dispatcher dependency from registered components](https://mural.atlassian.net/browse/NEXT-416)**\r\n\r\nThis PR removes dispatcher reference from `WidgetEditionSession` to remove dispatcher references from `MuralState` type.\r\n\r\nThe environment: https://next-416-2.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Decouples `dispatcher` from widget edition sessions and shifts it to protocol factories.\n> \n> - Changes `create*Protocol` APIs to higher-order functions: `createXProtocol(dispatcher)(session)`; updates all call sites (editor registrations, arrow editor, and `WidgetEditorLayer`) to pass `dispatcher` to the factory and only `widgetId` in the session\n> - Removes `dispatcher` from `WidgetEditionSession` in `register/types.ts` and related imports\n> - Updates unit tests across all protocols to use the new factory signature\n> \n> This is a refactor; behavior of start/update/end/autoSave remains the same, with dependency injection cleaned up\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a9229f5847ffaba707f144a05fcf68fd871d9882. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46903, + "title": "Feature/notetaker UI pt i", + "branch": "feature/notetaker-ui-pt-i", + "merged_at": "2026-01-27T21:07:52Z", + "changed_files": 32, + "additions": 1514, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, we had a \"transcription\" add on which rendered a new rightbar where the user could input a meeting URL and view the live transcript.\r\n\r\nNow, with these changes, we introduce a new right bar conforming to official designs. We render the past meetings rather than surfacing a realtime transcript. We also introduce a bottom-bar component which serves as a new entry point to both the share modal and the \"add notetaker\" modal. \r\n\r\nIn the future, we will iterate heavily on this. Including by deleting the now stale transcription rightbar. [SCRAP-96: \\[canvas\\] delete addon \"transcription\"](https://linear.app/mural/issue/SCRAP-96/canvas-delete-addon-transcription)\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://notetaker-ui-pt-i.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Set the feature flag\r\n\"image\"\r\n\r\n 2. click the \"+\" icon in the bottom bar: ensure share modal/new modal renders\r\n 3. from top bar on the right, click the \"notes\" icon: ensure rightbar renders as expected\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated (mostly UI changes without testing, adds some tests for rightbar visibility)\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+con", + "labels": [] + }, + { + "number": 46922, + "title": "Remove no longer needed controls version check", + "branch": "fix/visitors-nav-cheatsheet", + "merged_at": "2026-01-27T20:41:17Z", + "changed_files": 2, + "additions": 5, + "deletions": 36, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWe were accidentally hidings the cheatsheet contents because the new navigation mode is setting version = v1 to all new users if it's on (ON by default on test envs and beta). This was part of a past project that was never released, so I am removing this check.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+", + "labels": [] + }, + { + "number": 46871, + "title": "A/B test IA toolbars", + "branch": "add/can-8338", + "merged_at": "2026-01-27T20:30:11Z", + "changed_files": 29, + "additions": 922, + "deletions": 802, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSets up A/B testing for the IA toolbars.\r\n\r\n[Test Env](https://can-8338.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+", + "labels": [] + }, + { + "number": 46905, + "title": "[CWI-2532] Fix list format", + "branch": "fix/list-format", + "merged_at": "2026-01-27T18:26:02Z", + "changed_files": 3, + "additions": 26, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Quick fix to provide proper casing and sentence structure for listing of searched sources\r\n\r\n\r\nBefore:\r\n\"image\"\r\n\r\n\r\nAfter:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2532 to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46804, + "title": "[NEXT-404] Pt 1 - Move roommodals noperms to package", + "branch": "move/roommodals-noperms-package", + "merged_at": "2026-01-27T17:51:57Z", + "changed_files": 17, + "additions": 447, + "deletions": 8, + "body": "Main change: move `MoveMuralNoPermsModal` to a new package `@muralco/dashboard-modals-room`.\r\n\r\nNext PR will move more room modals to this package\r\n\r\ntest-env\r\nhttps://roommodals-noperms-package.mural.engineering/\r\n\r\n\"image\"\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces a new package `@muralco/dashboard-modals-room` and migrates the `MoveMuralNoPermsModal` into it.\n> \n> - New package with build/test configs, exports, and TS settings; adds to root `package.json` and lockfile\n> - Implements `MoveMuralNoPermsModal` and `moveMuralNoPermsRegistration` with corresponding unit tests\n> - `RoomPage` now imports `moveMuralNoPermsRegistration` from the new package and registers it in `RoomModalsManager`\n> - Removes legacy local import, maintains same modal behavior (close on backdrop/escape, confirm wiring)\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit dacd945de5a73e8ca024e2951d17f9f0da893465. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46902, + "title": "[IAM-2286] Enhance mural settings with role eligibility and identifiers", + "branch": "add/role-inheritance-disabled", + "merged_at": "2026-01-27T17:42:01Z", + "changed_files": 13, + "additions": 698, + "deletions": 18, + "body": "Prior to these changes, mural settings did not handle inherited role eligibility or include room and workspace identifiers in the role info modal.\n\nNow, with these changes, the system supports inherited role eligibility and enhances the role info modal with relevant identifiers.\n\n#### Reviewer Resources\n\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2286) to understand the context of this effort.\n\n- \ud83e\uddea Please use this [**testing environment**](https://role-inheritance-disabled.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\n\n\n\n### Required Checklist for Author\n\n- [x] Unit tests were added/updated\n\n- [x] No new cucumber tests were added\n\n- [ ] Exception: no unit tests were added or updated for this change\n\n\n\n### Relevant Links \ud83d\udd17\n\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15190)", + "labels": [] + }, + { + "number": 46899, + "title": "[CAN-8349] Fix widget dragging with grid areas", + "branch": "fix/grid-area-dragging", + "merged_at": "2026-01-27T16:24:07Z", + "changed_files": 10, + "additions": 74, + "deletions": 70, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug related to dragging widgets out of a grid area.\r\n\r\nWith the introduction of the `reset` concept during dragging, the behavior of widgets within grid areas stopped working as expected.\r\n\r\nThe [following comment](https://mural.atlassian.net/browse/CAN-8349?focusedCommentId=363496) in the attached Jira card explains the current flow of the dragging logic and the reason behind the bug.\r\n\r\nThe TL;DR version of it is that every time we try to move a widget out of a grid area, the resetting puts it back in.\r\n\r\n---\r\n\r\nThis fix is based on how the dragging currently works: we first move the widget to the new position, and then find the best cluster to absorb it (or to expel it from).\r\nBecause this is currently a two step process, the first step triggers the grid areas system which puts forces the sticky into a gridded position if needed.\r\n\r\nThe fix, therefore, consists in unifying both steps into one, so the grid areas system only runs after the second part has been calculated. This releases the widget from the grid area claw when the new position is out of its bounds.\r\n\r\nIn order to test this, you simply need to try to move a widget out of a grid area. If you can, success!\r\n\r\nPlease note that grid areas still work funky as hell, this is not fixing those weird behaviors, they will still occur until we can properly address how grid areas in general work.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8349)\r\n- \ud83e\uddea [**Testing environment**](https://grid-area-dragging.mural.engineering)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Unifies drag movement and absorption feedback into a single, atomic action pipeline to prevent grid areas from snapping widgets back while dragging out.\n> \n> - Reworks `dragSelectedWidgets` to build a single `ActionList`: appends `beforeDragMove` + `sdk.dragging.move` + `dragWidgetsOverCluster.drag(...).appendTo(...)`, then applies once", + "labels": [] + }, + { + "number": 46904, + "title": "[CAN-8333] Add method `isStageEmpty` to the Widget Changes API", + "branch": "fix/is-stage-empty", + "merged_at": "2026-01-27T15:06:30Z", + "changed_files": 5, + "additions": 81, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIn this PR we're adding the `isStageEmpty` method to the Widget Changes API, which checks whether the stage has any actual changes by comparing the current state with the initial snapshot.\r\n\r\nThis is a performance improvement over getting the changes and checking for its size in the sense that it doesn't need to obtain the entire set of changes if we only care to see if there are any.\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8333)\r\n- \ud83e\uddea [**Testing environment**](https://is-stage-empty.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46908, + "title": "[CWI-2534] Fix grammar for setting desc", + "branch": "update/cwi-2534-grammar", + "merged_at": "2026-01-27T14:06:30Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Fix grammar for setting description\r\n- \r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2534 to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46906, + "title": "Fix Downgrade Scheduled Button", + "branch": "add/downgrade-tweak", + "merged_at": "2026-01-26T22:10:38Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "## Pull request overview\r\n\r\nUpdates the billing summary UI to use the correct label for cancelling a scheduled downgrade/change.\r\n\r\n**Changes:**\r\n- Renames the cancel button text from \u201cCancel scheduled process\u201d to \u201cCancel scheduled change\u201d for consistency and clarity.\r\n\r\n", + "labels": [] + }, + { + "number": 46888, + "title": "Refactor: Move canvas and native bridge modules to packages", + "branch": "supporting-canvas-files", + "merged_at": "2026-01-26T19:49:34Z", + "changed_files": 81, + "additions": 246, + "deletions": 223, + "body": "## Overview\r\n\r\nThis PR refactors the codebase to move canvas-related and native bridge code from `src/` into their respective packages (`@muralco/canvas` and `@muralco/native`). This improves code organization, separation of concerns, and makes these modules more reusable across the monorepo.\r\n\r\n## Changes\r\n\r\n### Canvas Package (`packages/canvas/`)\r\n- **Components**: Moved `card`, `qr-code`, and related components\r\n- **Business Logic**: Moved system-of-record utilities, table affordances, and table layout logic\r\n- **Helpers**: Moved dragging helpers (mouse/touch), guidelines, and mount utilities\r\n- **SDK**: Moved widget primitives and related utilities\r\n- **Dispatcher**: Updated dispatcher modules (actions-tracker, content-extension, experiments, features, etc.) to use package imports\r\n\r\n### Native Bridge Package (`packages/native/bridge/`)\r\n- **Features**: Moved `native-setup` and `native-storage` features into the package\r\n- Updated feature exports to include new modules\r\n\r\n### Import Updates\r\n- Updated all imports throughout the codebase to use `@muralco/canvas` and `@muralco/native` package paths\r\n- Updated type definitions in `src/defs.d.ts` and `packages/canvas/src/defs.d.ts` to reflect new package structure\r\n- Updated package.json files to ensure proper dependencies", + "labels": [] + }, + { + "number": 46898, + "title": "[NEXT-416] Remove dispatcher dependency from registered components", + "branch": "fix/next-416", + "merged_at": "2026-01-26T19:23:58Z", + "changed_files": 17, + "additions": 115, + "deletions": 84, + "body": "**[NEXT-416 Remove dispatcher dependency from registered components](https://mural.atlassian.net/browse/NEXT-416)**\r\n\r\nThis PR uses react context to provide `dispatcher` to registered components. This allows us to move props types into packages.\r\n\r\nThe environment: https://next-416.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves `dispatcher` provisioning to React context and updates registered components accordingly.\n> \n> - Adds `MuralDispatcherContext`, `useDispatcher` hook, and `withDispatcher` HOC; marks `connectComponent` as deprecated for state access guidance\n> - Wraps connected components with `withDispatcher` and stops passing `dispatcher` explicitly: `Minimap`, `ToolRealtimePresence` (bottom bar), `Sidebar`, `SnippingSelection`, and related usages (participants addon, widgets container, visualization controls)\n> - Cleans up prop types to remove `dispatcher` from register component interfaces (bottom bar, navigation/minimap, sidebar, snipping-selection, topbar)\n> - Updates web toolbar to render `Minimap` without a `dispatcher` prop and adjusts call sites accordingly\n> \n> This is a broad refactor touching multiple UI layers but functionally preserves behavior by sourcing `dispatcher` from context provided in `mural.tsx`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0e911bd3fef471d1f7e7273f3d9ca40a7f5c3c86. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46882, + "title": "[BOP-103] Frontend should specify a researchType when calling the research API", + "branch": "add/research-type-to-research", + "merged_at": "2026-01-26T18:03:21Z", + "changed_files": 4, + "additions": 67, + "deletions": 26, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nEnsure we can pass researchType when calling company research!\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://linear.app/mural/issue/BOP-103/frontend-should-specify-a-researchtype-when-calling-the-research-api) to understand the context of this effort.\r\n[test env](https://research-type-to-research.mural.engineering/)\r\n\r\n\"Screenshot\r\n\n\n---\n\n> [!NOTE]\n> Introduces explicit research type for company research and propagates it end-to-end.\n> \n> - Adds `CompanyResearchType` and updates `ContentApi.operations.researchCompany` to require `researchType` and include it in the request payload\n> - Updates `generateResearchOperation` to accept a `researchType` (default `company-research`), pass it to the API, and preserve it across retries\n> - Extends tests to verify default/custom `researchType`, Salesforce context handling, and retry behavior\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8ae099ca5e1532f417c95753b2211682f3d46201. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46872, + "title": "[EN-3570] Workspace Consolidation: add optimizely flag", + "branch": "add/en-3570", + "merged_at": "2026-01-26T16:51:48Z", + "changed_files": 2, + "additions": 35, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPulls the optimizely flag `feat-workspace-consolidation` and leaves TODO comments for adding inline & bulk actions.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3570) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3570.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Co", + "labels": [] + }, + { + "number": 46893, + "title": "`move-to-package` tool : Add support for migrating directories", + "branch": "m2p-directories", + "merged_at": "2026-01-26T16:41:07Z", + "changed_files": 6, + "additions": 350, + "deletions": 55, + "body": "### Pull request overview\r\n\r\nThis PR adds support for migrating entire directories (not just individual files) using the `move-to-package` refactoring tool. When a directory is provided as the source, the tool processes all files in the immediate directory (excluding subdirectories) sequentially, and creates a single git commit for all changes.\r\n\r\n**Changes:**\r\n- Refactored `moveToPackageTask` to route between single-file and directory processing based on input type\r\n- Added `moveDirectoryToPackage` function to handle batch processing of files in a directory\r\n- Extracted single-file logic into `moveSingleFileToPackage` helper function\r\n- Updated validation to accept both files and directories as source paths\r\n- Added `getFilesInDirectory` helper function to get all files in a directory\r\n- Updated documentation with directory usage examples and behavior notes\r\n- Updated CLI help text to indicate directory support\r\n\r\n\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46889, + "title": "Move Sor files from canvas package to integrations-platform package", + "branch": "update/move-sor-files", + "merged_at": "2026-01-26T16:30:51Z", + "changed_files": 61, + "additions": 136, + "deletions": 114, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMove Sor files from canvas package to integrations-platform package", + "labels": [] + }, + { + "number": 46895, + "title": "[beta-fix] [CWI-2532] empty state", + "branch": "beta-fix/cwi-2532-empty-state", + "merged_at": "2026-01-26T15:56:44Z", + "changed_files": 16, + "additions": 793, + "deletions": 95, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nReopening https://github.com/tactivos/murally/pull/46850 as beta-fix\r\n\r\n- Add single empty state on All tab\r\n\r\n\"image\"\r\n\r\n- Add new empty state on individual tabs\r\n\r\n\"image\"\r\n\r\n\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n-\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wi", + "labels": [] + }, + { + "number": 46870, + "title": "[IAM-2005] Bulk action user role chnage", + "branch": "feat/iam-2005-bulk", + "merged_at": "2026-01-26T14:58:24Z", + "changed_files": 8, + "additions": 139, + "deletions": 128, + "body": "### Summary of changes and resources for the reviewer\r\n\r\nAdd the ability to grant and remove admin access to a workspace member. This refactor the existing single action, so that both the single and bulk action can use the same code path.\r\n\r\n#### Reviewer resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2005**](https://mural.atlassian.net/browse/IAM-2005)\r\n- \ud83e\uddea [**iam-2005-bulk.mural.engineering**](https://iam-2005-bulk.mural.engineering/)\r\n- \ud83c\udfac Loom demo incoming\r\n\r\n[IAM-2005]: https://mural.atlassian.net/browse/IAM-2005?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces RBAC-aware role management and consolidates action handling for workspace users.\n> \n> - Adds `GRANT_ADMIN_ACCESS` and `REMOVE_ADMIN_ACCESS` single/bulk actions gated by `isCompanyUsingRbac`; wires into unified `handleUserRoleChange` that calls `updateWorkspaceUserRoleRequest`\n> - Replaces separate RBAC select-menu path; `RoleActions` now uses the same inline action source and `onItemAction`\n> - Updates eligibility helpers to allow role changes only for active, non-group, non-guest users with matching `WorkspaceRoles` (Admin/Member)\n> - Expands roles with `WorkspaceRoles.External` and updates role cell display; refines license/role column/tooltips when RBAC is enabled\n> - Removes unused role-change props/handlers and cleans up action wiring in columns and action cell\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b1a4097e73e809e6fabd7b9b1bab4e27d44ba69c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46818, + "title": "[MFRD-31] Remove memoized logging for private mode", + "branch": "remove/pm-old-logging", + "merged_at": "2026-01-23T20:03:47Z", + "changed_files": 7, + "additions": 53, + "deletions": 144, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBasically undoes the changes made in https://github.com/tactivos/murally/pull/45438 that were added to get more insight on a theory about a private mode issue.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-31) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://pm-old-logging.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nRegression test private mode.\r\n\n\n---\n\n> [!NOTE]\n> Cleans up temporary debug/opt-out code for private mode and standardizes on memoized selectors.\n> \n> - Removes `isEditingWidgetNonMemoized`/`isHiddenWidgetNonMemoized` from `PrivateTimeSdkApi`, API implementation, and tests\n> - Simplifies `referenceEqualResult` by dropping the `useNonMemoized` option\n> - Collapses private-time selectors to a single memoized implementation; deletes non-memoized variants and exports\n> - Removes runtime consistency checks and logger from the private-time addon\n> \n> **Risk**: Low; primarily code cleanup and API surface reduction around debug-only paths. Potential impact limited to selector memoization behavior.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d0dc74756dce312e0cd9ce1689eb57242c83f2b7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46819, + "title": "[SCQM-1556] Remove discovery call API", + "branch": "update/remove-discovery-call", + "merged_at": "2026-01-23T19:48:55Z", + "changed_files": 21, + "additions": 2, + "deletions": 1251, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPart 5 of 6 to removal discovery call features and flags\r\n\r\nThis piece removes the entire DiscoveryBoard API and call sites. The next piece will remove the board compositor entirely.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1556) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://remove-discovery-call.mural.engineering/) to perform a smoke test.\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes\r\n1. Enable the flags `feat-mu-enable-ai-compositor-creation` and `feat-mu-enable-ai-compositor-creation-in-vtt`, save and refresh\r\n2. Now in the VTT you can drag in a Discovery Call board\r\n3. It should create the board just fine - but nothing else about the previous board will now work. They're all just plain widgets in the canvas.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Removes Discovery Call runtime APIs and business service, leaving the compositor shell without interactive behaviors.\n> \n> - Deletes `apis/discovery-call/*` (addBoard/fillField/setColor/updatePhoto/updateSlides/updateSummary, modal, loading overlay) and `business/discovery-call/*`\n> - Simplifies `discovery-call/index.ts`: no model service/API initialization; `addRoot` no longer calls `addBoard`; panel item unchanged\n> - Trims `plugins/selection.ts`: removes modal/summary triggers; only prevents selecting the launch button and non-interactive components\n> - Cleans `utils.ts` and `constants.ts`: drops presenter/summary helpers and large mock/update mappings\n> \n> Risk: Medium \u2014 removal of widely referenced API hooks and UI flows could af", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46877, + "title": "[CAN-8085] Voting Highlights", + "branch": "add/can-8085", + "merged_at": "2026-01-23T19:27:33Z", + "changed_files": 4, + "additions": 29, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFlagged feature: When the flag is on, the voting results overlay no longer shows. Votes are hidden and shown together with the new Voting panel. \r\n\r\n[Test Env](https://can-8085.mural.engineering/)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8085)\r\n\r\nFlag off:\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/75dcc38f-50a0-436f-aa08-0cd6a4c93454\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nFlag on:\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/497415dc-85ae-4d76-8841-258fb4ecdce8\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n-", + "labels": [] + }, + { + "number": 46851, + "title": "[NEXT-389] Migrate more sdk apis", + "branch": "refactor/sdk-apis-continued", + "merged_at": "2026-01-23T19:14:41Z", + "changed_files": 94, + "additions": 414, + "deletions": 370, + "body": "Test environment: https://sdk-apis-continued.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK APIs under `@muralco/canvas` with local `types` modules and explicit `index` re-exports, and updates app code accordingly.\n> \n> - Migrates APIs (e.g., `canvas`, `dom`, `participants`, `share`, `export`, `operations`, `notifications`, `integrations`, `native/bridge`, `template`, `temporary-mural`, `room`, `widget-toolbar`, `workspace`, `snipping-selection`, `callouts`, `callout-scheduler`, `modal(s)`, `mouse`, `system-of-record`, `socket`) to use internal paths and export factories via `index.ts`\n> - Introduces new/updated factories and signatures: `createVideoApi({ configSdkApi })`, `createTemplateApi({ contentExtensionSdk })`, `createCalloutSchedulerSdkApi(...)`, plus added selectors (e.g., mouse, snipping-selection)\n> - Replaces legacy imports in app code to consume from `@muralco/canvas/sdk/apis` (e.g., socket utils, SoR types, user selectors) and removes duplicated local implementations\n> - Adds `@muralco/realtime-client` dependency and re-exports socket utilities (`getIdleTimeoutForPlatform`, `getCrowdedModeTimeoutForPlatform`, `getRealtimeFeaturesFromFlags`)\n> - Aligns state module imports to new `../../state/...` locations; minor path renames (`secondary-top-bar`)\n> - Updates/extends unit tests for migrated modules (e.g., `callout-scheduler`, `operations`, `absorption-feedback`)\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d323d880cfd1b8ff85544587e202af0c2bc6bc5c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46791, + "title": "[CWI-2531] Image attribution", + "branch": "add/cwi-2531-img-attr", + "merged_at": "2026-01-23T18:39:51Z", + "changed_files": 15, + "additions": 342, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add image attribution information to image content viewer\r\n- Update image content viewer styling to match iframe content viewer\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n- Please see https://www.loom.com/share/69ce1a7da8e041ddbc4f87b99c2d1f1c of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use https://cwi-2531-img-attr.mural.engineering/ to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/15198\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between", + "labels": [] + }, + { + "number": 46865, + "title": "Migrates 3rd of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-3", + "merged_at": "2026-01-23T18:17:35Z", + "changed_files": 158, + "additions": 307, + "deletions": 266, + "body": "This PR is the third of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the third batch of `medium` priority dependencies.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\n## Prerequisite Migrations\r\n\r\nSeveral commits in this PR were prerequisite file migrations required to support `MuralState` and `RegisterState` types:\r\n\r\n- **Right bar types** (`59feb86`) - `src/mural/register/components/right-bar/types.ts` \u2192 `@muralco/canvas/register/components/right-bar/types`\r\n- **Contains widget helper** (`140c42e`) - `src/mural/helpers/contains-widget.ts` \u2192 `@muralco/canvas/helpers/contains-widget`\r\n- **Outline items helper** (`7b4d414`) - `src/mural/helpers/outline-items.ts` \u2192 `@muralco/canvas/helpers/outline-items`\r\n- **Outline types** (`f281ef1`) - `src/mural/register/components/outline/types.ts` \u2192 `@muralco/canvas/register/components/outline/types`\r\n\r\nThese migrations were necessary to establish the type dependencies required for `MuralState` and `RegisterState` to be properly defined within the canvas package.\r\n\r\n## What Was Migrated\r\n\r\n### Addons\r\n- **AI create workshop types** (`addons/ai/ai-create-workshop/types.ts`) - AI workshop creation types and interfaces\r\n- **Dev table** (`addons/dev/table/`) - Development table component and styles\r\n- **Lexical serialization types** (`addons/core/editors/lexical/widget-editor/serialization/types.ts`) - Lexical editor serialization type definitions\r\n\r\n### Business Logic\r\n- **Content extension system of record** (`business/content-extension/shared/handlers/common/system-of-record.ts`) - System of record handler utilities for content extensions\r\n\r\n### Components\r\n- **Arrow utilities** (`components/widgets/arrow/util.ts`)", + "labels": [] + }, + { + "number": 46883, + "title": "[NEXT-382] Move `Poly` and `Bezier2` into geometry package", + "branch": "fix/next-382", + "merged_at": "2026-01-23T18:06:49Z", + "changed_files": 20, + "additions": 496, + "deletions": 653, + "body": "**[NEXT-382 Inspect `helpers` folder and move geometry/math related functions into geometry package](https://mural.atlassian.net/browse/NEXT-382)**\r\n\r\nThis PR moves `Poly` and `Bezier2` into geometry package. There is also a conversion to regular classes instead of type + namespace.\r\nSome unused functions were removed.\r\n\r\nThe environment: https://next-382.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Scope**\n> - Moves curve/polyline utilities from `packages/canvas/helpers` to `packages/geometry` and refactors them into class-based APIs.\n> \n> **Key changes**\n> - Introduces `@muralco/geometry` implementations: `Bezier2` (class) and `Poly` (class with instance methods like `nearestPoint`, `pointAtLength`, `simplify`, `smooth`, `segmentIsNearOrIntersects`, `toPath`).\n> - Removes old canvas helpers: `helpers/bezier2.ts`, related exports, and some unused math helpers; shifts `lerp` to geometry and updates imports across app code.\n> - Updates inking/drawing/connector logic to use new `Poly` methods and adjusted eraser proximity API; centralizes eraser radius constant.\n> - Simplifies `src/mural/helpers/path-math.ts` to rely on geometry `Poly`; removes bbox utilities and obsolete tests; adds geometry `poly.test.ts`.\n> - Broad import normalization to `@muralco/geometry` (`Point`, `Aabb`, `lerp`, `Poly`).\n> \n> **Tests**\n> - Adds/updates unit tests for `Poly` behavior under geometry package.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ab17f99b219865c606335bdfe459af52bfc72829. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46887, + "title": "[NEXT-414] Remove templates-learning", + "branch": "remove/templates-learning", + "merged_at": "2026-01-23T17:53:23Z", + "changed_files": 1, + "additions": 0, + "deletions": 67, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThe templates-learning team is no longer a team. Removing CODEOWNERS ownership for that team. Deleted lines for package.json in packages are the result of the glob pattern now matching (as there's no ownership for the package to overwrite the glob).\r\n\r\nOpted for deletion of code ownership lines rather than commenting because as this file evolves, the sorting of the file will cause those comments to be out of place and the current linting script interprets comments as being associated with the entry below them.\n\n\n---\n\n> [!NOTE]\n> Removes `@tactivos/templates-learning` ownership across CODEOWNERS, deleting many template/snippets/learning-related path entries and relying on existing broader patterns (e.g., `packages/**/package.json`) for ownership.\n> \n> - Cleans up obsolete paths and team references; no source code or logic changes\n> - Ownership now falls back to existing team globs for affected files\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 99d21bfcd23fac23bf6c4ff3d0c4855fbf9b5b3e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46817, + "title": "[NEXT-410] Refactors sdk apis to use specific imports and modularizes them", + "branch": "update/modularize-src-mural-dispatcher", + "merged_at": "2026-01-23T17:44:41Z", + "changed_files": 25, + "additions": 96, + "deletions": 69, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the dispatcher layer to remove the monolithic SdkApis dependency in favor of specific, focused SDK API dependencies. The changes move several dispatcher API implementations from src/mural/dispatcher/ to packages/canvas/src/dispatcher/ to improve modularity and reduce coupling.\r\n\r\nChanges:\r\n- Moved dispatcher API implementations (workspaces, video, permissions, notification-bar, features, experiments, actions-tracker, content-extension) from murally-specific code to the shared canvas package\r\n- Updated dependency injection to use specific SDK API interfaces instead of the full SdkApis type\r\n- Refactored widget-toolbar and hidden-tooltips to accept only required SDK API dependencies\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-410) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Modernizes dispatcher dependency injection and centralizes shared modules in the canvas package.\n> \n> - Replaces `SdkApis` with scoped SDK interfaces across dispatcher factories (`actions-tracker`, `content-extension`, `experiments`, `features`, `notification-bar`, `permissions`, `video`, `workspaces`)\n> - Migrates the above dispatcher implementations to `packages/canvas/src/dispatcher` and updates index exports for reusability\n> - Updates `src/mural/dispatcher/index.ts` to consume the new canvas dispatcher factories; removes local `features` factory\n> - Refines `actions-tracker` types and create factory (typed `functionCalled`, `AIEventOrigin` usage, exports `AIPillUsageInfo`)\n> - Adjusts widget toolbar tracking to accept only required SDK slices; preserves deprecated `trackWidgetToolbarAction` wrapper\n> \n> Written by [Cursor Bugbot]", + "labels": [] + }, + { + "number": 46879, + "title": "[CWI-2555] Emoji Tab Updates", + "branch": "update/cwi-2555-emoji-tab", + "merged_at": "2026-01-23T17:32:54Z", + "changed_files": 6, + "additions": 79, + "deletions": 65, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Update heading/collapsible toggle size\r\n- Update to MrlButton for tooltip styling/behavior\r\n\r\n\"image\"\r\n\r\n- Update footer with divider styles\r\n\r\n\"image\"\r\n\r\n- Update to search category in addition to emojis themselves\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2555 to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.n", + "labels": [] + }, + { + "number": 46875, + "title": "Breaks apart and migrates `src/mural/register` ui-component types", + "branch": "register-prereq", + "merged_at": "2026-01-23T16:58:17Z", + "changed_files": 58, + "additions": 196, + "deletions": 197, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, UI component types for the register system were centralized in `src/mural/register/types/ui-components.ts`, which contained types for bottom bar menus, sidebar buttons, and secondary top bar components. This monolithic file made it difficult to reuse types across packages and created tight coupling between the main codebase and the canvas package.\r\n\r\nNow, with these changes, we've broken apart and migrated these types into more appropriate locations:\r\n- **Bottom bar types** (`BottomBarButton`, `BottomBarMenuSpec`, `BottomBarMenuState`, etc.) moved to `packages/canvas/src/register/types/bottom-bar.ts` - making them available via `@muralco/canvas/register`\r\n- **Tab types** (`TabProps`) moved to `packages/canvas/src/register/types/tabs.ts` - also available via `@muralco/canvas/register`\r\n- **Sidebar types** (`SidebarButton`, `SecondaryTopBarSpec`) moved to `src/mural/register/types/sidebar.ts` - keeping them in the main codebase as they have dependencies on mural-specific state\r\n\r\nThis refactoring improves code organization, enables type reuse across packages, and reduces coupling between the main codebase and canvas package. All 58 affected files have been updated to use the new import paths.\r\n", + "labels": [] + }, + { + "number": 46810, + "title": "[CWI-2527] Integrations Platform - Bulk export", + "branch": "add/cwi-2527", + "merged_at": "2026-01-23T16:38:11Z", + "changed_files": 275, + "additions": 6640, + "deletions": 2707, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Bulk export\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2527\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-api/pull/15219\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Integrations Platform \u2013 Bulk export and SOR refactor**\n> \n> - Adds Export Records modal with validation and multi-selection support; wires \u201cSend to\u201d context-menu items (Azure DevOps, Jira, GitHub) gated by `canExportSelection` and `ENABLE_EXPORT_RECORDS_MODAL`\n> - Introduces `CREATE_RECORD_BATCH_SIZE` and updates system-of-record state to include `exportRecordsModal` and `recordAndDependencies`; selectors and services updated accordingly\n> - Refactors SOR core into `@muralco/integrations-platform/platform/system-of-record` (types, resource cache/loader); updates `SorTypeBundle` to use `recordAndDependencies` and request payloads; field APIs gain `getIsRequired`, `buildCreatePayload`/`buildUpdatePayload`\n> - Adds Asana `createTask` and Microsoft Planner `getPlans`/`createTask`; extends Asana update payload and custom-field handling\n> - Updates import/sync flows (replace/update widgets, config auto-updates, out-of-sync labeling) and broad test coverage\n> - Adds React as a dep to integrations-platform for field components\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 31e77b5a524a4c318bd147b399b256a6b7f96724. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46869, + "title": "[SCQM-1585] Add modal for migrated AI Summarize", + "branch": "update/scqm-1585-unhub-summarize", + "merged_at": "2026-01-23T13:11:30Z", + "changed_files": 10, + "additions": 311, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds a new modal that gets triggered when a user tries to use AI Summarize from the AI Hub (both landing page and \"all prompts\" section) when the feature has already been migrated to the widget's toolbar (to use the new chat-less AI Actions).\r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1585) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1585-unhub-summarize.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\n1. Enable the `feat-mu-ai-action-summarize-enabled` feature flag in the Flags Manager and refresh the page\r\n2. Open the AI Hub and click the **Summarize** tile, it should show the new modal instead of triggering the feature.\r\n3. Open the AI Hub and go to the \"all prompts\" section and click the **Summarize** option, it should show the new modal instead of triggering the feature.\r\n4. Selecting a bunch of stickies and opening the Explore with AI toolbar menu should show the new Action Summarize (the 3 options dropdown) and work as usual.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces an educational modal for AI features migrated from the AI Hub to the widget toolbar and integrates it across the AI Hub experience.\n> \n> - Adds `featureMigratedInfo` to `AIFeatureSpec` to signal migrated features (`packages/canvas/src/register/types/ai.ts`)\n> - New modal component `openAIFeatureMigratedModal` with UI and styles, plus unit tests (`src", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46867, + "title": "Improved automated test coverage for undo operations on tables", + "branch": "testcoverage/can-8341", + "merged_at": "2026-01-23T12:54:39Z", + "changed_files": 8, + "additions": 1316, + "deletions": 68, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds automated undo/persistence coverage for the After Fix table scenarios and strengthens the shared test harness so undo commits are validated against persisted store diffs.\r\n\r\n- Undo test helper now captures commit diffs and stubs engine/text/table-cell APIs to simulate realistic undo persistence flows.\r\n- Added a shared layout consistency assertion to catch orphaned cells after undo.\r\n- Added new unit tests for merge undo variants, cell color/child widget undo, internal border resize undo, and outer table resize undo.\r\n\r\n### Case Covered\r\n\r\n- Delete row/column + undo with child widgets and connected arrows; asserts persisted layout updates and layout consistency.\r\n- Insert row/column + undo persists table layout updates.\r\n- Merge (horizontal, vertical, 2x2) + undo, including interconnected widgets.\r\n- Internal row/column resize + undo.\r\n- Outer border resize (horizontal, vertical, both) + undo.\r\n- Cell background change + undo and child widget add + undo.\r\n\r\n### How the tests work\r\n\r\n- Undo is now validated against the same store diff that commit() uses, so any missing persistence on rows/columns/cells is caught by tests.\r\n- Layout integrity is asserted after undo to detect orphaned cells and missing grid coverage.\r\n\r\n### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8341) \r\n\n\n---\n\n> [!NOTE]\n> Strengthens undo/persistence validation for table workflows with focused unit tests and shared testing utilities.\n> \n> - Adds tests for `deleteRowOrColumn`, `insertRowOrColumn`, `mergeCells`, `resizeRowOrColumn`, and outer `resizeTable` undo behavior (layout restored; persistence calls asserted)\n> - Verifies child widgets and interconnected arrows are correctly restored and persisted after undo\n> - Introduces `createUndoPersistenceTestContext` to capture commit diffs and stub SDK/engine/table-cell APIs\n> - Adds `expectTableLayoutMatchesCells` to catch orphaned ", + "labels": [] + }, + { + "number": 46803, + "title": "[IPA-345] Added semantic search company flags", + "branch": "fix/semantic-company-flags", + "merged_at": "2026-01-23T06:50:29Z", + "changed_files": 4, + "additions": 117, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nhttps://semantic-company-flags.mural.engineering/c/internal-sso/internal/tools/settings\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the ", + "labels": [] + }, + { + "number": 46874, + "title": "[NEXT-276, NEXT-277, NEXT-278] migrate three additional workspace block routes", + "branch": "feat/move-additional-block-rtes", + "merged_at": "2026-01-22T21:07:44Z", + "changed_files": 11, + "additions": 95, + "deletions": 88, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #46821 . Moves three additional \"block routes\" to `@muralco/workspace-settings`\r\n- `/t/:tid/workspace-suspended`\r\n- `/t/:tid/account-suspended`\r\n- `/t/:tid/soft-block-expired`\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://move-additional-block-rtes.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nOnce you're auth'd in the test env, you can navigate to the routes above manually to verify that the view appears correctly.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+B", + "labels": [] + }, + { + "number": 46527, + "title": "[ESC-1846] Add company data deletion UI", + "branch": "add/esc-1846-add-company-deletion-ui-v2", + "merged_at": "2026-01-22T20:03:14Z", + "changed_files": 29, + "additions": 2733, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the data deletion process was done by the ESC team manually through scripts and the migration framework.\r\nNow, with these changes, users with dataRequestSubject permission (support & legal mostly) will have a way to schedule a company deletion, also cancelling and rescheduling it.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1846) to understand the context of this effort.\r\nPlease see this \ud83c\udfac of the acceptance criteria for the above ticket\r\n\r\n\r\nhttps://github.com/user-attachments/assets/b50da0f5-043c-4fc9-aa58-76dfd86a1ab1\r\n\r\n Keep in mind that the date picker is shown in the locale navigator settings for the date display, see the uitoolkit docs https://uitoolkit.mural.co/0dcaf1fc5/p/94b048-date-picker\r\n\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15147)\r\n- [**Design**](https://www.figma.com/design/qoEjhJMUHuR5RxZ1xOiLiZ/ESC-Churned-Customer?node-id=1-3&p=f&m=dev)\r\n- [Testing Env](https://esc-1846-add-company-deletion-ui-v2.mural.engineering/me/data-deletion-tool)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n", + "labels": [] + }, + { + "number": 46821, + "title": "[NEXT-275] package workspace account locked route", + "branch": "feat/next-275-acct-lcked-rte", + "merged_at": "2026-01-22T19:39:15Z", + "changed_files": 64, + "additions": 333, + "deletions": 278, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFirst PR to move the family of \"block routes\" for workspaces:\r\n- Moves all components, types, HOCs, helpers, etc. needed to support rendering/exporting the `t/:tid/account-locked` route from `@muralco/workspace-settings`\r\n- Updates shared references and `src/route-config.tsx`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-275) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-275-acct-lcked-rte.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nMostly a file location refactor / so TS and test coverage should help us here, but I did try to clean up some odd naming. Suggest a smoke test in the test env by navigating to `https://next-275-acct-lcked-rte.mural.engineering/t/:your-workspace-id/account-locked`, verifying everything looks alright, various controls function as expected.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good tec", + "labels": [] + }, + { + "number": 46873, + "title": "[MFRD-78] Transfer remaining smart-canvas smart-framework related paths", + "branch": "update/smart-framework-ownership", + "merged_at": "2026-01-22T18:54:05Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes two smart framework related paths still required review from the smart-canvas team, which no longer exists.\r\n\r\nNow, with these changes, those paths are owned by the proper team, #ask-integrated-workflows.\r\n\r\nNo code changes, just `CODEOWNERS`.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-78) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\n\n\n---\n\n> [!NOTE]\n> Updates ownership metadata only.\n> \n> - Reassigns `CODEOWNERS` for `src/mural/addons/widget-compositors` and `src/mural/business/smart-frameworks` from `@tactivos/smart-canvas` to `@tactivos/workflows-and-integrations`\n> - Aligns review responsibility for smart-framework/widget compositor paths with the integrated workflows team\n> - No source code changes\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4c479ce88357c36fac3f13b2bbeefb6117898530. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46854, + "title": "Migrates additional \"high\" and \"critical\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-critical", + "merged_at": "2026-01-22T18:01:29Z", + "changed_files": 200, + "additions": 305, + "deletions": 280, + "body": "This PR continues the series of modularizing canvas dependencies into the canvas package, handling remaining `high` and `critical` priority dependencies that were missed in previous migration PRs.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\n## What Was Migrated\r\n\r\n### Addons\r\n- **Mindmaps types** (`addons/mindmaps/types.ts`) - Mindmap handler types, node connection types, and expand/collapse utilities\r\n\r\n### Business Logic\r\n- **Discovery call** (`business/discovery-call/`) - Discovery call types and business logic utilities\r\n- **Kanban types** (`business/kanban/types.ts`) - Kanban board types and utilities (122 imports)\r\n\r\n### Dispatcher\r\n- **Rightbar types** (`dispatcher/rightbar/types.ts`) - Rightbar API types and interfaces (25 imports)\r\n\r\n### Helpers\r\n- **Shapes utilities** (`helpers/shapes/`) - Shape path utilities and shape-related helper functions\r\n\r\n## Export Reorganization\r\n\r\nThis PR reorganizes several exports for better consistency:\r\n\r\n**Business Module**:\r\n- Changed from selective exports to wildcard export for `inclusive-selection`\r\n- Added `discovery-call` export path\r\n\r\n**Dispatcher Module**:\r\n- Reorganized export order for better consistency\r\n- Added `rightbar` export path\r\n\r\n**Helpers Module**:\r\n- Added `shapes` export path\r\n\r\n**Addons Module**:\r\n- Updated mindmaps types to use relative imports for internal dependencies\r\n\r\n## Changes Summary\r\n\r\n- **203 files changed**: 307 additions, 281 deletions\r\n- **Updated imports**: All consuming files now import from `@muralco/canvas` instead of relative paths\r\n- **Reorganized exports**: Improved consistency in barrel exports across business, dispatcher, and helpers modules\n\n\n---\n\n> [!NOTE]\n> Consolidates widely used mod", + "labels": [] + }, + { + "number": 46863, + "title": "Improve Distributed Cucumber ", + "branch": "fix/dist-test-to", + "merged_at": "2026-01-22T16:22:00Z", + "changed_files": 4, + "additions": 105, + "deletions": 20, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImprovements in the distributed Cucumber test infrastructure by reducing timeouts, enhancing logging, and scaling up test runner parallelism.\r\n\r\n**Changes:**\r\n- Reduced first result timeout from 30 to 3 minutes in the producer watchdog: This fixes the problem when consumers fail and the producer keeps waiting without any value. *Fail FAST*\r\n- Increased test runner count from 4 to 9 for Rig v2: This reduce time from around ~6m to ~4m \r\n- Enhanced logging functions with timestamps and structured context flattening\r\n- Added npm script wrappers for CI/CD cucumber cluster operations\r\n\r\n#### Reviewer Resources\r\n- If tests are running, we're goood :)\r\n- [Jira ticket](https://www.youtube.com/watch?v=aR3MDSF-IpQ)\n\n\n---\n\n> [!NOTE]\n> Strengthens distributed Cucumber CI by failing faster, improving observability, and standardizing worker orchestration.\n> \n> - Reduce producer watchdog `firstResultTimeout` from `30m` to `3m` and emit `::warning::` on timeouts\n> - Enhance logging in `cluster-helpers.js` with timestamps and flattened context via `log`/`warn`\n> - Increase Rig v2 `runner_count` to `9` in `quality.yml` to improve parallelism\n> - Replace direct scripts with npm wrappers: `test:ci:cucumber:start-workers` and `test:ci:cucumber:finalize-workers` in workflow\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 885214d343974ee003e529d93e157a4c35c5c3d9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46833, + "title": "[CAN-8303] Implement `reset` on resize", + "branch": "refactor/reset-on-resize", + "merged_at": "2026-01-22T14:44:42Z", + "changed_files": 7, + "additions": 329, + "deletions": 321, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR implements the concept of `reset` when resizing widgets.\r\n\r\nAfter this change, every resize step is considered as an atomic movement between the initial point and the current one.\r\n\r\nThe motivation behind this change is to have a more accurate reflection of what resizing an absorbing widget over one or more absorbable widgets represents in terms of layering.\r\nThis is a change that goes along the new stacking order system, therefore in order for it to make sense, the flag controlling the stacking order system needs to be enabled (without it this change is innocuous).\r\n\r\nWithout this change, resizing an area over two widgets would send to the front the widgets as they were getting absorbed, so the last one would end up on the front every time, even if it wasn't beforehand.\r\nBy resetting the changes on each movement, the stacking order between the two widgets is respected:\r\n\r\n_Before resetting:_\r\n![Jan-20-2026 15-31-47](https://github.com/user-attachments/assets/57ac1380-cd4a-4169-a3e6-d405f793520e)\r\n\r\n_After resetting:_\r\n![Jan-20-2026 15-37-36](https://github.com/user-attachments/assets/59a0dd24-4fa7-4814-85f5-bc06032eac1b)\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8303)\r\n- \ud83e\uddea [**Testing environment**](https://reset-on-resize.mural.engineering)\r\n\n\n---\n\n> [!NOTE]\n> Implements atomic resize steps and aligns APIs/types across canvas and app layers.\n> \n> - **Atomic resizing**: Each drag step now resets staged changes and reapplies `initialActions`, treating the movement as from the original point (`sdk.widgets.changes.reset()` + reapply initial state).\n> - **API refactor**: `ResizeWidgets` is now a factory `(initialX, initialY, handler) => ResizeWidgetsHandler` with `drag/end`; exports and types updated in `packages/canvas` and dispatcher consumes the returned handler.\n> - **Dispatcher integration**: `widgets.resize.start` stores the `Re", + "labels": [] + }, + { + "number": 46864, + "title": "[MFRD-65] Ownership transition locking and comments", + "branch": "update/smart-canvas-ownership-2", + "merged_at": "2026-01-22T00:45:16Z", + "changed_files": 1, + "additions": 16, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nJIRA: https://mural.atlassian.net/browse/MFRD-73 && https://mural.atlassian.net/browse/MFRD-65\n\n\n---\n\n> [!NOTE]\n> Re-scopes code ownership across canvas and UI areas to reflect new team responsibilities.\n> \n> - Moves locking-related paths (e.g., `features/canvas/selection/lock-selection/`, `features/canvas/toolbar/locking/`, `src/mural/.../toolbar/lock/`, `src/mural/business/lock/`, `src/mural/dispatcher/widgets/locking/`, `src/mural/sdk/apis/widgets/lock*`, `src/views/.../locked-widgets-layer/`) to `@tactivos/canvas-core-nav`\n> - Moves comments-related paths (e.g., `src/mural/addons/core/comments/`, `src/mural/business/comments/`, `src/mural/dispatcher/widgets/comments/`, `src/shared/comments/`, `src/views/mural/ui/comments/`, `features/canvas/widgets/comment/`) to `@tactivos/engagement-team`\n> - Adjusts a few additional ownerships (e.g., `src/icons/lock.tsx`, `src/mural/addons/core/context-menu/lock/`) from `@tactivos/smart-canvas` to appropriate teams\n> - Removes a stale CODEOWNERS entry for `src/mural/helpers/tags` and adds ownership for `packages/canvas/src/helpers/tags` under canvas core\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit dd8169bda8a4ddb9fae409ac08f42d4486078ced. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46856, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-13", + "merged_at": "2026-01-21T23:12:14Z", + "changed_files": 78, + "additions": 282, + "deletions": 281, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these branches of the state:\r\n* `internal`\r\n* `system-of-record`\r\n* `temporary-mural`\r\n\r\nThe environment: https://next-356-13.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Centralizes state by moving `internal`, `system-of-record`, and `temporary-mural` into `@muralco/canvas/sdk/state`, exposing initial state and types.\n> \n> - Adds packaged state modules: `internal`, `system-of-record` (incl. `ImportRecordsModalState`, `BaseSearchResult`, SOR type aliases), and `temporary-mural` with `initial` values\n> - Replaces app-local state/types and initializers with imports from `@muralco/canvas/sdk/state`; removes deprecated local definitions\n> - Updates dispatcher, SDK APIs, business logic, and tests to use new state (e.g., `InternalMuralState.initial`, `SystemOfRecordState.initial`, SOR type names)\n> - Minor type relocations (e.g., `BaseSearchResult`) and selector/SDK tweaks to read packaged state\n> \n> Scope: large import/path refactor; no feature or behavior changes intended.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 49e9fecc25f6b9d5295c093244be8e3000d0afa4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46861, + "title": "[FEP-75] - remove MrlDatePicker fixed width", + "branch": "fix/date-picker-fixed-width", + "merged_at": "2026-01-21T20:52:36Z", + "changed_files": 5, + "additions": 7, + "deletions": 25, + "body": "Linear - [FEP-75](https://linear.app/mural/issue/FEP-75/mrldatepicker-remove-fixed-width)\r\n\r\nJira - [FEP-6435](https://mural.atlassian.net/browse/FEP-6435)\r\n\r\n[https://date-picker-fixed-width.mural.engineering/](https://date-picker-fixed-width.mural.engineering/)\r\n\r\n[FEP-75]: https://mural.atlassian.net/browse/FEP-75?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n[FEP-6435]: https://mural.atlassian.net/browse/FEP-6435?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\r\nThis PR updates `ui-toolkit` to a version that fixes the `MrlDatePicker` component by removing its fixed width. It also removes all width-related style overrides for `MrlDatePicker`.\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Updates dependency and cleans up styling to align with the new date picker sizing.\n> \n> - Bumps `@muraldevkit/ui-toolkit` from `4.61.0` to `4.61.1`\n> - Removes width-related overrides for `MrlDatePicker` in `packages/admin-reports/style.sass` and `sor-ticket.module.sass`\n> - Simplifies `mural-ticket.tsx` by dropping `classnames` and the `datePicker` style, using only `propertyContainer`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e177c785558498b3c27188cce2fb4fe10a389d45. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46862, + "title": "Fix `getDefaultWidgetBackgroundColor` usage + standardize canvas helper exports", + "branch": "patch-canvas-package-defaults", + "merged_at": "2026-01-21T19:12:49Z", + "changed_files": 13, + "additions": 27, + "deletions": 30, + "body": "## Summary\r\n\r\nFixes a critical bug in AI searchable options where sticky widget background colors were being lost, and standardizes canvas helper exports.\r\n\r\nTest env: https://patch-canvas-package-defaults.mural.engineering\r\n\r\n### \ud83d\udd27 Standardize Canvas Helper Exports\r\n\r\nConverted default exports to named exports for consistency:\r\n- `AnimatedScrollerTransition` \u2192 `animatedScrollerTransition`\r\n- `ContainsGroupedWidgets` \u2192 `containsGroupedWidgets`\r\n- `MeasureText` \u2192 `measureText`\r\n- `WithWheelStopPropagation` \u2192 `WithWheelStopPropagation` (HOC, kept PascalCase)\r\n\n\n---\n\n> [!NOTE]\n> Standardizes canvas helper exports to named exports and updates all call sites.\n> \n> - Switch default \u2192 named exports for `animatedScrollerTransition`, `containsGroupedWidgets`, `measureText`, and `WithWheelStopPropagation`\n> - Update re-exports in `helpers/index.ts`\n> - Refactor imports/usages across context menu, editors (drawing/inking), delete-widgets, widget creation, input hint editor, and shape-text to the new named exports\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit fe9e1143a9c4960a8972d13848f7d6acab8a4213. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46849, + "title": "[CAN-8350] Arrange tools had a name change", + "branch": "beta-fix/arrange", + "merged_at": "2026-01-21T18:46:35Z", + "changed_files": 1, + "additions": 7, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI changed the names of the arrange tools which broke the IA addon that updates that tool. \r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8350)\r\n[Test Env](https://arrange.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and", + "labels": [] + }, + { + "number": 46858, + "title": "[SCQM-1580] Transfer AI files to new `ai-innovation` team", + "branch": "update/ai-innovation-codeowners", + "merged_at": "2026-01-21T18:46:15Z", + "changed_files": 1, + "additions": 22, + "deletions": 22, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, AI and mermaid/diagramming `CODEOWNERS` entries were owned by `@tactivos/smart-canvas`, with non-AI smart-canvas paths mixed in as well.\r\n\r\nNow, with these changes, all AI and mermaid/diagramming `CODEOWNERS` entries are owned by `@tactivos/ai-innovation` while non-AI smart-canvas ownership remains unchanged.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1580) to understand the context of this effort.\r\n- No code changes have been made as a part of this update - it is only a `CODEOWNERS` change.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15234)\r\n\n\n---\n\n> [!NOTE]\n> Reassigns ownership of AI- and diagramming-related areas across the repo in `CODEOWNERS`.\n> \n> - Transfers `features/canvas/ai/`, `packages/api/src/.../ai*.ts`, `packages/canvas/src/sdk/{apis,hooks,state}/ai/`, `src/mural/{addons,dispatcher,sdk}/ai/`, preview-mode paths, dev tools, tests, and `src/mural/addons/mermaid/` to `@tactivos/ai-innovation`\n> - Leaves non-AI `@tactivos/smart-canvas` ownership (e.g., comments, locking, widgets compositors) unchanged\n> - No source code modified; ownership-only update\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b8fc54c15472f97ffb3ac4bec7624ddaac07f508. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46843, + "title": "chore: update pluralize types and eslint config to disallow usage of non-existant globals", + "branch": "chore/update-pluralize-types", + "merged_at": "2026-01-21T17:51:41Z", + "changed_files": 12, + "additions": 107, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to #46828 \r\n\r\nThis PR proposes a solution to a quirk with our usage of the `pluralize` npm package. The types for that package in the version we're currently using on `master` [expose a global `pluralize` definition for UMD purposes](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/27064). Combined with our current `eslint` configuration, this allowed for committing references to `pluralize` without explicitly importing it in the referencing file, passing our current set of pre-commit and build checks, but causing a runtime type error in the bundled code. Changes:\r\n\r\n- Updates the `@types/pluralize` package to trigger TS level warnings / typecheck failures when the package is not explicitly imported\r\n- Update: adds a new custom/internal eslint rule to catch references to a global `pluralize` as errors so they will be flagged in an IDE and caught in precommit checks\r\n- Drops some mocks in the rig V1 and V2 test config that didn't seem to be doing anything as there are no more references to a global `pluralize` instance anyway\r\n- ~Removes an existing eslint rule override downgrading `no-restricted-global` violations as warnings~\r\n- ~Adds an explicit and narrow eslint rule override ensuring references to a global `pluralize` will be flagged as errors so they will be flagged in an IDE and caught in precommit checks~\r\n\r\n\r\n#### Reviewer Resources\r\nThis is a type level / linter fix. You can verify locally by finding a file that uses `pluralize` and commenting out the `import * as pluralize from pluralize` line, attempting to commit it (should see warnings and failed pre-commit checks)\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that", + "labels": [] + }, + { + "number": 46808, + "title": "[SCQM-1514] Refactor AI Clustering layout logic", + "branch": "fix/scqm-1514-cluster-sizes", + "merged_at": "2026-01-21T17:37:36Z", + "changed_files": 3, + "additions": 1948, + "deletions": 375, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the logic used for placing Clusters and their content in favor of a layout flow executed after changes are made.\r\nThis fixes support for non-standard stickies being clustered, and makes it easier to improve upon as needed in the future.\r\n\r\n**DISCLAIMER**\r\nThis PR is easier followed by commit, it's split in 2 parts:\r\n1. Refactors the code to use the new layout logic.\r\n2. Extracts the layout functions into a separate file and adds test coverage to them.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1514) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1514-cluster-sizes.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\n1. Add a lot of stickies of different sizes with content that can be split into different topics\r\n2. Cluster them. Clusters should update size and position as content is added into them, and one again at the end. The result should be a grid-like of clusters of differing sizes, with their content also laid out in a grid-like pattern, regardless of their individual size.\r\n\r\nSome rules that were implemented here and we might want to iterate on in the future:\r\n1. There's a minimum width clusters should always have to prevent titles from cutting short (it's the same as the starting empty-state width).\r\n2. Having only 3 or less stickies in a cluster enforces the cluster to fit their width so they only take 1 row.\r\n3. If an outlier widget is bigger than the space needed to have 3 regular (median width) stickies filling a row, then we use said outlier width to define the cluster's width in a bid to have it take a single row, and we leave the rest of the stickies to fit as available.\r\n4. We otherwise resize the cluster to fit 3 stickies per", + "labels": [ + "ai-innovation" + ] + }, + { + "number": 46852, + "title": "[NEXT-411] Migrate canvas helper utilities from src/mural/helpers to @muralco/canvas package", + "branch": "migrate-helpers-2", + "merged_at": "2026-01-21T17:25:35Z", + "changed_files": 101, + "additions": 179, + "deletions": 146, + "body": "## Summary\nMigrates 28 canvas-related helper files from `src/mural/helpers/` to `packages/canvas/src/helpers/` to centralize canvas utilities in the `@muralco/canvas` package.\n\n## Migrated Files\n\n### Accessibility\n- **accessibility/types.ts** \u2192 `packages/canvas/src/helpers/accessibility/types.ts` - Accessibility type definitions\n\n### Widget & Canvas Helpers \n- **action-bar.ts** \u2192 `packages/canvas/src/helpers/action-bar.ts` - Action bar utilities\n- **can-draw-by-zoom-level.ts** \u2192 `packages/canvas/src/helpers/can-draw-by-zoom-level.ts` - Zoom-based rendering logic\n- **contains-grouped-widgets.ts** \u2192 `packages/canvas/src/helpers/contains-grouped-widgets.ts` - Group detection utilities\n- **get-background-color.ts** \u2192 `packages/canvas/src/helpers/get-background-color.ts` - Background color calculations\n- **get-default-thumbnail.ts** \u2192 `packages/canvas/src/helpers/get-default-thumbnail.ts` - Thumbnail generation logic\n- **get-photo-original-rect.ts** \u2192 `packages/canvas/src/helpers/get-photo-original-rect.ts` - Photo dimension calculations\n- **get-selection-rect.ts** \u2192 `packages/canvas/src/helpers/get-selection-rect.ts` - Selection bounds calculations\n- **get-toolbar-widgets.ts** \u2192 `packages/canvas/src/helpers/get-toolbar-widgets.ts` - Toolbar widget filtering\n- **is-widget-or-ancestors-hidden.ts** \u2192 `packages/canvas/src/helpers/is-widget-or-ancestors-hidden.ts` - Visibility checks\n- **widgets-handlers.ts** \u2192 `packages/canvas/src/helpers/widgets-handlers.ts` - Widget event handlers\n\n### Animation & Interaction\n- **animated-scroller-transition.ts** \u2192 `packages/canvas/src/helpers/animated-scroller-transition.ts` - Scroll animations\n- **animated-value.ts** \u2192 `packages/canvas/src/helpers/animated-value.ts` - Value interpolation utilities\n- **microdragging.ts** \u2192 `packages/canvas/src/helpers/microdragging.ts` - Drag threshold detection\n\n### Text & Typography\n- **font-metrics.ts** \u2192 `packages/canvas/src/helpers/font-metrics.ts` - Font measurement utilities\n- **measure-text.ts**", + "labels": [] + }, + { + "number": 46813, + "title": "[CAN-8286] Add path 3 of the new navigation rollout", + "branch": "add/can-8286", + "merged_at": "2026-01-21T15:06:24Z", + "changed_files": 3, + "additions": 39, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds the 3rd path of the rollout. \r\nWhen the navigation-ga flag is active, the 3rd part informs the users about the new navigation experience without giving a way to rollback.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8286.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds GA path for the navigation rollout.\n> \n> - Introduces `FEATURES.ENABLE_NAVIGATION_GA` in `optimizely-constants.ts` and exposes it in the dev flags manager\n> - In `rollout-callouts`, when both `ENABLE_NAVIGATION_GA` and `ENABLE_NAVIGATION_CALLOUT` are on, adjusts callouts: updated titles/descriptions, removes `onClose`/`secondaryCta`, and prevents rollback, while preserving the tour flow (`TRY_LATEST_NAV_CALLOUT` \u2192 `SELECT_TOOL_CALLOUT` \u2192 `PAN_TOOL_CALLOUT`)\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bb14bdcf6db6ffe35255a8108b8502aa599b2253. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46732, + "title": "IAM-2311 Quick filters", + "branch": "add/iam-2311-quick-filters", + "merged_at": "2026-01-21T14:48:45Z", + "changed_files": 10, + "additions": 157, + "deletions": 37, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds quick filters as per figma designs\r\n\r\nhttps://mural.atlassian.net/browse/IAM-2311\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Ap", + "labels": [] + }, + { + "number": 46832, + "title": "[CAN-8302] Refactor `afterResizeEnd` hook to return a list of changes", + "branch": "refactor/after-resize-end", + "merged_at": "2026-01-21T13:53:57Z", + "changed_files": 12, + "additions": 74, + "deletions": 51, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the `afterResizeEnd` hook to return a list of changes instead of letting handlers apply them directly.\r\n\r\nThe motivation behind this change is related to keep control of who originates widget changes and when.\r\nOn a resizing operation, the changes to the widgets model should be restricted only to the resizing operation core logic.\r\n\r\nThis is the last of the hooks related to resizing that needed amending.\r\n\r\nIn this particular case, we need to address two handlers related to Smart Planners that were applying changes within their logic.\r\n\r\nIn this PR there's also a change in the `CODEOWNERS` to move ownership of the widget composition addon from the Smart Canvas team onto the Workflows and Integrations team.\r\n\r\nNo change in the app or its behavior is expected whatsoever.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8302)\r\n- \ud83e\uddea [**Testing environment**](https://after-resize-end.mural.engineering)\r\n\n\n---\n\n> [!NOTE]\n> Modernizes the resize hook pipeline to collect and apply changes centrally.\n> \n> - Refactors `ResizeWidgetsHookHandler.afterResizeEnd` to return `ActionList`; dispatcher now aggregates with `reduceHandlersFor` and applies before `commit`\n> - Updates Kanban/compositor plugins to return actions instead of mutating state directly (e.g., column visual updates, clearing temporary widgets); replaces direct `apply/commit` with action builders\n> - Adjusts tests/mocks to new return types and selection behavior\n> - CODEOWNERS: transfers `src/mural/addons/core/widget-composition` to `@tactivos/workflows-and-integrations`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bc406115d2cb7c721bc6110ac1390f79e78fea3c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46834, + "title": "[CWI-2528] Fix - SF Auth Updates - Error handling for expired token on integrations platform", + "branch": "fix/cwi-2528", + "merged_at": "2026-01-21T13:24:34Z", + "changed_files": 4, + "additions": 25, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - SF Auth Updates - Error handling for expired token on integrations platform\r\n\r\n#### Reviewer Resources\r\nhttps://mural.atlassian.net/browse/CWI-2528\r\n\r\n#### Related PRs\r\nhttps://github.com/tactivos/mural-api/pull/15221", + "labels": [] + }, + { + "number": 46822, + "title": "[MFRD-40] Reset mode after mural downloaded", + "branch": "fix/download-while-voting", + "merged_at": "2026-01-20T23:53:35Z", + "changed_files": 2, + "additions": 19, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPreviously, downloading the mural while in voting mode ended up breaking voting mode. Fixes that by switching back to the previous mode after downloading instead of defaulting to edit mode.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-40) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://download-while-voting.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nTo test:\r\n1. Open voting session\r\n2. Verify you can place a vote\r\n3. Download the mural via the top bar \r\n4. Once downloaded, verify you can place another vote\n\n\n---\n\n> [!NOTE]\n> Ensures the downloads panel no longer forces `edit` mode on close, preserving user context and avoiding disruptions (e.g., voting).\n> \n> - Store previous mural mode via `sdk.mural.getMode()` on `openPanel` and restore it in `closePanel` using `mural.setMode(previousMode ?? 'edit')`\n> - Add `previousMode: ProperMuralMode` state and reset it after closing\n> - Update tests to cover restoring a prior mode and defaulting to `edit` when no previous mode exists\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4c435b4e8cb479a49f3a75a7e4a30c89883e7bc6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46847, + "title": "[MFRD-95] Transition features from `smart-canvas` to `mural-for-rd`", + "branch": "update/mural-for-rd-codeowner", + "merged_at": "2026-01-20T23:23:09Z", + "changed_files": 1, + "additions": 94, + "deletions": 91, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nJIRA: https://mural.atlassian.net/browse/MFRD-95\r\n\r\nUpdate ownership from smart canvas to mural-for-rd: \r\n\r\nCelebrations\r\nCustom toolbar\r\nSummon & follow\r\nLaser pointer\r\nOutline\r\nParticipant avatar list\r\nPrivate mode\r\nMural reactions\r\nSticky note reactions\r\nTimer\r\nVoting\r\nAny other facilitation features\r\n\n\n---\n\n> [!NOTE]\n> Shifts ownership of facilitation-related areas to `@tactivos/mural-for-rd`, consolidating responsibility across the stack.\n> \n> - Updates CODEOWNERS for `features/`, `packages/api/src/*` (e.g., `murals/activity`, `private-time`, `voting`), and `packages/canvas/src/sdk/apis/*` (e.g., `activity`, `async`, `capabilities`, `facilitation`, `video`)\n> - Reassigns `src/mural/addons/core/*` (e.g., `bottom-bar`, `facilitation`, `outline`, `participants`, `top-bar/*`, `video-players`, `timer`) and sockets/reactions to `mural-for-rd`\n> - Moves ownership for `src/mural/business/*` (e.g., `facilitation`, `voting`, `inclusive-selection`) and related dispatchers (`activity`, `async`, `facilitation`, `outline`, `video`)\n> - Transfers UI views (`laser-layer`, `follow-layer`, `pointers-layer`, `emoji-picker`, `modals/*voting*`, `private-time`, `bottombar`, `activity`) and static assets (avatar icons, timer sounds)\n> - Minor: adds CODEOWNERS for `src/mural/helpers/tags` to `@tactivos/canvas-core-nav`; retains some AI/preview/locking under existing owners\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6bde4fa4e0e053b8825c01e5279f7e3d3f696512. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46820, + "title": "[MFRD-55] Remove zoom animation for presentation slides", + "branch": "bug/presentation-zoom", + "merged_at": "2026-01-20T22:53:06Z", + "changed_files": 2, + "additions": 80, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nDuring presentation mode, selecting an outline item from the panel should instantly take the user to the selected slide without an animation. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-55) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://presentation-zoom.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Create an outline and start the presentation\r\n 2. Open the presentation side panel\r\n 3. Select a slide\r\n 4. Observe the slide is centered without a zoom animation\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46824, + "title": "Upgrade sass and sass-loader", + "branch": "update-sass-version", + "merged_at": "2026-01-20T22:39:09Z", + "changed_files": 56, + "additions": 534, + "deletions": 235, + "body": "[https://linear.app/mural/issue/FEP-70/investigate-sass-upgrade-to-a-version-higher-than-171](https://linear.app/mural/issue/FEP-70/investigate-sass-upgrade-to-a-version-higher-than-171)\r\n\r\n[https://update-sass-version.mural.engineering/](https://update-sass-version.mural.engineering/)\r\n\r\nFEP-70\r\n\r\n# Upgrade SASS\r\n\r\nThis branch updates Sass and sass-loader to the latest supported versions, then adjusts syntax and tooling to match modern Dart Sass behavior. The upgrade is important to keep builds compatible with current tooling, reduce deprecation noise, and unblock future cleanup of legacy `@import` usage.\r\n\r\n### Dependencies versions\r\n\r\n- `sass` from `1.45.2` to `1.97.2`.\r\n- `sass-loader` from `10.2.0` to `16.0.6`\r\n\r\n### Changes\r\n\r\nThe following deprecation warnings were fixed:\r\n\r\n1. Replace global functions with module-based equivalents.\r\n\r\nExample:\r\n\r\n```sass\r\nbackground-color: transparentize($white, 0.2)\r\n\r\n// replaced with\r\n\r\n@use \"sass:color\"\r\nbackground-color: color.adjust($white, $alpha: -0.2)\r\n```\r\n\r\nColor helpers (e.g., `transparentize`, `darken`, `lighten`, `mix`) now use `sass:color`, list/map/string utilities use `sass:list`, `sass:map`, and `sass:string`, and percentage/round helpers move to `sass:math`.\r\n\r\n1. Replace `if()` that was deprecated in Dart Sass in favor of the `@if` directive.\r\n\r\n1. Import path syntax no longer supported (sass/sass-loader upgrade).\r\n\r\nThe following import path forms are no longer supported and were updated:\r\n\r\n- `~`-prefixed module paths (Webpack-only resolution).\r\n `@use \"~@muraldevkit/ds-foundation/src/styles/_mixins\"` -> `@use \"@muraldevkit/ds-foundation/src/styles/_mixins\"`\r\n\r\n- Explicit `node_modules/` paths.\r\n `@import \"node_modules/@muraldevkit/ui-toolkit/dist/styles/layout/variables\"` -> `@import \"@muraldevkit/ui-toolkit/dist/styles/layout/variables\"`\r\n\r\n- Absolute `src/...` paths without an alias in Sass load paths.\r\n `@import \"src/dashboard/grid/style\"` -> `@import \"../grid/style\"`\r\n\r\nWhy this is no longer sup", + "labels": [] + }, + { + "number": 46844, + "title": "[ESC-1899] Fix support link on IBM guest permissions settings", + "branch": "update/esc-1899-support-links-5", + "merged_at": "2026-01-20T22:27:36Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co link on IBM guest permissions settings.\r\n\r\nSee https://mural.slack.com/archives/C03ALFYHDU2/p1768930836464519?thread_ts=1768347373.711879&cid=C03ALFYHDU2.\n\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Updates external help link used in `GuestPermissions`.\n> \n> - Replaces `URL` in `visitors-settings/guest-permissions/index.tsx` with `https://support.mural.co/s/article/what-is-a-guest-in-mural`\n> - No logic or UI behavior changes beyond the link target\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit eba3165cf482e6b4db6d8afec9747cfa4d0b480b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46801, + "title": "[NEXT-325] Replace WithAuthenticatedUser with RequireAuth for something-went-wrong", + "branch": "fix/next-325", + "merged_at": "2026-01-20T21:36:56Z", + "changed_files": 4, + "additions": 24, + "deletions": 11, + "body": "\n> [!NOTE]\n> **Switch to new auth guard for error flow**\n> \n> - Wrap `integration-uh-oh` route with `RequireAuth`, using `onError` \u2192 redirect to `/signin`, `onLoading` \u2192 `MrlSpinner`, and `onMissingSession` \u2192 `logout`\n> - Convert `IntegrationSomethingWentWrong` to a plain component (remove `WithAuthenticatedUser`), add explicit `React.ReactElement` return type\n> - Add `@muralco/user` dependency to `@muralco/integrations`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0d510865600ff9b5af3487098e823d115b26adda. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46815, + "title": "[IPA-287 part 2] Connecting ROI dashboard datapoints and refactoring", + "branch": "add/ipa-287-part-2", + "merged_at": "2026-01-20T21:23:35Z", + "changed_files": 18, + "additions": 354, + "deletions": 128, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46842, + "title": "Change to sentence case", + "branch": "fix/request-access-sentence-case", + "merged_at": "2026-01-20T21:01:28Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "## Ticket \ud83c\udfab \r\n\r\nhttps://mural.atlassian.net/browse/CWI-2533\r\n\r\n## What was change and why \ud83e\udd14 \r\n\r\nChanged \"Request Access\" to be sentence-cased \"Request access\"\r\n\r\n## Testing \ud83e\udd16 \r\n\r\nTesting env: https://request-access-sentence-case.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Aligns button copy with sentence case style.\n> \n> - Updates `text` prop from `Request Access` to `Request access` in `app-request-footer.tsx` for the apps catalog request button\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5904071e4abc9813fa1b1eeb5f59ae71cad36321. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46839, + "title": "[ESC-1899] Update support links on access denied pages and guest-related pages", + "branch": "update/esc-1899-support-links-4", + "merged_at": "2026-01-20T20:47:43Z", + "changed_files": 6, + "additions": 6, + "deletions": 6, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\nTesting environment: https://esc-1899-support-links-4.mural.engineering/\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co links on access denied pages and guest-related pages.\r\n\r\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Updates hardcoded `support.mural.co` URLs to new article paths across access-denied screens and guest-related settings/components.\n> \n> - Access denied pages (`access-denied` and `access-denied-anonymous`) now link to collaborator types article\n> - Company/workspace guest settings and tooltips point to updated collaborator types and switch user types articles\n> - Guest facilitation setting links to updated facilitation superpowers article\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 81f6ecb009eb3ac003eb99bfd18002a4674adb5e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46782, + "title": "Migrates second batch of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-2", + "merged_at": "2026-01-20T20:35:25Z", + "changed_files": 295, + "additions": 721, + "deletions": 542, + "body": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the second batch of `medium` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\nTest env: https://migrate-medium-priority-deps-2.mural.engineering\n\n## What Was Migrated\n\n### Business Logic\n- **2-way sync types** (`business/2-way-sync/types.ts`) - Fields status, sync result, and sync function types for two-way synchronization\n- **Add template to canvas types** (`business/add-template-to-canvas/types.ts`) - Widget ID mapping, tracking data, and success arguments for template operations\n- **Inclusive selection** (`business/inclusive-selection.ts`) - Inclusive selection capability checking and state utilities\n- **Integrations bulk sync** (`business/integrations/bulk-sync/`) - Bulk synchronization types and service status management\n- **Kanban constants** (`business/kanban/consts.ts`) - Kanban board column limits (min/max)\n- **Resize widgets types** (`business/resize-widgets/types.ts`) - Resize scales type definitions\n- **Shapes** (`business/shapes/shape-supports-background.ts`) - Shape background support checking utilities\n- **System of Record** (`business/system-of-record/`) - Connection settings components, sync comparison utilities, and core types\n- **Tables types** (`business/tables/types.ts`) - Table axis type and selection set definitions\n\n### Components\n- **Wheel handler** (`components/wheel-handler.tsx`) - Mouse wheel event handling component with zoom constants\n\n### Dispatcher\n- **Direct exports** (`dispatcher/direct-exports/types.ts`) - Export context and direct exports API types\n- **Onboarding types** (`dispatcher/onboarding/types.ts`) - Invitee, quest, and modals on", + "labels": [] + }, + { + "number": 46845, + "title": "[ESC-1899] Update support link in \"no content\" message", + "branch": "update/esc-1899-support-links-6", + "merged_at": "2026-01-20T20:25:38Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\nTesting environment: https://esc-1899-support-links-6.mural.engineering/\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co link when running Find on a mural that has no content. Additionally, update the casing of the company name in the link text.\r\n\r\nSee https://mural.slack.com/archives/C03ALFYHDU2/p1768930555606349?thread_ts=1768347373.711879&cid=C03ALFYHDU2.\r\n\r\nhttps://github.com/user-attachments/assets/4179b81f-f4f9-4629-b722-dadceb3fdffa\r\n\r\n\r\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Replaces outdated support article link and standardizes brand casing in the Find blank-state.\n> \n> - In `find-blank-state-no-content.tsx`, updates `href` to `https://support.mural.co/s/article/collaborating-in-mural`\n> - Adjusts link text from \"MURAL\" to \"Mural\"\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9d5f35c5ce2e0221f8b412adb9df3057b7cd0331. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46841, + "title": "[ecomm-409] fix total amount in billing page with downgrade schedule", + "branch": "add/ecomm-409", + "merged_at": "2026-01-20T20:13:15Z", + "changed_files": 2, + "additions": 54, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI fix how we calculate the total amount when we have a subscription schedule in progress.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-409) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Record\r\n\r\n\"Screenshot\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adjusts pricing display logic to avoid showing downgraded `nextInvoice` totals during a scheduled change.\n> \n> - In `billing-summary.tsx`, set `totalPrice` to `derivedBillingRate` when `workspace.subscriptionScheduleId` exists; otherwise use `invoicePricing?.totalPrice || derivedBillingRate`.\n> - Adds unit tests in `billing-summary.test.tsx` covering total price behavior for scheduled downgrades and normal scenarios.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 294a52a27b2c2edfdbca0577d5202df3b06ba41b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46837, + "title": "[ESC-1899] Update support links on insights pages", + "branch": "update/esc-1899-support-links-2", + "merged_at": "2026-01-20T19:24:38Z", + "changed_files": 3, + "additions": 3, + "deletions": 3, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\nTesting environment: https://esc-1899-support-links-2.mural.engineering/\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co links on insights pages.\r\n\r\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> **Update support links on insights pages**\n> \n> - Change `Footer` `learnMoreLink` in `workspace-insights/index.tsx` to `https://support.mural.co/s/article/workspace-insights`\n> - Update E2E feature tests to expect new URLs:\n> - `overview.feature` uses `https://support.mural.co/s/article/mural-insights`\n> - `workspace-insights/footer.feature` uses `https://support.mural.co/s/article/workspace-insights`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 02e2c0cdf6ffe7bb3926a9979f51b6f14ed05142. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46814, + "title": "[CWI-2307] - Fix Jira sticky note text/label overflow", + "branch": "fix/cwi-2307-jira-sticky-text-bug", + "merged_at": "2026-01-20T18:58:59Z", + "changed_files": 2, + "additions": 16, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixes a bug when sending sticky notes to Jira and adding the associated labels where the text can overflow behind the labels after they're added. The fix makes sure the widget textSize recalculation runs after the labels are added, ensuring the text appears correctly above them.\r\n\r\nBefore:\r\n\"Screenshot\r\nAfter:\r\n\"Screenshot\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/CWI-2307\r\nTest env:\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murall", + "labels": [] + }, + { + "number": 46525, + "title": "[IAM-2290] Workspace and Mural Visitor Roles", + "branch": "add/iam-2290-share-link-role", + "merged_at": "2026-01-20T18:44:03Z", + "changed_files": 38, + "additions": 2621, + "deletions": 68, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds workspace (team) and mural share modal visitor role management.\r\n\r\n#### Reviewer Resources\r\n\r\n\ud83c\udfab https://mural.atlassian.net/browse/IAM-2290\r\n\r\n\ud83e\uddea https://iam-2290-share-link-role.mural.engineering/\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15075)\r\n\r\n## Disclaimer - tests written with (heavy) AI assistance; it wanted to mock *everything* - feel free to request that I pull that back (I already have in a few places \ud83d\ude02 )\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Introduces role-based visitor access alongside existing permiss", + "labels": [] + }, + { + "number": 46838, + "title": "[ESC-1899] Update support links on integrations pages", + "branch": "update/esc-1899-support-links-3", + "merged_at": "2026-01-20T18:21:18Z", + "changed_files": 2, + "additions": 6, + "deletions": 6, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\nTesting environment: https://esc-1899-support-links-3.mural.engineering/\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co links on integrations pages, e.g. https://app.mural.co/c/:companyId/development/integrations.\r\n\r\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Refreshes support.mural.co links across integrations pages to new `/s/article` URLs.\n> \n> - Update help URLs in `integrations-list.tsx` for `msteams`, `connectToSlack`, `enableGitHub`, `googleDriveEnabled`, and `dropboxEnabled`\n> - Update Jira help `supportLink` in `shared-components/jira-help` to new Jira Cloud integration article\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 199d91f6df4f84678048f3a10f7f3042eba8f224. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46835, + "title": "[ESC-1899] Update support links", + "branch": "update/esc-1899-support-links", + "merged_at": "2026-01-20T16:54:56Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "Jira: [ESC-1899](https://mural.atlassian.net/browse/ESC-1899)\r\nTesting environment: https://esc-1899-support-links.mural.engineering/\r\n\r\n### Summary\r\n\r\nUpdate support.mural.co links on IP allowlist page and CX workspaces change data region modal.\r\n\r\n\r\n[ESC-1899]: https://mural.atlassian.net/browse/ESC-1899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Updates hardcoded support article URLs to new paths.\n> \n> - In `ip-allowlist/index.tsx`, change \"Learn more about IP allowlisting\" link to `https://support.mural.co/s/article/ip-allowlisting`\n> - In `update-workspace-region/view.tsx`, change \"Data Residency\" link to `https://support.mural.co/s/article/data-residency`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a23c9c29fa2ef5c18ecb3c8e414ede74f373de10. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46805, + "title": "Refactor `lib/billing/utils` to pkg", + "branch": "pkg/lib-billing", + "merged_at": "2026-01-20T16:19:19Z", + "changed_files": 112, + "additions": 717, + "deletions": 782, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors billing-related utilities from `src/lib/billing/utils` to the `@muralco/billing` package, improving code organization and enabling better code sharing across the monorepo.\r\n\r\n**Changes:**\r\n- Moved billing utility functions from local `lib/billing/utils` to `@muralco/billing` package\r\n- Consolidated Stripe-related utilities into `packages/billing/src/stripe`\r\n- Created new tracking utilities module at `packages/billing/src/tracking`\r\n- Moved constants (`FREE_MURALS_REMAINING_LIMIT`, `MAX_FREE_MURAL_DEFAULT`) to package-level exports\r\n- Other minor changes to allow this refactor\r\n\r\n#### Reviewer Resources\r\n- Partially closes: https://mural.atlassian.net/browse/NEXT-409\r\n- Test env: https://lib-billing.mural.engineering/\r\n- Pure refactor code: no new stuff added\r\n\n\n---\n\n> [!NOTE]\n> Centralizes billing logic in `@muralco/billing` and updates the app to use the new package.\n> \n> - Adds package exports for `utils` (billing + plan), `stripe` (env, service, address utils), `tracking`, and `constants` (`FREE_MURALS_REMAINING_LIMIT`, `MAX_FREE_MURAL_DEFAULT`)\n> - Implements `stripe` loader via `loadStripe` and exposes `initializeStripe`/`getStripePromise`; uses `@muralco/api` config\n> - Moves/exports types and helpers (e.g., `PlanDetails`, `DesiredPlan`, `getPlanFromData`, `isScheduledDowngrade`, `isPlanSubscriptionExpired`); consolidates promo code/error and currency/date helpers\n> - Repoints imports across dashboard, billing UI, mural, team routes, and tests to `@muralco/billing`; removes legacy `src/lib/billing/utils` usage\n> - Adjusts dependencies: adds Stripe libs to `@muralco/billing`, removes `@stripe/stripe-js-latest` from `@muralco/api`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 56cfa393ef0e540313623e778862252fdc78f6c9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8345.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the ", + "labels": [] + }, + { + "number": 46825, + "title": "[CAN-8299] Refactor `beforeResizeStep` to return a list of changes", + "branch": "refactor/before-resize-step", + "merged_at": "2026-01-20T15:32:44Z", + "changed_files": 8, + "additions": 61, + "deletions": 30, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the hook `beforeResizeStep` to return a list of changes instead of letting handlers apply them directly.\r\n\r\nUnlike other similar hooks, this one is expecting a result back from the handlers, so we can't just make the hook return a list of changes directly, but append this to the expected returned value.\r\n\r\nTherefore, the hook now expects, instead of `Point | null`, an object with a potential list of changes to apply, and the previously expected point.\r\n\r\nThe only hook handler registered has been adapted to this new interface. Luckily it wasn't applying any changes so the refactor is rather trivial.\r\n\r\nNo change in the app is expected whatsoever.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8299)\r\n- \ud83e\uddea [**Testing environment**](https://before-resize-step.mural.engineering)\r\n\n\n---\n\n> [!NOTE]\n> Introduces a new return type for `widgets.resize.beforeResizeStep` to support both delta adjustments and batched model updates.\n> \n> - Changes `beforeResizeStep` signature from `Point | null` to `{ changes: ActionList; newDiff: Point | null }` and updates the reducer in `sdk/hooks/widgets/resize/create.ts` to aggregate both\n> - Applies returned `changes` in `resize-widgets/index.ts` during `drag` before main resize updates\n> - Adapts Enhanced Kanban Board resize plugin to return the new object shape (currently returns `ActionList.empty`) and updates related tests to read `.newDiff`\n> - Test scaffolding updated to mock the new hook shape\n> - Minor cleanup: destructure and use `hookScope` in drag/duplicate hooks\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6149789763c90ebb1343deee0af05e6483a3b234. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46827, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-12", + "merged_at": "2026-01-20T15:09:42Z", + "changed_files": 97, + "additions": 561, + "deletions": 624, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR move into packages these state branches:\r\n* `content-extension`\r\n* `public`\r\n* `screen-reader`\r\n* `sidebar`\r\n* `snipping-selection`\r\n* `template-addon`\r\n* `widgets`\r\n\r\nThe environment: https://next-356-12.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK state under `packages/canvas/src/sdk/state` and replaces legacy `src/mural/sdk/state` usage.\n> \n> - Adds packaged state modules: `content-extension` (with `initial`), `public` (`PublicSdkState` + `getInitial`), `screen-reader`, `sidebar` (incl. `SidebarStatus`, `DraggableWrapper`), `snipping-selection`, `template-addon`, and `widgets` (adds `PencilType`, `DEFAULT_EDITOR_FORMAT`, `WidgetsState.getInitial`, `InternalWidgetsState.initial`, `HoverState.initial`)\n> - Updates imports across addons/dispatcher/apis/tests to use `@muralco/canvas/sdk/state`, new barrels (`amp-core`, `hooks`, `primitives`), and cleans up unified-diagramming import paths\n> - Replaces prior constants/enums from APIs with centralized state versions (e.g., `PencilType`, `DEFAULT_EDITOR_FORMAT`)\n> - Removes old `src/mural/sdk/state` files and switches tests to `PublicSdkState.getInitial` and `TranscriptState.initial`\n> - Expands `packages/canvas/src/sdk/state/index.ts` exports; adjusts CODEOWNERS for new paths\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9d7575c10a45c273c81f721a0c2cfe7eabb24ec7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46829, + "title": "Knip fine tuning", + "branch": "knip-imp", + "merged_at": "2026-01-20T14:48:37Z", + "changed_files": 81, + "additions": 258, + "deletions": 718, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFine-tuning of the Knip configuration to remove unused dependencies detected across the monorepo. \r\n\r\n**Changes:**\r\n- Removed unused dependencies (jsdom, react-router-dom, @types/*, testing libraries) from 60+ packages\r\n- Moved `jsdom` from individual packages to the shared `@muralco/config` package where it's actually used in Jest configurations\r\n- Updated `.knip.jsonc` to ignore template files and reorganize ignore patterns\r\n- Minor improvements to `package.json`\r\n\r\n#### Reviewer Resources\r\n- If it builds, it works.\r\n- [Jira ticket](https://youtu.be/Zat9CRfUr-E?si=SQtqvaKgUidBRFKp&t=79)\r\n\r\n#### Pending work\r\nOnce this effort merges (https://github.com/tactivos/murally/pull/46824) we could migrate SasS to use `pkg:` url that are detected by dependencies by Knip and we could remove ignores of _legacy ui_ packages\r\n\n\n---\n\n> [!NOTE]\n> Reduces dependency surface and aligns Knip with actual usage across the monorepo.\n> \n> - **Knip config**: Refactors `.knip.jsonc`, adds template directory ignore (`packages/create-package/templates/**`), adjusts `ignoreDependencies` (e.g., test-only `idle-timer`, `@types/events`), and per-workspace ignores; keeps webpack configs and entry handling; clarifies comments\n> - **Dependency cleanup**: Removes unused `react-router-dom`, `jsdom`, assorted `@types/*`, and testing libs from 60+ `package.json` files; centralizes `jsdom` under `@muralco/config` devDeps; minor dependency reordering\n> - **Scripts/workspaces**: Simplifies `knip:fix` script (drops `--fix-type`); removes `packages/vr/*` from root `workspaces`\n> - **Lockfile updates**: Aligns `package-lock.json` with removed deps and workspace changes\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9f88bba502428c0725a588142843703238bc6138. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\n---\n\n> [!NOTE]\n> Prevents accidental dragging when interacting with selection resize handles.\n> \n> - Adds `isOverResizeHandler` using `engine.selection.handler.getAt` and `isResizeHandler`/`isResizeTouchHandler` in `drag-multiple-selection/index.ts`\n> - Updates `onDown` and `onTouch` to early-return when over a resize handler; preserves multi-touch and modifier key guards\n> - Extends tests in `index.test.ts` to cover mouse and touch behavior for handler detection and normal drag start\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 56749937724618cddd4ba5fdab2ae334f8580e68. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46807, + "title": "[CAN-8334] Fix moveAround hint overlapping with other callouts", + "branch": "fix/hint-callout-rollout", + "merged_at": "2026-01-19T19:23:06Z", + "changed_files": 14, + "additions": 96, + "deletions": 121, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes we were displaying both the moveAround hint callout and other onboarding related ones at the same time, making the experience look and feel buggy:\r\n\r\n\"image\"\r\n\r\n With these changes we only show the hand tool hint if there aren't other callouts or onboarding steps happening which might not be using the callouts queue.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8334) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://hint-callout-rollout.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can yo", + "labels": [] + }, + { + "number": 46828, + "title": "[stable fix][EN-3627] fix: import pluralize where needed", + "branch": "stable-fix/en-3627-pluralize", + "merged_at": "2026-01-19T17:42:18Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis was incorrect removed in https://github.com/tactivos/murally/commit/01ee412c24ac1a9d13dcfdd640a8d80402230f6c.\r\n\r\nI do not have any idea why the build was successful in that PR \ud83e\udd37 \r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [EN-3627](https://mural.atlassian.net/browse/EN-3627)\r\n- \ud83e\uddea [en-3627-pluralize.mural.engineering](https://en-3627-pluralize.mural.engineering)\r\n- \ud83c\udfac Quick time demo available below:\r\n\r\nhttps://github.com/user-attachments/assets/5f7b7122-2f27-4af2-8919-e8f22ba7358b\r\n\r\n\r\n\r\n\r\n[EN-3627]: https://mural.atlassian.net/browse/EN-3627?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\r\n---\r\n\r\n> [!NOTE]\r\n> Restores required dependency for guest domain restriction messaging.\r\n> \r\n> - Adds `import * as pluralize from 'pluralize'` in `views/settings/index.tsx` used by `settings.guestDomainRestriction.domains` text generation\r\n> \r\n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 71418760131129110fa8fb68cb4fb2866adb390c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\r\n", + "labels": [] + }, + { + "number": 46809, + "title": "[CAN-8298][CAN-8300][CAN-8301] Refactor `afterResizeStart`, `afterResizeStep` and `beforeResizeEnd` to return a list of changes", + "branch": "refactor/after-resize-start", + "merged_at": "2026-01-19T16:49:19Z", + "changed_files": 4, + "additions": 39, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR was, initially, aimed at only refactoring the `afterResizeStart` hook handler to return a list of changes instead of applying changes directly.\r\n\r\nHowever, since there are currently no handlers registered, this became a mere protection against future usages and nothing more.\r\nAnd on that note, given that the goal of the entire effort is to accomplish the same thing with all the resizing hooks, I'm also doing the same thing to all the other hook that have no handlers registered, so we can kill many birds with one stone.\r\n\r\nGiven that there are no handlers registered on any of these hooks, there's nothing to test nor change in the app expected.\r\nIt simply needs to build to be considered valid.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f Jira tickets\r\n - [**CAN-8298**](https://mural.atlassian.net/browse/CAN-8298)\r\n - [**CAN-8300**](https://mural.atlassian.net/browse/CAN-8300)\r\n - [**CAN-8301**](https://mural.atlassian.net/browse/CAN-8301)\r\n- \ud83e\uddea [**Testing environment**](https://after-resize-start.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46823, + "title": "Fix pictogram dependency", + "branch": "patch-pictogram-dep", + "merged_at": "2026-01-17T01:03:56Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "", + "labels": [] + }, + { + "number": 46788, + "title": "[CAN-8255] Rename WidgetStore iteration methods to `*Unindexed`", + "branch": "fix/can-8255", + "merged_at": "2026-01-16T22:55:40Z", + "changed_files": 35, + "additions": 78, + "deletions": 79, + "body": "**[CAN-8255 Rename WidgetStore iteration methods](https://mural.atlassian.net/browse/CAN-8255)**\r\n\r\nThe idea of this PR is to mark non-performant `WidgetStore` methods with the `Unindexed` suffix to discourage their usage.\r\nIn most cases, we don\u2019t need to iterate over the whole store \u2014 we usually know something about the widgets, for example their type, parent, location area, or composition id. WidgetStore has indexes for these cases, which allows us to retrieve a subset of widgets. Working with subsets is usually much faster than iterating over all widgets.\r\n\r\n`WidgetStore` method renamed:\r\n* `filter` -> `filterUnindexed`\r\n* `map` -> `mapUnindexed`\r\n* `find` -> `findUnindexed`\r\n* `reduce` -> `reduceUnindexed`\r\n* `toArray` -> `toArrayUnindexed`\r\n\r\nThe environment: https://can-8255.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Marks whole-store iteration APIs as \"unindexed\" and updates the codebase accordingly.\n> \n> - Renames `filter`/`map`/`find`/`reduce`/`toArray`/`forEach` to `filterUnindexed`/`mapUnindexed`/`findUnindexed`/`reduceUnindexed`/`toArrayUnindexed`/`forEachUnindexed` in `WidgetStore`\n> - Migrates selectors, addons, business logic, and tests to the new names\n> - Replaces several full-store scans with indexed queries (`getByType`, `getPartsOf`, `get`, `getChildren`) where applicable\n> - Adjusts derivative/stacking-order computations to use `mapUnindexed`/`reduceUnindexed`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit fbdfc270d24461cdcbf08b72c770f0bf0c0718d9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46816, + "title": "Add DataFolder and useMuralMove Tests", + "branch": "add/datafolder-tests", + "merged_at": "2026-01-16T22:13:47Z", + "changed_files": 2, + "additions": 338, + "deletions": 0, + "body": "", + "labels": [] + }, + { + "number": 46811, + "title": "[NEXT-403] Move src/mural/sdk/apis/widgets/changes/types to package", + "branch": "refactor/widget-changes-sdk-api", + "merged_at": "2026-01-16T21:31:56Z", + "changed_files": 40, + "additions": 118, + "deletions": 74, + "body": "Test environment: https://widget-changes-sdk-api.mural.engineering", + "labels": [] + }, + { + "number": 46812, + "title": "[MFRD-39] Do not include `Download` in context menu during private mode", + "branch": "update/hide-download-when-private", + "merged_at": "2026-01-16T21:10:35Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nHide \"Download\" option from context menu when in private mode.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/MFRD-39) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://hide-download-when-private.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Enter private mode\r\n2. Right click on canvas\r\n3. Verify \"Download\" no longer a menu option\r\n\r\nBEFORE\r\n\"Screenshot\r\n\r\nAFTER\r\n\"Screenshot\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-mfrd" + ] + }, + { + "number": 46760, + "title": "[IPA-287] ROI Dashboard updates", + "branch": "add/ipa-287", + "merged_at": "2026-01-16T20:30:54Z", + "changed_files": 4, + "additions": 7, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFigma Design => https://www.figma.com/design/Vnwig9JofR4Fbed2siKgIc/Drafts-Executive-Dashboard?node-id=4001-94323&p=f&m=dev\r\n\r\nAPI PR => https://github.com/tactivos/mural-api/pull/15180\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [A", + "labels": [] + }, + { + "number": 46778, + "title": "Migrates first batch of \"medium\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-medium-priority-deps-1", + "merged_at": "2026-01-16T20:13:29Z", + "changed_files": 270, + "additions": 671, + "deletions": 493, + "body": "This PR is the first of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles the first batch of `medium` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\nTest env: https://migrate-medium-priority-deps-1.mural.engineering\n\n## What Was Migrated\n\n### Addons\n- **AI sentiment classification** (`addons/ai/ai-sentiment-classification/constants.ts`) - AI sentiment classification feature action text constant\n- **AI upgrade** (`addons/ai/ai-upgrade/utils.ts`) - AI upgrade tracking utilities and location constants\n- **Azure DevOps constants** (`addons/azure-devops/constants.ts`) - Azure DevOps sync messages, tracking source, and error mappings\n- **Jira Cloud constants** (`addons/jira-cloud/constants.ts`) - Jira Cloud sync messages, tracking source, and error mappings\n- **Mermaid constants** (`addons/mermaid/constants.ts`) - Mermaid diagram layout and spacing constants\n- **Mindmaps expand-collapse** (`addons/mindmaps/expand-collapse/utils.ts`) - Mindmap expand/collapse handler utilities\n- **Navigation improvements** (`addons/navigation-improvements/rollout-callouts/`) - Navigation rollout callout constants and storage utilities\n- **Research mural logger** (`addons/research-mural/research-mural-ui/logger.tsx`) - Research mural logging utilities\n- **Timer types** (`addons/timer/types.ts`) - Timer running state type\n- **Action bar** (`addons/core/action-bar/`) - Action bar parser constants and result types\n- **Context menu** (`addons/core/context-menu/`) - Format types and import utilities\n- **Lexical editor** (`addons/core/editors/lexical/`) - Lexical error logging, common types, widget editor nodes and serialization\n- **Fixed widget toolbar** (`addons/core/fixe", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46790, + "title": "Update Jest testing instructions", + "branch": "update/jest-testing-rules", + "merged_at": "2026-01-16T19:55:19Z", + "changed_files": 3, + "additions": 112, + "deletions": 69, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates the Jest testing instructions documentation with:\r\n- Migration to directive language (vs RFC 2119)\r\n- Instructions for mocking UI Toolkit components\r\n- Instructions for mocking local packages\n\n\n---\n\n> [!NOTE]\n> Updates Jest testing docs and ownership metadata.\n> \n> - Switches to directive-style language; reorganizes query priorities and user interaction guidance\n> - Expands TypeScript mock typing and mock lifecycle recommendations\n> - Adds sections for mocking local packages using `jest.requireActual()` and guidance discouraging UI Toolkit component mocks; updates example to spread `requireActual`\n> - Clarifies assertion presence/absence rules and test naming conventions; retains widget testing patterns and mindmap guidance\n> - CODEOWNERS: treats `.claude/`, `.codex/`, and `.cursor/` as directories\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 65c4a3c0976c63972128fb18af8418a495914036. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46780, + "title": "[NEXT-404] Move room modals to new RoomModalsManager ", + "branch": "move/room-modals-manager", + "merged_at": "2026-01-16T19:23:14Z", + "changed_files": 11, + "additions": 577, + "deletions": 257, + "body": "Move room level modals into new RoomModalsManager.\r\n* `createFolder`\r\n* `moveMuralNoPerms`\r\nThis creates a typesafe way to open these modals. No more \"stringly-typed\" pattern.\r\nexample \r\n```\r\nconst { modalDefinitions } = RoomModalsManager.useStore();\r\nmodalDefinitions.createFolder.open()\r\n```\r\n\r\nUnexpected code removal\r\n* 'invite' modal.... nothing renders a 'invite' modal\r\n* 'push-to-hub' modal.... this logic is a canvas construct but not used in dashboard/room. The code that renders it was probably left over after the trigger code was removed\r\n\r\nBrief add-on work\r\n* convert `DataFolder` to functional component. Also remove unnecessary timout/loading code (it wasn't used...it was a intended to mimic loading data from api? But the loading state that was set was never read. So this was code was removed) \r\n* move `handleMuralDrop()` login in to DataFolder to make it easier to modularize in future PR\r\n* move `handleMuralMove()` to a new hook `useMuralMove()` so that it can be used from multiple locations, thus removing the amount of code that RoomPage handles as a god-component.\r\n\r\nTest-env\r\nhttps://room-modals-manager.mural.engineering/\r\n", + "labels": [] + }, + { + "number": 46798, + "title": "[CAN-8297] Refactor `beforeResizeStart` hook handler to prevent doing `apply` or `commit`", + "branch": "refactor/before-resize-start", + "merged_at": "2026-01-16T19:12:02Z", + "changed_files": 13, + "additions": 180, + "deletions": 118, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the `beforeResizeStart` hook to return a list of changes instead of letting handlers apply them directly.\r\n\r\nThe motivation behind this change is related to keep control of who originates widget changes and when.\r\nOn a resizing operation, the changes to the widgets model should be restricted only to the resizing operation core logic.\r\n\r\nGiven that the hook was already returning a value (a list of widgets to replace for the resizing ones), the hook is now split into two so the intention is clearer: `beforeResizeStart` only notifies the operation that is about to start (and expects back a potential list of changes to apply), and a new hook called `widgetsToResize` allows handler to modify the list of affected widgets.\r\n\r\nThe change had little repercusion because most of the hook handlers were not doing any changes already, but there were a couple of exceptions.\r\n\r\n- The Smart Planner resize plugin has been adapted to this new logic, and modified to return the newly created placeholder widget (the deletion is still in the plugin, it'll be refactored in a different PR)\r\n- The `verifyBoard` method from the Smart Planner has been adapted to use the resizing plugin directly instead of emulating a resize operation using the hooks.\r\n\r\nWe expect no change in logic whatsoever, everything should keep working exactly as it did before.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8297)\r\n- \ud83e\uddea [**Testing environment**](https://before-resize-start.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46775, + "title": "[SCQM-1293] Fix minor outline bugs", + "branch": "fix/minor-outline-bugs", + "merged_at": "2026-01-16T18:40:33Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nTest ENV: https://minor-outline-bugs.mural.engineering/\r\n\r\n2 tickets in one:\r\n- https://mural.atlassian.net/browse/SCQM-1293 \r\nCommit: https://github.com/tactivos/murally/pull/46775/commits/26e2b1439bc33127481db87c23b493b0b6686e39\r\nFixes: Exiting presentation mode via `esc` key ends up hiding present button in outline when reopened \r\nTo test: \r\n1. Add items to outline\r\n2. From outline, click \"Present\"\r\n3. Once in presentation mode, press `esc` \r\n4. Re-open outline\r\n5. Verify the \"Present\" button is shown\r\n\r\n----------\r\n\r\n\r\n- https://mural.atlassian.net/browse/SCQM-1441\r\nCommit: https://github.com/tactivos/murally/pull/46775/commits/5118df5e96cc86516452c17b07fea184da6f1705\r\nFixes: Outline item _number_ not on the same horizontal line as the outline item _name_\r\nTo test:\r\n1. Add item to outline\r\n2. Verify number and title aligned \r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46799, + "title": "[NEXT-406] Move WidgetsState to package", + "branch": "refactor/package-widgets-state", + "merged_at": "2026-01-16T18:11:16Z", + "changed_files": 78, + "additions": 369, + "deletions": 354, + "body": "Test environment: https://package-widgets-state.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46800, + "title": "Fix comment editor draft and comment navigation bugs (fixes [ENGAGE-1323])", + "branch": "fix/comments-lost", + "merged_at": "2026-01-16T17:58:37Z", + "changed_files": 13, + "additions": 816, + "deletions": 305, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is a multi-fix for the comments editor bugs related to losing data and weirdness on navigation.\r\n\r\n**From a logical perspective**:\r\n- Drafts work again. You can set a value, lose focus, or move to another comment, and the draft text is saved and recovered accordingly.\r\n- Unsaved new comment drafts work again. For new comments, if you leave the editor (lose focus) while typing, the modal prevents losing data.\r\n- While navigating across multiple comments, the threads and editor are re-rendered accordingly, even with drafts.\r\n\r\n**From a technical perspective**:\r\n- Major refactor to the functional component of the editor.\r\n- Added unit test for basic operations\r\n- Removed all the nonsense callbacks for draft to the up component itself.\r\n- Moved to session storage to simplify cleaning from time to time, avoiding the orphaned draft entries scenario.\r\n\r\n#### Reviewer Resources\r\n- Test env: https://comments-lost.mural.engineering/\r\n- Closes: this [request without a ticket](https://mural.slack.com/archives/C01KJT67RC7/p1759765527734899).\r\n\r\n\n\n---\n\n> [!NOTE]\n> Refactors the comment editor and removes draft management from the rightbar state.\n> \n> - Converts `CommentOrReplyMessageEditor` to a functional component with proper `onChange`/focus/blur handling, keyboard shortcuts, and mention-all confirmation\n> - Introduces `draft-storage` (session storage) to persist per-comment drafts; saves on unmount/switch, clears on submit/empty\n> - Removes `rightbar.comments.drafts` from state and deletes related SDK/dispatcher APIs (`addDraft`/`removeDraft`/`setDrafts`/`getDrafts`), plus all component props/callbacks that used them\n> - Updates `AnimatedCommentThread`, `CommentThread`, `Comments`, and `Panel` to drop draft props and old callbacks; simplifies rightbar comments API to only manage `commentListTab`\n> - Adds comprehensive unit tests for the editor (rendering, interactions, draft persistence, ment", + "labels": [] + }, + { + "number": 46770, + "title": "[SCQM-1554] Remove ai populate template feature", + "branch": "update/remove-ai-populate-template", + "merged_at": "2026-01-16T17:29:10Z", + "changed_files": 16, + "additions": 40, + "deletions": 1598, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoval of AI populate template feature\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1554) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15191)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/p", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46575, + "title": "[CWI-2504] Integrations Platform - Use Card Widget", + "branch": "add/cwi-2504", + "merged_at": "2026-01-16T17:06:08Z", + "changed_files": 73, + "additions": 1016, + "deletions": 511, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Use Card Widget\r\n\r\n\"Screenshot\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2504\r\n\r\n#### Related PR\r\nhttps://github.com/tactivos/mural-api/pull/15100\r\n\r\n\n\n---\n\n> [!NOTE]\n> - Integrations can render as `card` (vs `sticky`) when `FEATURES.INTEGRATIONS_CARD_WIDGET` is enabled; Asana, Microsoft Planner, and Rally managers create card defaults, compute record URLs, and build widget changes by widget type; Jira paste/import paths use the new flag.\n> - Content Extension model refactor: replace `SyncableFields` with `SorWidget` and add `recordUrl`; update validation helpers (`sorFields` \u2192 `sorWidget`) and handlers (Asana, Microsoft Planner, Rally, Salesforce) accordingly; introduce Salesforce shared custom kinds.\n> - Widget Panel: new `WidgetPanelExternalLinkSpec` and registration; header shows an \"Open \" button from `recordUrl` (or sticky link) with tests.\n> - SoR sync/import: build `latestExternalData` separately, set `recordUrl`, optimize out-of-sync label checks, and adjust import/sync/update flows; APIs simplified to return widgets and use new content updaters.\n> - Text/content updates: add `widgets.card.updateContent` and `widgets.sticky.updateContent`; centralize conversions (`updateCardContent`, `updateStickyNoteContent`, `stickyPlainTextToHtmlText`); remove ad-hoc html/text mutations and font-size calculations.\n> - Misc: rename flag usage to `INTEGRATIONS_CARD_WIDGET`; add Rally icon asset; minor path/import cleanups and tests updated.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6207c79370cb42c4901ed4addc66b48c08cbb6ac. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827", + "labels": [] + }, + { + "number": 46783, + "title": "[NEXT-356] Move `engine` state into packages", + "branch": "fix/next-356-11", + "merged_at": "2026-01-15T23:05:09Z", + "changed_files": 19, + "additions": 137, + "deletions": 178, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves `engine` state and freehand-related functions into packages. Removed bounding box info from `strokeToSvg` results.\r\n\r\nThe environment: https://next-356-11.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Centralizes engine and inking logic under packages for reuse and consistency.\n> \n> - Move `engine` state to `packages/canvas/sdk/state/engine` with `InternalEngineState.initial` and pre-parse inking handler\n> - Add `helpers/stroke-to-svg` and `helpers/transform-inking` to packages; re-export via `helpers/index`\n> - Refactor `helpers/freehand`: type-only imports, `FhStroke` now `Stroke`, and `FhStroke` namespace wrappers\n> - Remove legacy `src/mural` equivalents (engine state, stroke-to-svg) and update consumers (addons, widgets inspector, strokes component, render-widget, tests) to use package helpers\n> - `strokeToSvg` no longer returns bounds info; returns only `filled`, `path`, `strokeColor`, `strokeWidth`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 791e42cbec6d62066b7ccf5f342363f234e744d6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46779, + "title": "[SCQM-1577] Add \"new\" badge to company settings color item", + "branch": "add/company-settings-new-badge", + "merged_at": "2026-01-15T22:51:00Z", + "changed_files": 4, + "additions": 18, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\nJackson designed a new badge for the \"Canvas colors\" menu item as a callout for users - see designs in the ticket. It will be removed after roughly 30 days. \r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1577) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://company-settings-new-badge.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46693, + "title": "CPT-2475/Public Template Preview View", + "branch": "add/template-preview-view", + "merged_at": "2026-01-15T22:08:49Z", + "changed_files": 6, + "additions": 485, + "deletions": 42, + "body": "### Summary of Changes and Resources for the Reviewer\r\n[CPT-2475](https://mural.atlassian.net/browse/CPT-2475)\r\nThis PR implements a new truly public template preview experience that allows unauthenticated users to view and interact with templates without being redirected to sign-in. This feature is gated behind the TRULY_PUBLIC_TEMPLATE_PREVIEWS Optimizely feature flag.\r\n\r\n### Key Implementation Details\r\n1. Dual SDK Support: For global templates with examples, both the template SDK and example SDK are initialized, allowing users to toggle between viewing the blank template and a filled-in example\r\n2. Proper Resource Management:\r\nisMounted flag prevents state updates on unmounted components\r\nCleanup function disposes both SDKs (engine.destroy(), dispatcher.dispose())\r\nTimeout handling prevents infinite loading states\r\n3. Canvas Integration:\r\nUses EngineCanvasLayer for rendering\r\nkey prop forces remount when toggling between template/example (required because EngineCanvasLayer.shouldComponentUpdate() returns false)\r\nIncludes VisualizationControlsEmbed for zoom/pan controls\r\n4. Styling:\r\nUses UI Toolkit design tokens\r\nFull viewport layout with proper canvas dimensioning\r\nShow Example toggle positioned in bottom-left corner\r\n\r\n\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, co", + "labels": [] + }, + { + "number": 46792, + "title": "[NEXT-405] Make DataFolder a func component", + "branch": "update/datafolder-func-comp", + "merged_at": "2026-01-15T19:41:33Z", + "changed_files": 2, + "additions": 41, + "deletions": 99, + "body": "And remove unnecessary code...\r\n\r\nThe code for simulating loading with a timeout and unused loading state was removed\r\n\r\n\r\ntest-env https://datafolder-func-comp.mural.engineering/", + "labels": [] + }, + { + "number": 46766, + "title": "[CAN-8326] AB test mode should always set zoom to PINCH regardless of user OS", + "branch": "add/can-8326", + "merged_at": "2026-01-15T19:01:59Z", + "changed_files": 8, + "additions": 247, + "deletions": 7, + "body": "\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nWhen the navigation-improvements flag is ON, we should always set zoom to PINCH instead of mouse wheel for Windows users.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/345", + "labels": [] + }, + { + "number": 46772, + "title": "[CAN-8285] Add Flow 2 of navigation improvements", + "branch": "add/can-8285", + "merged_at": "2026-01-15T18:06:02Z", + "changed_files": 12, + "additions": 262, + "deletions": 86, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds two step to the new navigation rollout experience.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8285) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8285.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46789, + "title": "[CAN-8323] Fix mindmap button visibility on sidebar", + "branch": "fix/mindmaps-sidebar-button", + "merged_at": "2026-01-15T17:20:33Z", + "changed_files": 3, + "additions": 225, + "deletions": 25, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes the placing of the `Mind Maps` button in the sidebar.\r\n\r\nBecause of how it was implemented, the button relied on another button (`images`) existing in the sidebar in order to be placed in the right order.\r\nAt this moment, that panel is changing into a unified panel that uses a different name. This means that when the flag controlling that feature is enabled, the `images` panel doesn't exist and the button is not registered.\r\n\r\nThis PR fixes the situation by considering both options, but also adding some fallbacks so the button is always present, even if the desired position for it can't be obtained.\r\n\r\n### How to test this?\r\n- Enter any mural and check that the `Mind Maps` button is present in the sidebar.\r\n- Using the Flags Manager, turn on the `UNIFIED_IMAGES_PANEL` flag, reload, and check that the button is still appearing.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8323)\r\n- \ud83e\uddea [**Testing environment**](https://mindmaps-sidebar-button.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46777, + "title": "[CWI-2519] - Store emoji skin tone setting, frequently used emoji fix", + "branch": "fix/cwi-2519-emoji-skin-tone", + "merged_at": "2026-01-15T17:03:10Z", + "changed_files": 3, + "additions": 135, + "deletions": 36, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nStores the user's last used emoji skin tone setting in the image panel emoji tab and persists it localStorage for a better UX.\r\n\r\nAlso, fixes a bug where user's most frequently used emojis (in the image panel 'all' tab) were not updating reactively when a user added new emojis, and was only updating on refreshing/re-opening the panel. The tab should now update as a user adds new emojis that become the most frequently used.\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/CWI-2519\r\nTest env: https://cwi-2519-emoji-skin-tone.mural.engineering/\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+A", + "labels": [] + }, + { + "number": 46755, + "title": "[CAN-8050] Unflag call to `reset` in `dragSelectedWidgets`", + "branch": "remove/reset-flag-on-drag", + "merged_at": "2026-01-15T16:50:38Z", + "changed_files": 9, + "additions": 45, + "deletions": 30, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes the flag that was controlling resetting the dragging before each movement.\r\n\r\nThe motivation behind this is that, when we enable absorption as a system, we want to treat each dragging step as an atomic move between the initial state and the current, but since dragging works as a diff between last and current step, we can't make that change just yet in the productive app.\r\n\r\n### Decisions made\r\n\r\nIn order to make the concept of `reset` work seamlessly across the app, a couple of decisions had to be made on code associated with the dragging operation:\r\n- **The Smart Planner plugin**: this plugin handles custom behavior when the dragging involves interacting with a smart planner.\r\nThe in-a-nutshell logic behind it is that upon a `beforeDragMove` event, it will analyze if the dragging is inside an affecting operation (i.e. it involves a Smart Planner), and if not, it will not do anything afterwards.\r\nWhen dragging worked in a \"per movement\" basis, this worked because it would constantly analyze whether the widget is about to enter a Smart Planner.\r\nWith the new `reset` logic, every `beforeDragMove` event starts from the initial point, so if it was not in a Smart Planner at the beginning, then the plugin would never act.\r\nThe solution consist in analyzing the `afterDragMove` event. So if it didn't started inside a Smart Planner, but it ended inside one, then this is, again, an affecting operation.\r\n\r\n- **Ignore table snapping guidelines integration tests**: The tests in the modified feature file require a two steps dragging simulation. This is because the check for snapping guidelines runs _before_ the table is set as a snappable cluster.\r\nWith the introduction of the `reset` concept on each dragging movement, those two steps are now considered as \"one step done twice\", and so the setup needed for the tests is never accomplished, which makes the tests fail.\r\nA real life test of the scenarios shows t", + "labels": [] + }, + { + "number": 46758, + "title": "[CAN-8320] Make navigation improvements reactive", + "branch": "add/can-8320", + "merged_at": "2026-01-15T16:38:16Z", + "changed_files": 29, + "additions": 379, + "deletions": 343, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to this changes the views, tools, navigation changes, were not reactive to the flag in real time, we needed to reload the whole set of addons. With these changes we address that problem and refactor the way pressing 'Later' works on the rollout callout in order to only apply the control updates if the user accepts, and provide a way to rollback if the user navigates back and forth without completing the rollout onboarding.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8320) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8320.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r", + "labels": [] + }, + { + "number": 46761, + "title": "[ESC-1878] archived murals: Use standard title for untitled murals", + "branch": "add/esc-1878-untitled-mural", + "merged_at": "2026-01-15T16:23:10Z", + "changed_files": 2, + "additions": 44, + "deletions": 0, + "body": "Jira: [ESC-1878](https://mural.atlassian.net/browse/ESC-1878)\r\nTesting environment: https://esc-1878-untitled-mural.mural.engineering/\r\n\r\n### What changes does this PR introduce?\r\n\r\nOn the archived murals page use the standard fallback title for untitled murals (\"Untitled mural\").\r\n\r\nhttps://github.com/user-attachments/assets/815a7583-53dd-49e8-a837-f53d345e39cf\r\n\r\n\r\n### Test impact\r\n\r\nArchived murals\r\n\r\n### Related PRs\r\n\r\n- https://github.com/tactivos/mural-api/pull/15181\r\n\r\n\r\n[ESC-1878]: https://mural.atlassian.net/browse/ESC-1878?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Ensures archived murals display a consistent fallback title.\n> \n> - In `transformApiResponseToUiData`, set `title` to `item.title || 'Untitled mural'`\n> - Add `types.test.ts` to verify default title when empty and pass-through when present\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit be27ef7425340c1bb2c3efac46e9109e9e896e33. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46771, + "title": "Migrates remaining \"high\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-priority-deps-2", + "merged_at": "2026-01-15T16:09:48Z", + "changed_files": 217, + "additions": 457, + "deletions": 372, + "body": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles remaining `high` priority dependencies.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\nTest env: https://migrate-high-priority-deps-2.mural.engineering\r\n\r\n## What Was Migrated\r\n\r\n### Addons\r\n- **Lexical command types** (`addons/core/editors/lexical/common/commands/types.ts`) - Lexical command registration and unregistration types\r\n- **Mouse utilities** (`addons/core/mouse/right-click-pan/util.ts`) - Mouse button constants for right-click pan functionality\r\n- **Mermaid utilities** (`addons/mermaid/extract-node-id.ts`) - Node ID extraction utilities for Mermaid diagrams\r\n- **Mindmaps constants** (`addons/mindmaps/constants.ts`) - Mindmap formatting constants and default values\r\n\r\n### Business Logic\r\n- **Labels types** (`business/labels/types.ts`) - Label API types and interfaces\r\n- **Smart frameworks types** (`business/smart-frameworks/types.ts`) - Smart framework model service types and interfaces\r\n- **System of Record tracking** (`business/system-of-record/utils/tracking.ts`) - SOR tracking utilities\r\n\r\n### Helpers\r\n- **AI function call** (`helpers/ai/ai-function-call.ts`) - AI function call error handling and custom response utilities\r\n- **AI permissions** (`helpers/ai/permissions/constants.ts`) - AI permission error constants\r\n- **Almost equal** (`helpers/almost-equal.ts`) - Floating point comparison utility\r\n- **Find utilities** (`helpers/find.ts`) - Widget find and filter utilities\r\n- **Time constants** (`helpers/time-constants.ts`) - Delay and expiration time constants\r\n- **Widget type name** (`helpers/widget-type-name.ts`) - Widget type name utilities and tracking name helpers", + "labels": [] + }, + { + "number": 46784, + "title": "Add Datadog entity file", + "branch": "add/datadog-entity", + "merged_at": "2026-01-15T15:59:19Z", + "changed_files": 2, + "additions": 27, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis file generates a \"frontend\" service entity in Dadatog. This entity, called simply \"Murally\".\r\n\r\nThis entity helps track murally in the service catalog, incidents and DORA metrics\r\n\r\nCloses [PE-5870]\r\n\r\n#### Reviewer Resources\r\nN/A\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [X] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n[PE-5870]: https://mural.atlassian.net/browse/PE-5870?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46769, + "title": "[CWI-2530] Image Panel - fixed the footer", + "branch": "add/cwi-2530", + "merged_at": "2026-01-15T15:32:36Z", + "changed_files": 9, + "additions": 202, + "deletions": 111, + "body": "Updated the footer panel and the attributions for Giphy & Unsplash.\r\nUpdated the Chevron to the ArrowForward\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2530) to understand the context of this effort.\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Busines", + "labels": [] + }, + { + "number": 46742, + "title": "[NEXT-347] package room routes", + "branch": "feat/next-347-package-room-routes", + "merged_at": "2026-01-14T23:40:40Z", + "changed_files": 64, + "additions": 293, + "deletions": 164, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis is a near-complete effort to package all the code for the `/t/:team/r/:room/settings/*` family of routes. The final piece [is a modal dependency that unfortunately reaches deeply and broadly](https://mural.slack.com/archives/C09S4387H4Y/p1768408609377439?thread_ts=1768338247.323489&cid=C09S4387H4Y) into `src/billing` and `src/lib/billing`. Attempting to resolve all of those dependencies would balloon the scope and effort of this PR, so I propose that a better approach would be to merge this refactor as is, and then work on migrating code in those PRs separately / come back to finish this one off down the road.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-347) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-347-package-room-routes.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nThis is a 99% refactor / mostly moving files and updating references. Suggest a smoke test of the above routes as a sanity check.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [thes", + "labels": [] + }, + { + "number": 46726, + "title": "Update UI Toolkit version + patch tabindexing on Tools Adapter", + "branch": "rti-toolbar-fixes", + "merged_at": "2026-01-14T22:03:23Z", + "changed_files": 3, + "additions": 78, + "deletions": 10, + "body": "https://rti-toolbar-fixes.mural.engineering\r\n\r\nThis pull request updates the `@muraldevkit/ui-toolkit` package from version `4.59.1` to `4.61.0` and removes the deprecated tabbable prop from the `ToolbarButtonAdapter` component. The update fixes an issue where the widget toolbar was accessible via `tabindex` even when the focusWithShortcut prop was applied, delegating all tab index management to native HTML behavior and `MrlRovingTabindex`.\r\n\r\nChanges:\r\n\r\n- Updated @muraldevkit/ui-toolkit to version 4.61.0 (from 4.59.1)\r\n- Removed the tabbable prop from ToolbarButtonAdapter interface and implementation\r\n- Removed manual tabIndex management logic that was previously controlled by the tabbable prop", + "labels": [] + }, + { + "number": 46774, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-10", + "merged_at": "2026-01-14T21:48:30Z", + "changed_files": 47, + "additions": 221, + "deletions": 183, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves to packages these parts of state:\r\n* `dom`\r\n* `rightbar`\r\n\r\nTypes `RightBarTab`, `CommentListTab`, and `ResponsibleSize` were also moved to the state from SDK API.\r\n\r\nThe environment: https://next-356-10.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Centralizes UI state under the canvas package and updates consumers accordingly.\n> \n> - Adds `sdk/state/dom` and `sdk/state/rightbar` with initial state, exports, and helpers (`ResponsiveSize.get/getCurrent`, `CommentListTab.list/getDefault`)\n> - Moves shared types `RightBarTab`, `CommentListTab`, and `ResponsiveSize` from SDK APIs to `@muralco/canvas/sdk/state`; removes legacy duplicates and related util (`getCurrentResponsiveSize`)\n> - Updates imports/usages across addons, dispatchers, register components, SDK APIs, tests, and views to reference the new state modules\n> - Introduces unit tests for `ResponsiveSize` breakpoints and wires new state into initial app/public SDK state creation\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7bb1c6aeb666a7c0bba9fd07c6840469919b9746. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46756, + "title": "Remove widgetToolbarApi calls from Arrange", + "branch": "add/remove-wta-part3", + "merged_at": "2026-01-14T20:59:28Z", + "changed_files": 13, + "additions": 357, + "deletions": 786, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemove widgetToolbar.button from Arrange \r\n- Moved registration for arrange in the actionBar\r\n- \r\n[TestEnv](https://remove-wta-part3.mural.engineering)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8330)\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference betwee", + "labels": [] + }, + { + "number": 46768, + "title": "[ecomm-397] add due to next billing to subscription schedule", + "branch": "add/ecomm-397", + "merged_at": "2026-01-14T20:47:42Z", + "changed_files": 3, + "additions": 23, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI add the purchase order # field, also I change the navigation in payment details, adding save/edit button and make the request to save the address once fill all the information.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-397) to understand the context of this effort.\r\n\r\n\r\n### Record\r\n\r\nhttps://www.loom.com/share/7f21d39b17764b46a0a28ff327331258", + "labels": [] + }, + { + "number": 46773, + "title": "Stage linted CODEOWNERS, update nested packages' package.json", + "branch": "fix/codeowner-lint", + "merged_at": "2026-01-14T20:30:30Z", + "changed_files": 4, + "additions": 434, + "deletions": 5, + "body": "\n> [!NOTE]\n> Improves CODEOWNERS linting workflow and broadens ownership coverage for nested package manifests.\n> \n> - build/lint-codeowners.js: adds `--staged-only`, stages `CODEOWNERS` after `--fix`, checks staged files via `git`, updates usage text; resilient when git is unavailable\n> - build/lint-codeowners.test.js: adds comprehensive tests for staging behavior and `--staged-only`\n> - lefthook.yml: runs `codeowners-lint` with `--fix --staged-only` in pre-commit\n> - CODEOWNERS: switches `packages/native/**/package.json` and `packages/settings/**/package.json` to glob patterns to include nested packages\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e4553d13e2c944034b7b85ebd3c303745e574bbe. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46759, + "title": "[SCQM-1517] Add color themes to dispatcher", + "branch": "add/themes-to-dispatcher", + "merged_at": "2026-01-14T19:13:47Z", + "changed_files": 12, + "additions": 292, + "deletions": 247, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe purpose of this PR is to _remove the dependency on sdk from the themes toolbar component_ based on feedback from canvas core in the original work that got postponed. \r\n\r\nI tried to keep central logic the same as much as possible, just making changes necessary for moving the theme application to a new dispatcher API (with the exception of the refactor commit to bring all the color changes into a single apply call) and a couple linting fixes. \r\n\r\nSee feedback in this PR for additional context: https://github.com/tactivos/murally/pull/46145\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1517) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://themes-to-dispatcher.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nTo test: Regression test using the themes tool in the widget toolbar for updating the color of selected widgets. \r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46753, + "title": "[NEXT-392] Refactors dispatcher to use packaged apis vs sdkApis", + "branch": "update/refactor-dispatcher-from-sdkapis", + "merged_at": "2026-01-14T18:59:51Z", + "changed_files": 15, + "additions": 138, + "deletions": 75, + "body": "### Summary of Changes and Resources for the Reviewer\r\nRefactored mural/dispatcher to use SDK APIs from packages instead of inheriting from SdkApis where possible.\r\nCompleted refactorings\r\n\r\n**dom dispatcher** \u2014 Uses DomSdkApi from @muralco/canvas/sdk/apis\r\n**clipboard dispatcher** \u2014 Uses ClipboardSdkApi from packages\r\n**async dispatcher** \u2014 Uses AsyncSdkApi from packages\r\n**direct-exports dispatcher** \u2014 Uses DirectExportsSdkApi from packages\r\n**extensions dispatcher** \u2014 Uses ExtensionsSdkApi from packages\r\n**activity dispatcher** \u2014 Uses ActivitySdkApi from packages\r\n\r\n#### Changes\r\n- Dispatcher implementations now accept specific SDK API types as parameters instead of the full SdkApis object\r\n- Dependencies are explicit and typed\r\n- Reduced coupling between dispatchers and the monolithic SdkApis interface\r\n- Updated createMuralDispatcher to pass specific SDK APIs to each dispatcher\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-392) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://refactor-dispatcher-from-sdkapis.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Shifts dispatcher dependencies from the broad `SdkApis` to package-scoped SDK APIs, reducing coupling and making dependencies explicit.\n> \n> - Refactors `activity`, `async`, `clipboard`, `dom`, `extensions`, `direct-exports`, and `themes` dispatchers to accept their respective `*SdkApi` interfaces (e.g., `ActivitySdkApi`, `AsyncSdkApi`, `ClipboardSdkApi`, `DomSdkApi`, `ExtensionsSdkApi`, `DirectExportsSdkApi`, `ThemesSdkApi`", + "labels": [] + }, + { + "number": 46762, + "title": "[NEXT-401] Move WidgetsApi to canvas package", + "branch": "refactor/widgets-api", + "merged_at": "2026-01-14T18:23:01Z", + "changed_files": 61, + "additions": 183, + "deletions": 159, + "body": "Test environment: https://widgets-api.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Consolidates widget dispatcher and SDK types under the canvas package and updates consumers accordingly.\n> \n> - Adds `packages/canvas` re-exports: `dispatcher/widgets/index.ts` now exposes `WidgetsApi`, `WidgetsPhotoApi`, `WidgetsTableCellApi`, `WidgetsInkingApi`, `EditingApi`, `InputType`, `SwitchTo`, `MouseEventPosition`, `AddWidgetsOptions`, `DropWidgetsOnCanvasOptions`, etc.; `sdk/apis/widgets/index.ts` now exports `Pencil`, `PencilType`, `InkingPanel`, `EditWidgetFn`, `EditWidgetOptions`, `AddOptions`, and more\n> - Introduces `business/resize-widgets` in canvas and exports `ResizeWidgets` interface\n> - Refactors app code to import from `@muralco/canvas/dispatcher`, `@muralco/canvas/sdk/apis`, and `@muralco/canvas/business` (inking editors/toolbars, content viewer, add/drop widgets, quick edit, table cell/photo dispatchers, tests)\n> - Adjusts tests/mocks to reference new exports (e.g., spreading actual `@muralco/canvas/sdk/apis` in mermaid test)\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 82513a2fcaedc9f39177388d41c9c8f3cacc122a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46749, + "title": "[NEXT-402] Move mural modals to package. Insights, Move, Restore, Duplicate", + "branch": "move/request-duplicate-modal-package", + "merged_at": "2026-01-14T17:57:17Z", + "changed_files": 21, + "additions": 49, + "deletions": 41, + "body": "Move dashboard mural modals to package `muralco/dashboard-modals-mural`\r\n\r\nModals moved\r\n* Insights\r\n* Move\r\n* Restore\r\n* Duplicate modals\r\n * RequestDuplicate\r\n * DuplicateUpgrade\r\n * DuplicateMural\r\n\r\ntest-env\r\nhttps://request-duplicate-modal-package.mural.engineering/", + "labels": [] + }, + { + "number": 46767, + "title": "[FEP-6334] - Remove depcheck script", + "branch": "remove-depcheck-script", + "merged_at": "2026-01-14T17:45:42Z", + "changed_files": 128, + "additions": 116, + "deletions": 383, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6434](https://mural.atlassian.net/browse/FEP-6434)\r\n\r\n[https://linear.app/mural/issue/FEP-74/remove-depcheck-task-and-scripts](https://linear.app/mural/issue/FEP-74/remove-depcheck-task-and-scripts)\r\n\r\n# Depcheck Removal\r\n\r\nThis PR removes the `depcheck` script checker from the `murally` repository as part of the migration to `knip`.\r\n\r\n## Removed Depcheck References\r\n\r\n1. Removed the \"Check missing dependencies\" task that ran `npm run depcheck` from the quality workflow.\r\n2. Removed the `depcheck` task from the pipeline configuration (turbo.json).\r\n3. Removed the `depcheck` npm script from the root `package.json` that ran `turbo depcheck`.\r\n4. Removed the `\"depcheck\": \"npx muralco-depcheck\"` script from all packages in the `packages/` directory.\r\n5. Removed depcheck references from `.cursor/rules/development-workflow.mdc` and README files.\r\n6. Removed the `muralco-depcheck` bin reference from `packages/config/package.json`.\r\n7. Deleted the depcheck tool implementation at `packages/config/monorepo-tools/depcheck/index.js`.\r\n\r\n## Replacement with Knip\r\n\r\nThe migration from depcheck to knip was completed in a previous [PR](https://github.com/tactivos/murally/pull/46716) This cleanup removes all remaining depcheck references to complete the migration.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were add", + "labels": [] + }, + { + "number": 46746, + "title": "Migrates \"high\" priority dependencies from `src/mural` to `@muralco/canvas`", + "branch": "migrate-high-priority-deps", + "merged_at": "2026-01-14T16:15:01Z", + "changed_files": 196, + "additions": 313, + "deletions": 383, + "body": "This PR is the second of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles `high` priority dependencies.\n\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\n\n- **CRITICAL** (\u226520 imports)\n- **HIGH** (10-19 imports)\n- **MEDIUM** (5-9 imports)\n- **LOW** (1-4 imports)\n- **NONE** (0 imports)\n\n## What Was Migrated\n\n### Business Logic\n- **Tables utilities** (`business/tables/get-cell-format.ts`) - Table cell format utilities and default format constants\n- **System of Record constants** (`business/system-of-record/constants.ts`) - SOR model version and batch size constants\n\n### Helpers\n- **Widget type name** (`helpers/widget-type-name.ts`) - Widget type name utilities and tracking name helpers\n\n### SDK APIs\n- **AI helpers** (`sdk/apis/ai/helpers.ts`) - AI chat helpers, error message utilities, and workshop ID helpers\n- **Onboarding selectors** (`sdk/apis/onboarding/selectors.ts`) - Onboarding state selectors\n- **Connector utilities** (`sdk/apis/widgets/changes/systems/connectors/util.ts`) - Arrow normalization and connector computation utilities\n\n### Dispatcher APIs\n- **AI dispatcher types** (`dispatcher/ai/types.ts`) - AI API types and canned response props\n- **Facilitation dispatcher types** (`dispatcher/facilitation/types.ts`) - Facilitation API types including laser toggle and private mode status\n- **Mural dispatcher types** (`dispatcher/mural/types.ts`) - Mural API types including duplicate and inner state types\n- **Notifications dispatcher** (`dispatcher/notifications/`) - Notifications API creation and types\n- **Participants dispatcher types** (`dispatcher/participants/types.ts`) - Participants API types\n\n### Addons\n- **Lexical editor constants** (`addons/core/editors/lexical/common/consts.ts`) - Lexical editor default format and base features\n\n## Changes Summary\n\n- **191 files changed**: 290 addition", + "labels": [] + }, + { + "number": 46765, + "title": "[SCQM-1563] Fix Clustering position and count after streaming", + "branch": "fix/scqm-1563-cluster-bugs", + "merged_at": "2026-01-14T14:56:44Z", + "changed_files": 4, + "additions": 46, + "deletions": 32, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR fixes clusters repositioning after streaming ends (which used to break the Preview Mode toolbar positioning), improves viewport positioning at that point too, and fixes Clusters count being off by +1 due to including the \"Other\" cluster when it was not needed.\r\n\r\n| BEFORE | AFTER |\r\n| -- | -- |\r\n| \"image\" | \"image\" |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1563) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1563-cluster-bugs.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\n1. Add a bunch of clusterable stickies and cluster them.\r\n2. When streaming ends the results should be properly placed within the viewport boundaries, the Preview Mode mode toolbar should remain in the appropriate position, and the clusters count shown in chat should correctly reflect the final clusters count.\r\n\r\n**NOTE**: Make it easy for the AI if you want to ensure the \"Other\" cluster isn't needed. Check the examples images.\n\n\n---\n\n> [!NOTE]\n> Fixes misleading cluster counts and improves viewport behavior post-streaming.\n> \n> - Excludes invisible clusters (e.g., hidden \"Other\") from AI/chat output and cluster count in `function-call.ts`\n> - Adds `getFitToWidgetsPadding` in `utils.ts` and uses it for `viewport.fitToWidgets` in `operation.ts` and `preview-mode.ts`; removes inline padding logic\n> - During streaming, only reflow/reposition clusters if streaming is still active to avoid post-stream layout jumps\n>", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46763, + "title": "Fix 'learn more' link for SCIM managed company members banner", + "branch": "stable-fix/scim-learn-more-link", + "merged_at": "2026-01-14T13:57:03Z", + "changed_files": 2, + "additions": 3, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCorrects link per https://mural.slack.com/archives/C03ALFYHDU2/p1768347373711879\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatch", + "labels": [] + }, + { + "number": 46747, + "title": "ECOMM-394 Update pay by invoice legal disclosure text", + "branch": "add/edit-payment-text-updates", + "merged_at": "2026-01-14T03:40:51Z", + "changed_files": 4, + "additions": 287, + "deletions": 9, + "body": "## Summary\r\n\r\nUpdates legal disclosure text for pay-by-invoice payment method in scheduled downgrade scenarios, addressing ECOMM-394.\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-394\r\n\r\nTest Env: https://edit-payment-text-updates.mural.engineering/\r\n\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n\r\n## Changes\r\n\r\n- **Add BasicLegalContent component**: Shows minimal legal text on first page (no order) when pay-by-invoice is selected\r\n- **Update scheduled downgrade logic**: \r\n - First page: Shows basic legal text for pay-by-invoice only\r\n - Confirmation page: Shows invoice-specific text when order exists\r\n- **Type safety**: Changed `order` prop type from `unknown` to `StateOrder`\r\n- **Code quality**: Extracted `StandardScheduledDowngradeText` helper component to reduce duplication\r\n- **Refactoring**: Replaced ternary operators with if-else statements for better readability\r\n\r\n## Testing\r\n\r\n- Updated all tests to use proper `StateOrder` mock objects\r\n- Added test coverage for pay-by-invoice scenarios\r\n- All 30 tests passing\r\n\r\nFixes: ECOMM-394", + "labels": [] + }, + { + "number": 46695, + "title": "[NEXT-388] Move `billing` modal to new DashboardModalsManager", + "branch": "move/dashboardmodals-manager", + "merged_at": "2026-01-13T22:35:20Z", + "changed_files": 21, + "additions": 715, + "deletions": 203, + "body": "Create `DashboardModalsManager` to manage workspace or room level modals that open from anywhere within the dashboard.\r\n\r\nfirst modal moved: `billing`\r\n\r\nGoals: \r\n* create strongly typed access to modals to be able to `open()` and if necessary check `can()` permissions.\r\n * `modalDefinitions.billing.open()` \r\n* Rendering is decentralized:\r\n * No dashboard-wide \u201cstring \u2192 modal\u201d switch for migrated modals.\r\n\r\nChanges to modal opening\r\n* dashboard modals when 'reached-mural-limit' modal is opened (`dashboard/components/modals/index.tsx`)\r\n* dashboard View in `handleUpgradeRequested` (`dashboard/components/view.tsx`)\r\n* mural card duplicating a mural (when limit reached) (`duplicate-upgrade-plan.tsx`)\r\n* dashboard topbar `Upgrade` button (`topbar/notifications-bars/index.tsx`)\r\n* dashboard configurable menus Upgrade option (`dashboard/layout/config-menu/cta/upgrade-plan.tsx`)\r\n* CTAs upgrade button (`billing/components/ctas/upgrade-button/index.tsx`)\r\n* dashboard sidebar freemium CTA (`billing/sidebar-cta/freemium/index.tsx`)\r\n\r\n\r\nNo changes to ui. Only changed the logic to open and display the billing modal. Everything should be the same from customer perspective\r\n\r\ntest-env\r\nhttps://dashboardmodals-manager.mural.engineering/", + "labels": [] + }, + { + "number": 46745, + "title": "[ECOMM-396] Update plan summary panel downgrade text", + "branch": "update/ecomm-396-plan-summary", + "merged_at": "2026-01-13T19:41:50Z", + "changed_files": 4, + "additions": 212, + "deletions": 42, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR updates the plan summary panel UI for scheduled downgrades to improve clarity for users. The changes include new text labels, a restructured display format showing before/after values with arrow notation, and conditional rendering logic to avoid duplicating billing cycle information.\r\n\r\nChanges:\r\n\r\n- Modified TotalCostSection to accept an optional custom label for flexibility in different contexts\r\n- Restructured ScheduleChangesSummarySection to show plan changes in a clearer before/after format with arrows\r\n- Updated conditional rendering in the main panel to show \"Due next billing cycle\" in the total section for scheduled downgrades instead of as a separate line item\r\n- Added comprehensive test coverage for the new downgrade flow scenarios\r\n\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-396) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46754, + "title": "Correct CODEOWNERS for error routing", + "branch": "chore/correct-codeowners-for-err-views", + "merged_at": "2026-01-13T19:12:50Z", + "changed_files": 1, + "additions": 4, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to #46710, corrects some mistakes in that PR re: codeownership (see individual commits for more detailed explanation)\r\n\r\n#### Reviewer Resources\r\nOpen to arguments with any of these changes?\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46725, + "title": "NEXT-115 - Package /join-company-workspace route", + "branch": "add/next-115-2", + "merged_at": "2026-01-13T19:01:01Z", + "changed_files": 29, + "additions": 299, + "deletions": 1, + "body": "Test env - https://next-115-2.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis pull request packages the `/join-company-workspace` route functionality into a new internal package `@muralco/route-join-company-workspace`. The changes migrate existing route code from `src/team/routes/` into a standalone package structure with proper TypeScript configuration, tests, and build tooling.\r\n\r\n**Key Changes:**\r\n- Creates new package structure with proper configuration files (tsconfig, jest, webpack, eslint)\r\n- Migrates existing components and views to the new package with updated imports\r\n", + "labels": [] + }, + { + "number": 46699, + "title": "[SCQM-1555] Remove ai linkedin feature", + "branch": "update/ai-linkedin-removal", + "merged_at": "2026-01-13T18:47:40Z", + "changed_files": 10, + "additions": 5, + "deletions": 208, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoves unused feature ai linkedin \ud83d\uddd1\ufe0f \ud83d\udd25 \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://ai-linkedin-removal.mural.engineering/) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15148)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PD", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46741, + "title": "[ecomm-393] copy billing page and checkout screens", + "branch": "add/ecomm-393", + "merged_at": "2026-01-13T18:25:18Z", + "changed_files": 22, + "additions": 84, + "deletions": 82, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCopy updates across Billing page and checkout screens\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-181) to understand the context of this effort.\r\n\r\n### Screenshots\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n", + "labels": [] + }, + { + "number": 46728, + "title": "[CWI-2529] - Update emoji tooltips to show labels consistently", + "branch": "fix/cwi-2529-emoji-labels", + "merged_at": "2026-01-13T18:13:48Z", + "changed_files": 2, + "additions": 16, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes an issue with the tooltips on hover for emojis in the new unified image panel. Currently, the emojis in the emoji tab show the label 'smiling face', etc. in the tooltip, but the emojis in the preview/all tab incorrectly show the emoji itself. This updates so that both show the labels consistently. \r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/CWI-2529\r\nTest env: https://cwi-2529-emoji-labels.mural.engineering/\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46752, + "title": "Fix package.json ownership", + "branch": "fix/fep-ownership", + "merged_at": "2026-01-13T17:19:21Z", + "changed_files": 1, + "additions": 57, + "deletions": 3, + "body": "\n> [!NOTE]\n> Broadly aligns ownership rules in `CODEOWNERS`, with emphasis on `package.json` coverage.\n> \n> - Adds `packages/**/package.json` and many explicit `package.json` entries, co-owned by `@tactivos/fep-eng @tactivos/platform-engineering @tactivos/modularization-tiger-team` plus relevant domain teams\n> - Normalizes/updates owners for IAM, permissions, SCIM, apps, billing, canvas, integrations, dashboard, and other `packages/*` to include shared co-owners\n> - Extends/adjusts ownership for various `src/*` paths (e.g., dashboard, company subpaths) and marks additional areas as \"Needs investigation\"\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4802614e99a97618198f82bf2a375cc0500a5c1a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46716, + "title": "[FEP-6431] - move unlisted and and unused dependencies check to knip global configuration", + "branch": "knip-global-config", + "merged_at": "2026-01-13T17:01:45Z", + "changed_files": 31, + "additions": 282, + "deletions": 2507, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://mural.atlassian.net/browse/FEP-6431](https://mural.atlassian.net/browse/FEP-6431)\r\n\r\nhttps://knip-global-config.mural.engineering/\r\n\r\n## Overview\r\n\r\nThis PR improves dependency management across the monorepo by leveraging Knip to identify and clean up unused dependencies, add missing dependencies, and configure proper ignore rules for false positives. The goal is to reduce bundle size, improve build performance, and maintain accurate dependency declarations across all workspaces.\r\n\r\n### Fixes\r\n\r\n#### Unlisted dependencies\r\n- add missing dev dependency `dotenv` that's required in `build/html-report.js`.\r\n- add unlisted dev dependency `chokidar`, it was available in the project as a transitive dependency of `chokidar-cli`.\r\n- add unlisted dev dependency `path-browserify`.\r\n- add unlisted dev dependency `terser-webpack-plugin`, it was available in the project as a transitive dependency of `webpack`.\r\n- add missing local package dependencies like `@muralco/dashboard-types`, `@muralco/dashboard-utils`, `@muralco/learning`, `@muralco/room-settings`.\r\n\r\n\r\n#### Unused dependencies\r\n\r\n- remove `@babel/cli`, `@babel/plugin-proposal-decorators`, `@babel/plugin-transform-react-constant-elements`, `@babel/plugin-transform-react-inline-elements` and `babel-plugin-add-module-exports`. (these were added during the babel migration to v7, not referenced anymore).\r\n- remove `copy-webpack-plugin` from `@muralco/dashboard-legacy-ui` (the plugin was removed from the package webpack config).\r\n- remove `jsdom-global` from `@muralco/deprecation`.\r\n- remove `reselect` from `@muralco/mural-utils`.\r\n- remove `chokidar-cli`. We still support `chokidar` in the turbo webpack plugin, but there's no direct usage of the CLI (used in old watch scripts).\r\n- remove `concurrently` (used in outdated watch scripts).\r\n- remove `mock-require` (used in old test architecture).\r\n- remove `react-docgen-typescript-plugin`. (used to fix the storybo", + "labels": [] + }, + { + "number": 46750, + "title": "[EN-3619] Guest reactivation: move feature toggle to general settings", + "branch": "update/en-3619", + "merged_at": "2026-01-13T16:35:45Z", + "changed_files": 4, + "additions": 33, + "deletions": 35, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoves the setting from Feature Toggles to General Settings so that company admins can control the feature themselves.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3619) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/", + "labels": [] + }, + { + "number": 46731, + "title": "ECOMM-390 Update copy and styling on billing scheduled downgrade info box", + "branch": "add/billing-plan-update", + "merged_at": "2026-01-13T16:23:51Z", + "changed_files": 4, + "additions": 317, + "deletions": 50, + "body": "## Update subscription schedule callout to match Figma design\r\n\r\n### Overview\r\nRedesigned the subscription schedule callout component to match the Figma design with updated styling, transition arrows, and UI Toolkit color tokens.\r\n\r\nTicket: https://mural.atlassian.net/jira/software/c/projects/ECOMM/boards/572?selectedIssue=ECOMM-390\r\n\r\nTest Env: https://billing-plan-update.mural.engineering/\r\n\r\nUpdated Image\r\n\"Screenshot\r\n\r\n\r\n### Changes\r\n\r\n#### Component Updates (`subscription-schedule/index.tsx`)\r\n- Added transition arrows (\u2192) between current and new plan values\r\n- Updated component structure to use new BEM class names\r\n- Added plan name formatting with billing intervals (e.g., \"Team+ Monthly\", \"Team+ Annual\")\r\n- Changed date format from \"MMMM D, YYYY\" to \"MMM D, YYYY\" (abbreviated month)\r\n- Updated header text to match design: \"Your plan is scheduled to change. Here's a summary of your updated plan:\"\r\n\r\n#### Styling Updates (`subscription-schedule.module.sass`)\r\n- Replaced hardcoded color variables with UI Toolkit design tokens:\r\n - Background: `var(--mrl-color-background-info-light)`\r\n - Text: `var(--mrl-color-text-info)`\r\n - Icon: `rgb(var(--mrl-blue-80))`\r\n- Added light blue background with 8px border radius\r\n- Updated spacing and padding to match design specs\r\n- Implemented custom bullet points using `::before` pseudo-elements\r\n- Added proper list styling with correct indentation\r\n\r\n#### Billing Summary Styling (`billing/styles.sass`)\r\n- Updated plan name and price typography to match Figma:\r\n - Plan name: bold, dark text using `var(--mrl-color-text)`\r\n - Price amount: bold, larger font size\r\n - Breakdown text: regular weight, smaller font size\r\n- Added flex layout with gap spacing between plan name and price\r\n- Replaced `$dark-gray` SASS variable with `var(--mrl-color-text)` UI Toolkit token\r\n- Updated C", + "labels": [] + }, + { + "number": 46748, + "title": "[NEXT-400] Remove duplicated register types", + "branch": "fix/remove-duplicate-register", + "merged_at": "2026-01-13T15:59:24Z", + "changed_files": 61, + "additions": 63, + "deletions": 137, + "body": "Mea culpa.\n\n\n---\n\n> [!NOTE]\n> **Summary**\n> \n> - Removes duplicated `AIFeatureSpec`/`AIFunctionCallSpec` (and related) definitions from `src/mural/register/types.ts`, re-exporting them from `@muralco/canvas/register`\n> - Updates imports across AI chat panels, features, and function-calls to reference `@muralco/canvas/register` (including `FindableWidget`)\n> - Minor import cleanups in affected files; no runtime behavior changes expected\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 555f9a65f81700d812565724f6b91e4375d15a62. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46733, + "title": "[CAN-8318] Remove widgetToolbarApi calls from mindmaps", + "branch": "add/remove-wta-part1", + "merged_at": "2026-01-13T15:33:59Z", + "changed_files": 11, + "additions": 299, + "deletions": 509, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n-- Removed widgetToolbarApi calls from mindmaps\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8318)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+v", + "labels": [] + }, + { + "number": 46706, + "title": "[NEXT-391] Migrate \"critical\" `src/mural` dependencies", + "branch": "migrate-critical-deps", + "merged_at": "2026-01-12T22:18:31Z", + "changed_files": 244, + "additions": 506, + "deletions": 495, + "body": "This PR is the first of a series moving ready to modularize canvas dependencies into the canvas package. This PR handles `critical` dependencies.\r\n\r\nDependency priority was determined by evaluating the number of times a specific file was being imported within the `src` directory. The breakdown of priority is as follows:\r\n\r\n- **CRITICAL** (\u226520 imports)\r\n- **HIGH** (10-19 imports)\r\n- **MEDIUM** (5-9 imports)\r\n- **LOW** (1-4 imports)\r\n- **NONE** (0 imports)\r\n\r\n## What Was Migrated\r\n\r\n### Business Logic\r\n- **System of Record types** (`business/system-of-record/types/`) - Resource definitions and types\r\n- **Tags types** (`business/tags/types.ts`) - Taggable widget types and utilities\r\n\r\n### Helpers\r\n- **AI helpers** (`helpers/ai/`) - AI chat entry utilities, token management, and preview mode helpers\r\n- **Measure widget** (`helpers/measure-widget.ts`) - Widget measurement utilities\r\n\r\n### SDK APIs\r\n- **Features selectors** (`sdk/apis/features/selectors.ts`) - Feature flag selectors\r\n- **Viewport selectors** (`sdk/apis/viewport/selectors.ts`) - Viewport transformation selectors\r\n\r\n### Primitives\r\n- **Mural primitive API** (`sdk/primitives/mural/`) - Mural configuration primitive moved to canvas package\r\n\r\n## Changes Summary\r\n\r\n- **235 files changed**: 454 additions, 475 deletions\r\n- **Updated imports**: All consuming files now import from `@muralco/canvas` instead of relative paths\r\n- **Added dependency**: `@muralco/optimizely` added to canvas package dependencies\n\n\n---\n\n> [!NOTE]\n> Modularizes high-traffic shared code into `@muralco/canvas` and aligns all call sites.\n> \n> - Extracts and exports AI utilities (`helpers/ai/*`), `measure-widget`, taggable widget types, and system-of-record resource types from `src/mural` to `packages/canvas` with new `index` barrels\n> - Adds feature flag and viewport selectors under `canvas/sdk/apis` and updates usages across UI/addons/dispatcher/tests\n> - Introduces `createMuralPrimitiveApi` in `canvas/sdk/primitives`", + "labels": [] + }, + { + "number": 46727, + "title": "[NEXT-395] Update CODEOWNERS", + "branch": "update/codeowners-file", + "merged_at": "2026-01-12T21:46:25Z", + "changed_files": 5, + "additions": 2733, + "deletions": 538, + "body": "\n> [!NOTE]\n> Introduces automated validation for `CODEOWNERS` and updates ownership mappings.\n> \n> - Adds `build/lint-codeowners.js` with parsing, sorting, duplicate detection, ownership-conflict checks, formatting normalization, `--fix`, and verbose mode\n> - Adds comprehensive tests in `build/lint-codeowners.test.js`\n> - Integrates `codeowners-lint` into `lefthook.yml` for worktree, staged, and master-diff flows\n> - Adds npm scripts `lint:codeowners` and `lint:codeowners:fix` in `package.json`\n> - Rewrites `CODEOWNERS` with expanded and reorganized paths/owners\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9485087892a3dce1bda5a45f543f4e9bd2ca4cd1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46736, + "title": "[CAN-8050] Refactor `dragSelectedWidgets` logic", + "branch": "refactor/drag-business-rule", + "merged_at": "2026-01-12T21:26:56Z", + "changed_files": 1, + "additions": 108, + "deletions": 86, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is an attempt to split the work from https://github.com/tactivos/murally/pull/45893 (currently closed).\r\n\r\nThe motivation behind this is to remove the current flag controlling the resetting of changes before each dragging movement.\r\n\r\nRight now the code, under the flag, would `reset` the changes on every drag move, but only re-add any duplicated widget afterwards in an attempt to recreate the initial conditions of the dragging.\r\nHowever, lots of stuff can happen when we first start a dragging, and resetting should recreate them all in order to have a proper jump from the initial state to the current.\r\n\r\nIn this PR, everything that happens during initialization is now stored in an action that is re-applied after every `reset` to maintain consistency.\r\n\r\nGiven that this code is still flagged, no change in behavior is expected.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8050)\r\n- \ud83e\uddea [**Testing environment**](https://drag-business-rule.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46710, + "title": "[NEXT-MANY-TIX] Migrate all the error routes to packaging system", + "branch": "refactor/migrate-error-routes", + "merged_at": "2026-01-12T21:13:37Z", + "changed_files": 74, + "additions": 374, + "deletions": 233, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR moves all of the error routes (consolidated at `src/error`) to a new `@muralco/route-errors` package:\r\n- Moves an external referenced component (`WorkspaceActions`) that was living outside the `src/error` folder for some reason (no other references to it) into the fold\r\n- Moves the remaining external reference (a simple billing utility function) into the new `@muralco/billing` package and updates all references to that canonical definition / deletes other duplicative ones\r\n- Updates some css class names to conform to our linting rules around namespacing css classes with the file path\r\n- Migrates or deletes affected V1 test code and helpers as appropriate\r\n- Imports already packaged routes directly into `src/route-config` to avoid any indirection / keep ownership clear\r\n- Updates CODEOWNERS with relevant teams identified in this doc to make ownership clear\r\n\r\nOpen for discussion / comment on whether it makes sense to put all the error routes together or split them out into smaller packages, but this PR gets us closer to the goal of moving all our source code into the packaging system / I would advocate that we can always do that work with future PRs.\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://migrate-error-routes.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nOn the one hand, this PR is touching a *lot* of routes, so there is some risk here. But on the other hand, the views these routes render are (mostly) very simple, and we're really just moving files around / not touching any logic. Some of these routes are more straightforward to trigger than others, but I would suggest smoke testing / validating a decent sized sample of them should give us reasonable confidence that this is a safe refactor. Affected routes (36!):\r\n\r\n```\r\n/account-locked\r\n/account-not-found\r\n/auth-error\r\n/a", + "labels": [] + }, + { + "number": 46696, + "title": "[CWI-2434] Add generic and custom upgrade path for integrations", + "branch": "add/cwi-2434", + "merged_at": "2026-01-12T20:27:43Z", + "changed_files": 11, + "additions": 311, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add generic upgrade path component/flow for integrations.\r\n- Add method for custom upgrade paths for integrations.\r\n- Add custom upgrade path for Salesforce integration.\r\n- Fix Mural|MURAL casing in upgrade path text.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n- Please see https://www.loom.com/share/5a095ace0637417f9e615c38389a41af of the acceptance criteria for the above ticket\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/15154\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46734, + "title": "[can-i-connect] Harden regional URL creation", + "branch": "add/connection-verification-followup", + "merged_at": "2026-01-12T20:03:30Z", + "changed_files": 3, + "additions": 207, + "deletions": 23, + "body": "TEST ENV: https://connection-verification-followup.mural.engineering/can-i-connect\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the regional blob storage URL was wrong.\r\n\r\nNow, we fix the logic to construct the URL per region and add some tests to confirm. \r\n\r\nNOTE: in lower ENVs, we have some CORs errors. But I think they should go away in prod/beta etc\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea Please use this [**testing environment**](https://connection-verification-followup.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. go to can-i-connect\r\n 2. select a non us region\r\n 3. run tests\r\n 4. note the network call and response to the `blob storage` url is correct\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nhttps://mural.slack.com/archives/C07T0HZTZSL/p1767984662991789?thread_ts=1767982194.203289&cid=C07T0HZTZSL\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/space", + "labels": [] + }, + { + "number": 46717, + "title": "[CAN-8258] Implement Rollout Navigation Flow 1 ", + "branch": "add/can-8258", + "merged_at": "2026-01-12T19:48:59Z", + "changed_files": 27, + "additions": 948, + "deletions": 209, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the navigation improvements code, add several missing unit test and implements the first flow \r\nWhen a user chooses to switch \"later\" to the new navigation.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8258) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8258.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46720, + "title": "[SCQM-1486] Update empty outline img", + "branch": "update/presentation-graphic", + "merged_at": "2026-01-12T19:35:30Z", + "changed_files": 1, + "additions": 0, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nReplaces the img shown in an empty outline. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1486) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://presentation-graphic.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Fresh mural with nothing in the outline\r\n2. Open the outline and verify the img is the new one Jackson provided\r\n\r\nBEFORE:\r\n\"Screenshot\r\n\r\nAFTER: \r\n\"Screenshot\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46700, + "title": "[CWI-2518] Remove Caption for Giphy (new Image Panel)", + "branch": "fix/another-fix-for-captions", + "merged_at": "2026-01-12T19:21:53Z", + "changed_files": 5, + "additions": 41, + "deletions": 31, + "body": "This change removes the ability to show Captions for Giphy Images.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2518) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46739, + "title": "Bump node version to 20.21.0", + "branch": "fix/node-version", + "merged_at": "2026-01-12T18:30:01Z", + "changed_files": 9, + "additions": 13, + "deletions": 13, + "body": "Bump node version to 20.21.0\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Updates the project\u2019s required Node.js runtime to 22.21.0 across configuration, build images, and docs.\n> \n> - Bumps Node version to `22.21.0` in `.nvmrc`, `package.json`/`package-lock.json` `engines`, and developer docs (`README.md`, `.cursor/rules/*`, `.github/copilot-instructions.md`)\n> - Updates Docker base images to `node:22.21.0-slim` in `docker/development.Dockerfile` and `docker/single.Dockerfile`\n> - Adjusts setup snippets (e.g., `nvm alias default 22.21.0`) to match the new version\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7289bd7ce50364dd9ae5cdfe8705dd70235f08ec. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n<", + "labels": [] + }, + { + "number": 46719, + "title": "[ECOMM-392] Update scheduled downgrade plan edit success modal", + "branch": "update/ecomm-392-confirm-modal", + "merged_at": "2026-01-12T17:34:46Z", + "changed_files": 3, + "additions": 191, + "deletions": 45, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR updates the scheduled downgrade plan edit success modal with improved copy, styling, and data display. The changes enhance the user experience by providing clearer information about plan changes, membership adjustments, and billing details.\r\n\r\nKey Changes:\r\n\r\n- Updated modal title from \"Downgrade process has been scheduled\" to \"Your Mural plan change is scheduled\"\r\n- Added conditional arrows (\u2192) to show changes in memberships and billing cycles\r\n- Changed date format from \"MM/dd/yy\" to \"MMM d, yyyy\" for better readability\r\n- Replaced \"No credit applied\" with actual amount due next billing cycle\r\n- Added comprehensive test coverage for the new conditional rendering logic\r\n\r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-392) to understand the context of this effort.\r\n\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Improves clarity and data shown in the scheduled downgrade plan edit success modal.\n> \n> - Updates modal copy/title and adds clearer summary items (`Plan`, `Memberships`, `Billing cycle`, `Effective date`, `Due next billing cycle`)\n> - Shows conditional arrows (`\u2192`) when memberships or billing interval change; omits when unchanged\n> - Formats effective date as `MMM d, yyyy`; displays \"Not available\" when missing\n> - Replaces \"No credit applied\" with formatted amount due via new `amountPaidOnFulfilledOrder` prop and `formatDollars`\n> - Wires new prop from billing route (`PlanEditDowngradeScheduleSuccessModal` receives `...planEditSuccessModalData`)\n> - Adds comprehensive tests covering loading/error states and conditional rendering for plan, memberships, billing cycle, and date\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9fcc1c93c7e9afcdd19febbaf66db3b4f5984", + "labels": [] + }, + { + "number": 46737, + "title": "[EN-3582] Mural users: fix styling for permissions cell when editable", + "branch": "fix/en-3582", + "merged_at": "2026-01-12T17:25:33Z", + "changed_files": 2, + "additions": 21, + "deletions": 29, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pag", + "labels": [] + }, + { + "number": 46730, + "title": "Update billing modal functions to use type WorkspaceWithMembers because that workspace param is used to `setWorkspace()` on WorkspaceStore", + "branch": "refactor/billing-modal-workspace-type", + "merged_at": "2026-01-12T16:13:18Z", + "changed_files": 3, + "additions": 10, + "deletions": 7, + "body": "This is refactored to support moving the `billing` modal in [this PR](https://github.com/tactivos/murally/pull/46695)", + "labels": [] + }, + { + "number": 46729, + "title": "Fixed issue with undo functionality for table Column & Rows deletion", + "branch": "fix/can-8315", + "merged_at": "2026-01-12T13:32:07Z", + "changed_files": 2, + "additions": 159, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n- Undo for table row/column deletion now restores the table layout through the Widget Changes API without mutating the table model in-place, so rows/columns are included in the persisted update (not just width/height).\r\n\r\n- Added a regression unit test that runs delete-middle-row/column \u2192 undo and asserts the persisted update for the table contains the restored rows/columns.\r\n\r\n### Case Solved\r\n\r\n**How to reproduce:** Create a 3\u00d73 table \u2192 delete the middle column \u2192 undo \u2192 open the mural as another editor/visitor \u2192 try changing a middle cell background color.\r\n\r\n**Expected results:**\r\n\r\nUndo persists the restored table layout, so collaborators see a valid table and cell background changes work consistently.\r\n\r\n**Actual result before fix:**\r\n\r\nUndo \u201clooked\u201d correct for the user who performed it, but the restored rows/columns weren\u2019t persisted; other clients loaded a corrupted table state and cell background changes no-op\u2019d.\r\n\r\n### How the Change Fixes It\r\n\r\n- sdk.widgets.changes.commit() persists by diffing the store snapshot from the first apply against the current store; only real store diffs become API updates.\r\n\r\n- Previously, undo directly assigned table.properties.rows/columns before staging newTableChanges, making the \u201crestore layout\u201d update redundant at diff time; the commit ended up persisting only size changes from layout recomputation.\r\n\r\n- The change keeps the \u201crestored rows/columns\u201d in local variables for calculations and only updates the table via sdk.widgets.changes.apply(newTableChanges), so commit() sees and persists the rows/columns change and prevents remote corruption.\r\n\r\n\r\n### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8315) \r\n- \ud83e\uddea [ENV](https://can-8315.mural.engineering/)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Fixes undo for table row/column deletion to persist restored layout to collaborators.\n> \n> - Avoids in-place mutation of `table.properties`; uses", + "labels": [] + }, + { + "number": 46711, + "title": "[SCQM-1542] PR-1: Enhance AI Agent Inspector Tree View", + "branch": "update/ai-agent-tool-ui-v1", + "merged_at": "2026-01-10T01:11:01Z", + "changed_files": 9, + "additions": 786, + "deletions": 185, + "body": "# Summary\r\n\r\nJIRA: https://mural.atlassian.net/browse/SCQM-1542\r\nENV: https://ai-agent-tool-ui-v1.mural.engineering/\r\n\r\nAdds support for displaying `AI_OPERATION_FAILED` and `AI_AGENT_READY` events in the AI Agent Inspector, alongside the existing `AI_DEBUG_INFO` events. The JSON viewer now presents AI event data in a more readable format.\r\n\r\n## What Changed\r\n\r\n### New Events Supported\r\n* `AI_DEBUG_INFO`\r\n* `AI_OPERATION_FAILED`\r\n* `AI_AGENT_READY`\r\n\r\n### What the Viewer Displays\r\n\r\n**AI_DEBUG_INFO**\r\n```\r\nAI_DEBUG_INFO 99d419c0 \u2190 Event with shortened traceId\r\n \u2514\u2500 AGENT_START \u2190 action displayed as key\r\n \u2514\u2500 agent summarize-fixed-orchestrator \u2190 nested agentName as value\r\n \u2514\u2500 messagePayload object{1}\r\n```\r\n\"Screenshot\r\n\r\n\r\n**AI_OPERATION_FAILED**\r\n```\r\nAI_OPERATION_FAILED \u2190 Event type\r\n \u2514\u2500 AGENT_START 196a13a6 \u2190 Extracted trace entry with traceId\r\n \u2514\u2500 agent summarize-fixed-orchestrator\r\n \u2514\u2500 AGENT_ERROR 196a13a6 \u2190 Error trace entry\r\n \u2514\u2500 description \"message|too-many-characters\"\r\n \u2514\u2500 performance 44ms \u2190 timeToFinish formatted\r\n```\r\n\r\n\r\n\"Screenshot\r\n\r\n\r\n**AI_AGENT_READY**\r\n```\r\nAI_AGENT_READY \u2190 Event type\r\n \u2514\u2500 response summarize-fixed-orchestrator \u2190 type as value\r\n \u2514\u2500 agentsTrace e7662f8d \u2190 Shortened traceId\r\n \u2514\u2500 AGENT_START \u2190 Extracted trace entries\r\n \u2514\u2500 TOOLS_CALL\r\n \u2514\u2500 AGENT_MESSAGE\r\n \u2514\u2500 usage 507 tokens \u2190 totalTokens formatted\r\n \u2514\u2500 value object{1}\r\n```\r\n\r\n\"image\"\r\n\n\n---\n\n> [!NOTE]\n> Refreshes the cancel scheduled change modal to match new copy and UX.\n> \n> - Updates header/content copy and confirm button label to `Cancel scheduled change`; adds explanatory text\n> - Adds secondary `Keep changes` button invoking `onCancel` and disabled when loading\n> - Aligns tests with new copy and actions; scopes header text lookup with `within`\n> - Minor style tweak for content color (`rgb(var(--mrl-gray-80))`)\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 629c0ca2bd4b4da35cb243be9ced0224a52cdd22. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46653, + "title": "[CWI-2520] - Add tracking and UI for image panel most frequent emojis (WIP)", + "branch": "add/cwi-2520-frequently-used-emojis", + "merged_at": "2026-01-09T22:32:07Z", + "changed_files": 4, + "additions": 385, + "deletions": 50, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking for user's most frequently used/added emojis, in order to display them in the new image panel. Counts for the top 20 most frequently used emojis are kept in localStorage and show to users once they have enough of them in the emoji tab.\r\n\r\n(UI/Design TBD)\r\n\r\n#### Reviewer Resources\r\nJIRA Ticket :https://mural.atlassian.net/browse/CWI-2520\r\nTest env: https://cwi-2520-frequently-used-emojis.mural.engineering/\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46539, + "title": "[SCQM-1436] adds failure limit and messages to summarize", + "branch": "update/action-summarize-failure-message", + "merged_at": "2026-01-09T22:22:35Z", + "changed_files": 3, + "additions": 430, + "deletions": 32, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds 3 failure message for failures _during_ the refinement flow. The first two message contain a try again button. On the third failure the user will no longer be able to try again.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1436) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://action-summarize-failure-message.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Pull this branch down locally so you can trigger a failure\r\n 2. Change [MAX_REFINEMENT_ATTEMPTS](https://github.com/tactivos/mural-api/blob/master/worker/src/operations/ai-agent/agents/summarize/utils-validation.ts#L8) to 0\r\n 3. Trigger the summarize action The messages will appear in this order:\r\n 4. Attempt 1: \"We couldn't update the summary. Try again.\"\r\n 5. Attempt 2: \"That didn't work. Try again or reset the summary.\"\r\n 6. Attempt 3: \"We still couldn't update. Reset the summary or refresh.\" (\u201cTry Again\u201d button is no longer available)\r\n 7. After 3 failed attempts: Disable refinement buttons until user leaves the current preview mode session.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/66", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46671, + "title": "[CWI-2419] Fix - Mural goes blank when sending a Sticky Note to GitHub and adding a label to it", + "branch": "fix/cwi-2419", + "merged_at": "2026-01-09T21:14:36Z", + "changed_files": 7, + "additions": 114, + "deletions": 81, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - Mural goes blank when sending a Sticky Note to GitHub and adding a label to it\r\n\r\n\"Screenshot\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2419", + "labels": [] + }, + { + "number": 46718, + "title": "NEXT-390 - Refactor /join-company-workspace route before packaging", + "branch": "add/next-390", + "merged_at": "2026-01-09T20:57:26Z", + "changed_files": 20, + "additions": 2322, + "deletions": 728, + "body": "[NEXT-390](https://mural.atlassian.net/browse/NEXT-390) - Refactor /join-company-workspace route before packaging\r\n[NEXT-394](https://mural.atlassian.net/browse/NEXT-394) - Migrate cucumber v2 tests for the route /join-company-workspace to jest\r\n~~[NEXT-393](https://mural.atlassian.net/browse/NEXT-393) - Replace withAuthenticatedUser HOC with RequireAuth for /join-company-workspace route~~\r\n\r\nTest env - https://next-390.mural.engineering\r\n\n\n[NEXT-390]: https://mural.atlassian.net/browse/NEXT-390?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n[NEXT-394]: https://mural.atlassian.net/browse/NEXT-394?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n[NEXT-393]: https://mural.atlassian.net/browse/NEXT-393?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46724, + "title": "Revert \"Merge pull request #46510 from tactivos/add/event-data-to-res\u2026", + "branch": "beta-fix/revert-event-data-to-research", + "merged_at": "2026-01-09T20:45:26Z", + "changed_files": 6, + "additions": 33, + "deletions": 342, + "body": "revert this pr https://github.com/tactivos/murally/pull/46510\r\n\r\nThis reverts commit 03efae71d8ee42561b25a2669230e003cd8cf1a8, reversing changes made to 6d6548bbf320663aa35f0fd6bb4a575fa1b0540c.\r\nhttps://www.loom.com/share/735d7a8e52fb42b4ac9e15b3daca56e6\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nwe were experiencing a bug where sf string got too long. Revert the changes while we work on a fix \r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Reverts prior addition of Salesforce Events/Tasks to research data and API/types.\n> \n> - Removes `SalesforceEvent`/`SalesforceTask` types and `getSalesforceEvent`/`getSalesforceTask` APIs from `packages/integrations-platform/src/salesforce`\n> - Deletes account-scoped query helpers `get-events-by-account-id` and `get-tasks-by-account-id`\n> - Simplifies `fetchSalesforceAccountResearchData` to fetch only `account` and related `opportunities`; drops `activity` (events/tasks) handling and detail fetches\n> - Updates tests to reflect opportunities-only behavior and adjusted logging/connection checks\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c5b859ac81877c02c27067d59c56eff93a206163. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46709, + "title": "ECOMM-389 Add tooltip to edit plan button when downgrade is scheduled and button is disabled", + "branch": "add/billing-tooltip", + "merged_at": "2026-01-09T20:12:37Z", + "changed_files": 6, + "additions": 253, + "deletions": 12, + "body": "## Summary\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-389\r\n\r\nTest Env: https://billing-tooltip.mural.engineering/\r\n\r\n\"Screenshot\r\n\r\nUpdates the billing summary tooltip to show a new message when a plan has a scheduled change and the `downgradeAtRenewalEnabled` feature flag is enabled.\r\n\r\n## Changes\r\n\r\n- **Tooltip text**: Shows \"This plan already has a scheduled change.\\nCancel it to make further edits.\" when `editPlanDisabledReason` is `cancelAtPeriodEnd` and the flag is on\r\n- **Tooltip positioning**: Positions tooltip above the button when the flag is enabled\r\n- **Styling**: Adds CSS to preserve newline rendering in tooltip text\r\n- **Tests**: Adds comprehensive unit tests covering all tooltip scenarios\r\n\r\n## Notes\r\n\r\n- Unpaid invoice tooltip takes priority over scheduled change tooltip\r\n- Tooltip only appears when `editPlanDisabledReason` is set\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces consistent tooltip handling when a plan change is already scheduled and edit actions are disabled.\n> \n> - Adds `hasSubscriptionSchedule` to `EditPlanTooltipDisplayReason` and computes it from `workspace.subscriptionScheduleId` in `view.tsx`\n> - Updates `BillingSummary` and `AccountPrice` to centralize tooltip text via `getTooltipText`, position it `top` for scheduled changes, and disable buttons based solely on `editPlanDisabledReason`\n> - Styles tooltip (`billing-summary-disabled-tooltip`) to preserve newlines\n> - Adds unit tests (`billing-summary.test.tsx`) covering unpaid invoice, scheduled change (including newline rendering), downgrade, and no-tooltip cases\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8c02ce3f66650563008d03a9e1ca8b9327c7f9fc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\n---\n\n> [!NOTE]\n> Introduces a new public Connection Diagnostic feature and integrates it into the app routing.\n> \n> - Adds `@muralco/connection-verification` package with a React page (`CanIConnectPage`) at `/can-i-connect`\n> - Implements `useConnectivityTest` hook to test service reachability (HTTP HEAD and Socket.IO ping/pong) for `webapp`, `integrations`, `realtime`, `api/ping`, blob storage, and a noun-project URL, with region selection (`us`, `eu`, `au`)\n> - Fetches base endpoints via `fetchServiceUrls` and regionalizes non-US URLs\n> - UI shows a results table, pass/fail notifications, and loading state; basic tests verify run button state\n> - Wires routes via `CanIConnectRoutes` and adds package to workspace dependencies and build/test configs\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e367744826dff28da1c556097ce254a1a8f13fa9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46685, + "title": "[SCQM-1367] Remove AI upgrade CTA feature flag", + "branch": "remove/ff-upgrade-cta", + "merged_at": "2026-01-09T19:00:55Z", + "changed_files": 19, + "additions": 32, + "deletions": 59, + "body": "### Summary of Changes and Resources for the Reviewer\r\nRemove flag / gates for the AI upgrade CTA that shows up in the chat and the explore menu for free users. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1367) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ff-upgrade-cta.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nTo test:\r\n1. Create a free account if you don't already have one set up \r\n2. Verify the CTA is on by default in the chat panel and in the explore menu \r\n3. Log into your work account (not free) \r\n4. Verify the CTA is not shown in the chat panel and explore menu \r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46555, + "title": "Added role column, tooltip to license column and menu items when RBAC is enabled", + "branch": "add/iam-2308-ws-role-support", + "merged_at": "2026-01-09T16:40:36Z", + "changed_files": 8, + "additions": 373, + "deletions": 70, + "body": "## Summary\r\n\r\nThis PR adds RBAC (Role-Based Access Control) support to the workspace users table. When RBAC is enabled, the table now displays a Role column and provides role management actions. Additionally, a helpful tooltip is added to the License column to explain the member vs guest distinction.\r\n\r\nTesting Env: https://iam-2308-ws-role-support.mural.engineering/\r\n\r\n## Changes\r\n\r\n### New Features\r\n1. **Role Column** (workspace-user-role-cell.tsx)\r\n - Displays \"Admin\" or \"Member\" based on user's `roleId`\r\n - Only shown when RBAC is enabled\r\n - Replaces \"Last Seen\" column when RBAC is active\r\n\r\n2. **License Column Tooltip**\r\n - Added tooltip: \"Members are internal users, and guests are external users. Each is entitled to different permissions.\"\r\n - Only shown when RBAC is enabled\r\n\r\n3. **Role Management Actions**\r\n - New actions: `GRANT_ADMIN_ACCESS` and `REMOVE_ADMIN_ACCESS`\r\n - Uses `RoleActions` component instead of `Actions` when RBAC is enabled\r\n - Role changes handled via `updateManyRoles` API endpoint\r\n\r\n### API Changes\r\n- Added `updateManyRoles` method to `workspacesApi.members`\r\n- Added `WorkspaceRoles` enum and `WorkspaceMemberRoleUpdate` type\r\n- Added `roleId` field to `ListMember` interface\r\n\r\n### Component Changes\r\n- New hook: `useUpdateWorkspaceUserRoleRequest` for role updates\r\n- New function: `getAvailableWorkspaceUserRbacActionsForSelectMenu` for RBAC-specific actions\r\n- Modified `getWorkspaceUserColumns` to conditionally render columns based on RBAC flag\r\n- Modified `renderWorkspaceUserActionCell` to use `RoleActions` when RBAC is enabled\r\n\r\n## Technical Details\r\n\r\n### Conditional Rendering\r\n- **When `isCompanyUsingRbac === true`:**\r\n - Shows Role column (replaces Last Seen)\r\n - Hides permission columns (Create Rooms, Can Publish Templates, Can Discover Public Rooms, Admin)\r\n - Uses `RoleActions` component for actions\r\n - Shows tooltip on License column\r\n\r\n- **When `isCompanyUsingRbac === false`:**\r\n - Shows Last Seen column\r", + "labels": [] + }, + { + "number": 46705, + "title": "[SCQM-1564] Fix table widget child selection in ai-action summarize", + "branch": "fix/scqm-1564-summarize-table", + "merged_at": "2026-01-09T16:19:10Z", + "changed_files": 1, + "additions": 10, + "deletions": 11, + "body": "Card: [SCQM-1564](https://mural.atlassian.net/browse/SCQM-1564)\r\nEnv: https://scqm-1564-summarize-table.mural.engineering/\r\n### Summary of Changes and Resources for the Reviewer\r\nWhen a table was selected, the action version of summarize would not select its descendents (including table cells with text), leading to either an error if only the table was selected or the table's content being ignored in a summary if other items were also selected.\r\n\r\nThe bug was due to using `selectedWidgets` instead of the `summarizableWidgets` result from `getAISummarizableWidgets` in places sending the list of widgets to be summarized. The definition of `summarizableWidgets` is moved a little earlier to allow it to be used in place of `selectedWidgets` when creating the request message.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1564) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1564-summarize-table.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n1. Enable the `feat-mu-ai-action-summarize-enabled` flag and reload the page\r\n2. Perform summarization on a table\r\n a. A table is a valid target for summarize if it has text in any of its cells, or has widgets in its cells which have text. If it doesn't meet those requirements the summarize option won't be able to be selected from the dropdown.\r\n3. The core bug was that the action version of summary was sending only the table's widgetId to the endpoint, not the full list of child widget ids. So you can inspect the request to the `agent` endpoint in the network inspector a", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46684, + "title": "[NEXT-387] Move SDK Apis without external dependencies", + "branch": "refactor/sdk-api-type-9", + "merged_at": "2026-01-09T15:48:53Z", + "changed_files": 46, + "additions": 127, + "deletions": 133, + "body": "Test environment:\r\nhttps://sdk-api-type-9.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> Modernizes SDK API boundaries and removes circular/external deps.\n> \n> - Centralizes `ExportSection` and `DownloadHint` into `@muralco/types` and updates all usages (dispatchers, addons, views, tests)\n> - Moves `BASE_FORMATS` (and base sections) into `sdk/state/downloads`; dispatcher now consumes from state; trims dispatcher re-exports\n> - Drops `DEFAULT_CAPABILITIES` from `sdk/apis/capabilities` and defines defaults inside `sdk/state/capabilities`\n> - Updates multiple SDK API implementations to import local `state/*` and their own `./types`; exposes `create*Api` from each `index.ts`\n> - Cleans up `direct-exports` API/types (removes local `ExportSection` enum), aligns tests, and preserves tracking constants/behavior\n> - Aggregator `sdk/apis/index` now builds with the new `create*Api` exports without external package coupling\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 719fd0021ee10a3176abb6b2be62be3e0949b455. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46687, + "title": "[CWI-2525] Align Preview Image to Sidebar", + "branch": "add/cwi-2525", + "merged_at": "2026-01-09T15:23:29Z", + "changed_files": 2, + "additions": 131, + "deletions": 186, + "body": "Align the preview of the Images/Gifs same height as the hovered image.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2525) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46694, + "title": "Prevent 'c' being written in widgets created from quick-add (connector mode)", + "branch": "fix/quick-add-with-c", + "merged_at": "2026-01-09T15:11:40Z", + "changed_files": 2, + "additions": 14, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\nThis PR updates the quick-add behavior not to start widget edition.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the", + "labels": [] + }, + { + "number": 46701, + "title": "[ECOMM-391] Update conflicting change notification copy and styles", + "branch": "update/ecomm-391-notification-copy", + "merged_at": "2026-01-09T14:06:08Z", + "changed_files": 2, + "additions": 61, + "deletions": 24, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR updates the conflicting change notification in the two-screen purchase flow by improving the message copy, changing the notification kind from \"info\" to \"warning\", and relocating the notification to appear after the billing interval input for better context.\r\n\r\nKey Changes:\r\n\r\n- Updated notification text to be clearer and more actionable, providing specific guidance on how to handle conflicting changes\r\n- Changed notification kind from \"info\" to \"warning\" for better visual prominence\r\n- Added MrlLink component for the support email to improve accessibility and styling consistency\r\n\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-391) to understand the context of this effort.\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Improves the conflicting-change notification in the two-screen purchase flow.\n> \n> - Replaces the old info message with clearer guidance and a `MrlLink` to `support@mural.co`\n> - Changes notification `kind` from `info` to `warning` and relocates it to appear after the `BillingIntervalInput`\n> - Removes the previous conflict-notification block\n> - Updates tests to assert new copy and verify feature-flag behavior when enabled, disabled, or undefined\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 488d8c396924fdf9c77b9e4723d780d55c490efd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46698, + "title": "NEXT-129 - Package /create-team route", + "branch": "add/next-129", + "merged_at": "2026-01-09T13:50:27Z", + "changed_files": 32, + "additions": 1495, + "deletions": 111, + "body": "Test env - https://next-129.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR migrates the `/create-team` route from `src/team/routes/create-team` to a new internal package `@muralco/route-create-team`, following the established pattern of packaging routes for better modularity and maintainability.\r\n\r\n**Key changes:**\r\n- Extracts create-team route functionality into a standalone package with proper exports and configuration\r\n- Renames generic `PropTypes` interfaces to descriptive component-specific names for better clarity\r\n- Adds comprehensive test coverage for all components (WorkspaceNameInput, TermsAndConditionsCheckbox, DiscoverableCheckbox, InviteTeam, InviteInputField)\r\n- Documents known technical debt (legacy global `app` object usage)\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 27 out of 32 changed files in this pull request and generated 1 comment.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/team/routes/index.tsx` | Updates import to use the new package instead of local path |\r\n| `packages/route-create-team/package.json` | New package configuration with dependencies and build scripts |\r\n| `packages/route-create-team/src/index.ts` | Package exports for components, views, and helper functions |\r\n| `packages/route-create-team/src/CreateTeam.tsx` | Updates imports to use new file structure |\r\n| `packages/route-create-team/src/view/CreateTeamView.tsx` | Updates component imports to use PascalCase file names |\r\n| `packages/route-create-team/src/view/*Checkbox.tsx` | Renames PropTypes interfaces to component-specific names |\r\n| `packages/route-create-team/src/view/InviteTeam.tsx` | Renames PropTypes interface to InviteTeamProps |\r\n| `packages/route-create-team/src/view/WorkspaceNameInput.tsx` | New component extracted with tests, but uses deprecated attrs pattern |\r\n| `packages/route-create-team/src/view/helpers.ts` | Adds tech debt documentation for legacy global app usage |\r\n| ", + "labels": [] + }, + { + "number": 46678, + "title": "[NEXT-386] Migrate `src/mural/sdk/hooks` to `@muralco/canvas/sdk/hooks`", + "branch": "migrate-sdk-hook", + "merged_at": "2026-01-08T22:45:10Z", + "changed_files": 271, + "additions": 546, + "deletions": 464, + "body": "## Overview\n\nMigrates `sdk/hooks` and related utilities from `src/mural/` to the `packages/canvas/` package.\n\nThis PR refactors the hooks architecture to follow a clearer separation of concerns: each hook module now has a `create.ts` file containing the implementation (previously in `index.ts`), while `index.ts` serves as a barrel export for types only. This improves the package structure and makes the API boundaries clearer.\n\n## Changes\n\n### Package Migration\n- **SDK Hooks**: Moved from `src/mural/sdk/hooks/` \u2192 `packages/canvas/src/sdk/hooks/`\n- **Business Types**: Moved `add-widgets/types.ts` \u2192 `packages/canvas/src/business/add-widgets/`\n- **Registration Utilities**: Moved `create-extensions-array.ts` and `remove.ts` \u2192 `packages/canvas/src/register/`\n- **Helper Utilities**: Moved `recursive-scope.ts` \u2192 `packages/canvas/src/helpers/`\n- **Widget Deletion Types**: Moved from `sdk/apis/widgets/types.ts` \u2192 `packages/canvas/src/sdk/apis/widgets/delete.ts`\n\n### Architecture Refactoring\n\n**Hook Module Structure**:\n- Each hook module (activity, ai, widgets, etc.) now follows a consistent pattern:\n - `create.ts` - Contains the hook creation implementation (previously exported from `index.ts`)\n - `index.ts` - Barrel export that only exports types for external consumption\n - `register.ts` - Registration API (unchanged)\n - `state.ts` - State management (unchanged)\n - `types.ts` - Type definitions (unchanged)\n\n**Main Hooks API**:\n- `packages/canvas/src/sdk/hooks/index.ts` now contains the full `createHooksApi()` implementation\n- Re-exports all hook types and functions for external use\n\n### Import Updates\n- Updated all imports to use package paths:\n - `@muralco/canvas/sdk/hooks` (replaces `../../sdk/hooks/...`)\n - `@muralco/canvas/register` (replaces `../../register/util`)\n - `@muralco/canvas/business` (replaces `../../business/add-widgets/types`)\n - `@muralco/canvas/helpers` (replaces `../../helpers/recursive-scope`)\n - `@muralco/canvas/sdk/apis` (replaces `../../sdk/", + "labels": [] + }, + { + "number": 46704, + "title": "[ESC-1853] archived-murals: Move `@muralco/testing-tools` to devDependencies", + "branch": "add/esc-1853-dev-dep", + "merged_at": "2026-01-08T22:05:30Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "Jira: [ESC-1853](https://mural.atlassian.net/browse/ESC-1853)\r\n\r\n### Summary\r\nFollow-up to https://github.com/tactivos/murally/pull/46683. Move testing dependency to devDependencies.\r\n\n\n[ESC-1853]: https://mural.atlassian.net/browse/ESC-1853?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Moves `@muralco/testing-tools` from runtime `dependencies` to `devDependencies` in `packages/dashboard/archived-murals/package.json`.\n> \n> - Updates lockfile to reflect the dependency scope change\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cb7fc9a7d39ffc1c41698fa31644ad8e738cbfdc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46683, + "title": "[ESC-1853] archived murals: Add download item to actions menu", + "branch": "add/esc-1853-archived-download", + "merged_at": "2026-01-08T19:43:00Z", + "changed_files": 6, + "additions": 228, + "deletions": 28, + "body": "Jira: [ESC-1853](https://mural.atlassian.net/browse/ESC-1853)\r\nTesting environment: https://esc-1853-archived-download.mural.engineering/\r\n\r\n### Summary\r\nOn the Archived murals page, add a download item to the actions menu to download the mural as a PDF. The user is notified by email when the download is ready.\r\n\r\nhttps://github.com/user-attachments/assets/0cd44389-a608-4ef0-b861-8e33800cdaac\r\n\r\n\"image\"\r\n\r\n\r\n[ESC-1853]: https://mural.atlassian.net/browse/ESC-1853?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Introduces user-initiated mural downloads from the Archived murals actions menu and improves notification handling.\n> \n> - Adds `Download` menu item (with divider and icon) that calls `createMuralContentApi(muralId).export.pdf({ channel: 'email' })`\n> - Refactors toast state in `archived.tsx` to support `primaryMessage`, `secondaryMessage`, and `kind`; shows info toast on download and success/error for other actions\n> - Keeps existing unarchive/delete flows; selection and bulk actions unchanged aside from toast typing\n> - Expands tests for actions menu, download success/error paths, and toast expectations; adds `@muralco/testing-tools` dependency\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7e1cc043fe5f276bc6a20286aaa7761fe1ea9c8e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46692, + "title": "[CAN-8290] Add \"Try the latest navigation\" callout", + "branch": "add/can-8290", + "merged_at": "2026-01-08T18:44:08Z", + "changed_files": 7, + "additions": 98, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the new callout \"Try the latest navigation\" to the select tool if the feature flag is enable. \r\n\"image\"\r\n\r\nThe flow that controls when should be shown and its variants will be implemented in the follow up JIRA tickets.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8290) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8290.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46676, + "title": "First attempt to fix show caption", + "branch": "fix/show-hide-caption", + "merged_at": "2026-01-08T17:43:26Z", + "changed_files": 2, + "additions": 9, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nA quick fix for show Caption race condition.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46689, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-9", + "merged_at": "2026-01-08T17:00:56Z", + "changed_files": 58, + "additions": 344, + "deletions": 322, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these state parts:\r\n* `common-state`\r\n* `menus`\r\n* `modals`\r\n* `notification-bar`\r\n* `notification`\r\n* `onboarding`\r\n* `operations`\r\n* `secondary-top-bar`\r\n* `selection`\r\n\r\nThe environment: https://next-356-9.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Centralizes SDK state into `packages/canvas/src/sdk/state` and removes duplicated local definitions.\n> \n> - Moves and exposes `common-state`, `menus`, `modals`, `notification`, `notification-bar`, `onboarding`, `operations`, `secondary-top-bar`, `selection` with `State.initial` namespaces and barrel exports\n> - Refactors app code, selectors, and tests to import from `@muralco/canvas/sdk/state` (e.g., use `CommonState.initial`, `MenusState.initial`, `SelectionState.initial`, etc.)\n> - Replaces local `initial*` constants and `types` files with package equivalents; deletes redundant local state modules\n> - Minor import simplifications for register/context-menu types and state indexes; no behavioral changes intended\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6bb1be989e96c1b604982388efa9515d244810d9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46682, + "title": "[SCQM-1543] Add AI performanceTracking to mermaid function", + "branch": "add/scqm-1543-mermaid-perftrack", + "merged_at": "2026-01-08T16:48:05Z", + "changed_files": 6, + "additions": 137, + "deletions": 42, + "body": "Env: https://scqm-1543-mermaid-perftrack.mural.engineering\r\nCard: [SCQM-1543](https://mural.atlassian.net/browse/SCQM-1543)\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis adds the performanceTracking tracing calls to the `createMermaidChartElements` function used by the diagramming feature, in the same patten as in the mindmap functions in #46661 and using the same actionType as the feature uses when marking a pending action before handing off to the chat AI to orchestrate. This allows the performance tracking to include the `source: diagram_feature_form` property and measure the duration from the initial click on the diagramming form, including the AI generating the actual mermaid text to use.\r\n\r\nThe actionType values used by the feature are exported from the feature file and imported into the functions to keep them in sync.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1543) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1543-mermaid-perftrack.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. With the browser console open\r\n 2. Use the Create diagram feature from the landing page tiles or New prompt page, with the type set to flowchart\r\n 3. Watch for `[tracking] Tracking segment only Event: \"ai_performance_*` messages in the console (you can set the console's filter to `ai_performance_`)\r\n\r\nThis should also work when using the widget toolbar dropdown menu to launch create diagram directly (without the form UI).\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or u", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46650, + "title": "[CAN-8261] Floating widget toolbar tooltips", + "branch": "add/can-8261", + "merged_at": "2026-01-08T16:21:06Z", + "changed_files": 5, + "additions": 82, + "deletions": 14, + "body": "Render tooltips above the floating toolbar if it is above the widget and below the toolbar if the toolbar is below the widget\r\n\r\n- Added toolbar container context that passes along if the toolbar is above/below it's widget.\r\n- Custom rendered tools need to grab the toolbar container context individually\r\n\r\n[Test Env](https://can-8261.mural.engineering/)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8261)\r\n\r\nhttps://github.com/user-attachments/assets/a28f4373-062d-4384-88c3-f65209fa983d\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https:", + "labels": [] + }, + { + "number": 46647, + "title": "[CAN-8273] Don't render fixed widget toolbar if the user is not in edit mode", + "branch": "add/can-8273", + "merged_at": "2026-01-08T16:09:00Z", + "changed_files": 2, + "additions": 69, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBug: User's were able to access the fixed widget toolbar when right clicking on a widget in view-only mode. \r\n\r\nI added a conditional to the fixed widget toolbar that stops it from rendering if we are not in edit mode though I'm thinking that it's a bug that a widget is getting selected in view-only mode in the first place. \r\n\r\n[Test Env](https://can-8273.mural.engineering)https://can-8273.mural.engineering/\r\n[Jira](https://mural.atlassian.net/browse/CAN-8273)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Archit", + "labels": [] + }, + { + "number": 46688, + "title": "[SCQM-1038] Remove Preview Mode's white background on AI Clustering in favor of default", + "branch": "update/scqm-1038-cluster-background", + "merged_at": "2026-01-08T14:59:39Z", + "changed_files": 3, + "additions": 5, + "deletions": 96, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR removes the logic that used to set a white background to AI Clusters while in Preview Mode because white is now the default background color of areas (it used to be a translucent color that didn't look good in Preview Mode).\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1038) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1038-cluster-background.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\n1. Cluster with AI\r\n2. While in Preview Mode, the cluster areas should look the same as new default areas (about the same as before though \ud83e\udd37\u200d\u2642\ufe0f)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\n\n\n---\n\n> [!NOTE]\n> Removes Preview Mode-specific background color overrides for AI clustering and relies on the default area styling.\n> \n> - Deletes background color setting/restore logic and the `onDataChange` callback in `preview-mode.ts`; keeps accept/discard flows to commit staged changes and reset clustering state\n> - Removes white background application in `operation.ts` when creating streaming clusters; still hides previous clusters during streaming\n> - Updates unit tests to drop background color assertions/imports and validate only preview start and state reset behaviors\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f206a415ff88a51267bc8dd9feb7168055948159. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46670, + "title": "Upgrade Knip to latest version", + "branch": "update/knip-latest", + "merged_at": "2026-01-08T14:30:22Z", + "changed_files": 35, + "additions": 402, + "deletions": 607, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n* Updated the `knip` dependency to version `5.80.0` in `package.json` for improved unused file detection.\r\n* Fix new detected unused exports\r\n* Remove all the new unused Sass files detected (10)\r\n* Refactor `dashbord-legacy-ui` to move global definitions to `legacy-styles` package to simplify SASS exception handling\r\n* Enhanced `.knip.jsonc` configuration:\r\n * Added explicit support for Webpack config file patterns.\r\n * Adjusted workspace entries and project globs, including Sass files.\r\n * Added a workaround to ignore all Sass files in `packages/legacy-styles` and `packages/legacy-ui` to avoid detection issues with asset exposure. \r\n* Modified the `build/knip-ci.sh` script to suppress config hints in output for cleaner CI logs.\r\n\r\n#### Reviewer Resources\r\n- Testing env: https://knip-latest.mural.engineering/\r\n- For testing purposes, visual testing related to deleted/changes sass files was done... But double check for teams code owners\r\n- [Jira Ticket](https://www.youtube.com/watch?v=dQw4w9WgXcQ)", + "labels": [] + }, + { + "number": 46680, + "title": "Move plan-utils to muralco/billing. delete billing-utils", + "branch": "move/billingutils-to-billing-package", + "merged_at": "2026-01-07T21:47:52Z", + "changed_files": 34, + "additions": 25, + "deletions": 253, + "body": "consolidate billing packages", + "labels": [] + }, + { + "number": 46669, + "title": "[NEXT-384] Pt2 - Move MuralInsights modal to package", + "branch": "move/muralinsights-package", + "merged_at": "2026-01-07T21:31:12Z", + "changed_files": 26, + "additions": 19, + "deletions": 18, + "body": "\r\ntest-env\r\nhttps://muralinsights-package.mural.engineering/", + "labels": [] + }, + { + "number": 46681, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-8", + "merged_at": "2026-01-07T21:18:57Z", + "changed_files": 53, + "additions": 231, + "deletions": 208, + "body": "[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)\r\n\r\n**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages these state parts:\r\n* `extensions`\r\n* `find-and-replace`\r\n* `find`\r\n* `focus-mode`\r\n* `focus`\r\n* `guidelines`\r\n* `hidden-tooltips`\r\n* `hover-feedback`\r\n* `integrations`\r\n* `interactive-display-bottom-panels`\r\n\r\nThe environment: https://next-356-8.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK state into `packages/canvas/src/sdk/state` and updates initialization to reference `Namespace.initial` across the app.\n> \n> - Adds state slices with `initial` namespaces for `extensions`, `find`, `find-and-replace`, `focus`, `focus-mode`, `guidelines`, `hidden-tooltips`, `hover-feedback`, `integrations`, and `interactive-display-bottom-panels`\n> - Updates `sdk/state/index.ts` exports and replaces usages of local `initial*State` with `...State.initial` in `getInitialMuralStateForViews` and `getInitialPublicSdkState`\n> - Refactors SDK APIs (`extensions`, `find`, `find-and-replace`, `focus`, `focus-mode`, `guidelines`, `hidden-tooltips`, `hover-feedback`, `interactive-display-bottom-panels`, `sidebar`) to import from `@muralco/canvas/sdk/state` and use new `initial` values\n> - Simplifies some import paths (e.g., `integrations` types and `register`), and removes old local state `types`/`index` files and initializers\n> - Minor test updates to use `HiddenWidgetTooltipState.initial`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 03cc7a1589dc5b9620a2bc4b99e57fc9ef420f3f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46661, + "title": "[SCQM-1544] Add AI performance tracking to mindmap functions", + "branch": "add/scqm-1544-mindmap-trackperf", + "merged_at": "2026-01-07T21:05:53Z", + "changed_files": 9, + "additions": 316, + "deletions": 23, + "body": "Env: https://scqm-1544-mindmap-trackperf.mural.engineering\r\nCard: [SCQM-1544](https://mural.atlassian.net/browse/SCQM-1544)\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis adds calls to the `sdk.ai.performanceTracking` series of functions to the `expandMindmap` and `createMindmap` functions. This tracks the timing of the generate endpoint request to generate the new nodes. Because of the way the preview mode works for the mindmap functions, the time between the first preview and the final content is basically the same in most cases, but both are tracked. Because `expandMindmap` is called by `createMindmap` to do the actual generation, but `createMindmap` creates additional content and also starts preview mode itself, the calls to `performanceTracking` exit in both functions, with a new option passed to `expandMindmap` to stop it from doing its own calls to `performanceTracking` when being used as a sub-routine of `createMindmap`. `expandMindmap` does still call `performanceTracking.cancel` when it hits errors, because the return type is insufficient for `createMindmap` to know an error happened and cancel the tracking itself.\r\n\r\nIt also adds a new `sdk.ai.performanceTracking.markPendingAction` to allow the \"AI feature\" infrastructure to set a start time and other additional context prior to the actual performance tracking start and mark calls made in the function itself. This takes an `actionType` and overrides the start time and context of the next call to `start` with a matching `actionType`, and avoids needing to somehow associate a `sessionId` across the feature code and the expected function the AI chat calls. Because it just matches the next `actionType` it won't work if the AI chat doesn't call the expected function type (all mindmap functions are using an `actionType` of `mindmap`, and the feature marks a pending action of `mindmap` or `flowchart`) after clicking the Create Diagram button in the form.\r\n\r\nThe performance events include an opt", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46662, + "title": "[SCQM-1530] Update ai cluster area layout", + "branch": "update/cluster-area-layout-2", + "merged_at": "2026-01-07T20:47:50Z", + "changed_files": 2, + "additions": 82, + "deletions": 53, + "body": "### Summary of Changes and Resources for the Reviewer\r\nCurrently - the state of arrows when clustering by topic is pretty wonky - this is part one of fixing. \r\n\"Screenshot\r\n\r\n\r\nTo fix:\r\n1. I'm blocking arrows from ever getting in a loading state during preview mode so that they can update freely as their connected widgets move around. \r\n2. Reverting the initial area generated from grid -> free form layout\r\n3. Larger change: **As widgets get moved into that initial area, manually handle laying them out to prevent overlapping instead of relying on the grid layout which has some known issues.** \r\n\r\n**Follow up tickets I'm creating:** \r\n1. Taking a deeper look into stacking order of connectors when there are multiple clusters. With these changes, arrows should maintain their connections with widgets, but their stacking order doesn't snap correctly until you move an area. Unsure if this is a change on our end or on the connector stacking-order function. [Ticket](https://mural.atlassian.net/browse/SCQM-1559)\r\n2. In the initial jump of widgets into areas, the connectors pause mid screen / take a moment to catch up - I think it might make sense to just visually hide the connectors while things are bopping around but I'd like to run that past Jackson first. [Ticket](https://mural.atlassian.net/browse/SCQM-1561?atlOrigin=eyJpIjoiZDNjZjczZTAwOGE0NGEzMTkwNTkyMmFkNzI3MzczZmMiLCJwIjoiamlyYS1zbGFjay1pbnQifQ) \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1530) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://cluster-area-layout-2.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering)", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46655, + "title": "[ESC-1875] allow shorter data retention options based on feature flag", + "branch": "add/esc-1875", + "merged_at": "2026-01-07T20:35:04Z", + "changed_files": 5, + "additions": 230, + "deletions": 44, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- allow shorter data retention options based on feature flag.\r\n\r\nhttps://github.com/user-attachments/assets/6d13266b-df17-40f0-8003-bc64b574b3da\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces feature-flagged shorter retention periods and wires them through the data retention UI.\n> \n> - Adds `dataRetentionShorterOptions` flag to `Workspace.Flags` in `packages/api/src/workspaces.ts`\n> - Adds `SHORTER_RETENTION_OPTIONS` (1, 2, 3, 5 days) and `getRetentionOptions(includeShorterOptions)` in `data-retention/common.ts`\n> - Updates `DataRetention` and `EditPolicyModal` to compute `retentionOptions` via `getRetentionOptions` and pass `shorterOptionsEnabled` from `company.flags`\n> - Refactors policy fetch to use computed `retentionOptions` and memoizes with `useCallback`\n> - Expands tests to cover flag on/off and selection of shorter options in `index.test.tsx`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9a91ba6a2bbd708040d4c7c170b40402f7f33b0f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46665, + "title": "[NEXT-385] SDK Apis to packages continues", + "branch": "refactor/sdk-api-type-8", + "merged_at": "2026-01-07T20:13:58Z", + "changed_files": 111, + "additions": 379, + "deletions": 293, + "body": "Test environment:\r\nhttps://sdk-api-type-8.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Modernizes SDK surface by consolidating exports and updating consumers.\n> \n> - Adds `reselect` dependency and re-exports new modules in `@muralco/canvas` (`register/components/action-bar`, `register/types/finder`, `sdk/apis/text`, `sdk/apis/find`, and selector exports for facilitation/participants/capabilities)\n> - Moves text types to `sdk/apis/text` (`TitleFormat`, `SelectionFormat`, `TextContentType`) and removes duplicates from `widgets` APIs/state\n> - Exposes creators/selectors via new indexes: `activity/createActivitySdkApi`, `async/createAsyncApi`, `capabilities/createCapabilitiesApi` and `selectCheckCapability` et al.\n> - Updates app imports to use `@muralco/canvas/register` and `@muralco/canvas/sdk/apis` for actions, selectors, and types (AI actions, action bar, editors, toolbar, facilitation, participants, comments, timer, widgets, etc.)\n> - Refactors find/find-and-replace to use new `FinderSpec` and `FindSdkApi` from `@muralco/canvas`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 14c8750fdf1e26ac820af485ab0c869c59f86666. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46668, + "title": "[NEXT-384] Pt.1 - Move mural insights components and utils inside the mural-insights folder", + "branch": "move/mural-insights-modal", + "merged_at": "2026-01-07T19:54:18Z", + "changed_files": 9, + "additions": 95, + "deletions": 98, + "body": "In order to prepare to package the mural-insights modal, move all components and util functions that are defined outside the mural-insights folder into it.\r\n\r\nThese components and utils were not used in other components.\r\n\r\n\r\nTest-env\r\nhttps://mural-insights-modal.mural.engineering/t/kevinwork6162/m/kevinwork6162/1767760444263/fb3f3b69dc1ce2857cfb64dafef63f30f77c6e33?sender=udcc335478b4adc6467684489", + "labels": [] + }, + { + "number": 46679, + "title": "ContentItems: fix import sorting", + "branch": "refactor/contentitems-sort-imports", + "merged_at": "2026-01-07T19:39:17Z", + "changed_files": 1, + "additions": 9, + "deletions": 9, + "body": "", + "labels": [] + }, + { + "number": 46667, + "title": "[NEXT-383] Move ArchiveMural, DeleteMural, LeaveMural modals to package", + "branch": "move/mural-leave-modal-package", + "merged_at": "2026-01-07T19:27:13Z", + "changed_files": 9, + "additions": 20, + "deletions": 12, + "body": "Move mural modals only used in dashboard to `muralco/dashboard-modals-mural`\r\n\r\ntest-env\r\nhttps://mural-leave-modal-package.mural.engineering/", + "labels": [] + }, + { + "number": 46510, + "title": "[PLAY-750] Show Last activity/outreach for a profile on profile widget data", + "branch": "add/event-data-to-research", + "merged_at": "2026-01-07T19:15:32Z", + "changed_files": 6, + "additions": 342, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWhen we initialize salesforce research, include Salesforce [`Activities` data](https://help.salesforce.com/s/articleView?language=en_US&id=sales.activities.htm&type=5) . \r\n\r\nThis data is actually made of 2 salesforce objects (`Tasks` and `Events`).\r\n\r\n **note that this data won't be used in the research until the prompt is updated**\r\n\r\n\r\nto do before shipping\r\n- Run evals with updates: (new salesforce data, making sure that data goes to the correct section)\r\n- Update the prod prompt \r\n- Update the template so it says `Open Opportunities and Recent Activity`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-750) to understand the context of this effort.\r\n- demo: https://www.loom.com/share/bf486bc2122f44ccb65f6e96bbefd4af\r\n\n\n---\n\n> [!NOTE]\n> Adds Salesforce activity (Events/Tasks) to account research data and supporting platform APIs.\n> \n> - Introduces `SalesforceEvent`/`SalesforceTask` types and getters (`getSalesforceEvent`, `getSalesforceTask`) in `packages/integrations-platform/src/salesforce`\n> - New SOQL resource queries: `getEventsByAccountId` and `getTasksByAccountId` (latest 10 by `CreatedDate`)\n> - Updates `fetchSalesforceAccountResearchData` to parallel-fetch `opportunities`, `events`, and `tasks`; fetch full record details; return an `activity` block (`events`, `tasks`); and gracefully handle partial failures\n> - Expands tests to cover success/partial/empty/error cases for opportunities/events/tasks\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 68e555a76ae98d885138e05009317105c49ff4b9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "bop" + ] + }, + { + "number": 46623, + "title": "[NEXT-377] Move DuplicateMove modal to package", + "branch": "move/duplicate-move-modal-package", + "merged_at": "2026-01-07T19:02:10Z", + "changed_files": 105, + "additions": 451, + "deletions": 266, + "body": "### Main change\r\nMove DuplicateMove Mural modal to package.\r\nNew location: `muralco/modals-common`\r\n\r\n\r\n### Additional changes\r\n* move LockedByMigration modal\r\n* move ConfidentialConfirmation and NoPermission modals \r\n * split `confidential-confirmation` to separate css file\r\n* move tracking helper functions\r\n* move RequestUpgrade modal\r\n* move UpgradePlan modal\r\n* move src/tracking/mural.ts to `muralco/tracking-lib`\r\n* Billing changes\r\n * move `isPlanOfTeamPlusTrialType()` and other billing util functions\r\n * new location: new package `muralco/billing-utils`\r\n \r\n\r\nTest-env\r\nhttps://duplicate-move-modal-package.mural.engineering/", + "labels": [] + }, + { + "number": 46664, + "title": "[SCQM-1385] Fix verbiage for cancelled AI Operations", + "branch": "update/ai-error-notifications-v2", + "merged_at": "2026-01-07T18:13:22Z", + "changed_files": 1, + "additions": 3, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFix verbiage for cancelled AI Operations\r\n\r\nAction Summarize - Cancelled\r\n\"image\"\r\n\r\nRegular Summarize - Cancelled\r\n\"image\"\r\n \r\n> [!NOTE]\r\n> But Sal, the verbiages are different. Yep the verbiages are different and one also has the `try again` button and the other does not.\r\n> That's intentional. You can look at the figma docs here: https://www.figma.com/design/k1MlQ8oyNNyGWup9QElWXJ/Actions-Refactor?node-id=156-64736&m=dev\r\n\r\n\r\nTo test both scenarios you need to enable and disable `feat-mu-ai-action-summarize-enabled`\r\n\"image\"\r\n\r\nTo test both scenarios select stickies then click on `AI Dropdown` -> `Summarize`, then click on the `STOP` button.\r\nIt will show the error notification.\r\n\r\n\r\nJIRA: https://mural.atlassian.net/browse/SCQM-1385\r\nENV: https://ai-error-notifications-v2.mural.engineering/\r\n\r\nRelates to https://github.com/tactivos/murally/pull/46617\r\n\n\n---\n\n> [!NOTE]\n> Aligns cancelled verbiage for AI operations.\n> \n> - Updates `AI_ERROR_MESSAGES['aborted-by-user'].primary` to always render \"... was cancelled.\", using `Generate ` for actions and `upperFirst(displayName)` for non-actions\n> - Refreshes inline documentation and example template in `helpers.ts`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 81f03b5c1e4696c8e5a3246adcdf05e76eba8c68. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46674, + "title": "[SCQM-1508] Add more AI directories to CODEOWNERS", + "branch": "update/scqm-1508-ai-codeowners", + "merged_at": "2026-01-07T18:00:42Z", + "changed_files": 1, + "additions": 15, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nNo code changes. This adds a few extra unowned AI subdirectories to CODEOWNERS and also carves out the AI pieces of the SDK, dispatcher, and state types that have moved into the `packages/canvas` package.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46672, + "title": "[CAN-356] Move AI state into canvas package", + "branch": "fix/next-356-6", + "merged_at": "2026-01-07T17:50:04Z", + "changed_files": 17, + "additions": 160, + "deletions": 159, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves AI state into `@muralco/canvas` package.\r\n\r\nThe environment: https://next-356-6.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Centralizes AI state under `packages/canvas/src/sdk/state/ai/ai.ts` and re-exports via `@muralco/canvas/sdk/state`, removing legacy `src/mural/sdk/state/ai/*`.\n> \n> - Introduces namespaced initializers (e.g., `AIChatState.initial`, `AIClusterState.initial`, `SdkAIState.initial`) and updates all usages in SDK APIs and tests\n> - Moves `AIPerformanceContext/Metrics/Session/State` into canvas state and updates performance tracking API/tests to use `AIPerformanceState.initial`\n> - Updates `getInitialPublicSdkState` to use `SdkAIState.initial`\n> - Simplifies imports across AI APIs, actions-tracker, and helpers to consume state/types from `@muralco/canvas/sdk/state`\n> - Minor import cleanups in `apis/ai/types.ts` to source performance types from the new state entrypoint\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ecbcf7fd7be0a56831d6b42d213a82c113e81943. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46644, + "title": "[SCQM-1532] [SCQM-1533] [SCQM-1549] adjust visual styles for company colors settings", + "branch": "update/company-colors-ui-polish", + "merged_at": "2026-01-07T17:18:59Z", + "changed_files": 8, + "additions": 16, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nColors admin settings page changes:\r\n1. Link type (underline is no longer bold with gap)\r\n2. table font size to 14\r\n3. table buttons to size 'small'\r\n4. notification top margin\r\n5. Removed edit color delete tooltip\r\n6. Removed edit theme delete tooltip \r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\r\nTheme tool changes\r\n1. Removed preview tag\r\n2. Center aligned icon + shuffle hover state\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1532) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1533) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1549) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://company-colors-ui-polish.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. As a company admin, visit `http://localhost:8080/c/internal-sso/settings/colors` Caveat! I'm no", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46580, + "title": "[NEXT-343] package workspace download route", + "branch": "feat/next-343-package-download-route", + "merged_at": "2026-01-07T16:28:18Z", + "changed_files": 55, + "additions": 671, + "deletions": 188, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to #46478. Moves all code for rendering the workspace artifact dowload routes to the `@muralco/download-exports` package:\r\n- Moves final blocking external reference (a plan utility method) to ~`@muralco/parking-lot` where there are similar related utilities (sounds like Engagement team has it in their backlog to migrate eCommerce views/content to packages at some point / there are no existing packages for eCommerce code)~ `@muralco/billing`, a placeholder package for future billing related code\r\n- Abstracts/reorganizes the package contents to better support exporting all routes having to do with downloading\r\n- Migrates some old Rig V1 feature tests around the download mural route to V2 / ~marks old step definitions as migrated and/or~ deletes any unused V1 references.\r\n- Drops the download mural component export from the package as it was previously only exported to support V1 testing\r\n- README updates\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-343) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nMostly moving code around / we should just smoke test that the following three export flows are still working:\r\n- Download a _mural_ export from an email link\r\n- Download a _workspace members_ export from an email link\r\n- Download a _workspace content_ export from an email link\r\n\r\nFor that last one, you will need access to a workspace as an admin user where you can leave the workspace and assign ownership to another workspace user, triggering the email with the export link to that user. I've seeded a workspace in the test env at the link with these credentials:\r\n\r\n```\r\nhttps://next-343-package-download-route.mural.engineering/t/orthanc8051/settings/members\r\nPrimary admin: ganda", + "labels": [] + }, + { + "number": 46642, + "title": "[FEP-6419] - migrate depcheck to knip ", + "branch": "refactor/remove-depcheck", + "merged_at": "2026-01-07T15:53:42Z", + "changed_files": 3, + "additions": 101, + "deletions": 599, + "body": "## Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6419](https://mural.atlassian.net/browse/FEP-6419)\r\n\r\nThis PR removes the `depcheck` dependency because it's no longer maintained. The functionality provided by `depcheck` has been replaced with `knip`, which is actively maintained and offers similar features for checking unused dependencies in the project.\r\n\r\n### Changes Made\r\n- Removed `depcheck` from the project's dependencies.\r\n- Updated the `muralco-depcheck` script to use `knip` instead of `depcheck`.\r\n- Added warning message for unused dependencies found by `knip`.\r\n\r\nThe script will now throw an error if it finds any unlisted dependency or print a warning message if it finds any unused dependency.\r\n\r\n#### Unlisted dependency\r\n\r\nA package imported/required in code but not declared in package.json (dependencies, devDependencies, or peerDependencies). Knip flags these as missing declarations.\r\n\r\nExample: code imports react-select, but react-select isn't in dependencies, devDependencies or peerDependencies in package.json.\r\n\r\n#### Unused dependency\r\n\r\nA package declared in package.json (dependencies, devDependencies, or peerDependencies) but not imported/required anywhere in the codebase. Knip flags these as potentially removable. It's less critical than unlisted dependencies since they don't break functionality, but they can bloat the project and should be cleaned up.\r\n\r\nExample: package.json lists lodash, but no file imports lodash.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit", + "labels": [] + }, + { + "number": 46658, + "title": "[CAN-8296] Refactor `afterDuplicate` hook to return a list of changes", + "branch": "refactor/after-duplicate", + "merged_at": "2026-01-07T15:34:28Z", + "changed_files": 16, + "additions": 186, + "deletions": 178, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR is a continuation of the work in https://github.com/tactivos/murally/pull/46637.\r\n\r\nWhenever we perform a duplication, we dispatch a set of hooks that can potentially alter the result of the operation.\r\nThis makes us lose control over who modifies the widgets model and where, which is something that goes against our intention for the new architecture of changes.\r\n\r\nThe work in the previous PR addressed the hook handler `beforeDuplicate`, whereas this one focuses on the `afterDuplicate` counterpart.\r\n\r\nIn the last PR, following some discussion, we actually modified the code to create a new set of `before` and `after` hooks targeted specifically to duplication by alt+dragging, which actually solved the main issue that was blocking us.\r\nHowever, given that the work was already started there, and that there was only one hook handler (Smart Planner) that needed amending to comply with the new requirement, this PR finishes the work by refactoring the hook to return a list of changes instead of applying them directly.\r\n\r\nNo change in behavior is expected whatsoever.\r\n\r\nTests should assert that duplicating widgets using the Cmd+D shortcut or the context menu option, in general, continues working as expected, and specifically for mindmaps, tables and Smart Planners, it behaves exactly as it did before.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f[**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8296)\r\n- \ud83e\uddea [**Testing environment**](https://after-duplicate.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46509, + "title": "[PLAY-728] - Add/m4s company feature toggle", + "branch": "add/m4s-company-feature-toggle", + "merged_at": "2026-01-07T15:23:49Z", + "changed_files": 9, + "additions": 359, + "deletions": 79, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[BOP is adding a mural for sales feature toggle](https://mural.atlassian.net/browse/PLAY-728) to the company feature toggles, to limit salesforce users to mural for sales only. This PR is need prior to integrations work to place their logic under this flag.\r\n\r\nExpected Behavior: \r\n- if salesforce is already enabled, M4S will default to true\r\n- if salesforce is not enabled M4S will default to false\r\n- Toggling M4S off - after which salesforce will not display on the integrations page as an option\r\n- Salesforce defaults to false when M4S is toggled on, and must be turned on from integrations page\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14957)\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/1ff49c50-e6be-43f2-ae1e-6a1a5a545e91\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces a company-level flag to control \u201cMural for Sales\u201d availability and gates the Salesforce integration behind it.\n> \n> - API: adds `settings.enableMuralForSales?: boolean` to `Company` settings\n> - Hydration: in `with-company.tsx`, auto-sets `settings.enableMuralForSales=true` when Salesforce app is already approved (no unsaved changes)\n> - Integrations UI: filters `clientApps` to hide Salesforce unless `enableMuralForSales===true`; avoids showing request badge if already approved; minor constructor refactor\n> - Internal Tools: replaces legacy toggle with new `Enable Mural for Sales` checkbox in Feature Toggles, preserves original shape when reverting, updates dirty-state and notifications dictionary; passes `originalCompany`; adds focused tests\n> - Tests: new/updated unit tests for feature toggles and internal-tools save behavior\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1ff86369e2249825ee4d01e8b4cd436c4f42ce84. This will update a", + "labels": [] + }, + { + "number": 46656, + "title": "Update CODEOWNERS for agent skills config folders", + "branch": "ownership/agent-skills-config-folders", + "merged_at": "2026-01-07T14:44:00Z", + "changed_files": 1, + "additions": 7, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWithin the last couple weeks, [Agent Skills](https://agentskills.io/what-are-skills) have become a [broadly adopted standard](https://agentskills.io/home#adoption) for packaging agent workflows.\r\n\r\nAgent Skills are powerful because\r\n1. they combine all of the existing customization vectors for agent behavior (e.g. custom prompts/commands, tools, instructions, documentation, scripts) into a single transportable folder, and\r\n2. skills are [_**automatically pulled into context**_ ](https://agentskills.io/specification#progressive-disclosure) when the agent feels it is appropriate.\r\n\r\nThis PR updates CODEOWNERS to add ownership for agent skills and agent configuration folders.\r\n\r\nChanges:\r\n- Renamed \"# Copilot\" section to \"# AI development\" for better clarity\r\n- Added ownership for `**/AGENTS.md`, `skills` directory, and `**/SKILL.md` files\r\n- Added ownership for `.codex` and `.claude` directories\r\n- Reorganized entries for better organization\n\n\n---\n\n> [!NOTE]\n> Expands and reorganizes CODEOWNERS to cover AI/agent assets under the copilot-instructors team.\n> \n> - Renames `# Copilot` section to `# AI development`\n> - Adds ownership for `**/AGENTS.md`, `**/skills/`, and `**/SKILL.md`\n> - Assigns ownership for AI tool/config dirs: `.cursor`, `.codex`, `.claude`\n> - Maintains existing entries for `.github/copilot-instructions.md` and `.github/instructions`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3609951fb03c17ea8111b840ccf8c625237e8cc0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46632, + "title": "[EN-3586] Company settings: respect readonly in the rest of general settings", + "branch": "fix/en-3586", + "merged_at": "2026-01-07T14:24:32Z", + "changed_files": 9, + "additions": 49, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMany of the company general settings were not respecting the readOnly flag. This PR makes changes to ensure that there is no appearance of editability for readonly users.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/", + "labels": [] + }, + { + "number": 46663, + "title": "Continue on failure of knip in CI", + "branch": "unblock-knip-ci", + "merged_at": "2026-01-06T23:26:18Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "Continues on failure of knip so we can still run tests even if knip fails. ", + "labels": [] + }, + { + "number": 46617, + "title": "[SCQM-1385] Update error notification messages for Action Summarize", + "branch": "update/ai-error-notifications", + "merged_at": "2026-01-06T22:38:59Z", + "changed_files": 4, + "additions": 172, + "deletions": 38, + "body": "### Summary of Changes and Resources for the Reviewer\r\nJIRA TICKET: https://mural.atlassian.net/browse/SCQM-1385\r\nENV: https://ai-error-notifications.mural.engineering/\r\n\r\nNotification message changes:\r\n\r\n### Add\r\n- **ACTION_TOO_LARGE** (`too-many-characters`):\r\n - Trigger: Total selected characters >10,000\r\n - User message: \"This selection is too big to summarize at once. Pick a smaller section and try again.\"\r\n\r\n\"image\"\r\n\r\n\r\n### Update\r\n- **TOO_MANY_ITEMS** (`too-many-widgets`):\r\n - Trigger: Selected item count >1000\r\n - Display as tooltip on action button: \"That's a lot of content! Mural AI can't analyze this much text at the same time yet.\"\r\n - Added notification for `too-many-widgets` message from backend\r\n\"image\"\r\n\r\n- **ACTION_USER_CANCELLED**:\r\n - Trigger: User clicked Stop button\r\n - User message: \"Generate summary cancelled.\"\r\n\"image\"\r\n\r\n- **ACTION_MODEL_TIMEOUT**:\r\n - Trigger: Summary took too long\r\n - User message: \"The summary took too long.\"\r\n - Added `Try Again` logic to **summarize action**\r\n\"image\"\r\n\r\n\r\nNotification setup changes:\r\n- Created `AI_ERROR_MESSAGES` to house primary and secondary messages.\r\n- Actions will use `primary + secondary messages` while legacy AI features will only use the `primary message`\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\nJIRA TICKET: https://mural.atlassian.net/browse/SCQM-1385\r\nENV: https://ai-error-notifications.mural.engineering/\r\n\r\n**TESTING STEPS**\r\nMake sure that `feat-mu-ai-action-summarize-enabled` is enabled\r\n\r\n\r\n\r\n##### After\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2334 to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46645, + "title": "ECOMM-82 Fix styling in delete-team-modal feedback", + "branch": "add/delete-modal-fix", + "merged_at": "2026-01-06T21:52:24Z", + "changed_files": 4, + "additions": 465, + "deletions": 35, + "body": "## Summary of Changes and Resources for the Reviewer\r\n\r\nTest Env: https://delete-modal-fix.mural.engineering/\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-82\r\n\r\n\"Screenshot\r\n\r\n### Prior to these changes\r\nThe delete team feedback modal used legacy UI components (`SpinnerButton`, legacy radio buttons, and HTML textarea) with poor spacing between radio buttons and text, making the UI look cramped and unprofessional.\r\n\r\n### Now, with these changes\r\n- **Migrated to UI Toolkit components**: Replaced all legacy components with modern UI Toolkit components (`MrlButton`, `MrlRadioGroup`, `MrlRadioButton`, `MrlTextarea`, `MrlTextHeading`, `MrlText`, `MrlLabel`)\r\n- **Improved spacing and layout**: Added SASS styling file with proper spacing using design system tokens for better visual hierarchy\r\n- **Enhanced type safety**: Fixed event handler types from `FormEvent` to `ChangeEvent` for proper TypeScript typing without casts\r\n- **Comprehensive test coverage**: Added 26 unit tests following Jest testing guidelines, covering all component functionality, interactions, and edge cases\r\n- **Maintained data flow**: All existing API integration and data submission remains unchanged - the component still sends the same data structure to tracking events and API calls\r\n\r\n### Reviewer Resources\r\n- \ud83e\uddea **Testing environment**: [Add your testing environment link here]\r\n- \ud83c\udff7\ufe0f **JIRA ticket**: [Add JIRA ticket link here if applicable]\r\n\r\n## Changes Made\r\n\r\n### Component Migration\r\n- **`feedback.tsx`**: Complete migration to UI Toolkit components\r\n - Replaced `SpinnerButton` \u2192 `MrlButton` with `loading` prop\r\n - Replaced legacy radio buttons \u2192 `MrlRadioGroup` and `MrlRadioButton`\r\n - Replaced HTML textarea \u2192 `MrlTextarea` with `MrlLabel`\r\n - Replaced HTML heading/text \u2192 `MrlTextHeading` and `MrlText`\r\n - Inlined cancellation reasons array ", + "labels": [] + }, + { + "number": 46649, + "title": "[CAN-8138] Add new 'Hand' hint after repeated failed movement attempts", + "branch": "add/can-8138", + "merged_at": "2026-01-06T21:32:45Z", + "changed_files": 13, + "additions": 879, + "deletions": 56, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR implements a new user hint feature that displays a callout on the 'Hand' tool after users make 3 consecutive failed marquee selection attempts within a 10-second window. The feature aims to help users discover the pan navigation mode when they appear to be struggling with movement.\r\n\r\nKey changes include:\r\n\r\nAdded mouse processor to track empty marquee selection attempts and trigger the hint.\r\nExtended onboarding state to support the new empty-selection-hint callout flag.\r\nModified the pan button to conditionally display different callout content based on context.\r\nUpdated keyboard handlers for spacebar behavior in pan mode: We no longer check prev mode, we always toggle between edit and pan. We no longer listen for 'spacebar' in any other mode other than edit or pan since it did not make sense to allow them in neither voting nor view.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8138.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+convent", + "labels": [] + }, + { + "number": 46596, + "title": "Move to Package Tool : Adds support for package to package file moves (and more refactoring)", + "branch": "m2p-package-to-package", + "merged_at": "2026-01-06T20:30:33Z", + "changed_files": 13, + "additions": 2881, + "deletions": 1207, + "body": "## Overview\r\n\r\nThis PR extends the `move-to-package` refactoring tool to support **package-to-package moves** (moving files from `packages/` to `packages/`), in addition to the existing `src/` to `packages/` functionality. It also includes significant improvements to import rewriting accuracy and barrel file cleanup.\r\n\r\n## Key Features\r\n\r\n### \ud83c\udfaf Package-to-Package Moves\r\n- **New capability**: Move files from one package to another (e.g., `packages/shared/src/util.ts` \u2192 `packages/test-mocks/src/util.ts`)\r\n- Automatically detects source package information when moving from `packages/`\r\n- Rewrites package imports (e.g., `@muralco/shared` \u2192 `@muralco/test-mocks`) using symbol-based resolution\r\n- Handles barrel file cleanup in both source and destination packages\r\n\r\n### \ud83d\udd0d Symbol-Based Import Resolution\r\n- **Improved accuracy**: Uses TypeScript's type system to trace symbols through barrel files\r\n- Verifies that imports actually use symbols from the moved file before rewriting\r\n- Handles complex scenarios:\r\n - Direct symbol declarations\r\n - Re-exports through barrel files\r\n - Aliased symbols\r\n - Subpath exports (e.g., `@muralco/canvas/business`)\r\n- Falls back to name matching when symbol resolution fails\r\n\r\n### \ud83e\uddf9 Enhanced Barrel File Cleanup\r\n- **AST-based cleanup**: Uses ts-morph to parse and remove individual export lines\r\n- Removes only the specific exports referencing the moved file\r\n- Falls back to string-based removal if AST parsing fails\r\n- Cleans up both source and destination package barrels when moving between packages\r\n\r\n### \ud83e\uddea Test Organization\r\n- **Split large test file** into focused test suites:\r\n - `move-to-package-barrels.test.ts` - Barrel file operations\r\n - `move-to-package-imports.test.ts` - Import rewriting logic\r\n - `move-to-package-packages.test.ts` - Package name resolution\r\n - `move-to-package-helpers.test.ts` - Helper functions and validation\r\n- **Shared test utilities** in `move-to-package-test-utils.ts` for consistency\r\n- Comprehensive te", + "labels": [] + }, + { + "number": 46637, + "title": "[CAN-8295] Refactor `beforeDuplicate` hook to return a list of changes", + "branch": "refactor/before-duplicate", + "merged_at": "2026-01-06T19:54:50Z", + "changed_files": 18, + "additions": 134, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the hook `duplicate.beforeDuplicate`, called whenever we're about to perform a duplication of widgets, to return a list of widget changes instead of a void response.\r\nIt also wraps the call within the hooks scope, which prevents any calls to `apply`, `update` or `commit` to be done within a registered handler.\r\n\r\nThis hook is defined as an async operation given that it can potentially show a modal for confirmation, therefore the proper return type has been refactored to `Promise`.\r\n\r\nHowever, there's currently no handler registered that is actually doing any widget modification, so the change should be innocuous.\r\n\r\nThe motivation behind the change is to have better control of how widget modifications are being applied.\r\n\r\n**UPDATE:** Following a comment in the PR, I also added a new set of hook on the `drag` namespace to have a clearer separation of responsabilities, therefore in this PR we also implement the new hook handlers `drag.beforeDuplicate` and `drag.afterDuplicate`\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8295)\r\n- \ud83e\uddea [**testing environment**](https://before-duplicate.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46652, + "title": "[CWI-2298] Move export icon back into the chrome", + "branch": "update/cwi-2298", + "merged_at": "2026-01-06T19:44:23Z", + "changed_files": 2, + "additions": 6, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMove export icon back into the chrome\r\n\r\n\"Screenshot\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2298", + "labels": [] + }, + { + "number": 46603, + "title": "[PLAY-797] Move presentation mode codeowners to BOP", + "branch": "update/bop-codeowners", + "merged_at": "2026-01-06T18:41:08Z", + "changed_files": 1, + "additions": 6, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMove presentation mode codeowners to BOP\r\n\r\nThe presentation mode code currently is marked as being owned by the Sales Tiger Team. Since this team no longer exists and has become part of Blue Ocean Pioneers, we need to move the codeowners to BOP. \r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Updates `CODEOWNERS` to reflect current team ownership.\n> \n> - Reassigns `src/mural/sdk/apis/facilitation/presentation-mode/`, `src/mural/addons/core/presentation-mode/`, and `src/mural/addons/core/canvas-presentation-experiment/` to `@tactivos/bop`\n> - Adds/normalizes `src/mural/addons/research-mural/` under `@tactivos/bop`\n> - Removes obsolete `Sales Tiger Team` ownership entries\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit fb4af344d6356a55e1ca4c2e0d148e8b3a70e44b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46462, + "title": "[CPT-2472] Update Template Preview Routing Component", + "branch": "add/template-preview-routing", + "merged_at": "2026-01-06T18:05:32Z", + "changed_files": 7, + "additions": 396, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n[CPT-2472](https://mural.atlassian.net/browse/CPT-2472)\r\n\r\n\r\nFor phase 1 we have decided to support the follow scenario:\r\n\r\n- If you are a signed in user you will see the current template preview screen for a given template preview.\r\n- If you are not a signed in user (anonymous/visitor) you will see the new public template preview screen.\r\n\r\nUpdated in this PR:\r\n1. added feature flag\r\nCurrently, there is no reference code for getAnonymousFeatureFlag.\r\nI have added a test for it, and here is a reference PR that shows how it was used in the past: https://github.com/tactivos/murally/pull/43770\r\n2. added new route and components for template-preview\r\n3. updated getStaredFromTemplate to redirect anonymous and visitor users when ff is on \r\n4. added unit tests\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**CPT-2472**](https://mural.atlassian.net/browse/CPT-2472) to understand the context of this effort.\r\n- \ud83e\uddea Please use this testing env:https://template-preview-routing.mural.engineering\r\n## HOW TO TEST THIS IN TESTING-ENV?\r\n- If you are a signed in user you will see the current template preview screen for a given template preview.\r\n - Test this by: Log in to the test-env: https://template-preview-routing.mural.engineering/template/0096a656-d770-468d-8343-f6a9143d2ede/9d525886-4bc9-446f-82b3-486b55bf5c59\r\n- If you are not a signed in user (anonymous/visitor) you will see the new public template preview screen.\r\n - Test this by:make sure you are logged out or try this link in incognito/private mode: https://template-preview-routing.mural.engineering/template/0096a656-d770-468d-8343-f6a9143d2ede/9d525886-4bc9-446f-82b3-486b55bf5c59\r\n- Turn off the feature flag and make sure it also works as expected (current beta/app.mural.co behavior) as well. \r\n\r\n### Required Checklist for Author\r\n- [X] Unit tes", + "labels": [] + }, + { + "number": 46533, + "title": "[CWI-2484] Integrations Platform - Update connection settings form", + "branch": "add/cwi-2484", + "merged_at": "2026-01-06T14:27:44Z", + "changed_files": 31, + "additions": 954, + "deletions": 60, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Update connection settings form\r\n\r\n[Screencast from 12-16-2025 11:55:19 AM.webm](https://github.com/user-attachments/assets/a8539012-1291-4a22-a83a-5ea58d086ef7)\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2484\r\n", + "labels": [] + }, + { + "number": 46591, + "title": "[SCQM-1540] Remove last support for non-streaming mode", + "branch": "remove/non-streaming-ai-code-3", + "merged_at": "2026-01-06T14:15:25Z", + "changed_files": 5, + "additions": 0, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPart 3 of 4\r\n\r\nPrior to these changes the AI features branched on the `enable-ai-translate-streaming` flag and retained non-streaming preview/apply paths.\r\n\r\nNow, with these changes the value `enableToolStreaming` and the flag `feat-mu-enable-ai-translate-streaming` are completely removed and the dispatcher doesn't consider non-streaming mode any longer.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1540) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://non-streaming-ai-code-3.mural.engineering) to perform a smoke test.\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes:\r\n1. All features should still work - a quick spot check should do it\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15103)\r\n\n\n---\n\n> [!NOTE]\n> Removes the final branching for non\u2011streaming AI paths and fully commits to streaming tool/function calls.\n> \n> - Drops `enableToolStreaming` from `AIChatOptions` and stops passing it in the dispatcher\n> - Deletes `ENABLE_AI_TRANSLATE_STREAMING` feature flag and its Dev Flags entry\n> - Simplifies streaming handling: `operation.ts` no longer gates function streaming on options; function call streams are always processed\n> - Keeps other AI feature flags and behavior intact\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 896d676f9099e65d18c87e33e81acd65ab74081a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46638, + "title": "Use `moment` for calculating dates", + "branch": "update/tests-use-moment-dates", + "merged_at": "2026-01-05T23:14:50Z", + "changed_files": 1, + "additions": 9, + "deletions": 8, + "body": "Updated expiration time handling in tests to use moment.js for future dates.\r\n\r\n", + "labels": [] + }, + { + "number": 46641, + "title": "[CWI-2518] Add Hide/Show Caption for PhotoWidgets", + "branch": "fix/cwi-2518", + "merged_at": "2026-01-05T21:01:03Z", + "changed_files": 5, + "additions": 31, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the actions to show/hide captions on Photo Widget and that action is used for Giphy & Unsplash Image handler.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2518) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Adds caption visibility controls to PhotoWidgets and applies them to images imported from Unified Images.\n> \n> - Introduces `photo` actions `showCaption` and `hideCaption`; exports them via `actions/catalog.", + "labels": [] + }, + { + "number": 46640, + "title": "[CAN-8304] Unselect the widget when a reaction is added", + "branch": "update/can-8304", + "merged_at": "2026-01-05T20:39:36Z", + "changed_files": 3, + "additions": 118, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n Prior to these changes when the user clicked on a reaction nothing happens\r\n Now, with these changes, the widget is unselected and the reaction is shown\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8304) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8304.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between t", + "labels": [] + }, + { + "number": 46631, + "title": "[NEXT-356] Move mural/sdk/state into packages", + "branch": "fix/next-356-5", + "merged_at": "2026-01-05T20:24:15Z", + "changed_files": 22, + "additions": 97, + "deletions": 86, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages state:\r\n* downloads\r\n* engine-bridge\r\n* experiments\r\n\r\nThe environment: https://next-356-5.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Consolidates state slices under packages for consistency and reuse.\n> \n> - Adds `DownloadsState`, `ExperimentsState`, and `EngineState`/`InternalEngineBridgeState` under `packages/canvas/src/sdk/state` with `initial` values and re-exports via `state/index.ts`\n> - Updates SDK APIs and UI to consume new state locations (e.g., toolbar, downloads SDK API, engine-bridge API) and to use `DownloadsState.initial` instead of local constants\n> - Wires new initial state into `src/mural/sdk/state` and internal state (`InternalEngineBridgeState.initial`) and removes legacy local state modules\n> - Adjusts imports/exports and engine-bridge types pathing to reference the new centralized state\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0838de259fc3f38b4e98c087777479eaa45875f3. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46585, + "title": "[CWI-2514] Fix - Integrations Platform - Cannot Re-select Original Value After Change", + "branch": "fix/cwi-2514", + "merged_at": "2026-01-05T19:41:30Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - Integrations Platform - Cannot Re-select Original Value After Change\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2514", + "labels": [] + }, + { + "number": 46625, + "title": "[NEXT-379] Migrate more sdk api types", + "branch": "refactor/sdk-api-type-7", + "merged_at": "2026-01-05T19:29:39Z", + "changed_files": 177, + "additions": 610, + "deletions": 438, + "body": "Test environment: https://sdk-api-type-7.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Unifies SDK types under shared canvas exports and cleans up local duplicates; no functional changes expected.\n> \n> - Adds `packages/canvas/register/types/ai` and re-exports via `register/types/index`\n> - Introduces/expands SDK export surfaces: `sdk/apis/ai`, `content-extension`, `menus` (with `types`), `mural/types`, and updates `sdk/apis/index`\n> - Adds state export surfaces for `ai`, `content-extension`, `menus`, `onboarding`, and corresponding selectors/index files\n> - Updates numerous files to import from `@muralco/canvas/sdk/apis` and `@muralco/canvas/sdk/state` instead of local paths; removes duplicate `src/mural/sdk/apis/mural/types`\n> - Minor path fixes (e.g., `ProperMuralMode` import), and test refactors to new types\n> - No behavioral logic changes; primarily type/interface moves and re-exports\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cee48557722b3fa1c9a883a0b2ace50306af9a5b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46634, + "title": "[CWI-2511] Refine All Tab", + "branch": "update/cwi-2511", + "merged_at": "2026-01-05T19:17:01Z", + "changed_files": 2, + "additions": 1, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Remove empty state\r\n- Adjust styles so gifs and images display better on all tab\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2511 to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46338, + "title": "[CWI-2446] Integrations Platform - Add connection management in front-end", + "branch": "add/cwi-2446", + "merged_at": "2026-01-05T19:05:38Z", + "changed_files": 59, + "additions": 1325, + "deletions": 303, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Add connection management in front-end\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2446", + "labels": [] + }, + { + "number": 46588, + "title": "[NEXT-368] Migrate src/mural/models to @muralco/canvas/models", + "branch": "mural-models-1", + "merged_at": "2026-01-05T18:34:28Z", + "changed_files": 69, + "additions": 507, + "deletions": 344, + "body": "## Overview\r\n\r\nMigrates mural models from `src/mural/models/` to `packages/canvas/src/models/amp/` and modernizes exports to use named exports instead of default exports.\r\n\r\n## Changes\r\n\r\n### Model Migration\r\n- **Moved** all model files from `src/mural/models/` \u2192 `packages/canvas/src/models/amp/`\r\n- **Converted** all default exports to named exports (e.g., `export default Model` \u2192 `export const ModelName`)\r\n- **Updated** all imports throughout the codebase to use new locations and named exports\r\n\r\n### Helper Functions\r\n- **Moved** model helper functions from `src/amp/helpers.ts` to `packages/canvas/src/amp-core/utils/`\r\n- **Exported** helpers through `packages/canvas/src/amp-core/utils/index.ts`\r\n\r\n### New Files\r\n- Renamed and moved `getToken` from `src/amp/helpers` to `getMuralToken` in `packages/canvas/src/models/amp/get-mural-token.ts`\n\n\n---\n\n> [!NOTE]\n> Major refactor to centralize legacy mural models and helpers under `@muralco/canvas` with named exports and updated imports across the app.\n> \n> - Move all models to `packages/canvas/src/models/amp/*` with named exports (e.g., `MuralModel`, `TemplateModel`, `WidgetModel`, widget-specific models, `MuralMember*`, `ScrollerModel`); aggregate via `models/amp/index.ts`\n> - Extract legacy helpers from `src/amp/helpers.ts` into `packages/canvas/src/amp-core/utils/*` (`initializeWidgetModel`, `initializeMuralModel`, `patchAmpWidget`, `onUpdateWidgetRequest`, `canRequestWidgetUpdate`, `getWidgetCluster`, `fillDefaultValues`), and trim legacy file to resync/recover logic only\n> - Introduce `getMuralToken` (`models/amp/get-mural-token.ts`) and `FullscreenManagerModel`; update consumers (`use-fullscreen`, `sdk-context`, routes)\n> - Update routing/middleware/tests and business code to use new model paths and names (`MuralModel`, `TemplateModel`, `WidgetCollectionModel`, etc.), and to import content API utilities from `@muralco/canvas/models`\n> - Add `ampersand-collection` dependency and ambient types;", + "labels": [] + }, + { + "number": 46626, + "title": "[CWI-2516] Add emoji tab specific tracking events", + "branch": "add/cwi-2516-emoji-track", + "merged_at": "2026-01-05T18:04:26Z", + "changed_files": 4, + "additions": 88, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add emoji tab specific tracking events\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2516 to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Introduces emoji-specific analytics and wires them through the unified images panel UI.\n> \n> - Adds `EMOJI_SKIN_TONE_CHANGE` and `EMOJI_TAB_SECTION_TOGGLE` to `tracking-lib` types and exported union\n> - Records skin tone changes and category section toggles with `tabSessionId`\n> - Adds `trackingMetadata` to emoj", + "labels": [] + }, + { + "number": 46627, + "title": "[NEXT-380] Include test files in move-to-package tool and handle index files", + "branch": "add/tests-to-mtp", + "merged_at": "2026-01-05T16:45:44Z", + "changed_files": 3, + "additions": 261, + "deletions": 2, + "body": "\n> [!NOTE]\n> **Scope**: Improves `move-to-package` import rewriting coverage and correctness.\n> \n> - Adds test file globs to the `Project` (`**/*.test.ts[x]`, `src/test/**/*.ts[x]`) so imports in tests are also rewritten.\n> - Enhances import matching to also match directory imports for `index.*` files and to match paths with/without extensions.\n> - Updates `shouldRewriteImport`/path handling via new `directoryPath` in `OriginalPaths` and applies rewrites accordingly.\n> - Expands test suite to cover test-file inclusion, relative and directory import rewrites (including non-index exclusion).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit aefc831fa1c7241fdabde42c466fc94c99d99c11. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46624, + "title": "[NEXT-378] Migrate more sdk api types", + "branch": "refactor/sdk-api-type-6", + "merged_at": "2025-12-23T21:54:07Z", + "changed_files": 51, + "additions": 110, + "deletions": 95, + "body": "Test environment: https://sdk-api-type-6.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Consolidates SDK API/state types under the canvas package and aligns consumers to new exports.\n> \n> - Adds `engine-bridge` and `integrations` exports to `@muralco/canvas/sdk/apis`; introduces `EngineBridgeSdkApi`/`EngineBridgeConnectFn` and `IntegrationsSdkApi`\n> - Adds `engine-bridge` and `integrations` state exports to `@muralco/canvas/sdk/state` (e.g., `EngineState`, `IntegrationsState`, `RemoteText`), and re-exports in `state/index.ts`\n> - Exposes widget APIs/types from canvas: `FileSdkApi`, `TableSdkApi`, `TableAffordanceData`, `CollaborativeSize`, `EditingWidget`, `TextContentType`\n> - Removes local `EngineState` definition; app code now imports `EngineState`/`EditingWidget`/`RemoteText` from canvas\n> - Updates app/business/tests to new import paths across Jira addon, table affordances, table sizing, widgets selectors/APIs, and engine-bridge implementation/selectors\n> - Linter layering updated to allow `@muralco/canvas/sdk/state` in SDK types\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 426de19714ddb4f139e5b34a8f1deb28e635afde. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46622, + "title": "[NEXT-370] Move more sdk api types to canvas package", + "branch": "refactor/sdk-api-type-5", + "merged_at": "2025-12-23T21:16:25Z", + "changed_files": 81, + "additions": 147, + "deletions": 183, + "body": "Test environment: https://sdk-api-type-5.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Shifts SDK surface to the canvas package and standardizes realtime typings.\n> \n> - Adds and exports `clipboard`, `conference`, `remote`, and `native/bridge` SDK API types in `@muralco/canvas`; introduces `TextContentType` under `widgets/types` and re-exports it\n> - Replaces internal `socket/connectivity/types` with direct imports from `@muralco/realtime`; deletes `src/mural/sdk/apis/socket/connectivity/types.ts`\n> - Updates codebase (add-ons, dispatcher, business, tests) to import `TextContentType`, `RemoteSendApi`, and realtime events (`TypingEvent`, `RemoteMessage`, etc.) from the new locations\n> - Adjusts linter layer rules to allow `@muralco/realtime` and extends canvas API exports; adds `@muralco/native-bridge` dep to canvas package\n> \n> Scope/risk: Broad import refactor and type re-exports; minimal runtime logic changes expected.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 65f5e89676dd484a9d20c48d3351d69403baf487. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46524, + "title": "[ENGAGE-1429] Remove isFirstPassword and create parameter. Use isRegistration", + "branch": "fix/engage-1429", + "merged_at": "2025-12-23T21:04:07Z", + "changed_files": 7, + "additions": 63, + "deletions": 40, + "body": "## Pull request overview\r\n\r\nThis PR refactors the password creation flow by removing the client-side `isFirstPassword` query parameter and replacing it with server-provided `isRegistration` state from the API. The change centralizes the logic for determining whether a user is in a registration or password reset flow to the backend, improving reliability and reducing potential inconsistencies.\r\n\r\nKey changes:\r\n- Removed `isFirstPassword` query parameter from all navigation flows (email verification, signup, email code verification)\r\n- Updated `checkPasswordUpdateHash` API to return `isRegistration` boolean from the server\r\n- Refactored `CreatePassword` component to use server-provided `isRegistration` state instead of client-side parameter\r\n- Updated function signatures throughout to use `isRegistration` instead of `isFirstPassword` or `shouldCreateFirstPassword`\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| packages/route-verify-email/src/verifyEmail.ts | Removed `isFirstPassword: 'true'` from query parameters when redirecting to create-password |\r\n| packages/route-signup/src/helpers/registration.ts | Removed `isFirstPassword=true` search parameter from signup flow navigation |\r\n| packages/route-create-password/src/helpers.ts | Renamed parameters from `isFirstPassword` to `isRegistration`, updated return type of hash checking function to include `isRegistration` boolean |\r\n| packages/route-create-password/src/CreatePassword.tsx | Replaced client-side `isFirstPassword` query parameter with server-provided `isRegistration` state, added logic to handle both hash-based and frictionless signup flows |\r\n| packages/route-check-email-code/src/CheckEmailCodeVerification.tsx | Removed `isFirstPassword: 'true'` from query parameters when redirecting to create-password |\r\n| packages/route-check-email-", + "labels": [] + }, + { + "number": 46584, + "title": "NEXT-348 - Remove unused /verify-token route", + "branch": "add/next-348", + "merged_at": "2025-12-23T20:43:32Z", + "changed_files": 4, + "additions": 0, + "deletions": 96, + "body": "### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15101)\r\n\r\n### Test env\r\n- https://next-348.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR removes the unused `/verify-token` route and its implementation as part of cleanup work. The route handled token verification and redirection logic for authentication flows, including mobile app integration, but is no longer in use.\r\n\r\n**Key changes:**\r\n- Deleted the entire `verify-token.ts` file containing the route handler implementation\r\n- Removed the route registration from the registration routes configuration\r\n- Cleaned up the import statement for the `verifyToken` function\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated no comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/registration/routes/verify-token.ts` | Deleted the entire file containing the verify-token route handler and its authentication/redirection logic |\r\n| `src/registration/routes/index.tsx` | Removed the route registration for `/verify-token` and cleaned up the corresponding import |", + "labels": [] + }, + { + "number": 46620, + "title": "ENGAGE-1419 - Write tests for /about-you", + "branch": "add/engage-1419-2", + "merged_at": "2025-12-23T19:10:15Z", + "changed_files": 5, + "additions": 1038, + "deletions": 1, + "body": "## Pull request overview\r\n\r\nThis PR adds comprehensive test coverage for the `/about-you` onboarding route, introducing unit tests for three main areas: helper functions, UI components, and the main AboutYou component. The tests follow Jest and React Testing Library patterns and add necessary testing dependencies to the package.\r\n\r\nKey changes:\r\n- Added 396 lines of tests for onboarding helper functions covering room selection, mural creation, template handling, and error scenarios\r\n- Added 219 lines of tests for the BackSkipFooter component covering rendering, interactions, and accessibility\r\n- Added 482 lines of tests for the AboutYou component covering initialization, navigation, completion flow, and error handling\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 4 out of 5 changed files in this pull request and generated 6 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| packages/route-about-you/src/helpers.test.ts | Comprehensive unit tests for `handleEndOfOnboardingAndRedirectUser` function, covering basic flow, room selection, mural creation, template link handling, and error scenarios |\r\n| packages/route-about-you/src/components/back-skip-footer/index.test.tsx | Unit tests for BackSkipFooter component covering conditional rendering, user interactions, button styling, and accessibility |\r\n| packages/route-about-you/src/AboutYou.test.tsx | Integration tests for AboutYou component covering rendering, initialization, question navigation, skip functionality, completion flow, error handling, and accessibility |\r\n| packages/route-about-you/package.json | Added testing dependencies: `@muralco/test-mocks`, `@testing-library/jest-dom`, and `@testing-library/user-event` |\r\n| package-lock.json | Lockfile update reflecting the new testing dependencies added to route-about-you package |\r\n
\r\n\r\n\r\n\r\n---\r\n\r\n> [!NOTE]\r\n> Adds broad test coverage for the `/about-you` onboarding rou", + "labels": [] + }, + { + "number": 46607, + "title": "[CAN-8279] Fix remove reaction to trigger on click instead of mouse down", + "branch": "fix/can-8279", + "merged_at": "2025-12-23T18:58:23Z", + "changed_files": 6, + "additions": 375, + "deletions": 15, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Before these changes, reactions were removed on mouse down. \r\n After the update, a full click interaction is required to remove a reaction.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8279) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8279.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the ", + "labels": [] + }, + { + "number": 46610, + "title": "Refactor moving integrations user settings to package", + "branch": "refactor/integrations-user-settings", + "merged_at": "2025-12-23T18:46:47Z", + "changed_files": 114, + "additions": 166, + "deletions": 311, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors integrations user settings functionality by moving it from `src/settings/user/integrations` to the `@muralco/integrations` package. \r\n\r\n**Key changes:**\r\n- Moved user settings components and logic to `packages/integrations/src/user-settings/`\r\n- Refactored logic to be part of the `shared-components` (because is used outside the package) and better `/lib/{integration}` structured logic. \r\n- Consolidated company settings integration code into `packages/integrations/src/company-settings/`\r\n- Refactor package interfaces to reduce unnecesary exports.\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-359\r\n- Test env: https://integrations-user-settings.mural.engineering/\r\n\r\n### How To test?\r\nIt's a pure refactor PR so smoke testing `/me/integrations` it's good enough.\n\n\n---\n\n> [!NOTE]\n> Modernizes the integrations UI by consolidating user/company settings and shared logic into the `@muralco/integrations` package.\n> \n> - Introduces shared components (`InMuralIntegrationHost` + RPC server/tests, `InMuralIntegrationModal`, Jira legacy settings/error modal, help, `DottedContainer`) and centralizes OAuth window opts in `constants`\n> - Refactors user settings: explore/connected/manage cards and controllers (GitHub, Slack, Adobe, Jira legacy) now live under `packages/integrations/src/user-settings/`; exposes `IntegrationsUserSettings` plus limited test-only exports\n> - Adds company settings screens (integrations list, terms, app request) and an admin-config instance modal for managed apps\n> - Creates Slack and Adobe helpers (`connectToSlack`, `withAdobeAuth`) and re-exports lib modules; updates tracking/analytics wiring\n> - Replaces app-level imports to consume from `@muralco/integrations` (views, addons, tests); removes legacy duplicates and obsolete styles\n> - Updates package deps/peerDeps (icons, permissions, mural-utils, react-select) and adds README; reorgani", + "labels": [] + }, + { + "number": 46621, + "title": "[CAN-8220] Fix undo/redo behavior when applying widget distribution", + "branch": "fix/distribution-undo", + "merged_at": "2025-12-23T18:09:52Z", + "changed_files": 7, + "additions": 124, + "deletions": 43, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes undo/redo behavior for widget distribution operations by joining all the changes into one single transaction that can be undone or redone by a single command instead of having to do one movement at a time.\r\n\r\nThis also fixes the selection of the widgets after the undo/redo operation: when doing any sort of distribution, if one of the widgets ended up in the same original place it was before, undoing the operation would not select it back because it was never patched in the first place.\r\nIn this PR we amend the situation by creating an explicit selection step for those widgets.\r\n\r\n_PR:_\r\n![Dec-23-2025 14-26-59](https://github.com/user-attachments/assets/e643dc83-6dbd-48d6-81e3-fbe8305ee193)\r\n\r\n_Master:_\r\n![Dec-23-2025 14-27-23](https://github.com/user-attachments/assets/d11d5ef9-05c6-4d6a-94fe-74ffaf9cca92)\r\n\r\n---\r\n**Note regarding review:** You'll see through the different commits how I move the code that creates the `SelectWidgetStep` up a level, and in each commit the SoT for the original and patched widget differs.\r\nThis is a conscious change, on each level we have different places where we get the unmodified widget and the modified one. I'm adding comments with explanations throughout the PR to make it clear.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8220)\r\n- \ud83e\uddea [**Testing environment**](https://distribution-undo.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46614, + "title": "[NEXT-163] Move RoomView to package", + "branch": "move/roomview-package2", + "merged_at": "2025-12-23T17:58:47Z", + "changed_files": 7, + "additions": 19, + "deletions": 28, + "body": "Move RoomView to muralco/dashboard-room-page package.\r\n\r\nThen remove package exports that are only used by RoomView\r\n\r\n\r\ntest-env\r\nhttps://roomview-package2.mural.engineering/", + "labels": [] + }, + { + "number": 46594, + "title": "Refactor apps user setting to apps package", + "branch": "add/apps-pkg-settings", + "merged_at": "2025-12-23T17:32:24Z", + "changed_files": 51, + "additions": 304, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactor the apps user settings feature from `src/settings/user/developers` into a new shared package `@muralco/apps`. \r\n\r\n**Key changes:**\r\n- Creates new `@muralco/apps` package with all app-related user settings components\r\n- Extracts navigation helper `changeUserSettingTabs` to `@muralco/settings-commons` for shared use\r\n- Updates imports throughout the codebase to use the new package\r\n- Consolidates tracking functions for app registration flows\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-359\r\n- Test envs: https://apps-pkg-settings.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Creates a new shared package `@muralco/apps` for Apps user settings (components, helpers, tracking, styles, tests) and updates consumers to import `Developers` and tracking from it.\n> \n> - Adds `@muralco/apps` package (exports `Developers`, `recordAppRegistrationMenuItemClick`; includes form sections, modals, tables, validation, styles, feature tests)\n> - Extracts `changeUserSettingTabs` to `@muralco/settings-commons` and replaces direct `push`/`PREFIX` navigation in settings and Apps flows\n> - Updates app to consume new package: imports switched in `src/settings/user/view.tsx`, `src/common/user/util.ts`, test pages; adjusts route building (e.g., `navigateToMyApps`)\n> - Adds CODEOWNERS for `packages/apps`; updates root `package.json`/lock and settings-commons deps\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6438b19a2be83ab7665e3dece96f9b229d03848b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46598, + "title": "[NEXT-374] Move ModalWrapper package", + "branch": "move/modalwrapper-package", + "merged_at": "2025-12-23T15:38:26Z", + "changed_files": 10, + "additions": 24, + "deletions": 28, + "body": "\r\ntest-env\r\nhttps://modalwrapper-package.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> **Move `ModalWrapper` to shared package and update references**\n> \n> - Adds `ModalWrapper` (via `react-portal`) to `packages/modals-common` and re-exports from package index\n> - Replaces local imports with `@muralco/modals-common` in dashboard room modals, team settings modals, and dashboard modals\n> - Removes old local `ModalWrapper` component and `style.sass` (previous `dashboard-modals-fix` styling)\n> - Consolidates `ShareRoomModal` and `ModalWrapper` imports from `@muralco/modals-common`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0a36c86f5ecad9e659233c354b818d86eaa76f88. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46586, + "title": "[CAN-8232] Change tags color picker to a MrlPopover", + "branch": "add/can-8232", + "merged_at": "2025-12-23T15:14:36Z", + "changed_files": 10, + "additions": 164, + "deletions": 177, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe Tags color picker is also being used for kanban boards but differently. \r\nThe kanban board is using register.popover.content which adds a manual popover to the color picker and the tags menu is needing to render it's own popover. So I've separated the two a bit.\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8232)\r\n[Test Env](https://can-8232.mural.engineering)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+p", + "labels": [] + }, + { + "number": 46608, + "title": "[CAN-7819] Refactor widget distribution code to use the Widget Changes API - Part II", + "branch": "refactor/widget-distribution-ii", + "merged_at": "2025-12-23T15:02:54Z", + "changed_files": 4, + "additions": 53, + "deletions": 93, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the widget distribution logic to properly use the `Widget Changes API`.\r\nThis is a continuation of the work started in [this PR](https://github.com/tactivos/murally/pull/46564).\r\n\r\nThe current logic (for any kind of distribution chosen) operates in the following way:\r\n- First, we generate a children - parent map of the affected widgets\r\n- We then proceed to orphan every widget\r\n- Then, we generate the changes for the chosen distribution\r\n- We apply those generated changes\r\n- Finally, we re-parent every widget with the following condition:\r\n - If the top-left most widget was initially in a table cell and the table had auto-resize enabled, every widget should fall inside that cell which should expand to fit\r\n - Otherwise, each widget should fall wherever it corresponds according to our absorption rules\r\n\r\nThe way this was currently operating was with a mixed of manual updates and changes applied that ran systems.\r\n\r\nIn order to have a better expected behavior and a full adaptation to our current architecture, we need to make it so they only apply changes through the `Widget Changes API`.\r\n\r\nIn this second part we modify the core logic to gather all the changes first and do as few calls to `apply` as possible, and only one call to `commit`, with no `update` anywhere.\r\n\r\n**No change in behavior is expected in this PR**. Widget distribution should continue working exactly as it did before this PR.\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7819)\r\n- \ud83e\uddea [**Testing environment**](https://widget-distribution-ii.mural.engineering)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Modernizes widget distribution to use batched `Widget Changes API` calls and simplifies re-parenting logic.\n> \n> - Batches actions with `ActionBuilder`: orphan widgets, perform `align/arrange/distribute`, then single `apply` + final `commit` in `widget-distribution/index.ts`\n> - Rep", + "labels": [] + }, + { + "number": 46612, + "title": "Stable fix/support large font scaling", + "branch": "stable-fix/support-large-font-scaling", + "merged_at": "2025-12-23T13:46:02Z", + "changed_files": 6, + "additions": 238, + "deletions": 46, + "body": "# What was changed and why? \ud83e\udd14 \r\n\r\nReference stable-fix PR: https://github.com/tactivos/murally/pull/46604#issue-3754308969\r\nSlack convo: https://mural.slack.com/archives/C02DGJRD397/p1765985240878229\r\n\r\nPlease note \u261d\ufe0f there are comments in another PR link within the aforementioned PR - please glance at everything to understand context.\r\n\r\nTL;DR\r\n\r\n- lower the smallest size from 8 to 4\r\n- increase the largest size to 5000 (10000 is maybe overkill)\r\n- use minor third scaling, statically defined as recommended\r\n- place changes behind feature flag\r\n\r\n# Testing \ud83e\udd16 \r\n\r\nUnit tests added.\r\nTesting env: spinning up...\r\nFeature flag to toggle: `FEATURES.ENABLE_MURAL_SCALE_FIXES: 'enable-mural-scale-fixes'`\r\n\n\n---\n\n> [!NOTE]\n> Implements SDK-driven font scaling behind a feature flag and updates all font-size operations accordingly.\n> \n> - **Feature-flagged steps**: New `getSteps(sdk)` in `text/font-resize/steps.ts`; defaults to `DEFAULT_STEPS`, switches to `MINOR_THIRD_SCALED_STEPS` when `FEATURES.ENABLE_MURAL_SCALE_FIXES` is enabled\n> - **API changes**: `fontSizeStep`, `minLinesStep`, `isMaxFontSize`, `isMinFontSize` now require `sdk` (features) and use dynamic `steps`\n> - **Call site updates**: Replace usages to pass `sdk` across widgets dispatcher, toolbar `canIncrease/DecreaseFontSize`, table cell setters, arrow label formatters, and AI suggest-title flow\n> - **Imports**: Fix `getCellFormat` import path\n> - **Tests**: Add `steps.test.ts` to validate feature flag behavior and step arrays\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0b843b3e243edc766ac20b7b7781ffa8ba13d5b3. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46601, + "title": "RoomPage: Delete unused sass import", + "branch": "delete/unused-sass-import", + "merged_at": "2025-12-23T06:03:13Z", + "changed_files": 1, + "additions": 0, + "deletions": 2, + "body": "Removing import of css classes that are not used in RoomView\r\n\r\nRoomView does not render anything with className=\".dashboard-rows\", so this sass does not need to be imported in RoomView", + "labels": [] + }, + { + "number": 46615, + "title": "Patch incorrect reference to invitee model", + "branch": "fix-invitee-reference", + "merged_at": "2025-12-23T00:56:51Z", + "changed_files": 2, + "additions": 11, + "deletions": 2, + "body": "Patches the Room Invitee to point to correct model", + "labels": [] + }, + { + "number": 46428, + "title": "[NEXT-340] migrates `src/models` to @muralco/canvas/amp-models`", + "branch": "update/migrate-src-models", + "merged_at": "2025-12-22T23:31:35Z", + "changed_files": 55, + "additions": 417, + "deletions": 293, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMigrates the `src/models` directory into the `canvas/amp-models`\r\n- updates import paths and dependencies\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-340) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Moves legacy `src/models` into new `@muralco/canvas/amp-models` package, updates app imports/usages, and centralizes auth/unauthorized handling and model utilities.\n> \n> Migrates legacy Ampersand models into a dedicated `@muralco/canvas/amp-models` package and updates the app to consume it.\n> \n> - Adds `amp-models` module with `Model` (AmpCoreModel), `Collection`, `AjaxConfigMixin`, `PromisesMixin`, `DataTypes`, and domain models (`User`, `Team`, `Room`, `Member`, `Flags`, `Notifications`, `SlackNotifications`, pricing `Plan`, etc.) plus TypeScript defs for ampersand and global `app`\n> - Replaces legacy files under `src/models` with package equivalents; updates imports across app (startup, routes, mural models, team creation helpers, tests) to use `@muralco/canvas/amp-models`\n> - Centralizes API auth/refresh and 401 handling in `AjaxConfigMixin`; switches unauthorized tracking to `@muralco/tracking-lib` and exports `recordUnauthorized` there\n> - Updates `packages/canvas` dependencies/peer deps (adds ampersand libs, permissions, authentication-lib, moment, pluralize, mural-shared) and exposes `./amp-models` entry point\n> - Minor tweaks: price formatting via `Intl.NumberFormat`; converts many default exports to named exports; adjusts collections and parsing logic\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1031e73b9262f2a3479c250d457bb838e17a9325. This will update automatically on new co", + "labels": [] + }, + { + "number": 46551, + "title": "[NEXT-352] Move share modal and it's dependencies to packages", + "branch": "move/share-modal", + "merged_at": "2025-12-22T21:54:09Z", + "changed_files": 242, + "additions": 892, + "deletions": 517, + "body": "disclaimer: the commits are not a story and are a bit more brute force than may be desired. I wouldn't recommend trying to use the commits to tell the story about this change. This pr happened by \"move share modal folder to new package. then fix errors by moving dependencies\"\r\n\r\n### Main Change\r\nMove `src/modals/share` components to new package `@muralco/modals-common` in src/share.\r\n* any component dependencies from src/ui or other generic folder that were only used by share modal components are moved into muralco/modals-common\r\n* `isInvitableMember` and `compareMembersAlphabetically` moved from src/views/mural/modals/share/share-mural/helper.ts\r\n* `recordInviteFromRoom` and `recordInviteFromWorkspace` moved from \r\n\r\nMany component PropTypes interfaces have been renamed or exported with new names that are specific to their component. This is nice for clarity, but also required to prevent export collisions, especially in packages like muralco/legacy-ui\r\n\r\n### Secondary changes / dependencies\r\ncomponents and functions that are used by share modal components _and_ other components were moved to other packages so they could be shared more broadly.\r\n* `ToolbarMenuAdapterItemType` moved to `@muralco/tools-api`\r\n* `AccessibleMenu` moved to `@muralco/dashboard-legacy-ui`\r\n* `ErrorCallout` and `MenuCallout` from ui/callout/menu moved to `@muralco/dashboard-legacy-ui`\r\n* `ui/menu` components (Menu, ItemView) moved to `@muralco/dashboard-legacy-ui`\r\n* `getPermissionSelectorText` moved to `@muralco/legacy-ui` from `src/views/mural/modals/share/utils/views.ts`\r\n* `AddUserIcon` and `InfoIcon` moved to `@muralco/legacy-ui`\r\n* `InputWithNotification` and `InputInfo` moved to `@muralco/legacy-ui`\r\n* `DiscardConfirm`, `Checkbox`, `LegacyForm`, `AvatarField`,`LegacyInputField`, `createRadio<>` moved to `@muralco/legacy-ui` from src/ui/components\r\n* `MemberSelectOption` and `DropdownTrigger` moved to `@muralco/legacy-ui`\r\n\r\n\r\n### test-env\r\nhttps://share-modal.mural.engineering/join-co", + "labels": [] + }, + { + "number": 46597, + "title": "[CWI-2470] - Add emoji tab to panel, set up emoji data, filtering", + "branch": "add/cwi-2470-emoji-image-panel", + "merged_at": "2025-12-22T20:43:09Z", + "changed_files": 7, + "additions": 631, + "deletions": 74, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds the emoji tab to the new unified image search panel, as well as setting up data processing for emojis, including search and filtering capabilities. These changes are integrated with the new emoji widget added in https://github.com/tactivos/murally/pull/46446\r\n\r\nChanges:\r\n\r\n- Processes the emojis imported from `react-emoji-picker` (which was already imported into `murally` for reactions)\r\n- Updates emoji sections in the 'All' and 'Emoji' tabs to use new emoji widgets\r\n- Adds filtering by category to emoji tab\r\n- Hooks into unified image panel search for filtering emojis based on search queries\r\n- Adds a skin tone variation filter for emojis with variations\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\r\nadding emoji:\r\n![emoji](https://github.com/user-attachments/assets/5dffef48-b5f2-43a1-b786-7a114b2a282b)\r\n\r\nsearch:\r\n![emoji-search](https://github.com/user-attachments/assets/e5e8564a-4f03-41e3-9a98-3856270e9f20)\r\n\r\nskin tone variations:\r\n![emoji-skin-tone](https://github.com/user-attachments/assets/5146c7f0-ce7b-459d-a463-20f77db6c2f4)\r\n\r\n#### Reviewer Resources\r\nJIRA Ticket: https://mural.atlassian.net/browse/CWI-2470\r\nemoji widget `murally` PR: https://github.com/tactivos/murally/pull/46446\r\nTest env: \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- You", + "labels": [] + }, + { + "number": 46600, + "title": "[NEXT-375] Move ContextCheck to package", + "branch": "move/contextcheck-package", + "merged_at": "2025-12-22T16:56:26Z", + "changed_files": 3, + "additions": 9, + "deletions": 6, + "body": "\n> [!NOTE]\n> Moves ContextCheck into the dashboard package as a named export and updates room view to consume it via CommonComponents.\n> \n> - **Dashboard package**:\n> - Add `common/components/ContextChecker.tsx` with `ContextCheck` as a named export (convert interface to `type`).\n> - Export `ContextCheck` via `CommonComponents` in `src/index.ts`.\n> - **Consumer update**:\n> - In `room-view/index.tsx`, replace local `ContextCheck` import with `CommonComponents.ContextCheck` from `@muralco/dashboard` and remove the old relative import.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 165ee5226027aea9a50053bcfd7e1948f23d6e51. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46564, + "title": "[CAN-8278] Refactor widget distribution code to use the Widget Changes API - Part I", + "branch": "refactor/widget-distribution", + "merged_at": "2025-12-22T15:21:36Z", + "changed_files": 16, + "additions": 316, + "deletions": 274, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the entire widget distribution logic to use the `Widget Changes API`.\r\n\r\nThe current logic (for any kind of distribution chosen) operates in the following way:\r\n- First, we generate a children - parent map of the affected widgets\r\n- We then proceed to orphan every widget\r\n- Then, we apply the chosen distribution\r\n- Finally, we re-parent every widget with the following condition:\r\n - If the top-left most widget was initially in a table cell and the table had auto-resize enabled, every widget should fall inside that cell which should expand to fit\r\n - Otherwise, each widget should fall wherever it corresponds according to our absorption rules\r\n\r\nThe way this was currently operating was with a mixed of manual updates and changes applied that ran systems.\r\n\r\nIn order to have a better expected behavior and a full adaptation to our current architecture, we need to make it so they only apply changes through the `Widget Changes API`.\r\n\r\nThis first PR modifies all the distribution logic functions to return a list of changes instead of doing any update by themselves.\r\nThe main core of the function still works in an unwanted way, but will now only collect changes from the distribution logic.\r\n\r\nThe next part will modify this to do as few calls to `apply` as possible, only one `commit`, and no `update` calls.\r\n\r\n**No change in behavior is expected in this PR**. Widget distribution should continue working exactly as it did before this PR.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7819)\r\n- \ud83e\uddea [**Testing environment**](https://widget-distribution.mural.engineering)\n\n\n---\n\n> [!NOTE]\n> Refactors widget distribution (align/arrange/distribute) and helpers to build batched ActionList updates via WidgetStore, adjusts callers, and extends patchWidget to accept WidgetChange inputs.\n> \n> - **Business: widget-distribution**\n> - Replace imperati", + "labels": [] + }, + { + "number": 46559, + "title": "ENGAGE-1337 - Not able to set share expiry date to max allowed", + "branch": "add/engage-1337", + "merged_at": "2025-12-22T14:06:54Z", + "changed_files": 8, + "additions": 44, + "deletions": 18, + "body": "Test env - https://engage-1337.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR fixes an issue where users were unable to set share expiry dates to the maximum allowed value (ENGAGE-1337). The fix addresses timezone handling issues and adds validation when changing duration units.\r\n\r\n### Key Changes\r\n- Modified the `CHANGE_DURATION_UNIT` reducer case to validate and cap durations when switching between hours and days\r\n- Changed date/time handling to use UTC consistently to prevent timezone conversion issues that were preventing max date selection\r\n- Updated `appendCurrentTimeToDate` to use UTC midnight instead of local current time\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/set-expiration/expiration-reducer.ts | Added max duration validation when users change the duration unit (hours/days) to ensure values stay within company limits |\r\n| src/views/mural/modals/share/share-mural/helper.ts | Changed date formatting and parsing to use UTC timezone to fix issues with setting max expiration dates |\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Switches expiration handling to UTC and enforces max duration when changing units across visitor link settings, updating UI components and tests.\n> \n> - **Visitor link expiration (Share modal)**:\n> - **UTC handling**: Replace `appendCurrentTimeToDate` with `convertToUTCWithTime` and set `formatDate` to UTC in `helper.ts` to avoid timezone issues.\n> - **UI components**: Update `SetExpiration.tsx` and `SetExpirationDate.tsx` in `access-settings-tabs/.../visitor-settings` and `visitor-container/.../set-expiration` to use UTC conversion when saving and previewing dates.\n> - **Validation logic**: In `expiration-reducer.ts`, modify `CHANGE_DURATION_UNIT` to recompute and cap duration via `getMaxDuration` ba", + "labels": [] + }, + { + "number": 46602, + "title": "[NEXT-356] Move state into packages", + "branch": "fix/next-356-4", + "merged_at": "2025-12-22T13:15:55Z", + "changed_files": 50, + "additions": 207, + "deletions": 185, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves state into packages:\r\n* actions-tracker\r\n* activity\r\n* async\r\n* callouts\r\n* collaboration\r\n* native-bridge\r\n* direct-exports\r\n\r\nThe environment: https://next-356-4.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves multiple SDK state slices (and their initializers) into packages/canvas and updates all imports/usages; removes old local state definitions.\n> \n> - **State modularization (packages/canvas/src/sdk/state)**:\n> - Add and export state slices with `initial` namespaces for `actions-tracker`, `activity`, `async`, `callouts`, `collaboration`, `direct-exports`, and `native-bridge` (incl. `BridgeState`).\n> - Update aggregated `index` to re-export new slices.\n> - **App/SDK integration**:\n> - Replace local state imports/usages with `@muralco/canvas/sdk/state` across SDK APIs, dispatcher tests, and business logic; use `XState.initial` where applicable.\n> - Wire new initial state into `getInitialPublicSdkState` and `getInitialMuralStateForViews` (e.g., `ActionsTrackerState.initial`, `ActivityState.initial`, `DirectExportsState.initial`, `BridgeState.initial`, etc.).\n> - **Code cleanup**:\n> - Remove deprecated local state types/initializers under `src/mural/sdk/state/*` for the moved slices.\n> - Simplify native bridge types by relying on package state and dropping duplicate local definitions.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cced776a3ee5bf27a8b56250a45a1be4706b0437. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46599, + "title": "[ENGAGE-1451] Skip flaky test - ContentRender.Row", + "branch": "fix/skip-flaky-contentrender-row", + "merged_at": "2025-12-20T00:49:56Z", + "changed_files": 1, + "additions": 2, + "deletions": 1, + "body": "temp skipping test until we can figure out why it's flaky\n\n\n---\n\n> [!NOTE]\n> Skips the flaky \"fires tracking event when user clicks arrow button\" test in `src/apps/web/dashboard/pages/content-renderer/components/Row.test.tsx` using `it.skip` (ENGAGE-1451).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9f1dbe12f36ce71a9bf34f124dab2a599d67e4a6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46595, + "title": "Fix/update test imports", + "branch": "fix/update-test-imports", + "merged_at": "2025-12-19T23:14:40Z", + "changed_files": 14, + "additions": 35, + "deletions": 45, + "body": "\n> [!NOTE]\n> Updates test files to use @muralco/canvas and realtime packages, adjusts related types/usages, and makes minor JSX and utility tweaks.\n> \n> - **Tests/Types migration**:\n> - Switch imports to `@muralco/canvas/*` and realtime packages (`@muralco/realtime`, `@muralco/realtime-client`) for `ToolBarItemSpec`, `ContextMenuItem`, `Direction`, `RightBarTab`, `CustomHandle`, `Single/SingleStickyProto`, etc.\n> - Replace various internal `mural/sdk/*` paths with `@muralco/canvas/sdk/apis` equivalents.\n> - **Step definitions and utilities**:\n> - Update widget creation and toolbar utilities to new type sources; minor logic/typing cleanups.\n> - Change `applyChangesToMural` import path; update realtime socket init to new types.\n> - **Pages**:\n> - Use named exports for network restriction error components and simplify JSX props.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 144f732f4e2750901734b789a58966e78340f1be. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46515, + "title": "Refactor user /me shell to simplify moving code to packages", + "branch": "refactor/me-shell-simplified", + "merged_at": "2025-12-19T21:26:23Z", + "changed_files": 53, + "additions": 390, + "deletions": 693, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors the user settings architecture by consolidating shared types into `@muralco/settings-commons`, removing prop drilling, and simplifying component interfaces to prepare the field for extracting current settings into a package. Next PRs depend on these changes. \r\n\r\nKey changes include:\r\n- Migrating types (Tab \u2192 UserSettingsTab, TabId \u2192 UserSettingsTabId, etc.) to shared settings-commons package and renaming to improve consistency.\r\n- Removing excessive prop passing by calling APIs directly (workspaceApi, patchMe, etc.)\r\n- Improve the view to involve a common InjectedProps interface across settings for a future refactor to simplify registering.\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-367\r\n- Test Env: https://me-shell-simplified.mural.engineering/me/profile\r\n\r\n#### Tests\r\n- [x] Checked all the /me routes changes and saves accordingly\r\n\n\n---\n\n> [!NOTE]\n> Migrates user settings to shared types, simplifies props by calling APIs directly, and removes BrowserInfo/redirect plumbing across /me, integrations, profile, workspaces, and navigation.\n> \n> - **Settings architecture**:\n> - Move/rename types to `@muralco/settings-commons` (`UserSettingsTabId`, `UserSettingsTab`, `UserSettingsTabs`, `UserSettingsInjectedProps`, etc.) and re-export via `settings-commons` index.\n> - Update routes and shell to use `tabId`/typed route props; generate app-specific subroutes.\n> - Replace legacy `InjectedProps`/`OnChangeTab`/`Tab*` with new user settings types across modules.\n> - **Prop/API simplification**:\n> - Remove prop drilling (e.g., `onRedirect`, `onListMembers`, email/reset handlers); components call APIs directly (`workspaceApi`, `patchMe`, `sendVerifyEmail`, etc.).\n> - `RouteLink` now accepts optional `onRedirect` and defaults to `push`.\n> - **Navigation**:\n> - Internalize `getBrowserInfo` in `ui/navigation/settings`; drop `BrowserInfo` from consu", + "labels": [] + }, + { + "number": 46377, + "title": "[CAN-8171] Hide handlers when widgets are very small", + "branch": "add/zoom-hidden", + "merged_at": "2025-12-19T21:01:39Z", + "changed_files": 8, + "additions": 95, + "deletions": 87, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes the widgets handlers where visible even the widget is was too small to be useful\r\n Now, with these changes, we are progressively hiding them earlier than before.\r\n\r\n[murally](https://github.com/tactivos/murally/pull/46377)\r\n[mural-api](https://github.com/tactivos/mural-api/pull/15065)\r\n[mural-render](https://github.com/tactivos/mural-render/pull/1466)\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8172) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://zoom-hidden.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.at", + "labels": [] + }, + { + "number": 46587, + "title": "[CWI-2506] Unified Images Panel Tracking", + "branch": "add/cwi-2506-tracking", + "merged_at": "2025-12-19T20:43:35Z", + "changed_files": 19, + "additions": 538, + "deletions": 204, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis adds all tracking _except_ for emoji panel tracking. Emoji specific tracking will be added once the emoji panel is more finalized.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2506 to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Implements sessionized tracking for the Unified Images Panel (open, search start/complete/fail, tab navigate, widget added) with tab/session IDs propagated through UI, regions, and drag events, plus tests and type up", + "labels": [] + }, + { + "number": 46446, + "title": "[CWI-2463] - Add emoji widget", + "branch": "add/cwi-2463-emoji-widget", + "merged_at": "2025-12-19T19:57:36Z", + "changed_files": 12, + "additions": 141, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCreates a new widget type, emoji widgets, using `StickerWidget` as a base. Emoji widgets are distinguished from base sticker widgets by the optional 'emoji' prop, and are similar in functionality, with the main difference being that they do not require any assets to be fetched, since they are using murally's imported emoji library, and rendering the emojis as unicode characters.\r\n\r\nFuture work will add a tab for emojis to the new version of the image search panel, using the `react-emoji-picker` library already imported into murally (currently used for reactions)\r\n\r\nThis PR adds the base emoji widgets (with addon registration behind a feature flag).\r\n\r\nmural-api PR: https://github.com/tactivos/mural-api/pull/15071\r\nmural-render PR: https://github.com/tactivos/mural-render/pull/1468\r\n\r\n\"Screenshot\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/CWI-2463\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can", + "labels": [] + }, + { + "number": 46573, + "title": "[NEXT-356] Move state into packages", + "branch": "fix/next-356-3", + "merged_at": "2025-12-19T18:46:48Z", + "changed_files": 127, + "additions": 577, + "deletions": 501, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR moves into packages state for:\r\n* participants\r\n* undo-redo\r\n* video\r\n* modal\r\n* socket\r\n* dragging\r\n* preview-mode\r\n* navigation\r\n* labels\r\n* facilitation\r\n* content-viewer\r\n* popover\r\n* capabilities\r\n* app\r\n* apps\r\n* canvas\r\n\r\nThe environment: https://next-356-3.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves multiple SDK state slices into `@muralco/canvas/sdk/state` with initializers, updates all usages/imports, removes legacy state files, and adds `immutable` dependency.\n> \n> - **State migration to packages**\n> - Adds state slices under `packages/canvas/src/sdk/state/` with initializers: `app`, `apps`, `canvas`, `capabilities`, `content-viewer`, `dragging`, `facilitation` (incl. `PrivateTimeState`, `TimerState`, `VotingState`), `labels`, `modal`, `navigation`, `participants`, `popover`, `preview-mode`, `socket` (incl. `InternalSocketState`), `themes`, `undo-redo`, `video`.\n> - Exposes new barrel `packages/canvas/src/sdk/state/index.ts` and `initial`/`getInitial` factories (e.g., `AppState.getInitial`, `FacilitationState.getInitial`).\n> - **Codebase integration**\n> - Replaces imports across addons, business logic, SDK APIs, primitives, selectors, tests to consume `@muralco/canvas/sdk/state` types and `initial` values.\n> - Updates initialization in `src/mural/sdk/state/index.ts` and common state to use new `initial` factories; removes legacy state files under `src/mural/sdk/state/**`.\n> - Adjusts minor import paths (e.g., `@muralco/api/murals` vs `.../index`, local tool import path) and selectors to new types.\n> - **Dependencies**\n> - Adds `immutable@5.1.2` to `packages/canvas` and lockfile.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c40745f3373cd06c5210366df7228f27742ef186. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).", + "labels": [] + }, + { + "number": 46589, + "title": "[CWI-2510] Unit tests for Unified Image Panel", + "branch": "add/cwi-2510", + "merged_at": "2025-12-19T18:32:43Z", + "changed_files": 6, + "additions": 1232, + "deletions": 1, + "body": "Adding unit tests for unified image panel\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2510) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Adds comprehensive unit tests for Unified Images Panel (components, hooks, unified search) and refactors region name type using a generic ValueOf utility.\n> \n> - **Tests**:\n> - **UnifiedImagesPanel (`index.test.tsx`)**: Verifies search input behavior, tabs rendering/switching, region previews/expanded rendering, navigation to region tab, and", + "labels": [] + }, + { + "number": 46279, + "title": "[CWI-2444] Integrations Platform - Add support of platform connections in front end", + "branch": "add/cwi-2444", + "merged_at": "2025-12-19T18:20:12Z", + "changed_files": 193, + "additions": 3529, + "deletions": 3420, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Add support of platform connections in front end\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2444\r\n\n\n---\n\n> [!NOTE]\n> Introduces @muralco/integrations-platform and refactors SOR/research UI and SDK to use platform connections (native/workato) and new API clients, replacing legacy Workato args and APIs.\n> \n> - **New Package: `@muralco/integrations-platform`**\n> - Platform clients: `platform` (connections, API client, errors), `workato` (API wrapper/recipe client).\n> - Integrations: `asana`, `microsoft-planner`, `rally`, `salesforce` modules with types, API calls, and tests.\n> - **Frontend Migration**\n> - Replace `@muralco/api/*` usages with `@muralco/integrations-platform/*` across SOR managers, resources, filters, and research UI.\n> - Switch from `WorkatoArgs` to `IntegrationsPlatformConnection`; update resource loader/cache keys and error handling.\n> - Rename methods (e.g., `getValidConnection*` \u279c `getActiveConnection*`); update call sites and tests.\n> - **SDK & State**\n> - System-of-record SDK now manages active connections (supports native via FF and workato), open embed modal, and connection selectors/state shape (`connections` map).\n> - Update selectors (`selectIntegrationsPlatformConnection`), state schema, and modal/search/import flows.\n> - **Removals/Refactors**\n> - Delete legacy `packages/api` integration code/tests (asana/microsoft-planner/rally/salesforce/workato clients).\n> - Research mural components updated to new connection API and salesforce platform modules.\n> - **Misc**\n> - `@muralco/api` authenticated helpers accept custom `headers`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f7f20100ceeb8a598567b3f3ea5864374070cd00. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46569, + "title": "Migrating more dispatcher types to `@muralco/canvas/dispatcher`", + "branch": "more-dispatcher-types", + "merged_at": "2025-12-19T16:20:50Z", + "changed_files": 62, + "additions": 115, + "deletions": 76, + "body": "Refactors dispatcher type definitions by moving them from `src/mural/dispatcher/` to `packages/canvas/src/dispatcher/` to improve code organization and package boundaries.\r\n\r\n**Types Moved to Canvas Package:**\r\n- `input/` - Input handling types including `MouseApi`, `KeyboardHandler`, and `MouseProcessor`\r\n- `interactive-display-bottom-panels/` - `InteractiveDisplayBottomPanelsApi` and `BottomPanelTab` types\r\n- `network/` - `NetworkApi` and `RequestStatus` types\r\n- `notifications/` - `NotificationsApi` and `Notification` types\r\n- `popover/` - `PopoverApi` and `PopoverContentType` types\r\n- `snipping-selection/` - `SnippingSelectionApi` and `SnippingSelectionId` types\r\n- `template/` - `TemplateApi` and `UpdatableTemplateProps` types\r\n\r\n**Package Exports:**\r\n- Added 7 new exports to `packages/canvas/src/dispatcher/index.ts` for the moved types\r\n- Removed `AIPillUsageInfo` from `actions-tracker/index.ts` barrel export (kept in types file)\r\n- Removed `UpdatableTemplateProps` from `template/index.ts` barrel export (kept in types file)\r\n\r\n**Consumer Updates:**\r\n- Updated `src/common/user/util.ts` to import `NotificationsApi` from `@muralco/canvas/dispatcher`\r\n- Updated test files to use new import paths from canvas package\r\n", + "labels": [] + }, + { + "number": 46425, + "title": "[CPT-2481] Refactor create-mural-from-template action to use new event-based action pattern", + "branch": "add/create-mural-action", + "merged_at": "2025-12-19T15:46:28Z", + "changed_files": 13, + "additions": 179, + "deletions": 118, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors the `create-mural-from-template` action in the dashboard to use the new template actions pattern.\r\nEverything should work as it did before, just with the cleaner new pattern for code under the hood.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2481) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://create-mural-action.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Log in and test the `create mural from template` action in the dashboard\r\n 2. This action should work from the templates tab, from the search tab, and from the recents tab.\r\n 3. It should also continue to work, unaltered, in the templates modal.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good ", + "labels": [] + }, + { + "number": 46562, + "title": "[SCQM-1539] Remove/non streaming AI code [Part 2]", + "branch": "remove/non-streaming-ai-code-2", + "merged_at": "2025-12-19T15:16:23Z", + "changed_files": 15, + "additions": 184, + "deletions": 285, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPart 2 of X\r\n\r\nPrior to these changes the AI features branched on the `enable-ai-translate-streaming` flag and retained non-streaming preview/apply paths.\r\n\r\nNow, with these changes the (1) `summarize`, (2) `generate ideas`, and (3) `cluster by topic` features run streaming-only: flag checks and non-streaming branches are removed, streaming preview/commit is always initialized, and tests are updated accordingly.\r\n\r\nNote: summarize was also upgraded with the \"early failure\" code, recently added to the action version.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1539) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://non-streaming-ai-code-2.mural.engineering) to perform a smoke test.\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes:\r\n* For each flow, verify undo/redo preserves the single grouped action from the streaming preview.\r\n1. Summarize: Select a few text widgets, invoke Summarize from the AI dropdown/chat, and confirm streaming preview updates live; accept/discard works.\r\n3. Generate ideas: run Generate ideas; verify widget creation and streaming; accept/discard works.\r\n3. Cluster by topic: Select sticky notes, run cluster by topic, see streaming area creation and widget sorting updates; accept/discard works.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46579, + "title": "[ECOMM-337] create new modal for showing details of schedule downgrade", + "branch": "add/ecomm-337", + "merged_at": "2025-12-19T15:04:12Z", + "changed_files": 6, + "additions": 328, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCreate a success modal for downgrade subscription.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-337) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Record\r\nhttps://www.loom.com/share/06a581f1cdcd4a8091af33dafb64dc63", + "labels": [] + }, + { + "number": 46577, + "title": "[CAN-8195] Add Create task tool to floating toolbar when IA toolbars are enabled", + "branch": "add/can-8195", + "merged_at": "2025-12-19T14:33:44Z", + "changed_files": 3, + "additions": 381, + "deletions": 43, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds create task tool to floating toolbar when IA toolbars ff is enabled\r\n\r\n[Test Env](https://can-8195.mural.engineering/)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8195)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](", + "labels": [] + }, + { + "number": 46572, + "title": "[CAN-8272] Canvas onboarding polish", + "branch": "add/can-8272", + "merged_at": "2025-12-19T13:43:18Z", + "changed_files": 12, + "additions": 15, + "deletions": 30, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates the @muraldevkit/ui-toolkit from version 4.59.0 to 4.59.1 to fix MrlCallout overflow issues, eliminating the need for custom withOverflow CSS workarounds previously applied across multiple canvas onboarding callouts. The changes also refine callout positioning by adding explicit alignment properties and simplify the pan-button callout visibility logic by removing the sidebar status check.\r\n\r\nKey Changes:\r\n\r\nUpdated @muraldevkit/ui-toolkit dependency from 4.59.0 to 4.59.1\r\nRemoved custom withOverflow CSS classes and their usages from navigation-improvements, stickies, and share-modal components\r\nReplaced className-based workarounds with proper alignment: 'end' properties on callout configurations\r\nSimplified pan-button callout visibility logic by removing sidebar status condition\r\n\r\nBefore:\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\nAfter:\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8272) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8272.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n", + "labels": [] + }, + { + "number": 46582, + "title": "Fix broken import in step definitions", + "branch": "fix/broken-step-widgets", + "merged_at": "2025-12-19T13:31:02Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdate import path, unsure how this got into master\r\n", + "labels": [] + }, + { + "number": 46534, + "title": "[CAN-8265] Make `WidgetStore` mandatory to create an `ActionBuilder`", + "branch": "fix/can-8265", + "merged_at": "2025-12-18T21:02:43Z", + "changed_files": 160, + "additions": 675, + "deletions": 460, + "body": "**[CAN-8265 Make `WidgetStore` mandatory in `ActionBuilder`](https://mural.atlassian.net/browse/CAN-8265)**\r\n\r\nIn this PR:\r\n* Made WidgetStore a mandatory argument for ActionBuilder\r\n* Added `sdk.widgets.changes.builder()` function to create a builder with the current store\r\n* Added `ActionList.join` function to join changes\r\n\r\nThe environment: https://can-8265.mural.engineering/\r\n\r\n### No widget\r\n\r\n\r\n\"image\"\r\n\r\n\r\n### For 'widget-id'\r\n\r\n\r\n\"image\"\r\n\r\n\r\n### For arrow\r\n\r\n\r\n\"image\"\r\n\r\n", + "labels": [] + }, + { + "number": 46498, + "title": "[SCQM-1541] Remove generate action items from Discovery Call", + "branch": "update/remove-generate-action-items", + "merged_at": "2025-12-18T20:52:41Z", + "changed_files": 15, + "additions": 1, + "deletions": 768, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemove generate action items from Discovery Call API\r\n\r\n- Remove generateActionItems method from DiscoveryCallApi interface\r\n- Remove generateActionItems call from discovery call selection plugin\r\n- Delete discovery-call/generate-action-items.ts implementation file\r\n- Remove unused FEATURES import from selection plugin\r\n\r\nThis is part of the Discovery Call removal effort. The generate action items functionality was only used by discovery call and is being removed as dead code. For a more detailed plan on my approach for this please see the following: https://drive.google.com/file/d/1gn6EFtuMgjFo_-sNe3QiiCsZXrKYj3LL/view?usp=sharing\r\n\r\n#### Reviewer Resources\r\nhttps://mural.atlassian.net/browse/SCQM-1541\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://remove-generate-action-items.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15062)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're ", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46461, + "title": "[SCQM-1368] Remove/non streaming AI code [Part 1]", + "branch": "remove/non-streaming-ai-code", + "merged_at": "2025-12-18T19:46:43Z", + "changed_files": 12, + "additions": 135, + "deletions": 275, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPart 1 of X\r\n\r\nPrior to these changes the AI features branched on the `enable-ai-translate-streaming` flag and retained non-streaming preview/apply paths.\r\n\r\nNow, with these changes the (1) `translate`, (2) `sentiment classification`, and (3) `suggest title` features run streaming-only: flag checks and non-streaming branches are removed, streaming preview/commit is always initialized, and tests are updated accordingly.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1368) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://non-streaming-ai-code.mural.engineering) to perform a smoke test.\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes:\r\n* For each flow, verify undo/redo preserves the single grouped action from the streaming preview.\r\n1. Translate: Select a few text widgets, invoke Translate from the AI dropdown/chat, and confirm streaming preview updates live; accept/discard works.\r\n2. Sentiment: Select sticky notes, run Sentiment Classification, see streaming color/label updates; accept/discard works.\r\n3. Suggest Title: Select an area or text widgets, run Suggest Title; verify placeholder/title updates during streaming; accept/discard works.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Removes non\u2011streaming code paths and feature flag checks, making translate, sentiment classification, and suggest title always stream with unified preview/commit handling and updated tests/feature specs.\n> \n> - **AI Sentiment Classification**:\n> - Always-on streaming: remove flag checks and non-streaming apply path;", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46558, + "title": "Remove/flag remove 8c6a8", + "branch": "remove/flag-remove-8c6a8", + "merged_at": "2025-12-18T19:22:15Z", + "changed_files": 6, + "additions": 2, + "deletions": 26, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46557, + "title": "Remove/flag remove 0e61a", + "branch": "remove/flag-remove-0e61a", + "merged_at": "2025-12-18T19:22:15Z", + "changed_files": 3, + "additions": 2, + "deletions": 20, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46556, + "title": "Remove/flag remove 51dc90", + "branch": "remove/flag-remove-51dc90", + "merged_at": "2025-12-18T19:22:15Z", + "changed_files": 2, + "additions": 1, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46541, + "title": "[CAN-5416] Remove resizableCanvasFeatureParity flag", + "branch": "fix/remove-resizable-flag", + "merged_at": "2025-12-18T19:22:13Z", + "changed_files": 13, + "additions": 23, + "deletions": 74, + "body": "Ticket: https://mural.atlassian.net/browse/CAN-5416", + "labels": [] + }, + { + "number": 46478, + "title": "[NEXT-318] Refactor download workspace csv routes", + "branch": "feat/next-318-refactor-download-routes", + "merged_at": "2025-12-18T18:53:49Z", + "changed_files": 16, + "additions": 958, + "deletions": 84, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the logic around a route with branching for two different query strings for downloading a CSV file with data on a workspace:\r\n\r\n- Removes the use of hard to follow frontend \"middleware\" pattern in favor of an existing HOC and a custom hook for checking permission logic / executing potential redirects\r\n- Updates the landing page of the route to reuse a more user friendly \"loading\" experience with a progress indicator for slow connections and a link back to the requesting user's workspace dashboard\r\n\r\nSets up this route to be extracted into a package in a [follow up ticket](https://mural.atlassian.net/browse/NEXT-343)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-318) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-318-refactor-download-routes.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n[Please see this loom](https://www.loom.com/share/71608ce4b22c491e977baf29ad844e55) to understand how to trigger the two distinct workflows:\r\n- Workspace admin requests a CSV of workspace _member_ data via the direct link on workspace users management view\r\n- Workspace admin leaves the workspace and transfers content to another admin. That admin gets an email with a link to the download route for workspace _content_ data\r\n\r\nI've setup a workspace with some users in it for convenience: you can access them at the testing env link above with the following credentials:\r\n\r\n```\r\njeffrey.lebowski@hunnur.com\r\nwalter.sobchak@hunnur.com\r\nn77BYYXAVKnv1Rp (for both users)\r\n```\r\n\r\nThe second flow in particular should be tested for the various **permission checks** that would result in a redirect when loading the route due to the workspace or user being in one of the following states:\r\n- Security suspension => `/workspac", + "labels": [] + }, + { + "number": 46578, + "title": "[CAN-8253] Ensure `sdk.dispatcher.selection.clear()` stops marquee selection", + "branch": "fix/can-8253", + "merged_at": "2025-12-18T18:43:25Z", + "changed_files": 7, + "additions": 47, + "deletions": 40, + "body": "The area manager `clear-selection` command should stop the current marquee selection.\r\n\r\nThis PR changes the dispatcher `sdk.dispatcher.selection.clear()` to stop any marquee selection.\r\n\r\nhttps://mural.atlassian.net/jira/software/c/projects/CAN/boards/21?selectedIssue=CAN-8253\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the di", + "labels": [] + }, + { + "number": 46549, + "title": "[NEXT-366] Break apart & migrate `src/mural/register/types` to `@muralco/canvas/register` part 2", + "branch": "split-register-types-2", + "merged_at": "2025-12-18T18:07:45Z", + "changed_files": 199, + "additions": 958, + "deletions": 900, + "body": "## Summary\r\nContinues migrating registration types from `src/mural/register/types` to `@muralco/canvas/register` package. This PR is breaking up the types monolith of `src/mural/register/types`. \r\n\r\n## Changes\r\n**Break apart and migrated the following types to `@muralco/canvas/register`:**\r\n- `clipboard.ts` - Clipboard data and paste handler types\r\n- `context-menu.ts` - Context menu specifications and menu items\r\n- `filter.ts` - Find/filter widget types and interfaces\r\n- `iframe.ts` - iframe component specifications\r\n- `images.ts` - Image library types and configurations\r\n- `misc.ts` - Content sources, file uploads, app catalog, settings sections, and tab observers\r\n- `pointer.ts` - Pointer extension types\r\n- `video.ts` - Video player provider specifications\r\n- `widget-panel.ts` - Widget panel regions, protos, and settings\r\n- `widgets.ts` - Widget creation and rotation observer handlers\r\n- `misc.ts` - Misc scattered types from the monolith\r\n\r\n**Broke apart but not modularized yet**\r\n- `ui-components.ts` - UI related types\r\n", + "labels": [] + }, + { + "number": 46445, + "title": "Fixed issue with undo functionality for table reshaping and added uni\u2026", + "branch": "fix/can-8210", + "merged_at": "2025-12-18T17:54:49Z", + "changed_files": 3, + "additions": 280, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n- Reshape undo/redo now records both forward and revert plans in ReshapeTableStep and registers the step before per-cell fit adjustments. Undo now replays the original table dimensions before any fit-to-content steps reflow cells, restoring size/positions; redo replays the applied plan.\r\n\r\n- Added a unit test verifying ReshapeTableStep applies the forward plan on redo and restores dimensions on undo.\r\n\r\n### Case Solved\r\n\r\n**Precondition to reproduce:** Table cell auto resize has to be turned off.\r\n\r\n**Description:** If a user shrinks a table with several widgets inside to the point where the widgets overlap with each other and the uses de undo function the table elements inside the table do not go back to its previous positions. In addition the table does not change back to its original size.\r\n\r\n**Expected results:**\r\n\r\nAn undo of a table resizing should always preserve the previous state size and position of the table and its elements.\r\n\r\n**Actual result before fix:**\r\n\r\nShrinking a table with widgets to the point that the widgets inside overlap produces inconsistent results after an undo of the resize.\r\n\r\n### How the Change Fixes It\r\n\r\nOn resize end, reshapeTable now pushes the undo step before fitting cells and passes both forward and revert plans. The undo stack therefore has the pre-resize geometry and executes in reverse order: fit adjustments undo first, then the reshape step restores the original table size/position. Redo replays the forward plan and subsequent fits, preserving consistency even when cells overlap with auto-resize off.\r\n\r\n\r\n### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-8210) \r\n- \ud83e\uddea [ENV](https://can-8210.mural.engineering/)\r\n\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [Recorded Video of issue](https://www.loom.com/share/57a85847954e4e29944b8ececa561bd2)\r\n\n\n---\n\n> [!NOTE]\n> Ensure table reshape undo/redo restores original size/position by recording ", + "labels": [] + }, + { + "number": 46576, + "title": "[CWI-2485] Search debounce for Unified Image Panel", + "branch": "add/cwi-2485", + "merged_at": "2025-12-18T17:29:10Z", + "changed_files": 2, + "additions": 34, + "deletions": 29, + "body": "Updating the search for unified panel to only trigger after 400MS to keep a consistent look and feel for search. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2485) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46388, + "title": "[CWI-2452] Remove use of manage.integrations", + "branch": "add/cwi-2452-gating", + "merged_at": "2025-12-18T16:53:22Z", + "changed_files": 39, + "additions": 103, + "deletions": 41, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Remove use of `.manage.integrations` in favor of `.use.integrations`.\r\n- Update to use new `permitted` property on ClientApps for filtering apps/integrations a user is permitted to use in addition to be approved for the company/workspace as a whole.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2452 to understand the context of this effort.\r\n- See https://mural.atlassian.net/wiki/spaces/RD/pages/4941676560/Integration+Entitlements for an overview of how integrations/ClientApps interact with Entitlements.\r\n- The new permissions property will enable us to register and dynamically show a special upgrade message for the integration and/or integration tier for completing https://mural.atlassian.net/browse/CWI-2434.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/15004\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.at", + "labels": [] + }, + { + "number": 46553, + "title": "[ECOMM-334] show downgrades correctly in plan summary panel and legal disclosure", + "branch": "add/ecomm-334-plan-summary-downgrades", + "merged_at": "2025-12-18T16:25:17Z", + "changed_files": 12, + "additions": 1290, + "deletions": 42, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR implements proper UI handling for scheduled downgrades in the billing purchase flow. When users reduce seats or switch from annual to monthly billing, the system now correctly identifies these as scheduled downgrades and displays appropriate messaging in both the plan summary panel and legal disclosure sections.\r\n\r\nKey Changes:\r\n\r\n- Added isScheduledDowngrade utility function to detect downgrade scenarios (billing frequency changes from annual to monthly, or seat quantity reductions)\r\n- Created new ScheduleChangesSummarySection component to display scheduled downgrade details\r\n- Updated purchase button text logic to show \"Confirm changes\" instead of \"Confirm and pay\" for scheduled downgrades\r\n- Added conditional legal disclosure text for scheduled downgrades\r\n\r\n\r\nhttps://ecomm-334-plan-summary-downgrades.mural.engineering/\r\n\r\n### Downgrade from Team+ Annual to Team+ Monthly:\r\n\r\n\"image\"\r\n\r\n\r\n### Downgrade Quantity of Members Team+ Annual:\r\n\r\n\"image\"\r\n\r\n### Downgrade from Team+ Annual to Team+ Monthly and reduce quantity of members:\r\n\r\n\"image\"\r\n\r\n### Business plan reduce quantity of members:\r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-334) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updat", + "labels": [] + }, + { + "number": 46563, + "title": "[SCQM-1538] Add support links to colors and themes settings", + "branch": "beta-fix/color-settings-links", + "merged_at": "2025-12-18T15:57:45Z", + "changed_files": 1, + "additions": 11, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd links to empty href on company settings & colors page\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1538) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://color-settings-links.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Ensure you are a company admin, and visit `c/internal-sso/settings/colors`\r\n 2. Click the Learn more links. They both go to the same article.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the ", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46550, + "title": "[SCQM-1534] Update/color themes save messages", + "branch": "update/color-themes-save-messages", + "merged_at": "2025-12-18T15:42:35Z", + "changed_files": 3, + "additions": 737, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThere is currently a bug when updating/adding/removing a color or theme. First, we are not getting an accurate message. For example, when you delete a color, it says that the color was 'updated' and gives us a number that does not reflect what the user did.\r\n\r\nThis PR compares the original colors and themes, splits the changes into 'added', 'removed', and 'updated', and then composes an accurate message. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1534) to understand the context of this effort.\r\nPlease see this \ud83c\udfac [**demo**](https://www.loom.com/share/c6abe44cb7584cbca18b5dbc68a39bed) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://color-themes-save-messages.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes. A note!! If you are not a company admin, you will not be able to test this out in the testing env. Either pull this down locally (and make yourself in admin in the db) or watch my lovely demo above \u23eb \r\n 1. On the admin page, add a color, edit a color, and remove a color. The message should format like `Update company colors. 1 color added, 1 color updated, and 1 color removed.` Try the same but add edit and remove 2 colors to confirm pluralized 'colors' in the message: `Update company colors. 2 colors added, 2 colors updated, and 2 colors removed.`\r\n 2. Perform the above but only make two edits. For example, remove a color and edit a color. The message should read `Update company colors. 1 color updated and 1 color removed.`\r\n 3. Add a theme, edit a theme, and remove a theme. Confirm all three actions message: `Update company themes. 1 theme added, 1 theme updated, and 1 theme removed.` Try the same actions, but edit add and remove 2 themes to con", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46552, + "title": "[NEXT-364] Migrate widget SDK API types that only have external dependencies", + "branch": "refactor/sdk-api-type-4", + "merged_at": "2025-12-18T15:30:35Z", + "changed_files": 146, + "additions": 222, + "deletions": 181, + "body": "https://sdk-api-type-4.mural.engineering\r\n\r\n", + "labels": [] + }, + { + "number": 46554, + "title": "[SCQM-1527] Add preview mode early failure handling", + "branch": "add/scqm-1527-preview-mode-early-failure", + "merged_at": "2025-12-18T14:45:04Z", + "changed_files": 5, + "additions": 76, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds proper handling for when the new Summary fails early (before showing the preview mode toolbar) by ending preview mode, removing any withstanding placeholder widgets and re-selecting the original widgets as per the Figma designs.\r\n\r\nPrior to these changes you would get stuck in preview mode looking at a placeholder widget and an error toast with no way to get back to editing the mural other than reloading the page.\r\nNow, with these changes, when failing early you get returned back to mural editing mode, with the placeholder widget gone and the original widgets re-selected and focused on, while the error toast remains visible as feedback, showing the corresponding error.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1527) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1527-preview-mode-early-failure.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes:\r\n1. \r\n\r\n### Required Checklist for Author\r\n- [x] Unit and cucumber tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46567, + "title": "[CWI-2480] Added Giphy Trending API endpoint", + "branch": "add/cwi-2480", + "merged_at": "2025-12-18T14:29:03Z", + "changed_files": 2, + "additions": 16, + "deletions": 8, + "body": "Added Giphy Trending API endpoint and updated Gif Region to load them if there are no keywords present.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2480) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**Integrtaions PR**](https://github.com/tactivos/mural-integrations/pull/1665)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46568, + "title": "[SCQM-1388] Send tracking on AI Action events", + "branch": "add/scqm-1388-fe-actagent-events", + "merged_at": "2025-12-18T11:41:54Z", + "changed_files": 7, + "additions": 518, + "deletions": 10, + "body": "Card: [SCQM-1388](https://mural.atlassian.net/browse/SCQM-1388)\r\nEnv: https://scqm-1388-fe-actagent-events.mural.engineering\r\nmurally PR: tactivos/mural-api#15092\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\nAdds event tracking on AI action starting, result success/fail (with token counts of the result), refine starting, and final accept/decline on the preview (with session-total token counts).\r\n\r\nThe events should be pretty easy to add new ones for new actions, it should be possible to do a\r\n```\r\ntype AIActionFoobarEvent = BaseAIActionEvent<'foobar'>;\r\n```\r\nif there's no custom fields for the payloads, or add new payload types as needed and do a\r\n```\r\ntype AIActionFoobarEvent = BaseAIActionEvent<\r\n 'foobar',\r\n AIActionFoobarStartPayload,\r\n AIActionFoobarRefinePayload,\r\n AIActionFoobarResultPayload\r\n>;\r\n```\r\nto get an `AIActionFoobarEvent` to add to the `AIActionEvent` union.\r\n\r\nNew events all include `sessionId`, `actionType` (always 'summarize' for all summarize variants), `refinementRound` (number, starts at 0 on non-refinement initial request), `widgetsCount` of input widgets, `wordsCount` of input widgets word count, an optional `refinementType` (if there is a refinement happening), and `variant` to track orchestrator version.\r\n- On start: `ai_action_summarize_start`, also has `entryPoint: 'actionbar' | 'toolbar-dropdown'`\r\n- On result success: `ai_action_summarize_result_success` also with token counts (of this one result)\r\n- On result failure: `ai_action_summarize_result_fail`\r\n- On refine start (when clicking option in refine menu): `ai_action_summarize_refine_start` with `refinementType` set (result success/failure will also have refinementType)\r\n- On accept: `ai_action_summarize_accept` also with token counts of all results in session (and with `refinementRounds` showing total number of refinements and `refinementType` set to last refinement done)\r\n- On discard: `ai_action_summarize_discard`, payload the same as _accept.\r\n\r\n#### Reviewer R", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46469, + "title": "[CPT-2462] Create mural from template in template workspace if possible", + "branch": "add/create-template-default-location", + "merged_at": "2025-12-17T23:02:05Z", + "changed_files": 4, + "additions": 434, + "deletions": 45, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, when a user was in the \"All workspaces\" view and clicked a template from a specific workspace (e.g., Workspace A), the \"New mural from template\" modal would show their currently selected workspace in the dropdown, even if it didn't match the template's workspace. This could lead to murals being accidentally created in the wrong workspace.\r\n\r\nNow, with these changes, the modal automatically switches to the template's workspace if the user has access to it, and displays an informational message explaining the switch. If the user doesn't have access to the template's workspace (e.g., company templates), the existing behavior is preserved.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2462) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://create-template-default-location.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Testing steps:\r\n\r\n TEST ENV: https://create-template-default-location.mural.engineering/\r\n\r\n 1. Navigate to Templates in the dashboard\r\n 2. Select \"All workspaces\" view\r\n 3. Click \"Use template\" on a template that belongs to a different workspace than your default\r\n 4. Verify the workspace dropdown shows the template's workspace (not your default)\r\n 5. Verify the info message appears: \"This template was created in [Workspace] workspace, so that workspace has been set as the default location for your new mural.\"\r\n 6. Create the mural and verify it's created in the correct workspace\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Excepti", + "labels": [] + }, + { + "number": 46450, + "title": "[SCQM-1451] Add AI Actions Inspector Dev Tools v1", + "branch": "add/ai-agent-inspector-tool", + "merged_at": "2025-12-17T22:41:42Z", + "changed_files": 15, + "additions": 560, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nJIRA: https://mural.atlassian.net/browse/SCQM-1451\r\nTEST ENV: https://ai-agent-inspector-tool.mural.engineering\r\n\r\nA Separate PR will be created to polish the UI!\r\n\r\n\"image\"\r\n\r\nLOOM:\r\nhttps://www.loom.com/share/e6712ace3d894d41bf6eb88ed069210c\r\n\r\n\r\n- Add AI Debug to SDK API, State, and Dispatcher\r\n - A simple `Record` was added to store the debug information\r\n- Add `AI_DEBUG_INFO` event processor\r\n - Receives data every-time there's agent activity like:\r\n - `AGENT_START`\r\n - `AGENT_MESSAGE`\r\n - `AGENT_ERROR`\r\n - `UNAVAILABLE_TOOLS`\r\n - `TOOLS_CALL`\r\n - `TOOLS_RESPONSE`\r\n- Add AI Agent Inspector Dev Tool\r\n - Basic view for now\r\n\r\n\r\n\r\n#### Reviewer Resources\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n1. Enable `feat-mu-ai-action-summarize-enabled` flag in canvas\r\n2. Enable `AI Agent Inspector` from the `Dev Tools` dropdown button\r\n 1. The Dev Tool should now show!\r\n3. Toggle `ON` the `Debug Mode` radio button \r\n4. Create test data to summarize (i.e. \"generate 10 ideas about star wars\")\r\n5. Select data and click on `Summarize -> Fixed orchestrator`\r\n6. As the data processes you should now see the Dev Tool populating with data!!\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15051)\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46565, + "title": "Create README for ActionsManager pattern", + "branch": "add/actionmanager-readme", + "merged_at": "2025-12-17T22:15:00Z", + "changed_files": 1, + "additions": 130, + "deletions": 0, + "body": "", + "labels": [] + }, + { + "number": 46566, + "title": "Removing JS is always a good thing", + "branch": "own/to-test", + "merged_at": "2025-12-17T22:04:07Z", + "changed_files": 1, + "additions": 0, + "deletions": 22, + "body": "Deleted comments for testing the `shipnow` command", + "labels": [] + }, + { + "number": 46547, + "title": "[NEXT-365] Remove `const app: any` definitions. Replace with specific type definitions", + "branch": "add/app-me-type", + "merged_at": "2025-12-17T21:53:55Z", + "changed_files": 6, + "additions": 46, + "deletions": 12, + "body": "Replace `any` with specific type definitions for all declarations of `app.me`.", + "labels": [] + }, + { + "number": 46538, + "title": "[NEXT-363] Migrate SDK Apis outline - workspace (minus widgets) that only have external dependencies", + "branch": "refactor/sdk-api-type-3", + "merged_at": "2025-12-17T20:19:45Z", + "changed_files": 125, + "additions": 215, + "deletions": 160, + "body": "https://sdk-api-type-3.mural.engineering", + "labels": [] + }, + { + "number": 46543, + "title": "[CWI-2468] Unified Image Panel - Image and Gif Panel fixes", + "branch": "add/cwi-2468", + "merged_at": "2025-12-17T19:58:24Z", + "changed_files": 5, + "additions": 326, + "deletions": 91, + "body": "Added Preview Handler for Images and Gifs\r\nUpdated the Image Tab\r\nUpdated Giphy Tab\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2468) to understand the context of this effort.\r\n- - Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2469) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46488, + "title": "ENGAGE-1119 - Invite to mural input field: parse multiple emails pasted", + "branch": "add/engage-1119", + "merged_at": "2025-12-17T18:35:04Z", + "changed_files": 3, + "additions": 42, + "deletions": 14, + "body": "Test env - https://engage-1119.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR enhances the email input functionality in the share mural modal by adding support for parsing multiple email addresses from pasted content. The implementation replaces a simple regex-based approach with the RFC-compliant `email-addresses` library (v5.0.0) and improves the space key handler to better distinguish email input from name searches.\r\n\r\n**Key changes:**\r\n- Integrates the `email-addresses` library to parse complex email formats including grouped addresses\r\n- Replaces regex-based email splitting with RFC6532-compliant parsing\r\n- Adds '@' symbol check to space key handler to prevent accidental email creation during name searches\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 2 out of 3 changed files in this pull request and generated 5 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/share-mural/email-input-list.tsx | Refactored `splitEmails` function to use email-addresses library for parsing, added '@' symbol validation to space key handler |\r\n| package.json | Added email-addresses v5.0.0 dependency |\r\n| package-lock.json | Locked email-addresses v5.0.0 dependency |\r\n\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46522, + "title": "[NEXT-362] Migrate Input, Toolbar, and Core `src/register/types.ts` types to `@muralco/canvas/register`", + "branch": "split-register-types", + "merged_at": "2025-12-17T17:21:17Z", + "changed_files": 145, + "additions": 638, + "deletions": 589, + "body": "## Overview\r\n\r\nThis PR begins breaking apart the `src/mural/register/types.ts` monolith by splitting types into logical, domain-specific modules within the `@muralco/canvas` package to support the modularization of the canvas. \r\n\r\n## Type Migrations\r\n\r\n### Core Register Types (`packages/canvas/src/register/types/`)\r\n\r\nSplit the monolith into three focused modules:\r\n\r\n1. **`core.ts`** - Foundational extension types:\r\n - `ExtensionArrayApi`\r\n - `ComponentExtension`\r\n - `ArrayValue`, `ArrayValueOrFn`, `ValueMapFn`\r\n - `NotFunctionOrArray`\r\n\r\n2. **`input.ts`** - User input handling types:\r\n - `KeyboardHandler` and `SyntheticMuralKeyboardEvent`\r\n - `MouseProcessor` and mouse event types\r\n - `SimpleTouchEvent`, `GestureEvent`, `TouchEventType`\r\n - `ContextualInformation` and `AppliesFn`\r\n\r\n3. **`toolbar.ts`** - Toolbar-related types:\r\n - `ToolBarItemButton`, `ToolBarItemDropdown`, `ToolBarItemGroup`\r\n - `ToolBarItemMenu`, `ToolBarItemSelector`\r\n - `ToolBarItemSpec` (deprecated, use `RegistrableTool` instead)\r\n - `AIToolBarDropdownOptionSpec`\r\n\r\n### Additional Type Migrations\r\n\r\n- **Addon Types** \u2192 `packages/canvas/src/addons/`\r\n - Export selection constants (`EXPORT_SELECTION_MURAL_MODE`, etc.)\r\n\r\n### SDK Type Migration\r\n\r\n- **`ProperMuralMode`** \u2192 `packages/canvas/src/sdk/apis/mural/mode.ts`\r\n - Moved from `src/mural/sdk/apis/mural/types.ts` to the SDK package\r\n - Now exported from `@muralco/canvas/sdk/apis`", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46521, + "title": "Implement conflict detection for plan changes in purchase flow", + "branch": "add/conflict-detection-purchase", + "merged_at": "2025-12-17T16:35:20Z", + "changed_files": 4, + "additions": 440, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds conflict detection for paid-to-paid plan modifications (feature-flagged) that blocks save and shows an inline notification to contact support.\r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\nTest env: TBD\r\nLoom video: TBD\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mura", + "labels": [] + }, + { + "number": 46523, + "title": "[NEXT-361] Migrate SDK APIs without external dependencies (engine - operations)", + "branch": "refactor/sdk-api-type-2", + "merged_at": "2025-12-17T15:33:36Z", + "changed_files": 234, + "additions": 422, + "deletions": 313, + "body": "https://sdk-api-type-2.mural.engineering\r\n\r\n", + "labels": [] + }, + { + "number": 46542, + "title": "[ESC-1854] Show download action on archived mural notification bar", + "branch": "add/esc-1854-archived-download", + "merged_at": "2025-12-17T15:18:59Z", + "changed_files": 4, + "additions": 146, + "deletions": 6, + "body": "Jira: [ESC-1854](https://mural.atlassian.net/browse/ESC-1854)\r\nTesting environment: https://esc-1854-archived-download.mural.engineering/\r\n\r\n### Summary \r\n\r\nAdd a download button to the archived mural notification bar. Clicking the button downloads the mural as a PDF. The button is visible on when the user has permission to export the mural.\r\n\r\nhttps://github.com/user-attachments/assets/00b5afac-3c68-4c8d-8dee-96109586d00e\r\n\r\n\r\n[ESC-1854]: https://mural.atlassian.net/browse/ESC-1854?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46506, + "title": "Refactor user/developer to apps package", + "branch": "refactor/user-develop-to-pkg", + "merged_at": "2025-12-17T14:58:14Z", + "changed_files": 8, + "additions": 112, + "deletions": 134, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactor _developer/app-related_ code by moving logic and deps from generic locations into the src/settings/user/developers package, improving code organization and reducing coupling between different parts of the codebase. This is an initial step to move that into a specific package.\r\n\r\n**Key changes:**\r\n\r\n- Moved app registration tracking functions from src/tracking/app-registration to src/settings/user/developers/tracking\r\n- Relocated and refactored the checkbox description list component from a generic UI component to a feature-specific component within the developers settings\r\n- Updated the checkbox component to use MrlCheckbox from the UI Toolkit instead of the legacy Checkbox component\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-359\r\n- Test env: https://user-develop-to-pkg.mural.engineering/", + "labels": [] + }, + { + "number": 46502, + "title": "[CAN-8136] Add new onboarding steps and convert to AB test", + "branch": "add/can-8136-onboarding", + "merged_at": "2025-12-17T14:03:50Z", + "changed_files": 35, + "additions": 877, + "deletions": 342, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR converts the navigation improvements feature from a simple feature flag to an A/B test implementation, adding two new onboarding steps (\"pan-button\" and \"current-zoom\") to guide users through the enhanced navigation controls. The navigation improvements addon now always runs but early returns based on the A/B test variant or feature flag override, allowing controlled rollout of the new experience.\r\n\r\nKey changes:\r\n\r\nNew A/B test integration with experiment variation tracking in state\r\nExtended canvas onboarding from 2 steps to 4 steps (when navigation improvements enabled)\r\nAnimation preloading system to prevent callout size snapping\r\nUpdated toolbar button adapter to prioritize callouts over menus for correct positioning\r\n\r\nFlag off, user does not qualify for AB test:\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\nNew onboarding: Flag on:\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8136) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8136-onboarding.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural", + "labels": [] + }, + { + "number": 46544, + "title": "[CWI-2503] Fetch integration connections only when there is CE data", + "branch": "fix/cwi-2503", + "merged_at": "2025-12-17T13:39:34Z", + "changed_files": 3, + "additions": 30, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFetch integration connections only when there is CE data\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2503", + "labels": [] + }, + { + "number": 46328, + "title": "IAM-2272 Added dropdown to select user types and roles", + "branch": "add/iam-2272-dropdowns", + "merged_at": "2025-12-17T12:57:03Z", + "changed_files": 7, + "additions": 487, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\nhttps://mural.atlassian.net/browse/IAM-2272\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2272) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://iam-2272-dropdowns.mural.engineering/))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference b", + "labels": [] + }, + { + "number": 46535, + "title": "Remove RESIZABLE_CANVAS_FEATURE_PARITY from gridlines", + "branch": "fix/gridoptions-enabled", + "merged_at": "2025-12-17T12:41:28Z", + "changed_files": 3, + "additions": 4, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR deletes `gridOptionsEnabled` and is part of the effort of removing the `RESIZABLE_CANVAS_FEATURE_PARITY` flag from the code because it's been enabled for everyone for years.\r\n\r\nNothing should change.\r\n\r\nEnv: https://gridoptions-enabled.mural.engineering", + "labels": [] + }, + { + "number": 46512, + "title": "[CAN-8246] Refactor dragging hook handlers to return a list of changes", + "branch": "refactor/dragging-hooks", + "merged_at": "2025-12-17T12:16:56Z", + "changed_files": 34, + "additions": 271, + "deletions": 344, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis is the last PR in a series ([1](https://github.com/tactivos/murally/pull/46369), [2](https://github.com/tactivos/murally/pull/46413), [3](https://github.com/tactivos/murally/pull/46422), [4](https://github.com/tactivos/murally/pull/46444), [5](https://github.com/tactivos/murally/pull/46487) & [6](https://github.com/tactivos/murally/pull/46495)) that comprehended refactoring the entire logic of the Smart Planner dragging plugin to return a list of accumulated changes instead of applying them directly.\r\nMotivation behind those changes can be found on each PR and also here below.\r\n\r\nIn this PR we first address two remaining refactors that were left over from the previous work, and then move onto the final goal of the entire effort: preventing dragging hook handlers from making changes in the widgets model directly.\r\n\r\nThe way this work is twofold:\r\n1. We modify the dragging hook interface so that every hook now is expected to return a list of accumulated changes.\r\n2. We add a protection to the hook handlers so that if they ever call `update`, `apply` or `commit` from within their implementation, a runtime error is thrown.\r\n\r\nRegarding 2, it would have been amazing to be able to write something that would detect this while coding, but while TS is pretty powerful, it's not _that_ powerful.\r\nMy believe is that anyone adding a call to `apply` from within a hook handler will probably want to test their implementation, and while doing that will found the error on screen and address it properly (also, they'll be forced to return an `ActionList` through their implementation, which should hint to them that they shouldn't be applying the changes themselves).\r\n\r\n**Note:** Every other PR in the series had no expected consequences in behavior because they were all mere refactors that moved the code around.\r\n\r\nThis is **not** the case here: there is a BIG impactful change here: Smart Planners are no longer committing change", + "labels": [] + }, + { + "number": 46548, + "title": "[ENGAGE-1449] Initialize salesforce chat even if this.me.fetch isnt called", + "branch": "beta-fix/engage-1449", + "merged_at": "2025-12-16T23:36:00Z", + "changed_files": 1, + "additions": 2, + "deletions": 3, + "body": "", + "labels": [] + }, + { + "number": 46546, + "title": "[ENGAGE-1449] Initialize salesforce when user is fetched. Add logging", + "branch": "beta-fix/engage-1449", + "merged_at": "2025-12-16T22:50:38Z", + "changed_files": 3, + "additions": 106, + "deletions": 34, + "body": "", + "labels": [] + }, + { + "number": 46513, + "title": "[CAN-8237] Fix onboarding UX", + "branch": "fix/ux-flow-issues", + "merged_at": "2025-12-16T21:00:32Z", + "changed_files": 13, + "additions": 270, + "deletions": 104, + "body": "Fix onboarding UX\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spac", + "labels": [] + }, + { + "number": 46346, + "title": "IAM-2273 Bulk actions", + "branch": "add/iam-2273-bulk-actions", + "merged_at": "2025-12-16T20:49:52Z", + "changed_files": 7, + "additions": 844, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds the bulk action bar and modal for changing member roles in bulk when RBAC is enabled\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2273) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n", + "labels": [] + }, + { + "number": 46531, + "title": "[ecomm-335] cancel scheduling subscription", + "branch": "add/ecomm-335", + "merged_at": "2025-12-16T20:39:12Z", + "changed_files": 9, + "additions": 300, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI add the functionality to cancel a subscription schedule.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-335) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Record\r\n\r\nhttps://www.loom.com/share/500dc0fd30834b0abe1145b4b155f415\r\n", + "labels": [] + }, + { + "number": 46407, + "title": "NEXT-119 - Package /invitation routes", + "branch": "add/next-119", + "merged_at": "2025-12-16T20:00:09Z", + "changed_files": 37, + "additions": 2375, + "deletions": 372, + "body": "## Pull request overview\r\n\r\nThis PR successfully packages invitation routes from `src/invitation/routes/` into a new internal package `@muralco/route-invitation`, consolidating invitation handling logic for murals, rooms, workspaces, and client app murals.\r\n\r\n**Key Changes:**\r\n- Created new package `@muralco/route-invitation` with comprehensive route components and utilities\r\n- Migrated 4 route components with complete test coverage (1,894 lines of tests)\r\n- Removed legacy code from `src/invitation/routes/` (deleted `utils.ts` with ~28 lines)\r\n- Updated imports in `src/invitation/routes/index.tsx` to use the new package\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 25 out of 28 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/invitation/routes/utils.ts` | Deleted legacy utility functions, now packaged |\r\n| `src/invitation/routes/index.tsx` | Updated imports to use `@muralco/route-invitation` package |\r\n| `packages/route-invitation/package.json` | New package configuration with proper dependencies |\r\n| `packages/route-invitation/src/index.ts` | Package exports for route components, utilities, and types |\r\n| `packages/route-invitation/src/utils/invitation-route.tsx` | HOC for side-effect routes with JSDoc documentation |\r\n| `packages/route-invitation/src/utils/cannot-accept.ts` | Utility for handling invitation rejection flow |\r\n| `packages/route-invitation/src/utils/common.ts` | Shared utilities for tracking and onboarding |\r\n| `packages/route-invitation/src/types/index.ts` | Type definitions for invitation queries and errors |\r\n| `packages/route-invitation/src/routes/InvitationWorkspaceRoute.tsx` | Workspace invitation route with named export |\r\n| `packages/route-invitation/src/routes/InvitationWorkspaceRoute.test.tsx` | Comprehensive tests (506 lines) for workspace invitations |\r\n| `packages/route-invitation/src/routes/InvitationRoomRoute.ts", + "labels": [] + }, + { + "number": 46537, + "title": "[CWI-2502] - Fix: duplicating smart planner error", + "branch": "fix/cwi-2502-planner-duplicate-bug", + "merged_at": "2025-12-16T19:32:43Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThere was a regression caused by some updates to CE data and the auto-panel opening that causes the app to crash when duplicating a smart planner with content selected. This is due to a timing issue with the panel opening immediately and some planner functions trying to access properties before they are populated on the board's CE state.\r\n\r\nThe fix adds an additional check for CE board data before accessing other functions. \r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/CWI-2502\r\nTest env:\r\n\r\nTo test: create a smart planner, then try to duplicate with cmd+D, choose 'board + content' from the duplicate modal, and see that the board is duplicated correctly without errors\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's", + "labels": [] + }, + { + "number": 46536, + "title": "[CWI-2503] Temporarily remove bulk sync for integrations platform", + "branch": "stable-fix/cwi-2503", + "merged_at": "2025-12-16T19:03:30Z", + "changed_files": 1, + "additions": 0, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\nTemporarily remove bulk sync for integrations platform\r\n\r\n#### Reviewer Resources\r\nhttps://mural.atlassian.net/browse/CWI-2503", + "labels": [] + }, + { + "number": 46210, + "title": "[CWI-2423] Integrations Platform - Add integration connections and OAuth flow", + "branch": "add/cwi-2423", + "merged_at": "2025-12-16T17:09:15Z", + "changed_files": 6, + "additions": 248, + "deletions": 0, + "body": "### What changes does this PR introduce?\r\nIntegrations Platform - Add integration connections and OAuth flow\r\n\r\n### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2423\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-api/pull/14937\r\nhttps://github.com/tactivos/healthcheck/pull/369\n\n\n---\n\n> [!NOTE]\n> Adds `/integrations-platform/oauth-callback` route and component to handle OAuth callback with session check, API call, messaging, window-close logic, and tests; includes minor styling and a new dependency.\n> \n> - **Integrations Platform OAuth**:\n> - **Route**: Adds `'/integrations-platform/oauth-callback'` in `routes/index.tsx`.\n> - **Component**: New `IntegrationsPlatformOAuthCallback` handles session check/redirect, posts to `'/api/v0/integrations-platform/oauth-callback'` with picked query params, shows loading/success/failure states, displays error details, and closes the window if opened by a parent.\n> - **Styles**: Adds `styles.module.sass` for callback layout.\n> - **Tests**:\n> - Adds `oauth-callback.test.tsx` covering loading, redirect without session, success/failure paths, API error handling, and window closing behavior.\n> - **Dependencies**:\n> - Adds `react-helmet-async` to `@muralco/integrations`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 29603757d522dd35ddfc5f3da2f107eb06ffa1c1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46518, + "title": "Migrate copy & unified-images register types to `@muralco/canvas/register`", + "branch": "register-types", + "merged_at": "2025-12-16T16:58:19Z", + "changed_files": 48, + "additions": 76, + "deletions": 70, + "body": "## Pull request overview\r\n\r\nThis PR migrates type definitions for clipboard copy operations, text editor features, and unified images panel from local register directories to the centralized `@muralco/canvas/register` package. This consolidation improves code organization and makes these types available as a shared package dependency.\r\n\r\n**Key Changes:**\r\n- Moved `CopyHandler`, `CopyMetadata`, `CopyFn`, and `ClipboardBuckets` types to `@muralco/canvas/register`\r\n- Moved `TextEditorFeatures` and related text editor types to `@muralco/canvas/register`\r\n- Moved unified images panel types (`UnifiedImagesPanelRegionSpec`, `UnifiedImagesPanelSearchProviderSpec`) to `@muralco/canvas/register`", + "labels": [] + }, + { + "number": 46517, + "title": "[ESC-1834] Show unarchive action on notification bar", + "branch": "add/esc-1834-unarchive", + "merged_at": "2025-12-16T16:44:36Z", + "changed_files": 3, + "additions": 29, + "deletions": 22, + "body": "Jira: [ESC-1834](https://mural.atlassian.net/browse/ESC-1834)\r\nTesting environment: https://esc-1834-unarchive.mural.engineering/\r\n\r\n### Summary\r\n\r\n- Show unarchive action on archive mural notification bar when user has permission to unarchive.\r\n- Use permissions to determine if user can archive/unarchive mural instead of checking the mural creator.\r\n\r\n\r\n\r\n[ESC-1834]: https://mural.atlassian.net/browse/ESC-1834?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46457, + "title": "NEXT-118 - Package /invitation/verify-email route", + "branch": "add/next-118", + "merged_at": "2025-12-16T16:21:04Z", + "changed_files": 18, + "additions": 647, + "deletions": 74, + "body": "Test env - https://next-118.mural.engineering\r\n\r\n---\r\n\r\n## Pull request overview\r\n\r\nThis PR extracts the `/invitation/verify-email` route from the main codebase into a standalone package `@muralco/route-invitation-verify-email`. The migration modernizes the component by converting it from a class component to a functional component with hooks and updates it to use the UI Toolkit.\r\n\r\n- Migrates from class-based to functional React component with hooks\r\n- Replaces legacy component patterns with modern UI Toolkit components (MrlText, MrlTextHeading)\r\n- Creates a properly structured internal package with comprehensive test coverage\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 16 out of 18 changed files in this pull request and generated 4 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/invitation/routes/verify-email.tsx` | Removes the old class-based VerifyEmail component from the main codebase |\r\n| `src/invitation/routes/index.tsx` | Updates import to use the new package instead of local file |\r\n| `packages/route-invitation-verify-email/src/VerifyEmail.tsx` | New functional component using hooks, UI Toolkit components, and modern API integration |\r\n| `packages/route-invitation-verify-email/src/VerifyEmail.test.tsx` | Comprehensive test suite with 235 lines covering rendering, interactions, error handling, and accessibility |\r\n| `packages/route-invitation-verify-email/src/index.ts` | Package entry point exporting VerifyEmail component |\r\n| `packages/route-invitation-verify-email/package.json` | Package configuration with proper dependencies and peer dependencies |\r\n| `packages/route-invitation-verify-email/tsconfig.json` | TypeScript configuration for React package |\r\n| `packages/route-invitation-verify-email/jest.config.js` | Jest test configuration |\r\n| `packages/route-invitation-verify-email/README.md` | Comprehensive documentation with usage examples and features |\r\n| `package.json` | Adds n", + "labels": [] + }, + { + "number": 46496, + "title": "[ESC-1855] Don't unexpectedly show tools for an archived mural", + "branch": "add/esc-1855-archived-controls", + "merged_at": "2025-12-16T16:06:47Z", + "changed_files": 2, + "additions": 41, + "deletions": 1, + "body": "Jira: [ESC-1855](https://mural.atlassian.net/browse/ESC-1855)\r\nTesting environment: https://esc-1855-archived-controls.mural.engineering/\r\n\r\n### Summary\r\n\r\nPrevent tools--like the mural title menu and facilitation controls--from showing for an archived mural when pressing SPACE (i.e. activating pan mode).\r\n\r\n### Example: Press and hold SPACE on an archived mural\r\n\r\n#### Before\r\n\r\nShows tools like the mural title menu:\r\n\r\nhttps://github.com/user-attachments/assets/dc315ae8-0b40-44d5-bd3b-c296ce80c3c4\r\n\r\n#### After\r\n\r\nBehaves like a read-only mural; doesn't show tools and doesn't activate move mode:\r\n\r\nhttps://github.com/user-attachments/assets/dac86d63-4df9-4576-aeb7-a34cca99a283\r\n\r\n\r\n[ESC-1855]: https://mural.atlassian.net/browse/ESC-1855?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46378, + "title": "[ESC-1820] refactor: update JobRun type to use muralsRefs instead of murals", + "branch": "add/esc-1820", + "merged_at": "2025-12-16T15:02:28Z", + "changed_files": 3, + "additions": 5, + "deletions": 60, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- fix typing\r\n\r\nhttps://github.com/tactivos/mural-api/pull/15019\r\nhttps://github.com/tactivos/healthcheck/pull/370\n\n\n---\n\n> [!NOTE]\n> Replaces detailed `murals` objects with `muralsRefs: string[]` in `JobRun` results and updates tests/mocks to match.\n> \n> - **Types**:\n> - Update `packages/api/src/companies.ts`: `JobRun.result.policies[].rules[].result` now uses `muralsRefs: string[]` (removes detailed `murals` objects).\n> - **Tests/Mocks**:\n> - Adjust `packages/enterprise-security/src/data-retention/job-runs.test.tsx` and `packages/enterprise-security/src/test/mocks/data-retention.ts` to expect/provide `muralsRefs` instead of `murals`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 79b0594ece27e646558df28e6e0da5b4e766ec39. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46529, + "title": "[EN-3545] fix: push to browser history", + "branch": "fix/en-3545-push", + "merged_at": "2025-12-16T14:39:46Z", + "changed_files": 2, + "additions": 3, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe [initial implementation](https://github.com/tactivos/murally/pull/28563/changes) of `withCompany` used `replace` instead of `push`, thus not writing to the browser history.\r\n\r\nI do not see an evidence of why we should not write to history, hence replacing it is giving us the expected browser behavior.\r\n\r\nI also cleaned up a redundant constant.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**EN-3545**](https://mural.atlassian.net/browse/EN-3545)\r\n- \ud83e\uddea [**en-3545-push.mural.engineering**](https://en-3545-push.mural.engineering/)\r\n- \ud83c\udfac demo incoming", + "labels": [] + }, + { + "number": 46528, + "title": "[CAN-8200] Exclude widgets whose parents are also in the selection", + "branch": "fix/can-8200-again", + "merged_at": "2025-12-16T14:26:02Z", + "changed_files": 2, + "additions": 27, + "deletions": 2, + "body": "This PR excludes from adding to an area any widget with a parent whose parent is also in the selection being added.\r\n\r\nMake sure the `ENABLE_ABSORPTION_SYSTEMS` flag is disabled for testing this.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/9e4d81a7-a916-445e-8436-15a36862447b)\r\n\r\nMaster:\r\n![master](https://github.com/user-attachments/assets/766f209d-32ef-47ab-b6c4-0ace3ed01e04)\r\n\r\nTicket: https://mural.atlassian.net/browse/CAN-8200\r\nEnv: https://can-8200-again.mural.engineering", + "labels": [] + }, + { + "number": 46530, + "title": "[CWI-2486] Fix - BulkSyncManager - Service of type jiraCloud is already registered", + "branch": "beta-fix/cwi-2486", + "merged_at": "2025-12-16T14:11:08Z", + "changed_files": 1, + "additions": 6, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - BulkSyncManager - Service of type jiraCloud is already registered\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2486", + "labels": [] + }, + { + "number": 46520, + "title": "[SCQM-1521] Update copy for company colors and themes setting", + "branch": "beta-fix/themes-settings-copy", + "merged_at": "2025-12-15T23:43:45Z", + "changed_files": 2, + "additions": 6, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBring back mentions of 'themes'\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1521) to understand the context of this effort.\r\n\r\n\"Screenshot\r\n\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://themes-settings-copy.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. View the copy on the company settings page for 'canvas colors' `/c/internal-sso/settings/colors`\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46443, + "title": "Refactor user integrations routes to be moved to a package", + "branch": "refactor/user-integration-routes", + "merged_at": "2025-12-15T22:24:28Z", + "changed_files": 42, + "additions": 266, + "deletions": 368, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFirst effort to refactor user settings-related code to make it easier to move it to a package. Involves consolidating user integration routes within the `src/settings/user/integrations/` directory structure and replacing legacy UI definitions by UI Toolkit.\r\n\r\nKey changes include:\r\n- Migration of integration cards (connected, explore, request) from views to settings/user/integrations\r\n- Replacement of legacy UI components with modern UI Toolkit equivalents (MrlButton, MrlBadge, MrlMenu, etc.)\r\n- Consolidation of shared components (AppIcon) into the @muralco/settings-commons package\r\n- Relocation of Slack tracking functions to the @muralco/integrations package\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-357\r\n- Test env: https://user-integration-routes.mural.engineering/", + "labels": [] + }, + { + "number": 46514, + "title": "[CWI2478] Cleanup unused search state; Remove preview size that matches default", + "branch": "add/cwi-2478-no-search", + "merged_at": "2025-12-15T21:25:28Z", + "changed_files": 8, + "additions": 6, + "deletions": 58, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis keeps search state localized to the individual components rendered by the regions. Moving to a central state kept for the sidebar was overly complicated and not providing any benefit for the desired end result.\r\n\r\n- Cleanup unused search state\r\n- Remove preview size that matches default\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spac", + "labels": [] + }, + { + "number": 46472, + "title": "[NEXT-351] Modularize additional decoupled `src/mural/dispatcher` files", + "branch": "dispatcher-files-1", + "merged_at": "2025-12-15T21:10:51Z", + "changed_files": 61, + "additions": 218, + "deletions": 159, + "body": "### Overview\r\n\r\nMigrates remaining `src/mural/dispatcher` files that were decoupled with no external dependencies into the `@muralco/canvas` package. This continues the modularization effort to improve code organization and reduce coupling between the main application and canvas-specific dispatcher logic.\r\n\r\n### Changes\r\n\r\n#### Files Migrated to `packages/canvas/src/dispatcher/`\r\n\r\nThe following dispatcher modules have been moved from `src/mural/dispatcher/` to `packages/canvas/src/dispatcher/`:\r\n\r\n- **`dom/`** - DOM-related types (`Cursor`, `DomApi`)\r\n- **`find-and-replace/`** - Find and replace utilities (`locked-result-widget-feedback.ts`)\r\n- **`mural/`** - Mural-specific functionality (`publish-as-template.tsx`, `style.sass`)\r\n- **`navigation/`** - Navigation utilities (`util.ts` - `minimapToMuralCoords`)\r\n- **`onboarding/`** - Onboarding utilities (`util.ts` - `getInviteeOnboardingData`)\r\n- **`selection/`** - Selection utilities (`group-widgets.ts`)\r\n- **`widgets/comments/`** - Comment-related utilities (`util.ts` - mentions, resolution logic)\r\n- **`widgets/connector/`** - Connector utilities (`connector-point.ts`, `labels-text.ts`)\r\n- **`widgets/locking/`** - Widget locking functionality (`types.tsx`, `unlock-all-facilitator-modal.tsx`)\r\n\r\n#### Dependencies Added\r\n\r\nAdded the following dependencies to `packages/canvas/package.json`:\r\n- `@muralco/browser-storage`\r\n- `@muralco/legacy-ui`\r\n- `@muralco/shared`\r\n", + "labels": [] + }, + { + "number": 46516, + "title": "[CWI-2486] Fix - BulkSyncManager - Service of type jiraCloud is already registered", + "branch": "fix/cwi-2486", + "merged_at": "2025-12-15T20:56:11Z", + "changed_files": 1, + "additions": 6, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFix - BulkSyncManager - Service of type jiraCloud is already registered\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2486", + "labels": [] + }, + { + "number": 46454, + "title": "[NEXT-360] Move SDK api types A-D with only external dependencies", + "branch": "refactor/sdk-api-type-1", + "merged_at": "2025-12-15T20:35:29Z", + "changed_files": 173, + "additions": 307, + "deletions": 222, + "body": "Test env: https://sdk-api-type-1.mural.engineering/", + "labels": [] + }, + { + "number": 46479, + "title": "[SCQM-1504] Update feedback toast style", + "branch": "update/feedback-toast-style", + "merged_at": "2025-12-15T20:25:32Z", + "changed_files": 3, + "additions": 10, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAligns style of `FeedbackToast` component with latest FEP toast changes. Both lines should be the same size, there should be -4 space between the two lines, and the horizontal spacing should be as shown in the screenshot below.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1504) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://feedback-toast-style.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n1. Generate ideas\r\n2. Accept preview mode\r\n3. Verify the feedback toast matches what's in the ticket:\r\n\"Screenshot\r\n\r\n\r\nMy screenshot:\r\n\"Screenshot\r\n\r\n\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46495, + "title": "[CAN-8243] [CAN-8245] Refactor `afterDragMove` and `afterDragEnd` to do one `apply` and `commit` per call", + "branch": "refactor/after-drag-move", + "merged_at": "2025-12-15T18:50:06Z", + "changed_files": 15, + "additions": 176, + "deletions": 78, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the code for the `afterDragMove` and `afterDragEnd` hook handlers from the `KanbanBoardDragPlugin` class to minimize the number of calls to `widgets.changes.apply`.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**CAN-8243**](https://mural.atlassian.net/b", + "labels": [] + }, + { + "number": 46456, + "title": "[CWI-2462] Unified Image Panel feature", + "branch": "add/features-unified-images", + "merged_at": "2025-12-15T18:38:49Z", + "changed_files": 21, + "additions": 1349, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR is a merge of feature branch for Unified Images. CWI is working on a revamp of the images side panel and its utilizing a similar approach for search , regions and register API as the Unified Cloud Icons work that was done. This feature is behind a feature flag. Its still WIP and we wanted to merge this so that we can continue to work on individual tickets and keep the PR's small.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2462) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+St", + "labels": [] + }, + { + "number": 46497, + "title": "[SCQM-1525] Add node counts to diagram success and fail events", + "branch": "add/diagram-widget-count", + "merged_at": "2025-12-15T18:20:36Z", + "changed_files": 3, + "additions": 21, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds additional context to `diagram_complete_success` to gauge the size of diagrams users are creating.\r\n`nodeCount` - how many shapes there are in the diagram\r\n`arrowCount`- how many connectors\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1525) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://diagram-widget-count.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Run diagramming with console open \r\n2. Verify tracking event `diagram_complete_success` has new data:\r\n\r\n\"Screenshot\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46508, + "title": "[ESC-1835] Clarify view only tag tooltip for archived murals", + "branch": "add/esc-1835-archived-tooltip", + "merged_at": "2025-12-15T17:58:43Z", + "changed_files": 2, + "additions": 68, + "deletions": 5, + "body": "Jira: [ESC-1835](https://mural.atlassian.net/browse/ESC-1835)\r\nTesting environment: https://esc-1835-archived-tooltip.mural.engineering/\r\n\r\n### Summary\r\n\r\nClarify view only tag tooltip for archived murals.\r\n\r\nAs mural owner:\r\n\"image\"\r\n\r\nAs mural member:\r\n\"image\"\r\n\r\n\r\n[ESC-1835]: https://mural.atlassian.net/browse/ESC-1835?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46503, + "title": "[NEXT-356] Move resize/user/outline/network state into packages", + "branch": "fix/next-356-2", + "merged_at": "2025-12-15T17:14:19Z", + "changed_files": 62, + "additions": 219, + "deletions": 205, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis PR move into packages:\r\n* Resize state\r\n* User state\r\n* Outline state\r\n* Network state and SDK\r\n\r\nThe environment: https://next-356-2.mural.engineering/", + "labels": [] + }, + { + "number": 46356, + "title": "[CPT-2479] Add and remove favorite event based actions", + "branch": "add/favorite-event-based", + "merged_at": "2025-12-15T16:24:41Z", + "changed_files": 20, + "additions": 624, + "deletions": 209, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR implement the event based actions pattern for the add and remove templates from starred.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2479) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://favorite-event-based.mural.engineering/) to perform a smoke test.\r\n\r\nSince this is involves no feature changes we just need to check for regressions in the dashboard. To do this we should check if the action of adding and removing starred from a template works fine in every place a card appears in the dashboard, that includes:\r\n\r\n- Role page\r\n- Use cases page\r\n- Recents page (templates tab)\r\n- Starred page (templates tab) (in this one you can only remove from starred \ud83d\ude05 )\r\n- Templates page\r\n- Search results page (templates tab)\r\n- Profile page\r\n\r\nThe test should include the following:\r\n\r\n- Click the `Add to Starred` action on the template. Verify that a POST request was made to `/api/v0/templates/favorites`. Verify that a tracking event for this action is fired.\r\n- Verify that the template now has the action `Remove from Starred` now instead of `Add to Starred`.\r\n- Click the `Removed from Starred` action on the template. Verify that a DELETE request was made to `/api/v0/templates/favorites`. Verify that a tracking event for this action is fired.\r\n- Verify that the template now has the action `Add to Starred` now instead of `Remove from Starred`.\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduce a centralized template event store and star/unstar action registrations, refactoring template cards and views to use event-driven favorites ", + "labels": [] + }, + { + "number": 46490, + "title": "[IAM-2261] feat: connect directly the WorkspaceUsers component", + "branch": "feat/iam-2261-cleanup", + "merged_at": "2025-12-15T14:54:47Z", + "changed_files": 149, + "additions": 61, + "deletions": 13377, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nClean up the Optimizely flag so that we always serve the packaged version of the Workspace User table.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2261**](https://mural.atlassian.net/browse/IAM-2261)\r\n- \ud83e\uddea [**iam-2261-cleanup.mural.engineering**](https://iam-2261-cleanup.mural.engineering/)\r\n- \ud83c\udfac No recorded demo\r\n\r\nFor ease of use, you can log in as the following workspace admin to access the table:\r\n\r\n```\r\nusername: maximo_connelly@ves.ink\r\npassword: kSEQZvjMB18Dg9kEEvpA\r\n```", + "labels": [] + }, + { + "number": 46504, + "title": "Add 'widgets.changes.debug.createActionBuilder' to use ActionBuilder in REPL context", + "branch": "add/create-action-builder", + "merged_at": "2025-12-15T14:07:13Z", + "changed_files": 2, + "additions": 9, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis is a small PR to add a way to create an ActionBuilder from within a REPL context (like the browser's developer console.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457", + "labels": [] + }, + { + "number": 46491, + "title": "Fix font size for empty cell on migrated murals - CWI-2456", + "branch": "fix/table-cell-font-size", + "merged_at": "2025-12-15T13:37:02Z", + "changed_files": 7, + "additions": 208, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCreated a new addon to fix all the scaling issues.\r\nAdded logic to calculate the font size of empty cells to be 1/6th of the cell height.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces", + "labels": [] + }, + { + "number": 46494, + "title": "[CWI-2448] Update to hide parent selector for JDC", + "branch": "fix/cwi-2448-hide-parent", + "merged_at": "2025-12-12T21:19:06Z", + "changed_files": 2, + "additions": 24, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Hide parent selector for JDC instances. See https://mural.atlassian.net/browse/CWI-2448?focusedCommentId=356819 for full explanation.\r\n\r\nJira Cloud:\r\n\"image\"\r\n\r\n\r\nJDC:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/s", + "labels": [] + }, + { + "number": 46440, + "title": "[ENGAGE-1437] Fix blank screen when user tries to see the dashboard", + "branch": "beta-fix/blank-screen-dashboard", + "merged_at": "2025-12-12T20:13:23Z", + "changed_files": 3, + "additions": 34, + "deletions": 1, + "body": "## Pull request overview\r\n\r\nIt was fixed in the backend with this PR: https://github.com/tactivos/mural-api/pull/15039 by giving a valid value to the timestamp attribute, but just in case we decided to strengthen the UI with this update.\r\n\r\nThis PR fixes a blank screen issue on the dashboard (ENGAGE-1437) by adding validation for the `creationTime` timestamp in the Satismeter component. The fix prevents invalid Date objects from causing runtime errors when converting timestamps to ISO 8601 format.\r\n\r\n**Key Changes:**\r\n- Added validation method `getValidISOString()` to safely handle timestamp conversion\r\n- Added `@muralco/logger` dependency for error logging\r\n- Returns `undefined` for invalid timestamps (filtered by `omitBy`)\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 2 out of 3 changed files in this pull request and generated 4 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `packages/legacy-ui/src/ui/components/satismeter/satismeter.tsx` | Adds timestamp validation and error handling to prevent invalid Date creation |\r\n| `packages/legacy-ui/package.json` | Adds logger dependency for validation warnings |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1437) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://blank-screen-dashboard.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the ", + "labels": [] + }, + { + "number": 46493, + "title": "[PLAY-788] Coresignal should fall back to multi_source if employee is not found in clean endpoint", + "branch": "fix/coresignal-fallback-user-bug", + "merged_at": "2025-12-12T19:53:34Z", + "changed_files": 1, + "additions": 1, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis type check was too strict and failing for multi_source fallback\r\n\r\n[BE PR](https://github.com/tactivos/mural-api/pull/15059)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-788) to understand the context of this effort.\r\n \r\ndemo: https://www.loom.com/share/a1e712008c134c599dc8e974fbb16406\r\n\r\n\"Screenshot\r\n\r\n", + "labels": [] + }, + { + "number": 46487, + "title": "[CAN-8241] Refactor `moveBetweenColumns` to return a list of changes", + "branch": "refactor/move-between-columns", + "merged_at": "2025-12-12T19:31:32Z", + "changed_files": 11, + "additions": 95, + "deletions": 64, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the code for the `moveBetweenColumns` function from the `KanbanBoardCardsApi` class to only accumulate changes and return them back to the caller, instead of applying them directly.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mur", + "labels": [] + }, + { + "number": 46385, + "title": "[NExT-344] Move billing tracking methods to package.", + "branch": "move/billing-tracking-package", + "merged_at": "2025-12-12T19:04:46Z", + "changed_files": 61, + "additions": 237, + "deletions": 214, + "body": "Started by moving `recordEventWithContext()` to tracking package, then moved a few other billing tracking functions and constants.\r\n\r\nThen updated all imports", + "labels": [] + }, + { + "number": 46473, + "title": "[CWI-2483] Integrations Platform - Bulk Sync", + "branch": "add/cwi-2483", + "merged_at": "2025-12-12T18:49:31Z", + "changed_files": 27, + "additions": 971, + "deletions": 558, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform - Bulk Sync\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2483\n\n\n---\n\n> [!NOTE]\n> Refactors BulkSyncManager to register sync services statically and adds a SystemOfRecord sync service, updating Jira Cloud registration, tracking, SDK APIs, and tests.\n> \n> - **Bulk Sync Core**:\n> - Refactor `BulkSyncManager` to statically register services via `registerService`, maintain global initialized services, and centralize error handling.\n> - Move bulk-sync types to `business/integrations/bulk-sync/types` and update imports.\n> - Remove constructor `SdkContext` dependency; methods now use registered services.\n> - **Jira Cloud**:\n> - Register Jira service with `BulkSyncManager.registerService(new JiraSyncService(ctx))` in `addons/jira-cloud`.\n> - Update Jira sync service to extend new shared types; minor constructor/init tweaks.\n> - **System of Record (SoR)**:\n> - Add `SystemOfRecordSyncableService` implementing bulk sync (batch fetch, conflict detection, sync) and comprehensive tests.\n> - Register SoR services per CE type in `addons/system-of-record/common`.\n> - Extract `FETCH_RECORD_DATA_BATCH_SIZE` constant and reuse in import/sync flows.\n> - Generic improvements to CE-related helpers (`updateWidgetFromCEAndRecordData`, `updateRecordInCE`, `updateRecordInCeAndSor`).\n> - **SDK/API**:\n> - Add `systemOfRecord.connections.getValidConnectionSync` and expose via SDK API.\n> - Add `SorContentExtensionTypeByName` typing utility.\n> - **UI/Tracking**:\n> - Update bulk sync prompt/execute flow to use new manager (no ctx), maintain toasts and tracking.\n> - **Cleanup**:\n> - Remove obsolete batching and service factory (`sync-services/batch.ts`, `sync-services/index.ts`).\n> - **Tests & E2E**:\n> - Update unit tests to new registration pattern and types; add SoR service tests.\n> - Add BDD feature for context-menu bulk sync visibility.\n> \n> Written", + "labels": [] + }, + { + "number": 46459, + "title": "[PLAY-786] Use Base API for Company Profile Widgets", + "branch": "update/coresignal-company-call", + "merged_at": "2025-12-12T18:13:01Z", + "changed_files": 6, + "additions": 294, + "deletions": 77, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUse base API instead of multi_source\r\n\r\n[backend PR](https://github.com/tactivos/mural-api/pull/15044)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-786) to understand the context of this effort.\r\n\r\ndemo: \r\nhttps://www.loom.com/share/8ecedd524e704517ba3503c7100e5b7c\r\n", + "labels": [] + }, + { + "number": 46481, + "title": "ENGAGE-1447 Remove Remaining Dashboard Route Logic From V1", + "branch": "remove/remaining-dashaboard-v1", + "merged_at": "2025-12-12T17:15:27Z", + "changed_files": 10, + "additions": 406, + "deletions": 133, + "body": "# Remove Remaining Dashboard Route References from v1 Cucumber Tests\r\n\r\n## Summary\r\n\r\nThis PR removes the last remaining references to the `/dashboard` route from v1 Cucumber test infrastructure by migrating those tests to Jest unit tests and v2. All v1 Cucumber feature files that used the deprecated `/dashboard` route have been removed and replaced with Jest tests and v2.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1447\r\n\r\n## What Changed\r\n\r\n### Removed (v1 Cucumber Tests)\r\n- \u274c `features/canvas/async/unread-notifications/last-seen-mural.feature` - Used `/dashboard` route\r\n- \u274c `features/canvas/topbar/back/back-button.feature` - Used `/dashboard` route\r\n- \u274c `features/learning/learning-topbar.feature` - Used \"dashboard learning\" route reference\r\n\r\n### Added (Jest Unit Tests)\r\n- \u2705 `src/dashboard/common/breadcrumbs.test.tsx` - Breadcrumbs component tests\r\n- \u2705 `src/dashboard/learning/header/index.test.tsx` - Learning header component tests\r\n- \u2705 `src/mural/dispatcher/async/last-seen-mural.test.ts` - Last seen mural dispatcher tests\r\n\r\n### Updated\r\n- Migrated `back-button.feature` from v1 to v2 cucumber format (updated routes to `/t/${W.username}/home`)\r\n- Updated test infrastructure mocks and step definitions\r\n\r\n## Code Coverage\r\n\r\n**v1 (Cucumber)**: Integration test coverage via NYC/Istanbul (`npm run test:react:cc`)\r\n- Coverage includes all source files (`src/**/*.{ts,tsx,js}`)\r\n\r\n**v2 (Jest)**: Unit test coverage via Jest built-in (`npm run test:unit:cc`)\r\n- Coverage includes files imported by tests\r\n- Provides component-level granularity\r\n\r\n## Impact\r\n\r\n\u2705 **Removed all `/dashboard` route references from v1 test infrastructure**\r\n\u2705 Migrated to Jest for faster, more maintainable unit tests\r\n\u2705 Improved test coverage granularity (component-level vs integration-level)", + "labels": [] + }, + { + "number": 46453, + "title": "[NEXT-351] Migrate lots of `dispatcher` types to `@muralco/canvas/dispatcher`", + "branch": "dispatcher-types", + "merged_at": "2025-12-12T17:03:55Z", + "changed_files": 194, + "additions": 292, + "deletions": 200, + "body": "This PR modularizes all `dispatcher` types that were decoupled from any external dependencies.\r\n\r\n### Dispatcher Types Migrated\r\n\r\n\r\n- canvas\r\n- activity\r\n- billing\r\n- clipboard\r\n- educational\r\n- experiments\r\n- features\r\n- file-preview\r\n- find\r\n- focus-mode\r\n- gridlines\r\n- integrations\r\n- members\r\n- modals\r\n- moveEditMode\r\n- navigation\r\n- notification-bar\r\n- outline\r\n- permissions\r\n- screen-reader\r\n- selection\r\n- snippets\r\n- tags\r\n- temporary-mural\r\n- themes\r\n- ticket\r\n- video\r\n- view\r\n- viewport\r\n- widget-api-error-handler\r\n- widget-toolbar\r\n- widgets pointer\r\n- widgets connector\r\n- widgets quickadd\r\n- widgets rotate\r\n- workspaces\r\n- facilitation\r\n- menus", + "labels": [] + }, + { + "number": 46480, + "title": "ECOMM-311 ECOMM-312 ECOMM-313 ECOMM-314 Migrating Remaining V1 Monetization Tests", + "branch": "add/remaining-monetization-tests", + "merged_at": "2025-12-12T16:51:59Z", + "changed_files": 16, + "additions": 847, + "deletions": 876, + "body": "## Summary\r\n\r\nMigrated remaining monetization/billing tests from Cucumber v1 to Jest v2.\r\n\r\n**Changes:**\r\n- Converted 3 Cucumber feature files to Jest unit tests:\r\n - `billing/index.feature` \u2192 `billing.test.tsx`\r\n - `billing/quantity.feature` \u2192 `limit-collaborators.test.tsx`\r\n - `workspace-settings/profile/index.feature` \u2192 moved to new location and updated\r\n- Added test helpers (`test-helpers.ts`) for billing test utilities\r\n- Added Jest tests for `invite-settings` component\r\n- Moved `dispatcher/mural/view.feature` to new test location\r\n\r\n**Files:**\r\n- Removed 3 old Cucumber feature files (738 lines)\r\n- Added 5 new Jest test files (841 lines)\r\n- Net: +103 lines\r\n\r\nAll tests migrated to Jest v2 testing patterns.\r\n\r\nTickets: \r\n\r\n- https://mural.atlassian.net/browse/ECOMM-311\r\n- https://mural.atlassian.net/browse/ECOMM-312 \r\n- https://mural.atlassian.net/browse/ECOMM-313 \r\n- https://mural.atlassian.net/browse/ECOMM-314\r\n\r\n# Monetization V1 Tests Migration Summary\r\n\r\n## Overview\r\n\r\nAll monetization v1 (billing) tests have been successfully migrated from Rig v1 to Rig v2, moving from page-based component testing to Cucumber feature file-based testing.\r\n\r\n## Migration Stats\r\n\r\n- **19 feature files** migrated to `src/test/react-new/features/billing/`\r\n- **71 test scenarios** covering all billing functionality\r\n- **From**: React component wrappers (`src/test/react/pages/billing.tsx`)\r\n- **To**: Cucumber feature files (`src/test/react-new/features/billing/*.feature`)\r\n\r\n## Coverage\r\n\r\nTests cover subscription management, payment processing, billing calculations, purchase flows, notifications, billing settings, invoice management, and enterprise features.\r\n\r\n## Benefits\r\n\r\n- Modern Cucumber/Gherkin framework for better readability\r\n- Improved test organization with feature-based structure\r\n- Better CI integration with Rig v2 infrastructure\r\n- Consistent patterns with other migrated test suites\r\n\r\n## Status\r\n\r\n\u2705 **Complete** - All tests pass in Rig v2 and maintain equivalen", + "labels": [] + }, + { + "number": 46485, + "title": "[CAN-8262] Update copy for new navigation settings modal", + "branch": "add/can-8262", + "merged_at": "2025-12-12T16:17:43Z", + "changed_files": 2, + "additions": 6, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWe are updating the copy for the new navigation settings modal and modal trigger. We are also updating the tool's ID for the tracking to match the existing tool.\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8262) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8262.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46435, + "title": "[SCQM-1503] Update company theme icons", + "branch": "update/theme-icons", + "merged_at": "2025-12-12T15:31:51Z", + "changed_files": 5, + "additions": 12, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUses new 'themes' and 'shuffle' icons\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1503) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://theme-icons.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Add a company colors and then theme at `c/internal-sso/settings/colors` (must be global admin for the company)\r\n 2. From the mural, select several stickies\r\n 3. See the new theme icon in the toolbar\r\n 4. Hover over a theme to see the new shuffle icon\r\n\r\n\"Screenshot\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46483, + "title": "[NEXT-356] Move `src/mural/sdk/state/*` into `canvas` package", + "branch": "fix/next-356", + "merged_at": "2025-12-12T14:46:47Z", + "changed_files": 66, + "additions": 194, + "deletions": 175, + "body": "**[NEXT-356 Move mural/sdk/state into packages](https://mural.atlassian.net/browse/NEXT-356)**\r\n\r\nThis is the first PR for moving state into packages.\r\n\r\nIt moves state for:\r\n* config\r\n* features\r\n* mouse\r\n* share\r\n* snap-to-grid\r\n* snapping\r\n* viewport\r\n* widget-toolbar\r\n\r\n", + "labels": [] + }, + { + "number": 46475, + "title": "Dev tool that toggles the names of each toolbar", + "branch": "add/toolbar-names-dev-tool", + "merged_at": "2025-12-12T14:31:38Z", + "changed_files": 2, + "additions": 34, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a dev tool that toggles labels on each toolbar with the toolbar's name.\r\n\r\n[Test Env](https://toolbar-names-dev-tool.mural.engineering/)\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2", + "labels": [] + }, + { + "number": 46464, + "title": "[ecomm-336] show subscription schedule in billing page", + "branch": "add/ecomm-336", + "merged_at": "2025-12-12T14:22:42Z", + "changed_files": 9, + "additions": 409, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI add subscription schedule information in billing page.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-336) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Screenshot\r\n\"Screenshot\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46477, + "title": "[CWI-2448] Update to detect JDC error response", + "branch": "beta-fix/cwi-2448-jdc-err", + "merged_at": "2025-12-12T14:06:20Z", + "changed_files": 1, + "additions": 2, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Update to detect JDC error response. Allows for parsing and display of errors.\r\n\r\n- https://mural.atlassian.net/browse/CWI-2448\r\n\r\n#### Reviewer Resources\r\n- Please review the https://mural.atlassian.net/browse/CWI-2448 to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-integrations/pull/1656\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46482, + "title": "[CAN-8202] Areas need to be fully included during marquee selection", + "branch": "fix/area-selection", + "merged_at": "2025-12-12T13:44:44Z", + "changed_files": 2, + "additions": 26, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR changes how areas are considered selected during a marquee select. Previously, any hint (title or border) would select it, now they need to be fully contained in the selection.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/3956eda3-aa43-48be-970d-76bbcf65344a)\r\n\r\nMaster:\r\n![master](https://github.com/user-attachments/assets/14d12239-573a-4e59-9c0a-235cd7df2b87)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8202\r\n- Env: https://area-selection.mural.engineering", + "labels": [] + }, + { + "number": 46465, + "title": "[ESC-1848] Require data retention to be enabled to view the archived murals page", + "branch": "add/esc-1848-archived-use-toggle", + "merged_at": "2025-12-12T13:19:03Z", + "changed_files": 9, + "additions": 129, + "deletions": 17, + "body": "Jira: [ESC-1848](https://mural.atlassian.net/browse/ESC-1848)\r\nTesting environment: https://esc-1848-archived-use-toggle.mural.engineering/\r\n\r\n### Summary\r\n\r\nRequire the company data retention feature toggle be enabled to show the archived murals menu item or browse to the archived murals page. For now, also check the Optimizely flag so specific users can view the page even if the feature toggle is not enabled for their company.\r\n\r\nNote that the Optimizely flag is enabled for local development and testing environments.\r\n\r\n[ESC-1848]: https://mural.atlassian.net/browse/ESC-1848?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46444, + "title": "[CAN-8242] Refactor `updateWidgetsStatusLabel` to return a list of changes", + "branch": "refactor/update-status-label", + "merged_at": "2025-12-12T13:06:30Z", + "changed_files": 22, + "additions": 263, + "deletions": 216, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the code for the `updateWidgetsStatusLabel` and `updateWidgetsStatus` functions from the `TicketModelService` to minimize the number of calls to `widgets.changes.apply`.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f [**JIRA ticket**](https://mural.atlassia", + "labels": [] + }, + { + "number": 46411, + "title": "[SCQM-1391] Performance Tracking", + "branch": "adds/scqm-1391-performance-tracking", + "merged_at": "2025-12-12T12:54:58Z", + "changed_files": 8, + "additions": 721, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds a helper class that can track the following for all AI actions:\r\n\r\n- TTFP (Time to First Preview): Time from request initiation until preview mode starts\r\n- TTFC (Time to First Content): Time from request initiation until first actionable chunk arrives\r\n- TTFnC (Time to Final Content): Time from request initiation until operation completes\r\n\r\n``` javascript\r\n// Example API usage:\r\nconst tracker = new AIPerformanceTracker();\r\n\r\n// Start tracking (when request initiates)\r\ntracker.start('summarize', sessionId, { refinementRound: 0 });\r\n\r\n// Mark preview mode start\r\ntracker.markFirstPreview('summarize', sessionId);\r\n\r\n// Mark first content received\r\ntracker.markFirstContent('summarize', sessionId);\r\n\r\n// Mark operation complete\r\ntracker.markFinalContent('summarize', sessionId);\r\n```\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1391) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1391-performance-tracking.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+namin", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46455, + "title": "Decouple gettoken", + "branch": "decouple-gettoken", + "merged_at": "2025-12-11T23:36:35Z", + "changed_files": 1, + "additions": 12, + "deletions": 1, + "body": "Decouples usage of `getToken` in `uploadAvatar` from the `@muralco/canvas/models` package. \r\n\r\nTest env: https://decouple-gettoken.mural.engineering", + "labels": [] + }, + { + "number": 46394, + "title": "[SCQM-1499] - Update theme toolbar visibility logic", + "branch": "scqm-1499-update-theme-visibility", + "merged_at": "2025-12-11T20:29:22Z", + "changed_files": 5, + "additions": 107, + "deletions": 67, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates the logic for the theme menu to only be visible in the toolbar when:\r\n1. 2 or more widgets must be selected\r\n2. At least one widget is themeable. A widget is themeable if: unlocked, not a photo, titled image, or group. Has a valid background color.\r\n3. Is a supported widget type: area, sticky, text, shape, sticker\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1499) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1499-update-theme-visibility.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Select one sticky note - theme option is not visible\r\n 2. Select two sticky notes - theme option is visible\r\n 3. Select two shapes with transparent backgrounds - theme option is not visible\r\n 4. Select an image and sticky note - theme option is visible\r\n 5. Select two images - theme option is not visible\r\n 6. Select two groups - theme option is not visible\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46463, + "title": "[NEXT-273] Move `diffStore` into `canvas-widgets` package", + "branch": "fix/diff-store-package", + "merged_at": "2025-12-11T20:11:47Z", + "changed_files": 14, + "additions": 365, + "deletions": 138, + "body": "**[NEXT-273 Move WidgetStore, System types, patchWidget, and diffWidget into a separate package](https://mural.atlassian.net/browse/NEXT-273)**\r\n\r\nIn this PR:\r\n* Moved `diffStore` into `WidgetStore.diff`\r\n* Added `WidgetStore.areDifferent` for cases when full list of difference is not needed\r\n* Made time in tests determenistic to avoid tests flackiness\r\n\r\nThe environment: https://diff-store-package.mural.engineering/", + "labels": [] + }, + { + "number": 46471, + "title": "[CWI-2478] Add region registration", + "branch": "add/cwi-2478-registration", + "merged_at": "2025-12-11T19:37:12Z", + "changed_files": 12, + "additions": 196, + "deletions": 148, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add dynamic registration and rendering of regions\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46380, + "title": "Move photo tools to fixed bar", + "branch": "add/photo-tools-placement", + "merged_at": "2025-12-11T19:20:44Z", + "changed_files": 8, + "additions": 73, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nJust movin some more tools.\r\n\r\n- Photo tools to fixed bar\r\n- Upgrading UI-Toolkit version and removing space from Dividers in the floating toolbar\r\n- Dristribute tools moved to fixed bar\r\n\r\n[Test Env](https://photo-tools-placement.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+", + "labels": [] + }, + { + "number": 46466, + "title": "Enhance date filters by setting max and min date", + "branch": "feat/ipa-254", + "merged_at": "2025-12-11T19:00:40Z", + "changed_files": 6, + "additions": 154, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pag", + "labels": [] + }, + { + "number": 46452, + "title": "[SCQM-1425] Change labels from `Suggest title` -> `Suggest heading`", + "branch": "update/suggest-title-name", + "merged_at": "2025-12-11T18:47:55Z", + "changed_files": 4, + "additions": 11, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUpdates user facing text from suggest title -> suggest heading. Leaves the function name and all that entails as is. Just trying to see if this sets user expectations better. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1425) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://suggest-title-name.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nVerify that the text the user sees all matches \"heading\":\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46404, + "title": "IAM-2288: Fix login looping behavior bug", + "branch": "fix/visitor-login-loop", + "merged_at": "2025-12-11T18:31:26Z", + "changed_files": 1, + "additions": 9, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdding notes to murally with a long-term ticket to fix the possibility of looping long-term in https://mural.atlassian.net/browse/IAM-2304.\r\n\r\nThe actual issue that was the source of the IAM-228 is fixed in the API PR: https://github.com/tactivos/mural-api/pull/15027.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2288) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/15027)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)", + "labels": [] + }, + { + "number": 46458, + "title": "[CAN-8172] Hide drag tool when selection is bigger than 36px", + "branch": "add/hide-drag", + "merged_at": "2025-12-11T18:10:23Z", + "changed_files": 11, + "additions": 119, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes the drag tools was shown regardless of the size of the selection\r\n Now, with these changes, the drag tool is only shown when is useful (for small selections).\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8172) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8172.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's", + "labels": [] + }, + { + "number": 46436, + "title": "[CAN-7959] Remove areas improvements flag", + "branch": "remove/areas-improvements", + "merged_at": "2025-12-11T17:58:08Z", + "changed_files": 23, + "additions": 53, + "deletions": 212, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes the areas improvements flag from the code assuming it's turned on for everyone.\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-7959\r\n- Env: https://areas-improvements.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46448, + "title": "[NEXT-350] Migrate Widget & Mural Primitives & Supporting files to @muralco/canvas", + "branch": "more-amp-and-models", + "merged_at": "2025-12-11T17:17:51Z", + "changed_files": 56, + "additions": 97, + "deletions": 65, + "body": "## Pull request overview\r\n\r\nThis PR migrates Widget and Mural primitives, along with supporting utility files, from the main application codebase to the `@muralco/canvas` package. These are the remaining upstream dependencies ready to migrate for the 2 files in `src/amp`. \r\n\r\n**Key Changes:**\r\n- Moved primitive type definitions (`PrimitiveApis`, `WidgetsPrimitiveApi`, `MuralPrimitiveApi`, `WidgetsDefaultsApi`, `WidgetPersistenceSdkApi`) to `packages/canvas/src/sdk/primitives/`\r\n- Migrated utility functions (`getLocalWidgetUpdateProps`, `chunkChanges`, `getChildrenAndConnectedArrows`) to `packages/canvas/src/models/utils/` and `packages/canvas/src/helpers/widgets/`\r\n- Updated all import statements across the codebase to reference the new package locations\r\n\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46410, + "title": "[PLAY-748] Company name / url should persist beyond session when re-opening rerun research modal", + "branch": "add/research-modal-persistence", + "merged_at": "2025-12-11T17:06:22Z", + "changed_files": 12, + "additions": 832, + "deletions": 328, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPersist user's linkedin url or company name in rerun research company. \r\n\r\nAlso, move shared logic for persisting and deleting local storage values to shared module. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-748) to understand the context of this effort.\r\ndemo: https://www.loom.com/share/f83bfa33b44942efa7d2a83bd7f093ac\r\n", + "labels": [ + "bop" + ] + }, + { + "number": 46451, + "title": "[CAN-8231] Use widget's bounding box instead of center point", + "branch": "add/can-8231", + "merged_at": "2025-12-11T16:47:28Z", + "changed_files": 2, + "additions": 62, + "deletions": 53, + "body": "Changes logic for hovering over widgets that overlap groups from looking at the widget's center to look at the widget's bounding box.\r\n\r\n[Test Env](https://can-8231.mural.engineering/t/peoplewholikehats/m/peoplewholikehats/1765467238248/5fa6c3c21039ef32e9d334486a48b13fe47787d3)\r\n[Jira](https://mural.atlassian.net/browse/CAN-8231)", + "labels": [] + }, + { + "number": 46422, + "title": "[CAN-8244] Refactor `recomputeWidgetVisualRepresentation` to return a list of changes", + "branch": "refactor/recompute-visual", + "merged_at": "2025-12-11T16:35:24Z", + "changed_files": 23, + "additions": 452, + "deletions": 286, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the code for the `recomputeWidgetVisualRepresentation` function from the `TicketModelService` to minimize the number of calls to `widgets.changes.apply`.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/C", + "labels": [] + }, + { + "number": 46399, + "title": "Adds a dev tool to highlight the mural css grid layout", + "branch": "add/dev-tools-grid", + "merged_at": "2025-12-11T15:56:38Z", + "changed_files": 3, + "additions": 108, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Test Env](https://dev-tools-grid.mural.engineering/t/peoplewholikehats/m/peoplewholikehats/1765462638741/bf1dbc36d33e8125d3013ee7d58b9ff1b71eb5a3)\r\n\r\nAdded a Toggle Mural Grid button to the dev tools. When activated background colors are applied to the different grid sections to visually show what the mural grid looks like. I hope this tool can help engineers understand our css layout. \r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 46439, + "title": "[CWI-2471] Unified Image - Search Component and Hook", + "branch": "add/cwi-2471", + "merged_at": "2025-12-11T15:41:11Z", + "changed_files": 9, + "additions": 256, + "deletions": 203, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is part of rebuilding the Image Panel which is behind a feature flag and is under development. This PR is merging to another feature branch.\r\n\r\nThis adds the search component and hook for Unified Image Work.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2471) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46334, + "title": "[CWI-2383] Auto open Widget Panel when exporting new Jira/ADO tickets", + "branch": "add/cwi-2383", + "merged_at": "2025-12-11T13:57:51Z", + "changed_files": 13, + "additions": 154, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- When creating a new Jira/ADO Item in Mural, the widget panel (side panel) did not automatically open. If we deselected and selected the widget it would open. This updates automatically opens the side panel when a sticky is exported to either Jira/ADO. \r\n\r\n- Locked widgets that have CE attached will auto open the widget panel.\r\n\r\nFun fact: `If you call selectWidgets on an already-selected widget, it gets removed from the list`\r\n\r\nhttps://www.loom.com/share/be9d5640856048709716ed17ea80cd7b\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2383) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2412) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.n", + "labels": [] + }, + { + "number": 46449, + "title": "[NEXT-353] Add formatting to move-to-package", + "branch": "add/formatting-fix", + "merged_at": "2025-12-10T23:42:34Z", + "changed_files": 4, + "additions": 377, + "deletions": 34, + "body": "## Pull request overview\r\n\r\nThis PR adds automatic code formatting to the move-to-package refactoring tool. The tool now runs ESLint and Prettier on all modified files after moving and rewriting imports, ensuring consistent code style. It also improves git commit handling by capturing file states before/after operations and staging only the files modified by the tool.\r\n\r\nKey changes:\r\n- Adds iterative ESLint and Prettier formatting that runs until files stabilize (typically 1-2 passes)\r\n- Refactors git commit logic to use git status for change detection and selective file staging\r\n- Tracks formatting passes in the execution plan for better visibility\r\n\r\n\r\n\"Is\r\n\"Cost:benefit\r\n\"Is\r\n\r\nNote: It's not a perfect solution because it *can* still lead to eslint issues if formatting happens to place the import right under where a //eslint-disable-next-line directive is \r\n\r\nJira ticket: https://mural.atlassian.net/browse/NEXT-353", + "labels": [] + }, + { + "number": 46432, + "title": "[NEXT-273] Move `ActionBuilder` into packages", + "branch": "fix/action-builder-packages", + "merged_at": "2025-12-10T21:39:32Z", + "changed_files": 180, + "additions": 512, + "deletions": 461, + "body": "**[NEXT-273 Move WidgetStore, System types, patchWidget, and diffWidget into a separate package](https://mural.atlassian.net/browse/NEXT-273)**\r\n\r\nMove `ActionList` and `ActionBuilder` into `canvas-widgets` package.\r\n\r\nThe environment: https://action-builder-packages.mural.engineering/", + "labels": [] + }, + { + "number": 46430, + "title": "ENGAGE-1184 - Room users list won't show completely", + "branch": "add/engage-1184", + "merged_at": "2025-12-10T20:39:16Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "## Pull request overview\r\n\r\nThis PR addresses ENGAGE-1184 by adding a maximum height constraint to the room members list to prevent display issues. The change adds a `max-height: 700px` style rule to the members list container within a popover component.\r\n\r\n- Adds height constraint to room members list popover\r\n\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46417, + "title": "[CAN-8154] Add new navigation controls modal", + "branch": "add/can-8154", + "merged_at": "2025-12-10T20:27:45Z", + "changed_files": 13, + "additions": 335, + "deletions": 77, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR replaces the Navigation settings modal from the bottom bar tool bar into a redesigned version in the top bar toolbar.\r\n\r\nOld version:\r\n\"image\"\r\n\r\n\r\nNew version:\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\"\r\n\r\nThe switch is feature flagged with the navigation improvements flag which is enabled by default on test envs, to test flag off, use the flags manager.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8154) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8154.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46441, + "title": "Codeowner changes for images", + "branch": "codeowner/images", + "merged_at": "2025-12-10T19:38:17Z", + "changed_files": 1, + "additions": 4, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46433, + "title": "Enhance ScheduledDynamicDateFilter to handle \"All time\" option", + "branch": "feat/ipa-315", + "merged_at": "2025-12-10T19:25:48Z", + "changed_files": 3, + "additions": 186, + "deletions": 24, + "body": "- Updated the ScheduledDynamicDateFilter component to set the field value to null when the \"All time\" option (empty string) is selected.\r\n- Modified the default value logic to only set the first option as default if it has a non-empty value.\r\n- Added new test cases to verify the behavior of the filter selections, including handling of numeric values and default settings.\r\n- Updated documentation to reflect changes in the component's behavior.\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces", + "labels": [] + }, + { + "number": 46414, + "title": "[IPA-309] moves main collaboration insights components to its package", + "branch": "add/ipa-309", + "merged_at": "2025-12-10T19:13:30Z", + "changed_files": 21, + "additions": 131, + "deletions": 114, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Company insights\r\n- Workspace insights \r\n\r\nall the code were already there but main components were blocked before\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827", + "labels": [] + }, + { + "number": 46420, + "title": "[CAN-8231] Avoid hovering widget that are on a selected group", + "branch": "add/can-8214", + "merged_at": "2025-12-10T19:00:18Z", + "changed_files": 2, + "additions": 168, + "deletions": 46, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8231)\r\n[Test Env](https://can-8214.mural.engineering/)\r\n\r\nBefore:\r\n\r\nhttps://github.com/user-attachments/assets/11338451-230c-4f21-8fef-d3fd9d2e0635\r\n\r\n\r\nAfter:\r\n\r\n\r\nhttps://github.com/user-attachments/assets/ac2f006d-d139-4498-959a-8a1953d0ad63\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/s", + "labels": [] + }, + { + "number": 46434, + "title": "[CAN-8250] Respect cell's padding when computing minimum row size", + "branch": "fix/can-8250", + "merged_at": "2025-12-10T18:25:10Z", + "changed_files": 1, + "additions": 2, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes the assumption that a row min width cannot be smaller than twice the default padding: the padding is actually set on each cell, so we should respect that value when computing the minimum row size.\r\n\r\nBecause of the textContent in the cell, the minimum height of each cell will now correctly match the line-height of the cell's font-size.\r\n\r\nBefore\r\n\r\n\"Screenshot\r\n\r\nAfter\r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can", + "labels": [] + }, + { + "number": 46426, + "title": "[ENGAGE-1440] Few more Share modal UI tweaks", + "branch": "fix/more-share-modal-tweaks", + "merged_at": "2025-12-10T18:11:29Z", + "changed_files": 8, + "additions": 30, + "deletions": 30, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1440) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://more-share-modal-tweaks.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher]", + "labels": [] + }, + { + "number": 46429, + "title": "ECOMM-307 Migrate v1 cucumber test: billing/verify-3ds-page.feature", + "branch": "add/verify-3ds-feature", + "merged_at": "2025-12-10T17:56:55Z", + "changed_files": 3, + "additions": 135, + "deletions": 37, + "body": "## Migrate verify-3ds-page.feature from v1 to v2 Cucumber\r\n\r\nMigrated `features/billing/verify-3ds-page.feature` from v1 to v2 Cucumber test format.\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-307\r\n\r\n### Changes\r\n- \u2705 Created v2 test file: `src/test/react-new/features/billing/verify-3ds-page.feature`\r\n- \u2705 Updated step definitions to v2 format:\r\n - `I visit the \"billing\" route` \u2192 `visiting the route \"/t/${W.username}/settings/billing\"`\r\n - `I click on [element]` \u2192 `clicking on [element]`\r\n - Updated user/workspace setup to v2 format\r\n- \u2705 Converted data-qa attributes to kebab-case: `[complete-cc-verification-button]`, `[complete-cc-verification-email-link]`\r\n- \u2705 Added Stripe configuration step (required for ValidationPage component)\r\n- \u2705 Added `useStripe` mock to `@stripe/react-stripe-js-latest` (required for component to render)\r\n- \u2705 Deleted v1 file: `features/billing/verify-3ds-page.feature`\r\n\r\n### Test Status\r\n- \u2705 All 3 scenarios pass consistently\r\n- \u2705 Verified across multiple runs (no flaky behavior)\r\n- \u2705 No disabled/ignore tags needed\r\n\r\n### Files Changed\r\n- `src/test/react-new/features/billing/verify-3ds-page.feature` - New v2 test file\r\n- `src/test/react-new/mocks/react-stripe-js-latest.tsx` - Added `useStripe` export\r\n- `src/test/react-new/mocks/index.ts` - Added `useStripe` to mock map\r\n- `features/billing/verify-3ds-page.feature` - Deleted (v1 file)", + "labels": [] + }, + { + "number": 46398, + "title": "Migrate `src/amp` Miscellaneous Remaining Files That Were Ready To Modularize", + "branch": "move-amp-files", + "merged_at": "2025-12-10T17:45:16Z", + "changed_files": 48, + "additions": 141, + "deletions": 79, + "body": "## Overview\r\n\r\nThis PR continues the modularization effort by migrating the remaining miscellaneous files from `src/amp` that were ready to be moved into the `@muralco/canvas` package. This consolidates AMP-related functionality into the canvas package and updates all references throughout the codebase.\r\n\r\n## Changes\r\n\r\n### File Migrations\r\n\r\n**AMP Core Functions:**\r\n- `src/amp/mural.ts` \u2192 `packages/canvas/src/amp-core/mural.ts`\r\n- `src/amp/workspace.ts` \u2192 `packages/canvas/src/amp-core/workspace.ts`\r\n- `src/amp/update-visitor-member.ts` \u2192 `packages/canvas/src/amp-core/update-visitor-member.ts`\r\n- `src/amp/types/techdebt.app.ts` \u2192 `packages/canvas/src/amp-core/types/techdebt.app.ts`\r\n\r\n**Model Functions:**\r\n- `src/amp/get-current-mural.ts` \u2192 `packages/canvas/src/models/amp/get-current-mural.ts`\r\n- `src/amp/get-token.ts` \u2192 `packages/canvas/src/models/amp/get-token.ts`\r\n\r\n**Helper Functions:**\r\n- `src/mural/helpers/freehand.ts` \u2192 `packages/canvas/src/helpers/freehand.ts`\r\n- `src/mural/helpers/linkify-shim.ts` \u2192 `packages/canvas/src/helpers/linkify-shim.ts`\r\n\r\n### Export Changes\r\n\r\n- Changed `getToken` from default export to named export\r\n- Changed `updateVisitorMember` from default export to named export\r\n- Added exports to `packages/canvas/src/amp-core/index.ts` for migrated functions\r\n- Added exports to `packages/canvas/src/models/index.ts` for AMP model functions\r\n- Added exports to `packages/canvas/src/helpers/index.ts` for freehand and linkify helpers\r\n\r\n### Dependency Management\r\n\r\n- Moved `@tactivos/freehand-rs` from root `package.json` to `packages/canvas/package.json`\r\n- Moved `linkify-html`, `linkify-react`, and `linkifyjs` from root `package.json` to `packages/canvas/package.json`\r\n\r\n### Type System Improvements\r\n\r\n- Created `src/types/node-globals.d.ts` to handle Node.js global declarations (`require`, `Buffer`) that were removed from `techdebt.app.ts` when it moved to the canvas package\r\n- Removed Node.js global declarations from `techdebt.app.ts` to avoid", + "labels": [] + }, + { + "number": 46427, + "title": "ECOMM-300 Migrate v1 cucumber test: billing/cancel-subscription.feature", + "branch": "add/cancel-subscription", + "merged_at": "2025-12-10T16:29:23Z", + "changed_files": 3, + "additions": 9, + "deletions": 32, + "body": "## Cancel Subscription Feature V1 to V2 Migration\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-300\r\n\r\nMigrated `cancel-subscription.feature` from v1 to v2 Cucumber test format.\r\n\r\n### Changes\r\n- \u2705 Removed `@ignore` tag from v2 test (resolved AUTO-613 timer issue with `a datetime 30_DAYS_FROM_TODAY` workaround)\r\n- \u2705 Added credit card setup step (required for subscription to load properly)\r\n- \u2705 Fixed step definition to handle both string and number timestamp inputs\r\n- \u2705 Deleted v1 file: `features/billing/cancel-subscription.feature`\r\n\r\n### Test Status\r\n- \u2705 V2 test passes consistently\r\n- \u2705 All v1 test scenarios covered\r\n- \u2705 No ignore/disable tags needed\r\n\r\n### Files Changed\r\n- `src/test/react-new/features/billing/cancel-subscription.feature` - Updated test (removed @ignore, added credit card, used datetime workaround)\r\n- `src/test/react-new/step-definitions/api-entities.ts` - Fixed timestamp handling in subscription step definition\r\n- `features/billing/cancel-subscription.feature` - Deleted (v1 file)", + "labels": [] + }, + { + "number": 46431, + "title": "Upgrade npm engine version", + "branch": "upgrade/npm-engine", + "merged_at": "2025-12-10T16:13:40Z", + "changed_files": 2, + "additions": 16, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request updates the required version of npm in the project configuration. The change ensures that both the `packageManager` field and the `engines.npm` field now specify npm version 10.9.3 instead of 10.8.2.\r\n\r\n- Updated npm version requirement to 10.9.3 in both the `packageManager` and `engines.npm` fields in `package.json`.\r\n", + "labels": [] + }, + { + "number": 46421, + "title": "[CWI-2473] Fix - Integrations Platform auto sync is syncing local changes instead of external changes", + "branch": "fix/cwi-2473", + "merged_at": "2025-12-10T15:15:50Z", + "changed_files": 10, + "additions": 469, + "deletions": 648, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIntegrations Platform auto sync is syncing local changes instead of external changes\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2473\r\n\n\n---\n\n> [!NOTE]\n> Auto-sync now applies only external changes on fetch, local changes always show as out-of-sync, and sync logic is refactored with new options/types.\n> \n> - **Widget Panel (UI)**\n> - Show out-of-sync indicator for fields with local changes.\n> - Always show `Sync` button when any field is out of sync (removed `canAutoSync`).\n> - `Check for updates` and initial load call `fetchExternalData` with `{ autoSyncExternalChanges: true }`.\n> - **SDK Operations**\n> - `fetchExternalData` accepts `FetchExternalDataOptions`; when `autoSyncExternalChanges` and only external changes exist, apply updates via `updateRecordInCE`; otherwise update `latestExternalData` and out-of-sync label.\n> - Refactor `sync-record` into `sync-record/index.ts`, `ce-update.ts`, `sor-update.ts`; extract `updateRecordInCE` and `updateRecordInSor`.\n> - **Dispatcher & Types**\n> - Add `FetchExternalDataOptions` (with `autoSyncExternalChanges?`); make `ConnectionOptions.initiateConnectionIfNone` optional.\n> - Update `record.fetchExternalData` signature; remove `record.updateExternalData`.\n> - **Tests**\n> - Update expectations for out-of-sync indicator, `Sync` button visibility, and `fetchExternalData` calls including options.\n> - Remove `canAutoSync` tests and add coverage for auto-syncing external-only changes.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f008c6d247306736d4421e30c10a6255d1c26412. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46423, + "title": "[ENGAGE-1437] Add logging in workspace store", + "branch": "stable-fix/engage-1437", + "merged_at": "2025-12-10T15:00:41Z", + "changed_files": 4, + "additions": 13, + "deletions": 13, + "body": "Deleted the log in RequireWorkspace since it is adding too many logs and not helpful. Added logs in WorkspaceReactQuery for edge case where workspace is undefined", + "labels": [] + }, + { + "number": 46419, + "title": "ECOMM-281 Migrate v1 cucumber test: security/external-collaboration.feature", + "branch": "add/external-collab-feature", + "merged_at": "2025-12-09T22:43:22Z", + "changed_files": 1, + "additions": 15, + "deletions": 15, + "body": "## Migrate External Collaboration Tests from V1 to V2\r\n\r\nTicket: https://mural.atlassian.net/jira/software/c/projects/ECOMM/boards/572?selectedIssue=ECOMM-281\r\n\r\nMigrates `features/security/external-collaboration.feature` from v1 to v2 Cucumber test format.\r\n\r\n### Changes\r\n- \u2705 Created v2 test file: `src/test/react-new/features/security/external-collaboration.feature`\r\n- \u2705 Migrated all 4 scenarios (mural, room, workspace invitations, and dashboard)\r\n- \u2705 Updated API route constants to v2 format (`MURAL_LINK_INVITATION`, `ROOM_LINK_INVITATION`, `WORKSPACE_LINK_INVITATION`)\r\n- \u2705 Converted route paths to explicit v2 format\r\n- \u2705 Removed v1 test file\r\n\r\n### Test Results\r\nAll 4 scenarios pass:", + "labels": [] + }, + { + "number": 46374, + "title": "Improve workflow downloads client api", + "branch": "refactor/worspace-download-api", + "merged_at": "2025-12-09T21:58:40Z", + "changed_files": 2, + "additions": 401, + "deletions": 375, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImproves the workflow downloads client API by refactoring the CSV download mechanism to use the centralized workspace API client instead of manual fetch calls with JWT handling.\r\n\r\n**Key Changes:**\r\n- Replaced manual URL construction and fetch calls with dedicated API client methods\r\n- Removed direct JWT token handling, now managed internally by the authenticated API client\r\n- Alphabetically reorganized the workspace API exports for better maintainability\r\n\r\n#### Reviewer Resources\r\n- Partially closes: https://mural.atlassian.net/browse/NEXT-318\r\n- To test it\r\n\t- Access to https://worspace-download-api.mural.engineering/t/test2850/settings/members\r\n\t- Request Download CSV\r\n\t- The Email returns a valid URL that provides the CSV without using the JWT token in the Query String\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [] + }, + { + "number": 46358, + "title": "Refactor download routes to integration pkg", + "branch": "refactor/download-route", + "merged_at": "2025-12-09T21:37:21Z", + "changed_files": 28, + "additions": 302, + "deletions": 34, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactors download export functionality into a new `@muralco/download-exports` package. The refactoring includes extracting the `bufferBlob` utility to `@muralco/media`, migrating to UI Toolkit components (`MrlProgressBar`), and properly separating download export routes from CSV download routes.\r\n\r\n- Extracted download exports routes and components to new `@muralco/download-exports` package\r\n- Moved `bufferBlob` helper function to `@muralco/media` package for better reusability\r\n- Migrated from legacy `ProgressBar` component to `MrlProgressBar` from UI Toolkit\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-319\r\n- Testing env: https://download-route.mural.engineering/\r\n- How to test?\r\n\t1. Access to a mural and download it... Request to send an email too...\r\n\t2. Click in the email link... If the download routes loads and works as expected, then \ud83c\udfc1 \r\n\n\n---\n\n> [!NOTE]\n> Extracts export download routes/components into new `@muralco/download-exports`, moves `bufferBlob` to `@muralco/media`, updates app routing, and switches to `MrlProgressBar`.\n> \n> - **Packages**:\n> - **New**: `packages/download-exports` providing `DownloadExportsRoutes` and `DownloadExportController` (build/test configs, README, feature tests).\n> - **Utils**: Move `bufferBlob` to `@muralco/media` (`packages/media/src/utils/buffer-blob.ts` and re-export in `utils/index.ts`).\n> - **Routing**:\n> - App integrates `DownloadExportsRoutes()` and splits CSV route into `DownloadCSVRoutes()` with `Preloader`.\n> - Removes inline export download routes from `src/downloads/routes` and replaces with package routes.\n> - **UI**:\n> - Replace legacy `ProgressBar` with `MrlProgressBar` in file downloader; simplify props and styles.\n> - **Imports/Consumers**:\n> - Update direct export flow and tests to consume `@muralco/download-exports` and `bufferBlob` from `@muralco/media`.\n> - **Ownership/Deps**:\n> ", + "labels": [] + }, + { + "number": 46408, + "title": "[NEXT-355] Fix/style collide", + "branch": "fix/style-collide", + "merged_at": "2025-12-09T21:22:56Z", + "changed_files": 4, + "additions": 46, + "deletions": 0, + "body": "Original issue was that `content` class from packages/route-about-you/src/styles.module.sass and `content` class from packages/company-template-collections/src/styles.module.sass were resolving to the same hash.\r\n\r\nWith these changes, those classes end up with different hashes.\r\n\r\nTest environment: https://style-collide.mural.engineering\r\n\r\n\"Screenshot\r\n", + "labels": [ + "disable-turbo-cache" + ] + }, + { + "number": 46400, + "title": "[PLAY-748] Company selection should persist beyond session when re-opening modals", + "branch": "add/sf-account-persistance-2", + "merged_at": "2025-12-09T19:52:08Z", + "changed_files": 7, + "additions": 1274, + "deletions": 164, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis work implements localStorage persistence for Salesforce Account import filter values, allowing selected filters o persist across page reloads and sync between related modals. \r\n\r\nUse this logic to sync this preference with the run research modal \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-748) to understand the context of this effort.\r\ndemo: https://www.loom.com/share/cfb593ba469641c9900f4c2867162b50\r\n\n\n---\n\n> [!NOTE]\n> Persists selected Salesforce account to localStorage (90-day, versioned) and keeps it in sync between the Import Records and Initiate Research modals, with refactored filter component and comprehensive tests.\n> \n> - **Research Modal (`InitiateResearchModal`)**\n> - Load/save Salesforce account via `loadAccountFromLocalStorage` / `saveAccountToLocalStorage` keyed by `muralId`.\n> - Sync selection to dispatcher: `sdk.systemOfRecord.importRecordsModal.updateFilterValue('salesforce-contact','account', ...)`.\n> - Unchecking Salesforce clears UI selection only (does not clear persisted value).\n> - Selector supports clearing via `showClearIndicatorIcon`; minor copy normalization.\n> - **System of Record \u2022 Salesforce Account Filter**\n> - New storage utils in `filters/storage.ts` with 90-day expiration and versioning; safe load with validation and cleanup.\n> - Refactor `AccountFilterDefinition` to TSX component handling:\n> - Local persistence on mount/change, external filtersState sync, debounced search, loading/error states.\n> - Export `loadAccountFromLocalStorage` / `saveAccountToLocalStorage` from `filters/account.tsx`.\n> - **Tests**\n> - Added extensive tests for storage, account filter component, and research modal persistence/dispatcher sync; adjusted company search tests accordingly.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3d63b25bc9547204a", + "labels": [ + "bop" + ] + }, + { + "number": 46396, + "title": "Remove unnecessary calls to `engines.widgets.getAllAtRect`", + "branch": "update/remove-get-all-at-rect", + "merged_at": "2025-12-09T19:32:44Z", + "changed_files": 21, + "additions": 122, + "deletions": 194, + "body": "This commit removes access to the low-level and expensive `engine.widgets.getAllAtRect` from the WidgetsSdkApi, as this was used extensively in places where the drawing order isn't relevant.\r\n\r\nInstead, `WidgetsSdkApi.getAllAtRect` exposes only the efficient method (`getAllAtRectUnordered`)\r\n\r\nCallers that require stacking order heuristics should implement them on top of the returned nodes.\r\n\r\nBefore (dragging 1000 stickies)\r\n\r\n\"image\"\r\n\r\nAfter (dragging 1000 stickies)\r\n\r\n\"image\"\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conven", + "labels": [] + }, + { + "number": 45972, + "title": "[CPT-2370] replace a cucumber test with e2e test", + "branch": "add/test-for-edit-template", + "merged_at": "2025-12-09T19:18:13Z", + "changed_files": 1, + "additions": 0, + "deletions": 15, + "body": "### Summary of Changes and Resources for the Reviewer\r\nWe want to remove this cucumber test since we are going to replace this test with an e2e test (linked below)\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [CPT-2370](https://mural.atlassian.net/browse/CPT-2370?atlOrigin=eyJpIjoiNTE1MDliM2YzMDY1NDZkN2IzM2MzYWFhMTc2MjEzYmUiLCJwIjoiaiJ9) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nE2E TEST PR: https://github.com/tactivos/templates-team-e2e/pull/10\r\n\r\n\n\n[CPT-2370]: https://mural.atlassian.net/browse/CPT-2370?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Remove Cucumber test `features/canvas/template/sidebar-visibility.feature` in favor of an e2e replacement.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bab1da460dafa5b1ae5efd206bdce08d9466a8cb. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46416, + "title": "ECOMM-279 Migrate v1 cucumber test: guest-domain-restriction/setting-off.feature", + "branch": "add/guest-setting-test", + "merged_at": "2025-12-09T19:05:18Z", + "changed_files": 1, + "additions": 30, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-279\r\n\r\nMigrated `guest-domain-restriction/setting-off.feature` from v1 to v2 Cucumber format.\r\n\r\n## Changes\r\n\r\n- \u2705 Created v2 test file with updated Background (user/workspace setup)\r\n- \u2705 Converted step definitions to v2 syntax (`clicking on`, `I create a new option` for creatable select)\r\n- \u2705 Updated data-qa attribute: `share-invite-member-selector-input` \u2192 `share-invite-member-selector-container`\r\n- \u2705 Added route re-visit after workspace property updates\r\n- \u2705 Removed `@disabled-PE-5247` tags\r\n\r\n## Results\r\n\r\n- \u2705 All 16 test cases passing (288 steps)\r\n- \u2705 V1 file deleted\r\n- \u2705 Tests now run in v2 rig\r\n\r\nFixes: PE-5247\r\n", + "labels": [] + }, + { + "number": 46413, + "title": "[CAN-8240] Refactor `removeFromColumn` to return a list of changes", + "branch": "refactor/remove-from-column", + "merged_at": "2025-12-09T18:48:28Z", + "changed_files": 16, + "additions": 117, + "deletions": 77, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors the code for the `removeFromColumn` function from the `KanbanBoardCardsApi` to minimize the number of calls to `widgets.changes.apply`.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8240)\r\n- \ud83e\uddea [**Tes", + "labels": [] + }, + { + "number": 46412, + "title": "[CAN-7830] Upgrade `mural-shared` version", + "branch": "fix/areas-white-background", + "merged_at": "2025-12-09T17:44:41Z", + "changed_files": 15, + "additions": 18, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates `mural-shared` to `2.16.0` where the default background for areas is `white`. See https://github.com/tactivos/mural-shared/pull/122.\r\n\r\nTicket: https://mural.atlassian.net/browse/CAN-7830\r\nEnv: https://areas-white-background.mural.engineering", + "labels": [] + }, + { + "number": 46236, + "title": "[SCQM-1276] Transfer ownership of the smart planner to Integrated Workflows", + "branch": "add/smart-planner-handoff", + "merged_at": "2025-12-09T17:08:04Z", + "changed_files": 1, + "additions": 6, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the AI Innovation team owned everything related to the smart planner.\r\n\r\nNow, with these changes, the Integrated Workflow team will own this feature.\r\n\r\n** This is merely a `CODEOWNERS` change, no active code changed. **\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1276) to understand the context of this effort.\r\n- See this [Handoff document](https://mural.atlassian.net/wiki/spaces/PDE/pages/4903763972/Handoff+Smart+Planner+Enhanced+Kanban+Board+Handoff+Summary).\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\n\n\n---\n\n> [!NOTE]\n> Reassigns smart planner/enhanced kanban widget composition ownership in CODEOWNERS from Smart Canvas to Workflows & Integrations and updates section labeling.\n> \n> - **CODEOWNERS**:\n> - **Ownership transfer**:\n> - Move `src/mural/business/kanban` from `@tactivos/smart-canvas` to `@tactivos/workflows-and-integrations`.\n> - Add ownership for `src/mural/addons/widget-compositors/enhanced-kanban-board`, `src/mural/addons/widget-compositors/apis/planner-board`, and `src/test/unit/mocks/smart-frameworks-mocks.ts` to `@tactivos/workflows-and-integrations`.\n> - **Label update**: Rename section comment from \"smart planner\" to \"smart frameworks (should be passed off to core)\".\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 28fcce5c1428bd22f1cf02975eaacca73f5201be. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46405, + "title": "ECOMM-277 Migrate v1 cucumber test: pay-invoice-notification.feature", + "branch": "add/pay-invoice-v2-tests", + "merged_at": "2025-12-09T16:54:46Z", + "changed_files": 3, + "additions": 279, + "deletions": 216, + "body": "## Fix pay invoice notification tracking tests\r\n\r\nTicket: https://mural.atlassian.net/jira/software/c/projects/ECOMM/boards/572?selectedIssue=ECOMM-277\r\n\r\n### Problem\r\nTests for pay invoice notification tracking were failing because the `record()` function from `@muralco/tracking-lib` wasn't consistently populating the test environment's `$trackingQueue`, which is used for test assertions.\r\n\r\n### Solution\r\nAdded a test-specific mock in `src/test/react-new/step-definitions/tracking.ts` that wraps the `record` function to ensure `window.analytics.track()` is called directly. This ensures tracking events are captured in the test environment's tracking queue for assertions.\r\n\r\nThe mock:\r\n- Preserves the original `record()` function behavior\r\n- Explicitly calls `window.analytics.track()` for test compatibility\r\n- Includes a guard to prevent infinite loops\r\n- Is properly restored after each test\r\n\r\n### Changes\r\n- Modified `src/test/react-new/step-definitions/tracking.ts` to add a `sinon.stub()` for `trackingLib.record` in the `Before` hook\r\n- Fixed TypeScript linting errors (replaced `AnalyticsPayload` with `SegmentEvent`, added proper type declarations)\r\n\r\n### Result\r\n\u2705 All 11 scenarios in `pay-invoice-notification.feature` now pass\r\n- 6 dashboard tests passing\r\n- 5 canvas tests passing\r\n\r\nNo production code changes were made - this is purely a test environment fix.\r\n", + "labels": [] + }, + { + "number": 46395, + "title": "[ENGAGE-1437] Add logger in page render, content render, workspace store, and require workspace", + "branch": "beta-fix/engage-1437", + "merged_at": "2025-12-09T16:23:24Z", + "changed_files": 6, + "additions": 163, + "deletions": 0, + "body": "As part of this [bug ticket](https://mural.atlassian.net/browse/ENGAGE-1437), I am adding logs to help debug the issue.\r\nThe bug is about a user getting blank screen when going to the dashboard but there are no api errors. It must be a rendering issue.\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds structured warn/error logging across dashboard content/page rendering and workspace store, and introduces the logger dependency to data-workspace.\n> \n> - **Dashboard Rendering**\n> - `src/apps/web/dashboard/pages/content-renderer/v2/ContentRender.tsx`:\n> - Add `logger.warn/error` across fetch flow: empty results, fetch not triggered, feature flag disabled, loaded without data, empty arrays, and unknown `contentType`.\n> - `src/apps/web/dashboard/pages/content-renderer/v2/page-render.tsx`:\n> - Add `logger.warn` when `updatedProfileContent` is false.\n> - **Workspace Context**\n> - `src/dashboard/components/app-container/workspaces-store/workspaces.tsx`:\n> - Add `logger.error` for workspace fetch failures (with context) and `logger.warn` when `workspace` is null.\n> - **Data Workspace**\n> - `packages/dashboard/data-workspace/src/require-workspace/index.tsx`:\n> - Add `logger.warn` when `workspace` is null.\n> - `packages/dashboard/data-workspace/package.json` (+ lockfile):\n> - Add `@muralco/logger` dependency.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 47bb235ae25dc2b0c07cb0bfcda881ba23886c00. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46371, + "title": "[CAN-8222] Prevent right click marquee selection inside locked areas", + "branch": "fix/can-8222", + "merged_at": "2025-12-09T15:32:21Z", + "changed_files": 8, + "additions": 140, + "deletions": 84, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nTo reproduce the bug:\r\n1. Create an area\r\n2. Add two stickies to this area\r\n3. Lock the area\r\n4. Select a sticky note\r\n5. Left click in an empty space of the area\r\n6. Right click to pan inside the area\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/60e4c91d-5ec8-4a74-a243-1c7666a81bfc)\r\n\r\nMaster:\r\n\r\n![master](https://github.com/user-attachments/assets/ba356f94-f0ac-4ebd-b9f3-2a9f2d025472)\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8222\r\n- Env: https://can-8222.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46397, + "title": "[CAN-8185] Snap title widget to top corners while resizing", + "branch": "fix/can-8185", + "merged_at": "2025-12-09T14:37:16Z", + "changed_files": 2, + "additions": 6, + "deletions": 6, + "body": "**[CAN-8185 Fix inconsistent anchoring behavior when resizing text elements](https://mural.atlassian.net/browse/CAN-8185)**\r\n\r\n## Before\r\n![2025-12-08 20 22 43](https://github.com/user-attachments/assets/09441870-2a57-480f-8fd4-aeb30d95396f)\r\n\r\n## After\r\n\r\n![2025-12-08 20 21 13](https://github.com/user-attachments/assets/1bec32ca-9d51-471b-b0a6-8cb1aee2a5a2)\r\n", + "labels": [] + }, + { + "number": 46340, + "title": "[CAN-8170] Makes selected groups draggable from their whitespaces", + "branch": "add/can-8170-draggable-groups-take-two", + "merged_at": "2025-12-09T14:25:26Z", + "changed_files": 6, + "additions": 1199, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8170)\r\n[Test Env](https://can-8170.mural.engineering/dashboard)\r\n\r\nBefore \r\n\r\nhttps://github.com/user-attachments/assets/33cfc4c6-116c-4133-8075-89526e2a252d\r\n\r\nAfter\r\n\r\nhttps://github.com/user-attachments/assets/9fba153f-e1e5-4e27-8040-edaed170c2fe\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki", + "labels": [] + }, + { + "number": 46362, + "title": "[NEXT-335] Migrates `src/amp/types`, `ViewportManager`, and associated files and utilities. ", + "branch": "amp-viewport-manager-2", + "merged_at": "2025-12-08T22:23:27Z", + "changed_files": 257, + "additions": 500, + "deletions": 465, + "body": "### Overview\r\n\r\n**Preamble** I apologize for the commit history in advance. This PR was subjected to death by 1,000,000 conflicts and had to have them resolved regularly over the last week. The first group of file changes to actual packages in the PR are the most important, then about 200+ files are just import changes. \r\n\r\nThis PR migrates core AMP types, `ViewportManager`, and associated viewport utilities from the main `src/` directory into the `@muralco/canvas` package. AMP types and `ViewportManager` and it's dependencies needed to be moved in the same PR due to circular dependencies between the AMP types and the viewport manager. \r\n\r\n### File Migrations\r\n\r\n#### AMP Types\r\n\r\n| Old Location | New Location | Package |\r\n|-------------|--------------|---------|\r\n| `src/amp/types/index.ts` | `packages/canvas/src/amp-core/types/common.ts` | `@muralco/canvas/amp-core` |\r\n\r\n#### ViewportManager\r\n\r\n| Old Location | New Location | Package |\r\n|-------------|--------------|---------|\r\n| `src/mural/models/viewport-manager.ts` | `packages/canvas/src/models/viewport-manager/viewport-manager.ts` | `@muralco/canvas/models` |\r\n| `src/mural/models/viewport-manager-consts.ts` | `packages/canvas/src/models/viewport-manager/viewport-manager-consts.ts` | `@muralco/canvas/models` |\r\n\r\n#### Viewport SDK API\r\n\r\n| Old Location | New Location | Package |\r\n|-------------|--------------|---------|\r\n| `src/mural/sdk/apis/viewport/types.ts` | `packages/canvas/src/sdk/apis/viewport/types.ts` | `@muralco/canvas/sdk/apis/viewport` |\r\n\r\n**New files created**:\r\n- `packages/canvas/src/sdk/apis/viewport/constants.ts` - Viewport constants\r\n- `packages/canvas/src/sdk/apis/viewport/get-widget-bounds.ts` - Widget bounds utilities\r\n- `packages/canvas/src/sdk/apis/viewport/index.ts` - Viewport API exports\r\n\r\n### Migrated Utilities\r\n\r\n#### Helper Functions\r\n\r\n| Function | Location |\r\n|----------|----------|\r\n| `engineBoxToRect` | `packages/canvas/src/helpers/engine-box-to-rect.ts` |\r\n| `getWidgetsRectFromE", + "labels": [] + }, + { + "number": 46402, + "title": "Dashboard Rows : flakey unit test - switch setup to userEvent click", + "branch": "patch-row-unit-test", + "merged_at": "2025-12-08T22:14:06Z", + "changed_files": 1, + "additions": 3, + "deletions": 1, + "body": "Skipping test", + "labels": [] + }, + { + "number": 46322, + "title": "[CPT-2451] Add tracking event when templates model is opened automatically", + "branch": "add/modal-open-tracking", + "merged_at": "2025-12-08T19:37:56Z", + "changed_files": 3, + "additions": 20, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a segment event when the templates modal is opened automatically.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2451) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://modal-open-tracking.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- Please follow these steps to perform a sufficient smoke test of these changes\r\n1. Go to the dashboard\r\n2. Click create new mural\r\n3. Go to the network tab and verify that this sends an event to segment called \"Automatically opened templates modal after mural creation\"\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between th", + "labels": [] + }, + { + "number": 46326, + "title": "[PLAY-739", + "branch": "fix/ai-research-company-search", + "merged_at": "2025-12-08T19:15:38Z", + "changed_files": 4, + "additions": 529, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, when a user enters a value in the ai-research modal company field, clicking the search button would not display the search results. \r\n\r\nWith these changes, we initiate search results when search button is clicked or on enter key press within the field. \r\nAdditionally, we handle mouse clicking on select field to open / close search results.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**PLAY-739**](https://mural.atlassian.net/browse/PLAY-739) to understand the context of this effort.\r\n\r\nDemo:\r\nhttps://www.loom.com/share/929ac24a23ae4c4db1919e944d1959cf\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State", + "labels": [] + }, + { + "number": 46392, + "title": "[CWI-2425] Make sure autoSync can be triggered only once", + "branch": "beta-fix/cwi-2425", + "merged_at": "2025-12-08T17:30:05Z", + "changed_files": 2, + "additions": 14, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMake sure autoSync can be triggered only once\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2425\n\n\n---\n\n> [!NOTE]\n> Ensures auto-sync runs a single time and prevents out-of-sync recalculation during active sync.\n> \n> - **Azure DevOps Ticket Panel (`src/mural/addons/azure-devops/azure-devops-ticket/index.tsx`)**\n> - Add `autoSyncTriggered` ref and gate `handleAutoSync` with `!autoSyncTriggered.current` to trigger auto-sync only once.\n> - **Sync Hook (`src/mural/addons/azure-devops/hooks/use-sync-with-azure-devops.ts`)**\n> - Include `isSyncing` guard in out-of-sync calculation and add it to the effect deps to avoid recalculations during syncing.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8e33b766ca0f14fece8af6ce6238a9ae9c4f9cb4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46384, + "title": "[SCQM-1495 Ensure proper casing in company colors modal and table", + "branch": "update/company-colors-sentence-casing", + "merged_at": "2025-12-08T16:59:47Z", + "changed_files": 3, + "additions": 10, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds correct sentence casing to the Company colors modal. For example `Color Type` -> `Color type`. Also updated a heading on the company colors table (admin page)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1495) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://company-colors-sentence-casing.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. On the company admins page, select the button to add a color\r\n 2. Observe all fields have the proper casing (first letter only caps)\r\n 3. Add the color\r\n 4. Observe the color table on the admin page headings have the proper casing\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mur", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46389, + "title": "[IAM-2291] [IAM-2292] [IAM-2294] [IAM-2296] Bug fixes for workspace user table v2 release", + "branch": "fix/iam-2291-and-co", + "merged_at": "2025-12-08T16:09:26Z", + "changed_files": 7, + "additions": 23, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- [x] Clear selection on page and sort change\r\n - We only want to change items that are on the current page\r\n- [x] Debounce search highlight\r\n - We don't want to highlight terms that might not be returned by the API\r\n- [x] Remove duplicate count in notification\r\n - `pluralize` already provide the count if `true` is passed as the 3rd parameter\r\n- [x] Mutations should invalidate workspace count query\r\n - So that workspace counts are updated\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2291**](https://mural.atlassian.net/browse/IAM-2291) clear selection on page and sort change\r\n- \ud83c\udff7\ufe0f [**IAM-2292**](https://mural.atlassian.net/browse/IAM-2292) debounce search highlight\r\n- \ud83c\udff7\ufe0f [**IAM-2294**](https://mural.atlassian.net/browse/IAM-2294) remove duplicate count in notification\r\n- \ud83c\udff7\ufe0f [**IAM-2296**](https://mural.atlassian.net/browse/IAM-2296) mutations should invalidate workspace count query\r\n- \ud83e\uddea [**iam-2291-and-co.mural.engineering**](https://iam-2291-and-co.mural.engineering)", + "labels": [] + }, + { + "number": 46387, + "title": "[NEXT-346] Remove `x-math` dependency", + "branch": "fix/x-math", + "merged_at": "2025-12-08T15:49:21Z", + "changed_files": 18, + "additions": 73, + "deletions": 240, + "body": "**[NEXT-346 Remove 'x-math' depandency from murally](https://mural.atlassian.net/browse/NEXT-346)**\r\n\r\nReplaced `x-math` by `@muralco/geometry`. Removed duplicated functions.\r\n\r\nThe environment: https://x-math.mural.engineering/", + "labels": [] + }, + { + "number": 46368, + "title": "[EN-3597] Add Business plan in the list of plans that allows guests", + "branch": "fix/ws-cx-business-plan", + "merged_at": "2025-12-08T12:52:40Z", + "changed_files": 1, + "additions": 6, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThe workspace CX tool was preventing workspaces to be updated to Business if the current workspace has guestsEnabled (the payload was sending guestsEnabled false and the API was returning a DISABLING_GUEST_FEATURE_NOT_ALLOWED error) . This PR adds the Business plan to the list of plans that allows guests.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.n", + "labels": [] + }, + { + "number": 46386, + "title": "[NEXT-345] Fix flaky modal pdf test", + "branch": "fix/modal-pdf-test", + "merged_at": "2025-12-06T01:15:59Z", + "changed_files": 2, + "additions": 6, + "deletions": 4, + "body": "Jira ticket: https://mural.atlassian.net/browse/NEXT-345", + "labels": [] + }, + { + "number": 46361, + "title": "[NEXT-338] Finish packaging company settings dashboard \ud83c\udf89 ", + "branch": "feat/next-338-move-final-comp-set-route", + "merged_at": "2025-12-06T00:05:17Z", + "changed_files": 39, + "additions": 115, + "deletions": 196, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR moves all the remaining code from the `src/company` folder into the `@muralco/company-settings` package, changing it's main export to routes that are consumed in the main routing file `src/route-config.tsx`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-338) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n- Nearly pure refactor (see note below), but these changes touch every part of the company dashboard so we should do a thorough smoke test\r\n\r\n> [!NOTE]\r\n> I am proposing one non-refactoring change here. The Company Insights view references [an error handler component](https://github.com/tactivos/murally/blob/master/src/modals/error-modal/controller.tsx#L10) borrowed from the dashboard that is supposed to launch a modal with a retry UI control [if fetching data for the view fails](https://github.com/tactivos/murally/blob/master/src/company/pages/collaboration-insights/index.tsx#L89). That modal has many references and extracting it to a shared package would dramatically increase the scope of this PR. In addition, I wasn't even actually able to successfully trigger it locally / I suspect it may have some implicit dependencies that mean it can only be run in the dashboard context. As such I am proposing to use a simple `MrlNotification` banner when an error is detected (see screenshot below, open to styling edits) that offers the same functionality, is a pattern we use in other places in the company settings dashboard, and eliminates the problem of resolving that external reference.\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n#", + "labels": [] + }, + { + "number": 46383, + "title": "[NEXT-149] Move RoomHeader to package", + "branch": "move/roomheader-package", + "merged_at": "2025-12-05T23:46:55Z", + "changed_files": 18, + "additions": 60, + "deletions": 52, + "body": "Move `RoomHeader` and `MuralFilter` and `MuralSorting` to package muralco/dashboard-room-page.\r\n\r\nLeft the test behind because it relies on test setup components that can't be packaged yet\r\n\r\ntest-env\r\nhttps://roomheader-package.mural.engineering/", + "labels": [] + }, + { + "number": 46360, + "title": "[NEXT-108] Move sdk-types package to canvas/sdk/apis", + "branch": "update/sdk-types-package", + "merged_at": "2025-12-05T22:59:03Z", + "changed_files": 108, + "additions": 158, + "deletions": 341, + "body": "### Jira ticket \r\nhttps://mural.atlassian.net/browse/NEXT-108\r\n\r\n### Test Environment\r\nhttps://sdk-types-package.mural.engineering", + "labels": [] + }, + { + "number": 46382, + "title": "[IAM-1997] fix: use defaulting; not a guard", + "branch": "fix/iam-1997-add-defaulting-for-perms", + "merged_at": "2025-12-05T22:44:52Z", + "changed_files": 2, + "additions": 15, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCorrects the logic for rendering the workspace ACR permission controls so they will always show, even when the workspace has never had those permission values set (a valid state for now).\r\n\r\n#### Reviewer Resources\r\n\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n- Check that for a newly created workspace without defaults, the controls still show with default values of `false`\r\n- Check that you can modify/save/discard changes as expected and saved changes persist across a refresh \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally", + "labels": [] + }, + { + "number": 46215, + "title": "[IAM-1995/1994]", + "branch": "add/iam-1995-company-visitor-roles", + "merged_at": "2025-12-05T21:51:27Z", + "changed_files": 15, + "additions": 1252, + "deletions": 94, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the company visitor invitation settings only supported permission-based access control (read/write permissions). Now, with these changes, the settings page conditionally displays role-based selectors when Roles-Based Access Control (RBAC) is enabled for a company, allowing admins to configure visitor roles (`mural#editor` or `mural#viewer`) instead of permissions.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket IAM-1995**](https://tactivos.atlassian.net/browse/IAM-1995) and [**IAM-1994**](https://tactivos.atlassian.net/browse/IAM-1994) to understand the context of this effort.\r\n\r\n### Key Changes\r\n\r\n#### API Type Updates\r\n- Added `roleId?: 'mural#editor' | 'mural#viewer' | null` field to `ShareSettings` interface in both `packages/api/src/companies.ts` and `packages/api/src/workspaces.ts`\r\n\r\n#### New Components\r\n- **`DefaultRole`** (`packages/settings/company-settings/src/views/general-settings/components/default-role-selector/index.tsx`): Main component for selecting default invite link roles\r\n- **`RoleSelector`** (`packages/settings/company-settings/src/views/general-settings/components/default-role-selector/roles/index.tsx`): Dropdown selector for choosing between Editor, Viewer, or No visitor access\r\n- **`DefaultAllowAnonymousEditorRole`** (`packages/settings/company-settings/src/views/general-settings/allow-visitor-invitations/default-allow-anonymous-editor-role.tsx`): Component for setting default role for new workspaces when RBAC is enabled\r\n\r\n#### Core Functionality Updates\r\n- **`AllowVisitorInvitations` component**: \r\n - Conditionally renders role selectors when `isRolesBasedAccessControlEnabled` is true\r\n - Maintains backward compatibility by showing permission selectors when RBAC is disabled\r\n - Added mapping functions (`mapPermissionToRole`, `mapRoleToPermission`) to ensure data consistency between permissions and roles\r\n - Updated all calculation functi", + "labels": [] + }, + { + "number": 46327, + "title": "[NEXT-335] Migrates prerequisite canvas constants & helpers for `src/amp/types`", + "branch": "amp-viewport-manager", + "merged_at": "2025-12-05T21:29:53Z", + "changed_files": 164, + "additions": 320, + "deletions": 293, + "body": "### Summary\r\nThis PR is part of a series of changes preparing to migrate `src/amp/types` to a package. This PR handles migrating some shared constants and helpers commonly used across the codebase. \r\n\r\n### What Changed\r\n\r\n#### New Package Exports\r\n\r\nAdded two new export paths to `@muralco/canvas`:\r\n\r\n- **`@muralco/canvas/helpers`** - Math and geometry utility functions\r\n- **`@muralco/canvas/sdk/common`** - SDK-level constants and configuration values\r\n\r\n#### Relocated Files\r\n\r\n| From | To |\r\n|------|-----|\r\n| `src/mural/helpers/math.ts` | `packages/canvas/src/helpers/math.ts` |\r\n| `src/mural/helpers/closest.ts` | `packages/canvas/src/helpers/closest.ts` |\r\n| `src/mural/sdk/consts-the-universe-must-be-aware-of.ts` | `packages/canvas/src/sdk/common/consts-the-universe-must-be-aware-of.ts` |\r\n\r\n### Import Changes\r\n\r\nAll imports across the codebase have been updated from local paths to package paths:\r\n\r\n```typescript\r\n// Before\r\nimport { clamp, round } from '../../../helpers/math';\r\nimport { TABLE_CELL_SEPARATION } from '../../../sdk/consts-the-universe-must-be-aware-of';\r\n\r\n// After\r\nimport { clamp, round } from '@muralco/canvas/helpers';\r\nimport { TABLE_CELL_SEPARATION } from '@muralco/canvas/sdk/common';\r\n```\r\n\r\n### Why\r\n\r\nThis is part of the ongoing effort to modularize the murally codebase for:\r\n- **Better code organization**: Shared utilities live in a dedicated package\r\n- **Reusability**: These utilities can now be used by other packages in the monorepo\r\n- **Future AMP migration**: Prepares viewport manager and related code for extraction\r\n", + "labels": [] + }, + { + "number": 46363, + "title": "[SCQM-1335] - Add another color company colors modal button", + "branch": "scqm-1335-create-another-color", + "merged_at": "2025-12-05T21:07:54Z", + "changed_files": 2, + "additions": 20, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a checkbox to the company colors add color modal, allowing users to more quickly create multiple colors. When checked, the modal will stay open and clear its state on saving a color, instead of closing. There is no impact to the rest of the saving/discard/state for saving colors.\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/SCQM-1335\r\nTest env: https://scqm-1335-create-another-color.mural.engineering\r\nSteps to test:\r\n\r\n- Make sure you have `globalAdmin: edit` set on your company profile in your local db if you don't already, in order to access the admin pages\r\n- Navigate manually to `/c/internal-sso/colors`\r\n- In the 'Colors' section, click 'Add company color' to open the add color modal\r\n- Test adding new colors with and without the checkbox toggled\r\n\r\n\"Screenshot\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+t", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46369, + "title": "Refactor Smart Planner utilitaries to reduce calls to `apply`", + "branch": "refactor/kanban-drag", + "merged_at": "2025-12-05T20:25:10Z", + "changed_files": 19, + "additions": 302, + "deletions": 209, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR refactors several utilitaries functions from within the Enhanced Kanban Board and Smart Planner code to attempt to minimize the number of calls to `widgets.changes.apply`.\r\nThere's no expected change in behavior or logic whatsoever here, everything is supposed to be working exactly as it always did.\r\n\r\n
\r\nMotivation behind this change \ud83d\udc47 \r\nAs part of the refactor of the code to use the `Widget Changes API` for widget updating and to run systems for side effects, we find ourselves with the task of making some business changes along the way. \r\nOne of those is the fact that _dragging_ now operates in the following way: on each drag movement, we `reset` any applied change, gather all the new information for the new delta, and `apply` the new changes.\r\nThis means, for the systems, that each dragging step is actually a sort of \"unique atomic\" movement between the **initial** position and the **current** (i.e. no middle steps).\r\n\r\nThe problem with this approach is that dragging (as well as other actions in the app) can be modified on the fly by some middleware hooks that can register to specific dragging-related actions (before drag start, after drag move, etc).\r\nGiven that we use an observer pattern for handling hooks, we have no control over what each handler does, and that means that a handler can potentially `apply` and even `commit` changes in our model.\r\nOnce a change has been committed, it can be reset, and that represents a problem.\r\n\r\nOne of the main actors here that implements such logic is the Smart Planner which does, in fact, apply and commit changes within hook handlers.\r\n\r\nRefactoring that entire code to prevent such behavior is a really big and demanding task, far too much for a single PR, and that's why you're looking now at one of the PRs that helps achieve that goal.\r\n
\r\n\r\n\ud83c\udf0e **Test env:** https://kanban-drag.mural.engineering/\n\n", + "labels": [] + }, + { + "number": 46364, + "title": "Refactor toasts", + "branch": "refactor/toasts", + "merged_at": "2025-12-05T19:04:11Z", + "changed_files": 4, + "additions": 13, + "deletions": 55, + "body": "Toasts now using ui-toolkit for Link and Close button\r\n\"image\"\r\n\r\n\r\ntest-env: \r\nhttps://toasts.mural.engineering/", + "labels": [] + }, + { + "number": 46366, + "title": "[NEXT-339] Move toast to package", + "branch": "move/toast-package", + "merged_at": "2025-12-05T19:04:09Z", + "changed_files": 53, + "additions": 302, + "deletions": 105, + "body": "Moves toast notification components to package `muralco/toast`\r\n\r\nAlso refactors dashboard toast to use ui-toolkit components (Link and Close icon)", + "labels": [] + }, + { + "number": 46375, + "title": "[NEXT-316] Add @deprecated JSDoc and rename imports to deprecatedFetchUser", + "branch": "migrate/next-316-package-verify-token-route-2", + "merged_at": "2025-12-05T18:51:10Z", + "changed_files": 7, + "additions": 18, + "deletions": 16, + "body": "# Add @deprecated JSDoc and rename imports to deprecatedFetchUser\r\n\r\n## What problem are we solving?\r\nThe `deprecatedFetchUser` function was exported with a deprecated name but imported as `fetchUser` throughout the codebase, creating inconsistency and confusion. Additionally, the deprecation notice was only a comment rather than a proper JSDoc `@deprecated` tag, which doesn't show up in IDE tooltips or generate proper deprecation warnings.\r\n\r\n## Changes made\r\n- Added `@deprecated` JSDoc tag to `deprecatedFetchUser` function with reference to the replacement (`fetchUser` from `@muralco/authentication-lib`)\r\n- Renamed all imports from `fetchUser` to `deprecatedFetchUser` to match the actual function name across 6 files:\r\n - `src/common/routes.ts`\r\n - `src/middleware/require-authentication.ts`\r\n - `src/mural/routes/middleware/set-public-template.ts`\r\n - `src/mural/routes/middleware/set-temporary-mural.ts`\r\n - `src/mural/routes/mural.tsx`\r\n - `src/mural/routes/middleware/set-public-template.test.ts`\r\n\r\n### Important call-outs\r\n- This is a **pure refactor** that improves code clarity and consistency\r\n- No functional changes - all behavior remains the same\r\n- The function is already deprecated and should be replaced with `fetchUser` from `@muralco/authentication-lib` in future work\r\n- IDE tooltips will now properly show the deprecation warning when using this function\r\n\r\n\n\n---\n\n> [!NOTE]\n> Renames all imports/usages of the legacy fetch-user wrapper to `deprecatedFetchUser` and adds an `@deprecated` JSDoc pointing to `fetchUser` from `@muralco/authentication-lib`.\n> \n> - **Auth middleware**\n> - Add `@deprecated` JSDoc to `deprecatedFetchUser` in `src/middleware/fetch-user.ts` and clarify replacement with `@muralco/authentication-lib` `fetchUser`.\n> - **Replace imports/calls**\n> - Switch `fetchUser` \u2192 `deprecatedFetchUser` across:\n> - `src/common/routes.ts`\n> - `src/middleware/require-authentication.ts`\n> - `src/mural/routes/mid", + "labels": [] + }, + { + "number": 46315, + "title": "Migrate MFA content protection tests from v1 to v2 (ECOMM-276)", + "branch": "add/security-test", + "merged_at": "2025-12-05T18:42:21Z", + "changed_files": 5, + "additions": 132, + "deletions": 113, + "body": "## Migrate MFA Content Protection Tests from Cucumber to Jest\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-276\r\n\r\n### Summary\r\nMigrated from V1 Cucumber scenarios to V2 Cucumber.\r\n\r\n### Testing\r\n- \u2705 All Cucumber tests pass", + "labels": [] + }, + { + "number": 46372, + "title": "Move widget proto definition to `canvas/models` package", + "branch": "refactor/canvas-pkg-protos", + "merged_at": "2025-12-05T18:29:59Z", + "changed_files": 49, + "additions": 224, + "deletions": 206, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR simply moves everything related to the definition of widget protos from the `canvas/dispatcher` package onto `canvas/models`.\r\n\r\nEvery reference has been updated for this new path.\r\n\r\nNo test env needed since the update consists only on path moving.\r\n\n\n---\n\n> [!NOTE]\n> Moves widget proto types/guards to `@muralco/canvas/models` and updates all references; removes proto definitions from dispatcher.\n> \n> - **Models**:\n> - Add `models/protos` module with `types.ts`, `type-guards.ts`, and `index.ts`; export protos via `models/index`.\n> - **Dispatcher/Sidebar**:\n> - Remove in-file proto type definitions; consume `SingleWidgetProto`, `WidgetProto`, guards from `@muralco/canvas/models`.\n> - **Codebase-wide import updates**:\n> - Replace imports from `@muralco/canvas/dispatcher` to `@muralco/canvas/models` across addons, dispatcher modules, helpers, SDK, tests, and views.\n> - Minor coalesced imports (e.g., `defaultPhoto`, `Layout`) now sourced from `@muralco/canvas/models`.\n> - **Behavior**:\n> - No functional changes; structural type relocation and re-exports only.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c973738b538e5630b29455188e6f9f2e0006cd76. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46145, + "title": "[SCQM-1352] - Themes ui updates, add hover state", + "branch": "add/scqm-1352-themes-ui-update", + "merged_at": "2025-12-05T17:43:59Z", + "changed_files": 12, + "additions": 487, + "deletions": 461, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMakes some UI updates to the theme tool, as well as adding a hover state to display 'shuffle' text and graphic.\r\n\r\nJIRA Ticket: https://mural.atlassian.net/browse/SCQM-1352\r\nTest env: https://scqm-1352-themes-ui-update.mural.engineering/\r\n\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Updates the theme tool UI with a hover \u201cShuffle\u201d state, switches to CSS modules, consumes `companyThemes` from the API, and refactors themi", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46266, + "title": "[NEXT-341] Update/room filter sorting toolkit", + "branch": "update/room-filter-sorting-toolkit", + "merged_at": "2025-12-05T17:02:39Z", + "changed_files": 10, + "additions": 127, + "deletions": 211, + "body": "In room page's header, replace AccessibleMenu with ui-toolkit's MrlMenu for Sorting and Filter components.\r\n\r\nReplace old legacy/ui/ArrowIcon with ui-toolkit MrlSvg and chevron-down ds-icon.\r\n\r\n", + "labels": [] + }, + { + "number": 46216, + "title": "[SCQM-1440] Adds post-accept tracking for diagram", + "branch": "add/scqm-1440-backend-tracking", + "merged_at": "2025-12-05T16:44:02Z", + "changed_files": 7, + "additions": 64, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Added feature flag enable-ai-diagram-tracking to Optimizely constants for controlling tracking functionality\r\n- Created tracking API module (packages/api/src/tracking.ts) with startSession() endpoint for POST /api/tracking/sessions/start\r\n- Modified preview mode setup to accept optional onAccept callback parameter in startAIDiagrammingPreviewMode()\r\n- Implemented tracking in diagram creation that fires when user clicks Accept, generating sessionID (UUID v4) and sending muralId, userId, aiRunId, and widgetIds\r\n\r\nAPI: https://github.com/tactivos/mural-api/pull/14939/\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1440) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1440-backend-tracking.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these ", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46330, + "title": "[CAN-8135] Migrate current onboarding from Pendo to Murally", + "branch": "add/replace-pendo-onboarding", + "merged_at": "2025-12-05T15:37:41Z", + "changed_files": 45, + "additions": 931, + "deletions": 1365, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, there was a suppressOnboardingQuest implementation using Pendo that provided basic onboarding guidance for a reduced set of users, the remaining ones would see a 5 step tutorial referenced as 'quest v2'. Both addons were initialized by external systems and this caused maintaining them overly complicated. In this PR I am removing both the onboarding quest and the suppressing addon in favor of a new version 'canvasOnboarding' with a straightforward implementation:\r\n\r\n\"image\"\r\n\r\n\r\n\"image\"\r\n\r\n\r\n#### Related PRs:\r\n- Mural Api: Remove unused code used to execute the addons \r\nhttps://github.com/tactivos/mural-api/pull/15011\r\n\r\n#### Loom: \r\n[Free Accounts new onboarding\r\n](https://www.loom.com/share/1daf3ab415be40679386096ee909298d)\r\n[Enterprise Accounts new onboarding\r\n](https://www.loom.com/share/643ddacfeb8942ba878c35bc8e4ed672)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8135) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**TEST ENV**](https://replace-pendo-onboarding.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46333, + "title": "[CAN-8199] Fix area to area and child to area selection in areas improvements", + "branch": "fix/can-8199", + "merged_at": "2025-12-05T14:25:29Z", + "changed_files": 9, + "additions": 1233, + "deletions": 270, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes area to area selection when areas improvements flag is enabled. Be sure to also turn on the nested areas flag for fully testing the scenarios below!\r\n\r\nIt also refactors the feature to be unit tested in a single API.\r\n\r\nBackground:\r\n- We have areas A1, A2 and A3.\r\n- A1 is the parent of A2, A3 is on the side of both of them without overlapping\r\n- Area A2 has child sticky S1\r\n- Area A3 has child sticky S2\r\n\r\nScenarios:\r\n- [ ] S1 is selected, when clicking on empty space of A2, selection is cleared\r\n- [ ] Selection is clear, when clicking on empty space of A2, A2 is selected \r\n- [ ] A2 is selected when clicking on empty space of A1, selection is cleared\r\n- [ ] Selection is clear, when clicking on empty space of A1, A1 is selected \r\n- [ ] A1 is selected, when clicking on empty space of A2, A2 is selected\r\n- [ ] A2 is selected, when clicking on empty space of A3, A3 is selected\r\n- [ ] A3 is selected, when clicking on empty space of A1, A1 is selected\r\n- [ ] A1 is selected, when clicking on S2, S2 is selected\r\n- [ ] S2 is selected, when clicking on empty space of A3, selection is cleared\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8199\r\n- Env: https://can-8199.mural.engineering\r\n\r\n\n\n---\n\n> [!NOTE]\n> Fixes area-to-area and child-to-area selection under areas improvements by introducing a dedicated `AreaInteractionHandler` and wiring it into `MouseManager`, with comprehensive unit and feature tests.\n> \n> - **Core (areas interaction)**:\n> - Introduce `area-interaction` module: `index.ts` (handler API), `types.ts` (action/state types), `util.ts` (`DRAG_THRESHOLD`).\n> - Handler manages pending selection, toggle-deselect, descendant checks, and feature-flag gating (`ENABLE_AREAS_IMPROVEMENTS`).\n> - Define drag/pan behavior: trackpad always `start-drag`; mouse empty-space in areas-with-children => `allow-pan`; hints => `start-drag`; locked empty ar", + "labels": [] + }, + { + "number": 46367, + "title": "[CAN-8225] Remove legacy bounds functions", + "branch": "fix/can-8225", + "merged_at": "2025-12-05T13:48:20Z", + "changed_files": 8, + "additions": 64, + "deletions": 181, + "body": "[CAN-8225 Refactor widget helper functions for viewport manager](https://mural.atlassian.net/browse/CAN-8225)\r\n\r\nIn this PR:\r\n* Removed `getInaccurateWidgetBounds`\r\n* Removed `getInaccurateAmpWidgetBounds`\r\n* Removed `getInaccurateWidgetGroupBoundsWithoutUsingAbsolutePositions`\r\n* Removed `getInaccurateWidgetGroupBounds` (`adjustLoadingLinks` is always false)\r\n* Removed `rotateAroundPoint` function\r\n\r\nThe environment: https://can-8225.mural.engineering/", + "labels": [] + }, + { + "number": 46329, + "title": "[IAM-2264] feat: move workspace user table to pkg", + "branch": "feat/iam-2265-pkg", + "merged_at": "2025-12-05T08:37:10Z", + "changed_files": 102, + "additions": 59, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n```\r\nmv src/[..]/workspace-users packages/settings/workspace-settings/src/views/\r\n```\r\n\r\nThat\u2019s it.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2264**](https://mural.atlassian.net/browse/IAM-2264)\r\n- \ud83e\uddea Testing environment incoming\r\n- \ud83c\udfac Loom demo incoming", + "labels": [] + }, + { + "number": 46281, + "title": "Mural role permissions matrix", + "branch": "add/iam-2271-learn-more", + "merged_at": "2025-12-04T22:53:33Z", + "changed_files": 15, + "additions": 621, + "deletions": 6, + "body": "IAM-2274 Add learn more button and the permissions matrix\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\nThis PR adds the mural role permissions matrix modal same as room role matrix.\r\n\"image\"\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2271) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2271-learn-more.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How", + "labels": [] + }, + { + "number": 46357, + "title": "[CWI-2454] Update to support multi pdf imports", + "branch": "add/cwi-2454-multi-pdf", + "merged_at": "2025-12-04T21:47:05Z", + "changed_files": 3, + "additions": 46, + "deletions": 34, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdate to support multi pdf imports.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2454 to understand the context of this effort.\r\n- Please see https://www.loom.com/share/78a94844e7484ba3a964a07bb76c8439 of the acceptance criteria for the above ticket\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/15014\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46297, + "title": "feat(admin-reports): add ScheduledDynamicDateFilter to report filters", + "branch": "feat/ipa-236-add-dynamic-date-ranges", + "merged_at": "2025-12-04T20:56:36Z", + "changed_files": 15, + "additions": 589, + "deletions": 150, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principl", + "labels": [] + }, + { + "number": 46337, + "title": "[ENGAGE-1428] Fix mural.new flow", + "branch": "fix/mural-new-flow", + "merged_at": "2025-12-04T20:45:08Z", + "changed_files": 2, + "additions": 2, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1428) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mural-new-flow.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://", + "labels": [] + }, + { + "number": 46306, + "title": "[NEXT-335] Modularize supporting types for src/amp/types", + "branch": "canvas-amp-types-package", + "merged_at": "2025-12-04T20:11:47Z", + "changed_files": 80, + "additions": 201, + "deletions": 193, + "body": "### Summary\r\n\r\nThis is a prerequisite PR for modularizing `src/amp/types`. This PR is moving dependencies that are up the chain from `src/amp/types` to prepare those types for modularization. \r\n\r\nThis migrates specific canvas-related types from the `src/mural` directory into the `@muralco/canvas` package to support that effort.\r\n\r\n### What Changed\r\n\r\n#### Key Changes:\r\n\r\n- Creates new export paths in `@muralco/canvas` for dispatcher, register, and SDK types\r\n- Migrates widget proto types, sidebar types, and extension interfaces to the canvas package\r\n- Updates ~78 import statements across the codebase to use the new package imports\r\n- Update linter layers to allow `@muralco/canvas`\r\n\r\n**Files Moved/Refactored**:\r\n\r\n| From | To |\r\n|------|-----|\r\n| `src/mural/dispatcher/sidebar/types.ts` | `packages/canvas/src/dispatcher/sidebar/types.ts` |\r\n| `src/mural/register/types.ts` (partial) | `packages/canvas/src/register/common/types.ts` |\r\n| `src/mural/register/types.ts` (partial) | `packages/canvas/src/register/diagramming/types.ts` |\r\n| `src/mural/sdk/apis/sidebar/types.ts` (partial) | `packages/canvas/src/sdk/apis/sidebar/types.ts` |\r\n", + "labels": [] + }, + { + "number": 46335, + "title": "NEXT-128 - Package /access-required route", + "branch": "add/next-128", + "merged_at": "2025-12-04T19:54:50Z", + "changed_files": 22, + "additions": 801, + "deletions": 30, + "body": "## Pull request overview\r\n\r\nThis PR extracts the `/access-required` route from `src/registration/access-required/` into a new standalone package `@muralco/route-access-required` as part of the modularization effort. The package handles the UI flow when users attempt to access a mural without proper permissions.\r\n\r\n**Key changes:**\r\n- Creates new package structure with proper TypeScript, Jest, and Webpack configuration\r\n- Migrates `AccessRequired` and `RequestSent` components to the new package\r\n- Adds comprehensive test coverage (22 tests total) with accessibility-focused queries\r\n- Updates import statements in consuming files (`src/registration/routes/index.tsx` and `src/mural/hoc/with-mural/index.tsx`)\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 18 out of 22 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `packages/route-access-required/package.json` | Package configuration with dependencies and build scripts |\r\n| `packages/route-access-required/src/AccessRequired.tsx` | Main component handling access request flow with import path updates |\r\n| `packages/route-access-required/src/RequestSent.tsx` | Success state component with partial `attrs` pattern removal |\r\n| `packages/route-access-required/src/AccessRequired.module.sass` | Styling for AccessRequired component with design token usage |\r\n| `packages/route-access-required/src/RequestSent.module.sass` | Styling for RequestSent component with design token usage |\r\n| `packages/route-access-required/src/AccessRequired.test.tsx` | Comprehensive test suite with 14 test cases |\r\n| `packages/route-access-required/src/RequestSent.test.tsx` | Test suite with 6 test cases for success state |\r\n| `packages/route-access-required/src/index.test.ts` | Package export verification tests |\r\n| `packages/route-access-required/tsconfig.json` | TypeScript configuration extending shared React config |\r\n| `packages/", + "labels": [] + }, + { + "number": 46345, + "title": "[NEXT-336] Aggregate user types and functions to user package", + "branch": "refactor/participant-to-user", + "merged_at": "2025-12-04T18:36:40Z", + "changed_files": 172, + "additions": 464, + "deletions": 691, + "body": "### JIra ticket\r\n[NEXT-336](https://mural.atlassian.net/browse/NEXT-336)\r\n\r\n### Test environment\r\nhttps://participant-to-user.mural.engineering\n\n[NEXT-336]: https://mural.atlassian.net/browse/NEXT-336?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46344, + "title": "[SCQM-1511] Handle connected and isolated cycles", + "branch": "fix/ai-diagram-bi-directional", + "merged_at": "2025-12-04T18:14:30Z", + "changed_files": 8, + "additions": 86, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the mermaid diagram was erroring out quite frequently when you tried to do multi direction charts --- aka `A <--> B` that creates a loop. \r\n\r\nChanges:\r\n1. In the function definition (API side), specify that any user provided multi direction arrows should be replaced by two single direction arrows. While technically mermaid supports this, it doesn't seem to work reliably and a quick google said that it is known to be inconsistent / buggy. \r\n2. In the UI, we were previously excluding cycles from the `depthGroups` so when you requested a diagram that only contained a cycle, `depthGroups` being empty meant the `gridLayout` was empty which meant when trying to add the widgets, there was a type error when trying to get the X coordinate from a layout element that didn't exist. \r\n\r\n\r\nAlso I added d1fcdcc9923d22bec3fb63e6ebc2b067fbf4710e for [SCQM-1512](https://mural.atlassian.net/browse/SCQM-1512) to allow single node \"charts\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1511) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-diagram-bi-directional.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nThese are the prompts from the ticket I used to test with, maybe try to create other varieties:\r\n\r\n1. `create a flowchart TD start` to test the single node fix\r\n2. `create a flow chart where A connects to B and B connects to A` \r\n3. `flowchart TD A <--> B A --> C B --> C`\r\n5. `Build a diagram that must be bidirectional: A flows to B, B flows back to A, and both connect downward to C.`\r\n6. If you want to get crazy, you can run this one that I had cursor create to test these changes ([what it should look like](https://mermaid.live/edit#pako:eN", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46350, + "title": "[IPA-304] collaboartion insights package: fix export names", + "branch": "add/ipa-304-improvement", + "merged_at": "2025-12-04T17:00:27Z", + "changed_files": 21, + "additions": 27, + "deletions": 47, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\nFixing export names in CI package", + "labels": [] + }, + { + "number": 46347, + "title": "feat: move settings wrapper component; update refs", + "branch": "feat/next-303-package-settings", + "merged_at": "2025-12-04T16:47:56Z", + "changed_files": 16, + "additions": 34, + "deletions": 52, + "body": "### Summary of Changes and Resources for the Reviewer\r\nChoo choo! More packaging of the company settings dashboard \ud83d\ude82 \r\n\r\n- Moves the `settings` folder into `@muralco/company-settings`\r\n- Updates refs, exports and dependencies accordingly\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-303) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-303-package-settings.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n\r\nPure refactor; smoke test the General Settings and Company Colors views\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/P", + "labels": [] + }, + { + "number": 46348, + "title": "[CAN-8176] Zoom to selection center when a selection is active", + "branch": "add/zoom-selection", + "merged_at": "2025-12-04T16:16:43Z", + "changed_files": 2, + "additions": 82, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes discrete zoom was performed relative to the center of the screen\r\n Now, with these changes, if is there a selection, will do it relative to the center of the selection\r\n\r\nHow to test this change:\r\nSelect a widget in the corner of the screen \r\npress +/- from the toolbar or use the keyboard shortcut.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8176) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://zoom-selection.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46288, + "title": "[NEXT-329] Refactor /integration-uh-oh to integration package ", + "branch": "refactor/integration-uh-oh-pkg", + "merged_at": "2025-12-04T14:18:31Z", + "changed_files": 7, + "additions": 30, + "deletions": 27, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the integration error page component (`/integration-uh-oh`) from the main application into the `@muralco/integrations` package, improving code organization and maintainability.\r\n\r\n**Key Changes:**\r\n- Moved the integration error component from `src/error/integration/` to `packages/integrations/src/error/something-went-wrong/`\r\n- Introduced `IntegrationErrorRoutes()` function to encapsulate integration error routing\r\n- Updated test files to import the component from the integrations package\r\n\r\n#### Reviewer Resources\r\n- Closes: https://mural.atlassian.net/browse/NEXT-329\r\n- Test env: https://integration-uh-oh-pkg.mural.engineering/\r\n\r\n#### How to test?\r\n\r\n- [x] If this URL loads, works: https://integration-uh-oh-pkg.mural.engineering/integration-uh-oh?clientName=Acme\r\n\n\n---\n\n> [!NOTE]\n> Moves the `/integration-uh-oh` error screen into `@muralco/integrations` and centralizes its routing via `IntegrationErrorRoutes`, updating app wiring and tests.\n> \n> - **Integrations**:\n> - Export `IntegrationSomethingWentWrong` (authenticated wrapper) for the integration error screen.\n> - Add `IntegrationErrorRoutes()` providing `/integration-uh-oh` route (parses `clientId`, `clientName`, `error` via `qs`).\n> - **App Error Routing**:\n> - Replace inline `/integration-uh-oh` route with `...IntegrationErrorRoutes()` in `src/error/index.tsx`.\n> - **Tests**:\n> - Update test page to import and render `IntegrationSomethingWentWrong` from `@muralco/integrations`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3136b1242ef44a87caa37910f7f669dd26bea160. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46192, + "title": "[CPT-2430] Add event based actions for template cards", + "branch": "add/event-based-share-action", + "merged_at": "2025-12-04T13:22:50Z", + "changed_files": 13, + "additions": 303, + "deletions": 136, + "body": "\u2139\ufe0f Please check commit by commit for a better reviewing experience \u2139\ufe0f \r\n\r\n### Summary of Changes and Resources for the Reviewer\r\nThis PR implements the new Event Based actions for template cards but only replaces the share template action for now.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2430) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://event-based-share-action.mural.engineering/) to perform a smoke test. \r\nSince this is involves no feature changes we just need to check for regressions in the dashboard. To do this we should check if the action of sharing a template (opening the share modal) works fine in every place a card appears in the dashboard, that includes: \r\n\r\n 1. Role page\r\n 2. Use cases page\r\n 3. Recents page (templates tab)\r\n 4. Starred page (templates tab)\r\n 5. Templates page\r\n 6. Search results page (templates tab)\r\n 7. Profile page\r\n\r\nThe test should include the following (use a template created by you whenever possible):\r\n\r\n1. Click the `Share` action to open the `Share template` modal\r\n2. Click the `Public Link` tab (whenever possible)\r\n3. Click the `Create public link` button. Wait for the public link to be generated. Close the modal. (whenever possible)\r\n4. Open the modal again and go to the `Public link` tab. Verify that the tab has a public link. (whenever possible)\r\n5. Delete the public link. Close the modal. Open it again and verify that the `Public link` tab doesn't have the public link this time. (whenever possible)\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduce `TemplateActionsManager` to register/inject template card actions and migra", + "labels": [] + }, + { + "number": 46343, + "title": "[NEXT-301] move InternalTools grouping component into company-settings package", + "branch": "feat/next-301-package-internal-tools", + "merged_at": "2025-12-04T05:31:18Z", + "changed_files": 7, + "additions": 787, + "deletions": 785, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to / similar to https://github.com/tactivos/murally/pull/46318\r\n\r\n- Moves the (mercifully untangled!) `InternalTools` grouping component into `@muralco/company-settings`.\r\n- Adds a package dependency for `@muralco/company-template-collections` where that view is developed and an `@muralco/beacon` reference\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-301) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian", + "labels": [] + }, + { + "number": 46209, + "title": "[SCQM-1147] - Add themes to company settings admin page", + "branch": "add/scqm-1147-themes-admin-ui", + "merged_at": "2025-12-03T23:03:39Z", + "changed_files": 9, + "additions": 806, + "deletions": 25, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a new section for Themes to the company admin colors page. This section allows admins to create, edit, and delete company themes using the company colors they have set. The setup follows the same pattern as for company colors, with the same functionality for discard/save at the page level.\r\n\r\nThemes are also automatically updated as company colors are updated and deleted.\r\n\r\nmural-api PR: \r\n\r\n#### Reviewer Resources\r\nJIRA Ticket: https://mural.atlassian.net/browse/SCQM-1147\r\nTest env: https://scqm-1147-themes-admin-ui.mural.engineering/\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good tech", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46320, + "title": "[NEXT-273] Move `WidgetStore` into `canvas-widgets`", + "branch": "fix/next-273-2", + "merged_at": "2025-12-03T21:44:21Z", + "changed_files": 301, + "additions": 1148, + "deletions": 757, + "body": "**[NEXT-273 Move WidgetStore, System types, patchWidget, and diffWidget into a separate package](https://mural.atlassian.net/browse/NEXT-273)**\r\n\r\nIn this PR:\r\n* Moved `WidgetStore` and related structures into `canvas-widgets`\r\n* Moved bounds related function into `canvas-widgets`\r\n* Moved `BoundsBuilder` into geometry package\r\n\r\nThe environment: https://next-273-2.mural.engineering/", + "labels": [] + }, + { + "number": 46323, + "title": "[NEXT-331] Migrates canvas defaults to canvas/models and updates import paths", + "branch": "update/canvas-package-defaults-types", + "merged_at": "2025-12-03T21:26:47Z", + "changed_files": 68, + "additions": 104, + "deletions": 98, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMigrates the `/src/mural/defaults` to the `packages/canvas/src/models` \r\n- Updates imports for all tests and features\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-331) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Centralizes widget/theme defaults under `@muralco/canvas/src/models`, wires in `@muralco/color-palette`, and refactors the codebase to use the new module and shared constants.\n> \n> - **Packages / Build**\n> - Add `@muralco/color-palette` dependency to `@muralco/canvas`; update lockfile.\n> - Introduce **`packages/canvas/src/models`**:\n> - New `defaults.ts` centralizes widget/theme defaults and color palette integration (`ColorPalette` with `onUpdate`).\n> - New `index.ts` re-exports `getWidgetText`, `*` from `./defaults` and `./types`.\n> - Internalize some constants (`WIDGET_STICKY`, `WIDGET_TEXTBOX`) and make `updateColorDefaults` internal.\n> - **Refactors (repo-wide)**\n> - Replace legacy `src/mural/**/defaults` imports with `@muralco/canvas/models` across AI features, core UI (context menu, toolbar, keyboard handlers), paste handlers (Azure DevOps, Jira, general), widgets/dispatcher (sidebar, widgets API, mural flow), business logic (absorption, area creation, go-to-widget), shapes, and tests (mermaid, research-mural, sdk-context).\n> - St", + "labels": [] + }, + { + "number": 46324, + "title": "[SCQM-1502] Move diagramming `requestId` and `location` to diagram specific events", + "branch": "update/diagram-request-id", + "merged_at": "2025-12-03T20:54:24Z", + "changed_files": 8, + "additions": 52, + "deletions": 27, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes and before we had diagram_start / success / fail events - I'd added the requestId / location to the ai_function_called event. Then the diagram_start / success / fail were added so this work is to move the requestId / location values to those more specific events for easier tracking. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1502) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://diagram-request-id.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\"Screenshot\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46318, + "title": "[NEXT-300] move security grouping component to company-settings package", + "branch": "feat/next-300-move-sec-section", + "merged_at": "2025-12-03T20:39:00Z", + "changed_files": 54, + "additions": 308, + "deletions": 357, + "body": "### Summary of Changes and Resources for the Reviewer\r\nFollow up to/similar to https://github.com/tactivos/murally/pull/46307.\r\n\r\n- Moves common types, utils etc. from `@muralco/company-settings` => `@muralco/settings-commons` so the `@muralco/enterprise-security` and `@muralco/identity-and-access-management` packages no longer reference `@muralco/company-settings` (would create a circular dependency once the grouping component is moved into that package, which references `@muralco/enterprise-security` and `@muralco/identity-and-access-management` \ud83d\ude43 )\r\n- Moves the (now freed) `src/company/settings` folder into `@muralco/company-settings`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-300) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://next-300-move-sec-section.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPure refactor: smoke test the company dashboard, especially the views underneath the `Security` section\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debugger", + "labels": [] + }, + { + "number": 46295, + "title": "[CAN-8174] Show default cursor when hovering a draggable element", + "branch": "add/default-cursor", + "merged_at": "2025-12-03T19:21:36Z", + "changed_files": 11, + "additions": 82, + "deletions": 97, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes when hovering a draggable element the cursor change to pointer\r\n Now, with these changes, we keep the default cursor\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8174) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://default-cursor.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46325, + "title": "[NEXT-337] Remove TeamRoleModal that's no longer used", + "branch": "remove/old-team-role-modal", + "merged_at": "2025-12-03T19:09:36Z", + "changed_files": 29, + "additions": 99, + "deletions": 1023, + "body": "Remove old TeamRoleModal that no longer exists.\r\nThe new profile questionnaire uses different fields.\r\n\r\nThis removes all logic related to setting the old fields (or setting the \"ask me later\" field)\r\n\r\nhttps://old-team-role-modal.mural.engineering/", + "labels": [] + }, + { + "number": 46263, + "title": "[SCQM-1278] Update members list ownership", + "branch": "update/members-list-ownership", + "merged_at": "2025-12-03T18:08:40Z", + "changed_files": 1, + "additions": 1, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis transitions ownership of the Members list in the top right toolbar from smart canvas to IAM. No code changes. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1278) to understand the context of this effort.\r\n\r\nhttps://www.loom.com/share/ddaa5e2e72b946a3b10fa82d8ed80907\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46311, + "title": "Migrate Mural types.ts to @muralco/canvas/models", + "branch": "modularize-mural-types", + "merged_at": "2025-12-03T17:34:51Z", + "changed_files": 109, + "additions": 136, + "deletions": 131, + "body": "Migrates `src/mural/types.ts` to `@muralco/canvas/models`\r\n\r\n### Key Changes:\r\n- Created new packages/canvas/src/models/types.ts with all type definitions and type guard functions previously in src/mural/types.ts\r\n- Added required dependencies to @muralco/canvas package (@muralco/canvas-engine-types, @muralco/geometry, @muralco/types)\r\n- Updated linter configuration to allow imports from @muralco/canvas/models\r\n- Systematically updated ~120+ files to import types from the new package location\r\n- Removed reexport of `Rect` and `Size` from `@muralco/types` in `mural/types.ts`", + "labels": [] + }, + { + "number": 46300, + "title": "[NEXT-333][NEXT-334] @muralco/canvas/amp subpackage + initial modularization", + "branch": "canvas-amp-package", + "merged_at": "2025-12-03T16:37:34Z", + "changed_files": 20, + "additions": 37, + "deletions": 30, + "body": "## @muralco/canvas `amp-core` & `amp-models` Package Creation\r\n\r\n### Summary\r\n\r\nThis PR creates new package exports (`amp-core` and `amp-models`) within the `@muralco/canvas` package, consolidating AMP (Ampersand) related types, state management, and utilities into the canvas package for better modularity and reusability.\r\n\r\n### Changes\r\n\r\n#### New Package Exports\r\n\r\nAdded two new exports to `@muralco/canvas`:\r\n\r\n- **`@muralco/canvas/amp-core`** - Core AMP functionality including:\r\n - State management (`setFlag`, `getFlag`)\r\n - Type definitions (`AmpModel`, `WidgetState`, `WidgetRaw`, etc.)\r\n - Utility functions (`copyFromModel`, `shallowDifferent`, `getComputeStateFromModelFn`)\r\n\r\n- **`@muralco/canvas/amp-models`** - Placeholder for future AMP model exports\r\n\r\n#### File Reorganization\r\n\r\n| Previous Location | New Location |\r\n|-------------------|--------------|\r\n| `src/amp/state/flags.ts` | `packages/canvas/src/amp-core/state/flags.ts` |\r\n| `src/amp/types/state.ts` | `packages/canvas/src/amp-core/types/state.ts` |\r\n| `src/amp/types/raw-state.ts` | `packages/canvas/src/amp-core/types/raw-state.ts` |\r\n| `src/amp/types/widget-raw.ts` | `packages/canvas/src/amp-core/types/widget-raw.ts` |\r\n\r\n#### Import Updates\r\n\r\nUpdated the following files to use the new `@muralco/canvas/amp-core` import path:\r\n\r\n- `src/amp/helpers.ts`\r\n- `src/amp/types/index.ts`\r\n- `src/models/ajax-config.ts`\r\n- `src/mural/models/mural-member.ts`\r\n- `src/team/routes/join-company-workspace/index.tsx`\r\n- `src/ui/educational-legacy/with-edu-io.tsx`\r\n\r\n#### Cleanup\r\n\r\n- **Removed** `src/amp/do-not-use.ts` - deprecated file with `updateAmpersand` function\r\n- **Inlined** the `updateAmpersand` function in `src/settings/user/index.tsx` with proper deprecation notice\r\n\r\n#### Build Configuration\r\n\r\n- Updated `packages/canvas/build/webpack.config.js` to include `amp-core` and `amp-models` entry points\r\n- Updated `packages/canvas/package.json` with new export mappings\r\n", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46331, + "title": "[CAN-8158] Include all descendants in absorption feedback during resize", + "branch": "fix/resize-nested-feedback", + "merged_at": "2025-12-03T15:22:20Z", + "changed_files": 3, + "additions": 50, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR fixes absorption feedback to include all descendant widgets when a parent widget is absorbed into a cluster during resize.\r\n\r\n![Dec-03-2025 11-25-04](https://github.com/user-attachments/assets/a6c76b6a-c3e4-437e-bc93-3cfa05d9db1b)\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8158)\r\n- \ud83e\uddea [**Testing environment**](https://resize-nested-feedback.mural.engineering)\r\n\n\n---\n\n> [!NOTE]\n> Include all descendants when showing/clearing absorption feedback during free-form area resize, with tests covering nested scenarios.\n> \n> - **Absorption feedback during resize**\n> - Update `freeform-area-side-effects.ts` to pass `[id, ...store.getDescendantsIds(id)]` to `sdk.absorptionFeedback.setFeedback` and `.clearFeedback` when:\n> - Adding fully contained widgets (including nested areas)\n> - Removing widgets no longer fully contained\n> - Expelling starting children that no longer fully overlap\n> - **Tests**\n> - Add scenarios in `absorption-system/absorption-system.feature` and `area-resizing.feature` asserting feedback includes all descendants when an area is resized to fully contain another (including nested cases).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit afdd5e92a79153d118f90d665b4c61066402756e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46319, + "title": "[CWI-2449] Quick updates for app requests", + "branch": "fix/cwi-2449", + "merged_at": "2025-12-03T14:52:21Z", + "changed_files": 4, + "additions": 15, + "deletions": 18, + "body": "Quick updates for App Requests (multiple Jiras)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2449) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2450) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2451) to understand the context of this effort.\r\n- \r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46286, + "title": "[SCQM-1505] Provide AI mermaid version advice and parsing error details", + "branch": "update/mermaid-version-advice", + "merged_at": "2025-12-03T14:38:08Z", + "changed_files": 6, + "additions": 14, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes there were two things we were not doing: (1) passing back the exact parsing error message to the model, so it would know precisely what it got wrong and (2) telling the tool which version of the mermaid module we are using, so its syntax is the exact correct version to use.\r\n\r\nNow, with these changes, we (1) pass parsing errors all the way back out only to the model (not to tracking!) and (2) do not trust the AI that it knows to avoid using `\\\"` inside double quotes - we just correct this ourselves in the mermaid parsing code, to be `"`.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1505) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mermaid-version-advice.mural.engineering/) to perform a smoke test.\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14962)\r\n\n\n---\n\n> [!NOTE]\n> Plumbs Mermaid parsing error text through realtime/types and parser, and returns it in the AI diagramming failure message; updates tests accordingly.\n> \n> - **Mermaid parsing pipeline**:\n> - Add `response.textResultError` to `MermaidParseResultEvent` in `packages/realtime/src/index.ts`.\n> - Extend `MermaidProcessor.parse` return type with `errorText?: string` in `src/mural/addons/mermaid/types.ts`.\n> - Parser now returns `errorText` from parse results on failure in `src/mural/addons/mermaid/mermaid-parser.ts`.\n> - **AI function behavior**:\n> - `create-mermaid-chart", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46299, + "title": "[CAN-8121] Allow nested areas to \"steal\" widgets from its parent (absorption system version)", + "branch": "add/areas-stealing-systems", + "merged_at": "2025-12-03T12:59:50Z", + "changed_files": 18, + "additions": 747, + "deletions": 32, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR implements the concept of \"stealing\" for nested areas **when using absorption as a system**.\r\n\r\nWhenever an area enters another, and becomes a child of the latter, if the final position of the nested area is fully containing children of the parenting cluster, it now has the ability to \"steal\" them from it.\r\n\r\nThis means that any widget inside an area will become child of any nested area that is added to the bigger cluster:\r\n\r\n![Nov-19-2025 08-46-49](https://github.com/user-attachments/assets/87bd60b5-594a-44fa-b378-abbf2d532e3b)\r\n\r\n**Flags needed for this behavior:**\r\n- `FEATURES.ENABLE_NESTED_AREAS`\r\n- `FEATURES.ENABLE_ABSORPTION_SYSTEMS`\r\n\r\nThis should work for all the cases where nesting can occur:\r\n- Dragging an area inside another\r\n- Dragging an already nested area\r\n- Resizing an already nested area \r\n- Dragging an area from the sidebar onto another\r\n- Pasting an area inside another\r\n- Adding a nested area via the context menu\r\n- Duplicating an area onto another\r\n- Clicking \"Absorb\" from the toolbar of a nested area (this one is hard to test because you'd have to force a situation where a widget is inside a nested area but is not yet absorbed by it)\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8121)\r\n- \ud83e\uddea [**Testing environment**](https://areas-stealing-systems.mural.engineering)\n\n\n---\n\n> [!NOTE]\n> Adds stealing behavior so nested areas fully containing widgets reparent them during create/drag/resize, plus numeric tolerance in change comparison.\n> \n> - **Absorption System (core)**:\n> - Run absorb/expel iteratively until stable; track and diff affected `widgetIds`.\n> - Refactor to use `ActionBuilder(currentStore)`; flush between steps; only return effective changes.\n> - **Absorption Utilities**:\n> - `get-default-widgets-to-absorb`: allow absorbing overlapping siblings (same `parentId`), exclude non-visible or identical AABBs w", + "labels": [] + }, + { + "number": 46305, + "title": "[EN-3524] Refactors room, mural users views to use get workspace company config API", + "branch": "fix/en-3524-mural-room-users-access", + "merged_at": "2025-12-02T23:59:47Z", + "changed_files": 9, + "additions": 245, + "deletions": 207, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe room and mural users views have been updated to use the get workspace company config API from https://github.com/tactivos/mural-api/pull/14945 in order to prevent errors when attempting to manage users as an external user admin.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3524) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3524-mural-room-users-access.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n - External user with room and mural admin permissions: `xekerequillo-5502@yopmail.com` (email and pw are the same)\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atla", + "labels": [] + }, + { + "number": 46289, + "title": "[EN-3560] Company settings, allow Guest conversion: determine default enforced value from appropriate attribute", + "branch": "fix/en-3560", + "merged_at": "2025-12-02T23:07:53Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nChanges default select value to use correct setting value from company.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3560) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3560.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+", + "labels": [] + }, + { + "number": 46303, + "title": "[ESC-1804] Added 80px padding to prevent collision with support button", + "branch": "add/esc-1804-fix-colliding-component", + "merged_at": "2025-12-02T22:39:15Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the content was not padded and the pagination interfered with the support button\r\nNow, with these changes, the content is padded [80 px](https://uitoolkit.mural.co/0dcaf1fc5/p/3760cb-spacing/b/4966af#:~:text=64px-,%2D%2Dmrl%2Dspacing%2D12,-80px) at the bottom\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1804) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [X] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- N/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Adds bottom padding (var(--mrl-spacing-12)) to the archive", + "labels": [] + }, + { + "number": 46247, + "title": "[NEXT-322] Remove aliases", + "branch": "remove/aliases", + "merged_at": "2025-12-02T22:05:27Z", + "changed_files": 144, + "additions": 282, + "deletions": 1051, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://aliases.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Remove local path aliases and migrate repo to relative imports; update build/lint configs, drop alias utilities, and adjust code/tests accordingly.\n> \n> - **Build/Tooling**\n> - Removed custom directory aliases from `.swcrc` and `build/webpack.common.js`; keep only `@muralco/api/*` path mapping.\n> - Enforced relative imports: added ESLint `no-restricted-imports` for `amp/*`, `api/*`, `common/*`, `ui/*`, etc.; updated comments.\n> - Dropped alias entries from `sharprc.yaml`; adjusted import rules.\n> \n> - **Refactoring tooling**\n> - Deleted `packages/refactoring-tools/src/lib/aliases/*` (alias loader/resolve and tests).\n> - Updated `move-to-package` to handle only relative imports (removed alias loading), adjusted tests accordingly.\n> \n> - **Codebase-wide import refactor**\n> - Replaced internal alias paths (`amp/*`, `api/*`, `ui/*`, `mural/*`, etc.) with relative imports across many files (dashboard, modals, settings, mural addons/dispatcher/helpers, tests).\n> - Fixed import targets (e.g., `WidgetStore`, `defaultPhoto`, clipboard/register paths), added missing generics (AsyncSelect), and minor type/import reorderings.\n> \n> - **Misc fixes**\n> - Minor UI tweaks (className/order, button attrs), updated icon import paths, and small logic cleanups.\n> \n> Written by [Curs", + "labels": [] + }, + { + "number": 46317, + "title": "[NEXT-322] Remove aliases 2", + "branch": "remove/aliases-2", + "merged_at": "2025-12-02T22:05:25Z", + "changed_files": 144, + "additions": 282, + "deletions": 1051, + "body": "Summary of Changes and Resources for the Reviewer\r\nReviewer Resources\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://github.com/tactivos/murally/pull/46247) to understand the context of this effort.\r\n\ud83e\uddea Please use this [testing environment](https://aliases.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering/))\r\nNote\r\n\r\nRemove local path aliases and migrate repo to relative imports; update build/lint configs, drop alias utilities, and adjust code/tests accordingly.\r\n\r\nBuild/Tooling\r\n\r\nRemoved custom directory aliases from .swcrc and build/webpack.common.js; keep only @muralco/api/* path mapping.\r\nEnforced relative imports: added ESLint no-restricted-imports for amp/*, api/*, common/*, ui/*, etc.; updated comments.\r\nDropped alias entries from sharprc.yaml; adjusted import rules.\r\nRefactoring tooling\r\n\r\nDeleted packages/refactoring-tools/src/lib/aliases/* (alias loader/resolve and tests).\r\nUpdated move-to-package to handle only relative imports (removed alias loading), adjusted tests accordingly.\r\nCodebase-wide import refactor\r\n\r\nReplaced internal alias paths (amp/*, api/*, ui/*, mural/*, etc.) with relative imports across many files (dashboard, modals, settings, mural addons/dispatcher/helpers, tests).\r\nFixed import targets (e.g., WidgetStore, defaultPhoto, clipboard/register paths), added missing generics (AsyncSelect), and minor type/import reorderings.\r\nMisc fixes\r\n\r\nMinor UI tweaks (className/order, button attrs), updated icon import paths, and small logic cleanups.\r\nWritten by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit https://github.com/tactivos/murally/commit/85f35ddeb232f6fb0f8894b8660121f4bbde783f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\n\n---\n\n> [!NOTE]\n> Removes custom path aliases, enforces relative imports via tooling/lint, deletes alias utilities, updates refactoring tool, and refactors imports ", + "labels": [] + }, + { + "number": 46285, + "title": "[ENGAGE-1434] UI tweaks for the share mural modal", + "branch": "add/share-modal-final-tweaks", + "merged_at": "2025-12-02T20:56:23Z", + "changed_files": 11, + "additions": 86, + "deletions": 36, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1434) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://share-modal-final-tweaks.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher", + "labels": [] + }, + { + "number": 46287, + "title": "[IPA-304 part 4] Moving Mural Insights Overview and Privacy to 'collaboration-insights' package", + "branch": "add/ipa-304-part-4", + "merged_at": "2025-12-02T20:36:47Z", + "changed_files": 19, + "additions": 69, + "deletions": 104, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMural Insights is a modal with 3 tabs. This PR moves 2 tabs out of those 3 (Overview and Privacy) but the \"member\" won't move:\r\n- there are shared dependencies with other pages\r\n- I'm not sure if this is acutally part of the insights\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [W", + "labels": [] + }, + { + "number": 46308, + "title": "[CAN-8198] Fix right-click-pan does not handle mouseleave", + "branch": "fix/can-8198", + "merged_at": "2025-12-02T20:22:15Z", + "changed_files": 6, + "additions": 547, + "deletions": 120, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes an issue wherein while doing a right or middle mouse click and drag, leaving the document and releasing the pointer buttons was not being properly handled by the right-click-pan addon. When re-entering the screen with no pressed buttons the mousemove was being processed as a drag move instead of detecting that there are no buttons pressed, and canceling the canvas drag.\r\n\r\nAs a bonus track, I removed a bunch of Rig 1 tests in favor on unit tests :)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8198) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8198.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46313, + "title": "ECOMM-275: Migrate sidebar-upgrade-card test from Cucumber v1 to v2", + "branch": "add/upgrade-card-test", + "merged_at": "2025-12-02T19:28:12Z", + "changed_files": 1, + "additions": 13, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Removed @ignore tag - test is now active and passing\r\n- Updated test scenario to match component display conditions (1-3 days left)\r\n- Fixed timestamps to create proper 3 days left scenario\r\n- Updated assertions to match current component behavior (Action Required: header)\r\n- Migrated all step definitions to v2 syntax\r\n- Added explicit trialEnds timestamp for proper trial calculation\r\n- Test now validates private rooms warning card appears correctly\r\n\r\nTicket: https://mural.atlassian.net/browse/ECOMM-275\r\n\r\nAll 12 steps passing successfully.\r\n\r\n", + "labels": [] + }, + { + "number": 46273, + "title": "[NEXT-328] Refactor Integration auth routes to integration pkg", + "branch": "refactor/auth-to-pkg", + "merged_at": "2025-12-02T18:14:54Z", + "changed_files": 42, + "additions": 143, + "deletions": 113, + "body": "Closes: https://mural.atlassian.net/browse/NEXT-328\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors integration authentication routes by moving them from the main `src/integrations/routes` directory into the `@muralco/integrations` package. \r\n\r\n- Migrated authentication route components (Adobe, GitHub, Jira Legacy, Slack) to the integrations package\r\n- Consolidated integration utilities (`isZoomUserAgent`, `isIntegrationWidget`) into the package\r\n- Move known related Cucumber tests\r\n\r\n#### Reviewer Resources\r\nPure refactoring code, no logic was changed. \r\n_Test env:_ https://auth-to-pkg.mural.engineering/\r\n\r\n### Relevant Links \ud83d\udd17\r\nPre-work:\r\n- https://github.com/tactivos/murally/pull/46251\r\n- https://github.com/tactivos/murally/pull/46270\r\n\n\n---\n\n> [!NOTE]\n> Moves integration auth routes (Adobe, GitHub, Jira Legacy, Slack) and utilities into @muralco/integrations, updates imports/usages app-wide, and standardizes related APIs/types.\n> \n> - **@muralco/integrations package**:\n> - **Routes**: Adds `AdobeAuth`, `GitHubAuth`, `JiraLegacyAuth`, `SlackAuth` and `IntegrationRoutes`; introduces `getIntegrationRouteComponent` using `WithAuthenticatedUser` and `MrlSpinner`.\n> - **Lib**: Adds `adobe-cc` (`adobeApi`, `connectAdobeCc`, renames types to `Adobe*`), `github` (`githubConnect`), `zoom` (`isZoomUserAgent`), `storage` (`integrationOauthStateRepository`), and `widgets` (`isIntegrationWidget`).\n> - **Tracking**: Exposes `adobeCCTracking`; reuses default tracking for GitHub/Jira.\n> - **Exports/Deps**: Updates `index` exports; adds deps `@muralco/authentication-lib`, `@muralco/canvas`, and `qs`.\n> - **App updates**:\n> - **Routing**: `src/route-config.tsx` now consumes `IntegrationRoutes` from the package.\n> - **Consumers**: Replace legacy imports with package APIs across addons, settings, dispatcher, and UI (e.g., `githubConnect`, `isZoomUserAgent`, `isIntegrationWidget`, Adobe `Adobe*` types).\n> - **Cleanup*", + "labels": [] + }, + { + "number": 46296, + "title": "[ESC-1818] Add confirmation for short data retention options", + "branch": "add/esc-1818-confirmation-for-short-dr", + "merged_at": "2025-12-02T18:01:32Z", + "changed_files": 9, + "additions": 885, + "deletions": 51, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes when selecting DR options of less than 90 days didn't show any warning. Also when calling an action button the page wasnt scrolled and the toast could be hidden and not shown.\r\n\r\nNow, with these changes, a confirmation step is required if choosing any option shorter than 90 days in any of the 3 user selectable options. Also an scroll callback is added to scroll the page up when an action is done. Also I had to select longer Dr option in some existing tests as they used a short retention window and triggered the confirmation flow breaking is assertion.\r\nAdded the ESC-1819 ticket implementation to remove the shorter options.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1818) to understand the context of this effort.\r\n- Please see this \ud83c\udfac **demo** of the acceptance criteria for the above ticket\r\n\r\nhttps://github.com/user-attachments/assets/b9d263e0-5eeb-42a7-881c-18114c3b51b5\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical document", + "labels": [] + }, + { + "number": 46226, + "title": "[NEXT-299] Move/dashboard breadcrumbs package", + "branch": "move/dashboard-breadcrumbs-package", + "merged_at": "2025-12-02T17:49:35Z", + "changed_files": 87, + "additions": 407, + "deletions": 432, + "body": "Move multiple components to packages.\r\nAll are related to dashboard's RoomRoute.\r\n\r\nNote package dependencies\r\ndashboard-room-page -> dashboard\r\ndashboard-room-page -> dashboard-utils \r\ndashboard -> truncated -> dashboard-utils\r\n\r\nMoved to muralco/dashboard's CommonComponents\r\n* Breadcrumbs\r\n\r\nMoved to muralco/dashboard-room-page\r\n* RoomMenu\r\n* EditableTitle\r\n* PageHeader\r\n* Description\r\n* Path\r\n\r\nMoved to muralco/truncated (renamed from browser-context)\r\n* Tooltip\r\n* LinkTruncatedTooltipWithPortal\r\n* TruncatedButtonWithTooltipProps\r\n* TruncatedLinkWithTooltipProps\r\n* TruncatedTextProps\r\n* useIsTruncated\r\n* EventsStore\r\n\r\nConvert dashboard-utils to React package\r\n`useDebounce()` moved to muralco/dashboard-utils\r\n\r\ntest-env\r\nhttps://dashboard-breadcrumbs-package.mural.engineering/", + "labels": [] + }, + { + "number": 46307, + "title": "[NEXT-302] Move development section of company dashboard to package", + "branch": "feat/next-302-move-dev-section", + "merged_at": "2025-12-02T17:00:11Z", + "changed_files": 28, + "additions": 49, + "deletions": 55, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves the grouping `Development` component (and some of the shared company dashboard components) into the `@muralco/company-settings` package as part of packaging the company dashboard (`/c/:cid/*` route)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-302) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nPure refactor. Check out the testing env link as a global admin and make sure that the two development pages are rendering properly.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between", + "labels": [] + }, + { + "number": 46259, + "title": "[ENGAGE-1407] Add sender param to the mural URL", + "branch": "add/sender-param-mural", + "merged_at": "2025-12-02T16:32:06Z", + "changed_files": 2, + "additions": 8, + "deletions": 3, + "body": "## Pull request overview\r\n\r\nAdds sender tracking by injecting a sender query param tied to the authenticated (non\u2011visitor) user when entering a mural. Key changes:\r\n- Introduces call to updateMuralLinkWithSenderID during mural entry for authenticated users.\r\n- Adjusts updateMuralLinkWithSenderID logic to always (re)apply sender and modifies URL construction.\r\n\r\n### Reviewed changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/utils/views.ts | Alters URL update logic for adding sender param; revised condition and URL assembly. |\r\n| src/mural/routes/mural.tsx | Imports and invokes sender param update during mural entry for tracking. |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1407) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://sender-param-mural.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`", + "labels": [] + }, + { + "number": 46284, + "title": "[CAN-8173] Select table on first click", + "branch": "add/table-click", + "merged_at": "2025-12-02T15:08:34Z", + "changed_files": 5, + "additions": 111, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n Prior to these changes click on a cell will select the cell\r\n Now, with these changes, clicking on a cell first select the whole table and the second click selects the cell\r\n \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8173) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://table-click.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\n\n---\n\n> [!NOTE]\n> Change table selection so a cell click selects the table first and a subsequent click selects the cell; adjust modifier-click behavior and update related tests.\n> \n> - **Selection behavior (tables)**\n> - Clicking inside a cell now selects the parent `table` if no table/cell is selected; a second click (after 500ms) selects the `cell`.\n> - With modifiers (CTRL/CMD/SHIFT), clicking a cell selects the `table` when the table is already selected or a different widget is selected; otherwise selects the `cell`.\n> - Range selection with SHIFT retained; table drag/resize logic unaffected.\n> - **Mouse handler (`src/mural/addons/tables/mouse/index.ts`)**\n> - Add `isChildOfCellInTableSelected`; import/use `unselectWidgets`.\n> - Update `createCellInputState` click logic to: clear selection, prefer table selection on first click, then cell; refine modifier-targeting (`tableId` vs `cellId`).\n> - Minor refactors/variable extractions; preserve existing drag behavior when table is selected.\n> - **Tests (feature files)**\n> - Update selection, copy/paste, mouse-selection, and remote interaction specs to reflect new two-click flow (add `waiting 500ms` + second click) and new modifier-click outcome (table selected).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboar", + "labels": [] + }, + { + "number": 46298, + "title": "[CWI-2447] Split widget updates in batches of 100", + "branch": "fix/cwi-2447-batch", + "merged_at": "2025-12-02T14:02:42Z", + "changed_files": 1, + "additions": 23, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Split widget updates into serial batches of 100. Implemented as customers were attempting to connect 1500 widgets resulting in a payload too large to be received by mural-integrations.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2447 to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46283, + "title": "[CAN-8134] Update zoom keyboard shortcuts", + "branch": "add/can-8134", + "merged_at": "2025-12-02T12:57:16Z", + "changed_files": 4, + "additions": 172, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBefore this changes only CMD and + or CMD and - work as shortcuts for zoom out and zoom in, now we also listen for the plus and minus sign without any modifier key. We also updated tracking to know which keys are being pressed for this.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8134) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8134.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46270, + "title": "[NEXT-327] Move auth HOCs to authentication-lib package", + "branch": "refactor/pkg-user-hoc", + "merged_at": "2025-12-02T11:28:46Z", + "changed_files": 18, + "additions": 109, + "deletions": 106, + "body": "Partially Closes: [mural.atlassian.net/browse/NEXT-327](https://mural.atlassian.net/browse/NEXT-327)\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nRefactor the `WithAuthenticatedUser` HOC by moving it from the main application (`src/common/hoc/`) to the `@muralco/authentication-lib` package, making it available as a reusable for packages.\r\n\r\n**Key changes:**\r\n- Migrates the HOC from class-based to functional component using React hooks\r\n- Updates build configuration to support React in the authentication-lib package (webpack, jest, tsconfig)\r\n- Removes optional parameters (`fetchVisitor`, `onCustomSignin`) that were unused\r\n- Replaces global `app.config` access with `getConfig()` API from `@muralco/api`\r\n\r\nRefactor and migrates `with-authenticated-user.tsx` to simplify moving to packages dependencies.\r\n\r\n#### Reviewer Resources\r\nPure refactoring code, no logic was changed. Trying to access to _any_ route that use the component (like `/profile/me`) without being logged should logout.\r\n_Test env:_ https://pkg-user-hoc.mural.engineering\r\n\r\n### Relevant Links \ud83d\udd17\r\n- Follows up https://github.com/tactivos/murally/pull/46251\r\n- Prework for https://github.com/tactivos/murally/pull/46273\r\n\r\n\n\n---\n\n> [!NOTE]\n> Migrates `WithAuthenticatedUser` into `@muralco/authentication-lib` as a hooks-based HOC, updates build/test configs to React, and switches app imports to the new package.\n> \n> - **Authentication Library (`packages/authentication-lib`)**:\n> - **New HOC**: Adds hooks-based `WithAuthenticatedUser` in `src/utils/with-authenticated-user.tsx` and exports via `src/utils/index.ts` and `src/index.ts`.\n> - **Utils**: Consolidates exports (`auth`, `signout`); retains `signout` helper.\n> - **Build/Test Config**: Switches to React configs (`webpack-react.config.js`, `jest.react.config`, `tsconfig.react*.json`).\n> - **Dependencies**: Adds `react`, `react-router-dom`, testing libs; adds peer dep `@muraldevkit/ui-toolkit`.\n> - **App Consumer", + "labels": [] + }, + { + "number": 46200, + "title": "[IAM-2250] [IAM-2253] [IAM-2255] Workspace pending invitation table", + "branch": "feat/iam-2250-invitations", + "merged_at": "2025-12-02T09:25:47Z", + "changed_files": 39, + "additions": 1892, + "deletions": 171, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImplement the workspace pending invitations table.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f **Jira tickets**\r\n - [**IAM-2250**](https://mural.atlassian.net/browse/IAM-2250)\r\n - [**IAM-2253**](https://mural.atlassian.net/browse/IAM-2253)\r\n - [**IAM-2255**](https://mural.atlassian.net/browse/IAM-2255)\r\n- \ud83e\uddea [**iam-2250-invitations.mural.engineering**](https://iam-2250-invitations.mural.engineering/)\r\n- \ud83c\udfac Loom demo incoming\r\n\r\nUse the following user to be a workspace admin in two different workspaces:\r\n\r\n```\r\nalpha.user@mynes.com\r\nEPJmUJzJKwXdFA3ahaNixitt\r\n```\r\n\r\nThen access either the existing or the future table:\r\n\r\n- [future table](https://iam-2250-invitations.mural.engineering/t/futuretable8088/settings/members)\r\n- [existing table](https://iam-2250-invitations.mural.engineering/t/existingtable4448/settings/members)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Implements a workspace Pending Invitations table with search/sort/pagination, inline and bulk actions (convert, edit permissions, revoke), supporting modals, hooks, and API/type updates.\n> \n> - **Settings UI**:\n> - **Workspace Pending Invitations Table** (`src/settings/workspace/workspace-users/workspace-pending-invitation-table/*`): searchable, sortable (incl. number/date), paginated table with sticky columns and inline editing where applicable.\n> - **Actions**: single and bulk actions to `Convert to guest/member`, `Edit permissions`, and `Revoke invitation` with eligibility guards.\n> - **Modals**: new flows for convert-to-guest, convert-to-member (multi-step with permission selection), and remove invitation.\n> - **Shared Buttons**: `DownloadMembersCsvButton` and `InvitePeopleButton`; integrated into users and invitations views.\n> - **State/Reducer**: local reducer for modal/selection/sort/search; client-side pagination; debounced search.\n> - **Refactors**: streamlined action builders using filtered arrays; reused `WorkspacePermissions` types ac", + "labels": [] + }, + { + "number": 46280, + "title": "[NEXT-273] Move `WidgetChange` into `canvas-widgets` package", + "branch": "fix/next-273", + "merged_at": "2025-12-02T00:18:56Z", + "changed_files": 161, + "additions": 783, + "deletions": 762, + "body": "**[NEXT-273 Move WidgetStore, System types, patchWidget, and diffWidget into a separate package](https://mural.atlassian.net/browse/NEXT-273)**\r\n\r\nThe environment: https://next-273.mural.engineering/\r\n\r\nIn this PR:\r\n* Moved `WidgetChanges` and related functions into `canvas-widgets` package\r\n* Moved `reduceChanges` into `actions` since it relies heavily on `ActionBuilder` and `WidgetStore`\r\n* Moved `mergeChanges` from `WidgetStore` into `WidgetChanges`, because it does nothing about WidgetStore and only works with changes\r\n* Renamed `hasChange` into `WidgetChanges.hasEffectOn(change, store)`\r\n\r\n## Methods\r\n\r\n\"image\"\r\n\r\n\r\n## Types\r\n\r\n\"image\"\r\n\r\n", + "labels": [] + }, + { + "number": 46301, + "title": "Improved barrel handling + subpath support", + "branch": "move-to-package-subpath", + "merged_at": "2025-12-01T23:46:24Z", + "changed_files": 4, + "additions": 571, + "deletions": 48, + "body": "### Summary\r\n\r\nAdds support for packages with [Node.js subpath exports](https://nodejs.org/api/packages.html#subpath-exports) (like `@muralco/canvas`) to the `move-to-package` tool. Previously, the tool expected all packages to have a root `src/index.ts` barrel, which doesn't exist for subpath-export packages.\r\n\r\n### Changes\r\n\r\n#### Barrel Export Handling\r\n- Creates a **chain of barrel exports** from the moved file's directory up to the package root (or subpath boundary)\r\n- For **subpath packages**: chain stops at the matching subpath barrel (e.g., `@muralco/canvas/business`)\r\n- For **traditional packages**: chain continues to `src/index.ts`\r\n- Automatically detects existing exports to avoid duplicates\r\n\r\n#### Import Rewriting\r\n- Rewrites imports to the correct subpath (e.g., `@muralco/canvas/business` instead of just `@muralco/canvas`)\r\n- Determines subpath by matching the file's directory against `package.json` exports\r\n\r\n#### Code Quality\r\n- Refactored `move-to-package-barrels.ts` with clear section organization and extracted utility functions\r\n- Added 4 test scenarios covering subpath boundary behavior, full barrel chains, deduplication, and import rewrites\r\n\r\n### Example\r\n\r\n```bash\r\n# Moving a file to a subpath-export package\r\nnpx muralco-refactoring-tools move-to-package --from=src/business/helpers.ts --to=packages/canvas/src/business/utils/helpers.ts\r\n\r\n# Creates:\r\n# - packages/canvas/src/business/utils/index.ts (exports helpers)\r\n# - Updates packages/canvas/src/business/index.ts (exports ./utils)\r\n# - Rewrites imports to @muralco/canvas/business\r\n```\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds subpath-aware barrel chaining and import rewriting to `move-to-package`, with utilities/refactors and comprehensive tests.\n> \n> - **move-to-package barrels**:\n> - Add subpath exports detection from `package.json` and matching logic.\n> - Create barrel chains from file dir up to subpath boundary (or `src/index.ts` for traditional packages).\n> - Avoid duplicat", + "labels": [] + }, + { + "number": 46302, + "title": "Remove getWidgetText mocks from test files", + "branch": "fix/ai-mocks", + "merged_at": "2025-12-01T21:42:38Z", + "changed_files": 4, + "additions": 0, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixes https://github.com/tactivos/murally/pull/46251#discussion_r2578650439\r\n\r\n", + "labels": [] + }, + { + "number": 46251, + "title": "[NEXT-327] Externalize common fn to mural-utils", + "branch": "refactor/new-mural-utils", + "merged_at": "2025-12-01T21:12:17Z", + "changed_files": 64, + "additions": 125, + "deletions": 109, + "body": "Partially Closes: https://mural.atlassian.net/browse/NEXT-327\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors common utility functions by externalizing them from the main source tree into the `@muralco/mural-utils` package, unlocking integration routes to be moved to packages.\r\n\r\n**Key Changes:**\r\n- Moved `getPlaintextFromHtml`, `weakCached`, and `dataUriToBlob` utilities to `@muralco/mural-utils`\r\n- Moved `getWidgetText` `to muralco/canvas` package\r\n- Updated 40+ import statements across the codebase to reference the new package location\r\n- Organized utilities into logical subdirectories (`widget-helpers`, `html-helpers`) within mural-utils\r\n\r\n### Reviewer Resources\r\nPure refactoring code, no logic was changed.\r\nTest env: https://new-mural-utils.mural.engineering/\r\nPrework for https://github.com/tactivos/murally/pull/46273\n\n\n---\n\n> [!NOTE]\n> Moves `getWidgetText` to `@muralco/canvas` and centralizes common utilities (`getPlaintextFromHtml`, `weakCached`, `dataUriToBlob`) in `@muralco/mural-utils`, updating imports across the app.\n> \n> - **Utilities extraction**:\n> - Move `getPlaintextFromHtml` and `weakCached` to `@muralco/mural-utils` (`src/html-helpers`, `src/weak-cached`).\n> - Add `dataUriToBlob` to `@muralco/mural-utils/src/base64-to-blob` and use in `download-image`.\n> - Re-export helpers via `@muralco/mural-utils/src/index` and `src/html-helpers/index`.\n> - **Canvas models**:\n> - Implement and export `getWidgetText` in `@muralco/canvas/src/models/utils/get-widget-text.ts` with tests; update `models/index.ts`.\n> - **Codebase updates**:\n> - Replace usages of former local helpers with new imports from `@muralco/canvas/models` and `@muralco/mural-utils` across AI features, context menus, widgets, accessibility, voting, CSV export, kanban plugins, dispatcher, and helpers.\n> - Adjust tests/mocks to reference new module paths.\n> - **Packages/config**:\n> - Update `packages/canvas` and `packages/mural-", + "labels": [] + }, + { + "number": 46292, + "title": "Remove 'bundle-hash.txt' from static assets", + "branch": "stable-fix/stale-render-bundle", + "merged_at": "2025-12-01T19:55:07Z", + "changed_files": 5, + "additions": 1, + "deletions": 9, + "body": "This is causing a race condition on the deployment (two sources of bundle-hash.txt)\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR reverts some of the changes from https://github.com/tactivos/murally/commit/a2da10ef270ee318e09c2bc9944bfc2f715339af where the `bundle-hash.txt` was included in the static assets, as a fallback mechanism.\r\n\r\nIt turns out these files might end up being copied on top of the engine bundle (depending on the order of the web publisher upload job), so we must ensure there are no collision on the name (especially `bundle-hash.txt`)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### ", + "labels": [] + }, + { + "number": 46293, + "title": "[ECOMM-326] Add subscriptionScheduleId to workspace model", + "branch": "add/ecomm-326-workspace-props", + "merged_at": "2025-12-01T19:25:28Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis adds the `subscriptionScheduleId` property to the workspace object.\r\n\r\nThis property will be used to determine if a workspace has a pending downgrade scheduled with Stripe. Stripe will be the source of truth for the details of the downgrade.\r\n\r\nAPI PR: https://github.com/tactivos/mural-api/pull/14986\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds optional `subscriptionScheduleId` field to the `Workspace` interface.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit eb684c83b777c7f050576bfb91127b88e2784d4d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46294, + "title": "Make sure there is a selectedWidget", + "branch": "stable-fix/extract-pages-tool", + "merged_at": "2025-12-01T18:43:19Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8004)", + "labels": [] + }, + { + "number": 46274, + "title": "[IPA-304 Part 3] Moves Workspace Insights code to the package", + "branch": "add/ipa-304-part-3", + "merged_at": "2025-12-01T18:19:41Z", + "changed_files": 58, + "additions": 96, + "deletions": 305, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoves Workspace Insights code to the package\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mu", + "labels": [] + }, + { + "number": 46230, + "title": "[NEXT-201] Move template-library hooks to modals package", + "branch": "add/hooks-to-modals-package", + "merged_at": "2025-12-01T18:08:02Z", + "changed_files": 26, + "additions": 131, + "deletions": 93, + "body": "\n> [!NOTE]\n> Moves template-library hooks and types into the shared @muralco/templates-modals package, tightens types/APIs, and updates all consumers and tests.\n> \n> - **Packages: @muralco/templates-modals**\n> - **New Module: `template-library`**\n> - Adds `types`, `use-auto-scroll` (null-safe container), `use-company-templates-collections` (error handling + state reset), `use-templates` (stricter types, combined map typing, MFS filtering + search tracking), `use-use-cases`.\n> - Exposes via `src/index.ts` and `exports`.\n> - **Dependencies**: adds `@muralco/api`, `@muralco/dashboard`, `@muralco/mural-utils`, `@muralco/templates-tracking`; peer adds `@muraldevkit/ds-icons`.\n> - **Tests**: adds `use-templates.test.tsx`.\n> - **App Integration**\n> - **Imports Updated**: All template-library consumers now import `SidebarItem`/`types` and hooks from `@muralco/templates-modals` (sidebar, search bar, footer, template thumbs, utils, modal container).\n> - **Types Cleanup**: Removes duplicated sidebar/use-case/types from `src/common/template-library/types.ts` (keeps only `ShowModalCheckboxType`, `TemplateAiProps`).\n> - **Behavioral Tweaks**: respects companyId absence by clearing collections; improves favorite handling and tracking payloads; minor type fixes.\n> - **Dashboard**: `NewTemplateDashboard` uses `useCompanyTemplatesCollections` from new package; tests updated to mock new module.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d254c6a81ea8b272870b2cd8afe2e0ac724042f6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\n\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-201) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://hooks-to-modals-package.mural.engineering) to perform a smoke test. ([all t", + "labels": [] + }, + { + "number": 46291, + "title": "[CAN-8167] Organize into area keep relative stackingOrder of children", + "branch": "fix/can-8167", + "merged_at": "2025-12-01T17:56:36Z", + "changed_files": 2, + "additions": 25, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR unifies the calls in `addWidgetsIntoClusterWithoutCheckingForConsistency` into a single `apply`. The order was affecting the system output if widgets were absorbed one by one.\r\n\r\nWith Multiple Applies\r\n- First apply: sourceWidgetIds = [A] \u2192 affectedWidgets = [A] \u2192 only A is processed\r\n- Second apply: sourceWidgetIds = [B] \u2192 affectedWidgets = [B] \u2192 only B is processed (A is not included)\r\nEven though initialStore is the same, the system never sees A and B together, so it can\u2019t sort them relative to each other. Each widget gets assigned a stacking order independently.\r\n\r\nWith Single Apply\r\n- Single apply: sourceWidgetIds = [A, B, C] \u2192 affectedWidgets = [A, B, C] \u2192 all widgets are processed together and sorted by their original stacking order from initialStore. The fix is that batching all changes ensures all widgets are in sourceWidgetIds, so they\u2019re all included in affectedWidgets and can be sorted together in one operation.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/2e1bd6ee-723f-43e8-ae14-5d74f96b3943)\r\n\r\nMaster:\r\n![bug](https://github.com/user-attachments/assets/f9290daa-623c-48d3-8fca-05e6776c33d5)\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8167\r\n- https://can-8167.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> Batch `setParent` operations into a single apply when absorbing widgets into a cluster and add tests to ensure relative stacking order is preserved with the stacking order system enabled.\n> \n> - **Absorption logic**:\n> - Batch widget parenting in `addWidgetsIntoClusterWithoutCheckingForConsistency` by aggregating `ActionBuilder` operations and applying once, instead of per-widget applies (`src/mural/business/absorption/index.ts`).\n> - **Tests**:\n> - Add rule and scenario validating relative stacking order preservation when organizing into an area with stacking order system enabled (`src/test/react-new/features/canvas/context-", + "labels": [] + }, + { + "number": 46290, + "title": "Add child tools to the fixed toolbar", + "branch": "beta-fix/dropdown-tools", + "merged_at": "2025-12-01T17:02:59Z", + "changed_files": 1, + "additions": 47, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nChild tools need to be added to the right toolbar\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8196)\r\n[Test Env](https://dropdown-tools.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atl", + "labels": [] + }, + { + "number": 46261, + "title": "[CAN-8180] Hide WidgetHoverLeft toolbar if the IA Toolbar flag is enabled", + "branch": "add/can-8180", + "merged_at": "2025-12-01T16:16:38Z", + "changed_files": 2, + "additions": 172, + "deletions": 19, + "body": "Remove reaction bar from stickies if the IA toolbars flag is enabled.\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8180)", + "labels": [] + }, + { + "number": 46169, + "title": "[CWI-2415] Add blocking call before batch requests for token refresh", + "branch": "fix/cwi-2415-expiration-window", + "merged_at": "2025-12-01T16:07:10Z", + "changed_files": 2, + "additions": 22, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add blocking call before batch requests to ensure token is valid when multiple requests are made.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2415) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-integrations/pull/1644\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Add a blocking `jiraApi.reporter` call before batched `search` requests in `checkAccessToJiraWorkItems`, updating tests to mock and assert this behavior.\n> \n> - **Feature: token prefligh", + "labels": [] + }, + { + "number": 46282, + "title": "[CAN-8191] Store hint to distinguish between empty space clicks and hint clicks", + "branch": "fix/can-8191", + "merged_at": "2025-12-01T13:56:32Z", + "changed_files": 2, + "additions": 35, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR stores the `hint` in `pendingAreaSelection` so `flushPendingAreaSelectionForDrag` can distinguish between empty space clicks (should pan) and hint clicks (should select and drag).\r\n\r\nThe previous implementation assumed all pending selections were from empty space, but `buildPendingAreaSelection` is also called for hint clicks when `hasDifferentSelection` is `true`.\r\n\r\n![pr](https://github.com/user-attachments/assets/40a30402-5fa9-4a45-b4fa-60ff072536d1)\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8191\r\n- Env: https://can-8191.mural.engineering/\r\n\n\n---\n\n> [!NOTE]\n> Stores `hint` in `pendingAreaSelection` and updates drag/selection flow so empty-space drags pan while hint (title/border) drags select and drag areas; updates call sites and adds a focused test.\n> \n> - **Core (MouseManager)**:\n> - Add `hint` to `pendingAreaSelection` and propagate via updated `buildPendingAreaSelection(widgetId, hint, event)`.\n> - Use stored `hint` in `flushPendingAreaSelectionForDrag` to pan on empty-space drags and select/drag on hint drags for areas (including locked/children cases in mouse mode).\n> - Update area interaction paths to pass `hint` (e.g., locked empty areas, suppression handler, Shift+mouse mode deferral).\n> - **Tests**:\n> - Add scenario validating dragging area B from title while area A is selected in `.../areas-improvements/click-drag/mouse.feature`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0cce4794a2fb3a3438dfcaccd5f0ad821567675c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46271, + "title": "[CAN-7922] Enable nesting of free-form areas (absorption system version)", + "branch": "add/nested-areas-systems", + "merged_at": "2025-12-01T12:35:31Z", + "changed_files": 28, + "additions": 570, + "deletions": 112, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR enables nesting of free-form areas within other areas, implementing support for parent-child relationships between freeform area widgets **when absorption is handled by a system instead of a business rule.**\r\n\r\nThe feature is gated behind the `ENABLE_NESTED_AREAS` and `ENABLE_ABSORPTION_SYSTEMS` feature flags.\r\n\r\nExpectation for this work is that free-form areas should now behave as any other absorbable widget while the flags are enabled.\r\n\r\n**Note** that [area stealing](https://github.com/tactivos/murally/pull/46156) is **NOT** implemented here, that is still a behavior only applicable when absorption is handled by a business rule and will be implemented in a future effort.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7 \ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7922)\r\n- \ud83e\uddea [**Testing environment**](https://nested-areas-systems.mural.engineering)\r\n\n\n---\n\n> [!NOTE]\n> Enables nesting of free-form areas using the absorption system, refines overlap/absorb logic and feedback, and adds extensive integration/E2E tests.\n> \n> - **Absorption System**:\n> - Enable free-form areas to behave as absorbable/absorbing widgets (areas now considered absorbable by default strategy).\n> - Refine selection of overlapping/target widgets: exclude self, ignore partial overlaps, and prevent absorbing peers with identical bounds.\n> - Respect visibility and parent constraints when determining absorbable targets.\n> - **Sidebar Drag-and-Drop Feedback**:\n> - Remove feature flag gating and always manage freeform area highlight feedback during drag.\n> - Centralize feedback clearing; track and toggle highlights for newly overlapped/stale areas.\n> - **Tests**:\n> - Add broad integration tests for creating, dragging, resizing, visibility changes, removing areas, and multi-widget scenarios under `ENABLE_ABSORPTION_SYSTEMS`.\n> - Introduce utility to create mock non-absorbable widgets for tests.\n> - Add", + "labels": [] + }, + { + "number": 46275, + "title": "[CAN-8160] Add 'itc-garamond-condensed' for New Balance", + "branch": "add/can-8160", + "merged_at": "2025-11-29T02:57:46Z", + "changed_files": 7, + "additions": 51, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds a custom workspace font for New Balance (itc-garamond-condensed).\r\n\r\nIn order for the font to be available on the workspace, the following `workspaceConfig.fonts` entry must be available.\r\n\r\n```\r\n{ \"id\": \"itc-garamond-condensed\", \"name\": \"ITC Garamond Condensed\" }\r\n```\r\n\r\nTesting environment: https://can-8160.mural.engineering/t/can81606349/m/can81606349/1764277422250/0c6ac1bd9d1c73b35dbb8c515677e17a07d3f63e\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n*mural-render*: https://github.com/tactivos/mural-render/pull/1461\r\n*mural-api*: https://github.com/tactivos/mural-api/pull/14980\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+S", + "labels": [] + }, + { + "number": 46278, + "title": "[CAN-8179] Fix broken UX when right click and dragging with multiple selections", + "branch": "fix/can-8179", + "merged_at": "2025-11-28T21:21:34Z", + "changed_files": 6, + "additions": 810, + "deletions": 45, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWhile having a multiple selection, right click and dragging in the selection's whitespace (i.e. the empty space between 2 or more selected widgets) was not working properly. Instead of dragging the canvas, it would (1) show the context menu for the canvas and keep it opened while (2) dragging would move the widgets instead of the canvas (without ever dismissing the context menu). \r\n\r\nTo solve the dragging widgets instead of the canvas, we now only allow multiple selection dragging through left click and leave right clicks to the right-click-pan processor, however this surfaces an issue with the context menu.\r\n\r\nTo solve the context menu issue I refactored context menu logic in`src/mural/addons/core/mouse`. The problem was that multiple addons handled the context menu in a different way, some some didn't handle it at all. We now have a single addon that manages when to show the context menu. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8179) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8179.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n- Loom demo: https://www.loom.com/share/e3ea3466877a493b9ccddd23b1aa3b3c\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 46248, + "title": "Feat/ipa 307 refactor reporting filters", + "branch": "feat/ipa-307-refactor-reporting-filters", + "merged_at": "2025-11-28T15:10:23Z", + "changed_files": 47, + "additions": 2906, + "deletions": 1399, + "body": "### Summary of Changes and Resources for the Reviewer\r\nReplace the legacy dynamic filter renderer with dedicated, typed filter components under packages/admin-reports/src/components/filters/**, plus matching filtersByReport/* grouping components.\r\n\r\nSimplify useReports, reducer, modal, and async-reports page by removing the \u201cenriched filters\u201d plumbing, tracking form data directly, and introducing buildFiltersFormData + shared prop types.\r\n\r\nRefresh styles and modal layout for the new filters, and trim stale code (old filter.tsx + tests).\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlass", + "labels": [] + }, + { + "number": 46242, + "title": "[IPA-304 Part 2] Moves company insights code to its package", + "branch": "add/ipa-304-part-2", + "merged_at": "2025-11-28T13:18:52Z", + "changed_files": 51, + "additions": 93, + "deletions": 137, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoves all the company insights codes to the package.\r\nThe main file is still in the src folder since there are some imports there that is chained with other things and the only solution could be duplication but it is complicated and better to do it later in another PR maybe\r\n\r\n\r\nI was also able to somehow simulate my local with some fake data to show insights\r\n\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some f", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46277, + "title": "Backmerge conflict 2025-11-28", + "branch": "beta-fix/conflict-bbe3912-9d0f09f", + "merged_at": "2025-11-28T11:44:12Z", + "changed_files": 1, + "additions": 4, + "deletions": 7, + "body": "Unable to automatically merge 'stable' into 'beta' due to merge conflicts.\n\nHey please fix conflicts and merge this PR into beta\n\n# Merge instructions\n## Always use MERGE and do not SQUASH nor REBASE :point_down:\n```bash\ngit fetch\ngit checkout beta-fix/conflict-bbe3912-9d0f09f\ngit merge origin/beta\n```\n\n**Actually fix the conflict**\n```bash\ngit commit\ngit push origin HEAD\n```\n\n**Do not squash/rebase your commits.**\n\n\n---\n\n> [!NOTE]\n> Switch Point to geometry with zero constructor and use cached `draggingWidgetBounds` instead of `getBounds()` during drag updates.\n> \n> - **Drag logic (`src/mural/business/drag-selected-widgets/index.ts`)**:\n> - Replace `Point` import with `@muralco/geometry`; initialize with `Point.zero()`.\n> - During `move`, use cached `draggingWidgetBounds` instead of `getBounds()` for selection rect and bounds when notifying/processing clusters and cursor position.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4be54394e86a0e0be2cd2afe5fde384bcb3a77b4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "beta-fix", + "backmerge-conflict" + ] + }, + { + "number": 46276, + "title": "[CAN-8153] Use unsnapped widgets bounds in next position calculation while dragging", + "branch": "stable-fix/can-8153", + "merged_at": "2025-11-28T10:55:52Z", + "changed_files": 1, + "additions": 4, + "deletions": 7, + "body": "**[CAN-8153 Investigate and fix item jiggling while being dragged issue](https://mural.atlassian.net/browse/CAN-8153)**\r\n\r\nUse non-snapped bounds in dragging calculations.\r\n\r\nThe environment: https://can-8153.mural.engineering/\r\n\r\n## Before\r\n\r\n![2025-11-28 12 01 07](https://github.com/user-attachments/assets/190a070a-7f91-47eb-a132-ebf2a2f057df)\r\n\r\n## After\r\n\r\n![2025-11-28 12 02 07](https://github.com/user-attachments/assets/2ee88c4c-c5a8-4f40-9745-da342ab63cc8)\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 46268, + "title": "[CAN-8169] Fix click+drag over locked areas when navigation_improvements flag is enabled", + "branch": "fix/can-8169", + "merged_at": "2025-11-27T19:31:49Z", + "changed_files": 7, + "additions": 18, + "deletions": 28, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nBefore these changes we had a overcomplicated way of forcing marquee selection when a certain flag was enabled through an addon, this was causing issues since it meant the flag had to be read and special behaviour implemented on multiple cases. So I removed all the isLeftClickToMarqueeSelectEnabled related code and logic and now go with a simpler approach: When the navigationImprovements addon loads we set the user controls scroll to SWIPE.\r\n\r\nSince users cannot control their scroll setting under the new navigation experience, there's no special handling needed, existing trackpad mode logic applies automatically.\r\n\r\nNew navigation controls do not allow changing the 'scroll' controls, only the 'zoom' controls:\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventio", + "labels": [] + }, + { + "number": 46272, + "title": "[CAN-8158] Include all descendants in absorption feedback during drag", + "branch": "fix/can-8158", + "merged_at": "2025-11-27T18:17:10Z", + "changed_files": 9, + "additions": 82, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes absorption feedback to include all descendant widgets when a parent widget is absorbed into a cluster during drag. Previously only the parent showed feedback.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/23ea1e32-0ec2-4234-825a-883e7852c789)\r\n\r\nMaster:\r\n![bug](https://github.com/user-attachments/assets/fbd3ee2f-9c96-4d91-9644-abcab5132e73)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8158\r\n- Env: https://can-8158.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> Show and clear absorption feedback for a widget and all its descendants; add `widgets.getDescendantsIds`; update tests and scenarios.\n> \n> - **Absorption Feedback**:\n> - `src/mural/addons/absorption-feedback/index.ts`: `setFeedback` now includes affected widgets plus all descendants via `widgets.getDescendantsIds`.\n> - **Dragging Logic**:\n> - `src/mural/business/drag-widgets-over-cluster.ts`: when dragging over clusters, clear/set feedback for the dragged widget and its descendants; track overlap state with descendant IDs.\n> - **Widgets SDK**:\n> - Expose descendant ID accessors:\n> - `widgets.getDescendantsIds` in `primitives/widgets/types.ts` and implementation in `primitives/widgets/index.ts`.\n> - Selector `selectGetDescendantsIds` in `primitives/widgets/selectors.ts`.\n> - **Tests**:\n> - Unit: `addons/absorption-feedback/index.test.ts` covers nested area parent changes and descendant feedback.\n> - E2E: update expectations to include descendants and add nested-area scenarios in `drag-widgets.feature` and `nested-areas/area-dragging.feature`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3a8a38f5939115d936cda8bbc80fc5e04b36e288. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46267, + "title": "[ESC-1714] update copyAssetFromZone method to return success", + "branch": "add/esc-1714", + "merged_at": "2025-11-27T16:23:00Z", + "changed_files": 5, + "additions": 30, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- update copyAssetFromZone method to return success\r\n\r\nmural api PR: https://github.com/tactivos/mural-api/pull/14961\n\n\n---\n\n> [!NOTE]\n> `copyAssetFromZone` now returns `{ success, error? }`, with API/types updated and asset manager reloading only on `success`.\n> \n> - **API surface and types**:\n> - Update `copyAssetFromZone` to return `{ success: boolean; error?: { code: string; message: string } }` in:\n> - `packages/api/src/content/content.ts`\n> - `packages/api/src/content/types.ts`\n> - `packages/api/src/murals/index.ts`\n> - `packages/canvas-asset-management/src/types.ts`\n> - **Asset manager behavior**:\n> - In `packages/canvas-asset-management/src/manager.ts`, after 404 blob-missing, call `copyAssetFromZone` and reload asset only if `response.success` is true.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 164e6ec3304b71a63ac245fd01c15fb7f2521f4d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46269, + "title": "[CAN-8078] Helpers that use `.every` should not be vacuously true", + "branch": "fix/can-8078-every", + "merged_at": "2025-11-27T15:59:45Z", + "changed_files": 5, + "additions": 26, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is a small PR that fix some helpers that are doing checks on arrays of widgets (typically around table cells)\r\n\r\nFrom https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every\r\n\r\n> every acts like the \"for all\" quantifier in mathematics. In particular, for an empty array, it returns true. (It is [vacuously true](https://en.wikipedia.org/wiki/Vacuous_truth) that all elements of the [empty set](https://en.wikipedia.org/wiki/Empty_set#Properties) satisfy any given condition.)\r\n\r\nIn these cases, we should ensure that sending `[]` would return false.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/sp", + "labels": [] + }, + { + "number": 46218, + "title": "[NEXT-273] Move widget-related functions into `canvas-widgets` package", + "branch": "add/canvas-widgets", + "merged_at": "2025-11-27T15:30:06Z", + "changed_files": 177, + "additions": 1784, + "deletions": 1089, + "body": "**[NEXT-273 Move WidgetStore, System types, patchWidget, and diffWidget into a separate package](https://mural.atlassian.net/browse/NEXT-273)**\r\n\r\nThis PR moves widget utility functions into `canvas-widgets` package. It's in a plan to move WidgetStore, widget changes, and ActionBuilder there too.\r\n\r\nDeprecated alternative `unflattenWidget` function which also fills default values. It was not updated for a long time. Not sure if it still makes sense. Probably it should be relaced by combination of defaults SDK and simple version of `unflattenWidget`.\r\n\r\nThe environment: https://canvas-widgets.mural.engineering/\r\n\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 46253, + "title": "[NEXT-267] - add webpack plugin to externalize relative imports from subpaths", + "branch": "feat/canvas-package-subpaths", + "merged_at": "2025-11-27T14:32:43Z", + "changed_files": 4, + "additions": 735, + "deletions": 29, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[NEXT-267](https://mural.atlassian.net/browse/NEXT-267)\r\n\r\nThis PR introduces a modular subpath exports architecture for the @muralco/canvas package.\r\n\r\n\u2022 Implemented subpath exports system allowing consumers to import specific modules (e.g., @muralco/canvas/sdk/state, @muralco/canvas/business) instead of the entire package.\r\n\r\n\u2022 Added `RelativeSubpathExternalizerPlugin` - Custom webpack plugin that prevents cross-subpath imports from being bundled, maintaining module boundaries and reducing bundle sizes.\r\n\r\n\u2022 Updated build configuration to support independent entry points with proper externalization.\r\n\r\n\u2022 Added documentation (ARCHITECTURE.md) detailing the build process, plugin implementation, and best practices\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run ", + "labels": [] + }, + { + "number": 46260, + "title": "[CAN-8159] Include arrows being duplicated when their refs share a common ancestor", + "branch": "fix/can-8159-again", + "merged_at": "2025-11-27T13:24:38Z", + "changed_files": 7, + "additions": 458, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds an exception to `prepareToMoveArrows` to include arrows when both references share a common ancestor being duplicated.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/9f56bab3-b8ad-457d-918a-87bf488da596)\r\n\r\nMaster:\r\n![bug](https://github.com/user-attachments/assets/232592e6-4cae-41bb-91df-f6dc1d274815)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8159\r\n- Env: https://can-8159-again.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Keeps/duplicates connected arrows when their endpoints share a selected common ancestor by adding `getCommonAncestor` and exposing `WidgetStore.getAncestor`, plus tests and a new E2E scenario.\n> \n> - **Business logic**\n> - `drag-selected-widgets/index.ts`: In `prepareToMoveArrows`, retain arrows if both `startRefId` and `endRefId` share a selected common ancestor via `getCommonAncestor`.\n> - Add `get-common-ancestor.ts`: utility to compute lowest common ancestor across widgets.\n> - **Widget store / SDK**\n> - `widget-store/widget-store.ts`: Implement `getAncestor(id, filterFn?)` to traverse parent chain.\n> - `sdk/primitives/widgets/index.ts`: Delegate `getAncestor` to store.\n> - **Tests**\n> - Unit: `get-common-ancestor.test.ts` for various LCA cases; `widget-store.widget-store.test.ts` adds `getAncestor` coverage.\n> - E2E: `area-duplicating.feature` adds scenario ensuring arrows connected to descendants are duplicated with correct refs when duplicating nested areas.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f44abd079b4f90f21572926bcabb24f0ea74cde0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46255, + "title": "[CWI-2384] Send to disabledCloseOnClick", + "branch": "fix/cwi-2384", + "merged_at": "2025-11-26T21:28:35Z", + "changed_files": 2, + "additions": 3, + "deletions": 1, + "body": "Send to won't clock when clicked on.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2384) to understand the context of this effort.\r\n- and [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2326)\r\nhttps://www.loom.com/share/6d97656f4f184fbe90a5020257e963a3\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46262, + "title": "[ESC-1817] Add new data retention time frame options", + "branch": "add/esc-1817-add-new-dr-options", + "merged_at": "2025-11-26T20:47:05Z", + "changed_files": 4, + "additions": 532, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes data rentention options ended in 2 years.\r\nNow, with these changes option for 3, 4, 5 and 6 years are added due to customer requirment.\r\nAdditionally the dropdown menu scroll bug ([ESC-1756](https://mural.atlassian.net/browse/ESC-1756)) was fixed in this PR due to its short fix. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1817) to understand the context of this effort.\r\n\r\n#### Please see this \ud83c\udfac demo of the acceptance criteria for the above ticket\r\n\r\nhttps://github.com/user-attachments/assets/398d2c28-4f6c-4a7e-928d-d09ed9e2c74f\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- N/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/", + "labels": [] + }, + { + "number": 46256, + "title": "[NEXT-323] Migrate CreateTeam route from withAuthenticatedUser to RequireAuth", + "branch": "migrate/next-323-create-team-require-auth", + "merged_at": "2025-11-26T19:54:02Z", + "changed_files": 1, + "additions": 22, + "deletions": 12, + "body": "## Summary\r\n\r\nMigrates the `CreateTeam` route from using the legacy `withAuthenticatedUser` HOC to the modern `RequireAuth` pattern. This follows the established migration pattern from the AboutYou route.\r\n\r\n## Changes\r\n\r\n- \u2705 Replaced `withAuthenticatedUser` HOC with `RequireAuth` wrapper pattern\r\n- \u2705 Updated component to use `useAuthenticatedUser()` hook instead of prop injection\r\n- \u2705 Added proper error handling, loading states, and session management\r\n- \u2705 Removed legacy HOC dependency and `AmpUserModel` type usage\r\n- \u2705 Simplified type casting (hook returns `User | null` directly)\r\n\r\n## Testing\r\n\r\n### Automated Testing\r\n- \u2705 TypeScript compilation passes\r\n- \u2705 No linting errors\r\n- \u2705 Pre-commit hooks pass\r\n\r\n### Manual Smoke Testing\r\n\r\n**Test Environment**: https://next-323-create-team-require-auth.mural.engineering\r\n\r\n**Test Scenarios:**\r\n\r\n1. [x] **Workspace Creation Flow (Happy Path)**\r\n - Navigate to `/create-team` while authenticated\r\n - Expected: Page loads and shows workspace creation form\r\n - Verify: `CreateTeamView` component receives user prop correctly\r\n - Verify: User can enter workspace name and create workspace\r\n - Verify: After creation, redirects to invite team flow\r\n - Verify: `InviteTeam` component receives user prop correctly\r\n\r\n2. [x] **Authentication Loading State**\r\n - Navigate to `/create-team` while session is being validated\r\n - Expected: Loading spinner displays (`MrlSpinner` with \"Loading\" text)\r\n - Verify: Spinner appears during authentication check\r\n\r\n3. [x] **Authentication Error Handling**\r\n - Navigate to `/create-team` with invalid/expired session\r\n - Expected: Redirects to `/signin` page\r\n - Verify: No error messages displayed to user\r\n - Verify: Redirect happens automatically\r\n\r\n4. [x] **Missing Session Handling**\r\n - Navigate to `/create-team` without authentication session\r\n - Expected: Calls `logout()` and redirects appropriately\r\n - Verify: Session cleanup occurs\r\n\r\n5. [x] **Optimizely Tracking**\r\n ", + "labels": [] + }, + { + "number": 46252, + "title": "[CAN-8175] Move zoom-to-selection to zoom menu", + "branch": "add/can-8175", + "merged_at": "2025-11-26T19:44:14Z", + "changed_files": 5, + "additions": 121, + "deletions": 6, + "body": "Moves Zoom to selection to the zoom menu\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8175)\r\n[Test Env](https://can-8175.mural.engineering/)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Moves `zoom-to-selection` into the navigation zoom menu and adds Alt+2 shortcut, with tests and helper updates.\n> \n> - **Navigation/Zoom**:\n> - Move `zoom-to-selection` into the zoom menu (`WellKnownToolbars.NAVIGATION`) with `parentId` `currentZoom`, group `{ id: 'zoomToFit', order: 0 }`, label \"Zoom to selection\", and shortcut display `${getAltKey()} 2` in `src/mural/addons/widget-toolbar-order/index.ts`.\n> - Set `visible: true`; `disabled` reflects visibility when IA toolbars enabled.\n> - **Keyboard Shortcuts**:\n> - Add Alt+2 handler `zoom-to-selection-alt` in `src/mural/addons/core/keyboard-handlers/zoom-handlers.ts` (applies only with non-empty selection). Implements `fitToRect` and stops following participant.\n> - Show Alt+2 \"Zoom to selection\" in shortcuts UI (`src/views/mural/ui/shortcuts/shortcuts.ts`).\n> - **Tests**:\n> - New tests for `zoom-to-selection` visibility/disabled state with `FEATURES.ENABLE_IA_TOOLBARS` and selection (`src/mural/addons/widget-toolbar-order/index.test.ts`).\n> - **Test Helpers**:\n> - Allow `ctx.register.tools` to accept function updaters for tools (supports `updateTool`) in `src/test/unit/helpers/tools-api.ts`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 56210cc6c802b58f426e71531c7e7718a0952461. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46237, + "title": "[CAN-8186] Shrink floating toolbar", + "branch": "add/shrink-floating-toolbar", + "merged_at": "2025-11-26T18:44:25Z", + "changed_files": 14, + "additions": 47, + "deletions": 160, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUse xsmall buttons for the xsmall floating toolbar\r\n\r\nWe had iconSize as a toolSpec. This doesn't make sense since the iconSize should depend on the size of the toolbar in which it is in.\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8186)\r\n[Test Env](https://shrink-floating-toolbar.mural.engineering/)\r\n\n\n---\n\n> [!NOTE]\n> Shrinks floating toolbar buttons to xsmall behind the IA toolbars feature flag and removes iconSize handling from the button adapter.\n> \n> - **Tooling/Adapters**\n> - Remove `iconSize` from `ToolbarButtonAdapter` props and usage; simplify icon rendering (no size-specific container; `MrlSvg` no longer receives `size`).\n> - **Renderers**\n> - `ToolbarButton`: button `size` now respects `selectEnableIAToolbarsFeature` (uses provided `size` when enabled, otherwise `small`).\n> - `Toolbar`: pass `size` through to `Button` renderer.\n> - **Widget Toolbar Addons**\n> - `DragButton` and `LockTool`: button `size` set to `xsmall` when IA toolbars feature enabled, otherwise `small`; add feature selector usage.\n> - **Tests**\n> - Inject IA toolbars feature flag state into renderer and toolbar tests.\n> - Remove legacy `RegularButton` component and its tests.\n> - **Styles**\n> - Add flex container to draggable wrapper and lock dropdown trigger; minor toolbar CSS cleanup.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit dd413df553b20477da4e63983d19c84f2c33f078. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46254, + "title": "[CWI-2391] Improve Jira Export Modal", + "branch": "add/cwi-2391", + "merged_at": "2025-11-26T18:26:54Z", + "changed_files": 6, + "additions": 22, + "deletions": 31, + "body": "Improvements to Jira Export Modal.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2391) to understand the context of this effort.\r\nDemo: https://www.loom.com/share/44f4f38c9e27488395bcb98e2506d54c\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46250, + "title": "[CAN-8177, CAN-8187] Move tools from floating toolbar to fixed toolbar", + "branch": "add/re-order-toolbar-tools", + "merged_at": "2025-11-26T17:37:50Z", + "changed_files": 3, + "additions": 122, + "deletions": 108, + "body": "Move some tools from the floating widget toolbar to the fixed one to reduce the size of the floating widget toolbar\r\n\r\n- Removed drawing tools\r\n\r\n[Jira 1](https://mural.atlassian.net/browse/CAN-8177)\r\n[Jira 2](https://mural.atlassian.net/browse/CAN-8187)\r\n[Test Env](https://re-order-toolbar-tools.mural.engineering)https://re-order-toolbar-tools.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Moves organize-related tools from the floating toolbar to the fixed widget toolbar with new groups; removes drawing tools and updates widgets-inspector/other tool placements.\n> \n> - **Toolbars IA**:\n> - **Fixed widget toolbar (`WIDGET_FIXED`)**: adds `ORGANIZE`, `IMAGE_CONTENT_SETTINGS`, and `END` groups; updates ordering.\n> - **Floating widget toolbar (`WIDGET_FLOATING`)**: removes `ORGANIZE` group.\n> - **Tool relocations/reordering**:\n> - `arrange-widgets`, `align-widgets`, `resize-tool`, `mindmaps-layout-horizontal|vertical`, `merge-table-cells`, `unmerge-table-cells`, `toggle-cell-auto-resize-tool`, `title-toggle-tool`, `toggle-area-layout-freeform|grid`, `absorb-tool`, `filter-by-type-tool` \u2192 `WIDGET_FIXED.ORGANIZE` with defined orders.\n> - `widgets-inspector` \u2192 `WIDGET_FIXED.END` (ordering updated); dev addon switches from custom button to a registered tool.\n> - Floating toolbar keeps `MOVE` tools (`drag-button`, `zoom-to-selection`, `lock-tool`) and `END` tools (`extract-pages-tool`, `ai-*`, `delete-tool`); `ADD_ATTRIBUTE` tools reordered.\n> - **Removals**:\n> - `sticky-drawing-tool`, `sticky-eraser-tool` removed.\n> - `sticky-switch-to-drawing`, `drawing-switch-to-sticky` removed.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b9e93fee38a2aac054a89e143520f6fbf902b542. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46231, + "title": "[CWI-2416] Handle connection lost error", + "branch": "add/cwi-2416-connection-lost", + "merged_at": "2025-11-26T17:25:46Z", + "changed_files": 25, + "additions": 710, + "deletions": 70, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add handling for connection lost error. There is a default/fallback behavior if no onSuccessfullConnection function is provided to inform the user it was successful.\r\n- Open import modal after reestablishing a connection from an search/import modal.\r\n- Add some tests around handling of common workato error.\r\n- Update ModalSdk to provide a method for closing whatever modal is open. This was necessary to allow us to close modals for Systems of Record modals created using the ModalSdk. Previously, you could only close the modal by name and we do no necessarily _know_ the modal that is open when the error is received.\r\n\r\n#### Reviewer Resources\r\n- Please review https://mural.atlassian.net/browse/CWI-2416 to understand the context of this effort.\r\n- Please see this https://www.loom.com/share/3b91b82657e74caa9bfa3fc1e529990e of the acceptance criteria for the above ticket\r\n\r\nDefault/fallback message:\r\n\"image\"\r\n\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+", + "labels": [] + }, + { + "number": 46219, + "title": "[ESC-1824] Update Node.js to 22.20.0", + "branch": "update/node-22", + "merged_at": "2025-11-26T14:20:38Z", + "changed_files": 21, + "additions": 360, + "deletions": 363, + "body": "Jira: [ESC-1824](https://mural.atlassian.net/browse/ESC-1824)\r\nTesting environment: https://node-22.mural.engineering/\r\n\r\n### Summary\r\n\r\n- Update node-canvas to 3.2.0. This unblocks upgrading Node.js to a more recent version.\r\n - In the testing rig, register TTF fonts instead of WOFF fonts to avoid [incorrect font rendering](https://github.com/Automattic/node-canvas/issues/1737\r\n) on Linux.\r\n - In the Dockerfile, allow network access during `npm rebuild` to allow node-canvas to run `prebuild-install` to fetch its prebuilt binary. Note that this may impact some cache-related optimizations introduced in https://github.com/tactivos/murally/pull/42232.\r\n\r\n- Update Node.js to 22.20.0.\r\n - Update test setup and a few test assertions for compatibility. Note that this restores some test assertions that changed when [upgrading to Node.js 18](https://github.com/tactivos/murally/pull/35639) back to their original values.\r\n\n\n[ESC-1824]: https://mural.atlassian.net/browse/ESC-1824?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 46241, + "title": "[NEXT-125] refactor: migrate verify-email route to @muralco/route-verify-email package", + "branch": "migrate/next-125-package-route-verify-email", + "merged_at": "2025-11-26T00:16:39Z", + "changed_files": 15, + "additions": 242, + "deletions": 1, + "body": "Test env https://next-125-package-route-verify-email.mural.engineering\r\n\r\n\"image\"\r\n\r\n## Summary\r\n\r\nMigrates the `/verify-email` route handler function from `src/registration/routes/verify-email.ts` into a new standalone `@muralco/route-verify-email` package.\r\n\r\n## Changes\r\n\r\n- \u2705 Created new `@muralco/route-verify-email` package with React template structure\r\n- \u2705 Moved `verifyEmail` handler function to `packages/route-verify-email/src/verifyEmail.ts`\r\n- \u2705 Updated import in `src/registration/routes/index.tsx` to use new package\r\n- \u2705 Added required dependencies to package.json\r\n- \u2705 Added package to root package.json dependencies\r\n- \u2705 Updated CODEOWNERS to assign Engagement Team ownership\r\n- \u2705 Removed old `src/registration/routes/verify-email.ts` file\r\n\r\n## Testing\r\n\r\n### Automated Testing\r\n- \u2705 Package builds successfully\r\n- \u2705 TypeScript compilation passes\r\n- \u2705 No linting errors\r\n- \u2705 All packages build correctly\r\n\r\n### Manual Smoke Testing\r\n\r\n**How to obtain a valid hash for testing:**\r\n\r\nThe verification hash comes from email verification links sent to users. To get a valid hash for testing:\r\n\r\n1. **From a verification email:**\r\n - Sign up for a new account or request an email verification (via `sendVerifyEmail` API or user settings)\r\n - Check the email sent to the user's inbox\r\n - Extract the hash from the verification link URL (just ask Cursor or Codex to do this if you don't want to bother with the base64/json decoding)\r\n - Use that hash value in the test URL\r\n\r\n2. **From backend/database (if you have access):**\r\n - Query the database for pending email verifications\r\n - Extract the hash from the verification record\r\n\r\n3. **For invalid hash testing:**\r\n - Use any random string (e.g., `invalid-hash-123`) to test error handling\r\n\r\n**Test Scenarios:**\r\n\r\n1. **Valid email verification hash (no password set)**\r\n - Navigate to `/verify", + "labels": [] + }, + { + "number": 46235, + "title": "[ecomm-172] remove config flag and delete old code", + "branch": "add/ecomm-172-merge", + "merged_at": "2025-11-25T22:47:54Z", + "changed_files": 270, + "additions": 2280, + "deletions": 24533, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI refactor the old code related with stripe in billing, I removed old tests, old code, refactor to only use one stripe version.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-172) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Record\r\n\r\nhttps://www.loom.com/share/9d9a0ba7a69d41dd81cb41c77b05c664\r\n\r\n### Screenshot of validation page\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Consolidates Stripe to the latest Checkout/Elements, removes legacy flag/paths, and unifies the two\u2011screen purchase flow with checkout session while refactoring billing address/payment components and tests.\n> \n> - **Stripe integration**:\n> - Remove `config.stripe.vNextEnabled` and legacy `@stripe/stripe-js` usage; introduce single `getStripePromise`/`initializeStripe` using `@stripe/stripe-js-latest`.\n> - Update Elements and Checkout providers to latest API.\n> - **Two\u2011Screen Purchase Flow**:\n> - Delete `two-screen-purchase-flow-checkout-session` variant; fold checkout session into primary 2SPF.\n> - Add session mode/retry handling; wire Stripe Checkout confirm; refactor purchase buttons, promo code, VAT, and address handling.\n> - Update state/actions/reducer to support Address/Payment Elements and session retries.\n> - **Billing components**:\n> - Replace/merge billing address modal/components to use Stripe Address Element; update tests/mocks.\n> - Update `PaymentInfo` to new checkout provider.\n> - **Tests and features**:\n> - Remove obsolete cucumber specs and legacy tests; update remaining tests to latest Stripe/flow and QA selectors.\n> - **M", + "labels": [] + }, + { + "number": 46227, + "title": "[NEXT-313][NEXT-314] Colocate Color Palette & Common Mural Hooks to src/mural", + "branch": "colocate-mural-components", + "merged_at": "2025-11-25T22:19:25Z", + "changed_files": 194, + "additions": 270, + "deletions": 262, + "body": "Intermediary modularization step to help ease the migration of `src/mural`. This PR is moving common canvas code (color palette, mural hooks) to `src/mural` to reduce external dependencies from outside of that directory. The `src/mural/hooks` directory will eventually become `@muralco/canvas/hooks`. \r\n\r\nZero functional changes, a simple lift and shift of files to different directories. \r\n\r\nUpdates made: \r\n- `src/common/components/color-palette`, moved with other mural specific components in `src/mural/components`\r\n- `src/common/mural/hooks`, high occurrence hook imports for canvas, colocating near usage in Mural directory\r\n\n\n---\n\n> [!NOTE]\n> Moves color palette components and common mural hooks into `src/mural` and updates import paths/types across the codebase (no functional changes).\n> \n> - **Refactor/Colocation**:\n> - Move `src/common/components/color-palette/**` to `src/mural/components/color-palette/**`.\n> - Move `src/common/mural/hooks/**` to `src/mural/hooks/**`.\n> - **Codebase-wide import updates**:\n> - Replace imports from `common/mural/hooks/*` \u2192 `mural/hooks/*` and `common/components/color-palette/*` \u2192 `mural/components/color-palette/*`.\n> - Normalize `mural/dispatcher/index` \u2192 `mural/dispatcher` and related path fix-ups.\n> - **Type/cleanup tweaks**:\n> - Add explicit types to callbacks like `onApplyColor` and map iterations; minor selector generics and util import corrections (e.g., `clamp`).\n> - **Tests**:\n> - Update test imports/mocks to new `mural/hooks` and color-palette paths.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 190fbe53147a6499f875cf343f66d18028d1c8c5. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46239, + "title": "Open muralLimitUpgradeOptions modal for non-admin AI upgrade clicks", + "branch": "beta-fix/ai-upgrade-modal", + "merged_at": "2025-11-25T22:04:02Z", + "changed_files": 4, + "additions": 112, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nNow that non-admin users in a free workspace have access to AI features, they are directed to open the billing modal in several scenarios regarding upgrading. This is an issue as the billing modal is only able to load for workspace admins. Instead, this will direct them to a modal with an option to contact their admin.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1500) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-upgrade-modal.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n1. Create a Free plan workspace.\r\n2. Invite member A to a mural in the workspace.\r\n3. As member A:\r\n - Accept the invite and navigate to the invited mural.\r\n - Click on the **Mural AI hub**.\r\n - Click the **upgrade CTA** at the top of the hub.\r\n - See the **\u201cUnlock even more with an upgraded plan\u201d** modal.\r\n - Click **\u201cCreate diagram\u201d**.\r\n - See the **Mural AI upgrade** modal.\r\n - Click **\u201cupgrade now\u201d**.\r\n - See the **\u201cUnlock even more with an upgraded plan\u201d** modal.\r\n4. Select a widget and click the **\u201cExplore with AI\u201d** button in the widget toolbar.\r\n - Click the **upgrade CTA** at the top of the hub.\r\n - See the **\u201cUnlock even more with an upgraded plan\u201d** modal.\r\n - Click **\u201cSummarize\u201d**.\r\n - See the **Mural AI upgrade** modal.\r\n - Click **\u201cupgrade now\u201d**.\r\n - See the **\u201cUnlock even more with an upgraded plan\u201d** modal.\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build faili", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46246, + "title": "Update Salesforce view-only button to display icon and text", + "branch": "feature/salesforce-view-only-button-update", + "merged_at": "2025-11-25T21:47:39Z", + "changed_files": 1, + "additions": 4, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Replace MrlIconButton with MrlButton to show both icon and text\r\n- Change button text from 'Open Mural in new tab' to 'Open in Mural'\r\n- Update aria-label to match new button text\r\n\r\n\"image\"\r\n\r\nhttps://mural.atlassian.net/browse/PLAY-755\r\n\n\n---\n\n> [!NOTE]\n> Replaces the icon-only button with a button showing icon and \"Open in Mural\" text in the Salesforce view-only banner.\n> \n> - **UI**\n> - In `src/mural/addons/salesforce-view-only-app/view-only-tag-renderer.tsx`:\n> - Replace `MrlIconButton` with `MrlButton` using `linkOpen` icon.\n> - Update `aria-label` and button `text` to \"Open in Mural\".\n> - Retain click handler to open the mural in a new tab.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6f703e5b18c422bef428fe5d755f9f884d5e1487. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46091, + "title": "@muralco/canvas Package with Subpath Exports", + "branch": "package-canvas-subpath-test", + "merged_at": "2025-11-25T21:30:01Z", + "changed_files": 25, + "additions": 373, + "deletions": 1, + "body": "### Summary\r\n\r\nIntroduces an initial scaffold for the `@muralco/canvas` package with subpath exports, enabling modular imports for canvas functionality.\r\n\r\n### Changes\r\n\r\n- **New package**: `@muralco/canvas` with initial structure for canvas operations\r\n- **Subpath exports**: Configured 12 module entry points:\r\n - `business`, `common`, `dispatcher`, `models`, `register`\r\n - `sdk/apis`, `sdk/hooks`, `sdk/primitives`, `sdk/state`\r\n - `sdk-context`, `views`, `widget-store`\r\n- **Build configuration**: Webpack setup with multiple entry points for tree-shaking\r\n- **Documentation**: README with usage examples and subpath export setup guide\r\n\r\n### Usage Example\r\n\r\n```typescript\r\n// Import specific module instead of entire package\r\nimport { ... } from '@muralco/canvas/sdk/apis';\r\nimport { ... } from '@muralco/canvas/views';\r\n```\n\n\n---\n\n> [!NOTE]\n> Scaffolds the `@muralco/canvas` package with subpath exports and build/test/docs tooling, and updates CODEOWNERS and docs script.\n> \n> - **New package: `@muralco/canvas`**\n> - Subpath exports for modular imports: `business`, `common`, `dispatcher`, `models`, `register`, `sdk-context`, `sdk/apis`, `sdk/hooks`, `sdk/primitives`, `sdk/state`, `views`, `widget-store`.\n> - Build/Test/Types setup: webpack multi-entry, TypeScript configs, Jest config, ESLint rules, API Extractor, README.\n> - **Repo updates**:\n> - Add `@muralco/canvas` to root `package.json` dependencies.\n> - CODEOWNERS: assign `packages/canvas` to `@tactivos/canvas-core-nav`.\n> - Docs script: run `turbo docs --continue` to allow partial docs generation.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 65691104decd23d4e913097c5c924f44a3a2b361. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46082, + "title": "[FEP-6416] - update MrlToast custom notifications", + "branch": "refactor/toast-notification-styles", + "merged_at": "2025-11-25T21:11:45Z", + "changed_files": 18, + "additions": 107, + "deletions": 83, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6416](https://mural.atlassian.net/browse/FEP-6416)\r\n\r\n[https://toast-notification-styles.mural.engineering/](https://toast-notification-styles.mural.engineering/)\r\n\r\nThis PR updates all of the `MrlToast` notifications that have a custom implementation. These toast notification instances use `primaryMessage` or `secondaryMessage` to support passing a custom React component to the `MrlToast` notification. We made an [update](https://github.com/tactivos/ui-toolkit/pull/806) in `ui-toolkit` (version 4.58.0) to the styles of the `MrlToast` notification that requires some style update in murally.\r\n\r\nThe following custom notifications were updated:\r\n- following layer notifications (asked to be followed, summon, take control).\r\n- share modal: import list of emails, upload csv error.\r\n- canvas edit/move mode notifications.\r\n- canvas locked widgets selection.\r\n- canvas focus mode.\r\n- ai feedback notification.\r\n- themes feedback notification.\r\n- billing limited member reverse trial.\r\n- enhanced kanban feedback.\r\n\r\n## Updates\r\n\r\n- following layer notifications (asked to be followed, summon, take control).\r\n\r\nBefore:\r\n\"02\r\n\"02\r\n\"02\r\nAfter:\r\n\"02\r\n\"02\r\n\r\n- share modal: import list of emails, upload csv error.\r\n\r\nBefore:\r\n", + "labels": [] + }, + { + "number": 46240, + "title": "[CAN-8157] Fix orphaned sibling nested areas during resize", + "branch": "fix/nested-area-stealing", + "merged_at": "2025-11-25T21:01:40Z", + "changed_files": 4, + "additions": 98, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug reported when resizing a nested area enough to overlap another nested area within the same parent.\r\n\r\n**Steps to reproduce:**\r\n- Enable the `ENABLE_NESTED_AREAS` flag\r\n- Make sure that `ENABLE_ABSORPTION_SYSTEMS` flag is **off**\r\n- Create an area `A`\r\n- Add two nested areas `B` and `C` inside `A`, one next to the other\r\n- Put some background color on the areas to make the bug more visible\r\n- Send `C` to the bottom (you'll still see it because it's inside `A`)\r\n- Resize `B` enough to overlap `C`\r\n\r\nYou'll see that `C` disappears after `B` starts overlapping it.\r\n\r\n---\r\n\r\nThe reason this happened is not related to nested areas itself, but rather to how we handle the resizing of areas in general:\r\nWhen we start resizing an area, we expel everything in it and then, on each step of the resizing, analyze which widgets need to be re-added or re-removed (if they were re-added during a previous resizing step).\r\n\r\nNow, when we re-remove a widget, we don't check if removing it means that it should be absorbed by someone else.\r\nWhy? Because of how resizing and regular absorption _used to work_ before nested areas.\r\nSince, during a resize, we can only remove widgets that were added while resizing, we know for a fact that those widgets didn't have a different parent before.\r\nWhy? Because that would be stealing. The only way a widget that a resizing area is expelling can go to a different parent is if it had that parent before. And if it did, then the resizing area could have never own it in the first place.\r\n\r\nEntering nested area stealing...\r\nSince nested areas can steal widgets from a parent area, that assumption is no longer valid. Therefore, everything time we remove a widget during a resize operation we now need to check if it should go somewhere else.\r\n\r\nThis is exactly what this PR does.\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8157)\r\n- \ud83e\uddea [**Testi", + "labels": [] + }, + { + "number": 46224, + "title": "[SCQM-1429] Fix discard expanded mind map from existing node", + "branch": "fix/ai-expand-mindmap-undo", + "merged_at": "2025-11-25T19:09:54Z", + "changed_files": 1, + "additions": 4, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to this change, expanding a mind map node via the \"Create diagram\" --> \"Mind map\" option from the widget toolbar and then discarding was not actually discarding the results *WHEN IT WAS THE FIRST THING YOU DID IN THE MURAL* aka the undo redo stack is empty. \r\n\r\nThe issue: if the undo/redo stack is empty, the first time preview mode activates there is no transaction to bookmark so upon discarding there's nowhere to rollback to. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1429) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-expand-mindmap-undo.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nTo test:\r\n1. Create a mind map \r\n2. Clear undo / redo stack\r\n3. Select a node\r\n4. Expand the mind map via widget toolbar \"Create diagram\" --> \"Mind map\"\r\n5. Discard the results\r\n6. Verify the changes disappear \r\n\r\nTo regression test verify other pathways for creating and expanding a mind map are still solid\r\n1. Via a selected node and \"Generate ideas\"\r\n2. Via the \"Create diagram\" in the hub\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Ensure mind map preview can be discarded by appending a preview-mode undo bookmark before starting preview.\n> \n> - **AI Mindmaps**:\n> - In `src/mural/addons/ai/ai-mindmaps/function-calls/create-mindmap.ts`:\n> - Append undo/redo bookmark via `sdk.undoRedo.appendStep(new PreviewModeBookmarkTrackingStep('mindmap'))` before starting preview to enable proper discard.\n> - Add import for `PreviewModeBookmarkTrackingStep`.\n> \n> Written b", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46229, + "title": "[SCQM-1470] Remove unused filter tolerance flag", + "branch": "remove/bam-filter-tolerance-flag", + "merged_at": "2025-11-25T18:36:34Z", + "changed_files": 4, + "additions": 2, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\nRemoves flag that was used in build a mural which is no longer active \r\nhttps://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-mu-enable-ai-build-a-mural-filter-tolerance/rules/beta\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1470) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://bam-filter-tolerance-flag.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46233, + "title": "[CAN-8145] Defer area title selection to mouse up when another widget is already selected", + "branch": "fix/can-8145", + "merged_at": "2025-11-25T17:45:52Z", + "changed_files": 2, + "additions": 18, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR defers area selection to mouse up when another widget is already selected by returning `false` in `shouldSuppressAndHandleAreaSelection` if the user is doing mouse down on a hint and the area is not selected.\r\n\r\nTo reproduce the bug:\r\n1. Create an area\r\n2. Add a sticky to that area\r\n3. Select the sticky\r\n4. Hold mouse down on the title of the area \r\n - In the PR the area is not selected until the mouse up event\r\n - In master the area is selected on mouse down and deselected on mouse up \r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/38cbb446-7513-4076-8ca1-f6df7734353b)\r\n\r\nMaster:\r\n![bug](https://github.com/user-attachments/assets/114004e2-f0b7-4ace-95b1-468c0baf30bf)\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8145\r\n- Env: https://can-8145.mural.engineering\r\n\n\n---\n\n> [!NOTE]\n> Suppress selecting areas on mousedown when a different widget is selected; commit selection on mouseup and adjust hint-based selection rules, with new tests covering the behavior.\n> \n> - **Mouse interactions (`src/mural/addons/core/mouse/mouse-manager.tsx`)**\n> - Update `shouldSuppressAndHandleAreaSelection` to compute `hasDifferentSelection` and suppress area selection on mousedown in empty space of areas with children when a different selection exists.\n> - Prevent immediate hint-based selection if a different widget is selected; otherwise allow normal flow.\n> - Maintain pending area selection to commit on mouseup; preserve panning/drag behavior.\n> - **Tests (`src/test/react-new/.../mouse.feature`)**\n> - Add scenarios asserting areas are not selected on mousedown but are selected on mouseup when another widget is selected.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 81b42e39905ad282274b665b2c04cc7ce35daad6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=", + "labels": [] + }, + { + "number": 46225, + "title": "[NEXT-312] Migrates src/common/components to packages", + "branch": "src-common-components", + "merged_at": "2025-11-25T17:24:41Z", + "changed_files": 55, + "additions": 81, + "deletions": 94, + "body": "## Pull request overview\r\n\r\nThis PR migrates common components from `src/common/components` to internal packages (`@muralco/legacy-ui`, `@muralco/integrations`, and `@muralco/types`), improving code organization and reusability across the monorepo. The migration includes updating import paths throughout the codebase to reference the new package locations.\r\n\r\n**Key Changes:**\r\n- Components migrated to `@muralco/legacy-ui`: `EmptyLoading`, `VisitorsLinkText`, `LegacyInputField`, `LegacyAvatarField`\r\n- Component migrated to `@muralco/integrations`: `DottedContainer`\r\n- Type definition migrated to `@muralco/types`: `ModalSize`. \r\n - This was moved to `types` to prevent `@muralco/canvas/sdk` from becoming a dependency in `@muralco/legacy-ui`\r\n\n\n---\n\n> [!NOTE]\n> Migrates shared UI components to internal packages, introduces ModalSize in @muralco/types, and updates imports across the app.\n> \n> - **Packages/Dependencies**:\n> - Add `@muralco/types` dependency where needed; remove local modal size type usages.\n> - **@muralco/types**:\n> - Add `common/modal/ModalSize` type and export via `common/modal` and root `common` index.\n> - **@muralco/legacy-ui**:\n> - Export `EmptyLoading`, `VisitorsLinkText`, `LegacyInputField`, `LegacyAvatarField` and related barrels.\n> - Switch modal `types.ts` to use `@muralco/types` `ModalSize`.\n> - Add `UserLinkIcon` export; adjust helpers to consume centralized `ModalSize`.\n> - **@muralco/integrations**:\n> - Add `DottedContainer` component with styles and export via package index.\n> - **App code updates**:\n> - Replace imports of `EmptyLoading`, `VisitorsLinkText`, `InputField`, `AvatarField` with `@muralco/legacy-ui` equivalents.\n> - Replace local `DottedContainer` with `@muralco/integrations`.\n> - Replace `DefaultModalSize`/local modal size types with `@muralco/types` `ModalSize`.\n> - Remove obsolete `src/common/components/style.sass` and adjust internal barrels/exports.\n> \n> Written by [Cursor Bu", + "labels": [] + }, + { + "number": 46228, + "title": "[SCQM-1487] Remove logging for timer initialTimestamp bug", + "branch": "remove/timer-logging", + "merged_at": "2025-11-25T17:15:05Z", + "changed_files": 2, + "additions": 3, + "deletions": 26, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemove logging\r\n\r\nReverts https://github.com/tactivos/murally/pull/45286\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1487) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://timer-logging.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46232, + "title": "Enhance BOP discovery call ownership", + "branch": "add/discovery-call-ownership", + "merged_at": "2025-11-25T16:48:25Z", + "changed_files": 1, + "additions": 3, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the BOP team did not have full github ownership of discovery-call related code.\r\n\r\nNow, with these changes, any changes would require their approval.\r\n\r\n** This is merely a `CODEOWNERS` change, no active code changed. **\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1276) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\n\n\n---\n\n> [!NOTE]\n> Adds CODEOWNERS entries assigning `@tactivos/bop` ownership to discovery-call business and compositor code.\n> \n> - **CODEOWNERS**:\n> - Add `@tactivos/bop` ownership for:\n> - `src/mural/business/discovery-call`\n> - `src/mural/addons/widget-compositors/discovery-call`\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f5eeb88c0507c4563840575d3a9e2010e33e98a3. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46217, + "title": "[NEXT-256] Remove `setSdkContextForAmpHelpers`", + "branch": "fix/next-256-2", + "merged_at": "2025-11-25T15:17:39Z", + "changed_files": 20, + "additions": 124, + "deletions": 107, + "body": "**[NEXT-256 Remove easy to replace functions from apm, use SDK](https://mural.atlassian.net/browse/NEXT-256)**\r\n\r\nThis PR removes global variable + getter/setter for SDK context. The last call to it was inside of `onUpdateWidgetRequest`. In most cases it was easy to provide SDK, except the case `widget.patch() -> patchAmpWidget() -> onUpdateWidgetRequest() -> debouncedApplyChangesToMural(globalSdk)`. So, moved the call requiring SDK out of `onUpdateWidgetRequest` and call `debouncedApplyChangesToMural` in places where it's needed.\r\n\r\nTo detect every place where `widget.patch` is called, I added `console.trace` into it, and run tests. Then, parsed the log. There were only these 3 call sources, and all of them in a single function:\r\n```\r\nat updateAmpersandAndEngine (/Users/amonkin/mural/murally/src/mural/sdk/apis/widgets/changes/apply-changes/update-ampersand-and-engine.ts:35:19)\r\nat updateAmpersandAndEngine (/Users/amonkin/mural/murally/src/mural/sdk/apis/widgets/changes/apply-changes/update-ampersand-and-engine.ts:49:13)\r\nat updateAmpersandAndEngine (/Users/amonkin/mural/murally/src/mural/sdk/apis/widgets/changes/apply-changes/update-ampersand-and-engine.ts:48:19)\r\n```\r\n\r\nAdded `persistChangesDebounced` to `WidgetChangesApiService` to avoid propagating full SDK into widget changes API.\r\n\r\nSpecified exact used API subsets when needed instead of using full SDK.\r\n\r\nThe environment: https://next-256-2.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Eliminates global SDK context, refactors mural change/resync flows to accept scoped SDK, and adds debounced persistence after widget create/update/delete with API wiring and tests updated.\n> \n> - **AMP / Helpers**:\n> - Refactor `applyChangesToMural` and `resyncMural` to accept scoped `sdk` (`widgets/mural/network`); replace `ctx.*` usages and call `resyncMural(sdk, ...)`.\n> - Remove `setSdkContextForAmpHelpers` and all references; simplify `onUpdateWidgetRequest` (no SDK side-effects).\n> - **Widgets SDK**:\n> ", + "labels": [] + }, + { + "number": 46151, + "title": "[ESC-1785] Add job error details on data retention details modal", + "branch": "add/esc-1785-add-job-error-on-dr-table", + "merged_at": "2025-11-25T14:44:47Z", + "changed_files": 7, + "additions": 517, + "deletions": 249, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the View results button in the DR page only allowed the results to be viewed if the job was completed.\r\n\r\nNow, with these changes:\r\n- The View results button is always visible, the download csv button is the one that will be enabled if the job is completed and if there was an error it will be shown instead of the table of details. \r\n- Added success and error handling with some toasts that were missing from the Figma design.\r\n- Fixed a size error on the archived murals search box that showed the search some px smaller than in the design.\r\n- The Download CSV button now is of kind ghost as in the design\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1785) to understand the context of this effort.\r\n\r\n##### Error notification on the details modal\r\n\"image\"\r\n\r\n##### Notifications\r\n\"image\"\r\n\"image\"\r\n\"image\"\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**Design Link**](https://www.figma.com/design/CwmfDNoZsns1KiI0bENmKu/ESC-Content-Lifecycle?node-id=472-17988&m=dev)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just res", + "labels": [] + }, + { + "number": 45977, + "title": "[IAM-2270] add new mural users columns / inline action flow for ACR ", + "branch": "feat/iam-2270-mural-users-acr", + "merged_at": "2025-11-25T01:15:35Z", + "changed_files": 17, + "additions": 796, + "deletions": 126, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nUpdates the mural users table with new columns behind the ACR env flag/feature toggle\r\n- Removes the old discreet permissions columns with a unified \"Role\" column\r\n- Simplifies the \"Actions\" column as there is no more edit mode / role updates from the column cell dropdowns are \"hot\"\r\n- Implements a `Role` column with dropdown rendering logic for various user types \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2270) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2270-mural-users-acr.mural.engineering/t/thepool0144/m/thepool0144/1763708116983/settings/members) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nI've turned on the ACR env flag for the above testing env link and added a mural underneath a room/workspace/company that has the ACR feature toggle turned on. Also have added some users to that mural / you can use the following admin credentials to inspect/test:\r\n```\r\nalex.johnson@hunnur.com\r\nzhX26p7A_TF4sx_\r\n```\r\n\r\nRegression checks:\r\n- Should still be able to perform table actions with the new actions column\r\n\r\nNew feature:\r\n- Should be able to update user roles, get a success toast notification\r\n- Entire dropdown should be disabled for certain user types (self/admin, disabled/locked users)\r\n- Some options within the dropdowns should always be disabled for certain user types:\r\n - Guests should never be assignable to `Admin`\r\n - Guests should only be able to select `Facilitator` if the relevant parent workspace setting is on\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart", + "labels": [] + }, + { + "number": 46221, + "title": "[SCQM-1463] Remove `mind map` from mind mind id check - format is `mindmap-UUID`", + "branch": "fix/mindmap-id-check", + "merged_at": "2025-11-24T21:23:16Z", + "changed_files": 1, + "additions": 3, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFollow up to the PR for https://mural.atlassian.net/browse/SCQM-1463 that when merged the bot noted this issue. TBH this doesn't really change much as the original intent of this function no longer really works as it should (it's specific to using the chat to alter a mind map) - BUT I still think that for consistency / clarity we should make this look for the correct structure of a mind map identifier which is just `mindmap-UUID`\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mindmap-id-check.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nTo test, just make and update some mindmaps and verify they work. Specifically to activate the \"add a node\" function, select a mindmap node and _in the chat_ request to add another node to it. \r\n\r\n\n\n---\n\n> [!NOTE]\n> Tightens mindmap ID detection in `update-mindmap.ts` to only treat strings containing `mindmap` as IDs (dropping support for `mind map`), otherwise deriving the ID from the selected widget\u2019s `partOf.id`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 209bda621a4f9ce66bd1bd99c706c6605be04b77. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46189, + "title": "CAN-8127 - Lowering mouse wheel zoom speed for better Windows experience", + "branch": "fix/can-8127-final", + "merged_at": "2025-11-24T21:11:02Z", + "changed_files": 1, + "additions": 5, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nLowering the mouse wheel zoom speed limit. Default on Windows is 120 which is 30x faster than Mac. Lowered it to 100 earlier but it wasn't enough. Now lowering to 50.\r\n\r\n#### Reviewer Resources\r\n\r\nhttps://mural.atlassian.net/browse/CAN-8127\r\n\r\n\n\n---\n\n> [!NOTE]\n> Lower `ZOOM_MAX_SPEED` from 100 to 50 in `wheel-handler.tsx` to slow mouse-wheel zoom for finer control (especially on Windows).\n> \n> - **Input/Zoom Handling**:\n> - In `src/mural/components/wheel-handler.tsx`, reduce `ZOOM_MAX_SPEED` from `100` to `50` to further clamp mouse-wheel deltas.\n> - Update inline comments to note Windows precision trade-offs and related tickets (CAN-7891, CAN-8127).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4871f4e37409ba4fec0b5d95b40ee51d4290df07. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46197, + "title": "[NEXT-272] Migrate misc standalone files from src/common", + "branch": "package-src-common-directories", + "merged_at": "2025-11-24T20:57:53Z", + "changed_files": 39, + "additions": 36, + "deletions": 85, + "body": "## Migrate misc standalone files from src/common\r\n\r\nRefactors standalone files from `src/common` into more appropriate locations within the monorepo structure.\r\n\r\n### Changes\r\n\r\n- **Help menu helpers** \u2192 `packages/legacy-ui/src/helpers/help-menu/`\r\n - Moved `handleClickHelpCenter` and `handleClickEmailCS` to the legacy-ui package\r\n - Removed unused `style.sass` file\r\n\r\n- **Satismeter component** \u2192 `packages/legacy-ui/src/ui/components/satismeter/`\r\n - Moved component to legacy-ui package structure\r\n\r\n- **Time constants** \u2192 `src/mural/helpers/time-constants.ts`\r\n - Moved `DELAYS` and `EXPIRATIONS` constants closer to mural-specific code\r\n\r\n- **Team types and tracking** \u2192 `src/team/`\r\n - Moved `team/types.ts` and `tracking-info.ts` into the team module\r\n\r\n### Impact\r\n\r\n- Updated 30+ import statements across the codebase to use new locations\r\n- Replaced relative imports with package imports (`@muralco/legacy-ui`) where appropriate\r\n- No functional changes; code organization only\r\n\n\n---\n\n> [!NOTE]\n> Moves help-menu helpers and Satismeter to legacy-ui, centralizes time constants under mural helpers, relocates team types/tracking, and updates imports across app and tests (removing obsolete style).\n> \n> - **Legacy UI**:\n> - Add `help-menu` helpers (`handleClickHelpCenter`, `handleClickEmailCS`) under `packages/legacy-ui/src/helpers/help-menu/` and export via `@muralco/legacy-ui`.\n> - Move `Satismeter` to `packages/legacy-ui/src/ui/components/satismeter/` and export in `ui/components/index.ts`.\n> - **Mural**:\n> - Introduce `src/mural/helpers/time-constants.ts` (`DELAYS`, `EXPIRATIONS`) and update all references (realtime, outline, preview, socket, video APIs, tests).\n> - **Dashboard/Settings**:\n> - Replace local Satismeter and help-menu imports with `@muralco/legacy-ui` in `dashboard` and `settings/workspace/members`.\n> - Use centralized help actions in config menu and company controller.\n> - **Team Module**:\n> - Move `team/types.ts` ", + "labels": [] + }, + { + "number": 46222, + "title": "[CWI-2345] Remove Creative Cloud from integrations list", + "branch": "remove/cwi-2345", + "merged_at": "2025-11-24T20:46:48Z", + "changed_files": 1, + "additions": 0, + "deletions": 10, + "body": "Missed one place that had Creative Cloud in the integrations list.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46204, + "title": "[NEXT-271] Add logic for create-package to update package.json ", + "branch": "add/package-updates", + "merged_at": "2025-11-24T20:19:29Z", + "changed_files": 5, + "additions": 869, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Adds on changes to create-package\r\n- Adds logic to update murally's package.json to include the new package\r\n- Adds logic to update murally's package.json to include the parent folder to the workspaces array if create-package is used with a parent directory that does not yet exist\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Enhances create-package to add new packages to root dependencies and, when needed, add a parent workspace pattern; introduces supporting utils and comprehensive tests.\n> \n> - **CLI workflow (`packages/create-package`)**:\n> - `createPackage` now:\n> - Accepts `parentDirectory` and `wasParentDirectoryCreated`.\n> - Uses `process.cwd()` (packages dir) to update root `package.json`.\n> - Adds `@muralco/` to root `dependencies`.\n> - Conditionally adds `packages//*` to root `workspaces` when a new parent dir is created.\n> - `index.js` wires parsed inputs to `createPackage` and removes unused string case logic here.\n> - **Utilities (`utils/packages.js`)**:\n> - New `addPackageToRootDependencies(packageName, packagesDir)` to insert/sort deps in root `package.json`.\n> - New `addWorkspaceToRootPackageJson(parentDirectory, packagesDir)` to insert/sort workspaces in root `package.json`.\n> - `createPackageFolder` now returns `{ packageFolder, wasParentDirectoryCreated }` and tracks parent dir creation.\n> - `parsePackagePath` kebab-cases `parentDirectory` and `packageDirectoryName`.\n> - `validatePackagePath` adds normalization, stricter validation, and clearer errors.\n> - **Tests**:\n> - Extensive unit tests for new utils, `createPackage` side effects, error handling, and path parsing/validation.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for c", + "labels": [] + }, + { + "number": 46220, + "title": "Tiger team codeowners", + "branch": "tiger-team-codeowners", + "merged_at": "2025-11-24T20:05:31Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "This PR adds the `@tactivos/modularization-tiger-team` to the CODEOWNERS for `package.json` and `package-lock.json` files, allowing the tiger team to approve dependency-related changes alongside FEP and Platform Engineering teams.\r\n\r\n- Added tiger team as a third approver group for all `package.json` and `package-lock.json` files\n\n\n---\n\n> [!NOTE]\n> Adds `@tactivos/modularization-tiger-team` as co-owners for all `**/package.json` and `package-lock.json` entries in `CODEOWNERS`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 33ac71d1901f27b0bd1e95933500984454003e4c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46198, + "title": "[NEXT-269] Adds core dispatcher module", + "branch": "add/core-dispatcher-module", + "merged_at": "2025-11-24T19:51:22Z", + "changed_files": 129, + "additions": 673, + "deletions": 143, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSummary:\r\n\r\nExtracts dispatcher connection utilities into a new @muralco/core-dispatcher package and migrates the codebase to use it. This centralizes state management connection logic and improves maintainability.\r\n\r\nChanges:\r\n\r\n- New Package: `@muralco/core-dispatcher`\r\nA framework-agnostic state management library providing:\r\n- React Component Connection: connectComponent HOC for connecting React components to dispatcher state using a slice pattern\r\n- Non-React Subscriptions: connectToDispatcher and connectToSelector for subscribing to state changes outside React\r\n- Performance Optimizations: RAF-based update strategies and shared connection pooling\r\n- Development Tools: Slice inspector utilities for debugging component connections\r\n- Type Utilities: TypeScript helpers for working with dispatcher types\r\nMigration\r\n- 129 files updated across the codebase to use the new package imports\r\n- Components migrated from src/dispatcher/ to @muralco/core-dispatcher\r\n- Import paths updated throughout mural components, addons, views, and hooks\r\n- Notifications API migrated from core dispatcher to mural dispatcher\r\n\r\nTechnical Details:\r\n- Added webpack configuration for the new package\r\n- Updated TypeScript configurations and type definitions\r\n- Added comprehensive README documentation\r\n- Maintained backward compatibility with existing dispatcher patterns\r\n- Preserved all existing functionality while improving code organization\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-269) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Extracts dispatcher connection utilities into new `@muralco/core-dispatcher` package and migrates codebase to use it; ", + "labels": [ + "frontend-next" + ] + }, + { + "number": 46203, + "title": "Add CardStyle to mural styles", + "branch": "fix/card-render-styles", + "merged_at": "2025-11-24T19:26:11Z", + "changed_files": 3, + "additions": 232, + "deletions": 187, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates the mural-render shared with the Card widget styles.\r\n\r\nNote: these files are copied from the `mural-api` project using a script. It turns out that `mural-api` doesn't have the same linting rules than murally, and maintaining two different representation of this files quite a hassle, so I disabled `sort-keys` to allow a verbatim copy.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [Ho", + "labels": [] + }, + { + "number": 46195, + "title": "[SCQM-1463] Fix casing and language in ai chat and toasts", + "branch": "fix/ai-text", + "merged_at": "2025-11-24T18:47:12Z", + "changed_files": 17, + "additions": 65, + "deletions": 63, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nJIRA: https://mural.atlassian.net/browse/SCQM-1463\r\nENV: https://ai-text.mural.engineering/\r\n\r\nmural-api PR: https://github.com/tactivos/mural-api/pull/14932\r\n\r\nUpdates AI user-facing text for consistency:\r\n- \"element\" \u2192 \"object\"\r\n- \"mindmap\" \u2192 \"mind map\"\r\n - Instead of only changing the user-facing text I also changed the text that is sent to the AI\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-text.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46211, + "title": "[ECOMM-323] Create downgradeAtRenewalEnabled config flag", + "branch": "add/ecomm-323-config-flags", + "merged_at": "2025-11-24T16:35:09Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-323) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14938)\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds optional `stripe.downgradeAtRenewalEnabled` flag to the API config schema.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cdf0de888006cd52e40f9db6edd8fa69e8bd74e1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46125, + "title": "impl mocks for content-check", + "branch": "fix/check-content-mocks", + "merged_at": "2025-11-24T13:45:25Z", + "changed_files": 2, + "additions": 10, + "deletions": 0, + "body": "\r\n# What was changed and why? \ud83e\udd14 \r\n\r\nSlack thread: https://mural.slack.com/archives/C01T3FV3VEW/p1763400972443739\r\n\r\nIt seems that we are breaking integration tests for murally, so as suggested by @pgrabarnik we added mocks for this and it __seems__ to have solved the issue at least locally for me.\r\n\r\n# Testing\r\n\r\n- Run `NEW_RIG=1 npm run test:react` locally, and observe any failures\r\n- Observe CI/CD pipeline", + "labels": [] + }, + { + "number": 46213, + "title": "[stable-fix] Quick editable table", + "branch": "stable-fix/editable-address", + "merged_at": "2025-11-21T23:28:42Z", + "changed_files": 2, + "additions": 275, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add ability to edit entries in the table to correct email address.\r\n- This is a feature that is _only_ internal for Customer Support.\r\n\r\nNote: there were many short-cuts taken around accessibility for speed of getting this feature out. This is _only_ being done because it is internal and will not be user facing.\r\n\r\nLoom demo: https://www.loom.com/share/00726eb878fb4a33bcc1eb94b7998c23\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architectu", + "labels": [] + }, + { + "number": 46212, + "title": "[NEXT-270] Add help command to create-package CLI", + "branch": "add/package-help", + "merged_at": "2025-11-21T23:10:45Z", + "changed_files": 6, + "additions": 257, + "deletions": 54, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds -h/--help to the CLI and replaces name-based inputs with path-based validation/parsing, updating folder creation and tests.\n> \n> - **CLI**:\n> - Handle `-h/--help` flags in `bin/cli.js`; expose `showHelp()` from `src/index.js`.\n> - New `utils/help.js` with detailed usage, aliases, examples; added `help.test.js`.\n> - **Core Logic**:\n> - Switch from package \"name\" to package \"path\" input in `src/index.js` (`validatePackagePath`, `parsePackagePath`).\n> - Prompt updated to request package path; pass parsed components to `createPackage`.\n> - **Utils (`utils/packages.js`)**:\n> - Replace `validatePackageName`/`parsePackageName` with `validatePackagePath`/`parsePackagePath`.\n> - Adjust `createPackageFolder` parent dir creation; improved error handling/messages.\n> - **Tests**:\n> - Update and expand `packages.test.js` for path-based validation/parsing and folder creation behaviors.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 570c8e030307e0f688a7d150124bcdb8ff1e86f0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46172, + "title": "[SCQM-1460] Adds preview badge to explore with AI menu item Create diagram", + "branch": "update/explore-ai-preview-badge", + "merged_at": "2025-11-21T22:21:57Z", + "changed_files": 10, + "additions": 46, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a preview badge into the Explore with AI menu (and upgrade menu for free accounts), on the `Create Diagram` menu option.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1460) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://explore-ai-preview-badge.mural.engineering/) to perform a smoke test.\r\n\r\n - Please follow these steps to perform a sufficient smoke test of these changes:\r\n 1. Create two mindmap nodes & select them\r\n 2. Open the explore with AI menu item\r\n 3. Observe the preview badge next to `Create diagram`\r\n 4. Open the submenu\r\n 5. Ensure the second option is disabled \r\n 6. Create a free account\r\n 7. Create a sticky note and select it\r\n 8. Observe the preview badge next to `Create diagram`\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds pill badge support across menu/tool APIs and displays an \"Preview\" badge on the AI \"Create diagram\" option in explore/upgrade menus, with minor styling adjustments.\n> \n> - **Menu/Tools API**:\n> - Add `pill` support (`MrlBadgeProps`) to `Tool`, `ToolSpec`, builder (`tool`), toolbar renderer (`renderers/toolbar/utils.ts`), and adapter item (`ToolbarMenuAdapterItem`) to render a right-aligned `MrlBadge`.\n> - Styles for right-aligned pill in `ToolbarMenuAdapterItem/styles.module.sass`.\n> - **AI Diagram menu**:\n> - Show \"Previ", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46194, + "title": "[NEXT-265] Add subdirectory support for package creation", + "branch": "add/subdirectory-support", + "merged_at": "2025-11-21T22:08:51Z", + "changed_files": 7, + "additions": 358, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Adds validation for template name and gives user the option to choose from the list of options if they provide an invalid template name\r\n- Adds support for creating a package with one level of nesting\r\n- If the parent folder is not already created, it creates the parent folder\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Jire ticket\r\n[NEXT-265](https://mural.atlassian.net/browse/NEXT-265)\n\n[NEXT-265]: https://mural.atlassian.net/browse/NEXT-265?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Enables creating packages in one-level subdirectories with normalized paths, adds package/template name validation and parsing, and introduces targeted unit tests.\n> \n> - **Create Package CLI (`packages/create-package/src/index.js`)**:\n> - Validate and parse `packageName` (`validatePackageName`, `parsePackageName`) before use.\n> - Validate `templateName`; prompt with available templates when invalid (`validateTemplateName`).\n> - Create package folder with optional parent directory via updated `createPackageFolder`; pass normalized `packageName` to scaffolder.\n> - **Utilities**:\n> - `utils/packages.js`:\n> - Add `validatePackageName` (normalizes, restricts traversal/characters/levels) and `parsePackageName` (derive `parentDirectory`, `packageDirectoryName`, hyphenated `packageName`).\n> - Enhance `createPackageFolder` to support optional parent directory, recursive creation, and custom `PackageExistsError`.\n> - `utils/stringManipulation.js`:\n> - Add `normalizePath` for cross-platform separator handling.\n> - `utils/templates.js`:\n> - Add `validateTemplateName` and export it.\n> - **Tests**:\n> - Add tests for `createPackageFolder`, `parsePackageName`, `validatePackageNa", + "labels": [] + }, + { + "number": 46174, + "title": "[NEXT-263] Move browser EventsStore and useTruncated hook to package", + "branch": "move/truncated-eventstore-package", + "merged_at": "2025-11-21T21:53:26Z", + "changed_files": 34, + "additions": 276, + "deletions": 24, + "body": "test-env: https://truncated-eventstore-package.mural.engineering/\r\n\r\n\n\n---\n\n> [!NOTE]\n> Introduces new package `@muralco/browser-context` (EventStore and `useIsTruncated`) and updates app/tests to consume it, replacing prior local implementations.\n> \n> - **Packages**:\n> - **New**: `@muralco/browser-context` providing `EventsStore` and `useIsTruncated` hook, with build/test configs and docs.\n> - Added to workspace dependencies and `CODEOWNERS` (Engagement team).\n> - **Adoption across app**:\n> - Replace local imports with `@muralco/browser-context` for `EventsStore` and `useIsTruncated` in dashboard components and tests (e.g., `link-truncated-tooltip-with-portal`, truncated link/button, room pages, layout tests, providers).\n> - **Implementation tweaks**:\n> - Use `uuid` via `import { v4 as uuid } from 'uuid'` in `packages/browser-context/src/stores/events`.\n> - Export surfaces from `packages/browser-context/src/index.ts` for `stores` and `hooks`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6eaf90e21704cba93b1bce0fb8c15940feadf243. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46186, + "title": "Migrate src/common/auth & Integrations Event Dispatcher", + "branch": "more-common-migrations", + "merged_at": "2025-11-21T21:40:03Z", + "changed_files": 21, + "additions": 461, + "deletions": 23, + "body": "- Updates the location of `auth` types\r\n- moves integrations `event-dispatcher` to a package\r\n\r\nenv: https://more-common-migrations.mural.engineering\n\n\n---\n\n> [!NOTE]\n> Introduces a new `@muralco/iframe-event-dispatcher` package and updates app and tests to use it; removes the shared `auth` types file and defines `Auth` locally in `verify-token`.\n> \n> - **Workflows & Integrations**\n> - **New package**: `packages/iframe-event-dispatcher`\n> - Exports `IframeEventDispatcher` and `IframeEventDispatcherTypes` via `src/` with build/tests/configs (`webpack`, `jest`, `tsconfig`, `api-extractor`).\n> - Unit tests for event dispatch behavior in `src/event-dispatcher.test.ts`.\n> - **Consumers migrated**:\n> - `src/invitation/routes/client-app-mural.ts` uses `@muralco/iframe-event-dispatcher` for event dispatching.\n> - `src/mural/addons/integrated-client/index.tsx` dispatches back event via new dispatcher.\n> - `src/mural/routes/enter-controller.ts` emits READY/ERROR/ACCESS events via new dispatcher.\n> - Test rig updates: `src/test/react-new/step-definitions/misc.ts`, `src/test/react/pages/integrations/canvas.tsx` import `EventDispatcherOptions` from new package.\n> - **Auth Types**\n> - Removes `src/common/auth/types.ts`; defines `Auth` inline in `src/registration/routes/verify-token.ts`.\n> - **Ownership & Dependencies**\n> - `CODEOWNERS`: adds `packages/iframe-event-dispatcher` to `@tactivos/workflows-and-integrations`.\n> - Root `package.json`: adds dependency `@muralco/iframe-event-dispatcher`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f1ec4abe4c19b94fd74c95ee8d78b43f0a723fbb. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46199, + "title": "[SCQM-1457] Fix ai feature feedback timing", + "branch": "fix/suggest-title-feedback-timing", + "merged_at": "2025-11-21T20:55:39Z", + "changed_files": 6, + "additions": 10, + "deletions": 40, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to this change, the feedback toast was showing up too early for several features (**Suggest title, Spellcheck, Translate, and Classify by Sentiment**). It should wait until after preview mode has been accepted / rejected, but it was appearing as soon as the feature finished (while in preview mode). \r\n\r\nThe code for preview mode handling this is already in place, just needed to remove the extra calls from `onSuccess` callbacks. **Mindmap** was a one-off where the code was there but hidden behind a `skip` flag hardcoded to true. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1457) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://suggest-title-feedback-timing.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Run each feature: Suggest title, translate, spellcheck, classify by sentiment, generate mind map\r\n2. Verify the feedback toast shows up only after preview mode is exited\r\n\n\n---\n\n> [!NOTE]\n> Removes early feedback toasts and aligns timing to post-preview for Suggest Title, Spell Check, Translate, Sentiment Classification, and Mindmap, with minor option cleanup.\n> \n> - **AI feedback timing (post-preview only)**\n> - Remove early `setFeedbackToast` calls from `ai-suggest-title/operation.ts`, `ai-translate/operation.ts`, and `ai-sentiment-classification/operation.ts`.\n> - Mindmap: drop feedback logic and the unused `skipFeedback` option; stop gating by `skipFeedback` in `ai-mindmaps`.\n> - **Spell Check**\n> - Adjust success flow in `ai-spell-check/function-call.ts`:\n> - Non-streaming: start preview if there are widget changes; otherwise show feedback toast.\n> - Keep analytics; avoid feedback toast on streaming comp", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46178, + "title": "ENGAGE-1376 Use RoomActionsManager actions for RoomPage menu ", + "branch": "add/room-header-actions", + "merged_at": "2025-11-21T20:27:40Z", + "changed_files": 38, + "additions": 1346, + "deletions": 598, + "body": "Ticket: https://mural.atlassian.net/browse/ENGAGE-1376\r\n\r\nTest-Env: https://room-header-actions.mural.engineering/\r\n\r\n## Overview\r\n\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n\r\nMigrates the room header menu to use the same `RoomActionsManager` pattern as the room card menu, creating a **single source of truth** for both menus. Implements divider support using the `groupId` pattern from PR #45918. \r\n\r\n> **Note:** This migration is specifically for **room actions menus only** - mural actions and folder actions are out of scope.\r\n\r\n## Key Changes\r\n\r\n### 1. Created Missing Action Registrations\r\nAdded 4 new action registrations following the `RoomActionRegistration` pattern:\r\n- `duplicateRoomMenuRegistration.tsx` - Duplicate room action\r\n- `moveRoomMenuRegistration.tsx` - Move room action \r\n- `deleteRoomMenuRegistration.tsx` - Delete room action\r\n- `leaveRoomMenuRegistration.tsx` - Leave room action\r\n\r\n### 2. Added Divider Support via `groupId`\r\nAdded `groupId` property to all action registrations for consistent grouping:\r\n- `'user-actions'`: star, unstar, share\r\n- `'admin-actions'`: settings, members\r\n- `'room-operations'`: duplicate, move\r\n- `'destructive-actions'`: delete, leave\r\n\r\n### 3. Created Modal Wrapper Components\r\nCreated modal wrapper components that integrate with `RoomActionsManager`'s `open(JSX)` pattern:\r\n- `DashboardDuplicateRoomModal.tsx`\r\n- `DashboardMoveRoomModal.tsx`\r\n- `DashboardDeleteRoomModal.tsx`\r\n- `DashboardLeaveRoomModal.tsx`\r\n- `RoomPageActionsContext.tsx` - Provides room page handlers and data to modal wrappers\r\n\r\n### 4. Added RoomActionsManager Provider to Room Page\r\n- Added `RoomActionsManager.Provider` to room page component\r\n- Registered all 9 room action re", + "labels": [] + }, + { + "number": 46206, + "title": "ENGAGE-1424 Final (?) UI tweaks for GA", + "branch": "add/v2-share-modal-updates", + "merged_at": "2025-11-21T19:33:19Z", + "changed_files": 4, + "additions": 378, + "deletions": 18, + "body": "# Share Modal v2: Permission Default and Overflow Fixes\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1424\r\n\r\nTest Env: https://v2-share-modal-updates.mural.engineering/\r\n\r\n## Overview\r\nThis PR fixes two issues in the share modal v2:\r\n1. **Permission Default Fix**: When switching from RESTRICTED access level to another access level, the permission selector now defaults to \"Can edit\" instead of \"Can view\"\r\n2. **Overflow Fix**: Long workspace/company names are now truncated and all dropdown elements stay within modal boundaries\r\n\r\n## Changes\r\n\r\n### Phase 1: Permission Default Fix\r\n- **File**: `src/views/mural/modals/share/share-mural/index.tsx`\r\n- Modified `handlePrivatePermissions` to detect when switching FROM RESTRICTED to a non-restricted access level\r\n- When this transition occurs in v2 modal, defaults to `PERMISSION_LEVEL.EDIT` instead of `PERMISSION_LEVEL.VIEW`\r\n- **V2-only**: Fix is conditional on `muralShareModalV2` flag to ensure v1 modal behavior is unchanged\r\n\r\n### Phase 2: Overflow Prevention\r\n- **File**: `src/views/mural/modals/share/share-mural/link-invite-widget/AccessInfo.tsx`\r\n - Added truncation for workspace and company names in dropdown labels (30 character limit)\r\n - Uses `truncate` utility from `@muralco/parking-lot`\r\n \r\n- **File**: `src/views/mural/modals/share/share-mural/link-invite-widget/styles.module.sass`\r\n - Added overflow constraints to prevent elements from overflowing modal boundaries\r\n - Ensured permission selector stays within bounds even with long names\r\n\r\n- **File**: `src/views/mural/modals/share/share-mural/components/DropdownSelect/styles.ts`\r\n - Added text truncation styles to `valueContainer` and `singleValue` for proper ellipsis handling\r\n - Ensured dropdown indicators (arrows) remain visible\r\n\r\n## Testing\r\n- \u2705 All existing tests pass (46/46)\r\n- \u2705 Added 5 new tests for permission default behavior\r\n- \u2705 Added 2 new tests for truncation functionality\r\n- \u2705 Type checking passes\r\n- \u2705 Linting passes\r\n\r\n## Manual Testin", + "labels": [] + }, + { + "number": 46182, + "title": "[CWI-2386] Adding Jira and AzureDevops to the import panel", + "branch": "add/cwi-2386", + "merged_at": "2025-11-21T19:13:56Z", + "changed_files": 6, + "additions": 59, + "deletions": 10, + "body": "Add Jira and ADO to the import panel.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2386) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds Jira and Azure DevOps as import content sources and updates context-menu gating to use new enablement checks and open import modals when available.\n> \n> - **Integrations**:\n> - **Azure DevOps**:\n> - Register `contentSource` (`azure-devops-content-source`) with `logoAzure` and click handler to open the import modal.\n> - Update cont", + "labels": [] + }, + { + "number": 46191, + "title": "[ESC-1806] archived murals: Enable clicking mural titles to open murals", + "branch": "add/esc-1806-archived-mural-link", + "merged_at": "2025-11-21T18:48:55Z", + "changed_files": 6, + "additions": 48, + "deletions": 13, + "body": "Jira: [ESC-1806](https://mural.atlassian.net/browse/ESC-1806)\r\nTesting environment: https://esc-1806-archived-mural-link.mural.engineering/\r\n\r\n### Summary\r\n\r\nOn the Archived murals page, enable clicking mural titles to open murals.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/064fbb6a-044f-456a-a116-3e4c058283b6\r\n\r\n\r\n[ESC-1806]: https://mural.atlassian.net/browse/ESC-1806?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\n\n\n---\n\n> [!NOTE]\n> Makes mural titles in the Archived murals table clickable links by adding `url` to mural data and rendering with `MrlLink`, plus wiring URL generation and updating tests.\n> \n> - **UI/Behavior**:\n> - Convert name column to clickable `MrlLink` using `mural.url` in `components/table-columns.tsx`.\n> - **Data Model**:\n> - Add `url` to `ArchivedMuralData` in `src/types.ts`.\n> - Generate `url` via `getLinkUrl({ id, ownerId: workspace.id })` in `transformApiResponseToUiData`.\n> - **Dependencies**:\n> - Add `@muralco/mural-utils` for link generation.\n> - **Tests**:\n> - Update tests to assert link `href`s and new `url` field.\n> - Switch to `jest.spyOn` for hooks and include `error`, `limit`, `skip` in mocked pagination/returns.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8c7c7c4c08d8a99b7779473f14ef289c99f36c90. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46180, + "title": "[PLAY-740] - Add salesforce import limit", + "branch": "add/salesforce-import-limit", + "merged_at": "2025-11-21T18:14:07Z", + "changed_files": 5, + "additions": 167, + "deletions": 21, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds a 50 item import limit for only the Salesforce integration on the integrations platform. This is controlled by a new configuration setting, `importLimit`.\r\nIf a user selects more than 50 records, the import button will be disabled with tooltip indicating why they can't import records.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**PLAY-740**](https://mural.atlassian.net/browse/PLAY-740) to understand the context of this effort.\r\nhttps://www.loom.com/share/bd3725eda9fa4c7498c86043f6f8c853\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Introduces a co", + "labels": [] + }, + { + "number": 46196, + "title": "[NEXT-264] Migrate CheckEmailCodeRouteWrapper to package", + "branch": "migrate/next-264-check-email-code", + "merged_at": "2025-11-21T18:00:04Z", + "changed_files": 18, + "additions": 278, + "deletions": 7, + "body": "## Summary of Changes\n\nThis PR migrates the `CheckEmailCodeRouteWrapper` component and its dependencies from `src/registration/routes/` into a new standalone `@muralco/route-check-email-code` package, following the established pattern of other route packages.\n\n### Changes Made\n\n- **Created new package**: `packages/route-check-email-code/` using the `react` template\n- **Moved components**:\n - `CheckEmailCodeRouteWrapper` (wrapper component)\n - `CheckEmailCodeVerification` (main verification component, kept internal to package)\n- **Moved supporting files**:\n - `styles.module.sass` (component styles)\n - `CheckEmailCodeVerification.test.tsx` (all 12 tests passing)\n- **Updated imports**: Changed `src/registration/routes/index.tsx` to import from `@muralco/route-check-email-code`\n- **Added dependencies**: All required `@muralco/*` packages and external dependencies including `react-verification-input`\n- **Removed old files**: Cleaned up original files from `src/registration/routes/`\n\n## Notable Discoveries\n\n### Research Findings\n- **No prerequisites needed**: All dependencies were already packaged, allowing immediate migration\n- **`getRegistrationEmail` already exported**: The helper function needed by the wrapper is already available from `@muralco/route-signin`\n- **Component coupling**: `CheckEmailCodeVerification` must be in the same package as the wrapper since it's imported via relative path\n\n### Implementation Notes\n- **ESLint configuration**: Added `.eslintrc.js` to disable webpack resolver (matches pattern from other route packages)\n- **TypeScript global declaration**: Added `app` global type declaration for `app.me.set()` usage (pattern from `route-about-you`)\n- **Test file fix**: Fixed apostrophe character encoding issue in test file (curly apostrophe \u2192 straight apostrophe)\n- **Package structure**: Follows the same pattern as `route-check-email`, `route-about-you`, and `route-create-password`\n\n## Manual Verification Steps\n\n\ud83e\uddea **Test Environment**: https://nex", + "labels": [] + }, + { + "number": 46187, + "title": "[SCQM-1476] Add fixed orchestrator AISummarizeVariant", + "branch": "update/scqm-1476-code-orchestrator", + "merged_at": "2025-11-21T16:26:29Z", + "changed_files": 2, + "additions": 2, + "deletions": 0, + "body": "Env: https://scqm-1476-code-orchestrator.mural.engineering\r\nCard: [SCQM-1476](https://mural.atlassian.net/browse/SCQM-1476)\r\nmural-api PR: tactivos/mural-api#14928\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the sub-menu entry for calling the fixed orchestration summarize variant implemented in tactivos/mural-api#14928.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1476) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1476-code-orchestrator.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14928)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Ca", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46202, + "title": "IAM-243 Modularized MFA not enabled route", + "branch": "add/iam-243", + "merged_at": "2025-11-21T15:44:24Z", + "changed_files": 6, + "additions": 23, + "deletions": 20, + "body": "### Summary of Changes and Resources for the Reviewer\r\nModularized MFA not enabled route\r\nhttps://mural.atlassian.net/browse/NEXT-243\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Modularizes the MFA not-enabled flow by adding a reusable route in IAM, updating component exports/names, and switching consumers/tests to the new route and imports.\n> \n> - **Identity & Access Management (IAM)**:\n> - **Routing**: Adds `MfaNotEnabledRoute` in `packages/identity-and-access-management/src/mfa/routes.tsx` and consumes it in `src/error/index.tsx` (replacing the inline `/mfa-not-enabled` route).\n> - **Components/Exports**: Exposes `MfaNotEnabled` via `error/mfa` barrel; renames `MfaNotEnabled` message component to `MfaNotEnabledMessage`; updates `mfa-not-enabled.tsx` to import local `MfaNotEnabledMessage` and `Mfa", + "labels": [] + }, + { + "number": 46184, + "title": "[CAN-8086] Issue with exiting presentation mode", + "branch": "fix/can-8086", + "merged_at": "2025-11-21T14:22:37Z", + "changed_files": 4, + "additions": 31, + "deletions": 8, + "body": "Fix issue that the default topbar wasn't showing when presentationMode was exited with ESC.\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8086)\r\n[Test Env](https://can-8086.mural.engineering)\n\n\n---\n\n> [!NOTE]\n> Switch topbar visibility to an app-mode-based presentation selector, hiding it (and skipping DOM panel activation) in presentation mode and adding tests for behavior and ESC exit.\n> \n> - **UI**:\n> - `MuralTopBar` now uses `selectIsInPresentationMode` to hide the topbar and skip `activePanels.activate` while in presentation mode.\n> - **State/Selectors**:\n> - Add `selectIsInPresentationMode` deriving from `app.mode` via `isInPresentationMode` in `mural/sdk/apis/facilitation/presentation-mode/selectors`.\n> - **Tests**:\n> - Add feature spec `src/test/react-new/features/canvas/topbar/presentation-mode.feature` validating topbar hidden in `show` mode and visible after ESC.\n> - Update unit test to assert no DOM panel activation when mode is `show`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d737ef1a577893afe454076808e52b93e40a874a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46201, + "title": "[CAN-8166] Remove `getGlobalMuralCoords` function", + "branch": "fix/global-coords", + "merged_at": "2025-11-21T14:00:30Z", + "changed_files": 13, + "additions": 21, + "deletions": 92, + "body": "**[CAN-8166 Remove getGlobalMuralCoords function](https://mural.atlassian.net/browse/CAN-8166)**\r\n\r\nThis PR removes `getGlobalMuralCoords` function. The function does the same what `sdk.widgets.getPosition` do. Extra recursive parentId check is never used in practice. \r\n\r\nThe environment: https://global-coords.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Replaces all usages of `getGlobalMuralCoords` with `widgets.getPosition` and deletes the deprecated helper.\n> \n> - **Core Helpers**:\n> - Remove `getGlobalMuralCoords` from `src/mural/helpers/widgets.ts`.\n> - **SDK/APIs**:\n> - Replace `getGlobalMuralCoords` with `widgets.getPosition` in dragging (`sdk/apis/dragging/index.ts`) and widgets API (`sdk/apis/widgets/index.ts`).\n> - **Mindmaps Addon**:\n> - Use `ctx.widgets.getPosition` for node rects in `addons/mindmaps/connector-transform.ts`.\n> - Swap to `store.getPosition` in multiple calculations (branch bounds, next child position) in `addons/mindmaps/utils.ts`.\n> - **Business Logic**:\n> - Drag/drop flows (`business/drag-widgets-over-cluster.ts`, `business/drop-widgets-on-canvas.ts`) now read positions via `sdk.widgets.getPosition`.\n> - Table resize (`business/tables/resize-row-or-column.ts`) gets table coords via `sdk.widgets.getPosition`.\n> - **Tests**:\n> - Update all references to use `sdk.widgets.getPosition` in step definitions and test utils.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7db63e7bd3f58c5cba429c643f4eedf00405716f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46183, + "title": "NEXT-244 Modularized Enable MFA Route", + "branch": "add/next-244-enable-mfa-route", + "merged_at": "2025-11-21T02:20:35Z", + "changed_files": 3, + "additions": 29, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoved Enable MFA route to IAM package:\r\nhttps://mural.atlassian.net/browse/NEXT-244\r\n\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Moves the `/enable-mfa` route into the IAM package as `EnableMfaRoutes` and replaces the inline route usage in error routes.\n> \n> - **Routing (IAM)**:\n> - Add `packages/identity-and-access-management/src/mfa/routes.tsx` exposing `EnableMfaRoutes()` with `/enable-mfa` rendering `EnableMfa`.\n> - Re-export from `packages/identity-and-access-management/src/routes.tsx` to surface MFA routes.\n> - **Routing (App)**:\n> - In `src/error/index.tsx`, replace inline `/enable-mfa` `Route` with `...EnableMfaRoute", + "labels": [] + }, + { + "number": 46165, + "title": "[CAN-8150] Hide WidgetTypLabel ", + "branch": "add/can-8150", + "merged_at": "2025-11-20T19:06:46Z", + "changed_files": 3, + "additions": 41, + "deletions": 36, + "body": "Set widget type label tool to visible false if there are no other tools in the fixed widget toolbar\r\n\r\nBefore:\r\n\"image\"\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8150)\r\n[Test Env](https://can-8150.mural.engineering/)\r\n\n\n---\n\n> [!NOTE]\n> Show the widget toolbar only when it contains enabled tools/inputs and make text-format tools visible only for selections that support text formatting.\n> \n> - **Fixed Widget Toolbar \u2013 Text Formatting (`src/mural/addons/core/fixed-widget-toolbar/format/`)**\n> - Extracts `supportsTextFormatting` and uses it in `getToolContext` and `text-format-menu` to gate `visible`.\n> - Visibility now requires a selection that is unlocked and supports text formatting (e.g., not shapes without text or unsupported widgets).\n> - Tests updated: reorganized visible/not-visible cases; add cases asserting invisibility for shapes without text and selections including unsupported widgets.\n> - **Styles (`src/views/mural.v2/toolbars/styles.module.sass`)**\n> - `.widgetToolbarSection` now `display: none` by default; displays only when it `:has(button:not([aria-disabled=\"true\"]))` or `:has(input)`.\n> - Removes `&:empty` visibility rule to rely on enabled-content presence.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 821c697aa64b4d97ee46f81f523d9dac6a0c1fd7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46164, + "title": "[CAN-8149] Move Share button position", + "branch": "add/can-7045", + "merged_at": "2025-11-20T18:51:20Z", + "changed_files": 4, + "additions": 7, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves share button position\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8149)\r\n[Test Env](https://can-7045.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/p", + "labels": [] + }, + { + "number": 46185, + "title": "[CAN-8156] Add navigationImprovements flagged addon", + "branch": "add/can-8156", + "merged_at": "2025-11-20T18:38:47Z", + "changed_files": 10, + "additions": 153, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWe are adding a new addon, if the 'feat-mu-navigation_improvements' feature flag is enabled, we register 2 new sidebar buttons, remove the bottom bar 'move mode' button, replace the 'navigation settings' button with a more straightforward user control. Left click + drag always pans the mural regardless of the user input device (mouse/trackpad).\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8156) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8156.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- Visitors enabled mural for your convenience: https://can-8156.mural.engineering/t/test3415/m/test3415/1763659588409/74fb6af465fa70eabe4f3b6b30bb8366146f5572\r\n- Use the flags manager to enable the feature flag since it's turned off in DEV to avoid disrupting the dev envs experience.\r\n- Feature flag: https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-mu-navigation_improvements/rules/development\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for gui", + "labels": [] + }, + { + "number": 46170, + "title": "[NEXT-262] Migrate common HOC's to @muralco/legacy-ui", + "branch": "common-legacy-ui", + "merged_at": "2025-11-20T17:47:10Z", + "changed_files": 99, + "additions": 146, + "deletions": 149, + "body": "Migrates common legacy HOC's from `src/common` to `@muralco/legacy-ui`. \n\n\n---\n\n> [!NOTE]\n> Moves legacy HOCs (`pure`, `with-form-rules`, `with-state`) into `@muralco/legacy-ui` and refactors app-wide imports/usages, adding tests and minor type/name adjustments.\n> \n> - **Legacy UI package**:\n> - Export and implement `legacy-hoc` utilities: `pure`, `with-form-rules` (with `FormRule`, `FormRulesInjectedProps`), and `with-state`.\n> - Convert `pure` to a named export; add comprehensive tests.\n> - **App-wide refactor**:\n> - Replace local HOC imports (`common/pure`, `common/with-form-rules`, `common/with-state`) with `@muralco/legacy-ui` across many components.\n> - Update types and names: `Rule` \u2192 `FormRule`, `InjectedProps` \u2192 `FormRulesInjectedProps`; update HOC usage signatures accordingly.\n> - Use `withState` from `@muralco/legacy-ui` in menus and accessible menu components.\n> - **Tests/Deps**:\n> - Add `@testing-library/user-event` dev dependency.\n> - Update tests to mock `pure` from `@muralco/legacy-ui` and use `screen` queries.\n> - **Minor**:\n> - Ensure `` includes `alt` before other props in photo widget; widespread import cleanups without behavior changes.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7b533d029923b3919f6a96714372fea16e22ea33. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46177, + "title": "[NEXT-211] Migrate withJiraLegacy to @muralco/integrations", + "branch": "migrate-with-jira-legacy", + "merged_at": "2025-11-20T17:11:42Z", + "changed_files": 4, + "additions": 11, + "deletions": 8, + "body": "Migrate `withJiraLegacy` to `@muralco/integrations`\n\n\n---\n\n> [!NOTE]\n> Moves `withJiraLegacy` HOC into `@muralco/integrations`, exports it (and `Jira`), and updates the Jira workspace UI to consume it.\n> \n> - **Integrations package**:\n> - **HOC added/moved**: Add `hoc/with-jira-legacy.tsx` and export `withJiraLegacy` and `Jira` via `hoc/index.ts` and root `index.ts`.\n> - **Internal imports**: Switch to package-local `../constants` and `../tracking`.\n> - **Settings UI**:\n> - Update `workspace-with-url.tsx` to import `withJiraLegacy`, `Jira`, and `jiraLegacyTracking` from `@muralco/integrations` and use `withJiraLegacy(...)`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 225e39e715f95d7e0d9983372d189e4bc9af5d6a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46176, + "title": "[IPA-306] insights: ExternalDomainActivityMetric has 'domain' not 'externalDomain'", + "branch": "add/ipa-306", + "merged_at": "2025-11-20T16:11:05Z", + "changed_files": 9, + "additions": 46, + "deletions": 50, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nfixing 'externalDomain' to 'domain' to fix the domain column in insights\r\nAPI PR => https://github.com/tactivos/mural-api/pull/14922\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14922)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher", + "labels": [] + }, + { + "number": 46179, + "title": "NEXT-121 - Package /terms-and-conditions route", + "branch": "add/next-121", + "merged_at": "2025-11-20T15:51:46Z", + "changed_files": 26, + "additions": 487, + "deletions": 84, + "body": "Test env - https://next-121.mural.engineering\r\n---\r\n\r\n\n\n> [!NOTE]\n> Introduces `@muralco/route-terms-and-conditions` and replaces in-app T&C routes with the new package, adding tests and cleanup.\n> \n> - **New package**: `packages/route-terms-and-conditions`\n> - Exposes `TermsAndConditionsRoutes`, `TermsAndConditions`, and `ExternalTermsAndConditions`.\n> - Adds helpers (`sanitizeUrl`), styles, build/test configs, and placeholder tests.\n> - Implements tracking on view/accept and workspace-aware flows; uses `@muralco/tracking-lib.record`.\n> - **App integration**:\n> - Updates `src/route-config.tsx` to use `@muralco/route-terms-and-conditions` routes.\n> - Removes legacy T&C test and `src/tracking/guests.ts` helper.\n> - **Repo config**:\n> - Adds dependency entries in root `package.json` and `package-lock.json`.\n> - Updates `CODEOWNERS` to assign `packages/route-terms-and-conditions` to `@tactivos/engagement-team`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f53bbbdba2ebe9b79e0dc54c3d63efb41f9210fd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46173, + "title": "[CAN-8014] Delete navigationControlsABTest related code", + "branch": "add/can-8014", + "merged_at": "2025-11-20T15:03:31Z", + "changed_files": 14, + "additions": 2, + "deletions": 454, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes the navigationControlsABTest related code since the experiment has concluded. \r\n**Original task:** https://mural.atlassian.net/browse/CAN-7957 and **PR**: https://github.com/tactivos/murally/pull/45813\r\n**Clean up task:** https://mural.atlassian.net/browse/CAN-8014\r\n\r\n**Test env:** https://can-8014.mural.engineering\r\n\r\n\n\n---\n\n> [!NOTE]\n> Removes all navigationControlsABTest experiment code, UI, and Optimizely config/types; cleans registrations and simplifies tool enablement logic.\n> \n> - **Addons/UI**:\n> - Delete `src/mural/addons/navigation-controls-ab-test/**` (addon, modal, hooks, utils).\n> - Remove addon registration from `src/mural/addons/index.ts` and `src/mural/routes/register-addons.tsx`.\n> - Update `templates` addon to stop invoking the experiment on modal close.\n> - **Business Logic**:\n> - Simplify `canEnableMuralTools` in `src/mural/business/mural.ts` by removing experiment variant checks.\n> - **Experiments/Optimizely**:\n> - Remove `EXPERIMENTS` config and related `types` from `packages/optimizely`.\n> - Delete `selectExperimentVariation` selector.\n> - Keep `TRACKING_EVENTS` and `FEATURES` intact.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 2765f1a472953b88471ed9e844fb280e140c4efe. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46114, + "title": "[SCQM-1450] Add summarize agent variants support and UI", + "branch": "add/scqm-1450-summarize-versions", + "merged_at": "2025-11-20T01:44:48Z", + "changed_files": 6, + "additions": 69, + "deletions": 50, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds support to the `summarize-orchestrator` variant implementation for exploration, triggerable through new submenus.\r\nThis also removes the unused Agent summarize response props (`summary` and `keyPoints`) that are being removed from the backend to make it easier for the model.\r\nThe main work is done in the [mural-api PR](https://github.com/tactivos/mural-api/pull/14879)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1450) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1450-summarize-versions.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] Cucumber tests were updated \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14879)\n\n\n---\n\n> [!NOTE]\n> Adds `summarize` and `summarize-orchestrator` agent variants, updates types/responses, and exposes variant selection via toolbar submenus behind a feature flag.\n> \n> - **Types/Realtime**:\n> - Introduces `AISummarizeVariant` (`'summarize' | 'summarize-orchestrator'`) and uses it for `AIActionAgentName`, `AISummarizeMessage.type`, and `AISummarizeResponse.type`.\n> - Simplifies summarize response payload by removing `keyPoints` and `summary`, keeping `combinedSummary`.\n> - **UI/Actions**:\n> - `executeAISummarizeAction(sdk, variant)` now requires a variant and passes it through to the dispatcher and refinement flows.\n> - Action Bar defaults to `summarize` variant.\n> - Toolbar adds submenus for variants (`ai-summarize-summarize-tool`, `ai-summarize-summarize-orchestrator-tool`) when `ai-action-summarize-enabled` is on; main button becomes a parent.\n> - **Tests**:\n> - Cucumber specs ", + "labels": [] + }, + { + "number": 46136, + "title": "Add profile widget examples for Salesforce Contact and Lead", + "branch": "feature/add-profile-widget-examples-salesforce", + "merged_at": "2025-11-20T00:20:17Z", + "changed_files": 4, + "additions": 75, + "deletions": 5, + "body": "This PR adds example profile widgets for Salesforce contact and lead records in the System of Record (SOR) app catalog page. It introduces a reusable factory function for creating Salesforce profile widget examples and updates the app catalog page to support custom example widgets.\r\n\r\nhttps://mural.atlassian.net/browse/PLAY-670\r\n\r\nloom.com/share/3db90ca0f33e4988b0f1c466606c0b9d?from_recorder=1&focus_title=1\r\n\r\n\"image\"\r\n\r\n\n\n---\n\n> [!NOTE]\n> Adds Salesforce Contact/Lead example profile widgets and updates the app catalog to support per-record custom example widgets.\n> \n> - **App Catalog Page (`src/mural/addons/system-of-record/common/app-catalog-page.tsx`)**:\n> - Prefer per-record `exampleWidget` from `SOR_RECORD_PASTE_INFO` when available; otherwise fallback to `buildSorExampleWidget` using `sorName` and `resourceName`.\n> - Switched references from `SOR_RECORD_INFO` to `SOR_RECORD_PASTE_INFO`.\n> - **SOR Integrations (`src/mural/business/system-of-record/integrations/index.ts`)**:\n> - Added Salesforce Contact/Lead `exampleWidget` definitions under `SOR_RECORD_PASTE_INFO` and set `hideWorkatoCallout: true` for both.\n> - Imported and used new Salesforce example widget factory.\n> - **Salesforce**:\n> - Added reusable `createSalesforceExampleWidget` factory (`salesforce/common/example-widget.ts`) to build profile widget examples.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 01112e7314effb8b9528b26862a61fb3999dc028. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46133, + "title": "[NEXT-197] Package company template collections", + "branch": "refactor/package-ct-collections", + "merged_at": "2025-11-19T23:12:24Z", + "changed_files": 32, + "additions": 285, + "deletions": 36, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Creates company-template-collections package\r\n- Moves src/company/internal-tools/template-collections code to package\r\n- Updates references\r\n- Reorganizes CODEOWNERS so that unowned packages are defined first so that teams can own subdirectories later (e.g. packages/api/src/templates.ts)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-197) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://package-ct-collections.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nFor templates & learning reviewer:\r\n- Create a user using your mural.co address\r\n- Join workspaces\r\n- Give yourself globalAdmin edit permissions\r\n- Add your username to the `admins` array for the company with the id `internal-sso`\r\n- Log out of application\r\n- Log back into application\r\n- Navigate to https://package-ct-collections.mural.engineering/c/internal-sso/internal/tools/template/collections\r\n- Ensure that the company template route looks/behaves as normal\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Extracts company template collections into a new `@muralco/company-template-collections` package and updates imports, dependencies, and CODEOWNERS accordingly.\n> \n> - **New package**: `packages/company-template-collections`\n> - Exposes `TemplateCollections` and related UI (modals, hooks, components, styles).\n> - Adds build/test/config files (`webpack`, `jest`, `tsconfig`, `api-extractor`).\n> - **Code moves**: Migrates company template collections UI from `src/company/internal-tools/template-collections/*` into the new package; updates relative imports within moved files.\n> - **Integrations**:\n> - Updat", + "labels": [] + }, + { + "number": 46137, + "title": "Next-242 Modularized AuthError and retry routes", + "branch": "add/next-242-auth-route", + "merged_at": "2025-11-19T22:00:00Z", + "changed_files": 10, + "additions": 39, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\nModularized Auth Error component and its route.\r\nhttps://mural.atlassian.net/browse/NEXT-244\r\n\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\r\n\n\n---\n\n> [!NOTE]\n> Extracts AuthError and Retry into IAM package with `AuthErrorRoutes`, integrates them into app routes, and adds supporting styles/tests.\n> \n> - **Identity & Access Management (IAM)**:\n> - Adds `auth-error` module with `AuthError`, `AuthErrorRetry`, `AuthErrorRoutes`, and `styles.module.sass` under `packages/identity-and-access-management/src/auth-error/`.\n> - Re-exports from `packages/identity-and-access-management/src/index.ts` and wires routes via `packages/identity-and-access-management", + "labels": [] + }, + { + "number": 46128, + "title": "[SCQM-1466] Advise AI to always quote mermaid node contents, with escapes for double quotes", + "branch": "update/mermaid-quotes", + "merged_at": "2025-11-19T21:49:21Z", + "changed_files": 1, + "additions": 2, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIn the continuing saga of this ticket, the AI is now directed to always add double quotes to items that will be display text inside nodes.\r\n\r\nFor `murally`, this means that org chart parsing has to be able to filter the double quotes that will now be present.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1466) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://mermaid-quotes.mural.engineering/) to perform a smoke test.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14884)\r\n\n\n---\n\n> [!NOTE]\n> Sanitizes extracted `widgetId` by removing double quotes when creating profile widgets from `isLinkedInWidget` nodes.\n> \n> - **Mermaid addon (`src/mural/addons/mermaid/place-widget.ts`)**\n> - **Profile widget parsing**: When detecting `isLinkedInWidget`, the extracted `widgetId` from the span text now strips double quotes via `.replace(/\"/g, \"\")` before use.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3c83e01b798d2716f0cadc2f1049f5f7ee2eb854. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46167, + "title": "[ENGAGE-1420] Update permission for rename mural action to admin", + "branch": "add/rename-mural-admin", + "merged_at": "2025-11-19T21:32:44Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "## Pull Request Overview\r\n\r\nThis PR updates the permission requirement for renaming murals from 'edit' to 'admin', effectively restricting the rename functionality to users with administrator privileges on the mural.\r\n\r\n**Key Changes:**\r\n- Updated permission check in `ConnectedMuralTitle` from 'edit' to 'admin'\r\n- Updated permission check in `renameActionRegistration` from 'edit' to 'admin'\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated no comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/ui/title/index.tsx | Updates the permission check in the mural title component to require 'admin' permission instead of 'edit' for title editing |\r\n| src/apps/web/dashboard/mural-actions/renameActionRegistration.tsx | Updates the permission check in the dashboard rename action to require 'admin' permission instead of 'edit' |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1420) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://rename-mural-admin.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spa", + "labels": [] + }, + { + "number": 46171, + "title": "ENGAGE-1427 Update the invite people button to show the new share mural modal", + "branch": "add/new-share-modal-invite-button", + "merged_at": "2025-11-19T21:01:34Z", + "changed_files": 2, + "additions": 4, + "deletions": 0, + "body": "Ticket: https://mural.atlassian.net/browse/ENGAGE-1427\r\nTest Env: https://new-share-modal-invite-button.mural.engineering/\r\n\r\n## Pull Request Overview\r\n\r\nThis PR adds the `muralShareModalV2` feature flag prop to enable conditional rendering of the new share modal invite button. The feature flag is properly threaded from the user settings through the component hierarchy to control UI behavior in the share modal.\r\n\r\n### Key Changes\r\n- Added `muralShareModalV2` optional boolean prop to the share-mural route component interface and prop threading\r\n- Passed the feature flag from user flags (`user.flags?.muralShareModalV2`) to the ShareMural component in mural-settings\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated no comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/mural/routes/share-mural/index.tsx | Added `muralShareModalV2` prop to PropTypes interface, destructured it from props, and passed it to ShareMuralModalIndex component |\r\n| src/mural/routes/mural-settings/mural-settings.tsx | Retrieved the feature flag from user.flags and passed it as a prop to the ShareMural component |\r\n\n\n---\n\n> [!NOTE]\n> Threads the `muralShareModalV2` flag from `user.flags` into the share modal, updating props and passing it down to `ShareMuralModalIndex`.\n> \n> - **Share Modal Flag Wiring**\n> - In `src/mural/routes/mural-settings/mural-settings.tsx`:\n> - Pass `user.flags?.muralShareModalV2` to `ShareMural` as `muralShareModalV2`.\n> - In `src/mural/routes/share-mural/index.tsx`:\n> - Add optional `muralShareModalV2` to `PropTypes` and destructuring.\n> - Forward `muralShareModalV2` to `ShareMuralModalIndex`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit acc6ffdf911fcbaf7e0d036cd62119d09b227f1e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46166, + "title": "[CAN-8152] Update UI-toolkit", + "branch": "add/can-8152", + "merged_at": "2025-11-19T20:02:07Z", + "changed_files": 4, + "additions": 17, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add space betwwen the fixed topbar and the sidebar panel\r\n- Update UI-toolkit version\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8152)\r\n[Test Env](https://can-8152.mural.engineering/)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and t", + "labels": [] + }, + { + "number": 46168, + "title": "Dashboard Room: Remove commented out code", + "branch": "remove/roomhero-commented-code", + "merged_at": "2025-11-19T19:27:52Z", + "changed_files": 1, + "additions": 7, + "deletions": 10, + "body": "\n> [!NOTE]\n> Removes commented code and simplifies conditional rendering of `SortControlPopup` in `src/dashboard/rooms/hero.tsx`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 106d1529d5f80ca3c78619dc851f1a59b73104d4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46155, + "title": "NEXT-259 - Modernize external-terms-and-conditions component", + "branch": "add/next-259", + "merged_at": "2025-11-19T19:17:29Z", + "changed_files": 5, + "additions": 130, + "deletions": 108, + "body": "Test env - https://next-259.mural.engineering\r\n---\r\n\r\n## Pull Request Overview\r\n\r\nThis PR modernizes the external terms and conditions component by migrating from legacy UI components to the modern UI Toolkit (@muraldevkit/ui-toolkit). The migration consolidates the previous standalone `ui/terms` component into the `terms-and-conditions` module.\r\n\r\n### Key Changes\r\n- Migrated from `LegacyButton` and legacy `Checkbox` to `MrlButton` and `MrlCheckbox` components\r\n- Converted class component to functional component with React hooks\r\n- Consolidated styling from separate `ui/terms/style.sass` into `terms-and-conditions/styles.module.sass`\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 5 out of 5 changed files in this pull request and generated 7 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/ui/terms/style.sass` | Removed legacy component styles |\r\n| `src/ui/terms/index.tsx` | Removed legacy Terms class component |\r\n| `src/terms-and-conditions/styles.module.sass` | Added consolidated styles with loading container and watermark styles |\r\n| `src/terms-and-conditions/components/external-terms-and-conditions/view.tsx` | Migrated to UI Toolkit components, converted to functional component with hooks, added watermark support |\r\n| `src/terms-and-conditions/components/external-terms-and-conditions/controller.tsx` | Updated import to use named export |\r\n
\r\n\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Migrates external terms-and-conditions to a functional UI Toolkit-based view with loading/watermark support, removes legacy `ui/terms`, and updates styles/imports.\n> \n> - **Terms & Conditions UI**:\n> - **Migration to UI Toolkit**: Replace legacy `LegacyButton`/`Checkbox` with `MrlButton`, `MrlCheckbox`, and add `MrlSpinner` in `components/.../view.tsx`.\n> - **Functional Component + Hooks**: Convert view to functional component with `agreed` state and guarded submit; render cancel via `MrlButt", + "labels": [] + }, + { + "number": 46094, + "title": "[CWI-2272] Remove Request Button for App Request and Add Admin to route to integrations page.", + "branch": "add/cwi-2272", + "merged_at": "2025-11-19T19:03:47Z", + "changed_files": 6, + "additions": 152, + "deletions": 21, + "body": "Removes request button for App Request if enableAppRequest is false and also routes the Admin to the integrations page.\r\n\r\n#### Reviewer Resources\r\nPlease review the\r\n \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2272) and \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2370) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14872)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Gates the \u201cRequest Access\u201d button by `enableAppRequest` from the API and, for company admins, shows an \u201cEnable\u201d button that routes to the integratio", + "labels": [] + }, + { + "number": 46157, + "title": "[CAN-8130] Deleting a nested area with children inside", + "branch": "add/can-8130", + "merged_at": "2025-11-19T18:46:07Z", + "changed_files": 2, + "additions": 36, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n Prior to these changes when deleting a child-area with the option \"Area only\" the child widgets remain without having a new parent\r\n Now, with these changes, the widgets are reabsorbed by the parent-area\r\n \r\n The change should only applies with: \r\n - Enable the ENABLE_NESTED_AREAS flag\r\n - And ENABLE_ABSORPTION_SYSTEMS flag is disabled\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8130) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8130.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\n\n---\n\n> [!NOTE]\n> On deleting a nested area with \"Area only\", non-arrow children are detached and re-absorbed into the parent area; adds an acceptance test covering this under the nested-areas flag.\n> \n> - **Business logic (`src/mural/business/delete-widgets/index.ts`)**\n> - On deleting a parent area with \"Area only\":\n> - Detaches non-arrow children and collects their IDs (`nonArrowChildrenIds`).\n> - After deletion apply, re-absorbs collected children into overlapping parent areas via `dropWidgetsOnCanvas` before commit.\n> - Imports `dropWidgetsOnCanvas` and integrates re-absorption flow within `properDeleteWidgets`.\n> - **Tests**\n> - Adds feature test `src/test/react-new/features/canvas/widgets/nested-areas/area-deletion.feature` verifying children of a deleted nested area are reassigned to the parent when the nested-areas flag is enabled (and absorption systems disabled).\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f63f5a9b6c466136c90f6810cd9417a86564dc57. This wil", + "labels": [] + }, + { + "number": 46162, + "title": "[NEXT-261] Remove pre-hana Room title and description components", + "branch": "remove/old-prehana-room-compnents", + "merged_at": "2025-11-19T18:31:00Z", + "changed_files": 9, + "additions": 1, + "deletions": 497, + "body": "### Remove pre-hana components from SeeAll rooms grid.\r\nGrid (removed props) -> Hero (stop rendering RoomPurpose) -> RoomPurpose (deleted) -> legacy-ui/EditableTitle (deleted)\r\n\r\n### Remove extraneous title section from the JoinRoom page\r\nJoinRoom (remove TopbarWithTitle) -> TopbarWIthTitle (deleted) -> Topbar (removed)\r\n\r\nBefore\r\n\"image\"\r\nAfter\r\n\"image\"\r\n\r\n\r\nTest-env\r\nhttps://old-prehana-room-compnents.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Removes deprecated pre-hana room title/description and topbar components, updating grid/hero and the JoinRoom panel to no longer reference them.\n> \n> - **Legacy UI**:\n> - Delete `packages/legacy-ui/src/ui/components/input/editable.tsx` (`EditableTitle`) and stop exporting it from `input/index.ts`.\n> - **Rooms Dashboard**:\n> - Remove `src/dashboard/rooms/purpose.tsx` (`RoomPurpose`) and its rendering from `rooms/hero.tsx`.\n> - Drop related props/conditionals in `rooms/hero.tsx` and stop passing them from `grid/grid.tsx`.\n> - **Topbar**:\n> - Delete `src/dashboard/topbar/topbar.tsx`, `topbar-with-title.tsx`, and `style.sass`.\n> - Remove `TopbarWithTitle` usage from `JoinRoom` page.\n> - **Join Room Panel**:\n> - Simplify layout; keep page `` title and welcome/description content without the extra topbar.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 529806b5d5235e2f5e3d8e52836260227cba397e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46087, + "title": "[SCQM-1454] Allow visitors only update access to smart planners", + "branch": "fix/allow-visitor-planner-update", + "merged_at": "2025-11-19T18:19:58Z", + "changed_files": 13, + "additions": 247, + "deletions": 28, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPreviously, we had a bug where visitors in a mural with a smart planner could not interact with the planner. We want anyone to be able to engage with an existing board, but only those with the `use.smartBoards` permission to create them. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1454) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://allow-visitor-planner-update.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. As a facilitator, create a smart planner in a mural that allows visitors to edit (the `test test test` workspace is already configured for this)\r\n a. Verify you **can** drag stickies around the smart planner\r\n b. Verify you **can** duplicate and copy / paste a smart planner\r\n2. Enter the mural as a visitor in an incognito window\r\n a. Verify you **can** drag stickies around the smart planner\r\n b. Verify you **cannot** duplicate or copy / paste a smart planner\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Gates enhanced kanban board creation/duplication/paste behind `use.smartBoards` while always initializing the composition manager; updates utils/signatures and adds tests.\n> \n> - **Core (widget composition)**:\n> - Always initialize `WidgetCompositionManager`; remove permission gating of the singleton.\n> - Gate `create('enhanced-kanban-board')` by `canCreateEnhancedKanbanBoard(muralSummary)`; add unit test.\n> - **Enhanced Kanban Board (EKB)**:\n> - Enforce permission on `addRoot`, context-menu Duplicate predicate, panel item enabled state.\n> - Clip", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46129, + "title": "ENGAGE-1410 Copy Link Url Optimizely Experiment", + "branch": "add/optimizely-ab-test", + "merged_at": "2025-11-19T18:07:25Z", + "changed_files": 4, + "additions": 693, + "deletions": 9, + "body": "## Pull Request Overview\r\n\r\nThis PR implements an A/B experiment for the share modal v2 that conditionally changes the \"Copy link\" behavior for eligible users. When users are in the treatment variation, the copied link becomes a workspace invite link with a return URL parameter that redirects to the mural after joining the workspace, instead of just a direct mural visitor link.\r\n\r\nTicket: https://mural.atlassian.net/jira/software/c/projects/ENGAGE/boards/507?selectedIssue=ENGAGE-1410\r\n\r\nTest Env: https://optimizely-ab-test.mural.engineering/\r\n\r\n\"Screenshot\r\n\r\n\r\n**Key Changes:**\r\n- Modified `handleVisitorLink` to support both synchronous (v1) and asynchronous (v2 with experiment) behavior\r\n- Added Optimizely A/B testing integration to determine experiment variation\r\n- Implemented automatic workspace invite link generation for treatment variation users\r\n- Enhanced tracking to include experiment variation data\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/share-mural/views/share-link.tsx | Updated `handleVisitorLink` prop type to support both sync and async handlers; added logic to handle promise results and track experiment variations |\r\n| src/views/mural/modals/share/share-mural/v2/main-v2.tsx | Changed `handleVisitorLink` type signature from synchronous `() => string` to asynchronous `() => Promise<{link: string; experimentVariation?: string \\| null}>` for v2 modal |\r\n| src/views/mural/modals/share/share-mural/index.tsx | Added experiment eligibility checks, Optimizely integration, and new async `handleGetVisitorLink` function that generates workspace invite links for treatment users; maintained separate sync `handleGetVisitorLinkV1` for v1 modal |\r\n\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8107.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\n\n---\n\n> [!NOTE]\n> Updates `getDefaultShapeSize` to fall back to `defaultShape` height/width when undefined, fixing empty dimensions for rectangles/ovals in classic murals.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 36aa43aa0c5d774311bcfd377d2fb64f4db2a7ca. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46153, + "title": "ENGAGE-1425 - Aria-label is missing on the Card Actions trigger", + "branch": "add/engage-1425", + "merged_at": "2025-11-19T17:19:38Z", + "changed_files": 5, + "additions": 55, + "deletions": 21, + "body": "Test env - https://engage-1425.mural.engineering\r\n---\r\n\r\n## Pull Request Overview\r\n\r\nThis PR adds missing aria-labels to icon button components used for card actions and folder menus, improving accessibility for screen reader users. The changes include proper prop threading and comprehensive test coverage updates.\r\n\r\n- Adds contextual aria-labels to MrlIconButton components in card actions and folder menus\r\n- Updates test files to use semantic queries (`getByLabelText`) instead of test IDs where appropriate\r\n- Introduces new accessibility-focused test cases\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 5 out of 5 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/dashboard/components/folders/FolderMenu.tsx` | Added aria-label to folder menu icon button with folder name context |\r\n| `src/dashboard/components/folders/FolderMenu.test.tsx` | Updated all test queries to use the new aria-label instead of data-qa attributes |\r\n| `packages/dashboard/universal-card/src/card-content/card-content.tsx` | Passes title prop to CardActions component for aria-label context |\r\n| `packages/dashboard/universal-card/src/card-actions/card-actions.tsx` | Added optional title prop and implemented conditional aria-label with proper fallback |\r\n| `packages/dashboard/universal-card/src/card-actions/card-actions.test.tsx` | Added accessibility test suite and updated existing tests to use semantic queries |\r\n
\r\n\r\n\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Add contextual aria-labels to folder and card action buttons, thread title prop, and update/expand a11y-focused tests.\n> \n> - **Accessibility**:\n> - Add contextual `aria-label`s to action triggers:\n> - `FolderMenu`: `MrlIconButton` now labeled `\"Folder actions for ${folder.name}\"` in `packages/dashboard/room-page/src/folders/components/common/FolderMenu.tsx`.\n> - `CardActions`: `MrlIconButton` now", + "labels": [] + }, + { + "number": 46140, + "title": "[NEXT-256] Cleanup src/amp folder", + "branch": "fix/next-256", + "merged_at": "2025-11-19T17:06:17Z", + "changed_files": 23, + "additions": 168, + "deletions": 493, + "body": "**[NEXT-256 Remove easy to replace functions from apm, use SDK](https://mural.atlassian.net/browse/NEXT-256)**\r\n\r\nIn this PR:\r\n* Removed unused per-widget amp state types\r\n* Removed unused `ToJSONOptions` and related serialization code\r\n* Removed some amp widget position and bound functions\r\n* Moved `getGlobalAmpWidgetPosition` and `getInaccurateAmpWidgetBounds` closer to ViewportManager since it's not used in any other places\r\n* Removed `updating widget connection for arrow` cucumber rule, since it does nothing\r\n\r\nThe environment: https://next-256.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Cleans up legacy Amp code (state/types/serialization and bounds helpers), adds viewport helpers, switches viewport/widgets APIs to SDK geometry/AABB, updates routes/imports and tests, and deprecates the default mural getter.\n> \n> - **AMP cleanup**:\n> - Remove unused per-widget Amp state types in favor of unified `WidgetState`; drop multiple typeguards.\n> - Remove `ToJSONOptions` and child serialization; `toJSON` no longer accepts options.\n> - Delete legacy Amp bounds/group helpers; move `getGlobalAmpWidgetPosition`/`getInaccurateAmpWidgetBounds` to `src/mural/models/viewport-manager-helpers.ts` (deprecated shim).\n> - Deprecate and switch `get-current-mural` to named export `getCurrentMural`; update imports in `get-token`, `routes/mural.tsx`, `routes/template.tsx`.\n> - **Viewport/geometry**:\n> - Use `Obb`/`Aabb` and `sdk.widgets.internalGetInaccurateAbsolutePosition` for bounds in absorption logic.\n> - `viewport` API `fitToWidgets`/`includesWidgets` now unions `sdk.widgets.getVisualAabb` results; remove Amp group-bounds usage.\n> - `ViewportManager` now consumes new helpers for Amp widget bounds.\n> - **Widgets SDK APIs**:\n> - File/photo APIs use SDK widgets and `isApi*` guards; access widget `properties` directly; simplify processing/progress and cropping math.\n> - Widgets primitives: `getGlobalPositionInternal` returns `Point`; `internalGetInac", + "labels": [] + }, + { + "number": 45782, + "title": "Remove feat-mu-enable-ia-ui-high feature flag code", + "branch": "add/can-8000", + "merged_at": "2025-11-19T16:54:13Z", + "changed_files": 56, + "additions": 193, + "deletions": 1041, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoves feat-mu-enable-ia-ui-high feature flag from codebase. Updates tests.\r\n\r\n[Test Env](https://can-8000.mural.engineering/)\r\n\n\n---\n\n> [!NOTE]\n> Removes IA flag paths and legacy menus, standardizes toolbar tools (laser, timer, export/find), relocates quests/trial-upgrade to Utilities, adds small asset-manager guard, and broadly updates tests/steps.\n> \n> - **Canvas UI / Toolbars**:\n> - Replace legacy IA-flagged layouts; use `FixedToolbar` and standard `WellKnownToolbars` throughout (`web`, `preview`, interactive display).\n> - Register laser as `laser-topbar-tool` in Utilities; action-bar command preserved.\n> - Timer defaults to `progress-button`; exposes `init-timer-item` in Utilities.\n> - Export Selection tool remains in Mural Actions; adds helper to programmatically open it.\n> - Move Onboarding Quests (`quest`) and Team+ Trial Upgrade button to Utilities; adjust groups/orders.\n> - **Addons / Cleanup**:\n> - Remove `information-architecture-removals` addon and related title/utilities menu rewrites.\n> - Remove template topbar Hana tests; simplify facilitation-related menus.\n> - **SDK / Tracking**:\n> - Always log Custom Toolbar (Capabilities) open without IA flag checks.\n> - **Asset Management**:\n> - Guard `isUserAsset` against undefined URL; avoid refreshing when `widgetUrl` is falsy.\n> - **Tests**:\n> - Large updates to features: trigger tools via named toolbar IDs (e.g., \"find\", \"laser-topbar-tool\", \"init-timer-tool\"), \"open the export tool\" step, and toolbar-button property assertions.\n> - Normalize wording/quotes; remove fragile topbar scenarios; update native/mobile visibility checks.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 20e0635b821cb523ec840b62c585577ad6566046. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46126, + "title": "[PLAY-738] Re-running research should update the company logo", + "branch": "fix/company-logo-on-rerun-research", + "merged_at": "2025-11-19T16:02:39Z", + "changed_files": 2, + "additions": 268, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWhen we made updates to how we store CE data for mural for sales templates, we removed code that removed all widgets added by AI. I updated our logic to also check the sidepanel for relevant widgets to remove during research steps. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-738) to understand the context of this effort.\r\ndemo: https://www.loom.com/share/fc0bfdaeabdd4a47a1ef535dcff12f22\r\n\r\n", + "labels": [ + "bop" + ] + }, + { + "number": 46158, + "title": "[NEXT-260] Remove EasyConnectorCallout", + "branch": "fix/next-260", + "merged_at": "2025-11-19T14:34:31Z", + "changed_files": 6, + "additions": 0, + "deletions": 21, + "body": "**[NEXT-260 Remove EasyConnectorCallout](https://mural.atlassian.net/browse/NEXT-260)**\r\n\r\nThis PR removes `EasyConnectorCallout`. There is no code that shows the callout, and even if it's shown using console, it's broken.", + "labels": [] + }, + { + "number": 46156, + "title": "[CAN-8120] Allow nested areas to \"steal\" widgets from its parent", + "branch": "add/nested-areas-stealing", + "merged_at": "2025-11-19T12:56:15Z", + "changed_files": 10, + "additions": 407, + "deletions": 17, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR implements the concept of \"stealing\" for nested areas.\r\n\r\nWhenever an area enters another, and becomes a child of the latter, if the final position of the nested area is fully containing children of the parenting cluster, it now has the ability to \"steal\" them from it.\r\n\r\nThis means that any widget inside an area will become child of any nested area that is added to the bigger cluster:\r\n\r\n![Nov-19-2025 08-46-49](https://github.com/user-attachments/assets/87bd60b5-594a-44fa-b378-abbf2d532e3b)\r\n\r\nThis should work for all the cases where nesting can occur:\r\n- Dragging an area inside another\r\n- Dragging an already nested area\r\n- Resizing an already nested area \r\n- Dragging an area from the sidebar onto another\r\n- Pasting an area inside another\r\n- Adding a nested area via the context menu\r\n- Duplicating an area onto another\r\n- Clicking \"Absorb\" from the toolbar of a nested area (this one is hard to test because you'd have to force a situation where a widget is inside a nested area but is not yet absorbed by it)\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8120)\r\n- \ud83e\uddea [**Testing environment**](https://nested-areas-stealing.mural.engineering)", + "labels": [] + }, + { + "number": 46150, + "title": "[CAN-7748] Fix alt drag + constrained dragging on areas improvements", + "branch": "fix/can-7748", + "merged_at": "2025-11-19T00:28:55Z", + "changed_files": 4, + "additions": 122, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug where Alt+Shift+drag duplication didn't work when the areas improvements feature flag was enabled. The issue was incorrect ordering of modifier key checks, causing early returns that blocked the duplication flow.\r\n\r\nPR\r\n![pr](https://github.com/user-attachments/assets/8565a18e-89cf-4519-be6a-b8087be27206)\r\n\r\nMaster\r\n![bug](https://github.com/user-attachments/assets/7c9aa495-4a69-4d32-8e13-51dcf067a6e5)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-7748\r\n- Env: https://can-7748.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46144, + "title": "[NEXT-164] Package MuralsStore ", + "branch": "move/muralsstore-package", + "merged_at": "2025-11-18T23:37:44Z", + "changed_files": 19, + "additions": 29, + "deletions": 103, + "body": "\r\ntest-env\r\nhttps://muralsstore-package.mural.engineering/", + "labels": [] + }, + { + "number": 46098, + "title": "[NEXT-145] Package people card into the dashboard-cards package", + "branch": "add/package-people-card", + "merged_at": "2025-11-18T23:10:02Z", + "changed_files": 7, + "additions": 15, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/NEXT-145) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://package-people-card.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https:", + "labels": [] + }, + { + "number": 46147, + "title": "Replace last usage of old buildMuralMock() with mocks.getMuralSummary()", + "branch": "update/replace-old-mural-testmock", + "merged_at": "2025-11-18T23:02:32Z", + "changed_files": 2, + "additions": 4, + "deletions": 86, + "body": "", + "labels": [] + }, + { + "number": 46149, + "title": "[FEP-6415] - add padding-left to menu item adapter right block", + "branch": "fix/context-menu-right-block", + "merged_at": "2025-11-18T22:38:18Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[https://context-menu-right-block.mural.engineering/](https://context-menu-right-block.mural.engineering/)\r\n\r\n[FEP-6415](https://mural.atlassian.net/browse/FEP-6415)\r\n\r\nAdd a minimum space to the right block container in the toolbar menu item adapter.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests", + "labels": [] + }, + { + "number": 46148, + "title": "Fix Cursor rule globs in .mdc files", + "branch": "fix/cursor-rule-globs", + "merged_at": "2025-11-18T22:19:07Z", + "changed_files": 9, + "additions": 10, + "deletions": 10, + "body": "Apparently we've been doing the `globs` in `.mdc` files wrong: https://forum.cursor.com/t/correct-way-to-specify-rules-globs/71752/2\r\n\r\nBefore:\r\n\"Screenshot\r\n\"image\"\r\n\r\n\r\nAfter:\r\n\"Screenshot\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 46141, + "title": "Fix existence check", + "branch": "fix/cwi-2361-user-condition", + "merged_at": "2025-11-18T20:21:10Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 46056, + "title": "[NEXT-208] Refactor DashboardView func comp", + "branch": "refactor/dashboardview-func-comp", + "merged_at": "2025-11-18T20:07:37Z", + "changed_files": 46, + "additions": 719, + "deletions": 690, + "body": "", + "labels": [] + }, + { + "number": 45957, + "title": "[IAM-2268] ACR room permission matrix modal tweaks", + "branch": "feat/iam-2268-room-modal-tweaks", + "merged_at": "2025-11-18T19:51:42Z", + "changed_files": 19, + "additions": 312, + "deletions": 212, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMake some presentational and functional adjustments to the room roles information modal:\r\n- Reduces the number of cell states to two\r\n- Moves the role disclaimer asterisk to the role type column / left aligns column cells and header\r\n- Adds an option for using an asterisk marker for disclaimer items to more clearly link them to the role disclaimer asterisk\r\n- Dynamically renders the current configuration for the permissions that are configurable (`editor#createMurals, editor#inviteOthers, editor#duplicateRoom`)\r\n- Adjusts the given permissions for Limited members and Guests\r\n- Removes the \"disclaimer banner\" when room is under a company configured for RBAC\r\n- Disables Admin role selection for guests (not the entire dropdown) as guests can have both editor and viewer roles\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2268) to understand the context of this effort.\r\n- \ud83c\udfa5 [Demo](https://www.loom.com/share/9452fbb658b040e6ae5436af59410cfd) \r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2268-room-modal-tweaks.mural.engineering/t/uc76516ddb126de2451105508/r/1763399350486278/settings/members) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nI have turned on the ACR env flag for the test env link above and added some users to the linked room with appropriate `roleId` values for convenience / testing. You can use the following admin credential to login:\r\n\r\n```\r\nalexander98@hunnur.com\r\nzhX26p7A_TF4sx_\r\n```\r\nWe should check the following static scenarios:\r\n\r\nTMP pricing plan, permissions matrix and disclaimer text are correct for:\r\n- Full member dropdown option\r\n- Limited member dropdown option\r\n- Guest option\r\n\r\nNon-TMP pricing plan, permissions matrix and disclaimer text are correct for:\r\n- Legacy member option\r\n\r\nAlso will want to check that when you change the _default_ permissi", + "labels": [] + }, + { + "number": 46138, + "title": "[IPA-304 Part 1] collaboaration insights package", + "branch": "add/ipa-304-part-1", + "merged_at": "2025-11-18T19:02:53Z", + "changed_files": 70, + "additions": 116, + "deletions": 122, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nmoves collaboration insights common components to its module\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Busin", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46115, + "title": "[CAN-8129] Add `Add content -> area` when inside an area", + "branch": "fix/can-8129", + "merged_at": "2025-11-18T18:49:26Z", + "changed_files": 4, + "additions": 68, + "deletions": 30, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the option for `Area` inside `Add content` when opening the context menu inside an area. The created area should be absorbed.\r\nThis should be tested with `ENABLE_NESTED_AREAS` enabled but `ENABLE_ABSORPTION_SYSTEMS` disabled.\r\n\r\n![pr](https://github.com/user-attachments/assets/45ceed81-b8ba-43ab-a1e4-811f85b320c7)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8129\r\n- Env: https://can-8129.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46143, + "title": "Fix `globs` for jest-testing Cursor rules", + "branch": "fix/jest-cursor-rules-apply", + "merged_at": "2025-11-18T18:36:16Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "Apparently we've been doing the `globs` in `.mdc` files wrong: https://forum.cursor.com/t/correct-way-to-specify-rules-globs/71752/2\r\n\r\nBefore:\r\n\"Screenshot\r\n\"image\"\r\n\r\n\r\nAfter:\r\n\"Screenshot\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 46120, + "title": "[NEXT-131] Migrate AboutYou route to @muralco/route-about-you package", + "branch": "migrate/next-131-about-you-route", + "merged_at": "2025-11-18T18:20:53Z", + "changed_files": 23, + "additions": 414, + "deletions": 274, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR migrates the AboutYou route component from `src/team/routes/about-you` into a new standalone package `@muralco/route-about-you`. This follows the established pattern of modularizing route components into separate packages for better organization and reusability, similar to `@muralco/route-check-email` and `@muralco/route-reset-password`.\r\n\r\n**Prior to these changes:**\r\n- AboutYou route was located in `src/team/routes/about-you/`\r\n- Questions constants were in `src/settings/user/profile/constants.ts` (shared with Team Role modal)\r\n- BackSkipFooter component was in `src/team/routes/create-team/components/back-skip-footer/`\r\n- Helpers used `getMuralUrl` from `src/modals/search/utils.ts`\r\n\r\n**Now, with these changes:**\r\n- New `@muralco/route-about-you` package created with full configuration (TypeScript, Jest, webpack, ESLint)\r\n- AboutYou component, helpers, and styles migrated to package\r\n- BackSkipFooter component co-located in package\r\n- Questions constants (purpose, usedBefore, teamsV2, rolesV2, questions) moved to package\r\n- Helpers updated to use `getLinkUrl` from `@muralco/mural-utils` instead of `getMuralUrl`\r\n- Route import updated in `src/team/routes/index.tsx` to use package\r\n- Team Role modal updated to import `teamsV2` and `rolesV2` from package\r\n- Old files removed and constants cleaned up\r\n\r\n#### Key Implementation Details\r\n\r\n- **Package Structure**: Created using `muralco-create-package` React template, following the same pattern as other route packages\r\n- **Dependencies**: All dependencies properly configured, including `@muraldevkit/ds-icons` as peer dependency for BackSkipFooter\r\n- **Constants Migration**: Questions constants moved to package and exported for use by Team Role modal\r\n- **Helper Updates**: Replaced `getMuralUrl` with `getLinkUrl` from `@muralco/mural-utils` for consistency\r\n- **Authentication**: Uses existing packaged `RequireAuth`/`useAuthenticatedUser` from `@muralco/use", + "labels": [] + }, + { + "number": 46135, + "title": "[NEXT-162] Move folder components to dashboard-room-page package", + "branch": "move/folder-components-package", + "merged_at": "2025-11-18T17:54:28Z", + "changed_files": 19, + "additions": 257, + "deletions": 224, + "body": "Move folders/components to @muralco/dashboard-room-page package\r\n\r\nalso split actionForFoldersMenu tests. One file for general purpose tests. One using the real registration objects", + "labels": [] + }, + { + "number": 46090, + "title": "[NEXT-182] Move DashboardPropsContext package", + "branch": "move/dashboardpropscontext-package", + "merged_at": "2025-11-18T17:49:49Z", + "changed_files": 22, + "additions": 31, + "deletions": 28, + "body": "", + "labels": [] + }, + { + "number": 46109, + "title": "[SCQM-1467] Make generate ideas remove created stickies in single undo step", + "branch": "bug/generate-ideas-undo", + "merged_at": "2025-11-18T17:22:13Z", + "changed_files": 4, + "additions": 169, + "deletions": 59, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAfter accept generating ideas in preview mode, selecting 'undo' would require two clicks to fully remove the accepted content. These changes fix that so that only a single 'undo' will be required.\r\n\r\nAdditionally, when preview mode is open and the user selects to generate more ideas, the preview mode kicks out the current stickies instead of combining them with the newly generated ones. This PR makes it so that the preview mode maintains the current stickies when asking for more. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1467) to understand the context of this effort.\r\nPlease see this \ud83c\udfac [**demo**](https://www.loom.com/share/47a1bfb1b1f147f3b80762a0a75fc55e) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://generate-ideas-undo.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Generate ideas, accept the preview mode\r\n 2. Select undo\r\n 3. Observe everything is gone in a single click\r\n\r\n1. Generate ideas, ask for more ideas while preview mode is open\r\n2. Observe the original sticky notes are still in preview mode \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilati", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45940, + "title": "[IAM-2256] [IAM-2257] [IAM-2259] Polishing the workspace user table", + "branch": "feat/iam-2257-polish", + "merged_at": "2025-11-18T17:08:44Z", + "changed_files": 48, + "additions": 2640, + "deletions": 324, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- [x] Polish all the modals in the workspace user table ([check out the mural!](https://app.mural.co/t/enterprise5240/m/enterprise5240/1762353434339/b5c50e571ea4b8f64c58a5932464e76967492f92?sender=uf5a3944b3dd10ffb38357605)).\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2257**](https://mural.atlassian.net/browse/IAM-2257)\r\n - Will also close [**IAM-2259**](https://mural.atlassian.net/browse/IAM-2259) and [**IAM-2256**](https://mural.atlassian.net/browse/IAM-2256)\r\n- \ud83e\uddea [**iam-2257-polish.mural.engineering**](https://iam-2257-polish.mural.engineering)\r\n- \ud83c\udfac Loom video incoming\r\n\r\nAssuming you have **global admin edit** permissions on your account in the testing environment, you can access one of these workspaces to check out the new table and the old one.\r\n\r\n| Workspace | New table? | SCIM group? |\r\n| --- | --- | --- |\r\n| [currenttablefeaturedisabledw3388](https://iam-2257-polish.mural.engineering/t/currenttablefeaturedisabledw3388/settings/members) | \u274c | \u2705 |\r\n| [newtablewithgroups7128](https://iam-2257-polish.mural.engineering/t/newtablewithgroups7128/settings/members) | \u2705 | \u2705 |\r\n| [currenttablefeaturedisabled4055](https://iam-2257-polish.mural.engineering/t/currenttablefeaturedisabled4055/settings/members) | \u274c | \u274c |\r\n| [newtable7976](https://iam-2257-polish.mural.engineering/t/newtable7976/settings/members) | \u2705 | \u274c |", + "labels": [] + }, + { + "number": 46105, + "title": "[CWI-2362] Add new endpoint for CS only imports", + "branch": "add/cwi-2362-new-endpoint", + "merged_at": "2025-11-18T16:36:15Z", + "changed_files": 3, + "additions": 50, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add new endpoint for CS only imports that supports receiving an email address to be used as the owner for the mural to be created (if that user exists).\r\n- Add option to suppress email notifications (for both the new endpoint and existing)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2361) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/d01c348e0bb0447e9a40226a0f69bf58) of the acceptance criteria for the above ticket\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/mural-api/pull/14875\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+", + "labels": [] + }, + { + "number": 46112, + "title": "Next-240 Moved SSO test and error components and routes to IAM package", + "branch": "add/next-240-move-sso-error-routes", + "merged_at": "2025-11-18T15:53:25Z", + "changed_files": 10, + "additions": 66, + "deletions": 31, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMoved SsoProfile, SsoProfileComponent and related routes to IAM package\r\nhttps://mural.atlassian.net/browse/NEXT-241\r\nhttps://mural.atlassian.net/browse/NEXT-240\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46119, + "title": "[ESC-1783] Add beta label on data retention", + "branch": "add/esc-1783-beta-label-on-data-ret", + "merged_at": "2025-11-18T11:46:08Z", + "changed_files": 4, + "additions": 443, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes:\r\n- No beta label was shown near the data retetion section\r\n- The items in the navbar could be shown, under some permission combination, empty.\r\n\r\nNow, with these changes:\r\n- The beta tag label is added to the navbar\r\n- New unit tests for the nav bar were added to gurantee rendering on permissions\r\n- A new unit was added to test the tags (like the beta one) in the elements for Security section\r\n- Added a new filter of the navbar items so the section is not shown empty (under some permission combination)\r\n\r\n#### Design perspective\r\n> Hey Jhony, If there are no navigation items in a section we should hide it along with the section title. This keep is clean and only shows what\u2019s needed to the user.\r\n\r\n#### Reviewer Resources\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- N/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pa", + "labels": [] + }, + { + "number": 46116, + "title": "NEXT-124 - Package /reset-password route", + "branch": "add/next-124", + "merged_at": "2025-11-18T01:56:51Z", + "changed_files": 18, + "additions": 477, + "deletions": 4, + "body": "Test env - https://next-124.mural.engineering\r\n\r\n---\r\n\r\n## Pull Request Overview\r\n\r\nThis PR extracts the reset password route component from the main application into a new standalone package `@muralco/route-reset-password`. This follows the established pattern of modularizing authentication routes into separate packages for better organization and reusability.\r\n\r\n### Key Changes\r\n- Created new package `@muralco/route-reset-password` with full configuration (TypeScript, Jest, webpack, ESLint)\r\n- Added comprehensive test coverage for the ResetPassword component\r\n- Updated import in `src/registration/routes/index.tsx` to use the new package instead of the removed local implementation\r\n- Added package to workspace dependencies and CODEOWNERS\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 16 out of 18 changed files in this pull request and generated 1 comment.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/registration/routes/index.tsx` | Updated import to use new `@muralco/route-reset-password` package, removed old local import |\r\n| `packages/route-reset-password/package.json` | New package configuration with dependencies for UI toolkit, API client, and testing libraries |\r\n| `packages/route-reset-password/tsconfig.json` | TypeScript configuration for React package |\r\n| `packages/route-reset-password/tsconfig.jest.json` | TypeScript configuration for Jest tests |\r\n| `packages/route-reset-password/jest.config.js` | Jest configuration using shared React config |\r\n| `packages/route-reset-password/build/webpack.config.js` | Webpack configuration for package build |\r\n| `packages/route-reset-password/api-extractor.json` | API extractor configuration for documentation |\r\n| `packages/route-reset-password/.eslintrc.js` | ESLint configuration for import resolution |\r\n| `packages/route-reset-password/src/index.ts` | Package entry point exporting ResetPassword component |\r\n| `packages/route-reset-password/src/index.t", + "labels": [] + }, + { + "number": 46134, + "title": "Remove team from CODEOWNERS for package.json files", + "branch": "fix/codeowner-error", + "merged_at": "2025-11-18T01:28:09Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nRemove tactivos/modularization-tiger-team from CODEOWNERS to make it valid again\r\n", + "labels": [] + }, + { + "number": 45974, + "title": "Remove `lib/auth` in favor of package alternatives", + "branch": "remove/lib-auth", + "merged_at": "2025-11-17T22:58:37Z", + "changed_files": 29, + "additions": 134, + "deletions": 279, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR primarily deprecates `lib/auth` module in favor of using centralized authentication utilities from `@muralco/api` and `@muralco/authentication-lib` packages. The changes improve code consistency by using package-level authentication functions instead of local implementations.\r\nBut _secondary_ made **several improves** to the test rigs to support auth lib operations that produce redirections (ie. `browserHistory` and `location.href` redirections)\r\n\r\nIn detail:\r\n- Migrated authentication checks from local `lib/auth` to `@muralco/api` (`isAuthenticated`) and `@muralco/authentication-lib` (`fetchUser`, `logout`)\r\n- Removed the deprecated `getIsAuthenticated` prop from `UsupportedVersion` component in favor of directly calling `isAuthenticated()`\r\n- Updated test infrastructure to properly handle authentication state and terminal navigation resets\r\n- Fixed test patterns and expectations to align with the new authentication flow.\r\n\r\n#### Reviewer Resources\r\n- Pure refactoring changes, including test adaptation, but a test env is provided for manual smoke test operations.\r\n\r\n### Relevant Links \ud83d\udd17\r\n- These changes also demanded a previous work: https://github.com/tactivos/murally/pull/45988 (\ud83e\ude86 effect keeps hunting me)\r\n\r\n", + "labels": [] + }, + { + "number": 46093, + "title": "[ESC-1792] Moved modal in src to ESC dashboard package", + "branch": "add/esc-1792-move-modal-to-esc-package", + "merged_at": "2025-11-17T22:26:20Z", + "changed_files": 4, + "additions": 3, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n Prior to these changes we were requested by engagement team to move the modal to our package outside the src folder\r\n Now, with these changes, this modal is loaded from the dashboard-archive-page package controlled by ESC\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ESC-1792) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [X] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://mural.slack.com/archives/C01KJT67RC7/p1762271766595989?thread_ts=1762213704.621739&cid=C01KJT67RC7\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46088, + "title": "[CAN-8114] Remove `selection.zzzSetBounds()` and `selection.update()`", + "branch": "fix/can-8114-2", + "merged_at": "2025-11-17T22:12:46Z", + "changed_files": 29, + "additions": 83, + "deletions": 268, + "body": "**[CAN-8114 Remove zzzSetBounds, compute selection marquee box from selection state](https://mural.atlassian.net/browse/CAN-8114)**\r\n\r\nRemoved manual update of selected widget bounds. Now it's computed.\r\n\r\nThe environment: https://can-8114-2.mural.engineering/", + "labels": [] + }, + { + "number": 46033, + "title": "[ESC-1766] Add archived murals searching bar", + "branch": "add/esc-1765-archived-murals-searching", + "merged_at": "2025-11-17T21:59:44Z", + "changed_files": 7, + "additions": 342, + "deletions": 68, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes there was no search bar in the archived murals page\r\n\r\nNow, with these changes:\r\n- A new search bar is added with the new tittleSearch param from the api (see api PR)\r\n- A new test for the search bar is added for its sub components (search bar, owner filtering, workspace filtering)\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [ESC-1765](https://mural.atlassian.net/browse/ESC-1765) and [ESC-1766](https://mural.atlassian.net/browse/ESC-1766) to understand the context of this effort.\r\n\r\n##### Feature screenshot\r\n\"image\"\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14861)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+M", + "labels": [] + }, + { + "number": 46118, + "title": "[IPA-303] admin-reports: moves all the reports related code to its package", + "branch": "add/ipa-303", + "merged_at": "2025-11-17T19:59:58Z", + "changed_files": 33, + "additions": 61, + "deletions": 40, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoving reports code to its module\r\n\r\ntest env=> https://ipa-303.mural.engineering/\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispat", + "labels": [ + "disable-npm-linting" + ] + }, + { + "number": 46117, + "title": "[CAN-8128] Add support for nested areas in context menu absorption", + "branch": "add/can-8128", + "merged_at": "2025-11-17T19:47:59Z", + "changed_files": 2, + "additions": 13, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n Prior to these changes, when creating an area from selected widgets via \"Add to > Area\", the \r\n newly created area was not absorbed into a containing parent area, even when it was fully contained by one.\r\n \r\n Now, with these changes, the code calls dropWidgetsOnCanvas immediately after creating the area, \r\n which handles absorption into any containing parent areas. This ensures newly created areas are properly\r\n nested when appropriate.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8128) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8128.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46121, + "title": "ECOMM-273 Migrate v1 cucumber test: dashboard-dropdown-menu-cta.feature", + "branch": "add/billing-menu-cta", + "merged_at": "2025-11-17T18:42:08Z", + "changed_files": 2, + "additions": 848, + "deletions": 402, + "body": "Ticket: https://mural.atlassian.net/jira/software/c/projects/ENGAGE/boards/507?selectedIssue=ECOMM-273\r\n\r\n## Pull Request Overview\r\n\r\nThis PR migrates test coverage from deprecated Cucumber v1 tests to modern Jest unit tests for the upgrade CTA functionality in the dashboard dropdown menus. The changes remove an outdated Cucumber test file containing 401 lines of E2E scenarios and replace them with comprehensive unit tests that follow current testing best practices.\r\n\r\n- Removes deprecated Cucumber v1 test file (`dashboard-dropdown-menu-cta.feature`)\r\n- Adds 831 lines of comprehensive unit tests covering the same scenarios\r\n- Uses Jest and React Testing Library for improved test maintainability\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/dashboard/layout/config-menu/cta/upgrade.test.tsx` | Adds comprehensive unit tests for upgrade CTA behavior across different user types (admin/non-admin), plan types (freemium, Team+ trial, paid), and dropdown locations (user menu, workspace menu). Tests cover rendering, modal interactions, and analytics tracking. |\r\n| `features/billing/dashboard-dropdown-menu-cta.feature` | Removes deprecated Cucumber v1 test file containing E2E scenarios for billing CTAs. All scenarios were disabled/ignored due to flakiness (PE-5247), making this cleanup appropriate. |", + "labels": [] + }, + { + "number": 46110, + "title": "[NEXT-110] Move `src/common/state` with other SDK state", + "branch": "relocate-common-state", + "merged_at": "2025-11-17T17:41:11Z", + "changed_files": 23, + "additions": 31, + "deletions": 37, + "body": "This PR refactors the codebase by moving the state management code from `src/common/state` to `src/mural/sdk/state`, consolidating common state with other SDK state modules. The refactoring improves code organization by placing all SDK state in a single location.\r\n\r\nKey changes:\r\n\r\n- Moved `src/common/state` to `src/mural/sdk/state/common-state`\r\n- Created separate state modules (modal, modals, notification, share, socket) as siblings to common-state\r\n- Updated all import paths throughout the codebase to reference the new locations", + "labels": [] + }, + { + "number": 46111, + "title": "[NEXT-245] DashboardView changes: Remove unused modal and callouts ", + "branch": "remove/dashboard-unused-modalname", + "merged_at": "2025-11-17T17:29:17Z", + "changed_files": 8, + "additions": 10, + "deletions": 169, + "body": "", + "labels": [] + }, + { + "number": 46113, + "title": "[CAN-8091] Add missing timer tool visibility tests", + "branch": "add/timer-tests", + "merged_at": "2025-11-17T14:48:54Z", + "changed_files": 2, + "additions": 294, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds test for timer tool. \r\nWe have other test in the controller and dispatcher so we are covering here the visibility behavior that is the part that the tool api adds.\r\n", + "labels": [] + }, + { + "number": 46107, + "title": "Tool dropdown issue", + "branch": "fix/tool-dropdowns", + "merged_at": "2025-11-17T13:57:38Z", + "changed_files": 1, + "additions": 44, + "deletions": 0, + "body": "When the IA Toolbar Flag was enabled, some of the menus of tools in the Fixed Widget Toolbar were not working.\r\nThe reason being because the child tools were not ever updated to the fixed toolbar. \r\n\r\n-Add child tools that were missed when switching a parent tool to the fixed toolbar\r\n\r\n[Test Env](https://tool-dropdowns.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 46034, + "title": "[CAN-8068] Refactor mode description tools", + "branch": "add/can-8068", + "merged_at": "2025-11-17T13:21:21Z", + "changed_files": 14, + "additions": 281, + "deletions": 178, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n### Problem\r\n@bmbrandx identified an a11y issue on https://github.com/tactivos/murally/pull/45868, the different modes description were being rendered as a toolbar item, which is semantically incorrect. Status notifications should not be part of a toolbar structure. Additionally, screen reader users were not being properly notified when mode transitions occurred, as the description lacked proper ARIA live region support.\r\n\r\n### Solution\r\n- **Removed description from toolbar**: Removed the tool registrations from the Tools API\r\n- **Migrated all descriptions to semantic HTML and UI toolkit components**: These are no longer tool based\r\n- **Added semantic HTML with aria-live**: The new component uses `role=\"status\"` and `aria-live=\"polite\"` to properly announce state changes to screen reader users\r\n\r\n### Changes\r\n- **Updated**: PrivateModeBar, FocusModeBar and VotingModeBar to use the UI toolkit components outside of the Toolbar structure\r\n- **Removed**: Tool registrations for descriptions\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8068) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8068.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nBefore/After screenshots:\r\n\r\n### Voting mode: Select Area:\r\n\r\nProd (Flag off):\r\n\"image\"\r\n\r\nEnv (Flag off):\r\n\"image\"\r\n\r\nBeta (Flag on):\r\n\"image\"\r\n\r\nEn", + "labels": [] + }, + { + "number": 46100, + "title": "[CAN-7998] Hide Widget Tools Instead of Disabling for Improved UX", + "branch": "add/hide-widget-tools", + "merged_at": "2025-11-17T12:58:00Z", + "changed_files": 22, + "additions": 407, + "deletions": 535, + "body": "### Summary of Changes and Resources for the Reviewer\r\n## Overview\r\n\r\nThis PR migrates top-level tools in the `WIDGET_FLOATING` toolbar from using `disabled` conditions to `visible` conditions. Instead of showing tools as disabled, tools are now hidden when they're not applicable, providing a cleaner user experience by reducing visual clutter.\r\n\r\n## Tools Updated\r\n\r\nThe following tools have been migrated to use visibility instead of disabled state:\r\n\r\n1. **Align Widgets** (`align-widgets`)\r\n2. **Arrange Widgets** (`arrange-widgets`)\r\n3. **Caption Toggle** (`caption-toggle-tool`)\r\n4. **Crop Photo** (`crop-photo-tool`)\r\n5. **Drag Tool** (`drag-tool`)\r\n6. **Filter by Type** (`filter-by-type-tool`)\r\n7. **Resize Tool** (`resize-tool`)\r\n8. **Zoom to Selection** (`zoom-to-selection`)\r\n9. **Mindmap Layout Horizontal** (`mindmaps-layout-horizontal`)\r\n10. **Mindmap Layout Vertical** (`mindmaps-layout-vertical`)\r\n\r\n## Tools Not Covered in This PR\r\n\r\nThe following tools are **not** included in this PR as they will be moved to the fixed toolbar in a future update:\r\n\r\n- **Border Width** (`border-width`)\r\n- **Border Style** (`border-style-toggle-tool`)\r\n- **Stroke Width** (`stroke-width`) - Note: Currently hardcoded to `disabled: false`\r\n- **Decrease Font** (`decrease-font`)\r\n- **Increase Font** (`increase-font`)\r\n\r\n## AI Tool Exclusion\r\n\r\nThe **AI Dropdown Tool** (`ai-dropdown-tool`) is not covered in this PR and will be delivered separately.\r\n\r\n## Changes\r\n\r\n- Removed `disabled` property from tool specs\r\n- Combined disabled logic into visibility conditions\r\n- Updated tests to check visibility instead of disabled state\r\n- Updated tools-api documentation to reflect the preference for visibility over disabled state\r\n\r\n## Benefits\r\n\r\n- **Cleaner UI**: Reduces visual clutter by hiding unavailable tools\r\n- **Better UX**: Users only see tools that are actionable\r\n- **Consistent Pattern**: Aligns with the established pattern for top-level tools in `WIDGET_FLOATING` toolbar\r\n\r\n## Testing", + "labels": [] + }, + { + "number": 46104, + "title": "Add logging when stacking order overflows", + "branch": "add/stacking-order-monitoring", + "merged_at": "2025-11-14T22:52:11Z", + "changed_files": 2, + "additions": 68, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds logging functionality to detect when the stacking order values in the widget system grow disproportionately large relative to the number of widgets, which could indicate an overflow condition.\r\n\r\n#### Reviewer Resources\r\n- \ud83e\uddea [**Testing environment**](https://stacking-order-monitoring.mural.engineering)", + "labels": [] + }, + { + "number": 46081, + "title": "[NEXT-209] Migrate Github Connect + Tracking Integrations to @muralco/integrations", + "branch": "migrate-tracking-integrations", + "merged_at": "2025-11-14T22:39:33Z", + "changed_files": 23, + "additions": 30, + "deletions": 23, + "body": "Refactors integration tracking and related code into the @muralco/integrations package and migrates tracking to @muralco/tracking-lib.\r\n\r\nChanges:\r\n- Moves tracking code from src/tracking/ to packages/integrations/src/tracking/\r\n- Moves GitHub integration helpers from src/common/integrations/ to packages/integrations/src/github/\r\n- Moves integration window constants from @muralco/parking-lot to @muralco/integrations\r\n- Updates imports across the codebase to use @muralco/integrations\r\n- Migrates tracking implementation to use @muralco/tracking-lib\r\n\r\nImpact: 23 files changed, consolidates integration-related code into a single package for better maintainability.", + "labels": [] + }, + { + "number": 45971, + "title": "[SCQM-1157] Add company color to the canvas and color picker", + "branch": "add/company-color-canvas-support", + "merged_at": "2025-11-14T22:21:09Z", + "changed_files": 16, + "additions": 221, + "deletions": 143, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n> Adds company color palettes to the color picker and widget toolbars, wiring CompanyColorInput through API, SDK types, AMP, user model, and state.\r\n> \r\n> - **Types/API/State**\r\n> - Update `User.companyColors` type from `string[]` to `CompanyColorInput[]` in `packages/api/src/users.ts`, `packages/sdk-types/src/user.ts`, and AMP types.\r\n> - Map `user.companyColors` into SDK public state in `src/mural/sdk/apis/create-mural-state.ts`.\r\n> - Extend user model with `companyColors` and `companyColorsEnabled` in `src/models/user.ts`.\r\n> - **UI: Color Picker**\r\n> - `Colors` and `ColorPaletteDropdown` components accept optional `companyColors?: CompanyColorInput[]` and render a \"Company colors\" section using `hex`/`name`.\r\n> - Provide company color name resolution via `CompanyColorInput` and fallback to `getColorName`.\r\n> - **Toolbars**\r\n> - Background, stroke, and text color pickers pass `ctx.user.get().companyColors` to the palette.\r\n> - Remove legacy company-color sourcing logic from `toolbar/color/util.tsx` and use user-provided `companyColors`.\r\n> - **Tests**\r\n> - Update color toolbar tests to use `CompanyColorInput` and new rendering behavior for company colors.\r\n\r\n\"Screenshot\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1157) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\n\n---\n\n> [!NOTE]\n> Add company color p", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46106, + "title": "Tune the fixed widget toolbar shadow", + "branch": "fix/widget-toolbar-shadow", + "merged_at": "2025-11-14T21:43:41Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is a very subtle change on the toolbar drop shadow.\r\nA 1px blur radius on a 0px drop shadow leaves very little room for the gradient effect to be visible.\r\n\r\nBumping it to 3px improves the transition between the fixed widget toolbar and the canvas, especially when there are widgets near the edge.\r\n\r\nBefore\r\n\r\n\"Screenshot\r\n\r\nAfter\r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode,", + "labels": [] + }, + { + "number": 46102, + "title": "[IPA-302] Adds new package `collaboration-insights`", + "branch": "add/ipa-302", + "merged_at": "2025-11-14T21:27:49Z", + "changed_files": 14, + "additions": 251, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nNew package for CI code\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46101, + "title": "[IPA-301] Adds new package `admin-reports`", + "branch": "add/ipa-301", + "merged_at": "2025-11-14T21:14:04Z", + "changed_files": 14, + "additions": 251, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nNew Package for reporting code\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46097, + "title": "Disable turbo telemetry", + "branch": "fix/disable-turbo-telemetry", + "merged_at": "2025-11-14T21:01:00Z", + "changed_files": 1, + "additions": 4, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixing Cache Accessing and \"WARNING Sending fatal alert BadCertificate\"\r\n\r\nRelates to: https://github.com/vercel/turborepo/issues/8626\r\n", + "labels": [] + }, + { + "number": 46103, + "title": "Remove unused `defaultModal` from Dashboard props", + "branch": "remove/dashboard-unused-defaultmodal", + "merged_at": "2025-11-14T20:46:58Z", + "changed_files": 4, + "additions": 3, + "deletions": 46, + "body": "Dashboard prop `defaultModal` was never passed in, so it and all it's logic is removed\r\n\r\ntest-env\r\nhttps://dashboard-unused-defaultmodal.mural.engineering/", + "labels": [] + }, + { + "number": 46079, + "title": "[IPA-205] Remove legacy reporting pages and related code", + "branch": "add/ipa-205", + "merged_at": "2025-11-14T20:33:05Z", + "changed_files": 34, + "additions": 30, + "deletions": 3480, + "body": "### Summary of Changes and Resources for the Reviewer\r\nhttps://mural.atlassian.net/browse/IPA-205\r\n\r\nRemoves reporting legacy code and all the Optimizely flags related to it\r\n\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally", + "labels": [] + }, + { + "number": 45986, + "title": "[CWI-2271] if enableAppRequest is true, then notifications to Admins are allowed. ", + "branch": "add/cwi-2271", + "merged_at": "2025-11-14T20:11:02Z", + "changed_files": 4, + "additions": 142, + "deletions": 20, + "body": "When `company.settings.enableAppRequest=false`, `companyAdminAppRequest` notifications are turned off and disabled with an information icon informing the user of the reason. When flipped, it automatically turns them on.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2271) to understand the context of this effort.\r\n\r\n![2025-11-06 09 41 41](https://github.com/user-attachments/assets/afbd24a1-479e-4ab2-afb8-874572a3e430)\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46054, + "title": "[NEXT-107] Package common types", + "branch": "package-common-types", + "merged_at": "2025-11-14T19:39:14Z", + "changed_files": 110, + "additions": 141, + "deletions": 174, + "body": "This PR migrates common type definitions from `src/common/types.ts` to a dedicated `@muralco/types `package, improving code organization and making these types available as a reusable internal package.\r\n\r\nKey Changes:\r\n\r\n- Migrated all type definitions from `src/common/types.ts` to `packages/types/src/common/`\r\n- Updated 100+ import statements across the codebase to use `@muralco/types`\r\n- Improved package configuration with proper exports and build settings", + "labels": [] + }, + { + "number": 46045, + "title": "[CAN-8108] Exclude affected widgets from stacking order lookup", + "branch": "fix/stacking-order-system", + "merged_at": "2025-11-14T19:16:45Z", + "changed_files": 4, + "additions": 327, + "deletions": 40, + "body": "### Summary of Changes and Resources for the Reviewer\r\nWhen the stacking order system gets triggered by a change in parenting we look for the highest available stacking order to assign it to the affected widget.\r\n\r\nHowever, if this higher value is in the widget itself, we still increase the value creating an unnecessary gap.\r\n\r\nIn this PR this situation is addressed so affected widgets are not included in the lookup.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8108)\r\n- \ud83e\uddea [**Testing environment**](https://stacking-order-system.mural.engineering)\r\n\r\n### How to test this?\r\n1. Enable the `ENABLE_STACKING_ORDER_SYSTEM` flag\r\n2. Create an area\r\n3. Add a sticky in the canvas\r\n4. Make not of the sticky's stacking order\r\n a. Given that the sticky is the last widget created, this should be the highest stacking order in the mural\r\n5. Drag or resize the area to contain the sticky\r\n6. Check that the stacking order of the sticky **did not change**\r\n\r\n_PR:_\r\n![Nov-12-2025 16-31-34](https://github.com/user-attachments/assets/e394b9e7-e705-4e46-aec9-7626ffb58bf6)\r\n\r\n_Master:_\r\n![Nov-12-2025 16-33-19](https://github.com/user-attachments/assets/7b4cc4cd-0998-4263-a1d5-f2b52a52c06f)\r\n\r\n", + "labels": [] + }, + { + "number": 46042, + "title": "Fix scrolling in AI hub panel all prompts and upgrade landing page", + "branch": "bug/ai-hub-scroll", + "merged_at": "2025-11-14T18:40:16Z", + "changed_files": 4, + "additions": 29, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nOn shorter screen sizes, the AI hub cannot scroll to the bottom in two scenarios\r\n1. Landing page w/ upgrade CTA displayed\r\n2. All prompts page for all users\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1480) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-hub-scroll.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Create a free account, open a mural\r\n 2. Open the AI hub\r\n 3. Confirm you can scroll to the bottom\r\n 4. Go to the all prompts page of the panel\r\n 5. confirm you can scroll to the bottom (repeat on your usual account)\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassi", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46085, + "title": "[CAN-7917] Fix resizing an area issue where it would absorb a connector unintentionally", + "branch": "fix/can-7917", + "merged_at": "2025-11-14T18:25:45Z", + "changed_files": 3, + "additions": 88, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Connector absorption test now covers the \u201cexpand over arrow, shrink back in one drag\u201d scenario and asserts the arrow gets de-parented.\r\n\r\n- _getAllRelatedArrowIds_ includes descendant arrows; _isArrowAbsorptionAffectingOperation_ stays active when any related arrow\u2019s parent changes.\r\n\r\n### Case Solved\r\n\r\nPerviously when resizing a free-form area across an adjacent arrow and then returning to the original bounds (without releasing the mouse) left the arrow parented to the area, even though the border no longer contained it. The connector absorption system stopped running as soon as the area\u2019s width/height matched the initial values, so _findNextParentId_ never re-ran to return null, and _updateArrowParent_ never emitted _removeParent_.\r\n\r\n### How the Change Fixes It\r\n\r\nArrow/connector parenting changes are now treated as an affecting operation. Whenever an area gains or loses arrow children\u2014either via intersections, direct connections, or existing absorbed descendants\u2014we keep the connector absorption system active until every related arrow\u2019s parent matches the pre-resize state. \r\n\r\nThe function _getAllRelatedArrowIds_ was extended to include descendant arrows so connectors already absorbed continue to be reevaluated, and _isArrowAbsorptionAffectingOperation_ watches those IDs for parent changes even if the area\u2019s size snaps back to its original dimensions mid-drag. \r\n\r\nThe regression test in _connectorAbsorptionSystem_ reproduces the exact drag scenario (grow width over the arrow, shrink back before release) and now asserts that the arrow parent is cleared.\r\n\r\n### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [JIRA](https://mural.atlassian.net/browse/CAN-7917) \r\n- \ud83e\uddea [ENV](https://can-7917.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 46089, + "title": "[NEXT-160] Move dashboard Page and Title components to packages", + "branch": "move/dashboardpage-package", + "merged_at": "2025-11-14T18:11:59Z", + "changed_files": 38, + "additions": 98, + "deletions": 63, + "body": "Move dashboard shell layout variable.sass to muralco/dashboard-legacy-ui.\r\nMove WorkspaceAvatar to muralco/dashboard.\r\nMove Page and Title components to muralco/dashboard-layout.\r\n\r\ntest-env https://dashboardpage-package.mural.engineering/", + "labels": [] + }, + { + "number": 46062, + "title": "[CWI-2366] [CWI-2365] [CWI-2363] CS Only Special Import", + "branch": "add/cwi-2366-browser-zip", + "merged_at": "2025-11-14T17:15:38Z", + "changed_files": 11, + "additions": 748, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWe (Workflows and Integrations / Integrated Workflows) are supporting the Customer Support team in some migration efforts by created a special import flow where they can upload multiple files from a specific source at once and extract data from within those files to save them _lots_ of manual effort.\r\n\r\nAs this is a one-off, hidden experience just for Mural, I chose to _duplicate_ the existing PDF Import component rather than introduce a whole bunch of conditional logic around the two experiences.\r\n\r\nThis feature is controlled by the [feat-user-cs-only-import](https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-user-cs-only-import/) flag. It is currently _on_ for development only.\r\n\r\nSee this [Loom video](https://www.loom.com/share/a3ddc801f05146debb276be4036ee345) for more details.\r\n\r\n#### Reviewer Resources\r\nPlease review these Jira tickets for this effort (I did all of these in one change set):\r\n- https://mural.atlassian.net/browse/CWI-2366\r\n- https://mural.atlassian.net/browse/CWI-2365\r\n- https://mural.atlassian.net/browse/CWI-2363\r\n\r\n\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review t", + "labels": [] + }, + { + "number": 45899, + "title": "Play 710: Add View Only mode to Salesforce Embed Integration", + "branch": "play-710", + "merged_at": "2025-11-14T16:42:55Z", + "changed_files": 8, + "additions": 112, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request introduces a new \"Salesforce View-Only\" mode to Mural, enabling a read-only experience specifically for users accessing Mural via the Salesforce Embed integration. The changes include detection and enforcement of this mode, UI updates to inform users of their access level, and updates to permissions logic to ensure editing is disabled when in this mode.\r\n\r\nhttps://mural.atlassian.net/browse/PLAY-710\r\n\r\nhttps://www.loom.com/share/9874f42120d24dff8a21c5e4cf460079", + "labels": [] + }, + { + "number": 46096, + "title": "Add comprehensive documentation for DOMPurify 3.3.0 update", + "branch": "copilot/sub-pr-46095", + "merged_at": "2025-11-14T16:39:47Z", + "changed_files": 0, + "additions": 0, + "deletions": 0, + "body": "## DOMPurify Version Update: 3.2.5 \u2192 3.3.0\n\n### Overview\nThis PR addresses feedback from [PR #46095](https://github.com/tactivos/murally/pull/46095) by providing comprehensive documentation for the dompurify dependency update.\n\n### Changelog & Release Information\n- **Release Date**: October 13, 2025\n- **Official Release Notes**: [DOMPurify 3.3.0 Release](https://github.com/cure53/DOMPurify/releases)\n- **NPM Package**: [dompurify@3.3.0](https://www.npmjs.com/package/dompurify/v/3.3.0)\n\n### Reason for Update\n**Update Type**: Feature enhancement + security improvements\n\n**Key Changes in 3.3.0**:\n1. **SVG mask-type attribute allowed** - The SVG `mask-type` attribute is now included in the default allow-list\n2. **Dynamic allow-list modification** - `ADD_ATTR` and `ADD_TAGS` now accept functions for runtime customization\n3. **Slot element fix** - Resolved inconsistencies where `slot` element appeared in both SVG and HTML allow-lists\n4. **No breaking changes** - Fully backward compatible with 3.2.5\n\n**Security Considerations**:\n- Resolves CVE-2025-48050 (path traversal in development script, not production-impacting)\n- No critical vulnerabilities in 3.2.5 or 3.3.0\n- Update recommended for ongoing security improvements\n\n### JIRA Ticket\n**TODO**: [TICKET-NUMBER] - Please fill in the corresponding JIRA ticket\n\n### Testing Status \u2705\n- [x] Verify compatibility with custom hooks in `packages/mural-utils/src/sanitize-svg.ts`\n- [x] Verify compatibility with DOMPurify configuration in `src/start.tsx`\n- [x] Verify new 3.3.0 features (dynamic allow-list, SVG mask-type attribute)\n- [x] Test scoped DOMPurify instance creation\n- [x] Test custom hooks for SVG use elements\n- [x] Test global DOMPurify configuration\n\n**Testing Results**:\nAll compatibility tests passed successfully. The update is fully compatible with existing DOMPurify usage patterns:\n- \u2705 Scoped DOMPurify instances work correctly\n- \u2705 Custom hooks (`beforeSanitizeElements`, `uponSanitizeElement`, `uponSanitizeAttribute`) func", + "labels": [] + }, + { + "number": 46066, + "title": "[NEXT-204] Migrate AboutYou route to RequireAuth", + "branch": "refactor/about-you-route-auth", + "merged_at": "2025-11-14T16:02:10Z", + "changed_files": 2, + "additions": 57, + "deletions": 28, + "body": "https://about-you-route-auth.mural.engineering/\r\n\r\n- Clean up `RequireAuth`\r\n- Replace `withAuthenticatedUser()` HOC with `` in `/about-you` route", + "labels": [] + }, + { + "number": 46092, + "title": "ENGAGE-1413 Fix rigv2 tests that weren't asserting redirects correctly", + "branch": "add/v2-test-fix", + "merged_at": "2025-11-14T15:30:33Z", + "changed_files": 2, + "additions": 2, + "deletions": 17, + "body": "## Pull Request Overview\r\n\r\nSeba is working on fixing the routes issue and will have more changes in the next week or so. We can tackle the remaining ignore tests at that point.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1413\r\n\r\nThis PR aims to fix test issues by removing `@ignore` tags and updating URL assertions in Cucumber feature files. However, several of the URL changes appear to contradict the test scenario descriptions, potentially making the tests validate incorrect behavior.\r\n\r\n### Key Changes\r\n- Removed multiple `@ignore` tags from test scenarios that were previously failing\r\n- Updated expected redirect URLs across multiple test files\r\n- Modified URL assertions in registration and deprecation flows\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/test/react-new/features/registration/start-from-template.feature | Removed @ignore tag and truncated expected template URL in redirect assertion |\r\n| src/test/react-new/features/registration/signin/reset-password.feature | Removed @ignore tags and updated redirect from `/reset-password` to `/too-many-attempts` |\r\n| src/test/react-new/features/registration/create-team/invite-team.feature | Removed @ignore tag and changed expected redirect from dashboard to `/about-you` |\r\n| packages/deprecation/features/v2/deprecations.feature | Removed @ignore tags and changed expected redirects from `/` to `/cannot-create-workspace` |", + "labels": [] + }, + { + "number": 45844, + "title": "ENGAGE-1137 - Adopt ActionsManager Pattern for Folder actions", + "branch": "add/engage-1137", + "merged_at": "2025-11-13T23:59:34Z", + "changed_files": 44, + "additions": 1783, + "deletions": 1167, + "body": "Test env - https://engage-1137.mural.engineering\r\n---\r\n## Pull Request Overview\r\n\r\nThis PR refactors folder actions to adopt the ActionsManager pattern, consolidating folder action handling and eliminating legacy modal management code. The changes centralize folder action logic (Move and Delete) into registration files that follow the same pattern as the existing Rename action.\r\n\r\nKey changes:\r\n- Introduced `moveFolderActionRegistration` and `deleteFolderActionRegistration` to handle move and delete folder actions\r\n- Removed legacy folder action constants and modal management code from multiple components\r\n- Added folder events (`deleted` and `moved`) to `DashboardFolderEventStore` for better event handling\r\n- Updated test selectors from generic button identifiers to action-specific identifiers (e.g., `menu-item-move-button` \u2192 `menu-item-move-folder`)\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 19 out of 19 changed files in this pull request and generated 2 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| move.feature | Updated test selectors to use action-specific identifier `menu-item-move-folder` |\r\n| delete.feature | Updated test selectors to use action-specific identifier `menu-item-delete-folder` |\r\n| room-menus/index.tsx | Removed `handleFolderAction` and `openModal` props as actions are now self-contained |\r\n| folder-menu/index.tsx | Simplified to only handle new ActionsManager pattern, removed legacy modal handling |\r\n| room-view/index.tsx | Removed `handleFolder` prop and blank lines for cleaner formatting |\r\n| room-v2/index.tsx | Removed legacy modal state/handlers and integrated new action registrations |\r\n| useDeleteFolderModal.tsx | Deleted hook as functionality moved to action registration |\r\n| useDeleteFolderModal.test.tsx | Deleted tests for removed hook |\r\n| description.test.tsx | Removed `handleFolderAction` from test props |\r\n| rooms/actions.tsx | Removed `handleFolderAction` ", + "labels": [] + }, + { + "number": 46032, + "title": "ENGAGE-1406 - Add test for toast \"Changes saved\" in Share Modal", + "branch": "add/engage-1406", + "merged_at": "2025-11-13T23:43:33Z", + "changed_files": 2, + "additions": 735, + "deletions": 459, + "body": "## Pull Request Overview\r\n\r\nThis PR adds comprehensive test coverage for the \"Changes saved\" toast notification that appears in the Share Modal when updating share settings. The tests verify that the success notification displays correctly when changing access levels and does not appear when the API call fails.\r\n\r\n**Key changes:**\r\n- Added a new test suite `handleUpdateShareSettings notification` with 5 test cases\r\n- Tests cover success scenarios (restricted access, workspace access) and failure scenarios\r\n- Reordered `permission` and `permissionLevel` properties in `shareConfigMock` for consistency", + "labels": [] + }, + { + "number": 45964, + "title": "[NEXT-203] Move sdk modals to package", + "branch": "add/modals-to-sdk-types", + "merged_at": "2025-11-13T23:26:18Z", + "changed_files": 20, + "additions": 21, + "deletions": 29, + "body": "### Summary of Changes and Resources for the Reviewer\r\nMove sdk modals types to sdk-types\r\n\r\n[test environment](https://modals-to-sdk-types.mural.engineering/)\r\n\r\nJira: https://mural.atlassian.net/browse/NEXT-203", + "labels": [] + }, + { + "number": 46084, + "title": "Add tiger team as CODEOWNER for package.json", + "branch": "update-codeowners-package", + "merged_at": "2025-11-13T23:06:08Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "Adds `@tactivos/modularization-tiger-team` to `package.json` reviews", + "labels": [] + }, + { + "number": 46055, + "title": "[NEXT-207] Refactor/dashboard view. Remove unused functions and state variables", + "branch": "refactor/dashboard-view", + "merged_at": "2025-11-13T22:07:43Z", + "changed_files": 2, + "additions": 4, + "deletions": 111, + "body": "remove the unused functions and state variables from DashboardView", + "labels": [] + }, + { + "number": 46061, + "title": "Add ca-certificates to Dockerfile dependencies", + "branch": "update/add-ca-cert-update", + "merged_at": "2025-11-13T21:31:49Z", + "changed_files": 2, + "additions": 2, + "deletions": 0, + "body": "feat(docker): include ca cert update on image build\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](htt", + "labels": [] + }, + { + "number": 46002, + "title": "[SCQM-1468] Fix extra widget undo when suggesting title", + "branch": "fix/extra-undo-suggest-title", + "merged_at": "2025-11-13T21:00:58Z", + "changed_files": 2, + "additions": 84, + "deletions": 60, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, when undoing suggest title the blank widget hung around. This removes that. When undoing a suggested title, no widgets should remain, the placeholder creation and updating of the placeholder should happen in the same commit. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1468) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://extra-undo-suggest-title.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Suggest title\r\n2. Undo\r\n3. Verify entire title widget is deleted\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46001, + "title": "[SCQM-1323] Company colors UI and copy updates based on product feedback", + "branch": "update/company-colors-admin-ui", + "merged_at": "2025-11-13T20:34:01Z", + "changed_files": 5, + "additions": 18, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUpdates copy and some minor UI based on recent feedback from the product team.\r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1323) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [] + }, + { + "number": 46036, + "title": "[ESC-1796] Fix avatar-related \"Could not load img\" errors in v2 tests", + "branch": "fix/esc-1796-test-avatar-errors", + "merged_at": "2025-11-13T20:12:56Z", + "changed_files": 6, + "additions": 39, + "deletions": 32, + "body": "Jira: [ESC-1796](https://mural.atlassian.net/browse/ESC-1796)\r\n\r\n### Summary\r\n\r\nUpdate the user and workspace avatar endpoint URL matching to avoid console errors like the following when running the v2 tests:\r\n\r\n Error: Could not load img: \"http://localhost:8080/api/v0/user/Brain_Howell89/avatar\"\r\n at onErrorWrapped (/usr/src/node_modules/jsdom/lib/jsdom/browser/resources/per-document-resource-loader.js:38:19)\r\n at Object.check (/usr/src/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:72:23)\r\n at /usr/src/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:83:27\r\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\r\n ...\r\n\r\nFor reference, the legacy avatar endpoints were updated in https://github.com/tactivos/murally/pull/37719.\r\n\r\nExample failed test run that shows these errors: https://github.com/tactivos/murally/actions/runs/19304601907/job/55211311153\r\n\r\nAlso see Slack conversation: https://mural.slack.com/archives/C090UR8T7KN/p1757607778994679.\r\n\r\n[ESC-1796]: https://mural.atlassian.net/browse/ESC-1796?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Update jsdom resource loader to match user/workspace avatar endpoints and return a default avatar; extract shared test constants and update imports.\n> \n> - **Tests/Setup**:\n> - Extract shared constants (`MURAL_TEST_URL`, `INITIAL_INNER_HEIGHT`, `INITIAL_INNER_WIDTH`) to `src/test/react-new/setup/constants.ts` and refactor imports in `init-jsdom-global.ts`, `init-rig.ts`, and step definitions.\n> - **Resource Loading (`setup/jsdom-resource-loader.ts`)**:\n> - Add regex-based matching for avatar endpoints (`/api/v0/user/:username/avatar`, `/api/v0/workspaces/:workspaceId/avatar`) and serve `static/images/avatar-default.png`.\n> - Switch to `jsdom` `ResourceLoader` with proper `FetchOptions`; guard iframe fetch; use `node:path`/`node:p", + "labels": [] + }, + { + "number": 46039, + "title": "[CAN-8046] Show share button as ghost inverse icon button in inverse toolbars", + "branch": "add/can-8046", + "merged_at": "2025-11-13T19:47:27Z", + "changed_files": 1, + "additions": 42, + "deletions": 26, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nShow the share button as a ghost inverse icon button (MrlIconButton) in inverse toolbars (UTILITIES_PRIVATE_MODE and UTILITIES_VOTING_MODE), while keeping the primary button (MrlButton) in the regular utilities toolbar.\r\n\r\n\r\nBefore:\r\n\r\n\"image\"\r\n\r\nAfter:\r\n\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8046) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8046.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 46053, + "title": "[NEXT-206] Dashboard: Remove prop-drilled ModalOpen function, prefer use func from ModalsStore instead ", + "branch": "update/dashboardmodals-open-refs", + "merged_at": "2025-11-13T18:29:36Z", + "changed_files": 30, + "additions": 60, + "deletions": 94, + "body": "Use ModalsStore context to access the `open()` function instead of prop drilling.\r\nAlso consolidate and rename the duplicate types. Now it's just `DashboardModalName`\r\n\r\ntest-env\r\nhttps://dashboardmodals-open-refs.mural.engineering/", + "labels": [] + }, + { + "number": 46050, + "title": "[SCQM-1439] Fix outline item sans instructions height", + "branch": "fix/outline-height", + "merged_at": "2025-11-13T18:04:19Z", + "changed_files": 2, + "additions": 91, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPreviously, after removing instructions from an outline item, its height would remain the same increased size as when it had instructions. This is due to the string containing empty html tags when cleared which bypassed the truthy check. To fix, it's now checking for plaintext. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1439) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://outline-height.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Add instructions to an outline item and save\r\n2. Clear instructions and save \r\n3. Verify the height of the outline item returns to the height it was prior to adding instructions\r\n4. Add a really long set of instructions to an outline item and save (maybe throw a video link in there too) - note the gradient is applied\r\n5. Clear instructions and save\r\n6. Verify the gradient doesn't show up (see comment below)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46011, + "title": "[ESC-1782] archived murals: Add \"beta\" label", + "branch": "add/esc-1782-archived-murals-beta-label", + "merged_at": "2025-11-13T17:40:12Z", + "changed_files": 4, + "additions": 55, + "deletions": 2, + "body": "Jira: [ESC-1782](https://mural.atlassian.net/browse/ESC-1782)\r\n\r\n### Summary\r\n\r\nAdd \"Beta\" label to the Archived murals page header and the profile menu.\r\n\r\n\"image\"\r\n\r\n[ESC-1782]: https://mural.atlassian.net/browse/ESC-1782?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ\r\n\r\n\n\n---\n\n> [!NOTE]\n> Show a \"Beta\" badge for Archived murals in the page header and the profile menu item, with tests.\n> \n> - **Frontend**\n> - **Archived murals page**: Add `MrlBadge` \"Beta\" to header in `packages/dashboard/archived-murals/src/archived.tsx`.\n> - **Config menu**:\n> - Update `LinkMenuItem.tsx` to accept `isBeta` and render `MrlBadge` when true.\n> - Mark `archivedMuralsLink` as `isBeta: true` in `src/dashboard/layout/config-menu/configs.ts`.\n> - **Tests**\n> - Add Beta badge rendering tests in `src/dashboard/layout/config-menu/ConfigMenu.test.tsx`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 11a1e416d3f6b616f0cf087b1ffaa264b8e69f82. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 46052, + "title": "[NEXT-159] New muralco/dashboard-layout package. Move dashboard variables.sass to dashboard-legacy-ui package. ", + "branch": "move/dashboardvariables-sass-package", + "merged_at": "2025-11-13T17:15:48Z", + "changed_files": 29, + "additions": 256, + "deletions": 16, + "body": "First commit: move high level dashboard sass variables file to dashboard-legacy-ui package.\r\nSecond commit: create new @muralco/dashboard-layout component and move Layout.Container/Row/Item/etc to package\r\n\r\ntest-env: https://dashboardvariables-sass-package.mural.engineering/", + "labels": [] + }, + { + "number": 46057, + "title": "Add call to check-content to fix LODs - CWI-2373", + "branch": "stable-fix/missing-lods-import", + "merged_at": "2025-11-13T16:53:44Z", + "changed_files": 6, + "additions": 29, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdd call to check-content endpoint to check content (for now that endpoint checks if there are missing LODs to recalculate them).\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pag", + "labels": [] + }, + { + "number": 46037, + "title": "[stop-presentation] set mode bug fix", + "branch": "bug/hide-start-presentation", + "merged_at": "2025-11-13T16:00:29Z", + "changed_files": 2, + "additions": 7, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, when presentation was stopped, we always assumed we should set the mode to 'edit'. This was incorrectly assumed to be the previous mode in all cases.\r\n\r\nNow, with these changes, we utilize the outermost closure of the dispatcher createApi function to store a reference to the previousMode. We initialize this and then reset it on start(). Then when its time to end, we revert the mode back to what it was prior to the presentation starting.\r\n\r\nNOTE: this bug was introduced by the desire to increase the visibility of the \"Present\" button. Our guiding principle, from a product perspective, was to only hide the \"present\" button in the side bar when a presentation was active. This is a signficant and intentional UX change. We keep this UX in this fix to maintain adherence to this principle.\r\n\r\nNOTE: you can also start presentation mode from the topbar with one click. The visibility of this button is different because the entire top bar is hidden in many cases. So it would be inappropriate to adhere to the same principle for that button\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/e58540e231154e8bb1a5ec532e80e0bf) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://hide-start-presentation.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not fol", + "labels": [] + }, + { + "number": 46010, + "title": "[CWI-2360] Update Jira integration to use the new Card widget", + "branch": "add/cwi-2360", + "merged_at": "2025-11-13T15:22:42Z", + "changed_files": 28, + "additions": 326, + "deletions": 97, + "body": "### Summary of Changes and Resources for the Reviewer\r\nUpdate Jira integration to use the new Card widget\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2360\r\n\r\n#### Related PRs\r\nhttps://github.com/tactivos/mural-integrations/pull/1638", + "labels": [] + }, + { + "number": 46044, + "title": "[CAN-8125] Pan canvas in mouse mode when left click + dragging on empty space of areas", + "branch": "fix/can-8125", + "merged_at": "2025-11-13T14:59:25Z", + "changed_files": 4, + "additions": 56, + "deletions": 32, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates `shouldStartMarqueeInAreaInMouseMode` to check for children before checking if borders are outside viewport. Before this PR the function checked if all borders are outside the viewport and returned true to allow marquee, but it didn't check if the area had children first.\r\n\r\nThis only applies when areas improvements flag is enabled.\r\n\r\n![Nov-12-2025 16-29-36](https://github.com/user-attachments/assets/fe79940b-e81f-460a-8f79-9c36eb397674)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8125\r\n- Env: https://can-8125.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46023, + "title": "[CAN-7699] Enabled thumbnailURLs to propagate into photoURLs when editing link photoWidgets.", + "branch": "fix/can-7699", + "merged_at": "2025-11-13T13:26:19Z", + "changed_files": 1, + "additions": 19, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nEnabled thumbnailURLs to propagate into photoURLs when editing link photoWidgets. This allows a image of a photoWidget to change after editing its thumbnail.\r\n\r\n### Case Solved\r\n\r\nPreviously, when a user pasted a link on the canvas and later manually changed the thumbnail image for that link widget, the new image would not appear on the canvas.\r\nThis issue occurred because link widgets render their thumbnail image from the photoURL property, but manual thumbnail edits were only updating the thumbURL field. As a result, the UI continued to display the old photoURL image instead of the newly entered thumbnail.\r\n\r\n### How the Change Fixes It\r\n\r\nThe fix ensures that when a thumbnail is manually changed for a link widget, the new thumbnail URL is validated and then propagated to the photoURL field as well.\r\n\r\nSpecifically:\r\n\r\nWhen setThumb() is called, the widget\u2019s thumbURL is updated as before.\r\n\r\nIf the widget is a link(specific use case asked for the ticket) and the new thumbnail URL is valid, the same value is also applied to photoURL.\r\n\r\nThis ensures that the renderer, which relies on photoURL, immediately reflects the updated thumbnail image.\r\n\r\nInvalid URLs are safely ignored to prevent breaking existing images.\r\n\r\n#### Reviewer Resources\r\n[**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7699) \r\n[ENV](https://can-7699.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 46047, + "title": "[EN-3552] Workspace settings: update pending request title to be sentence case", + "branch": "fix/en-3552", + "merged_at": "2025-11-12T21:46:35Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\nSimple copy change to make title sentence case\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3552) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3552.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 46048, + "title": "[NEXT-161] Move FoldersEmptyMessage to package", + "branch": "move/folderemptymessage-package", + "merged_at": "2025-11-12T21:23:50Z", + "changed_files": 5, + "additions": 18, + "deletions": 17, + "body": "\"image\"\r\n\r\n\"image\"\r\n\r\ntest-env: https://folderemptymessage-package.mural.engineering/", + "labels": [] + }, + { + "number": 45863, + "title": "[SCQM-1455] Timer is based on local time instead of coordinated time", + "branch": "add/server-realtime-timer", + "merged_at": "2025-11-12T20:44:11Z", + "changed_files": 11, + "additions": 1168, + "deletions": 78, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the Timer code ran based on each individual user's browser's datetime - using `Date.now()` to calculate how much time remained, despite being sent an `initialTimestamp` that is server-based.\r\n\r\nNow, with these changes, the server adds `remainingSeconds` and `serverTimestamp` fields to allow each individual browser to instead calculate their divergence from the server time, and track the remaining time accurately.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1455) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://server-realtime-timer.mural.engineering/) to perform a smoke test.\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes\r\n1. ...\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14752)\r\n\n\n---\n\n> [!NOTE]\n> Timer now derives remaining time from server timestamps and facilitator heartbeat broadcasts, with clients broadcasting/receiving TIMER_TICK and UI computing accurate, skew-resistant countdowns.\n> \n> - **Timer sync and broadcast**:\n> - Add `Timer` fields: `remainingSeconds`, `serverTimestamp`, optional `lastTick`, and nullable `pausedTimestamp`.\n> - Dispatcher timer API: broadcast `TIMER_TICK` every second from starter; stop on pause/stop/finish; add `receiveTick(...)` to store facilitator ticks; export `TIMER_TICK_INTERVAL_MS`; cleanup on dispose.\n> - **Realtime integration**:\n> - Register P2P handler for `TIMER_TICK` and forward to `dispatcher.facilitation.timer.receiveTick`.\n> - Allow own-socket `UPDAT", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46043, + "title": "[CAN-7997] Add Widget Type Label to Fixed widget toolbar", + "branch": "add/can-7997-widget-type-label", + "merged_at": "2025-11-12T20:23:08Z", + "changed_files": 4, + "additions": 81, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds WidgetTypeLabel to the fixed widget toolbar\r\n\r\n\"image\"\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-7997)\r\n[Test Env](https://can-7997-widget-type-label.mural.engineering/)\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.", + "labels": [] + }, + { + "number": 46041, + "title": "feat: edit apiurl from turbo config", + "branch": "add/edit-apiurl-turborepo-remote-cache", + "merged_at": "2025-11-12T20:02:22Z", + "changed_files": 2, + "additions": 3, + "deletions": 3, + "body": "https://mural.atlassian.net/browse/PE-6013", + "labels": [] + }, + { + "number": 45973, + "title": "[CWI-2358] Card Widget - Make the text grow with the widget", + "branch": "update/cwi-2358", + "merged_at": "2025-11-12T19:40:23Z", + "changed_files": 19, + "additions": 145, + "deletions": 73, + "body": "### Summary of Changes and Resources for the Reviewer\r\nCard Widget - Make the text grow with the widget\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2358\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-render/pull/1451\r\nhttps://github.com/tactivos/mural-api/pull/14831", + "labels": [] + }, + { + "number": 46026, + "title": "fix: payments details in writing mode when no payment method in edit \u2026", + "branch": "add/ecomm-270", + "merged_at": "2025-11-12T19:28:36Z", + "changed_files": 3, + "additions": 28, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI allow writing state in payment details when the user edit plan, and the user hasn't a default payment method.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-270) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Records\r\nhttps://www.loom.com/share/a92d6dc2821b4753b35ab583d5bae571", + "labels": [] + }, + { + "number": 46040, + "title": "[stable-fix] [SCQM-1466] Remove `textResult` sending to datadog", + "branch": "stable-fix/mermaid-logging-removal", + "merged_at": "2025-11-12T19:14:49Z", + "changed_files": 2, + "additions": 0, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes we were sending user data accidentally to datadog.\r\n\r\nNow, with these changes, we won't send the explicit, full error data that includes user input.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1466) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46029, + "title": "[CAN-7168] Update the canvas menus to the compact version from the UI Toolkit", + "branch": "add/can-7168", + "merged_at": "2025-11-12T19:09:32Z", + "changed_files": 3, + "additions": 3, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes we were using the default spacing for the lock menu, context menu and current zoom menus. Now we are using the compact spacing.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7168) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-7168.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n", + "labels": [] + }, + { + "number": 46028, + "title": "[ENGAGE-1389] Move MuralsGrid to package", + "branch": "move/muralsgrid-package", + "merged_at": "2025-11-12T18:37:55Z", + "changed_files": 9, + "additions": 31, + "deletions": 11, + "body": "Move MuralsGrid to dashboard-room-page package\r\n\r\ntest-env: https://muralsgrid-package.mural.engineering/", + "labels": [] + }, + { + "number": 46031, + "title": "[CAN-8067] Make voting Start button primary", + "branch": "add/can-8067", + "merged_at": "2025-11-12T18:19:11Z", + "changed_files": 1, + "additions": 1, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nBefore:\r\n\"image\"\r\n\r\nAfter:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8067) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8067.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n", + "labels": [] + }, + { + "number": 46022, + "title": "[ENGAGE-1414] Fix quickly skip first-login questions", + "branch": "fix/quickly-skip-questions", + "merged_at": "2025-11-12T18:03:39Z", + "changed_files": 1, + "additions": 5, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug where users could quickly click the Skip button on the last question of the first-login flow, causing an array out-of-bounds error. The fix conditionally renders the Skip button only when there are remaining questions to skip.\r\n\r\n- Adds a conditional check to disable the Skip button when all questions have been answered\r\n- Prevents an array access error in the `onSkip` function that occurs when `activeStep >= questions.length`\r\n- Maintains consistency with the existing pattern used for the Back button\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1414) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/66d905ea533348efbbaf82646e25d04b) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://quickly-skip-questions.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [thes", + "labels": [] + }, + { + "number": 46019, + "title": "Move DashboardBlankState to dashboard/room-page package", + "branch": "move/dashboardblankstate-package", + "merged_at": "2025-11-12T17:01:01Z", + "changed_files": 9, + "additions": 15, + "deletions": 11, + "body": "Move DashboardBlankState to @muralco/dashboard-room-page package (only used by RoomPage's MuralsGrid)\r\n\r\nAlso moves LazyImage (only used by blank state) and GeneratingPreview icon\r\n\r\ntest-env\r\nhttps://dashboardblankstate-package.mural.engineering/", + "labels": [] + }, + { + "number": 46012, + "title": "[CAN-8096, CAN-7910] Fix/lock tool", + "branch": "fix/lock-tool", + "merged_at": "2025-11-12T16:39:27Z", + "changed_files": 3, + "additions": 85, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[Jira 1](https://mural.atlassian.net/browse/CAN-8096) \r\n- Remove double arrows\r\n\r\n[Jira 2](https://mural.atlassian.net/browse/CAN-7910)\r\n- Change conditionals for lock tool so that tool is not visible for connectors in mindmaps\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's ", + "labels": [] + }, + { + "number": 45978, + "title": "[ESC-1761] Add isDryRun property to JobRun", + "branch": "add/esc-1761", + "merged_at": "2025-11-12T16:15:34Z", + "changed_files": 6, + "additions": 135, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n- Add isDryRun property to JobRun\r\n\r\n#### Modal \r\n\"image\"\r\n\r\n#### Job Run table\r\n\r\n\"image\"\r\n\r\nmural-api PR: https://github.com/tactivos/mural-api/pull/14806\r\n", + "labels": [] + }, + { + "number": 46007, + "title": "[CAN-7995, CAN-7999] Added MrlSelect to font family", + "branch": "add/can-7995-font-family", + "merged_at": "2025-11-12T15:45:00Z", + "changed_files": 5, + "additions": 279, + "deletions": 23, + "body": "[Jira 1](https://mural.atlassian.net/browse/CAN-7995)\r\nThe font family was using a legacy select and was also calculating positioning for the dropdown menu since it was part of the floating widget toolbar. Was able to simplify all of this with just using an MrlSelect in the fixed widget toolbar\r\n\r\n[Jira 2](https://mural.atlassian.net/browse/CAN-7999)\r\nSplit horizontal and vertical alignment tools into seperate menus\r\n\r\n[Test Env](https://can-7995-font-family.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 46025, + "title": "[CAN-8110] Fix paste content with background styles into lexical", + "branch": "fix/can-8110", + "merged_at": "2025-11-12T15:31:44Z", + "changed_files": 2, + "additions": 7, + "deletions": 64, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug where pasted HTML content with transparent background colors (such as content copied from Google Docs) resulted in text nodes with black backgrounds in the lexical editor (see video)\r\n \r\n\r\n## Problem\r\n\r\nWe received a report that text copied from Google Docs into the lexical editor appeared with a black background. This issue was introduced in [PR #45652](https://github.com/tactivos/murally/pull/45652).\r\n\r\nThe problem occurred due to two reasons:\r\n\r\n1. **Background color application**: When we added `` element support, we started setting the `background-color` style in `applyFormatToTextNode` . However, background colors are not supported for text content outside of mark elements in Mural (background colors apply to the widget background, not the text).\r\n\r\n2. **Transparent color parsing**: The `convertColorToHex` function didn't handle named colors like `'transparent'`, which caused it to default to `#000000` (black) when parsing transparent background colors.\r\n\r\n## Solution\r\n\r\nSince we are not supporting background colors for text content outside of mark elements yet, this PR rolls back the change in `applyFormatToTextNode` to only support `color` (not `backgroundColor`).\r\n\r\nThe second issue (parsing transparent background colors) is no longer a problem for non-mark elements since we now ignore background colors entirely.\r\n\r\n## Note on Mark Elements\r\nMark elements are unaffected by this change. They use a separate `highlightColor` property in Lexical's `MuralTextNodes` (not the `background-color` style), so they continue to work correctly.\r\n\r\nMark elements without a `background-color` attribute or with named colors will default to `#000000`. This is intentional\u2014we do not parse HTML for mark elements, as they were designed to work with explicit background and color values. This basic implementation enables BSH to import their Miro boards to Mural.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please", + "labels": [] + }, + { + "number": 45995, + "title": "[CWI-2359] Add user notification step for tag replacement in Jira integration flow", + "branch": "update/cwi-2359", + "merged_at": "2025-11-12T15:15:52Z", + "changed_files": 1, + "additions": 7, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd user notification step for tag replacement in Jira integration flow\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2359", + "labels": [] + }, + { + "number": 46027, + "title": "[CAN-7921] Enable nesting of free-form areas", + "branch": "add/enable-nested-areas", + "merged_at": "2025-11-12T14:44:58Z", + "changed_files": 25, + "additions": 314, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\n\nThis PR enables nesting of free-form areas within other areas, implementing support for parent-child relationships between freeform area widgets. \nThe feature is gated behind the `enable-nested-areas` feature flag.\n\n_(Copilot description FTW)_\n\nExpectation for this work is that free-form areas should now behave as any other absorbable widget while the flag is enabled.\n\n#### Reviewer Resources\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7921)\n- \ud83e\uddea [**Testing environment**](https://enable-nested-areas.mural.engineering)", + "labels": [] + }, + { + "number": 46030, + "title": "[CAN-8111] Fix stacking order on area resize when stacking order system is enabled", + "branch": "fix/can-8111-single-line", + "merged_at": "2025-11-12T14:24:46Z", + "changed_files": 2, + "additions": 30, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThere was a bug where, when an area was resized and absorbed widgets, on resize end the stacking order received an extra unnecessary update. During onResize, widgets were absorbed when they overlapped the area, and the stacking order system ran correctly using the stage's initialStore (from resize start). However, onResizeEnd called addWidgetsIntoClusterWithoutCheckingForConsistency, which set the parent again for widgets that already had it set.\r\n\r\n![pr](https://github.com/user-attachments/assets/99cc11ac-e3bd-4c97-939e-d9eba053e39d)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8111\r\n- Env: https://can-8111-single-line.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46024, + "title": "Improve redirect test reliability", + "branch": "fix/redirects-timeout", + "merged_at": "2025-11-12T14:09:59Z", + "changed_files": 4, + "additions": 9, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request standardizes the step timeout configuration across the Cucumber test setup in Test rig v2. And share this definition with a `browser redirects to` step that becomes flaky due to the default timeout after being fixed.\r\n\r\n\r\n### Relevant Links \ud83d\udd17\r\n- Improves changes made in https://github.com/tactivos/murally/pull/45988\r\n", + "labels": [] + }, + { + "number": 45969, + "title": "[CAN-8062] Use revision range to handle chained WidgetStore updates", + "branch": "fix/can-8062", + "merged_at": "2025-11-11T22:07:51Z", + "changed_files": 19, + "additions": 612, + "deletions": 218, + "body": "**[CAN-8062 Dragging 1000 widgets over an area](https://mural.atlassian.net/browse/CAN-8062)**\r\n\r\nAdded `flush()` method to `ActionBuilder` which applies all the collected changes to the store. Also added support of effective way to add actions from one builder to another in cases when `builder1.currentStore === builder2.initialStore`.\r\n\r\nThe environment: https://can-8062.mural.engineering/\r\n\r\n## Before (dragging 1000 widgets over an area):\r\n\r\n\"image\"\r\n\r\n## After (dragging 1000 widgets over an area):\r\n\r\n\"image\"", + "labels": [] + }, + { + "number": 46021, + "title": "[CAN-8119] Use correct coordinates for starting marquee selection inside an area", + "branch": "fix/can-8119", + "merged_at": "2025-11-11T16:39:51Z", + "changed_files": 3, + "additions": 16, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug that appeared in some specific cases because of a race condition that caused that starting marquee select inside an area with areas improvements flag enabled would not update the internal mouse manager state correctly so `dragStartX` and `dragStartY` were outdated. Furthermore, all other marquee selections use the implementation we are adding to this one, using `clientX` and `clientY`, there was no reason to use the other, error prone, variables.\r\n\r\nIt's a very hard to reproduce bug.\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8119\r\n- Env: https://can-8119.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45925, + "title": "[CAN-8005] Prevent widget toolbar to collide with the fixed toolbar", + "branch": "add/can-8005", + "merged_at": "2025-11-11T16:26:38Z", + "changed_files": 5, + "additions": 305, + "deletions": 64, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n Prior to these changes the widget toolbar used to overlap the fixed toolbar\r\n Now, with these changes, it render correctly.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8005) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8005.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](http", + "labels": [] + }, + { + "number": 46008, + "title": "[CAN-8115] Remove ampersand from sdk.selection.list", + "branch": "refactor/cleanup-amp", + "merged_at": "2025-11-11T15:08:51Z", + "changed_files": 4, + "additions": 70, + "deletions": 68, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR rewrites `getRelatedArrows` to avoid the need of ampersand models and refactors `sdk.selection.list` to make it easier to understand and remove all ampersand dependencies.\r\n\r\nThere must be no behavior changes.\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8115\r\n- Env: https://cleanup-amp.mural.engineering\r\n", + "labels": [] + }, + { + "number": 46015, + "title": "[ENGAGE-1265] create muralco/dashboard-isinview package", + "branch": "move/isinview-package", + "merged_at": "2025-11-11T01:01:44Z", + "changed_files": 20, + "additions": 377, + "deletions": 11, + "body": "Move IsInView and useIntersectionObserver to new package @muralco/dashboard-isinview", + "labels": [] + }, + { + "number": 46016, + "title": "[beta-fix] [SCQM-1466] Add mermaid worker error logging to datadog", + "branch": "beta-fix/mermaid-worker-error-info", + "merged_at": "2025-11-11T00:04:20Z", + "changed_files": 4, + "additions": 166, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, any worker errors sent back a blank svg only instead of specific error details.\r\n\r\nNow, with these changes, a new field `textResults` will be sent back that is either `success` on a success, or with error details on a failure. This is being passed to our tracking module, and will appear in datadog when the user's client is updated.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1466) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://mermaid-worker-error-info.mural.engineering/) to perform a smoke test\r\n\r\n- Please follow these steps to perform a sufficient smoke test of these changes\r\n1. Perform any AI diagramming action\r\n2. It should still work\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14841)\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46014, + "title": "ENGAGE-1411 Ui tweaks part 2 for share modal v2", + "branch": "add/share-modal-v2-tweaks", + "merged_at": "2025-11-10T23:00:41Z", + "changed_files": 8, + "additions": 20, + "deletions": 17, + "body": "# Share Mural V2 Modal - Design Updates\r\n\r\nTicket: https://mural.atlassian.net/jira/software/c/projects/ENGAGE/boards/507?selectedIssue=ENGAGE-1411\r\n\r\nTest-Env: https://share-modal-v2-tweaks.mural.engineering/\r\n\r\n## Summary\r\n\r\nThis PR implements design updates for the Share Mural V2 modal to match the Figma design specifications. All changes are scoped to v2 modal only and do not affect the v1 modal behavior.\r\n\r\n## Changes\r\n\r\n### 1. Spacing Updates (Figma Alignment)\r\n- **Modal body horizontal padding**: Updated from `28px` to `24px` (using `var(--mrl-spacing-06)`)\r\n- **Title to container gap**: Updated from `12px` to `8px` (custom value)\r\n- **Grey container padding**: Updated from `20px` to `16px` (using `var(--mrl-spacing-04)`)\r\n- **Gap between items in container**: Updated from `20px` to `12px` (using `var(--mrl-spacing-03)`)\r\n- **Icon to text gap**: Updated from `4px` to `16px` (using `var(--mrl-spacing-04)`)\r\n\r\n**Files Modified:**\r\n- `src/views/mural/modals/share/share-mural/styles.module.sass`\r\n- `src/views/mural/modals/share/share-mural/link-invite-widget/styles.module.sass`\r\n\r\n### 2. Remove Hover Effect (V2 Only)\r\n- Removed hover shadow effect from the grey background container (`.permissionsInfo`) in v2 modal\r\n- Added `.permissionsInfoV2` modifier class that removes hover effect\r\n- Applied automatically since `LinkInviteWidget` is only used in v2 modal\r\n\r\n**Files Modified:**\r\n- `src/views/mural/modals/share/share-mural/link-invite-widget/styles.module.sass`\r\n- `src/views/mural/modals/share/share-mural/link-invite-widget/index.tsx`\r\n\r\n### 3. Add Icons to Disabled Buttons (V2 Only)\r\n- **Reset link button**: Always shows `linkBroken` icon, even when disabled\r\n- **Add/Remove password button**: Always shows `edit`/`deleteIcon` icon, even when disabled\r\n- **Set expiration button**: No icon (as per design)\r\n\r\n**Files Modified:**\r\n- `src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/VisitorSettings.tsx`\r\n- `src/views/mural/modals/s", + "labels": [] + }, + { + "number": 45945, + "title": "Refactoring Tools : Add support for alias paths in move-to-package utility", + "branch": "move-to-package-utility-alias", + "merged_at": "2025-11-10T22:12:48Z", + "changed_files": 8, + "additions": 842, + "deletions": 24, + "body": "## Pull Request Overview\r\n\r\nThis PR adds support for rewriting aliased imports (e.g., `common/with-state`) to package imports when moving files from `src/` to packages. The move-to-package refactoring tool now resolves both relative imports and webpack alias-based imports.\r\n\r\nKey changes:\r\n- Adds alias resolution functionality to detect and rewrite webpack-configured path aliases\r\n- Extends import rewriting logic to handle both relative and aliased imports\r\n- Adds comprehensive test coverage for alias resolution and import rewriting scenarios\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 7 out of 7 changed files in this pull request and generated 7 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `packages/refactoring-tools/src/lib/aliases/loadAliases.ts` | Loads and parses webpack alias configuration from `webpack.common.js` |\r\n| `packages/refactoring-tools/src/lib/aliases/resolveAliasImport.ts` | Resolves aliased import specifiers to absolute file paths |\r\n| `packages/refactoring-tools/src/lib/aliases/index.ts` | Exports alias utilities |\r\n| `packages/refactoring-tools/src/lib/aliases/loadAliases.test.ts` | Tests for alias loading functionality |\r\n| `packages/refactoring-tools/src/lib/aliases/resolveAliasImport.test.ts` | Tests for alias resolution |\r\n| `packages/refactoring-tools/src/tasks/move-to-package/move-to-package-imports.ts` | Updates import rewriting to support aliased imports |\r\n| `packages/refactoring-tools/src/tasks/move-to-package/move-to-package.test.ts` | Adds integration tests for aliased import rewriting |\r\n
\r\n\r\n\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 45960, + "title": "[ESC-1773] Add unarchive reason in Murally", + "branch": "add/esc-1773-add-unarchive-reason-fe", + "merged_at": "2025-11-10T21:17:18Z", + "changed_files": 5, + "additions": 135, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes:\r\n- The archived reason had a hardcoded temporary implementation\r\n\r\nNow, with these changes:\r\n- The mapping from the API is added with its respective translation\r\n- The CODEOWNERS was updated so ESC is the latest match according [the docs](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners) (hope this is the last PR engagement is reviewing for us) \ud83d\ude4f\ud83c\udffc \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [ESC-1773](https://mural.atlassian.net/browse/ESC-1773) to understand the context of this effort.\r\n\r\n#### Screenshots\r\n\"image\"\r\n\r\n#### Notes\r\nOn small screens the label might be wrapped but the badge color is not following it, @djrigby will queue the fix in the UI toolkit\r\n\"image\"\r\n\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [X] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14817)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atl", + "labels": [] + }, + { + "number": 45988, + "title": "Fix browser redirect step", + "branch": "fix/broken-step", + "merged_at": "2025-11-10T20:21:13Z", + "changed_files": 19, + "additions": 290, + "deletions": 46, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrimary, fixes a bug in the \"browser redirects\" test assertion that was incorrectly matching URLs, making it always true (never failed). Also, as a useful changes:\r\n- Enhanced the `parse-github-failures.js` script with other input methods: clipboard, and piped stdin.\r\n- Added missing /m/ segment to mural URL generation in test step definitions\r\n\r\n\u26a0\ufe0f **Important information:** \u26a0\ufe0f \r\nAfter the assertion fix, some tests began to fail. I resolved several of these by updating the expected assertions to align with the outcomes described in the corresponding scenario definitions. However, other tests were temporarily ignored, as their resolution requires active involvement from the teams responsible for those specific areas.\r\n\r\n### Relevant Links \ud83d\udd17\r\n- Pre-work of: https://github.com/tactivos/murally/pull/45974\r\n\r\n", + "labels": [] + }, + { + "number": 46009, + "title": "[IPA-299] scheduled reports: using new recipients endpoint to fetch company admins", + "branch": "add/ipa-299", + "merged_at": "2025-11-10T19:20:56Z", + "changed_files": 5, + "additions": 19, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nhttps://mural.atlassian.net/browse/IPA-299\r\nAPI PR https://github.com/tactivos/mural-api/pull/14837\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14837)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/w", + "labels": [] + }, + { + "number": 45997, + "title": "removes flag enabling outline functionality in ai chat", + "branch": "update/remove-flag-ai-outline", + "merged_at": "2025-11-10T18:55:58Z", + "changed_files": 5, + "additions": 0, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nRemoves the flag `feat-mu-outline-functions-in-ai-chat`\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1328) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://remove-flag-ai-outline.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Select an object on the canvas and ask ai chat to add it to the outline\r\n 2. Observe success \ud83c\udf89 \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14833)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45996, + "title": "[ECOMM-262] bad UX for fraudulent payment", + "branch": "add/ecomm-262", + "merged_at": "2025-11-10T18:11:52Z", + "changed_files": 6, + "additions": 137, + "deletions": 12, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI improve the UX when the user update their plan with fraudulent card.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-262) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [X] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n#### Record\r\n\r\nhttps://www.loom.com/share/c4ad01e4291440c78d2eb9f10190325c\r\n", + "labels": [] + }, + { + "number": 45961, + "title": "[SCQM-1437] - Fix ai-summarize preview mode undo bug", + "branch": "fix/scqm-1437-summarize-undo-bug", + "merged_at": "2025-11-10T17:56:57Z", + "changed_files": 3, + "additions": 98, + "deletions": 28, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nCurrently after accepting preview mode results for `ai-summarize`, there is an additional step added to the undo/redo stack for the creation of the placeholder widget used in preview mode streaming - this leads to a bug with undo/redo not working as expected and only partially undoing/redoing results.\r\n\r\nThis fixes the issue by adding a helper to create the placeholder widget using `ActionBuilder` and `.apply` instead of `addWidgets` (which creates its own undo/redo step), in order to stage the creation along with the rest of the preview mode changes until the final commit on accepting preview mode.\r\n\r\nThe fix applies to both legacy/chat and the new AiActions modes.\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/SCQM-1437\r\nTest env: https://scqm-1437-summarize-undo-bug.mural.engineering/\r\n\r\nBug:\r\n![summarize-undo-bug](https://github.com/user-attachments/assets/ff50b499-5577-4660-a6bb-4e5f78d58d92)\r\nFixed:\r\n![summarize-undo-fixed](https://github.com/user-attachments/assets/49888bfb-0caa-4187-abac-104817925005)\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How t", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 46003, + "title": "[ENGAGE-1388] M card tracking utils to @muralco/dashboard-cards", + "branch": "move/card-utils-to-package", + "merged_at": "2025-11-10T17:12:50Z", + "changed_files": 7, + "additions": 37, + "deletions": 23, + "body": "Move dashboard card tracking event util functions to @muralco/dashboard-cards package\r\n\r\ntest-env: https://card-utils-to-package.mural.engineering/", + "labels": [] + }, + { + "number": 45956, + "title": "[IPA-291] Cleanup insight endpoints types", + "branch": "add/ipa-291", + "merged_at": "2025-11-10T16:46:26Z", + "changed_files": 30, + "additions": 425, + "deletions": 428, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAPI side PR: https://github.com/tactivos/mural-api/pull/14826\r\n\r\ncleaning up the types to make sure we get what we use really plus strict typing of each endpoint\r\n\r\n\r\n**This PR better get reviewed commit by commit**\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit T", + "labels": [] + }, + { + "number": 46006, + "title": "[CAN-8082] Allow expulsed widgets to be absorbed by other absorbing widgets when resizing", + "branch": "fix/drop-after-resize", + "merged_at": "2025-11-10T15:39:55Z", + "changed_files": 3, + "additions": 38, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\nWhen we do a resize operation that could cause an indirect expulsion of absorbable widgets from their parents (such as when we resize an area short enough to expel one of its children), we don\u2019t do any checking to see if there\u2019s another absorbing widget suitable to absorb the now orphan widget.\r\n\r\nThe expected behavior is that if there\u2019s a second absorbing widget capable of getting the expelled absorbable one, it should take it.\r\n\r\nThis is something that only happens when the absorption systems flag is off so the solution is implemented for that case only.\r\n\r\n_PR:_\r\n![Nov-10-2025 10-59-17](https://github.com/user-attachments/assets/988101d3-5902-4128-ae3c-7677c7c1ff50)\r\n\r\n\r\n_Master:_\r\n![Nov-10-2025 10-58-27](https://github.com/user-attachments/assets/9035b3e0-b4c6-4b1a-9c91-5be876173da8)\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8082)\r\n- \ud83e\uddea [**Testing environment**](https://drop-after-resize.mural.engineering)", + "labels": [] + }, + { + "number": 46005, + "title": "[CAN-8094] Integration tests for grouping and ungrouping", + "branch": "add/tests-grouping", + "merged_at": "2025-11-10T13:39:19Z", + "changed_files": 3, + "additions": 154, + "deletions": 62, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR simply adds integration tests for the scenarios implemented in https://github.com/tactivos/murally/pull/45952 and https://github.com/tactivos/murally/pull/45966. No behavior was changed in this PR.\r\n\r\nTicket: https://mural.atlassian.net/browse/CAN-8094", + "labels": [] + }, + { + "number": 45983, + "title": "ENGAGE-1400 UI improvements in new Share modal", + "branch": "add/share-mural-v2-updates", + "merged_at": "2025-11-06T21:30:36Z", + "changed_files": 13, + "additions": 273, + "deletions": 139, + "body": "## Pull Request Overview\r\n\r\nThis PR implements UI enhancements to the Share Mural modal, focusing on visual refinements and improved component styling. The changes support a feature-flagged v2 design (`muralShareModalV2`) with updated spacing, typography, and dropdown select behavior.\r\n\r\n**Key Changes:**\r\n- Enhanced dropdown select component with improved positioning, focus states, and visual styling\r\n- Updated Share modal with conditional v2 styling that changes title formatting and content padding\r\n- Refined visitor settings UI with better vertical alignment and spacing using design tokens\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 13 out of 13 changed files in this pull request and generated 8 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `SetExpiration.module.sass` | Changed alignment from `center` to `flex-start` and added spacing for first child container |\r\n| `VisitorSettings.tsx` | Simplified reset link button logic by removing redundant handler and conditional icon rendering |\r\n| `VisitorSettings.module.sass` | Added flex layout styles for first child container with design token spacing |\r\n| `SetPassword.module.sass` | Changed alignment from `center` to `flex-start` and added spacing for first child container |\r\n| `styles.module.sass` (share modal) | Added v2-specific styles for modal title/content with new padding and typography tokens |\r\n| `link-invite-widget/styles.module.sass` | Updated spacing tokens, border styles, and typography for link access widget |\r\n| `link-invite-widget/index.tsx` | Changed title from \"Invite with link\" to \"Link Access\" and added divider |\r\n| `AccessInfo.tsx` | Added menu offset calculation logic using refs and getBoundingClientRect |\r\n| `index.tsx` (share modal) | Implemented conditional v2 title rendering with split bold/light formatting |\r\n| `DropdownSelect/styles.ts` | Removed animation keyframes, added menuOffset parameter for positioning, updated f", + "labels": [] + }, + { + "number": 45976, + "title": "[ENGAGE-779] Move RoomCard to dashboard-cards package", + "branch": "add/package-room-card", + "merged_at": "2025-11-06T21:16:32Z", + "changed_files": 15, + "additions": 71, + "deletions": 64, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 45998, + "title": "[CAN-8101] Fix iterating over all widgets on every update", + "branch": "fix/can-8101", + "merged_at": "2025-11-06T20:49:36Z", + "changed_files": 2, + "additions": 37, + "deletions": 13, + "body": "**[CAN-8101 Fix iterating over all widgets on everey `WidgetStore.apply`](https://mural.atlassian.net/browse/CAN-8101)**\r\n\r\nThe environment: https://can-8101.mural.engineering/\r\n\r\n## Before (resizing 1000 stickies)\r\n\r\n\"image\"\r\n\r\n## After (resizing 1000 stickies)\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 45987, + "title": "[IAM-2217] Enhance JIT error handling in authentication flow", + "branch": "stable-fix/scim-jit-custom", + "merged_at": "2025-11-06T19:28:46Z", + "changed_files": 11, + "additions": 216, + "deletions": 15, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImprove error handling for JIT blocked accounts by adding customizable error button text and headings. This enhancement allows for better user feedback during the authentication process. Changes include:\r\n\r\n- Updated AccountJitBlocked interface to include optional jitErrorButtonText and jitErrorHeading properties.\r\n- Modified SignInController to handle and display JIT error messages, including button text and headings.\r\n- Enhanced signUp function to pass JIT error details to the SCIM error page.\r\n- Updated tests to verify the correct handling of JIT error scenarios and ensure proper rendering of error messages.\r\n- Adjusted SCIM helper functions to accommodate new JIT error parameters.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2217) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scim-jit-custom.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14821)\r\n", + "labels": [] + }, + { + "number": 45992, + "title": "[CAN-8084] Replace custom code for dropWidgetsOnCanvas in ungrouping", + "branch": "test/ungroup-children", + "merged_at": "2025-11-06T18:44:17Z", + "changed_files": 2, + "additions": 26, + "deletions": 49, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR replaces the custom absorption when ungrouping with calling `dropWidgetsOnCanvas`.\r\n\r\nThe original code was implemented in https://github.com/tactivos/murally/pull/45952\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8084\r\n- Env: https://ungroup-children.mural.engineering", + "labels": [] + }, + { + "number": 45927, + "title": "[CAN-8026] Fixed issue where connectors where losing their attachment on sticky widgets", + "branch": "fix/can-8026", + "merged_at": "2025-11-06T18:23:52Z", + "changed_files": 2, + "additions": 186, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixed issue where connectors where clearing its references when only one ref was the same as the parent instead of 2 of them.\r\n\r\nBefore the fix moving a sticky over an area or cell of a table where the sticky was connected to would detach the connector endpoint with the sticky until the moving sticky leaves that area or cell.\r\n\r\nAfter the fix the connector keep properly attached to the sticky while moving over the cell/area.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8026) to understand the context of this effort.\r\n- [ENV] (https://can-8026.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 45885, + "title": "[research-agent][cleanup] move from sdk.ai to sdk.operations", + "branch": "refactor/generate-research", + "merged_at": "2025-11-06T17:25:04Z", + "changed_files": 11, + "additions": 99, + "deletions": 95, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, we were using the sdk.ai surface area. This was fine but it limits our ownership and ability to make adjustments. This is a highly used abstraction and we do not own it.\r\n\r\nNow, we use the sdk.operations surface area which is owned by us. We created it after the pattern of sdk.ai but its a way for us to make tweaks as necessary without interfering with the ai implementation.\r\n\r\nIn a future commit, we will use the operationId returned by sdk.operations.startOperation() which was not returned by sdk.ai.startOperation().\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://generate-research.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering)) https://generate-research.mural.engineering\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nhttps://github.com/tactivos/mural-api/pull/14766\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these doc", + "labels": [] + }, + { + "number": 45990, + "title": "[ENGAGE-1409] Dont show password/expiration on Visito Link if 'No access' is picked", + "branch": "fix/engage-1409", + "merged_at": "2025-11-06T16:37:12Z", + "changed_files": 2, + "additions": 41, + "deletions": 8, + "body": "\n> [!NOTE]\n> Stops showing the visitor link password/expiration description when permission is set to No access, and adds tests to cover these cases.\n> \n> - **Share modal \u2013 LinkInfo**:\n> - Only render `password-and-expiration-copy` when `selectedPermission !== PERMISSION_LEVEL.NONE` and `(expirationTime || hasPassword)`.\n> - **Tests**:\n> - Add parameterized cases ensuring no description appears when `publicPermission` maps to `NONE` even if `expirationTime` or `hasPassword` are present.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 571cc6c9878def07b4aeef63b9750d5afa69eec8. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45966, + "title": "[CAN-8083] Group absorption", + "branch": "add/group-absorption", + "merged_at": "2025-11-06T15:32:22Z", + "changed_files": 2, + "additions": 210, + "deletions": 22, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nWhen grouping widgets that come from different parent areas, the area with the highest stacking order that includes all the group, should absorb it (even if it means changing the children position visually for now).\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/d7d25396-cdd9-495c-9df7-9b2a277e3b03)\r\n\r\nMaster:\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8083\r\n- Env: https://group-absorption.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45984, + "title": "[CAN-8099] Unify absorption systems into a single entry point", + "branch": "refactor/unified-absorption", + "merged_at": "2025-11-06T14:58:51Z", + "changed_files": 22, + "additions": 184, + "deletions": 56, + "body": "### Summary of Changes and Resources for the Reviewer\n\nIn order to achieve consistency in the way absorption logic works as a system and to have both a better control of the implications of running it as well as a more performant behavior (by gathering all the required information only once for all the related systems), we need to unify all the current different systems that apply some logic related to the absorption of widgets into one sole entry point.\n\nThis work will then be iterated to improve the experience but the initial point here is to have all systems in one place while keeping their individual behaviors (as well as their individual control flags)\n\nTo achieve this I'm introducing the concept of a \"state dependent system\" which is a way of gathering one or many systems that depend on one or more feature flags (independently) to be enabled.\n\nThis will allow us to have partial behaviors moved into systems in a controlled way while still having it all be \"one\" absorption system to the external caller.\n\n\n#### Reviewer Resources\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8099)\n- \ud83e\uddea [**Testing environment**](https://unified-absorption.mural.engineering)", + "labels": [] + }, + { + "number": 45944, + "title": "[CPT-2436] Add luma session", + "branch": "add/luma-session-frontend", + "merged_at": "2025-11-06T14:24:43Z", + "changed_files": 8, + "additions": 295, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nCreates an addon to enable a `templates` query param to be passed to a mural link in order to add an array of up to 25 global templates to a blank mural canvas\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2436) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://luma-session-frontend.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- Create a user\r\n- Join a workspace\r\n- Create a mural\r\n- Append `?templates=` to mural URL (e.g., `?templates=8d95182b-a3fc-4638-b23a-f8415bdf56a4,26d527db-4983-4417-acd5-9e1ff43dec5a,a3fd5e2a-cfdf-4ad6-9887-066521fc6ab1,a810c705-72f1-4252-a07c-26ce00a0a318,630019cf-bcf4-4c5c-9476-bf1cf56e6687,cd2ea8c4-f02f-4bb5-b676-76827a8b7c20,7fd4da44-9c15-4008-ae85-76dc6940188a,197dfb20-eb5c-4797-a937-0e952f5a49ff,c8977a79-519d-4038-9b2d-7003e2f31d7c,017974ab-af11-4a86-9629-3b4bce6c6d0e,c7281216-5973-4a39-9a03-8fc1a25f7acd,4879eeca-e16b-4e5c-a571-2d8f311b3f5d,8fdf34ee-9e3d-4c81-9b1e-5781707f34f4,91cd1aa6-d912-42c1-b29b-e02c238fd5d3,7c021160-6cb6-4aff-ab30-363de1423482,8663c13e-38bd-4993-b671-486e8bfa81fb,c21afccd-4c25-420a-927e-24e9376740cd,1246d9f4-8df7-4dc5-8522-40589b362a54,77cc7953-8695-4788-a1a4-c2182d0b5270,02299a19-f773-4eef-bb2c-9f4f1a5d8895,628ed91d-4ccd-44e7-90c1-dffa0a52872a,31c78927-99fc-4448-8d89-c12493b8fe53,f015fbc4-eb73-4ccb-8805-062cdc17c8e6,5ee955d0-24c2-4983-8607-5f5bed29bbd9,4ec1368a-7b41-4cad-a297-f775fbae332c`)\r\n- Observe the session being built\r\n- Toggle [feature flag](https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-user-add-session-templates/rules/development) off and ensure that it does not work with the feature flag off\r\n- Ensure that it does not work in a templa", + "labels": [] + }, + { + "number": 45906, + "title": "[CAN-8025] Focus mode topbar", + "branch": "add/can-8025-focus-mode-topbar", + "merged_at": "2025-11-06T14:02:39Z", + "changed_files": 11, + "additions": 132, + "deletions": 5, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the focus mode topbar to the fixed topbar.\r\n\r\n \r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8025\r\n- Env: https://can-8025-focus-mode-topbar.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45979, + "title": "[CAN-8097] Remove absorption feedback from the frame once", + "branch": "fix/clear-feedback", + "merged_at": "2025-11-06T13:11:02Z", + "changed_files": 1, + "additions": 6, + "deletions": 1, + "body": "**[CAN-8097 Error in console while dragging multiple widget over an area](https://mural.atlassian.net/browse/CAN-8097)**\r\n\r\nThis PR fixes console errors while dragging multiple stickies over an area.\r\n\r\nThe environment: https://clear-feedback.mural.engineering/\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 45970, + "title": "[ENGAGE-1404] Use replaceBrowserUrlWithoutNavigation instead of browserHistory.replace", + "branch": "fix/engage-1404", + "merged_at": "2025-11-05T23:37:15Z", + "changed_files": 2, + "additions": 124, + "deletions": 3, + "body": "Test Env: https://engage-1404.mural.engineering/\n\n\n---\n\n> [!NOTE]\n> Switch URL update in `updateMuralLinkWithSenderID` to `replaceBrowserUrlWithoutNavigation` and add focused unit tests for `sender` query param handling.\n> \n> - **Share utils**:\n> - Update `updateMuralLinkWithSenderID` to use `replaceBrowserUrlWithoutNavigation` for in-place URL updates without navigation.\n> - **Tests**:\n> - Add `src/views/mural/modals/share/utils/views.test.ts` covering adding/updating/preserving `sender` query param and cases where no update should occur based on pathname and existing params.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7a5426a01912d38336e79790828943330029cc8d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45575, + "title": "CAN-7891: enforcing a maximum speed of mouse wheel events", + "branch": "fix/can-7891-max-zoom-speed", + "merged_at": "2025-11-05T23:16:05Z", + "changed_files": 9, + "additions": 123, + "deletions": 123, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes there was no maximum mouse wheel event speed such that a bad setting or mouse driver could cause minor wheel events to zoom all the way in or out.\r\n\r\nNow, with these changes the wheel event is limited in event delta. Pared with existing event throttling this enforces a maximum mouse wheel scroll speed.\r\n\r\n#### Reviewer Resources\r\nhttps://mural.atlassian.net/browse/CAN-7891\n\n\n---\n\n> [!NOTE]\n> Clamp mouse wheel zoom speed and align zoom/scrollbar tests and step definitions to the capped behavior and max-zoom limits.\n> \n> - **Canvas zoom behavior**:\n> - Cap mouse wheel zoom delta in `wheel-handler.tsx` via `ZOOM_MAX_SPEED` and clamp `deltaY` (excluding pinch); preserves throttling.\n> - **Test infrastructure**:\n> - `viewport.ts`: simulate zoom with multiple wheel events honoring `ZOOM_MAX_SPEED`, clamp to min/max zoom, refine Safari gesture events, and round viewport `zoom` to 2 decimals.\n> - `viewport-manager.test.ts`: add `getMaxZoom` tests and verify `zoomTo` clamps to 4.\n> - **E2E/feature tests**:\n> - Scrollbars: remove legacy zoom scenario; add new React-based scenario in `features/canvas/scrollbars/...` and `react-new/features/...` validating widths/positions at 2x.\n> - Context menu: change zoom steps from `1.5x` to `2x`.\n> - Infinite/Zoom: drop wheel extreme zoom scenarios; keep relevant pinch/trackpad cases.\n> - Copy/paste (infinite): update expected zoom from `^0.93` to `0.94`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4e1b948d73da9aa4b5e9ee71b0699d31df39312b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45965, + "title": "ENGAGE-1402 Visitor link settings tab tweaks", + "branch": "add/share-modal-fixes", + "merged_at": "2025-11-05T22:52:46Z", + "changed_files": 6, + "additions": 63, + "deletions": 44, + "body": "## Pull Request Overview\r\n\r\nThis PR updates text labels and styling in the visitor link settings section of the share modal to improve clarity and visual consistency. The changes focus on renaming \"Advanced settings\" to \"Visitor link settings\" and making minor UI adjustments to button labels and spacing.\r\n\r\n- Renamed tab and view labels from \"Advanced settings\" to \"Visitor link settings\" for clarity\r\n- Updated button text to be more specific (e.g., \"Set expiration date\" instead of \"Set expiration\")\r\n- Adjusted spacing and styling for the expiry notification section\r\n- Added icons to the password protection buttons\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 6 out of 6 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/share-mural/views/access-settings.tsx | Updated tab label from \"Advanced settings\" to \"Visitor link settings\" |\r\n| src/views/mural/modals/share/share-mural/index.tsx | Updated view title from \"Access and settings\" to \"Advanced settings\" |\r\n| src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/set-expiration/SetExpiration.tsx | Changed button text to include \"date\" for clarity |\r\n| src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/VisitorSettings.tsx | Restructured expiry notification layout and divider placement |\r\n| src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/VisitorSettings.module.sass | Added spacing and styling for expiry notification label |\r\n| src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/SetPassword.tsx | Added icons to password button and changed icon position |\r\n
\r\n\r\n\r\n\r\n
\r\nComments suppressed due to low confidence (1)\r\n\r\n**src/views/mural/modals/share/share-mural/views/access-settings-tabs/visitor-settings/VisitorS", + "labels": [] + }, + { + "number": 45955, + "title": "[CAN-8047] Add timer tool for private mode", + "branch": "add/can-8047", + "merged_at": "2025-11-05T20:49:02Z", + "changed_files": 6, + "additions": 153, + "deletions": 107, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request adds the timer tool for private mode's fixed toolbar and refactors existing timer tools.\r\n\r\nThis pull request refactors and simplifies the timer tools in the Mural application, removing legacy experiment flags and introducing a unified approach for timer tool variants. The changes improve maintainability by centralizing shared logic, cleaning up feature flag usage, and making timer variant selection explicit. Additionally, the code now supports different timer button styles based on context and feature flags.\r\n\r\n**Timer tool architecture and feature flag cleanup:**\r\n\r\n* Removed the legacy `isIAExperiment` flag and replaced it with an explicit `timerVariant` prop to determine the timer button style, improving clarity and maintainability. [[1]](diffhunk://#diff-6d26408beaa482b6697f2a6eb324eddd0455ada46d3b15618f702bd4ecac8f8dL38-R51) [[2]](diffhunk://#diff-6d26408beaa482b6697f2a6eb324eddd0455ada46d3b15618f702bd4ecac8f8dL443) [[3]](diffhunk://#diff-6d26408beaa482b6697f2a6eb324eddd0455ada46d3b15618f702bd4ecac8f8dR452) [[4]](diffhunk://#diff-cc8ef10c11b41360c55597a91655c0e8c3cd790df47d7e26d74919df7eb58506L37-R45) [[5]](diffhunk://#diff-cc8ef10c11b41360c55597a91655c0e8c3cd790df47d7e26d74919df7eb58506L61-R72) [[6]](diffhunk://#diff-cc8ef10c11b41360c55597a91655c0e8c3cd790df47d7e26d74919df7eb58506L109-R170) [[7]](diffhunk://#diff-8fc4e29e04ce4dcad51b39af5c5002897b5d67e25b558e38154c8cc739f9cc76L27) [[8]](diffhunk://#diff-8fc4e29e04ce4dcad51b39af5c5002897b5d67e25b558e38154c8cc739f9cc76R38) [[9]](diffhunk://#diff-8fc4e29e04ce4dcad51b39af5c5002897b5d67e25b558e38154c8cc739f9cc76L48) [[10]](diffhunk://#diff-8fc4e29e04ce4dcad51b39af5c5002897b5d67e25b558e38154c8cc739f9cc76R58) [[11]](diffhunk://#diff-8fc4e29e04ce4dcad51b39af5c5002897b5d67e25b558e38154c8cc739f9cc76L104-R105)\r\n\r\n* Centralized the `connectComponent` logic for timer tools into a single `createConnectedTimerComponent` function, reducing code duplic", + "labels": [] + }, + { + "number": 45943, + "title": "[CWI-2273] Added enableAppRequest setting to companies api", + "branch": "add/cwi-2273", + "merged_at": "2025-11-05T19:13:43Z", + "changed_files": 7, + "additions": 273, + "deletions": 150, + "body": "This PR adds the ability for company Admins to toggle `enableAppRequest` for App Requests. Added UI-Toolkit tabs to the Integrations list page and feature flag to correspond with the App Request feature flag.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2273) to understand the context of this effort.\r\n\r\n![2025-11-04 13 16 22](https://github.com/user-attachments/assets/34ad6064-df82-46d0-b92e-e9fd683c3f2a)\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14801)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45963, + "title": "ENGAGE-1182 After GA, delete feature flags", + "branch": "remove/optimzely-feature", + "merged_at": "2025-11-05T17:54:32Z", + "changed_files": 17, + "additions": 26, + "deletions": 117, + "body": "## Pull Request Overview\r\n\r\nThis pull request removes the `guestLinkSharingEnabled` feature flag from the share modal and settings components, making the guest link sharing feature (allowing \"Anyone with a Mural account\" access level) permanently available without conditional logic.\r\n\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n\r\n**Key Changes:**\r\n- Removed the `guestLinkSharingEnabled` prop from all share modal components and their interfaces\r\n- Removed conditional rendering based on the feature flag, making USER access level always available\r\n- Updated tests to remove feature flag-related test cases and parameters\r\n- Cleaned up Redux state mapping that read the feature flag from `muralSummary.features.guest_link_sharing`\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 16 out of 16 changed files in this pull request and generated no comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/views/mural/modals/share/share-mural/views/share-link.tsx` | Removed `guestLinkSharingEnabled` prop from interface and component |\r\n| `src/views/mural/modals/share/share-mural/views/access-settings.tsx` | Removed `guestLinkSharingEnabled` prop and its propagation |\r\n| `src/views/mural/modals/share/share-mural/views/access-settings-tabs/link-sharing.tsx` | Removed `guestLinkSharingEnabled` prop pass-through |\r\n| `src/views/mural/modals/share/share-mural/v2/main-v2.tsx` | Removed `guestLinkSharingEnabled` prop from MainV2 component |\r\n| `src/views/mural/modals/share/share-mural/permissions.tsx` | Removed conditional rendering - USER access level now always shown |\r\n| `src/views/mural/modals/share/share-mural/permissions.test.tsx` | Remove", + "labels": [] + }, + { + "number": 45958, + "title": "[ENGAGE-1403] Toast \"Changes saved\"", + "branch": "fix/engage-1403", + "merged_at": "2025-11-05T17:32:45Z", + "changed_files": 4, + "additions": 4, + "deletions": 42, + "body": "Test Env: https://engage-1403.mural.engineering/\r\n\r\n\"image\"\r\n\r\nToast \"Changes saved\" whenever there is an update\n\n\n---\n\n> [!NOTE]\n> Display a success toast after saving share settings and remove redundant toasts, props, and change-detection logic from Visitor/Access settings.\n> \n> - **Share modal**\n> - Show success toast (`\"Changes saved\"`) after `updateShareSettings` succeeds in `views/share-mural/index.tsx`.\n> - Remove local toast usage and `setNotificationProps` prop from `VisitorSettings` and `SetExpiration`; simplify expiration save (no toast).\n> - Remove permission change detection hook and `isEqual` import; stop auto toast on permission changes in `access-settings.tsx`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 78f1b1108cfa5b7822307e49d23aea4c6826101c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45949, + "title": "[CAN-8081] Send system modified ids along to other systems", + "branch": "add/modified-widget-ids", + "merged_at": "2025-11-05T17:10:37Z", + "changed_files": 58, + "additions": 529, + "deletions": 294, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR refactors the `System` type interface to clarify the distinction between user-initiated changes and system-generated changes. \r\nIn order to achieve that, the parameter `widgetIds` (representing the first set) has been renamed to `sourceWidgetIds`, and the added set has been named `changedWidgetIds`.\r\n\r\nThe new parameter is only used when needed, and while its mandatory as part of the payload object, the systems implementation can deconstruct this object and only use it if needed.\r\n\r\nThe motivation behind this changes is allowing the `stackingOrder` system, who acts over widgets changing parent, to fetch those that had the parent changed by another system without needing to perform duplicated calculation.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8081)\r\n- \ud83e\uddea [**Testing environment**](https://modified-widget-ids.mural.engineering)", + "labels": [] + }, + { + "number": 45953, + "title": "[ENGAGE-1161] Migrate /check-email route to @muralco/route-check-email package", + "branch": "migrate/package-check-email", + "merged_at": "2025-11-05T16:48:40Z", + "changed_files": 24, + "additions": 290, + "deletions": 11, + "body": "\"image\"\r\n\r\n\r\nhttps://package-check-email.mural.engineering/\r\n\r\n- Create new @muralco/route-check-email package following route package pattern\r\n- Migrate CheckEmail, CheckEmailWrapper, CountdownBySeconds components\r\n- Migrate ensureValidEmail utility and timed-helpers\r\n- Extract .toast style to package-specific styles module\r\n- Update imports in src/registration/routes/index.tsx and check-email-code.tsx\r\n- Migrate and update all tests (8 tests passing)\r\n- Remove old source files from src/registration/\r\n\r\nThis enables CheckEmailWrapper to be imported as a package dependency, following the established pattern from route-signup and route-create-password.\r\n\r\n
\r\n\r\n`/check-email/validate`\r\n\"image\"\r\n\r\n`/check-email/reset`\r\n\"image\"\r\n\r\n`/check-email/create`\r\n\"image\"\r\n
", + "labels": [] + }, + { + "number": 45954, + "title": "CAN-7944: added zoom steps below 8% to better support large murals", + "branch": "fix/can-7944-zoom-steps", + "merged_at": "2025-11-05T16:29:03Z", + "changed_files": 2, + "additions": 4, + "deletions": 1, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdded zoom steps below 8% to better support large murals. Currently a large mural zoomed out to 1% will jump to 8% when clicking '+'. This 8x zoom is too extreme. Will now go to 2% -> 4% -> 8%.\r\n\r\n#### Reviewer Resources\r\nhttps://mural.atlassian.net/browse/CAN-7944\n\n\n---\n\n> [!NOTE]\n> Add finer low-end zoom increments (1%, 2%, 4%) and adjust tests to account for the extra zoom steps.\n> \n> - **Viewport**:\n> - Add lower zoom steps `0.01`, `0.02`, `0.04` to `ZOOM_STEPS` in `src/mural/models/viewport-manager.ts` for finer control below `0.08`.\n> - **Tests**:\n> - Update drawing-mode zoom-out controls in `src/test/react-new/features/canvas/viewport/infinite.feature` to click `[zoom-out-button]` 12 times to reach `0.02` zoom.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 92203f8b6f5cf9e0bd82e13140e5db7f14a7004f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45952, + "title": "[CAN-8084] Absorb group children on ungroup", + "branch": "add/ungroup-absorption", + "merged_at": "2025-11-05T14:17:12Z", + "changed_files": 3, + "additions": 309, + "deletions": 23, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR changes how `ungroupSelectedWidgets`. Before, we would only allow absorption of group's children when ungrouped only if the group had a parent. Now we forget about the group and check for the first cluster that would overlap each child and absorbs it.\r\n\r\n![ungroup](https://github.com/user-attachments/assets/82b46920-9efa-4da3-bb77-637c767635b6)\r\n![pr2](https://github.com/user-attachments/assets/9edb322f-dd4a-4395-9296-b51acaeb62a7)\r\n![pr3](https://github.com/user-attachments/assets/4fedb366-1099-4f6d-87a3-14794eed776a)\r\n\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8084\r\n- Env: https://ungroup-absorption.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45948, + "title": "[CAN-7947] Remove username from mural members dropdown item", + "branch": "fix/can-7947", + "merged_at": "2025-11-05T13:58:58Z", + "changed_files": 1, + "additions": 5, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes the Participants (Members) list in a mural reused the generic toolbar/menu item component and passed each participant\u2019s username as the item id. Every click on a participant emitted the Segment event toolbar_button_pressed with button=member.username, leaking user identifiers into an event field intended only for tool identifiers.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7947) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-7947.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- Actions done through the Members list top bar tool continue to work as before\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Ex", + "labels": [] + }, + { + "number": 45962, + "title": "[CAN-8057] Fix: Allow deleting a widget after unlocking it", + "branch": "fix/can-8057", + "merged_at": "2025-11-05T13:40:55Z", + "changed_files": 2, + "additions": 40, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes pressing delete after unlocking a widget from the widget toolbar didn't work.\r\n Now, with these changes, the widget is deleted.\r\n\r\nThe root of the problem was that the button kept the focus after clicking it, and that prevent the keyboard shortcut to run. \r\nI fixed it by doing a prevent default on mouse down so the button doesn't get focused.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8057) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8057.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https:/", + "labels": [] + }, + { + "number": 45937, + "title": "[CAN-8079] Voting highlights panel", + "branch": "add/can-8079-voting-highlights-panel", + "merged_at": "2025-11-05T13:22:39Z", + "changed_files": 11, + "additions": 266, + "deletions": 74, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSince the secondary toolbar is no longer showing with the fixed toolbars, voting highlights are being moved to a panel.\r\n\r\n\"image\"\r\n\r\nThere is some disconnect between when the voting highlights are showing on the canvas and when the panel is activated. Those issues will be solved [here](https://mural.atlassian.net/browse/CAN-8079)\r\n\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8079)\r\n[Test Env](https://can-8079-voting-highlights-panel.mural.engineering)\r\n", + "labels": [] + }, + { + "number": 45959, + "title": "[SCQM-1466] Add more data to `diagram_complete_fail` when no `parsedResult`", + "branch": "add/more-diagramming-error-tracking", + "merged_at": "2025-11-05T00:28:54Z", + "changed_files": 5, + "additions": 26, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nTracking changes only to try to get more info about why the `mermaid_parsing_error` is being thrown. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1466) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://more-diagramming-error-tracking.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45932, + "title": "[CPT-2450] Add tracking event for CYOA modal opening", + "branch": "feature/cyoa-modal-tracking", + "merged_at": "2025-11-04T21:51:00Z", + "changed_files": 3, + "additions": 19, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdd tracking event for CYOA modal opening to compare with templates added from the modal.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2450) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://cyoa-modal-tracking.mural.engineering/) to perform a smoke test.\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Add a template with a Choose your own adventure CE (you can use Retrospective if you can't find one)\r\n 2. Click the blue `+` button and check your console for the tracking event.\r\n 3. The tracking event should have:\r\n - event name: `choose-your-own-adventure-modal-opened`\r\n - `canvas-id`: the mural you are on\r\n - `template-id`: the template you initially added\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [X] Exception: no unit tests were added or updated for this change\r\n\n\n---\n\n> [!NOTE]\n> Adds a new `choose-your-own-adventure-modal-opened` tracking event and triggers it when the CYOA modal opens, sending `canvas-id` and `template-id`.\n> \n> - **Tracking**:\n> - Add `choose-your-own-adventure-modal-opened` event type in `packages/tracking-lib/src/utils/events/events.ts` with payload: `canvas-id`, `template-id`.\n> - Expose `trackChooseYourOwnAdventureModalOpened` in `packages/templates/tracking/src/tracking/index.ts`.\n> - **Addon**:\n> - In `src/mural/addons/choose-your-own-adventure/index.tsx`, fire `trackChooseYourOwnAdventureModalOpened` when opening the modal, passing current `canvas-id` and selected `template-id`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 809e91d802038db339e17e39909956fbc65ea964. This wi", + "labels": [] + }, + { + "number": 45911, + "title": "[ESC-1760] Add mural unarchive request and new archived banner", + "branch": "add/esc-1760-mural-unarchive-request-fe", + "merged_at": "2025-11-04T21:28:14Z", + "changed_files": 18, + "additions": 915, + "deletions": 76, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes:\r\n- A toast notification was shown when the mural was archived\r\n- Bulk unarchive request was not implemented in archived murals page\r\n\r\nNow, with these changes:\r\n- A new block notification banner is shown in the ui when the mural is archived\r\n - This new component handles the new unarchive request scenario by adding a CTA when the current user is the owner of the mural and the mural is load from the email link with 2 query params: `requesterUserId` and `action`\r\n - This CTA opens a confirmation modal to unarchive it (added this open logic to the modal dispatcher)\r\n - All the other scenarios will show the default `\"This mural is archived.\"` copy\r\n- The old toast notification shown when a mural was archived is removed (requested by design)\r\n- In the new archived murals page the request to unarchive was implemented in single and bulk actions\r\n- Added a toast notification component for user feedback on their actions\r\n- Added latest Design QA requirements\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [ESC-1760]() to understand the context of this effort.\r\n\r\n##### New Banner for non owners\r\n\"image\"\r\n\r\n##### New Banner for owner with unarchive request\r\n\"image\"\r\n\r\n##### Unarchive modal\r\n\"image\"\r\n\r\n##### Notifications\r\n\"image\"\r\n\r\n\"image\"\r\n\r\n\"image\" \r\n Now, with these changes, \r\n-->\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Archi", + "labels": [] + }, + { + "number": 45947, + "title": "[ENGAGE-1399] Fix permission selector being cutoff", + "branch": "fix/engage-1399", + "merged_at": "2025-11-04T18:01:39Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "\n> [!NOTE]\n> Set `.permissionSelectorContainer` min-width to `fit-content` in the share modal to avoid cutoff.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e2cea9626de67b59402bdf800a917d8f7a23e2ef. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n\n\n\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 45907, + "title": "[IAM-2254] Workspace user filters, pagination, sort, and search", + "branch": "feat/iam-2254-pagination", + "merged_at": "2025-11-04T17:42:07Z", + "changed_files": 23, + "additions": 814, + "deletions": 149, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFinally getting some polishing touches on the workspace user table.\r\n\r\n#### Reviewer resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2254**](https://mural.atlassian.net/browse/IAM-2254)\r\n- \ud83e\uddea [**iam-2254-pagination.mural.engineering**](https://iam-2254-pagination.mural.engineering)\r\n- \ud83c\udfac Loom demo n/a\r\n\r\nTry the following user:\r\n\r\n```\r\nemail: alpha.user@poubelle-du.net\r\npassword: EPJmUJzJKwXdFA3ahaNixitt\r\n```\r\n\r\nAnd then access either:\r\n\r\n- the [new workspace user table](https://iam-2254-pagination.mural.engineering/t/alphaworkspace6423/settings/members)\r\n- the [previous workspace user table](https://iam-2254-pagination.mural.engineering/t/bravoworkspace4122/settings/members)", + "labels": [] + }, + { + "number": 45941, + "title": "[SCQM-1365] [SCQM-1366] Update/ai tracking modal", + "branch": "update/ai-tracking-modal", + "merged_at": "2025-11-04T17:21:07Z", + "changed_files": 3, + "additions": 136, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking for the ai upgrade feature when the upgrade modal is viewed and when the modal's upgrade button is clicked.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1365) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1366) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-tracking-modal.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n 1. Create a free account\r\n 2. open the ai hub and select a landing page tile to open the upgrade modal\r\n 3. Confirm tracking event `upgrade_viewed`\r\n 4. Select the upgrade button in the modal\r\n 5. Confirm tracking event `clicked_upgrade`\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlass", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45939, + "title": "Fix search handling", + "branch": "fix/diagramming-hover-state", + "merged_at": "2025-11-04T16:46:04Z", + "changed_files": 2, + "additions": 63, + "deletions": 33, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Fix search handling to prevent weird states on clearing of typing/search query\r\n\r\n#### Reviewer Resources\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45842, + "title": "[PLAY-671] improve company search ux", + "branch": "add/play-671-same-component", + "merged_at": "2025-11-04T15:55:15Z", + "changed_files": 9, + "additions": 554, + "deletions": 123, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFinal solution using `MrlSelect` rather than `MrlCreatableSelect`, as the creatable expects you can create OR select and our flow is search, create THEN select, this required a lot of suppressing of existing features and handling of additional and unexpected functionality at different points in the flow.\r\n\r\nhttps://github.com/user-attachments/assets/fa4e7196-9083-43d0-95a2-bac77e8ed1a3\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-671) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n\r\n", + "labels": [] + }, + { + "number": 45929, + "title": "[CAN-8069] Fix areas improvements", + "branch": "fix/can-8069-areas-click", + "merged_at": "2025-11-04T15:22:33Z", + "changed_files": 4, + "additions": 141, + "deletions": 39, + "body": "# Area Selection Behavior Update\r\n\r\nWhen clicking empty space in an area with children, the area should be selected on **mouseup** via the deferred selection mechanism. \r\nPreviously, `pendingAreaSelection` was being cleared too aggressively for all empty-space clicks in mouse mode, preventing selection.\r\n\r\nNow, pending selection is only cleared when there's a **different pre-existing selection** (to allow canvas panning), preserving it for normal clicks to be committed on mouseup.\r\n\r\nThis **fixes the scenario** where clicking an unselected area with children did not select the area.\r\n\r\n---\r\n\r\n## What to Test\r\n\r\n### Click Behavior\r\n\r\n#### Locked Areas\r\n\r\n##### With Children\r\n- [ ] Hint \u2192 Selects area \r\n- [ ] Empty space \u2192 Selects area (nothing happens)\r\n\r\n##### Empty\r\n- [ ] Hint \u2192 Selects area \r\n- [ ] Empty space \u2192 Selects area (nothing happens)\r\n\r\n#### Unlocked Areas\r\n\r\n##### With Children\r\n- [ ] Hint \u2192 Selects area \r\n- [ ] Empty space \u2192 Selects area (nothing happens)\r\n\r\n##### Empty\r\n- [ ] Hint \u2192 Selects area \r\n- [ ] Empty space \u2192 Selects area\r\n\r\n---\r\n\r\n### Drag Behavior (Mouse Down + Movement)\r\n\r\n#### Locked Areas\r\n\r\n##### With Children\r\n- [ ] Hint \u2192 Start panning (should also select area) \r\n- [ ] Empty space \u2192 Start panning \r\n\r\n##### Empty\r\n- [ ] Hint \u2192 Start panning (should also select the area, but it tries to drag the area instead) \r\n- [ ] Empty space \u2192 Start panning (should also select the area)\r\n\r\n#### Unlocked Areas\r\n\r\n##### With Children\r\n- [ ] Hint \u2192 Start dragging the area \r\n- [ ] Empty space \u2192 Start panning \r\n\r\n##### Empty\r\n- [ ] Hint \u2192 Start dragging the area \r\n- [ ] Empty space \u2192 Start dragging the area\r\n\r\n---\r\n\r\n## Reviewer Resources\r\n\r\n- **Ticket:** https://mural.atlassian.net/browse/CAN-8069\r\n- **Environment:** https://can-8069-areas-click.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45928, + "title": "[ECOMM-235] Update stripe elements with appearance API", + "branch": "update/ecomm-235-stripe-appearance-api", + "merged_at": "2025-11-04T14:59:53Z", + "changed_files": 7, + "additions": 173, + "deletions": 38, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis pull request refactors how Stripe Elements are styled and configured across the billing UI. The main change is the introduction of a centralized utility, `createStripeAppearance`, which uses design tokens from the UI Toolkit to generate a Stripe-compatible appearance configuration. This ensures consistent styling for Stripe inputs and elements, and removes redundant or hardcoded CSS from individual input components.\r\n\r\n**Minor UI adjustments:**\r\n\r\n* Removed the placeholder text from the purchase order input, likely to defer to Stripe's default or appearance-controlled placeholder.\r\n\r\n\r\n\"image\"\r\n\r\nhttps://www.loom.com/share/6d455cff0fc64d2d89a9a178a621d3f7\r\n\r\nhttps://ecomm-235-stripe-appearance-api.mural.engineering/\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-235) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 45935, + "title": "[PLAY-652] Profile widget should properly display out of sync icon for salesforce", + "branch": "update/sf-out-of-sync", + "merged_at": "2025-11-04T14:38:29Z", + "changed_files": 10, + "additions": 150, + "deletions": 19, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe profile widget should always show the company logo as the first label. To make this happen, update how we apply out of sync labels to place the out of sync label second if on a profile widget. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-652) to understand the context of this effort.\r\n\r\n\"Screenshot\r\n\r\ntest env: https://sf-out-of-sync.mural.engineering/\r\n", + "labels": [ + "bop" + ] + }, + { + "number": 45922, + "title": "Refactoring Tools : Move to Package Utility", + "branch": "move-to-package-utility", + "merged_at": "2025-11-03T21:27:13Z", + "changed_files": 18, + "additions": 2142, + "deletions": 9, + "body": "# Move to Package Utility\r\n\r\nAdds a new `move-to-package` command to the refactoring tools that automates the process of moving files from `src/` into packages while properly handling exports and import rewrites. The goal of this utility is to automate moving and updating imports for files that are ready to be modularized.\r\n\r\nFiles with 0 external dependencies you can test the utility with: \r\n- `src/common/with-state.tsx`, limited imports (~3 - 5)\r\n- `src/common/types.ts`, large number of imports (80+)\r\n\r\n## What It Does\r\n\r\nThe utility performs the following operations:\r\n\r\n- **Moves files** from `src/...` to `packages//src/...` using `git mv` (with filesystem fallback for untracked files)\r\n- **Updates barrel exports** - automatically creates/updates directory-level and package-level barrel files (`src/index.ts`) to export the moved file\r\n- **Rewrites imports** throughout the codebase - changes all relative imports pointing to the moved file to use package imports (`@muralco/`)\r\n- **Cleans up empty barrel files** left in the source directory if they only re-exported the moved file\r\n- **Supports dry-run mode** (default) - preview all changes as JSON before applying\r\n\r\n## Usage\r\n\r\n```bash\r\n# Dry-run (default) - preview changes as JSON\r\nnpx muralco-refactoring-tools move-to-package \\\r\n --from=src/common/utils/helper.ts \\\r\n --to=packages/utils/src/common/helper.ts\r\n\r\n# Apply changes\r\nnpx muralco-refactoring-tools move-to-package \\\r\n --from=src/common/utils/helper.ts \\\r\n --to=packages/utils/src/common/helper.ts \\\r\n --write\r\n\r\n# Use directory path (filename preserved automatically)\r\nnpx muralco-refactoring-tools move-to-package \\\r\n --from=src/common/utils/helper.ts \\\r\n --to=packages/utils/src/common/ \\\r\n --write\r\n\r\n# Create commit after applying changes\r\nnpx muralco-refactoring-tools move-to-package \\\r\n --from=src/common/utils/helper.ts \\\r\n --to=packages/utils/src/common/helper.ts \\\r\n --write \\\r\n --commit\r\n```\r\n\r\n## Implementation Details\r\n\r\n- Validat", + "labels": [] + }, + { + "number": 45919, + "title": "[CWI-2310] Jira migration flow for BSH", + "branch": "add/cwi-2342", + "merged_at": "2025-11-03T20:59:58Z", + "changed_files": 27, + "additions": 817, + "deletions": 34, + "body": "### Summary of Changes and Resources for the Reviewer\r\nJira migration flow for BSH\r\n\r\n#### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2310\r\n\r\n#### Related PRs\r\nhttps://github.com/tactivos/mural-integrations/pull/1628", + "labels": [] + }, + { + "number": 45926, + "title": "[CAN-8029] Summon and Follow Layer", + "branch": "add/can-8029-summon-and-follow", + "merged_at": "2025-11-03T19:35:28Z", + "changed_files": 9, + "additions": 412, + "deletions": 272, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nSummon and Follow Layer UI updates\r\n\r\n- Moved the following layer from the mural-container to the Toolbar grid layer\r\n- Inside of the following layer was a Notification. I extracted this from this layer so that I could place it in it's new spot regardless of the following layer. (This was good too in that I was able to put it right next to the `AskedToBeFollowedNotification`)\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8029)\r\n[Test Env](https://can-8029-summon-and-follow.mural.engineering)\r\n\r\n\r\nhttps://github.com/user-attachments/assets/e3148d9f-ff37-420c-b9e5-10a56e1bc6e0\r\n\r\n", + "labels": [] + }, + { + "number": 45933, + "title": "[CWI-2351] Fix - Salesforce - Update Phone to empty is not working well when syncing", + "branch": "fix/cwi-2351", + "merged_at": "2025-11-03T18:27:03Z", + "changed_files": 16, + "additions": 52, + "deletions": 36, + "body": "### What changes does this PR introduce?\r\nFix - Salesforce - Update Phone to empty is not working well when syncing\r\n\r\n### Jira Ticket\r\nhttps://mural.atlassian.net/browse/CWI-2351\r\n\r\n### Related PRs\r\nhttps://github.com/tactivos/mural-api/pull/14799", + "labels": [] + }, + { + "number": 45898, + "title": "[ENGAGE-1308] Update styles for the visitor link", + "branch": "add/style-visitor-link-permission", + "merged_at": "2025-11-03T17:39:43Z", + "changed_files": 6, + "additions": 317, + "deletions": 96, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds permission control based on mural ownership by introducing an `ownedByMe` prop to the link sharing widget. Non-owners can now view link permissions but cannot modify them, with an informative tooltip explaining the restriction.\r\n\r\nKey changes:\r\n- Added `ownedByMe` prop to control edit permissions for link sharing settings\r\n- Disabled permission dropdown for non-owners with explanatory tooltip\r\n- Refactored styles to create dedicated classes for link permission UI elements\r\n- Swapped spacing values for better visual hierarchy\r\n\r\n\"image\"\r\n\"image\"\r\n\"image\"\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/views/mural/modals/share/share-mural/link-invite-widget/index.tsx | Passes `ownedByMe` prop to LinkInfo component |\r\n| src/views/mural/modals/share/share-mural/link-invite-widget/LinkInfo.tsx | Adds ownership check to disable permission editing and show tooltip |\r\n| src/views/mural/modals/share/share-mural/link-invite-widget/LinkInfo.test.tsx | Updates test helper to include `ownedByMe` parameter with default value |\r\n| src/views/mural/modals/share/share-mural/link-invite-widget/styles.module.sass | Adds dedicated styles for link permission UI and adjusts spacing values |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1308) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scqm-1320-preview-buttons.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. ", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45624, + "title": "[PLAY-652] Profile widget should properly display out of sync icon for salesforce ", + "branch": "fix/out-of-sync-profile", + "merged_at": "2025-11-03T15:38:54Z", + "changed_files": 2, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR updates how we generate company logo labels for profile cards. I'm updating the ID to be a value that we can actually look for and is human readable. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-652) to understand the context of this effort.\r\ndemo: https://www.loom.com/share/1cb4450826674c49acc70fc14d21daca\r\n\r\n\r\ntest env: https://out-of-sync-profile.mural.engineering/\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14774)\r\n- [**Render PR**](https://github.com/tactivos/mural-render/pull/1427)\r\n\n\n---\n\n> [!NOTE]\n> Standardizes the company logo label id to `companyLogo` in profile widget generation and the set-company-logo action.\n> \n> - **Profile widget labels**:\n> - Update `getCompanyLogoIcon` to use label id `companyLogo` in `src/mural/business/profile-widget.ts`.\n> - **Widgets API action**:\n> - Set default company logo label id to `companyLogo` in `src/mural/sdk/apis/widgets/changes/actions/profile/set-company-logo.ts`.\n> \n> Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1b5d3744ef51ed07f45d2596d4ba6630c110f890. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).\n", + "labels": [] + }, + { + "number": 45923, + "title": "[CAN-8065] Remove call to `widgets.update` when changing stacking order", + "branch": "refactor/change-stacking-order", + "merged_at": "2025-11-03T13:01:35Z", + "changed_files": 8, + "additions": 62, + "deletions": 71, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIn our entire codebase there's only place that is changing the `stackingOrder` of widgets using the deprecated method `sdk.widgets.update` instead of the new `Widget Changes` API, and that is the business rule `changeStackingOrder`.\r\n\r\nLuckily for us, that business rule has only one caller: another business rule called `ungroupSelectedWidgets` which, as the name suggests, handles... well, you probably got it by now.\r\n\r\nThis PR moves the logic of `changeStackingOrder` inside `ungroupSelectedWidgets` and then refactors it to use the `Widget Changes` API for all its updates.\r\n\r\nWhile there's a change in logic along this (we'll have systems running now that we haven't had before), we should not expect any particular change in behavior, with one exception:\r\n\r\nArrows that get ungrouped inside an area were previously getting manually attached to it via `update`. That goes completely against our intended behavior for arrows and areas, which is that they should get absorbed if they're fully contained inside.\r\nBy removing that manual fix and using the `Widget Changes` API, we now get the consist behavior we should have had.\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8065)\r\n- \ud83e\uddea [**Testing environment**](https://change-stacking-order.mural.engineering)", + "labels": [] + }, + { + "number": 45753, + "title": "[CPT-2421] Adds templates files to CODEOWNERS", + "branch": "add/templates-codeowners", + "merged_at": "2025-10-31T21:21:06Z", + "changed_files": 1, + "additions": 57, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nProperly assigns template files in Codeowner file, to assign us to the correct code reviews\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CPT-2421) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Updates CODEOWNERS to consolidate and expand template and content library paths under @tactivos/templates-learning.\n> \n> - **CODEOWNERS**:\n> - **Templates/Learning ownership**: Add and consolidate numerous `features/*`, `src/*`, and `packages/*` pa", + "labels": [] + }, + { + "number": 45909, + "title": "[IAM-2237] Add room edit role bulk action", + "branch": "feat/iam-2237-add-room-role-bulk", + "merged_at": "2025-10-31T20:11:48Z", + "changed_files": 8, + "additions": 565, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a new \"Edit role\" action in the bulk action bar for editing multiple user roles\r\n\r\n#### Reviewer Resources\r\n- Loom demo: https://www.loom.com/share/a5f8e0a96e6a40738c1b288ddd578af1\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2237) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2237-add-room-role-bulk.mural.engineering/t/u537503e5f8fd417fa0b17692/r/1761843286017969/settings/members) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nI've configured the environment with the ACR flag and the link above goes to a room users management view with some seeded users for testing. You can use the following admin credentials:\r\n```\r\ngerry.anderson@hunnur.com\r\nihRZDyTWRkGUqII\r\n```\r\n\r\nTest cases:\r\n- Check that action does NOT appear if the selection does not contain ANY valid users\r\n- Check that the action DOES appear if the selection contains AT LEAST ONE valid user\r\n- Check that the disclaimer language does NOT appear in the modal if ALL the users are valid\r\n- Check that the disclaimer language appears if AT LEAST ONE of the users is invalid\r\n- Check that a success toast appears / the modal is dismissed / roles are updated on succesful submit\r\n- Check that an error message appears / the modal is NOT dismissed / roles are NOT update on submit error (use network request blocking)\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [", + "labels": [] + }, + { + "number": 45914, + "title": "[SCQM-1364] Update/ai upgrade tracking paid feature", + "branch": "update/ai-upgrade-tracking-paid-feature", + "merged_at": "2025-10-31T19:38:04Z", + "changed_files": 31, + "additions": 569, + "deletions": 117, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking for ai paid feature clicks and centralizes previously implemented ai upgrade related tracking\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1364) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n\n\n---\n\n> [!NOTE]\n> Centralizes AI upgrade tracking with location/feature-aware utilities and wires them across AI UI, adding the `CLICKED_PAID_FEATURE` event.\n> \n> - **Tracking/Utils**:\n> - Introduce `ai-upgrade/utils` with `AI_UPGRADE_LOCATION_{HUB,EXPLOR", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45920, + "title": "[CAN-8070] Add voting select area tools to topbar", + "branch": "fix/voting-select-area", + "merged_at": "2025-10-31T19:20:24Z", + "changed_files": 4, + "additions": 86, + "deletions": 45, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is a temporary design for the Voting Area Select until a final design is made.\r\n\r\n\"image\"\r\n\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8070)\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622", + "labels": [] + }, + { + "number": 45894, + "title": "[SCQM-1459] - Fix diagram error tracking event reasons", + "branch": "add/scqm-1459-diagram-error-tracking", + "merged_at": "2025-10-31T19:07:22Z", + "changed_files": 2, + "additions": 35, + "deletions": 24, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFixes a bug where failure tracking events for ai diagram do not have `reason` attached, by setting the failure reason strings depending on the type of failure.\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: http://mural.atlassian.net/browse/SCQM-1459\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45916, + "title": "[PLAY-667] - Fix profile widget avatar tooltip", + "branch": "fix/profile-image-tooltip", + "merged_at": "2025-10-31T17:49:24Z", + "changed_files": 2, + "additions": 204, + "deletions": 4, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, on a profile widget with a private avatar, the \"private avatar\" tooltip displayed prevents the user from seeing label tooltips and interacting with the label overflow button. The cursor does not change the pointer to a cursor-pointer when hovering over the avatar and the overflow button cannot be clicked.\r\n\r\nWith these changes, we add a hint to the Avatar group of a Profile widget. We use this hint to determine if the mouse is over the avatar and display tooltip accordingly. We set the cursor to cursor-pointer when hovering over the avatar. Other issues resolved.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**PLAY-667**](https://mural.atlassian.net/browse/PLAY-667) to understand the context of this effort.\r\nDEMO: \r\nhttps://www.loom.com/share/cfe71ef897ed4a7d953a192fbc1add76\r\n\r\nTest env:\r\n[profile-image-tooltip.mural.engineering](https://profile-image-tooltip.mural.engineering/)\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**RENDER PR**](https://github.com/tactivos/mural-render/pull/1449)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good tech", + "labels": [] + }, + { + "number": 45853, + "title": "[CAN-7788] Allow button link url for no TLD", + "branch": "fix/can-7788", + "merged_at": "2025-10-31T17:32:39Z", + "changed_files": 35, + "additions": 196, + "deletions": 281, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n Prior to these changes the widget link wasn't allowing no TLD urls. \r\n Now, with these changes, widget link accepts no TLD urls\r\n\r\nSince this change envolved to use the same validation in mural-api, we are sharing the library from @tactivos/mural-shared.\r\n\r\n`urlRegex` was replaced by a customized version of url-regex-safe that contains an option for noTLD urls.\r\n`urlRegex` from @muralco/mural-utils was removed in favor of the one in @tactivos/mural-shared\r\nall the consumers were updated to match the new implementation.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7788) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-7788.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**](https://github.com/tactivos/mural-api/pull/14740)\r\n- [**WEB PR**](https://github.com/tactivos/murally/pull/45853)\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing", + "labels": [] + }, + { + "number": 45924, + "title": "[CAN-8069] Areas improvements touchline - Part I - Reorder areas improvements tests", + "branch": "fix/can-8069-reorder-tests", + "merged_at": "2025-10-31T17:15:43Z", + "changed_files": 11, + "additions": 578, + "deletions": 331, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR is Part I of CAN-8069 where we're trying to finish this feature. \r\nIn this step we reorder the tests and rename some of them, splitting them by navigation mode and action so it's easier to find different interactions.\r\nNo productive code is changed in this PR, so as long as it builds, we can merge this.\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8069\r\n", + "labels": [] + }, + { + "number": 45921, + "title": "[CAN-8071] Fix addon runs everytime we open and close template modal", + "branch": "beta-fix/can-8071", + "merged_at": "2025-10-31T15:16:46Z", + "changed_files": 1, + "additions": 11, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, every time a test user opened and closed the templates modal, the addon would re-run and add more and more sidebar buttons, this happened because the early return was only for when the addon is mounted, but not when it's executed by the modal. \r\n\r\n\"image\"\r\n\r\n\r\nNow, I moved the early return if the experiment variant has been fetched inside runNavigationControlsExperiment fn, ensuring no matter who calls it, it only runs once.\r\n\r\nAfter opening and closing modal:\r\n\"image\"\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8071) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8071.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [] + }, + { + "number": 45917, + "title": "[CAN-7972] Make horizontal resize also consider the possibility of height change", + "branch": "fix/can-7972-title-size", + "merged_at": "2025-10-31T14:10:19Z", + "changed_files": 4, + "additions": 190, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds the computing of height to horizontal resize, it wasn't being considered neither in `resizeSingleWidget` nor `resizeMultiWidgets` and titles change height when horizontally resized.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/59a9993a-20fd-4360-b212-6df08561e143)\r\n\r\nMaster:\r\n![master](https://github.com/user-attachments/assets/2460c696-a843-4171-87b5-4a5c34773aed)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-7972\r\n- Env: https://can-7972-title-size.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45892, + "title": "[CAN-8027] Voting mode bar", + "branch": "add/can-8027-voting-mode-bar", + "merged_at": "2025-10-31T12:57:16Z", + "changed_files": 13, + "additions": 133, + "deletions": 35, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Adds Voting mode topbar\r\n[Jira](https://mural.atlassian.net/browse/CAN-8027)\r\n[Test Env](https://can-8027-voting-mode-bar.mural.engineering/)\r\n\r\n\"image\"\r\n\r\n \r\nParts that are still missing/needs work\r\n- Timer https://mural.atlassian.net/browse/CAN-8047\r\n- Share button https://mural.atlassian.net/browse/CAN-8046\r\n- Dividers: We are keeping those for now", + "labels": [] + }, + { + "number": 45889, + "title": "[ENGAGE-1393] Add visitor disabled state in advanced settings tab", + "branch": "fix/engage-1393", + "merged_at": "2025-10-31T01:44:26Z", + "changed_files": 5, + "additions": 242, + "deletions": 172, + "body": "Test Env: https://engage-1393.mural.engineering/\r\n\r\nThis is how it looks when visitor is disabled.\r\n\"image\"\r\n\r\n\r\nThis is how it looks when access level is RESTRICTED.\r\n\r\n\"image\"\r\n\r\n", + "labels": [] + }, + { + "number": 45913, + "title": "[ECOMM-263] pre fill existing vat number and purchase order", + "branch": "add/ecomm-264", + "merged_at": "2025-10-30T21:13:11Z", + "changed_files": 9, + "additions": 146, + "deletions": 14, + "body": "### Summary of Changes and Resources for the Reviewer\r\nI pre fill the values for purchaseOrder and VatNumber in edit payment method and edit plan\r\n\r\nPlease review:\r\n- \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-264)\r\n- \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-263)\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n\r\n\r\n### Record edit payment method and edit plan\r\n\r\nhttps://www.loom.com/share/747a6f4f4df74847b6af5fa3dcc3bd30\r\n\r\n\r\n### Record edit address\r\nhttps://www.loom.com/share/5440f4fd29ed4fefa7a4604f152dab96", + "labels": [] + }, + { + "number": 45900, + "title": "[SCQM-1332] Prevent accept / discard when no preview mode data exists", + "branch": "fix/empty-type-preview-mode-accept", + "merged_at": "2025-10-30T19:28:04Z", + "changed_files": 1, + "additions": 15, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nCurrently there are some preview mode accept & discard events getting tracked that do not have an ai feature `type` in them (see the query in the ticket)\r\n\r\nThis happens when accept / discard is run but `currentPreviewMode` `data` is completely empty - which is the default state that gets reset when preview mode *ends*. So I'm using that as a gate - you shouldn't be able to accept / discard when there is no preview mode data available. \r\n\r\nAs for *how* this is happening.... the only tangible example of this I can reproduce is if `previewMode.accept()` or `previewMode.discard()` get run **twice** for a set of changes ( accept called, which clears state, accept called again now with empty state) - which did used to happen in some of the [callbacks](https://github.com/tactivos/murally/pull/45370/commits/15c91af7e855e0bc738e748e6976abc5e7090546). But I couldn't find any other ways this could still be happening so possibly a race condition somewhere. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1332) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://empty-type-preview-mode-accept.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45910, + "title": "[CAN-8058] Prevent visual glitch of area selection when doing marquee select", + "branch": "fix/can-8058-shift-drag", + "merged_at": "2025-10-30T18:48:12Z", + "changed_files": 3, + "additions": 94, + "deletions": 22, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nIn mouse navigation mode, Shift+click on an unlocked area with children selected the area on mousedown. Users expect marquee selection on drag; selection should be deferred to mouseup. This PR adds handleShiftMouseModeAreaInteraction() to defer selection when Shift is pressed in mouse mode on unlocked areas with children (no hint), allowing marquee to start on drag while preserving click-to-select on mouseup.\r\n\r\nPR\r\n![pr](https://github.com/user-attachments/assets/6b23e1ca-3edf-4629-9c70-4b1822a035f1)\r\n\r\nMaster\r\n![master](https://github.com/user-attachments/assets/f0812e3c-2371-4bce-b613-d04002c8d736)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8058\r\n- Env: https://can-8058-shift-drag.mural.engineering", + "labels": [] + }, + { + "number": 45891, + "title": "[SCQM-1321] - Add verify board tracking event", + "branch": "add/scqm-1321-verify-baord-tracking", + "merged_at": "2025-10-30T18:33:35Z", + "changed_files": 3, + "additions": 137, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a tracking event when using the verify/fix planner board tool, passing info about the number and type of errors fixed.\r\n\r\nTo test: create a planner board, add a bunch of tickets, add/remove columns (it's hard to replicate specific planner board issues), and use the verify board tool by selecting the board and pressing `shift-control-p`, to see tracking event\r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\nJIRA ticket: https://mural.atlassian.net/browse/SCQM-1321\r\nTest env: https://scqm-1321-verify-baord-tracking.mural.engineering/\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mur", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45865, + "title": "Update UI Toolkit : Improved Menu + Modal Focus Management & ARIA Support", + "branch": "update-uik-modal-focus", + "merged_at": "2025-10-30T17:49:36Z", + "changed_files": 40, + "additions": 297, + "deletions": 26, + "body": "## Update UI Toolkit: Improved Menu + Modal Focus Management & ARIA Support\r\n\r\nThis PR updates `@muraldevkit/ui-toolkit` from v4.52.3 to v4.52.4, bringing enhanced accessibility features and improved focus management.\r\n\r\nThe changes fix an underlying issue where a keyboard user loses focus if they open a modal from a menu and then close the menu. With these changes focus will be returned back to the menu trigger when the modal is dismissed instead of becoming lost. \r\n\r\n### Key Changes\r\n\r\n**Accessibility Improvements:**\r\n- Added `ariaHasPopup` support for menu items that trigger dialogs/modals\r\n- Enhanced ARIA role support with `MenuItemRole` type for better screen reader compatibility\r\n- Improved modal user experience and focus management based on `aria-haspopup` attribute\r\n\r\n**Updated Components:**\r\n- **Menu Items**: Added `ariaHasPopup` and `role` props to action definitions across dashboard & canvas\r\n- **Tool Registration**: Updated tool API to support new accessibility attributes\r\n- **Universal Card & Rooms & Template Actions**: Updated Actions API to support new values\r\n\r\nTest env: http://update-uik-modal-focus.mural.engineering\r\n\r\nHow to test: \r\n- navigate to a menu using your keyboard (try the mural actions, room actions, or mural options menu on the canvas)\r\n- open menu item that triggers a modal\r\n- dismiss modal\r\n- notice focus moves back to the menu trigger", + "labels": [] + }, + { + "number": 45873, + "title": "[SCQM-1362] [SCQM-1363] Update/ai upgrade tracking callout", + "branch": "update/ai-upgrade-tracking-callout", + "merged_at": "2025-10-30T17:14:35Z", + "changed_files": 5, + "additions": 200, + "deletions": 3, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking for user views of the AI upgrade callout and button click on 'upgrade'.\r\n\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1363) to understand the context of this effort.\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1362) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45868, + "title": "[CAN-8024] Private mode topbar", + "branch": "add/can-8024-private-mode-bar", + "merged_at": "2025-10-30T15:40:44Z", + "changed_files": 13, + "additions": 150, + "deletions": 25, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Adds Private mode topbar\r\n[Jira](https://mural.atlassian.net/browse/CAN-8024)\r\n[Test Env](https://can-8024-private-mode-bar.mural.engineering/)\r\n \r\nParts that are still missing/needs work\r\n- Timer https://mural.atlassian.net/browse/CAN-8047\r\n- Share button https://mural.atlassian.net/browse/CAN-8046\r\n- Dividers: We are keeping those for now\r\n\r\n\"image\"\r\n", + "labels": [] + }, + { + "number": 45904, + "title": "[CAN-8055] Fix copied HTML content from lexical ", + "branch": "fix/can-8055", + "merged_at": "2025-10-30T15:16:37Z", + "changed_files": 2, + "additions": 51, + "deletions": 24, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n## \ud83e\udde9 Summary of Changes\r\n\r\nPreviously, copying and pasting a **partial selection** from the Lexical editor \u2014 especially selections containing a line break \u2014 could produce **duplicated text**.\r\n\r\nThis update fixes that issue: copying and pasting now works correctly, without duplication.\r\n\r\n---\r\n\r\n## \ud83d\udca1 Context\r\n\r\nThis regression was introduced when we enhanced the editor to support **`` elements**.\r\nAt that time, we began storing a **richer HTML representation** of copied content in the clipboard using our **custom HTML serializer**.\r\n\r\nHowever, when copying only part of the document:\r\n\r\n* `selection.getNodes()` returns a **flat, \u201cdirty\u201d list** of nodes \u2014 not a full Lexical document.\r\n* Some nodes can appear **duplicated** in this list.\r\n* Our `serializeNodes` method expects a **clean, complete document**, not an arbitrary or repeated subset of nodes.\r\n\r\nAs a result, the serializer couldn\u2019t properly handle partial selections.\r\n\r\n---\r\n\r\n## \ud83d\udd27 Fix\r\n\r\nInstead of serializing the selection directly:\r\n\r\n1. The Lexical JSON already stored in the clipboard is parsed.\r\n2. This produces a **clean, complete node structure**.\r\n3. That structure is then converted to HTML using **Lexical\u2019s built-in serialization logic**.\r\n\r\nThis approach:\r\n\r\n* Eliminates duplication in partial selections.\r\n* Leverages Lexical\u2019s **native serialization pipeline** for consistency.\r\n* Adds only minimal overhead from parsing the JSON data.\r\n\r\n---\r\n\r\n## \u2705 Outcome\r\n\r\n* Copying and pasting **partial or multi-line selections** now works correctly.\r\n* The implementation is **more robust**, **consistent**, and **aligned with Lexical\u2019s intended API usage**.\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8055) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**", + "labels": [] + }, + { + "number": 45884, + "title": "[CAN-8048] Panning the canvas in mouse mode with left click + drag on empty spaces of locked areas", + "branch": "beta-fix/can-8048", + "merged_at": "2025-10-30T14:55:39Z", + "changed_files": 9, + "additions": 772, + "deletions": 64, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR fixes a bug where, in mouse mode, while holding mouse down on a locked area with children marquee select would start. This should only happen in unlocked areas. In locked areas we should pan the mural as click + drag does in any other part of the mural.\r\n\r\n![pr](https://github.com/user-attachments/assets/ca3ba180-3ad6-421f-b922-6dd50c0c161f)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8048\r\n- Env: https://can-8048.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45903, + "title": "[CAN-8056] Use controlledState prop for non-animated sidebar button", + "branch": "beta-fix/can-8056", + "merged_at": "2025-10-30T14:04:58Z", + "changed_files": 1, + "additions": 2, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThe non-animated sidebar buttons are using the regular state instead of the controlledState that overrides the internal state management. When provided, this takes precedence over the state prop and allows the parent component to fully control the icon button's state.\r\n\r\nThis results in the new Pan sidebar button to be unselected while in Pan mode if the user clicks the sidebar button.\r\n\r\nLoom demo: https://www.loom.com/share/2abcfbf7ddde4d4bb0b5eaa60b95397e\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8056) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-8056.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\nTo test this you have to set a local override for /api/v0/features/ab/navigation_controls_ab_test with: {\"variation\":\"variant_2\"}\r\n\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 45836, + "title": "[IAM-2251] Inline, bulk editing, and mutations for workspace user", + "branch": "feat/iam-2251-mutations", + "merged_at": "2025-10-30T09:35:35Z", + "changed_files": 30, + "additions": 1072, + "deletions": 199, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nImplement all the mutations that can be triggered from the workspace user table.\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2251**](https://mural.atlassian.net/browse/IAM-2251)\r\n- \ud83e\uddea [**iam-2251-mutations.mural.engineering**](https://iam-2251-mutations.mural.engineering/)\r\n- \ud83c\udfac **Loom demo**", + "labels": [] + }, + { + "number": 45897, + "title": "[SCQM-1458] - Add new events for ai diagram mindmap tracking", + "branch": "add/scqm-1458-diagram-mindmap-tracking", + "merged_at": "2025-10-29T22:11:27Z", + "changed_files": 2, + "additions": 32, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds new tracking events and logic for ai-mindmaps to distinguish when logging between events that were triggered as part of the diagramming flow. Previously, all events used the same names - `mindmap_start`, etc. Now events originating in the diagram flow will have the `diagram` prefix added: `diagram_mindmap_start`, etc.\r\n\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n\r\n#### Reviewer Resources\r\nJIRA Ticket: https://mural.atlassian.net/browse/SCQM-1458\r\nTest env: https://scqm-1458-diagram-mindmap-tracking.mural.engineering/\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Contex", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45896, + "title": "ENGAGE-1395 migrate v1 features/registration/signin-clean.feature to v2", + "branch": "add/clean-sign-in-test", + "merged_at": "2025-10-29T21:17:51Z", + "changed_files": 2, + "additions": 8, + "deletions": 16, + "body": "This pr migrates features/registration/signin-clean.feature from v1 to v2\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1395\r\n", + "labels": [] + }, + { + "number": 45895, + "title": "ENGAGE-1394 migrate v1 features/modals/share/workspace/invite-link/invite-link.feature to jest tests", + "branch": "add/invite-workspace-tests", + "merged_at": "2025-10-29T20:48:48Z", + "changed_files": 3, + "additions": 673, + "deletions": 37, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates workspace invite link tests from Cucumber E2E tests to Jest unit/integration tests. The Cucumber tests were failing due to invalid endpoint URL configuration (marked with `@ignore` and `@TECHDEBT`), which prevented proper testing of the invite link functionality.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1394\r\n\r\n### Key Changes:\r\n- Removes ignored Cucumber E2E test file for workspace invite link scenarios\r\n- Adds comprehensive Jest tests for `` component (384 lines)\r\n- Adds comprehensive Jest tests for `` component (292 lines)\r\n- Tests cover modal rendering, invite link creation/revocation, URL copying, and edge cases\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| features/modals/share/workspace/invite-link/invite-link.feature | Removed ignored Cucumber E2E test file with invalid webapp endpoint configuration |\r\n| src/modals/share/workspace/invite-workspace.test.tsx | Added comprehensive Jest tests for workspace invite modal with proper mocking and async handling |\r\n| src/modals/share/link/create.test.tsx | Added comprehensive Jest tests for link creation component including copy/create interactions |", + "labels": [] + }, + { + "number": 45882, + "title": "Fix/integration tests for wheel", + "branch": "fix/integration-tests-for-wheel", + "merged_at": "2025-10-29T20:45:28Z", + "changed_files": 11, + "additions": 116, + "deletions": 134, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/34570568", + "labels": [] + }, + { + "number": 45784, + "title": "[FEP-6404] - update copy button implementations with MrlProcessingButton", + "branch": "feat/mrl-processing-button", + "merged_at": "2025-10-29T20:37:55Z", + "changed_files": 18, + "additions": 352, + "deletions": 445, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n[FEP-6404](https://mural.atlassian.net/browse/FEP-6404)\r\n\r\n[https://mrl-processing-button.mural.engineering/](https://mrl-processing-button.mural.engineering/)\r\n\r\nThis PR updates the following copy button implementations to use `MrlProcessingButton`.\r\n\r\n- SCIM API key modal.\r\n- Identity and access page, provisioning - automatic, base url copy button.\r\n- API Keys, copy api key button.\r\n- Template library footer, \"Copy share link\" button.\r\n- `/learning` \"share video\" modal, \"copy link\" button.\r\n- `/apps` basic information, client id and client secret copy button.\r\n- share modal copy button.\r\n\r\n Copy Button Instances Removed\r\n\r\n\r\n 1. `src/lib/components/shared/copy-button/index.tsx`\r\n \r\n Files that used this component:\r\n \u2022 src/common/template-library/components/preview/footer.tsx\r\n \u2022 src/dashboard/learning/modals/share-modal.tsx\r\n \u2022 src/settings/user/developers/form/app-sharing-form.tsx\r\n \u2022 src/settings/user/developers/form/clientAppCredentials.tsx\r\n \u2022 features/account-settings/client-app-registration/basic-information.feature\r\n\r\n\r\n 2. `packages/identity-and-access-management/src/company/security/provisioning/copy-button.tsx`\r\n \r\n Files that used this component:\r\n \u2022 packages/identity-and-access-management/src/company/security/provisioning/modals/generate-key-modal/generate-apikey-modal.tsx\r\n \u2022 packages/identity-and-access-management/src/company/security/provisioning/scim/base-url.tsx\r\n\r\n\r\n 3. `src/views/mural/modals/share/share-mural/copy-link.tsx`\r\n\r\n Files that used this component:\r\n \u2022 src/views/mural/modals/share/share-mural/views/share-link.tsx\r\n\r\n 4. `packages/settings/company-settings/src/development/api-key/modals/show-api-key/copy-button/index.tsx`\r\n\r\n Files that used this component:\r\n - packages/settings/company-settings/src/development/api-key/modals/show-api-key/index.tsx\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effor", + "labels": [] + }, + { + "number": 45887, + "title": "[ECOMM-249] Remove optimizely isCheckoutSessionEnabled flag, replace with config stripe.vNextEnabled", + "branch": "remove/checkout-session-opti-flag", + "merged_at": "2025-10-29T19:36:24Z", + "changed_files": 5, + "additions": 7, + "deletions": 13, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis pull request updates how the Stripe Checkout Session feature flag is handled in the billing settings and checkout flows. Instead of relying on Optimizely feature flags, the code now reads the relevant configuration directly from the application config. Related test scenarios have also been updated to use configuration objects instead of Optimizely feature flags.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-249) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n", + "labels": [] + }, + { + "number": 45888, + "title": "[CAN-7973] Add `Reset` button on Flags Manager entries", + "branch": "add/flags-manager-reset", + "merged_at": "2025-10-29T18:38:46Z", + "changed_files": 9, + "additions": 416, + "deletions": 340, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR adds a new reset functionality to the entries in the Flags Manager:\r\n\r\n\"image\"\r\n\r\nThis `Reset` button will remove the entry from the local storage and restore the flag to the original value retrieved from the server.\r\n\r\nThe button only appears on values from the Flags Manager that have been manually modified by the user, so those entries without it represent values straight from the back-end.\r\n\r\nAnother related change is added here as well: given that we can now reset entries manually, there's no need to specify whether we want local storage or not. We store everything locally by default and if we don't want something to be there, we simply reset its value.\r\n![Oct-29-2025 13-05-28](https://github.com/user-attachments/assets/c51ed4dc-8302-492f-aed5-70c0e3be214c)\r\n\r\n\r\nBecause of this immediacy, the `Save` button on the window is no longer operative, the changes are now saved immediately as we set them:\r\n![Oct-29-2025 13-04-03](https://github.com/user-attachments/assets/1eef3fad-b294-46d3-98ad-a76e60f6c196)\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7973)\r\n- \ud83e\uddea [**Testing environment**](https://flags-manager-reset.mural.engineering)", + "labels": [] + }, + { + "number": 45890, + "title": "ENGAGE-1347 Remove remaining v1 setup test files", + "branch": "add/cucumber-mock-cleanup", + "merged_at": "2025-10-29T18:27:58Z", + "changed_files": 5, + "additions": 46, + "deletions": 484, + "body": "This pr removes old v1 cucumber test file mocks and data-qa code that is no longer being used after the cleanup. \r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1347", + "labels": [] + }, + { + "number": 45810, + "title": "[SCQM-1229] AI Translate - add event origin tracking", + "branch": "add/ai-translate-form-tracking", + "merged_at": "2025-10-29T18:14:20Z", + "changed_files": 6, + "additions": 90, + "deletions": 22, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds tracking around *where* a translate request originated - explore menu or hub. Also adds the request id so we can track which origin has a higher rate of preview mode acceptance. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1229) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-translate-form-tracking.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\nFrom Hub:\r\n\"Screenshot\r\nFrom Explore:\r\n\"Screenshot\r\n\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45881, + "title": "ENGAGE-1392 Add optimizely test coverage", + "branch": "add/optimizely-test", + "merged_at": "2025-10-29T17:57:11Z", + "changed_files": 2, + "additions": 35, + "deletions": 0, + "body": "This pull request adds Optimizely test coverage to the v2 test rig.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1392", + "labels": [] + }, + { + "number": 45880, + "title": "ENGAGE-1373 migrate v1 email-admin.feature to v2", + "branch": "update/email-feature", + "merged_at": "2025-10-29T17:22:00Z", + "changed_files": 4, + "additions": 97, + "deletions": 47, + "body": "This pr migrates v1 features/tracking/email-admin/email-admin.feature to v2 for the dashboard/engagement team. \r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1373\r\n", + "labels": [] + }, + { + "number": 45864, + "title": "[CAN-8020] Inverted FixedToolbar", + "branch": "add/can-8020-inverted-toolbar", + "merged_at": "2025-10-29T17:11:14Z", + "changed_files": 4, + "additions": 68, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add an inverted variant of the FixedToolbar\r\n\r\n\"image\"\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8038)\r\n[Test Env](https://can-8020-inverted-toolbar.mural.engineering/)\r\n", + "labels": [] + }, + { + "number": 45879, + "title": "ENGAGE-1368 removing v1 create-mural-from-modal.feature", + "branch": "remove/create-mural-old-test", + "merged_at": "2025-10-29T16:56:50Z", + "changed_files": 1, + "additions": 0, + "deletions": 176, + "body": "This pr removes old v1 features/signup-flow/create-mural-from-modal.feature. This test has coverage in v2 so it is no longer needed. Please see coverage below:\r\n\r\nExisting Coverage:\r\n\r\n- Onboarding flow: about-you.feature \u2014 tests mural creation during onboarding and redirect\r\n- Template modal visibility: create-mural.feature lines 19-34 \u2014 tests modal visibility based on flags and query params\r\n- Template addition: addons/template-library/table.feature \u2014 tests adding templates to murals\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1368", + "labels": [] + }, + { + "number": 45858, + "title": "[SCQM-1256] Fix remove planner column undo", + "branch": "fix/ekb-column-delete-undo-take-2", + "merged_at": "2025-10-29T16:46:27Z", + "changed_files": 1, + "additions": 43, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\nPrior to these changes, a single undo request after deleting a smart planner column resulted in a broken planner.\r\n\r\nI believe this was due to the CE undo step being attached to the remove column planner transaction, which contained a call to `deleteWidgets` which had its own separate transactions and therefore breaking on \"redo\" by not redoing these in one transaction. By handling the deletion of the widgets ourselves, all the changes can be associated with the same transaction.\r\n\r\nExtra note: In the original PR, I pointed out a bug that prevented _redoing_ the _undo_ (removing the column again) that was a larger issue. With this PR, you can now undo then redo successfully... but you encounter similar bugs / a bad state if you try to undo repeatedly further back so there's still something questionable happening with the planner's undo / redo stack - I adjusted that ticket to reflect this. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1256) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ekb-column-delete-undo-take-2.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n1. Add a planner\r\n2. Remove a column\r\n3. UNDO to add the column back\r\n4. Verify the column is added back in its entirety / the board is functional \r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45878, + "title": "ENGAGE-1367 migrate features/registration/signout.feature from v1 to v2", + "branch": "add/custom-logout-test", + "merged_at": "2025-10-29T16:23:20Z", + "changed_files": 3, + "additions": 20, + "deletions": 14, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates a deprecated Test Rig 1 test to the newer Jest + React Testing Library framework (Test Rig 2). The test validates that users with a custom logout URL configured are redirected to that custom URL when signing out, rather than the default `/signin` route.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1367\r\n\r\n**Key changes:**\r\n- Migrates the sign-out with custom logout URL test from the deprecated `features/registration/` directory to the new `src/test/react-new/features/dashboard/` location\r\n- Updates test syntax from Test Rig 1 patterns to Test Rig 2 patterns (e.g., `my user U` \u2192 `a user U`, updated selector patterns)\r\n- Removes the old deprecated test file entirely\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/test/react-new/features/dashboard/signout-with-custom-logout.feature | New Test Rig 2 test for sign-out functionality with custom logout URL redirection |\r\n| features/registration/signout.feature | Removed deprecated Test Rig 1 test file |", + "labels": [] + }, + { + "number": 45866, + "title": "[IAM-2236] add room quick dropdown filters for ACR view ", + "branch": "feat/iam-2236-add-room-quick-filters", + "merged_at": "2025-10-29T16:12:18Z", + "changed_files": 13, + "additions": 437, + "deletions": 75, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nConditionally renders two independent \"quick filters\" for the room users management view for a room underneath a company/workspace with RBAC enabled.\r\n\r\nImplementation details:\r\n- Extracts a common `DropdownFilters` component from the Company workspaces view into the `@muralco/settings-commons` package\r\n- Adds an instance of it to the room members view, conditionally rendered on whether RBAC is enabled\r\n- Adds needed state variables and filtering logic to make filters selections functional \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2236) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://iam-2236-add-room-quick-filters.mural.engineering/t/ub2aafbc04f4470f129b65687/r/1761674177565805/settings/members) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\nI have enabled the ACR env flag in the testing env link above created a company/workspace/room with some users that you can use to test with the following room admin credentials:\r\n```\r\njulius47@hunnur.com\r\nzKfI7rp2dZAWlK_\r\n```\r\n\r\nTwo main testing branches:\r\n- Regression testing that nothing has changed with RBAC flag OFF\r\n- Feature testing with RBAC flag ON\r\n\r\nAlso should test the company workspaces quick filtering as it's functionality was touched / is now using the common component.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https", + "labels": [] + }, + { + "number": 45832, + "title": "[ENGAGE-1391] Dashboard: Remove last use of app.me. Load user directly from api", + "branch": "remove/v1-dashboard-test-page", + "merged_at": "2025-10-29T15:42:23Z", + "changed_files": 6, + "additions": 148, + "deletions": 139, + "body": "### Change:\r\nCompletely remove app.me ampersand user from dashboard.\r\n\r\n### Details:\r\n* DashboardContainer\r\n * PRIMARY CHANGE\r\n * no longer uses ampersand and `app.me` to fetch the signed-in user.\r\n * the new logic to verify the user is signed-in and loaded from api is now in `RequireAuth`\r\n * RequireAuth will check for an existing session, refresh it if it can, call onMissionSession (ie redirectToSignIn) if needed, then load the user from api/v0/me.\r\n* DashboardWrapper\r\n * now takes in a defined `User` as prop\r\n * this allows for old test rig v1 test pages to use DashboardWrapper directly instead of an intermediate component DashboardContainerRaw\r\n * once the rig v1 tests are all migrated, DashbaordWrapper can delete the `user` prop and instead get the authenticatedUser directly from useAuthenticatedUser().\r\n* RequireAuth\r\n * now handles scenario where `session` isn't defined (ie. user isn't logged in)\r\n * new prop `onMissingSession()` callback is called when no session can be found.\r\n * this allows the calling code (DashboardContainer) to redirect the user to the sign-in page\r\n* DasbhardUserStore\r\n * deleted\r\n * no longer used\r\n * it was added as a stop-gap to convert the app.me AmpUserModel to a api/User object.\r\n\r\n\r\n### Test Env\r\n https://v1-dashboard-test-page.mural.engineering/", + "labels": [] + }, + { + "number": 45867, + "title": "[SCQM-1360] Update/ai explore upgrade menu items", + "branch": "update/ai-explore-upgrade-menu-items", + "merged_at": "2025-10-29T14:26:40Z", + "changed_files": 8, + "additions": 578, + "deletions": 305, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves more menu items into the placeholder AI explore menu shown for the upgrade flow. Moved items:\r\n\r\nPart 3 of 3\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1360) to understand the context of this effort.\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-explore-upgrade-menu-items.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n\r\n1. Create a free account\r\n2. Create a mural\r\n3. Enable the flag from the menu - feat-mu-enable-ai-upgrade-cta and refresh\r\n4. Cluster by topic\r\n5. Create 2 sticky notes with text, and then select them\r\n6. Cluster by topic should be in the menu and open the ai upgrade modal\r\n\r\nSuggest Title\r\n8. Select a sticky note\r\n9. Suggest title should be in the menu and open the ai upgrade modal\r\n\r\nGenerate Ideas (mindmap)\r\n10. Create a mindmap node and select it\r\n11. Generate ideas should be visible in the menu and open the ai upgrade modal\r\n\r\nOrg Chart\r\nThis one I'm not sure how to test. I know the org chart flag needs to be enabled, but it seems like the logic to make the option visible is incorrect. I did not make any changes to this logic as I felt it may be intentional (?) and we should consult with whomever owns the feature first. After these changes, that logic is now in one function for both menu items, so if it's fixed it would also propagate to the upgrade menu item moving forward.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45840, + "title": "[PLAY-689] - adds template filter via optimizely", + "branch": "add/optmizely-template-filter", + "merged_at": "2025-10-29T14:13:24Z", + "changed_files": 5, + "additions": 120, + "deletions": 7, + "body": "### Summary of Changes and Resources for the Reviewer\r\n[PLAY-689](https://mural.atlassian.net/browse/PLAY-689)\r\n\r\nFilters out MFS templates unless you belong to the MFS optimizely group. - reconfigured dev optimizely to more closely match prod\r\n\r\n1. can see MFS templates via search\r\n2. has ability to display MFS templates in default template library through contentful configuration -- [see thread](https://mural.slack.com/archives/C51HUSV99/p1761677140806099)\r\n\r\n- [x] Confirmed this works via searching enabled ws and disabled ws\r\n- [x] Added tests for additional confirmation\r\n\r\n\r\nhttps://github.com/user-attachments/assets/712be722-0c9d-4877-9948-1459fd464659\r\n\r\n\r\n\r\n\r\n[PLAY-689]: https://mural.atlassian.net/browse/PLAY-689?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ", + "labels": [] + }, + { + "number": 45767, + "title": "[EN-3530] Redirect for moved murals", + "branch": "fix/en-3530", + "merged_at": "2025-10-29T13:32:25Z", + "changed_files": 1, + "additions": 10, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\nIf a mural is moved to a new workspaces, the old url doesn't resolve to the same mural and instead serves up a 404 page. This PR attempts to address this by redirecting the browser during `onEnterMural` if an error is thrown and a mismatch is detected between the url path and the mural's ownerId property.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/EN-3530) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/4eda9794ad554955bc403293f639a943) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-3530.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n- Please follow these steps to perform a sufficient smoke test of these changes\r\n 1. Create a mural in a workspace. Copy the url for that mural.\r\n 2. Move the mural to another workspace\r\n 3. Paste the old url into the address bar and go. Confirm that the browser is redirected to the new workspace location of that mural.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pa", + "labels": [] + }, + { + "number": 45869, + "title": "[CAN-8011] Stacking order system", + "branch": "fix/can-8011", + "merged_at": "2025-10-29T13:12:31Z", + "changed_files": 7, + "additions": 393, + "deletions": 0, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR creates a system, flagged by `ENABLE_STACKING_ORDER_SYSTEM`, to manage stacking orders in parent changes (absorption/expulsion). It ensures consistent order when widgets move between parents and preserves relative ordering across multiple changes.\r\n\r\n1. If a widget is absorbed or expelled, it's new stacking order will be the highest in the mural + 1\r\n2. If a widget is absorbed or expelled, and then back in the same parent as the initial drag, the stacking order remains the same.\r\n\r\n![pr](https://github.com/user-attachments/assets/16747b12-a780-4ed7-8d71-305a81b6f4a1)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8011\r\n- Env: https://can-8011.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45740, + "title": "[ENGAGE-1312] Scaffold visitor link permission input", + "branch": "add/scaffold-visitor-link-permission", + "merged_at": "2025-10-28T21:19:45Z", + "changed_files": 10, + "additions": 602, + "deletions": 4, + "body": "## Pull Request Overview\r\n\r\nThis PR scaffolds a visitor link permission input by replacing placeholder text with a functional `MrlSelect` component. The change allows users to view and select permission levels (None, Editor, Viewer) for visitor links in the share modal.\r\n\r\n**Key Changes:**\r\n- Added a permission dropdown using `MrlSelect` component with three permission options\r\n- Integrated existing `permissionToPermissionLevel` utility to map permissions correctly\r\n- Added comprehensive unit tests covering all component behaviors\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| LinkInfo.tsx | Replaced placeholder text with `MrlSelect` dropdown component for permission selection, added permission options and current permission mapping |\r\n| LinkInfo.test.tsx | Added comprehensive test suite covering rendering, permission display, disabled states, edge cases, and accessibility |\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ENGAGE-1312) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://scaffold-visitor-link-permission.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch do", + "labels": [] + }, + { + "number": 45875, + "title": "ENGAGE-1363 migrate features/modals/share/room/access/access-to-upload-csv-with-keyboard.feature from v1 to v2", + "branch": "update/csv-test", + "merged_at": "2025-10-28T21:08:21Z", + "changed_files": 2, + "additions": 22, + "deletions": 19, + "body": "Migrating v1 cucumber to v2 for features/modals/share/room/access/access-to-upload-csv-with-keyboard.feature\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1363", + "labels": [] + }, + { + "number": 45626, + "title": "[PLAY-669] Company Profile card not rendering properly", + "branch": "fix/company-card-location-bug", + "merged_at": "2025-10-28T20:37:14Z", + "changed_files": 3, + "additions": 60, + "deletions": 15, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nFix a bug for bsh home alliance company card. We were mishandling cases where there were no province provided. Also update how we fetch the country name to fix an issue where we were rendering the country code name. \r\n\r\n\"image\"\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/PLAY-669) to understand the context of this effort.\r\n\r\n\"Screenshot\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [ + "bop" + ] + }, + { + "number": 45871, + "title": "[ECOMM-257] Show error when order confirm fails", + "branch": "fix/ecomm-257-fraud-card", + "merged_at": "2025-10-28T20:17:55Z", + "changed_files": 1, + "additions": 17, + "deletions": 2, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis ensures we show an error when the confirm order call fails(e.g. when the card is fraudulent etc.).\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-257) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [] + }, + { + "number": 45860, + "title": "ENGAGE-1361 migrate features/invitation/room.feature from v1 to v2", + "branch": "add/room-invitation-v2-test", + "merged_at": "2025-10-28T17:43:44Z", + "changed_files": 2, + "additions": 12, + "deletions": 20, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates two invitation-related Cucumber test files from the v1 testing framework to the v2 framework. The migration involves converting `features/invitation/room.feature` and `features/invitation/mural.feature` to the newer test structure in `src/test/react-new/features/invitation/`.\r\n\r\nKey changes:\r\n- Migration from v1 to v2 test framework structure with updated Given/When/Then syntax\r\n- Introduction of Background sections to establish test context with users, workspaces, rooms, and murals\r\n- Streamlined scenario definitions using direct route visiting and inline API response mocking\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 4 out of 4 changed files in this pull request and generated no comments.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1361\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| src/test/react-new/features/invitation/room.feature | New v2 test file for room invitation redirects with Background setup |\r\n| src/test/react-new/features/invitation/mural.feature | New v2 test file for mural invitation redirects with Background setup and two scenarios |\r\n| features/invitation/room.feature | Deleted v1 test file being replaced |\r\n| features/invitation/mural.feature | Deleted v1 test file being replaced |", + "labels": [] + }, + { + "number": 45789, + "title": "[CWI-2318] Add AutoSync for System of Record", + "branch": "add/cwi-2318-sor-autosync", + "merged_at": "2025-10-28T17:02:48Z", + "changed_files": 3, + "additions": 204, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add AutoSync for System of Record \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2318) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nStacked PRs:\r\n- https://github.com/tactivos/murally/pull/45786\r\n- https://github.com/tactivos/murally/pull/45763\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45859, + "title": "ENGAGE-1360 migrate features/invitation/mural.feature to v2", + "branch": "add/mural-invitations-test", + "merged_at": "2025-10-28T16:04:50Z", + "changed_files": 2, + "additions": 18, + "deletions": 34, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates a Cucumber feature file from the v1 test structure to the v2 test structure. The old feature file is being removed from the root `features/` directory and replaced with a new version in `src/test/react-new/features/invitation/` that uses the updated testing syntax and conventions.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1360\r\n\r\n**Key Changes:**\r\n- Replaces verbose v1 Cucumber syntax with more concise v2 syntax\r\n- Uses entity variables (A, W, R, M) in the Background section for test setup\r\n- Simplifies API mocking and route navigation step definitions\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| features/invitation/mural.feature | Removes the old v1 feature file with verbose JSON-based step definitions |\r\n| src/test/react-new/features/invitation/mural.feature | Adds the new v2 feature file with streamlined syntax using entity variables and inline parameters |\r\n\r\n", + "labels": [] + }, + { + "number": 45838, + "title": "[FEP-6331] Canvas Context Menu : Fixes keyboard & screen reader interactions for menu checkbox and radioelements", + "branch": "update-uik-menu-roles", + "merged_at": "2025-10-28T15:32:33Z", + "changed_files": 10, + "additions": 28, + "deletions": 5, + "body": "## Pull Request Overview\r\n\r\nThis PR enhances accessibility for menu checkbox and radio elements in the Canvas Context Menu by fixing keyboard and screen reader interactions. The changes ensure proper ARIA roles are applied to menu items with selection states.\r\n\r\n### Key Changes\r\n\r\n#### Murally\r\n- Updates `tools-api` to support `role` value to be used in the `ToolbarMenuItem` \r\n\r\n#### UI Toolkit Update\r\n- Applies proper `role` attribute to menu items that are a checkbox or radio element\r\n- Improves keyboard activation of menu checkbox and radio elements where `space` will keep the menu open while toggling the state of the element\r\n\r\n### Testing\r\n**Test env:** http://update-uik-menu-roles.mural.engineering\r\n\r\n**To test:** hit `cmd+shift+right` on the canvas to open context menu, navigate with arrow to \"snap to grid\", use `space` to toggle this checkbox element. ", + "labels": [] + }, + { + "number": 45857, + "title": "[PLAY-711] Support in canvas template modal for research template", + "branch": "add/play-711-in-canvas-modal", + "merged_at": "2025-10-28T14:21:34Z", + "changed_files": 1, + "additions": 104, + "deletions": 66, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nPrior to these changes, the mouse processor was relying on a reference\r\nto the content extension widgets which were defined in a closure which\r\nonly contained the content-extension widgets during mural creation.\r\n\r\nNow, with these changes, we move the reference to content extension\r\ninside the scope of the mouse-processor function itself. We implement\r\na simple in-memory cache to reduce the lookup operation as much as\r\npossible. Since this is just a \"mouseDown\" handler, it shouldn't be\r\ntoo bad anyway, but the cache is there anyway.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/jira/software/c/projects/PLAY/boards/523?assignee=60b66685a547eb00682bad4e&ignoreStickyVersion=true) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/8f80fdc676f84ae1ad694a13c597a728) of the acceptance criteria for the above ticket\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [x] Exception: testing mouse handlers is out of scope for this unless someone can point me to a good example?\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Arch", + "labels": [] + }, + { + "number": 45852, + "title": "[ECOMM-259] stripe elements on payment authentication CTA", + "branch": "add/ecomm-259", + "merged_at": "2025-10-28T13:52:17Z", + "changed_files": 2, + "additions": 180, + "deletions": 6, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nI'm refactor how to assign isCheckoutSessionEnabled, because we still enable some old workflows and we need disable/enable depending the page, in this case to provide additional action verification.\r\n\r\nPlease review the \ud83c\udff7\ufe0f [JIRA ticket](https://mural.atlassian.net/browse/ECOMM-259) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Record\r\n\r\nhttps://www.loom.com/share/6c5b8900ed9441e4ae6c8a92c14d2533\r\n\r\n### Screenshots\r\n\"Screenshot\r\n\"Screenshot\r\n\r\n", + "labels": [] + }, + { + "number": 45850, + "title": "[CAN-8021] Topbar switch", + "branch": "add/can-8021", + "merged_at": "2025-10-28T13:29:49Z", + "changed_files": 9, + "additions": 372, + "deletions": 33, + "body": "- Extracts Mural Top Bar\r\n- Adds components that will be private and voting mode topbar. \r\n- Adds and animated a switch to toggle between the topbar\r\n\r\n\r\nhttps://github.com/user-attachments/assets/91593662-a075-4875-90ad-a446e964b71a\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-8021)\r\n[Test Env](https://can-8021.mural.engineering)https://can-8021.mural.engineering/\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good techni", + "labels": [] + }, + { + "number": 45851, + "title": "[CAN-7872] Move table cell pasting logic out of `dropWidgetsOnCanvas` - Part 2", + "branch": "remove/pasted-widgets-cell-ii", + "merged_at": "2025-10-28T13:07:59Z", + "changed_files": 6, + "additions": 120, + "deletions": 124, + "body": "### Summary of Changes and Resources for the Reviewer\n\nThis is one work split into two PRs for cleanliness and to facilitate the review.\r\nYou're currently viewing at part 2: **forcing the table cell parenting after the dropping**.\r\n\r\n---\r\n\r\nThe main goal of this effort is to remove, from `dropWidgetsOnCanvas`, specific logic regarding pasting elements over a table cell.\r\n\r\nThe expected behavior when this happens is to find the center point of the pasted elements boundaries and, if it overlaps a table cell whose table is set to auto resize, make the cell big enough to contain everything and force all widgets to go there.\r\n\r\nWe want all this behavior to be coded outside of `dropWidgetsOnCanvas` to get a clear separation of responsibilities and to lead the way into making absorption a system.\r\n\r\nThe logic for this behavior resides in the helper `tryDropPastedWidgetsIntoTableCell`, and the goal is to move it away from the business rule. \r\n\r\nThe wsy we'll achieve this is by moving the checking to the code that handles widget pasting (which is the action that triggers this behavior) after the widgets have been dropped into the canvas.\nThis means that if there was a regular absorption happening it will still occur, but if the content suggests that a table cell should parent those widget, we'll disregard the absorption and force that situation afterwards.\n\n--- \n\n**Note**: There is room for further improvement here by extracting common behavior such as finding the potential table cell.\nDoing that here would have made the PR overly complex and since that's more of a code quality improvement rather than a behavioral requirement, I prefer to defer it to a third PR.\n\n\n#### Reviewer Resources\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7872)\n- \ud83e\uddea [**Testing environment**](https://pasted-widgets-cell-ii.mural.engineering)", + "labels": [] + }, + { + "number": 45839, + "title": "[ECOMM-260] Pre-fill addresses when available", + "branch": "fix/ecomm-260-prefill-address", + "merged_at": "2025-10-28T12:58:24Z", + "changed_files": 10, + "additions": 103, + "deletions": 42, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR enhances the checkout experience by pre-filling the Stripe Address Element with saved billing addresses and ensuring proper error handling when payment information is incomplete.\r\n\r\nKey Changes:\r\n\r\n- Pre-fills the Stripe Address Element with saved billing address when available\r\n- Shows error messages when users attempt to submit incomplete payment forms\r\n- Moves cardErrorMessage from props to context for cleaner component interfaces\r\n\r\nhttps://www.loom.com/share/0cabeedce37a4969b8c93302cc9f2f76\r\n\r\nhttps://ecomm-260-prefill-address.mural.engineering/\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-260) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 45835, + "title": "[CAN-7890] Render approach to solve stacking order in tables", + "branch": "fix/can-7890-3", + "merged_at": "2025-10-28T07:26:34Z", + "changed_files": 4, + "additions": 361, + "deletions": 52, + "body": "**[CAN-7890 POC Render approach to solve stacking order in tables](https://mural.atlassian.net/browse/CAN-7890)**\r\n\r\nThe idea of this PR is to make cells children behave like they are children of a cell in terms of position. But for stacking order it should work like cells children are direct table children. \r\n\r\nThe environment: https://can-7890-3.mural.engineering/\r\n\r\n![2025-10-16 14 19 00](https://github.com/user-attachments/assets/6d52ac3a-2870-42fd-b25e-3977285fd7b6)\r\n\r\n![2025-10-27 17 07 18](https://github.com/user-attachments/assets/84e9047b-ff88-4e95-9e79-d7dd3ecd60be)\r\n\r\n", + "labels": [] + }, + { + "number": 45856, + "title": "ENGAGE-1372 remove features/terms-and-conditions/workspace-members-check.feature", + "branch": "remove/terms-and-conditions-migration", + "merged_at": "2025-10-27T23:32:33Z", + "changed_files": 1, + "additions": 0, + "deletions": 16, + "body": "This PR removes outdated Cucumber test files for terms and conditions and mural functionality. These test features have been migrated (as indicated by the @migrated tag) and are no longer needed in the legacy test suite.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1372\r\n", + "labels": [] + }, + { + "number": 45855, + "title": "ENGAGE-1371 features/terms-and-conditions/mural.feature migrated", + "branch": "remove/migrated-mural-terms-test", + "merged_at": "2025-10-27T23:13:12Z", + "changed_files": 1, + "additions": 0, + "deletions": 37, + "body": "This PR removes migrated Cucumber feature file for terms-and-conditions and mural functionality. The files are being deleted as they have been successfully migrated to a different testing framework (likely Jest + React Testing Library based on the https://github.com/migrated tag).\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1371", + "labels": [] + }, + { + "number": 45854, + "title": "ENGAGE-1370 features/terms-and-conditions/kyndryl.feature", + "branch": "remove/migrated-tests", + "merged_at": "2025-10-27T23:03:09Z", + "changed_files": 1, + "additions": 0, + "deletions": 95, + "body": "Pull Request Overview\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1370\r\n\r\nThis PR removes deprecated Cucumber test file that was previously migrated to other testing frameworks. The removal aligns with the team's policy of not adding new Cucumber tests and reducing reliance on this testing approach.", + "labels": [] + }, + { + "number": 45848, + "title": "ENGAGE-1369 features/terms-and-conditions/ibm.feature", + "branch": "remove/ibm-migrated-test", + "merged_at": "2025-10-27T22:53:15Z", + "changed_files": 1, + "additions": 0, + "deletions": 74, + "body": "## Pull Request Overview\r\n\r\nThis PR removes deprecated Cucumber feature file that have been marked as `@migrated`, indicating they have been replaced by unit/integration tests.\r\n\r\nTest: https://mural.atlassian.net/browse/ENGAGE-1369\r\n", + "labels": [] + }, + { + "number": 45847, + "title": "ENGAGE-1366 Remove migrated features/mural/duplicate.feature", + "branch": "remove/duplicate-test", + "merged_at": "2025-10-27T22:37:00Z", + "changed_files": 1, + "additions": 0, + "deletions": 61, + "body": "This PR removes Cucumber feature files that have been migrated to other test formats (likely Jest/React Testing Library or V2 based on the @migrated tags). The changes support the team's ongoing effort to reduce reliance on Cucumber tests in favor of unit and integration tests.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1366", + "labels": [] + }, + { + "number": 45707, + "title": "[SCQM-1334] Adds ability to delete a company color", + "branch": "add/delete-company-color-support", + "merged_at": "2025-10-27T22:10:56Z", + "changed_files": 7, + "additions": 587, + "deletions": 529, + "body": "### Summary of Changes and Resources for the Reviewer\r\nProvides the delete functionality to the company colors admin. \r\nRefactors the previous `edit` and `create` color modals into a single component.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1334) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/531ce54e817342138b88d13267ae8f07) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://delete-company-color-support.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [] + }, + { + "number": 45726, + "title": "[SCQM-1359] Update/ai explore upgrade menu items 2", + "branch": "update/ai-explore-upgrade-menu-items-2", + "merged_at": "2025-10-27T21:56:16Z", + "changed_files": 4, + "additions": 196, + "deletions": 85, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nMoves more menu items into the placeholder AI explore menu shown for the upgrade flow. Moved items: Generate ideas, Classify by sentiment, and Translate.\r\n\r\nPart 2 of 3\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1359) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://ai-explore-upgrade-menu-items-2.mural.engineering/.mural.engineering/) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\nPlease follow these steps to perform a sufficient smoke test of these changes\r\n\r\n1. Create a free account\r\n2. Create a mural\r\n3. Enable the flag from the menu - feat-mu-enable-ai-upgrade-cta and refresh\r\n4. Create a sticky with text, and then select it\r\n5. In the explore with AI menu, observe newly added options for Generate ideas, Classify by sentiment, and Translate. When any is selected, the AI upgrade information modal opens.\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45846, + "title": "ENGAGE-1365 Remove migrated features/mural/delete.feature", + "branch": "remove/delete-mural-test", + "merged_at": "2025-10-27T21:40:57Z", + "changed_files": 1, + "additions": 0, + "deletions": 8, + "body": "", + "labels": [] + }, + { + "number": 45845, + "title": "ENGAGE-1364 Remove old team and role modal feature test", + "branch": "remove/old-team-role-test", + "merged_at": "2025-10-27T21:00:40Z", + "changed_files": 1, + "additions": 0, + "deletions": 15, + "body": "", + "labels": [] + }, + { + "number": 45837, + "title": "[CAN-8013] Move area selection to mouseUp in mouse manager.", + "branch": "fix/area-mousedown-selection", + "merged_at": "2025-10-27T20:50:55Z", + "changed_files": 3, + "additions": 173, + "deletions": 44, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR removes area selection on mouse-down and only finishes it on mouse-up.\r\nThe prior implementation had that logic in handleDragMove. The refactor moves it into commitPendingAreaSelectionForDrag, adds isAreasImprovementsEnabled/hasPendingAreaSelection helpers.\r\n\r\nBy doing this, we avoid a selection before marquee select starts.\r\n\r\nPR:\r\n![pr](https://github.com/user-attachments/assets/0b86c3ff-8113-4728-87b2-42793396cc89)\r\n\r\nMaster\r\n![master](https://github.com/user-attachments/assets/28c7e3a8-cd98-4fce-9e84-4341a94abf0d)\r\n\r\n#### Reviewer Resources\r\n- Ticket: https://mural.atlassian.net/browse/CAN-8013\r\n- Env: https://area-mousedown-selection.mural.engineering\r\n", + "labels": [] + }, + { + "number": 45813, + "title": "[CAN-7957] User nav controls A/B Experiment", + "branch": "add/can-7957", + "merged_at": "2025-10-27T20:31:52Z", + "changed_files": 29, + "additions": 800, + "deletions": 31, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis PR adds a new addon to run a user A/B test composed of 3 variants:\r\n- Control: No changes.\r\n- Variant 1: New controls selection modal\r\n- Variant 2: New controls selection modal + New buttons in sidebar\r\n\r\nShort loom explaining the different variants: https://www.loom.com/share/8c04c466e7934c788702417df0245ae4\r\n\r\nIn order to achieve the required changes for the A/B test I introduced a few new features:\r\n- Enhanced SDK's Experiments API to enable AB test data\r\npersistence and cross-component access (Variant 2 introduces a slight change on our business rules, we no longer disable mural tools while in Move or Pan mode.)\r\n- Sidebar button's 'order' prop: Before this change all sidebar buttons were shown in their registration order, or where manually placed as the Templates button does). Now we sort buttons by order property, with unordered buttons appearing after ordered ones\r\n- Sidebar buttons are now using the controlledState prop, previously the state was controlled by the button itself, resulting in unexpected behaviour: Even if you had set the state to be selected based on external state (e.g. appMode is 'pan', simply clicking the button again would result in the button being unselected)\r\n\r\nLast but not least, we need to run the experiment code AFTER the Templates modal is shown when creating a new mural, so I had to make a small modification to the `onCloseModal` function on said modal, this should be removed once the experiment is finished (About 2 weeks after this PR is merged). I created https://mural.atlassian.net/browse/CAN-7957 to clean up this and the business rules changes.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7957) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-7957.mural.engineerin", + "labels": [] + }, + { + "number": 45843, + "title": "ENGAGE-1362 Remove features/invitation/workspace.feature since it has been migrated", + "branch": "update/workspace-invitation", + "merged_at": "2025-10-27T20:11:09Z", + "changed_files": 1, + "additions": 0, + "deletions": 22, + "body": "", + "labels": [] + }, + { + "number": 45828, + "title": "[SCQM-1356] Adds flag template", + "branch": "adds/scqm-1356-flag-template", + "merged_at": "2025-10-27T19:33:05Z", + "changed_files": 11, + "additions": 47, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\nAdds feature flag for build-a-mural template. \r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/SCQM-1320) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://scqm-1356-flag-template.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45830, + "title": "[ENGAGE-1345] Migrate final test case to ContentRender.integration.test.tsx", + "branch": "feature/engage-1345-content-render-tests", + "merged_at": "2025-10-27T19:10:45Z", + "changed_files": 4, + "additions": 102, + "deletions": 258, + "body": "", + "labels": [] + }, + { + "number": 45841, + "title": "ENGAGE-1359 Remove features/error/permissions/visitor-link-expired.feature", + "branch": "update/visitor-link-feature", + "merged_at": "2025-10-27T17:48:49Z", + "changed_files": 1, + "additions": 0, + "deletions": 7, + "body": "## Pull Request Overview\r\n\r\nThis PR removes the Cucumber test file `visitor-link-expired.feature` as part of the effort to reduce Cucumber test coverage in favor of other testing approaches (likely Jest/React Testing Library based on the project's testing standards).\r\n\r\nWhere the test was migrated to: src/test/react-new/features/error/permissions/visitor-link-expired.feature\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1359\r\n\r\n- Removes the `@migrated` tagged Cucumber feature file for visitor link expired error screen testing\r\n\r\n\r\n
\r\nComments suppressed due to low confidence (1)\r\n\r\n**features/error/permissions/visitor-link-expired.feature:1**\r\n* The visitor link expired error screen functionality is losing test coverage with this removal. According to the project's testing standards, when removing Cucumber tests, equivalent Jest + React Testing Library tests should be added to maintain coverage. Please ensure unit tests exist for the visitor link expired error screen component that verify the error message displays correctly and contains the expected text.\r\n
\r\n", + "labels": [] + }, + { + "number": 45834, + "title": "[CWI-2352] drag size and default collapse state", + "branch": "update/cwi-2352-drag-size", + "merged_at": "2025-10-27T17:37:03Z", + "changed_files": 6, + "additions": 41, + "deletions": 9, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Adjust drag/preview size.\r\n- Reset to default collapsed state if all regions are collapsed.\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2352) to understand the context of this effort.\r\n- [Loom demo](https://www.loom.com/share/31196253944b41cf8c1418f0d1d32672)\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45829, + "title": "ENGAGE-1321 Migrate see-all.feature features/dashboard/routes", + "branch": "add/see-all-tests", + "merged_at": "2025-10-27T17:20:24Z", + "changed_files": 2, + "additions": 536, + "deletions": 36, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates the Cucumber feature tests from `features/dashboard/routes/see-all.feature` to Jest unit tests in `src/dashboard/routes/see-all.test.tsx`, removing the legacy Cucumber tests as part of the test migration effort.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1321\r\n\r\n**Key Changes:**\r\n- Migrated 7 Cucumber scenarios to comprehensive Jest test suites with 10 test cases\r\n- Added proper API mocking, analytics tracking verification, and error handling tests\r\n- Deleted the legacy Cucumber feature file\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `src/dashboard/routes/see-all.test.tsx` | New Jest test file with comprehensive coverage for all see-all route functionality including murals, templates, collaborators, error handling, and loading states |\r\n| `features/dashboard/routes/see-all.feature` | Removed legacy Cucumber feature file that has been migrated to Jest |\r\n", + "labels": [] + }, + { + "number": 45786, + "title": "[CWI-2317] Add autosync for ADO Integration", + "branch": "add/cwi-2317-ado-autosync", + "merged_at": "2025-10-27T16:52:51Z", + "changed_files": 4, + "additions": 91, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add autosync for ADO Integration\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2317) to understand the context of this effort.\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- https://github.com/tactivos/murally/pull/45763\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45798, + "title": "[ENGAGE-1333] Update styles to match figma for share modal advanced settings", + "branch": "add/engage-1333", + "merged_at": "2025-10-27T16:29:54Z", + "changed_files": 5, + "additions": 61, + "deletions": 37, + "body": "\"image\"\r\n\r\nTest Env: https://engage-1333.mural.engineering/", + "labels": [] + }, + { + "number": 45802, + "title": "[CWI-2352] Update based on diagramming feature feedback", + "branch": "update/cwi-2352-diagramming-feedback", + "merged_at": "2025-10-27T16:19:37Z", + "changed_files": 8, + "additions": 28, + "deletions": 69, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis corrects the following: \r\n- [x] Remove description from panel \r\n- [x] Remove X on search if nothing is entered (if possible) \r\n- [x] Use xsmall font for main text, xxsmall for secondary. \r\n- [x] Remove connector point toggle; it'll be always on now (might need to change later). \r\n- [x] Fix tooltips on left/right edge icons. \r\n- [x] Panel jumps around/resizes after opening if only one of the cloud sections is open \r\n- [x] Panel temporarily resizes when hitting X/clear button. \r\n- [x] Chevrons should be smaller (20x20 for the icon itself, button is 24x24).\r\n\r\nRemaining items:\r\n- The panel should default to having connectors and basic shapes open. If users collapse all, reset next time they open the panel\r\n- Drag size should match thumbnail size until it hits the canvas.\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2352) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/7aee8668f06f4e9c9f4e41843c731383) of the acceptance criteria for the above ticket\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- \r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/", + "labels": [] + }, + { + "number": 45763, + "title": "[CWI-2316] Jira auto-sync", + "branch": "add/cwi-2316-jira-autosync", + "merged_at": "2025-10-27T16:09:19Z", + "changed_files": 7, + "additions": 100, + "deletions": 10, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Add when widget info panel is opened for Jira sticky, autosync changes if only System of Record changes are present. \r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CWI-2316) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/6a1b0e7ea0fa4c01a6729ba18835a4ba) of the acceptance criteria for the above ticket\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- Smart Planner interaction: https://www.loom.com/share/a5f289051c8a4b5d80bfec1ceb1d8d8f\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45732, + "title": "[EN-2246] feat: scaffold workspace user table behind feature flag", + "branch": "feat/iam-2246-workspace-user-v2", + "merged_at": "2025-10-27T15:59:57Z", + "changed_files": 37, + "additions": 2179, + "deletions": 18, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n* Flag check when rendering the path at `/t//settings/members`\r\n* When the flag is enabled, render basic table for workspace users and pending invitations\r\n* Else render the current view\r\n\r\n#### Reviewer Resources\r\n\r\n- \ud83c\udff7\ufe0f [**IAM-2246**](https://mural.atlassian.net/browse/IAM-2246)\r\n- \ud83e\uddea [**iam-2246-workspace-user-v2.mural.engineering**](https://iam-2246-workspace-user-v2.mural.engineering)\r\n- \ud83c\udfac Loom demo n/a\r\n\r\nUse the following credentials to log in as a workspace admin with two workspaces, one with the feature flag ENABLED, one with it DISABLED:\r\n\r\n```\r\nemail: alpha.user@mynes.com\r\npassword: EPJmUJzJKwXdFA3ahaNixitt\r\n```\r\n\r\nThen access either:\r\n\r\n- [workspace with flag DISABLED](https://iam-2246-workspace-user-v2.mural.engineering/t/alphaworkspace7512/settings/members)\r\n- [workspace with flag ENABLED](https://iam-2246-workspace-user-v2.mural.engineering/t/workspacewithv2table8040/settings/members)\r\n\r\nOr, if you need to, access the [Optimizely flag](https://app.optimizely.com/v2/projects/18154683820/flags/manage/feat-ws-workspace-user-table-v2/rules/development/edit/iam-2239_workspace_allow_list) and add your workspace ID in the audience.\r\n\r\n> [!TIP]\r\n> It's no longer needed to hash the `workspace.username`. It looks like Engagement took the initiative to pass the workspace `username` in clear to Optimizely\u2026 ", + "labels": [] + }, + { + "number": 45814, + "title": "[CAN-7993] Ungrouped widgets in Areas not resizeable", + "branch": "beta-fix/resize-in-areas", + "merged_at": "2025-10-27T15:32:42Z", + "changed_files": 2, + "additions": 120, + "deletions": 1, + "body": "Bug reported that selected widgets in an area were not resize-able unless all of the widgets in the area were selected. We were checking if the widget had a parentId but this is not enough. Adding a isApiGroup checked fixed the problem.\r\n\r\n[Jira](https://mural.atlassian.net/browse/CAN-7993)\r\n[Test Env](https://resize-in-areas.mural.engineering/)\r\n\r\n### Summary of Changes and Resources for the Reviewer\r\n\r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**]() to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [A", + "labels": [] + }, + { + "number": 45805, + "title": "[CAN-8023] Move table cell pasting logic out of `dropWidgetsOnCanvas` - Part 1", + "branch": "remove/pasted-widgets-into-cell", + "merged_at": "2025-10-27T15:13:10Z", + "changed_files": 4, + "additions": 107, + "deletions": 41, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nThis is one work split into two PRs for cleanliness and to facilitate the review.\r\nYou're currently viewing at part 1: **offsetting widgets pasted close to a table cell's border**.\r\n\r\n---\r\n\r\nThe main goal of this effort is to remove, from `dropWidgetsOnCanvas`, specific logic regarding pasting elements over a table cell.\r\n\r\nThe expected behavior when this happens is to find the center point of the pasted elements boundaries and, if it overlaps a table cell whose table is set to auto resize, make the cell big enough to contain everything and force all widgets to go there.\r\nAdded to that, if the top left border of the boundaries falls outside the top left border of the cell, we want to offset the pasted elements so they fully fall inside of it.\r\n**This last part is what this PR is all about.**\r\n\r\nWe want all this behavior to be coded outside of `dropWidgetsOnCanvas` to get a clear separation of responsibilities and to lead the way into making absorption a system.\r\n\r\nThe logic for this behavior resides in the helper `tryDropPastedWidgetsIntoTableCell`, and the goal is to move it away from the business rule. \r\n\r\nIn this first PR we're moving the part that offsets the pasted widgets to do the exact same thing _before_ doing the pasting instead of afterwards.\r\nThis means that, instead of pasting them under the cursor and then moving them, we first figure out _where they would be pasted_ and if it overlaps a table cell, we offset them beforehand, so once we create the elements, they're in their final position.\r\nThe logic regarding forcing them onto a cell will be addressed in the next PR.\r\n\r\n\r\n#### Reviewer Resources\r\n- \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-8023)\r\n- \ud83e\uddea [**Testing environment**](https://pasted-widgets-into-cell.mural.engineering)\r\n\r\n#### What to check for\r\nThe idea for this work is to _not_ modify any existing behavior, so we should test that pasting onto a table cell still works ", + "labels": [] + }, + { + "number": 45833, + "title": "Remove unused dashboard test pages", + "branch": "remove/v1-dashboard-test-pages", + "merged_at": "2025-10-27T14:58:43Z", + "changed_files": 9, + "additions": 0, + "deletions": 594, + "body": "", + "labels": [] + }, + { + "number": 45817, + "title": "[ECOMM-252] Show read only mode when paid to paid updates payment method", + "branch": "fix/ecomm-252-payment-already-processed", + "merged_at": "2025-10-27T13:10:16Z", + "changed_files": 7, + "additions": 462, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\nThis PR fixes an issue where users updating their payment method multiple times would encounter a \"Your payment has already been processed\" error. The solution shows a read-only view after a user updates their payment method in a paid-to-paid scenario, and creates a new checkout session when they edit again.\r\n\r\nKey Changes:\r\n\r\n- Modified the payment details panel state logic to show read-only mode for completed paid-to-paid payment updates\r\n- Updated the checkout session retry logic to create new sessions when re-editing after completing payment details in paid-to-paid flows\r\n- Moved payment method callback invocation to execute immediately after successful updates rather than at the end of the save action\r\n\r\nhttps://www.loom.com/share/bc8e8141904440769647351d4f63e8e3\r\nhttps://ecomm-252-payment-already-processed.mural.engineering/\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/ECOMM-252) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://your-branch.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n", + "labels": [] + }, + { + "number": 45781, + "title": "[CAN-7990] Reorder paste handlers to eliminate duplicate editor checks", + "branch": "fix/can-7990", + "merged_at": "2025-10-27T12:57:04Z", + "changed_files": 2, + "additions": 176, + "deletions": 134, + "body": "## Summary\r\n\r\nThe paste handlers were duplicating the check for an active editor. By re-ordering the handlers, we can use a single paste handler to check if the editor is mounted and stop the execution of the other ones. This optimization was already in place but needed to be re-ordered for better efficiency.\r\n\r\n## Changes\r\n\r\n### Refactored\r\n- **Reordered paste handler chain** in `src/mural/addons/core/paste-handlers/index.tsx`\r\n - Moved `forward-paste-to-editables` handler to the end of the chain\r\n - Eliminated duplicate editor state checks across multiple handlers\r\n\r\n### Implementation Details\r\n\r\nThe reordering ensures that:\r\n1. Specialized handlers (like `muralRender`) process their specific data types first\r\n2. The `forward-paste-to-editables` handler acts as a final gatekeeper\r\n3. When an editor is active (`targetEditable: true`), the handler immediately returns `{ handled: true }` and prevents other handlers from executing\r\n4. This eliminates redundant editor checks that were previously scattered across multiple handlers\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7990) to understand the context of this effort.\r\n\r\n### Required Checklist for Author\r\n- [x] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're ", + "labels": [] + }, + { + "number": 45756, + "title": "[FEP-6323][FEP-6324][FEP-6325] UI Toolkit Tooltip + Input Accessibility Updates & Fixes to Search Input Screen Reader support", + "branch": "update-tooltip-toolkit", + "merged_at": "2025-10-25T00:01:03Z", + "changed_files": 7, + "additions": 51, + "deletions": 34, + "body": "This PR updates the UI Toolkit to version `4.51.3`, which includes accessibility improvements for `MrlTooltip` and `MrlTextInput` components. The changes enhance screen reader support and modernize the search input implementation by removing the deprecated `attrs` pattern.\r\n\r\nMurally Changes:\r\n\r\n- Upgraded `@muraldevkit/ui-toolkit` from `4.50.0` to `4.51.3`\r\n- Refactored search input to use direct props instead of attrs pattern\r\n- Updated tests to align with new tooltip accessibility behavior\r\n\r\nUI Toolkit Changes:\r\n- `MrlTooltip` aria-describedby support\r\n- `MrlTextInput` better accessibility support for `MrlTooltip`\r\n- `MrlSmartTable` reverting transparent background updates\r\n\r\nTesting env: https://update-tooltip-toolkit.mural.engineering", + "labels": [] + }, + { + "number": 45774, + "title": "[EN-2240] Add components and room instance for room role explainer modal", + "branch": "feat/en-2240-add-footer-and-modal", + "merged_at": "2025-10-24T21:45:54Z", + "changed_files": 25, + "additions": 869, + "deletions": 11, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds a custom footer to the role dropdown with a link that opens a modal to explain how roles map to permissions:\r\n- Modal renders content dynamically based on company billing model\r\n- Dropdown control rerenders table content based on user type \r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/IAM-2240) to understand the context of this effort.\r\n- Please see this \ud83c\udfac [**demo**](https://www.loom.com/share/3fb5001ba83e48558742795c83854970?sid=b41f0c4b-f576-4a08-a6ee-78843b87f503) of the acceptance criteria for the above ticket\r\n- \ud83e\uddea Please use this [**testing environment**](https://en-2240-add-footer-and-modal.mural.engineering/t/u58eae22ddba8b9f0a7c53753/r/1761083491312139/settings/members) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n#### Testing / Validation\r\n\r\nTable will only appear for environments that have the ACR flag set and a company that has the associated feature toggle turned on. I have enabled the environment flag for the above testing env / company and added an admin user and a member with appropriate `roleId` values that\u00a0you can use to trigger the modal. Credentials:\r\n\r\n```\r\nona.conroy62@hunnur.com\r\njRoI8hwwIHwHtG8\r\n```\r\n\r\nCheck that data table is correct for the following permutations against [the designs](https://www.figma.com/design/1MpJYROKoTZ5BYIJ61gKhR/ACR--Roles?node-id=803-334135&m=dev)\r\n\r\nTMP Company:\r\n- Full member\r\n- Limited member\r\n- Guest\r\n\r\nNon TMP Company\r\n- Member\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\nN/A\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branc", + "labels": [] + }, + { + "number": 45695, + "title": "Update development workflow with rules for package dependencies", + "branch": "update-package-rules", + "merged_at": "2025-10-24T21:33:42Z", + "changed_files": 1, + "additions": 171, + "deletions": 454, + "body": "This PR enhances the development workflow documentation by adding clear guidelines for categorizing package dependencies. It establishes rules for distinguishing between devDependencies and dependencies specifically for @muralco packages, helping developers make correct dependency placement decisions based on package usage patterns.\r\n\r\nKey changes:\r\n\r\n- Adds explicit categorization rules for @muralco packages between devDependencies and dependencies\r\n- Documents specific @muralco packages that should always be in devDependencies\r\n- Provides clear criteria (MUST requirements) for determining dependency placement based on runtime vs. development-time usage\r\n- Removes redundant rules in `developer-workflows`", + "labels": [] + }, + { + "number": 45826, + "title": "/create-team: default workspace - add null check for extra security", + "branch": "add/defaultworkspace-null-check", + "merged_at": "2025-10-24T21:20:46Z", + "changed_files": 1, + "additions": 1, + "deletions": 1, + "body": "", + "labels": [] + }, + { + "number": 45825, + "title": "Fix ampersand schema", + "branch": "fix/card-ampersand-schema", + "merged_at": "2025-10-24T21:10:26Z", + "changed_files": 1, + "additions": 2, + "deletions": 8, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\n- Fix ampersand schema\r\n\r\n\r\n\r\n#### Reviewer Resources\r\nReference: https://mural.slack.com/archives/C01T3FV3VEW/p1761337561135479\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [] + }, + { + "number": 45823, + "title": "ENGAGE-1254 Migrate dashboard-recent.feature features/dashboard/routes", + "branch": "add/recent-route-tests", + "merged_at": "2025-10-24T20:53:32Z", + "changed_files": 1, + "additions": 0, + "deletions": 16, + "body": "## Pull Request Overview\r\n\r\nThis PR removes three deprecated Cucumber feature files from the dashboard routes directory as part of the ENGAGE-1254 migration effort. The files are being deleted because their test coverage has been migrated to other test suites (likely unit/integration tests based on the tech debt references).\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1254\r\n\r\n**Key changes:**\r\n- Removal of ignored Cucumber tests that were marked for migration\r\n- Cleanup of dashboard route test files that have been replaced by content renderer dashboard tests\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 1 out of 1 changed files in this pull request and generated no comments.\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| features/dashboard/routes/dashboard-recent.feature | Removes deprecated Cucumber tests for the recent dashboard route |\r\n\r\n\"Screenshot\r\n", + "labels": [] + }, + { + "number": 45824, + "title": "Add WorkspaceWithMembers builder mock", + "branch": "add/mock-builders", + "merged_at": "2025-10-24T20:19:03Z", + "changed_files": 5, + "additions": 147, + "deletions": 15, + "body": "Main change: Add WOrkspaceWIthMembersMock to utilized builder pattern for workspace mocks.\r\n\r\nMinor change: refactor RoomMock constructor to only take in required params", + "labels": [] + }, + { + "number": 45822, + "title": "ENGAGE-1253 Migrate dashboard-favorites.feature features/dashboard/routes", + "branch": "add/favorites-route-test", + "merged_at": "2025-10-24T20:06:16Z", + "changed_files": 1, + "additions": 0, + "deletions": 15, + "body": "## Pull Request Overview\r\n\r\nThis PR migrates Cucumber test features from the dashboard-favorites.feature file to modern dashboard route tests as part of ENGAGE-1252. The changes remove deprecated Cucumber test files that have been migrated to a new testing approach.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1253\r\n\r\n**Key changes:**\r\n- Removed dashboard-favorites.feature containing favorites route tests\r\n- \r\n\"Screenshot\r\n\r\n", + "labels": [] + }, + { + "number": 45821, + "title": "ENGAGE-1252 Migrate dashboard-allmurals.feature features/dashboard/routes", + "branch": "add/dashboard-routes", + "merged_at": "2025-10-24T19:29:40Z", + "changed_files": 1, + "additions": 0, + "deletions": 28, + "body": "## Pull Request Overview\r\n\r\nThis PR removes the deprecated `dashboard-allmurals.feature` file as part of migrating legacy Cucumber tests to modern unit/integration tests (ENGAGE-1252). The feature was already marked with `@ignore` and a tech debt ticket (CDX-1702), indicating it was planned for removal once migrated to the content renderer dashboard tests.\r\n\r\nTicket: https://mural.atlassian.net/browse/ENGAGE-1252\r\n\r\n
\r\nComments suppressed due to low confidence (1)\r\n\r\n**features/dashboard/routes/dashboard-allmurals.feature:1**\r\n* The removed test scenarios ('The all murals route renders a row of mural items' and 'Empty state for users without permission to create murals') need equivalent coverage in the new test location. Verify that these scenarios have been migrated to unit/integration tests before removing this file.\r\n
\r\n\r\n\"Screenshot\r\n", + "labels": [] + }, + { + "number": 45811, + "title": "[SCQM-1345] - Add ai diagram tracking events", + "branch": "ai-diagram-tracking", + "merged_at": "2025-10-24T19:17:40Z", + "changed_files": 3, + "additions": 108, + "deletions": 16, + "body": "### Summary of Changes and Resources for the Reviewer\r\n\r\nAdds tracking events for `ai-diagram` start, success/fail, and undo operations.\r\n\r\n#### Reviewer Resources\r\nJira ticket: https://mural.atlassian.net/browse/SCQM-1345\r\nTest env: \r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [ ] No new cucumber tests were added \r\n- [ ] Exception: no unit tests were added or updated for this change\r\n\r\n### Relevant Links \ud83d\udd17\r\n- [**API PR**]()\r\n\r\n### FAQs \r\n#### Why is my build failing?\r\n- Some flaky test randomly failed. Just restart the job that failed and it may pass. Or, consider adding an `@ignore` tag to the cucumber `.feature` file.\r\n- Your branch does not follow the branch naming conventions. Please review the [documentation](https://mural.atlassian.net/wiki/spaces/TOOL/pages/664666163/Git+branches+naming+conventions) for guidance.\r\n- You have a Typescript compilation error. Run `npm run typecheck`.\r\n- You have a lint error. Run `npm run lint`.\r\n\r\n#### How can I debug my failing tests?\r\nIf you're using VSCode, please see [these docs](https://mural.atlassian.net/wiki/spaces/PDE/pages/2478964954/How+to+Set+Debuggers+in+Murally).\r\n\r\n#### Can you share some good technical documentation?\r\n- [Architectural principles](https://mural.atlassian.net/wiki/spaces/PDE/pages/1807876221/Architecture+principles)\r\n- [How to Write Unit Tests](https://mural.atlassian.net/wiki/spaces/PDE/pages/2622259898/How+to+Unit+tests+in+Murally)\r\n- [What's the difference between the SDK and the Dispatcher](https://mural.atlassian.net/wiki/spaces/PDE/pages/3457056827/SDK+Context+vs+SDK+Apis+vs+Dispatcher+vs+State+vs+Business+Rules)\r\n", + "labels": [ + "team-smart-canvas" + ] + }, + { + "number": 45764, + "title": "[CAN-7949] Remove unused importDOM functions from MuralTextNode and MuralListItemNode", + "branch": "remove/can-7949", + "merged_at": "2025-10-24T18:31:15Z", + "changed_files": 2, + "additions": 0, + "deletions": 117, + "body": "This is a clean up of code that is not being used. \r\nWe have a custom parser for loading content into lexical, so we don't need to register custom converstion functions. \r\n \r\n\r\n\r\n#### Reviewer Resources\r\n- Please review the \ud83c\udff7\ufe0f [**JIRA ticket**](https://mural.atlassian.net/browse/CAN-7949) to understand the context of this effort.\r\n\r\n- \ud83e\uddea Please use this [**testing environment**](https://can-7949.mural.engineering) to perform a smoke test. ([all testing envs](https://testing-envs.mural.engineering))\r\n\r\n\r\n### Required Checklist for Author\r\n- [ ] Unit tests were added/updated\r\n- [x] No new cucumber tests were added \r\n- [x] Exception: no unit tests were added or updated for this change\r\n", + "labels": [] + }, + { + "number": 45801, + "title": "ENGAGE-1344 - Disabled selector state and a tooltip", + "branch": "add/engage-1344", + "merged_at": "2025-10-24T17:28:31Z", + "changed_files": 6, + "additions": 214, + "deletions": 24, + "body": "Test env - https://engage-1344.mural.engineering\r\n---\r\n## Pull Request Overview\r\n\r\nThis PR implements a disabled state for the access level selector and adds a tooltip for non-owners in the share mural dialog. When a user is not the mural owner (`ownedByMe` is false), the access level selector is replaced with static text and the permission selector displays a tooltip explaining that only owners can change these settings.\r\n\r\n**Key changes:**\r\n- Replaced disabled access level dropdown with static text for non-owners\r\n- Added tooltip support to the DropdownSelect component\r\n- Updated disabled state styling to use proper design tokens\r\n\r\n### Reviewed Changes\r\n\r\nCopilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.\r\n\r\n
\r\nShow a summary per file\r\n\r\n| File | Description |\r\n| ---- | ----------- |\r\n| `AccessInfo.tsx` | Conditionally renders access level as text instead of dropdown for non-owners; added tooltip to permission dropdown |\r\n| `AccessInfo.test.tsx` | Updated tests to verify new behavior of text display and tooltip functionality |\r\n| `DropdownSelect/index.tsx` | Added tooltip prop and conditional rendering with MrlTooltip wrapper |\r\n| `DropdownSelect/styles.ts` | Added disabled state styling using design token for text color |\r\n| `DropdownSelect.test.tsx` | Added comprehensive tests for tooltip functionality |\r\n| `styles.module.sass` | Added styling for the title text element in access selector |\r\n
\r\n\r\n\r\n\r\n
\r\nComments suppressed due to low confidence (1)\r\n\r\n**src/views/mural/modals/share/share-mural/components/DropdownSelect/index.tsx:37**\r\n* The Select component is duplicated in both branches with identical props. Consider extracting the Select to a variable or refactoring to wrap it conditionally: `const select =