From 5de3b170b5c8b218304e1eff31106c07fa8bd27b Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Thu, 24 Apr 2025 09:58:38 -0700 Subject: [PATCH 001/226] =?UTF-8?q?Revert=20"Revert=20"enhancement(case):?= =?UTF-8?q?=20improve=20minimal=20model=20for=20faster=20table=20loa?= =?UTF-8?q?=E2=80=A6"=20(#5925)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e8a1858ba11395cefc418ee3b7ea2ee3cc88ed73. --- src/dispatch/case/models.py | 35 ++++++++++---------------------- src/dispatch/case_cost/models.py | 4 ++++ 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/dispatch/case/models.py b/src/dispatch/case/models.py index 91ae1a2f967b..f5aebf019b2d 100644 --- a/src/dispatch/case/models.py +++ b/src/dispatch/case/models.py @@ -1,8 +1,9 @@ from collections import Counter, defaultdict from datetime import datetime -from typing import Any, ForwardRef, List, Optional +from typing import Any, List, Optional from pydantic import Field, validator +from dispatch.case_cost.models import CaseCostReadMinimal from sqlalchemy import ( Boolean, Column, @@ -247,7 +248,6 @@ class ProjectRead(DispatchBase): color: Optional[str] allow_self_join: Optional[bool] = Field(True, nullable=True) - # Pydantic models... class CaseBase(DispatchBase): title: str @@ -292,32 +292,19 @@ class IncidentReadBasic(DispatchBase): name: Optional[NameStr] -CaseReadMinimal = ForwardRef("CaseReadMinimal") - - class CaseReadMinimal(CaseBase): id: PrimaryKey - assignee: Optional[ParticipantReadMinimal] - case_costs: List[CaseCostRead] = [] - case_priority: CasePriorityRead - case_severity: CaseSeverityRead + name: NameStr | None + status: CaseStatus | None # Used in table and for action disabling + closed_at: datetime | None = None + reported_at: datetime | None = None + dedicated_channel: bool | None # Used by CaseStatus component case_type: CaseTypeRead - duplicates: Optional[List[CaseReadBasic]] = [] - incidents: Optional[List[IncidentReadBasic]] = [] - related: Optional[List[CaseReadMinimal]] = [] - closed_at: Optional[datetime] = None - created_at: Optional[datetime] = None - escalated_at: Optional[datetime] = None - dedicated_channel: Optional[bool] - name: Optional[NameStr] + case_severity: CaseSeverityRead + case_priority: CasePriorityRead project: ProjectRead - reporter: Optional[ParticipantReadMinimal] - reported_at: Optional[datetime] = None - tags: Optional[List[TagRead]] = [] - ticket: Optional[TicketRead] = None - total_cost_classic: float | None - total_cost_new: float | None - triage_at: Optional[datetime] = None + assignee: ParticipantReadMinimal | None + case_costs: list[CaseCostReadMinimal] = [] CaseReadMinimal.update_forward_refs() diff --git a/src/dispatch/case_cost/models.py b/src/dispatch/case_cost/models.py index 4105cea57d5e..760b431636d2 100644 --- a/src/dispatch/case_cost/models.py +++ b/src/dispatch/case_cost/models.py @@ -39,6 +39,10 @@ class CaseCostUpdate(CaseCostBase): case_cost_type: CaseCostTypeRead +class CaseCostReadMinimal(DispatchBase): + amount: float = 0 + + class CaseCostRead(CaseCostBase): id: PrimaryKey case_cost_type: CaseCostTypeRead From 494217bd0d59fb037d9696a6336b6aeef7219c24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:18:43 -0700 Subject: [PATCH 002/226] chore(deps): bump @tanstack/vue-query in /src/dispatch/static/dispatch (#5928) Bumps [@tanstack/vue-query](https://github.com/TanStack/query/tree/HEAD/packages/vue-query) from 5.74.5 to 5.74.6. - [Release notes](https://github.com/TanStack/query/releases) - [Commits](https://github.com/TanStack/query/commits/v5.74.6/packages/vue-query) --- updated-dependencies: - dependency-name: "@tanstack/vue-query" dependency-version: 5.74.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 3c6a1288c675..7ba509fbddc3 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1630,9 +1630,9 @@ } }, "node_modules/@tanstack/vue-query": { - "version": "5.74.5", - "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.74.5.tgz", - "integrity": "sha512-1IvuUASQ3h5jbM+90AR4vIDDLxYyGA9Iefvzx9uQMDA4c5Gpd9ETKHZgSUvFM3sXw6k0tY3uHtllBf875OqOcQ==", + "version": "5.74.6", + "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.74.6.tgz", + "integrity": "sha512-Fs0ZCwY9oV2TroxzAu5JOcnVpAnjMfpntGR1uUgaFvTdi8JcMPPtEt9FJZuJMa9Vo9cDrQj9Sq1ifP7ATi25TQ==", "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "^8.19.4", From fed2d75c0588b2524e102e2b505a991d3e5a29fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:26:23 -0700 Subject: [PATCH 003/226] chore(deps): bump @vue-flow/core in /src/dispatch/static/dispatch (#5929) Bumps [@vue-flow/core](https://github.com/bcakmakoglu/vue-flow/tree/HEAD/packages/core) from 1.42.5 to 1.43.0. - [Release notes](https://github.com/bcakmakoglu/vue-flow/releases) - [Changelog](https://github.com/bcakmakoglu/vue-flow/blob/master/packages/core/CHANGELOG.md) - [Commits](https://github.com/bcakmakoglu/vue-flow/commits/@vue-flow/core@1.43.0/packages/core) --- updated-dependencies: - dependency-name: "@vue-flow/core" dependency-version: 1.43.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 7ba509fbddc3..6878f45b7e9e 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -2489,9 +2489,9 @@ } }, "node_modules/@vue-flow/core": { - "version": "1.42.5", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.42.5.tgz", - "integrity": "sha512-fNaBzt5i/JYHIzfmR4wtT1TkpfZBgB+Pe/LjCG+aXdNOpeveuegv3AmEcU3GFqf/uYrd1rsma877Lncu1uwz1w==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.43.0.tgz", + "integrity": "sha512-iN2wNNdzZCPc0Zo2TPTbhSAk/lPsaZRpyb2VZ5hiwkzzuCVGdEBgUjH4dnDDcXpqetmXkxrW78dj8fUQQMjtbA==", "license": "MIT", "dependencies": { "@vueuse/core": "^10.5.0", From 5703dc8d9d28731b1b222883c6a8038c9f5a415a Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Thu, 24 Apr 2025 11:34:01 -0700 Subject: [PATCH 004/226] feat(entity): send notification to channel thread when entities are recalculated (#5912) --- src/dispatch/case/messaging.py | 39 ++++++++++++++++++++++++++++++- src/dispatch/entity_type/flows.py | 13 +++++++++++ src/dispatch/messaging/strings.py | 1 + 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/dispatch/case/messaging.py b/src/dispatch/case/messaging.py index 521105b3639b..364cd94b04c5 100644 --- a/src/dispatch/case/messaging.py +++ b/src/dispatch/case/messaging.py @@ -15,6 +15,7 @@ from dispatch.document import service as document_service from dispatch.case.models import Case, CaseRead from dispatch.conversation.enums import ConversationCommands +from dispatch.entity_type.models import EntityType from dispatch.messaging.strings import ( CASE_CLOSE_REMINDER, CASE_TRIAGE_REMINDER, @@ -400,7 +401,7 @@ def send_event_paging_message(case: Case, db_session: Session, oncall_name: str) "type": "section", "text": { "type": "mrkdwn", - "text": f"""Event reported. Team will respond during business hours. For urgent assistance, type `{engage_oncall_command}` in this channel and select "Page" to contact `{oncall_name}`.""" + "text": f"""Event reported. Team will respond during business hours. For urgent assistance, type `{engage_oncall_command}` in this channel and select "Page" to contact `{oncall_name}`.""", }, }, ] @@ -456,3 +457,39 @@ def send_case_rating_feedback_message(case: Case, db_session: Session): log.exception(e) log.debug("Case rating and feedback message sent to all participants.") + + +def send_entity_update_notification(*, db_session: Session, entity_type: EntityType, case: Case): + plugin = plugin_service.get_active_instance( + db_session=db_session, project_id=case.project.id, plugin_type="conversation" + ) + if not plugin: + log.warning("Entity update notification not sent, no conversation plugin enabled.") + return + + if case.dedicated_channel or not case.has_thread: + log.warning("Entity update notification not sent, can only send to case threads.") + return + + notification_text = "Entity Update Notification" + + blocks = [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": f"{entity_type.name} created. You can now create a snooze for entities of this type.", + }, + }, + ] + + plugin.instance.send( + conversation_id=case.conversation.channel_id, + text=notification_text, + message_template=[], + notification_type=MessageType.entity_update, + blocks=blocks, + ts=case.conversation.thread_id, + ) + + log.debug("Entity update notification sent to all participants.") diff --git a/src/dispatch/entity_type/flows.py b/src/dispatch/entity_type/flows.py index c008d72f2785..2018a2d530e5 100644 --- a/src/dispatch/entity_type/flows.py +++ b/src/dispatch/entity_type/flows.py @@ -1,4 +1,6 @@ +import logging from sqlalchemy.orm import Session +from dispatch.case.messaging import send_entity_update_notification from dispatch.entity_type.models import EntityScopeEnum from dispatch.signal.models import SignalInstance from dispatch.entity_type import service as entity_type_service @@ -6,6 +8,8 @@ from dispatch.entity_type.models import EntityType from dispatch.entity import service as entity_service +log = logging.getLogger(__file__) + def recalculate_entity_flow( db_session: Session, @@ -34,4 +38,13 @@ def recalculate_entity_flow( signal_instance.entities = entities db_session.commit() + try: + send_entity_update_notification( + db_session=db_session, + entity_type=entity_type, + case=signal_instance.case, + ) + except Exception as e: + log.warning(f"Failed to send entity update notification: {e}") + return signal_instance diff --git a/src/dispatch/messaging/strings.py b/src/dispatch/messaging/strings.py index e8240612a6ef..923425ec8987 100644 --- a/src/dispatch/messaging/strings.py +++ b/src/dispatch/messaging/strings.py @@ -21,6 +21,7 @@ class MessageType(DispatchEnum): + entity_update = "entity-update" evergreen_reminder = "evergreen-reminder" incident_closed_information_review_reminder = "incident-closed-information-review-reminder" incident_completed_form_notification = "incident-completed-form-notification" From 8bef6cf69647230088f8835c671ce7cc28b8b336 Mon Sep 17 00:00:00 2001 From: Marc Vilanova <39573146+mvilanova@users.noreply.github.com> Date: Thu, 24 Apr 2025 12:02:01 -0700 Subject: [PATCH 005/226] fix(conference): only tactical participants are included in conference creation (#5930) --- src/dispatch/incident/flows.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/dispatch/incident/flows.py b/src/dispatch/incident/flows.py index f1ce5e33d426..5ce81b47563a 100644 --- a/src/dispatch/incident/flows.py +++ b/src/dispatch/incident/flows.py @@ -224,15 +224,11 @@ def incident_create_resources( # we create the conference room if not incident.conference: - conference_participants = [] - if incident.tactical_group and incident.notifications_group: - conference_participants = [ - incident.tactical_group.email, - incident.notifications_group.email, - ] - else: - conference_participants = tactical_participant_emails - + # we only include individuals that are directly participating in the + # resolution of the incident + conference_participants = tactical_participant_emails + if incident.tactical_group: + conference_participants = [incident.tactical_group.email] conference_flows.create_conference( incident=incident, participants=conference_participants, db_session=db_session ) From 093a5d3b368cb18d789329888b4564fec8234f85 Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Thu, 24 Apr 2025 15:39:11 -0700 Subject: [PATCH 006/226] ui/ux(case): fix hotkey layout, add tag selector, disable graph tab (#5926) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Revert "ui/ux(case): fix hotkey layout, add tag selector, disable gra…" This reverts commit 1295bbe7f4ecc84696f15e28403238b3a8835f17. * uI: labels -> tags Signed-off-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> * revert: remove default tags * ui(tag): implement the exclusive reqs, discoverable, etc * lint(eslint): resolve lint errors --------- Signed-off-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- .../src/case/CaseAttributesDrawer.vue | 11 + .../static/dispatch/src/case/CaseTabs.vue | 26 +- .../dispatch/src/components/DTooltip.vue | 43 +- .../dispatch/src/tag/TagSearchPopover.vue | 573 ++++++++++++++++++ 4 files changed, 634 insertions(+), 19 deletions(-) create mode 100644 src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue diff --git a/src/dispatch/static/dispatch/src/case/CaseAttributesDrawer.vue b/src/dispatch/static/dispatch/src/case/CaseAttributesDrawer.vue index a0df01f07f8a..3ce037f86e5b 100644 --- a/src/dispatch/static/dispatch/src/case/CaseAttributesDrawer.vue +++ b/src/dispatch/static/dispatch/src/case/CaseAttributesDrawer.vue @@ -10,6 +10,7 @@ import CaseTypeSearchPopover from "@/case/type/CaseTypeSearchPopover.vue" import DTooltip from "@/components/DTooltip.vue" import ParticipantSearchPopover from "@/participant/ParticipantSearchPopover.vue" import ProjectSearchPopover from "@/project/ProjectSearchPopover.vue" +import TagSearchPopover from "@/tag/TagSearchPopover.vue" import { useSavingState } from "@/composables/useSavingState" // Define the props @@ -150,6 +151,15 @@ const handleResolutionUpdate = (newResolution) => { + + + +
Tags
+
+ + + +
@@ -187,6 +197,7 @@ const handleResolutionUpdate = (newResolution) => { diff --git a/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue b/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue new file mode 100644 index 000000000000..35ebeb2e8d59 --- /dev/null +++ b/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue @@ -0,0 +1,573 @@ + + + + + From 20829568530e721d656b487d444fb68825cfd69e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:37:52 -0700 Subject: [PATCH 007/226] chore(deps-dev): bump @playwright/test in /src/dispatch/static/dispatch (#5905) Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.51.1 to 1.52.0. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.51.1...v1.52.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.52.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 6878f45b7e9e..5632609d590b 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1239,13 +1239,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", - "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.51.1" + "playwright": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -5848,13 +5848,13 @@ } }, "node_modules/playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.1" + "playwright-core": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -5867,9 +5867,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", "dev": true, "license": "Apache-2.0", "bin": { From 445fc55a71b6b60f3ba2f10ad77790d0e4cb6649 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 08:19:53 -0700 Subject: [PATCH 008/226] chore(deps): bump @vue-flow/core in /src/dispatch/static/dispatch (#5932) Bumps [@vue-flow/core](https://github.com/bcakmakoglu/vue-flow/tree/HEAD/packages/core) from 1.43.0 to 1.43.1. - [Release notes](https://github.com/bcakmakoglu/vue-flow/releases) - [Changelog](https://github.com/bcakmakoglu/vue-flow/blob/master/packages/core/CHANGELOG.md) - [Commits](https://github.com/bcakmakoglu/vue-flow/commits/@vue-flow/core@1.43.1/packages/core) --- updated-dependencies: - dependency-name: "@vue-flow/core" dependency-version: 1.43.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 5632609d590b..0ea6803cba52 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -2489,9 +2489,9 @@ } }, "node_modules/@vue-flow/core": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.43.0.tgz", - "integrity": "sha512-iN2wNNdzZCPc0Zo2TPTbhSAk/lPsaZRpyb2VZ5hiwkzzuCVGdEBgUjH4dnDDcXpqetmXkxrW78dj8fUQQMjtbA==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.43.1.tgz", + "integrity": "sha512-GL5sFR5Gy8PtyPHfpClyXML1WzcclnmV57Md6W0PQie15S6Y2Xqi28TKSV1E/uvM2tToorvsULg+yDVWLPHR4g==", "license": "MIT", "dependencies": { "@vueuse/core": "^10.5.0", From 9fe0abea1bcbc5b9d33cc3c3c2c46b6f2b3eae3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 08:33:03 -0700 Subject: [PATCH 009/226] chore(deps): bump sass-embedded in /src/dispatch/static/dispatch (#5923) Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.86.3 to 1.87.0. - [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/embedded-host-node/compare/1.86.3...1.87.0) --- updated-dependencies: - dependency-name: sass-embedded dependency-version: 1.87.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 166 +++++++++--------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 0ea6803cba52..59b821f32988 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -6472,9 +6472,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.3.tgz", - "integrity": "sha512-3pZSp24ibO1hdopj+W9DuiWsZOb2YY6AFRo/jjutKLBkqJGM1nJjXzhAYfzRV+Xn5BX1eTI4bBTE09P0XNHOZg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.87.0.tgz", + "integrity": "sha512-1IA3iTJNh4BkkA/nidKiVwbmkxr9o6LsPegycHMX/JYs255zpocN5GdLF1+onohQCJxbs5ldr8osKV7qNaNBjg==", "license": "MIT", "dependencies": { "@bufbuild/protobuf": "^2.0.0", @@ -6493,32 +6493,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.86.3", - "sass-embedded-android-arm64": "1.86.3", - "sass-embedded-android-ia32": "1.86.3", - "sass-embedded-android-riscv64": "1.86.3", - "sass-embedded-android-x64": "1.86.3", - "sass-embedded-darwin-arm64": "1.86.3", - "sass-embedded-darwin-x64": "1.86.3", - "sass-embedded-linux-arm": "1.86.3", - "sass-embedded-linux-arm64": "1.86.3", - "sass-embedded-linux-ia32": "1.86.3", - "sass-embedded-linux-musl-arm": "1.86.3", - "sass-embedded-linux-musl-arm64": "1.86.3", - "sass-embedded-linux-musl-ia32": "1.86.3", - "sass-embedded-linux-musl-riscv64": "1.86.3", - "sass-embedded-linux-musl-x64": "1.86.3", - "sass-embedded-linux-riscv64": "1.86.3", - "sass-embedded-linux-x64": "1.86.3", - "sass-embedded-win32-arm64": "1.86.3", - "sass-embedded-win32-ia32": "1.86.3", - "sass-embedded-win32-x64": "1.86.3" + "sass-embedded-android-arm": "1.87.0", + "sass-embedded-android-arm64": "1.87.0", + "sass-embedded-android-ia32": "1.87.0", + "sass-embedded-android-riscv64": "1.87.0", + "sass-embedded-android-x64": "1.87.0", + "sass-embedded-darwin-arm64": "1.87.0", + "sass-embedded-darwin-x64": "1.87.0", + "sass-embedded-linux-arm": "1.87.0", + "sass-embedded-linux-arm64": "1.87.0", + "sass-embedded-linux-ia32": "1.87.0", + "sass-embedded-linux-musl-arm": "1.87.0", + "sass-embedded-linux-musl-arm64": "1.87.0", + "sass-embedded-linux-musl-ia32": "1.87.0", + "sass-embedded-linux-musl-riscv64": "1.87.0", + "sass-embedded-linux-musl-x64": "1.87.0", + "sass-embedded-linux-riscv64": "1.87.0", + "sass-embedded-linux-x64": "1.87.0", + "sass-embedded-win32-arm64": "1.87.0", + "sass-embedded-win32-ia32": "1.87.0", + "sass-embedded-win32-x64": "1.87.0" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.3.tgz", - "integrity": "sha512-UyeXrFzZSvrGbvrWUBcspbsbivGgAgebLGJdSqJulgSyGbA6no3DWQ5Qpdd6+OAUC39BlpPu74Wx9s4RrVuaFw==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.87.0.tgz", + "integrity": "sha512-Z20u/Y1kFDpMbgiloR5YPLxNuMVeKQRC8e/n68oAAxf3u7rDSmNn2msi7USqgT1f2zdBBNawn/ifbFEla6JiHw==", "cpu": [ "arm" ], @@ -6532,9 +6532,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.3.tgz", - "integrity": "sha512-q+XwFp6WgAv+UgnQhsB8KQ95kppvWAB7DSoJp+8Vino8b9ND+1ai3cUUZPE5u4SnLZrgo5NtrbPvN5KLc4Pfyg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.87.0.tgz", + "integrity": "sha512-uqeZoBuXm3W2KhxolScAAfWOLHL21e50g7AxlLmG0he7WZsWw6e9kSnmq301iLIFp4kvmXYXbXbNKAeu9ItRYA==", "cpu": [ "arm64" ], @@ -6548,9 +6548,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.3.tgz", - "integrity": "sha512-gTJjVh2cRzvGujXj5ApPk/owUTL5SiO7rDtNLrzYAzi1N5HRuLYXqk3h1IQY3+eCOBjGl7mQ9XyySbJs/3hDvg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.87.0.tgz", + "integrity": "sha512-hSWTqo2Igdig528cUb1W1+emw9d1J4+nqOoR4tERS04zcwRRFNDiuBT0o5meV7nkEwE982F+h57YdcRXj8gTtg==", "cpu": [ "ia32" ], @@ -6564,9 +6564,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.3.tgz", - "integrity": "sha512-Po3JnyiCS16kd6REo1IMUbFGYtvL9O0rmKaXx5vOuBaJD1LPy2LiSSp7TU7wkJ9IxsTDGzFaSeP1I9qb6D8VVg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.87.0.tgz", + "integrity": "sha512-kBAPSjiTBLy5ua/0LRNAJwOAARhzFU7gP35fYORJcdBuz1lkIVPVnid1lh9qQ6Ce9MOJcr7VKFtGnTuqVeig5A==", "cpu": [ "riscv64" ], @@ -6580,9 +6580,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.3.tgz", - "integrity": "sha512-+7h3jdDv/0kUFx0BvxYlq2fa7CcHiDPlta6k5OxO5K6jyqJwo9hc0Z052BoYEauWTqZ+vK6bB5rv2BIzq4U9nA==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.87.0.tgz", + "integrity": "sha512-ZHMrNdtdMSpJUYco2MesnlPwDTZftD3pqkkOMI2pbqarPoFUKJtP5k80nwCM0sJGtqfNE+O16w9yPght0CMiJg==", "cpu": [ "x64" ], @@ -6596,9 +6596,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.3.tgz", - "integrity": "sha512-EgLwV4ORm5Hr0DmIXo0Xw/vlzwLnfAiqD2jDXIglkBsc5czJmo4/IBdGXOP65TRnsgJEqvbU3aQhuawX5++x9A==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.87.0.tgz", + "integrity": "sha512-7TK1JWJdCIRSdZv5CJv/HpDz/wIfwUy2FoPz9sVOEj1pDTH0N+VfJd5VutCddIdoQN9jr0ap8vwkc65FbAxV2A==", "cpu": [ "arm64" ], @@ -6612,9 +6612,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.3.tgz", - "integrity": "sha512-dfKhfrGPRNLWLC82vy/vQGmNKmAiKWpdFuWiePRtg/E95pqw+sCu6080Y6oQLfFu37Iq3MpnXiSpDuSo7UnPWA==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.87.0.tgz", + "integrity": "sha512-2JiQzt7FmgUC4MYT2QvbeH/Bi3e76WEhaYoc5P3WyTW8unsHksyTdMuTuYe0Qf9usIyt6bmm5no/4BBw7c8Cig==", "cpu": [ "x64" ], @@ -6628,9 +6628,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.3.tgz", - "integrity": "sha512-+fVCIH+OR0SMHn2NEhb/VfbpHuUxcPtqMS34OCV3Ka99LYZUJZqth4M3lT/ppGl52mwIVLNYzR4iLe6mdZ6mYA==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.87.0.tgz", + "integrity": "sha512-z5P6INMsGXiUcq1sRRbksyQUhalFFYjTEexuxfSYdK3U2YQMADHubQh8pGzkWvFRPOpnh83RiGuwvpaARYHnsw==", "cpu": [ "arm" ], @@ -6644,9 +6644,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.3.tgz", - "integrity": "sha512-tYq5rywR53Qtc+0KI6pPipOvW7a47ETY69VxfqI9BR2RKw2hBbaz0bIw6OaOgEBv2/XNwcWb7a4sr7TqgkqKAA==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.87.0.tgz", + "integrity": "sha512-5z+mwJCbGZcg+q+MwdEVSh0ogFK7OSAe175Gsozzr/Izw34Q+RGUw9O82jsV2c4YNuTAQvzEHgIO5cvNvt3Quw==", "cpu": [ "arm64" ], @@ -6660,9 +6660,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.3.tgz", - "integrity": "sha512-CmQ5OkqnaeLdaF+bMqlYGooBuenqm3LvEN9H8BLhjkpWiFW8hnYMetiqMcJjhrXLvDw601KGqA5sr/Rsg5s45g==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.87.0.tgz", + "integrity": "sha512-Xzcp+YPp0iakGL148Jl57CO+MxLuj2jsry3M+rc1cSnDlvkjNVs6TMxaL70GFeV5HdU2V60voYcgE7adDUtJjw==", "cpu": [ "ia32" ], @@ -6676,9 +6676,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.3.tgz", - "integrity": "sha512-SEm65SQknI4pl+mH5Xf231hOkHJyrlgh5nj4qDbiBG6gFeutaNkNIeRgKEg3cflXchCr8iV/q/SyPgjhhzQb7w==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.87.0.tgz", + "integrity": "sha512-4PyqOWhRzyu06RRmpCCBOJdF4BOv7s446wrV6yODtEyyfSIDx3MJabo3KT0oJ1lTWSI/aU3R89bKx0JFXcIHHw==", "cpu": [ "arm" ], @@ -6692,9 +6692,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.3.tgz", - "integrity": "sha512-4zOr2C/eW89rxb4ozTfn7lBzyyM5ZigA1ZSRTcAR26Qbg/t2UksLdGnVX9/yxga0d6aOi0IvO/7iM2DPPRRotg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.87.0.tgz", + "integrity": "sha512-HWE5eTRCoKzFZWsxOjDMTF5m4DDTQ0n7NJxSYiUXPBDydr9viPXbGOMYG7WVJLjiF7upr7DYo/mfp/SNTMlZyg==", "cpu": [ "arm64" ], @@ -6708,9 +6708,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.3.tgz", - "integrity": "sha512-84Tcld32LB1loiqUvczWyVBQRCChm0wNLlkT59qF29nxh8njFIVf9yaPgXcSyyjpPoD9Tu0wnq3dvVzoMCh9AQ==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.87.0.tgz", + "integrity": "sha512-aQaPvlRn3kh93PLQvl6BcFKu8Ji92+42blFEkg6nMVvmugD5ZwH2TGFrX25ibx4CYxRpMS4ssF7a0i7vy5HB1Q==", "cpu": [ "ia32" ], @@ -6724,9 +6724,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.3.tgz", - "integrity": "sha512-IxEqoiD7vdNpiOwccybbV93NljBy64wSTkUOknGy21SyV43C8uqESOwTwW9ywa3KufImKm8L3uQAW/B0KhJMWg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.87.0.tgz", + "integrity": "sha512-o5DxcqiFzET3KRWo+futHr/lhAMBP3tJGGx8YIgpHQYfvDMbsvE0hiFC+nZ/GF9dbcGd+ceIQwfvE5mcc7Gsjw==", "cpu": [ "riscv64" ], @@ -6740,9 +6740,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.3.tgz", - "integrity": "sha512-ePeTPXUxPK6JgHcUfnrkIyDtyt+zlAvF22mVZv6y1g/PZFm1lSfX+Za7TYHg9KaYqaaXDiw6zICX4i44HhR8rA==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.87.0.tgz", + "integrity": "sha512-dKxWsu9Wu/CyfzQmHdeiGqrRSzJ85VUjbSx+aP1/7ttmps3SSg+YW95PuqnCOa7GSuSreC3dKKpXHTywUxMLQA==", "cpu": [ "x64" ], @@ -6756,9 +6756,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.3.tgz", - "integrity": "sha512-NuXQ72dwfNLe35E+RaXJ4Noq4EkFwM65eWwCwxEWyJO9qxOx1EXiCAJii6x8kkOh5daWuMU0VAI1B9RsJaqqQQ==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.87.0.tgz", + "integrity": "sha512-Sy3ESZ4FwBiijvmTA9n+0p0w3MNCue1AgINVPzpAY27EFi0h49eqQm9SWfOkFqmkFS2zFRYowdQOr5Bbr2gOXA==", "cpu": [ "riscv64" ], @@ -6772,9 +6772,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.3.tgz", - "integrity": "sha512-t8be9zJ5B82+og9bQmIQ83yMGYZMTMrlGA+uGWtYacmwg6w3093dk91Fx0YzNSZBp3Tk60qVYjCZnEIwy60x0g==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.87.0.tgz", + "integrity": "sha512-+UfjakOcHHKTnEqB3EZ+KqzezQOe1emvy4Rs+eQhLyfekpYuNze/qlRvYxfKTmrtvDiUrIto8MXsyZfMLzkuMA==", "cpu": [ "x64" ], @@ -6788,9 +6788,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.3.tgz", - "integrity": "sha512-4ghuAzjX4q8Nksm0aifRz8hgXMMxS0SuymrFfkfJlrSx68pIgvAge6AOw0edoZoe0Tf5ZbsWUWamhkNyNxkTvw==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.87.0.tgz", + "integrity": "sha512-m1DS6FYUE0/fv+vt38uQB/kxR4UjnyD+2zcSc298pFmA0aYh/XZIPWw7RxG1HL3KLE1ZrGyu3254MPoxRhs3ig==", "cpu": [ "arm64" ], @@ -6804,9 +6804,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.3.tgz", - "integrity": "sha512-tCaK4zIRq9mLRPxLzBAdYlfCuS/xLNpmjunYxeWkIwlJo+k53h1udyXH/FInnQ2GgEz0xMXyvH3buuPgzwWYsw==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.87.0.tgz", + "integrity": "sha512-JztXLo59GMe2E6g+kCsyiERYhtZgkcyDYx6CrXoSTE5WaE+RbxRiCCCv8/1+hf406f08pUxJ8G0Ody7M5urtBA==", "cpu": [ "ia32" ], @@ -6820,9 +6820,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.3.tgz", - "integrity": "sha512-zS+YNKfTF4SnOfpC77VTb0qNZyTXrxnAezSoRV0xnw6HlY+1WawMSSB6PbWtmbvyfXNgpmJUttoTtsvJjRCucg==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.87.0.tgz", + "integrity": "sha512-4nQErpauvhgSo+7ClumGdjdf9sGx+U9yBgvhI0+zUw+D5YvraVgvA0Lk8Wuwntx2PqnvKUk8YDr/vxHJostv4Q==", "cpu": [ "x64" ], From 379fb9c48bd10cd868056f64dec15970bf4952a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 08:52:16 -0700 Subject: [PATCH 010/226] chore(deps-dev): bump sass in /src/dispatch/static/dispatch (#5922) Bumps [sass](https://github.com/sass/dart-sass) from 1.86.3 to 1.87.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.86.3...1.87.0) --- updated-dependencies: - dependency-name: sass dependency-version: 1.87.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Will Sheldon <114631109+wssheldon@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 59b821f32988..99879134cb4c 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -6451,9 +6451,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", - "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", + "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", "dev": true, "license": "MIT", "dependencies": { From 71597ab42b6b67036484e1952a0785ebae27b892 Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Fri, 25 Apr 2025 09:40:15 -0700 Subject: [PATCH 011/226] feat(slack): adds add entity button in snooze modal (#5931) * Adding entity config button to Snooze Signal modal * change emoji on button --- .../dispatch_slack/case/interactive.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/dispatch/plugins/dispatch_slack/case/interactive.py b/src/dispatch/plugins/dispatch_slack/case/interactive.py index c4b16ef1ec23..444716122053 100644 --- a/src/dispatch/plugins/dispatch_slack/case/interactive.py +++ b/src/dispatch/plugins/dispatch_slack/case/interactive.py @@ -30,6 +30,7 @@ from dispatch.case.enums import CaseResolutionReason, CaseStatus from dispatch.case.models import Case, CaseCreate, CaseRead, CaseUpdate from dispatch.case.type import service as case_type_service +from dispatch.config import DISPATCH_UI_URL from dispatch.conversation import flows as conversation_flows from dispatch.entity import service as entity_service from dispatch.enums import EventType, SubjectNames, UserRoles, Visibility @@ -723,6 +724,7 @@ def snooze_button_click( subject = context["subject"] case_id = None + case_url = None if subject.type == SignalSubjects.signal_instance: instance = signal_service.get_signal_instance( db_session=db_session, signal_instance_id=subject.id @@ -733,6 +735,10 @@ def snooze_button_click( case_id = case.id subject.type = SignalSubjects.signal_instance subject.id = case.signal_instances[0].signal.id + case_url = ( + f"{DISPATCH_UI_URL}/{case.project.organization.slug}/cases/{case.name}/" + f"signal/{case.signal_instances[0].id}" + ) signal = signal_service.get(db_session=db_session, signal_id=subject.id) blocks = [ @@ -754,6 +760,19 @@ def snooze_button_click( if entity_select_block: blocks.append(entity_select_block) + if case_url: + blocks.append( + Actions( + elements=[ + Button( + text="➕ Add entities", + action_id="button-link", + style="primary", + url=case_url, + ) + ] + ), + ) blocks.append( Context( elements=[ @@ -761,7 +780,7 @@ def snooze_button_click( text="Signals that contain all selected entities will be snoozed for the configured timeframe." ) ] - ) + ), ) modal = Modal( From 7657c5270e7df0bb10168efdef1feb76bd3b770b Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:21:05 -0700 Subject: [PATCH 012/226] bugfix(tags): tag exclusivity validator drops non-exclusive tags (#5933) --- src/dispatch/case/models.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/dispatch/case/models.py b/src/dispatch/case/models.py index f5aebf019b2d..ce1359ae5e4b 100644 --- a/src/dispatch/case/models.py +++ b/src/dispatch/case/models.py @@ -362,20 +362,25 @@ class CaseUpdate(CaseBase): triage_at: Optional[datetime] = None @validator("tags") - def find_exclusive(cls, v): - if v: - exclusive_tags = defaultdict(list) - for t in v: - if t.tag_type.exclusive: - exclusive_tags[t.tag_type.id].append(t) - - for v in exclusive_tags.values(): - if len(v) > 1: + def find_exclusive(cls, tags: Optional[List[TagRead]]) -> Optional[List[TagRead]]: + if not tags: + return tags + + # Group tags by tag_type.id + exclusive_tags = defaultdict(list) + for t in tags: + if t.tag_type and t.tag_type.exclusive: + exclusive_tags[t.tag_type.id].append(t) + + # Check for multiple exclusive tags of the same type + for tag_list in exclusive_tags.values(): + if len(tag_list) > 1: raise ValueError( "Found multiple exclusive tags. Please ensure that only one tag of a given " - f"type is applied. Tags: {','.join([t.name for t in v])}" + f"type is applied. Tags: {','.join([t.name for t in tag_list])}" ) - return v + + return tags class CasePagination(Pagination): From 40c3a152451d64c4a9d82b177d66594ec7831258 Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:09:34 -0700 Subject: [PATCH 013/226] bugfix(ui/tags): remove tags on chip delete for tag search popover (#5934) --- .../static/dispatch/src/tag/TagSearchPopover.vue | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue b/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue index 35ebeb2e8d59..f18afd8582ca 100644 --- a/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue +++ b/src/dispatch/static/dispatch/src/tag/TagSearchPopover.vue @@ -140,7 +140,7 @@ const fetchData = async (force = false) => { const tagResponse = await TagApi.getAll(tagFilterOptions) allTags.value = tagResponse.data.items groupedTags.value = convertData(allTags.value) - } catch (error: any) { + } catch (error) { console.error("Error fetching tags or tag types:", error) fetchError.value = "Failed to load tags. Please try again." allTags.value = [] @@ -237,7 +237,6 @@ const toggleTag = (tag: any) => { } } -// Function to save changes to the backend const saveTagChanges = async () => { if (!tagsHaveChanged.value) return @@ -269,6 +268,12 @@ const saveTagChanges = async () => { } } +// Method to remove a tag and immediately save +const removeTagAndSave = async (tag: any) => { + toggleTag(tag) // Update local state first + await saveTagChanges() +} + // Computed property to find missing required tag types const missingRequiredTagTypes = computed(() => { if (!groupedTags.value || groupedTags.value.length === 0) return [] @@ -307,7 +312,7 @@ const getTagIcon = (tag: any) => { class="mr-1 linear-tag" closable :close-icon="'mdi-close'" - @click:close="toggleTag(tag)" + @click:close="removeTagAndSave(tag)" > - {{ event.description }} + {{ event.description }} @@ -92,6 +92,7 @@ import RawSignalViewer from "@/signal/RawSignalViewer.vue" import RouterUtils from "@/router/utils" import SignalPopover from "@/signal/SignalPopover.vue" import TableFilterDialog from "@/signal/TableFilterDialog.vue" +import InstanceEntityPopover from "@/signal/InstanceEntityPopover.vue" export default { name: "SignalInstanceTable", @@ -101,14 +102,18 @@ export default { RawSignalViewer, SignalPopover, TableFilterDialog, + InstanceEntityPopover, }, data() { return { + activeView: "triggers", headers: [ { title: "Case", value: "case", sortable: false }, + { title: "Status", value: "filter_action", sortable: true }, { title: "Signal Definition", value: "signal", sortable: false }, - { title: "Filter Action", value: "filter_action", sortable: true }, + { title: "Entities", value: "entities", sortable: true }, + { title: "Snoozes", value: "signal.filters", sortable: false }, { title: "Project", value: "signal.project.display_name", sortable: true }, { title: "Created At", value: "created_at" }, { title: "", value: "data-table-actions", sortable: false, align: "end" }, @@ -149,6 +154,27 @@ export default { methods: { ...mapActions("signal", ["getAllInstances"]), + + /** + * Count the snooze filters for a given signal definition. Counts all + * active snoozes by default, with the option to count expired snoozes instead. + * @param signal_filters: The definition's filters. + * @param count_expired: If true, count expired snoozes instead of active ones. + */ + getSnoozes(signal_filters, count_expired = false) { + let snoozes = 0 + for (let filter of signal_filters) { + if (filter.action === "snooze") { + let filter_is_expired = filter.expiration && new Date() >= new Date(filter.expiration) + if (!count_expired && !filter_is_expired) { + snoozes++ + } else if (count_expired && filter_is_expired) { + snoozes++ + } + } + } + return snoozes + }, }, created() { From b2c20f78f0d207aa0032724b2647a55139f35561 Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Mon, 2 Jun 2025 09:32:48 -0700 Subject: [PATCH 092/226] fix(service): get_by_name_or_default no longer works if name wasn't found (#6027) --- src/dispatch/case/priority/service.py | 21 +++++---- src/dispatch/case/severity/service.py | 47 ++++++++++--------- src/dispatch/case/type/service.py | 12 ++--- src/dispatch/incident/priority/service.py | 43 +++++++++-------- src/dispatch/incident/severity/service.py | 36 +++++++------- src/dispatch/incident/type/service.py | 15 +++--- src/dispatch/organization/service.py | 26 +++++----- src/dispatch/project/service.py | 24 +++++----- tests/case_type/test_case_type_service.py | 29 ++++++++++++ .../test_incident_priority_service.py | 34 ++++++++++++++ .../test_incident_type_service.py | 29 ++++++++++++ .../organization/test_organization_service.py | 24 ++++++++++ tests/project/test_project_service.py | 26 +++++++++- tests/signal/test_signal_service.py | 6 +-- 14 files changed, 262 insertions(+), 110 deletions(-) diff --git a/src/dispatch/case/priority/service.py b/src/dispatch/case/priority/service.py index 8333009b2244..76dc99474110 100644 --- a/src/dispatch/case/priority/service.py +++ b/src/dispatch/case/priority/service.py @@ -41,7 +41,7 @@ def get_default_or_raise(*, db_session, project_id: int) -> CasePriority: "input": None, "ctx": {"error": ValueError("No default case priority defined.")}, } - ] + ], ) return case_priority @@ -73,9 +73,11 @@ def get_by_name_or_raise( "loc": ("case_priority",), "input": case_priority_in.name, "msg": "Value error, Case priority not found.", - "ctx": {"error": ValueError(f"Case priority not found: {case_priority_in.name}")} + "ctx": { + "error": ValueError(f"Case priority not found: {case_priority_in.name}") + }, } - ] + ], ) return case_priority @@ -85,13 +87,12 @@ def get_by_name_or_default( *, db_session, project_id: int, case_priority_in=CasePriorityRead ) -> CasePriority: """Returns a case priority based on a name or the default if not specified.""" - if case_priority_in: - if case_priority_in.name: - return get_by_name_or_raise( - db_session=db_session, - project_id=project_id, - case_priority_in=case_priority_in, - ) + if case_priority_in and case_priority_in.name: + case_priority = get_by_name( + db_session=db_session, project_id=project_id, name=case_priority_in.name + ) + if case_priority: + return case_priority return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/case/severity/service.py b/src/dispatch/case/severity/service.py index caf932b6b3e4..b5420f2937d2 100644 --- a/src/dispatch/case/severity/service.py +++ b/src/dispatch/case/severity/service.py @@ -32,13 +32,15 @@ def get_default_or_raise(*, db_session, project_id: int) -> CaseSeverity: case_severity = get_default(db_session=db_session, project_id=project_id) if not case_severity: - raise ValidationError([ - { - "loc": ("case_severity",), - "msg": "No default case severity defined.", - "type": "value_error", - } - ]) + raise ValidationError( + [ + { + "loc": ("case_severity",), + "msg": "No default case severity defined.", + "type": "value_error", + } + ] + ) return case_severity @@ -61,14 +63,16 @@ def get_by_name_or_raise( ) if not case_severity: - raise ValidationError([ - { - "loc": ("case_severity",), - "msg": "Case severity not found.", - "type": "value_error", - "case_severity": case_severity_in.name, - } - ]) + raise ValidationError( + [ + { + "loc": ("case_severity",), + "msg": "Case severity not found.", + "type": "value_error", + "case_severity": case_severity_in.name, + } + ] + ) return case_severity @@ -77,13 +81,12 @@ def get_by_name_or_default( *, db_session, project_id: int, case_severity_in=CaseSeverityRead ) -> CaseSeverity: """Returns a case severity based on a name or the default if not specified.""" - if case_severity_in: - if case_severity_in.name: - return get_by_name_or_raise( - db_session=db_session, - project_id=project_id, - case_severity_in=case_severity_in, - ) + if case_severity_in and case_severity_in.name: + case_severity = get_by_name( + db_session=db_session, project_id=project_id, name=case_severity_in.name + ) + if case_severity: + return case_severity return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/case/type/service.py b/src/dispatch/case/type/service.py index 5f7decedd17b..4468a5027db4 100644 --- a/src/dispatch/case/type/service.py +++ b/src/dispatch/case/type/service.py @@ -1,4 +1,3 @@ - from sqlalchemy.sql.expression import true from dispatch.case import service as case_service @@ -58,11 +57,12 @@ def get_by_name_or_raise(*, db_session, project_id: int, case_type_in=CaseTypeRe def get_by_name_or_default(*, db_session, project_id: int, case_type_in=CaseTypeRead) -> CaseType: """Returns a case type based on a name or the default if not specified.""" - if case_type_in: - if case_type_in.name: - return get_by_name_or_raise( - db_session=db_session, project_id=project_id, case_type_in=case_type_in - ) + if case_type_in and case_type_in.name: + case_type = get_by_name( + db_session=db_session, project_id=project_id, name=case_type_in.name + ) + if case_type: + return case_type return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/incident/priority/service.py b/src/dispatch/incident/priority/service.py index b012fe582e97..66c435b72497 100644 --- a/src/dispatch/incident/priority/service.py +++ b/src/dispatch/incident/priority/service.py @@ -36,12 +36,14 @@ def get_default_or_raise(*, db_session, project_id: int) -> IncidentPriority: incident_priority = get_default(db_session=db_session, project_id=project_id) if not incident_priority: - raise ValidationError([ - { - "msg": "No default incident priority defined.", - "loc": "incident_priority", - } - ]) + raise ValidationError( + [ + { + "msg": "No default incident priority defined.", + "loc": "incident_priority", + } + ] + ) return incident_priority @@ -64,13 +66,15 @@ def get_by_name_or_raise( ) if not incident_priority: - raise ValidationError([ - { - "msg": "Incident priority not found.", - "loc": "incident_priority", - "incident_priority": incident_priority_in.name, - } - ]) + raise ValidationError( + [ + { + "msg": "Incident priority not found.", + "loc": "incident_priority", + "incident_priority": incident_priority_in.name, + } + ] + ) return incident_priority @@ -79,13 +83,12 @@ def get_by_name_or_default( *, db_session, project_id: int, incident_priority_in=IncidentPriorityRead ) -> IncidentPriority: """Returns a incident priority based on a name or the default if not specified.""" - if incident_priority_in: - if incident_priority_in.name: - return get_by_name_or_raise( - db_session=db_session, - project_id=project_id, - incident_priority_in=incident_priority_in, - ) + if incident_priority_in and incident_priority_in.name: + incident_priority = get_by_name( + db_session=db_session, project_id=project_id, name=incident_priority_in.name + ) + if incident_priority: + return incident_priority return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/incident/severity/service.py b/src/dispatch/incident/severity/service.py index f8fc37d6953d..7c09c2200e7d 100644 --- a/src/dispatch/incident/severity/service.py +++ b/src/dispatch/incident/severity/service.py @@ -44,9 +44,9 @@ def get_default_or_raise(*, db_session, project_id: int) -> IncidentSeverity: "loc": ("incident_severity",), "input": None, "msg": "No default incident severity defined.", - "ctx": {"error": ValueError("No default incident severity defined.")} + "ctx": {"error": ValueError("No default incident severity defined.")}, } - ] + ], ) return incident_severity @@ -71,14 +71,16 @@ def get_by_name_or_raise( ) if not incident_severity: - raise ValidationError([ - { - "msg": "Incident severity not found.", - "loc": ("incident_severity",), - "type": "value_error.not_found", - "incident_severity": incident_severity_in.name, - } - ]) + raise ValidationError( + [ + { + "msg": "Incident severity not found.", + "loc": ("incident_severity",), + "type": "value_error.not_found", + "incident_severity": incident_severity_in.name, + } + ] + ) return incident_severity @@ -87,14 +89,12 @@ def get_by_name_or_default( *, db_session, project_id: int, incident_severity_in=IncidentSeverityRead ) -> IncidentSeverity: """Returns an incident severity based on a name or the default if not specified.""" - if incident_severity_in: - if incident_severity_in.name: - return get_by_name_or_raise( - db_session=db_session, - project_id=project_id, - incident_severity_in=incident_severity_in, - ) - + if incident_severity_in and incident_severity_in.name: + incident_severity = get_by_name( + db_session=db_session, project_id=project_id, name=incident_severity_in.name + ) + if incident_severity: + return incident_severity return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/incident/type/service.py b/src/dispatch/incident/type/service.py index b27bc46f6a00..83f7631146c1 100644 --- a/src/dispatch/incident/type/service.py +++ b/src/dispatch/incident/type/service.py @@ -41,7 +41,7 @@ def get_default_or_raise(*, db_session, project_id: int) -> IncidentType: "input": None, "ctx": {"error": ValueError("No default incident type defined.")}, } - ] + ], ) return incident_type @@ -74,7 +74,7 @@ def get_by_name_or_raise( "input": incident_type_in.name, "ctx": {"error": ValueError("Incident type not found.")}, } - ] + ], ) return incident_type @@ -84,11 +84,12 @@ def get_by_name_or_default( *, db_session, project_id: int, incident_type_in=IncidentTypeRead ) -> IncidentType: """Returns a incident_type based on a name or the default if not specified.""" - if incident_type_in: - if incident_type_in.name: - return get_by_name_or_raise( - db_session=db_session, project_id=project_id, incident_type_in=incident_type_in - ) + if incident_type_in and incident_type_in.name: + incident_type = get_by_name( + db_session=db_session, project_id=project_id, name=incident_type_in.name + ) + if incident_type: + return incident_type return get_default_or_raise(db_session=db_session, project_id=project_id) diff --git a/src/dispatch/organization/service.py b/src/dispatch/organization/service.py index ba4b7679b026..a34771aeb783 100644 --- a/src/dispatch/organization/service.py +++ b/src/dispatch/organization/service.py @@ -1,4 +1,3 @@ - from pydantic import ValidationError from sqlalchemy.sql.expression import true @@ -25,13 +24,15 @@ def get_default_or_raise(*, db_session) -> Organization: organization = get_default(db_session=db_session) if not organization: - raise ValidationError([ - { - "loc": ("organization",), - "msg": "No default organization defined.", - "type": "value_error", - } - ]) + raise ValidationError( + [ + { + "loc": ("organization",), + "msg": "No default organization defined.", + "type": "value_error", + } + ] + ) return organization @@ -85,10 +86,11 @@ def get_by_slug_or_raise(*, db_session, organization_in: OrganizationRead) -> Or def get_by_name_or_default(*, db_session, organization_in: OrganizationRead) -> Organization: """Returns a organization based on a name or the default if not specified.""" - if organization_in.name: - return get_by_name_or_raise(db_session=db_session, organization_in=organization_in) - else: - return get_default_or_raise(db_session=db_session) + if organization_in and organization_in.name: + organization = get_by_name(db_session=db_session, name=organization_in.name) + if organization: + return organization + return get_default_or_raise(db_session=db_session) def get_all(*, db_session) -> list[Organization | None]: diff --git a/src/dispatch/project/service.py b/src/dispatch/project/service.py index d5c505d711f8..962325423c03 100644 --- a/src/dispatch/project/service.py +++ b/src/dispatch/project/service.py @@ -1,4 +1,3 @@ - from pydantic import ValidationError from sqlalchemy.orm import Session from sqlalchemy.sql.expression import true @@ -22,13 +21,15 @@ def get_default_or_raise(*, db_session: Session) -> Project: project = get_default(db_session=db_session) if not project: - raise ValidationError([ - { - "loc": ("project",), - "msg": "No default project defined.", - "type": "value_error", - } - ]) + raise ValidationError( + [ + { + "loc": ("project",), + "msg": "No default project defined.", + "type": "value_error", + } + ] + ) return project @@ -57,9 +58,10 @@ def get_by_name_or_raise(*, db_session: Session, project_in: ProjectRead) -> Pro def get_by_name_or_default(*, db_session, project_in: ProjectRead) -> Project: """Returns a project based on a name or the default if not specified.""" - if project_in: - if project_in.name: - return get_by_name_or_raise(db_session=db_session, project_in=project_in) + if project_in and project_in.name: + project = get_by_name(db_session=db_session, name=project_in.name) + if project: + return project return get_default_or_raise(db_session=db_session) diff --git a/tests/case_type/test_case_type_service.py b/tests/case_type/test_case_type_service.py index b07c6932e18e..331b6cfe3ecc 100644 --- a/tests/case_type/test_case_type_service.py +++ b/tests/case_type/test_case_type_service.py @@ -1,6 +1,7 @@ import datetime from datetime import timezone + def test_get(session, case_type): from dispatch.case.type.service import get @@ -113,3 +114,31 @@ def test_delete(session, case_type): delete(db_session=session, case_type_id=case_type.id) assert not get(db_session=session, case_type_id=case_type.id) + + +def test_get_by_name_or_default__name(session, case_type): + from dispatch.case.type.models import CaseTypeRead + from dispatch.case.type.service import get_by_name_or_default + + case_type_in = CaseTypeRead.from_orm(case_type) + result = get_by_name_or_default( + db_session=session, project_id=case_type.project.id, case_type_in=case_type_in + ) + assert result.id == case_type.id + + +def test_get_by_name_or_default__default(session, case_type): + from dispatch.case.type.models import CaseTypeRead + from dispatch.case.type.service import get_by_name_or_default + + # Ensure only one default case type + for ct in session.query(type(case_type)).all(): + ct.default = False + case_type.default = True + session.commit() + # Pass a CaseTypeRead with a non-existent name and dummy id > 0 + case_type_in = CaseTypeRead(id=99999, name="nonexistent", project=case_type.project) + result = get_by_name_or_default( + db_session=session, project_id=case_type.project.id, case_type_in=case_type_in + ) + assert result.id == case_type.id diff --git a/tests/incident_priority/test_incident_priority_service.py b/tests/incident_priority/test_incident_priority_service.py index 0535cd5caa00..e55562e1ad42 100644 --- a/tests/incident_priority/test_incident_priority_service.py +++ b/tests/incident_priority/test_incident_priority_service.py @@ -59,3 +59,37 @@ def test_delete(session, incident_priority): delete(db_session=session, incident_priority_id=incident_priority.id) assert not get(db_session=session, incident_priority_id=incident_priority.id) + + +def test_get_by_name_or_default__name(session, incident_priority): + from dispatch.incident.priority.models import IncidentPriorityRead + from dispatch.incident.priority.service import get_by_name_or_default + + incident_priority_in = IncidentPriorityRead.from_orm(incident_priority) + result = get_by_name_or_default( + db_session=session, + project_id=incident_priority.project.id, + incident_priority_in=incident_priority_in, + ) + assert result.id == incident_priority.id + + +def test_get_by_name_or_default__default(session, incident_priority): + from dispatch.incident.priority.models import IncidentPriorityRead + from dispatch.incident.priority.service import get_by_name_or_default + + # Ensure only one default incident priority + for ip in session.query(type(incident_priority)).all(): + ip.default = False + incident_priority.default = True + session.commit() + # Pass an IncidentPriorityRead with a non-existent name and dummy id > 0 + incident_priority_in = IncidentPriorityRead( + id=99999, name="nonexistent", project=incident_priority.project + ) + result = get_by_name_or_default( + db_session=session, + project_id=incident_priority.project.id, + incident_priority_in=incident_priority_in, + ) + assert result.id == incident_priority.id diff --git a/tests/incident_type/test_incident_type_service.py b/tests/incident_type/test_incident_type_service.py index 8a6806f22587..453cd01562ba 100644 --- a/tests/incident_type/test_incident_type_service.py +++ b/tests/incident_type/test_incident_type_service.py @@ -1,6 +1,7 @@ import datetime from datetime import timezone + def test_get(session, incident_type): from dispatch.incident.type.service import get @@ -112,3 +113,31 @@ def test_delete(session, incident_type): delete(db_session=session, incident_type_id=incident_type.id) assert not get(db_session=session, incident_type_id=incident_type.id) + + +def test_get_by_name_or_default__name(session, incident_type): + from dispatch.incident.type.models import IncidentTypeRead + from dispatch.incident.type.service import get_by_name_or_default + + incident_type_in = IncidentTypeRead.from_orm(incident_type) + result = get_by_name_or_default( + db_session=session, project_id=incident_type.project.id, incident_type_in=incident_type_in + ) + assert result.id == incident_type.id + + +def test_get_by_name_or_default__default(session, incident_type): + from dispatch.incident.type.models import IncidentTypeRead + from dispatch.incident.type.service import get_by_name_or_default + + # Ensure only one default incident type + for it in session.query(type(incident_type)).all(): + it.default = False + incident_type.default = True + session.commit() + # Pass an IncidentTypeRead with a non-existent name and dummy id > 0 + incident_type_in = IncidentTypeRead(id=99999, name="nonexistent", project=incident_type.project) + result = get_by_name_or_default( + db_session=session, project_id=incident_type.project.id, incident_type_in=incident_type_in + ) + assert result.id == incident_type.id diff --git a/tests/organization/test_organization_service.py b/tests/organization/test_organization_service.py index f784ee92c61d..1b7f8a3c7879 100644 --- a/tests/organization/test_organization_service.py +++ b/tests/organization/test_organization_service.py @@ -59,3 +59,27 @@ def test_delete(session, organization): delete(db_session=session, organization_id=organization.id) assert not get(db_session=session, organization_id=organization.id) + + +def test_get_by_name_or_default__name(session, organization): + from dispatch.organization.models import OrganizationRead + from dispatch.organization.service import get_by_name_or_default + + organization_in = OrganizationRead.from_orm(organization) + result = get_by_name_or_default(db_session=session, organization_in=organization_in) + assert result.id == organization.id + + +def test_get_by_name_or_default__default(session, organization): + from dispatch.organization.models import OrganizationRead + from dispatch.organization.service import get_by_name_or_default + + # Ensure only one default organization + for org in session.query(type(organization)).all(): + org.default = False + organization.default = True + session.commit() + # Pass an OrganizationRead with a non-existent name + organization_in = OrganizationRead(name="nonexistent") + result = get_by_name_or_default(db_session=session, organization_in=organization_in) + assert result.id == organization.id diff --git a/tests/project/test_project_service.py b/tests/project/test_project_service.py index f41600fa55af..e39f1128f2d1 100644 --- a/tests/project/test_project_service.py +++ b/tests/project/test_project_service.py @@ -21,7 +21,7 @@ def test_create(session, organization): id=organization.id, name=organization.name, slug=organization.slug, - description=organization.description + description=organization.description, ) # Generate a random integer ID for the project to avoid collisions @@ -87,3 +87,27 @@ def test_delete(session, project): delete(db_session=session, project_id=project.id) assert not get(db_session=session, project_id=project.id) + + +def test_get_by_name_or_default__name(session, project): + from dispatch.project.models import ProjectRead + from dispatch.project.service import get_by_name_or_default + + project_in = ProjectRead.from_orm(project) + result = get_by_name_or_default(db_session=session, project_in=project_in) + assert result.id == project.id + + +def test_get_by_name_or_default__default(session, project, organization): + from dispatch.project.models import ProjectRead + from dispatch.project.service import get_by_name_or_default + + # Ensure only one default project + for p in session.query(type(project)).all(): + p.default = False + project.default = True + session.commit() + # Pass a ProjectRead with a non-existent name + project_in = ProjectRead(name="nonexistent", organization=organization) + result = get_by_name_or_default(db_session=session, project_in=project_in) + assert result.id == project.id diff --git a/tests/signal/test_signal_service.py b/tests/signal/test_signal_service.py index f267046c0aee..c253a7f33c68 100644 --- a/tests/signal/test_signal_service.py +++ b/tests/signal/test_signal_service.py @@ -90,7 +90,7 @@ def test_create(session, project, case_priority, case_type, service, tag, entity ) with pytest.raises(ValidationError) as exc_info: create(db_session=session, signal_in=signal_in) - assert "Value error, Case priority not found:" in str(exc_info.value) + assert "No default case priority defined." in str(exc_info.value) def test_update(session, project, signal, case_priority, case_type, service, tag, entity_type): @@ -262,7 +262,7 @@ def test_update__add_filter( signal=signal, signal_in=signal_in, ) - assert "Value error, Case priority not found:" in str(exc_info.value) + assert "No default case priority defined." in str(exc_info.value) def test_update__delete_filter( @@ -345,7 +345,7 @@ def test_update__delete_filter( signal=signal, signal_in=signal_in, ) - assert "Value error, Case priority not found:" in str(exc_info.value) + assert "No default case priority defined." in str(exc_info.value) def test_delete(session, signal): From c0fbc69245794e8a1b6dcd2c672d8518a4554ba3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 09:35:02 -0700 Subject: [PATCH 093/226] chore(deps): bump vue in /src/dispatch/static/dispatch (#6024) Bumps [vue](https://github.com/vuejs/core) from 3.5.15 to 3.5.16. - [Release notes](https://github.com/vuejs/core/releases) - [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md) - [Commits](https://github.com/vuejs/core/compare/v3.5.15...v3.5.16) --- updated-dependencies: - dependency-name: vue dependency-version: 3.5.16 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 1b42619a13c0..84969b41fcab 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -2522,39 +2522,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.15.tgz", - "integrity": "sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.15", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.15.tgz", - "integrity": "sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.15.tgz", - "integrity": "sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.15", - "@vue/compiler-dom": "3.5.15", - "@vue/compiler-ssr": "3.5.15", - "@vue/shared": "3.5.15", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.3", @@ -2571,13 +2571,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.15.tgz", - "integrity": "sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/devtools-api": { @@ -2586,53 +2586,53 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "node_modules/@vue/reactivity": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.15.tgz", - "integrity": "sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.15" + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.15.tgz", - "integrity": "sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.15.tgz", - "integrity": "sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.15", - "@vue/runtime-core": "3.5.15", - "@vue/shared": "3.5.15", + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.15.tgz", - "integrity": "sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { - "vue": "3.5.15" + "vue": "3.5.16" } }, "node_modules/@vue/shared": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.15.tgz", - "integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -8097,16 +8097,16 @@ } }, "node_modules/vue": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.15.tgz", - "integrity": "sha512-aD9zK4rB43JAMK/5BmS4LdPiEp8Fdh8P1Ve/XNuMF5YRf78fCyPE6FUbQwcaWQ5oZ1R2CD9NKE0FFOVpMR7gEQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.15", - "@vue/compiler-sfc": "3.5.15", - "@vue/runtime-dom": "3.5.15", - "@vue/server-renderer": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { "typescript": "*" From 46560955b9ee71dd4c9dc55b017136dfc4d85305 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 09:35:10 -0700 Subject: [PATCH 094/226] chore(deps): bump @tanstack/vue-query in /src/dispatch/static/dispatch (#6023) Bumps [@tanstack/vue-query](https://github.com/TanStack/query/tree/HEAD/packages/vue-query) from 5.77.2 to 5.79.0. - [Release notes](https://github.com/TanStack/query/releases) - [Commits](https://github.com/TanStack/query/commits/v5.79.0/packages/vue-query) --- updated-dependencies: - dependency-name: "@tanstack/vue-query" dependency-version: 5.79.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 84969b41fcab..5e3c23e794b0 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1623,9 +1623,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.77.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.77.2.tgz", - "integrity": "sha512-1lqJwPsR6GX6nZFw06erRt518O19tWU6Q+x0fJUygl4lxHCYF2nhzBPwLKk2NPjYOrpR0K567hxPc5K++xDe9Q==", + "version": "5.79.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.79.0.tgz", + "integrity": "sha512-s+epTqqLM0/TbJzMAK7OEhZIzh63P9sWz5HEFc5XHL4FvKQXQkcjI8F3nee+H/xVVn7mrP610nVXwOytTSYd0w==", "license": "MIT", "funding": { "type": "github", @@ -1633,13 +1633,13 @@ } }, "node_modules/@tanstack/vue-query": { - "version": "5.77.2", - "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.77.2.tgz", - "integrity": "sha512-Neon9wds87Wo6T5qr+YxOnHYmt618IGnlYE2r6dpWDvhb/mJwlvoBw9TS2KzLfmOQuadBc4nWcpUomuDR4otKg==", + "version": "5.79.0", + "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.79.0.tgz", + "integrity": "sha512-ygVG70AqBLrKyIcSi+LCSCmr8ybN+vv3A421VG/pAtMtAR22sY2bmLgsp9ygdERMsTo1PW+LsUUndyiymgp9jw==", "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "^8.19.4", - "@tanstack/query-core": "5.77.2", + "@tanstack/query-core": "5.79.0", "@vue/devtools-api": "^6.6.3", "vue-demi": "^0.14.10" }, From a9f1cf3f512ca6d7773c4f0fa9fbf95f032a25a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 09:35:18 -0700 Subject: [PATCH 095/226] chore(deps): bump @wdns/vuetify-resize-drawer (#6021) Bumps [@wdns/vuetify-resize-drawer](https://github.com/webdevnerdstuff/vuetify-resize-drawer) from 3.2.0 to 3.2.1. - [Release notes](https://github.com/webdevnerdstuff/vuetify-resize-drawer/releases) - [Changelog](https://github.com/webdevnerdstuff/vuetify-resize-drawer/blob/main/CHANGELOG.md) - [Commits](https://github.com/webdevnerdstuff/vuetify-resize-drawer/compare/v3.2.0...v3.2.1) --- updated-dependencies: - dependency-name: "@wdns/vuetify-resize-drawer" dependency-version: 3.2.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 5e3c23e794b0..0af99bccddc5 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -2866,9 +2866,9 @@ } }, "node_modules/@wdns/vuetify-resize-drawer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@wdns/vuetify-resize-drawer/-/vuetify-resize-drawer-3.2.0.tgz", - "integrity": "sha512-JfPDrV9G/6k6fCLLIurET6jdDIzEVSvjrqxoVeWhxTVUuS+Cs4oJga7wWNRgFTZdqfyZT8Id2aUDCEHYCjcQQg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@wdns/vuetify-resize-drawer/-/vuetify-resize-drawer-3.2.1.tgz", + "integrity": "sha512-A3lvxEpc7PuAEtInq2/NGMrcEdwXgnd/xqWfsbC+nLSs/ENzkRvpPWU4KIH8ReywIoltSOoEdOlpiag/460qoQ==", "funding": [ { "type": "paypal", @@ -2879,9 +2879,10 @@ "url": "https://www.patreon.com/WebDevNerdStuff" } ], + "license": "MIT", "dependencies": { "vue": "^3.5.12", - "vuetify": "^3.7.2" + "vuetify": "^3.7.4" } }, "node_modules/@yr/monotone-cubic-spline": { From 4a8da65d51090f7cb544be32bfc5acc4aa9550ea Mon Sep 17 00:00:00 2001 From: kevgliss Date: Tue, 3 Jun 2025 11:42:07 -0700 Subject: [PATCH 096/226] Fixing our env.py to work with sqlalchemy 2.0 (#6030) --- src/dispatch/database/revisions/core/env.py | 17 +++++------------ src/dispatch/database/revisions/tenant/env.py | 11 ++++------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/dispatch/database/revisions/core/env.py b/src/dispatch/database/revisions/core/env.py index 353c7f2e8560..0ae70a6c01f2 100644 --- a/src/dispatch/database/revisions/core/env.py +++ b/src/dispatch/database/revisions/core/env.py @@ -1,5 +1,5 @@ from alembic import context -from sqlalchemy import engine_from_config, pool, text +from sqlalchemy import create_engine, text from dispatch.logging import logging from dispatch.config import SQLALCHEMY_DATABASE_URI @@ -23,10 +23,8 @@ def include_object(object, name, type_, reflected, compare_to): if type_ == "table": - if object.schema == CORE_SCHEMA_NAME: - return True - else: - return True + return object.schema == CORE_SCHEMA_NAME + return True def run_migrations_online(): @@ -36,28 +34,23 @@ def run_migrations_online(): and associate a connection with the context. """ - - # don't create empty revisions def process_revision_directives(context, revision, directives): script = directives[0] if script.upgrade_ops.is_empty(): directives[:] = [] log.info("No changes found skipping revision creation.") - connectable = engine_from_config( - config.get_section(config.config_ini_section), prefix="sqlalchemy.", poolclass=pool.NullPool - ) + connectable = create_engine(SQLALCHEMY_DATABASE_URI) log.info("Migrating dispatch core schema...") # migrate common tables with connectable.connect() as connection: set_search_path = text(f'set search_path to "{CORE_SCHEMA_NAME}"') connection.execute(set_search_path) - connection.dialect.default_schema_name = CORE_SCHEMA_NAME + connection.commit() context.configure( connection=connection, target_metadata=target_metadata, - include_schemas=True, include_object=include_object, process_revision_directives=process_revision_directives, ) diff --git a/src/dispatch/database/revisions/tenant/env.py b/src/dispatch/database/revisions/tenant/env.py index 937dbfc06636..da533ee9f1ce 100644 --- a/src/dispatch/database/revisions/tenant/env.py +++ b/src/dispatch/database/revisions/tenant/env.py @@ -1,5 +1,5 @@ from alembic import context -from sqlalchemy import engine_from_config, pool, inspect, text +from sqlalchemy import create_engine, inspect, text from dispatch.logging import logging @@ -43,16 +43,13 @@ def run_migrations_online(): and associate a connection with the context. """ - def process_revision_directives(context, revision, directives): script = directives[0] if script.upgrade_ops.is_empty(): directives[:] = [] log.info("No changes found skipping revision creation.") - connectable = engine_from_config( - config.get_section(config.config_ini_section), prefix="sqlalchemy.", poolclass=pool.NullPool - ) + connectable = create_engine(SQLALCHEMY_DATABASE_URI) with connectable.connect() as connection: # get the schema names @@ -60,12 +57,12 @@ def process_revision_directives(context, revision, directives): log.info(f"Migrating {schema}...") set_search_path = text(f'set search_path to "{schema}"') connection.execute(set_search_path) - connection.dialect.default_schema_name = schema + connection.commit() + print(target_metadata) context.configure( connection=connection, target_metadata=target_metadata, - include_schemas=True, include_object=include_object, process_revision_directives=process_revision_directives, ) From bfc38926a88cefe4628f04809dfb0f0feece1bb9 Mon Sep 17 00:00:00 2001 From: Aaron Herman Date: Wed, 4 Jun 2025 13:28:16 -0500 Subject: [PATCH 097/226] enhancement(events): prompt assignee for triage in Slack (#6032) * enhancement(events): prompt assignee for triage * update styling of Slack button * Update src/dispatch/case/messaging.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Aaron Herman * Clean up * Update src/dispatch/plugins/dispatch_slack/case/interactive.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Aaron Herman * Use enums for open and restricted --------- Signed-off-by: Aaron Herman Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/dispatch/case/flows.py | 4 ++ src/dispatch/case/messaging.py | 53 +++++++++++++++++++ src/dispatch/conversation/enums.py | 1 + .../plugins/dispatch_slack/case/enums.py | 1 + .../dispatch_slack/case/interactive.py | 36 ++++++++++++- src/dispatch/plugins/dispatch_slack/fields.py | 28 +++++++++- src/dispatch/plugins/dispatch_slack/plugin.py | 1 + 7 files changed, 121 insertions(+), 3 deletions(-) diff --git a/src/dispatch/case/flows.py b/src/dispatch/case/flows.py index 3096f4410267..bf627bd52ca4 100644 --- a/src/dispatch/case/flows.py +++ b/src/dispatch/case/flows.py @@ -42,6 +42,7 @@ send_case_rating_feedback_message, send_case_update_notifications, send_event_paging_message, + send_event_update_prompt_reminder ) from .models import Case from .service import get @@ -309,6 +310,9 @@ def case_new_create_flow( send_event_paging_message(case, db_session, oncall_name) + # send reminder to assignee to update the security event + send_event_update_prompt_reminder(case, db_session) + if case and case.case_type.auto_close: # we transition the case to the closed state if its case type has auto close enabled case_auto_close_flow(case=case, db_session=db_session) diff --git a/src/dispatch/case/messaging.py b/src/dispatch/case/messaging.py index 1bfd8b610add..8242614ad531 100644 --- a/src/dispatch/case/messaging.py +++ b/src/dispatch/case/messaging.py @@ -35,6 +35,8 @@ from dispatch.config import DISPATCH_UI_URL from dispatch.email_templates.models import EmailTemplates from dispatch.plugin import service as plugin_service +from dispatch.plugins.dispatch_slack.models import SubjectMetadata +from dispatch.plugins.dispatch_slack.case.enums import CaseNotificationActions from dispatch.event import service as event_service from dispatch.notification import service as notification_service @@ -377,6 +379,57 @@ def send_case_welcome_participant_message( log.debug(f"Welcome ephemeral message sent to {participant_email}.") +def send_event_update_prompt_reminder(case: Case, db_session: Session) -> None: + """ + Sends an ephemeral message to the assignee reminding them to update the visibility, title, priority + """ + message_text = "Event Triage Reminder" + + plugin = plugin_service.get_active_instance( + db_session=db_session, project_id=case.project.id, plugin_type="conversation" + ) + if plugin is None: + log.warning("Event update prompt message not sent. No conversation plugin enabled.") + return + if case.assignee is None: + log.warning(f"Event update prompt message not sent. No assignee for {case.name}.") + return + + button_metadata = SubjectMetadata( + type="case", + organization_slug=case.project.organization.slug, + id=case.id, + ).json() + + plugin.instance.send_ephemeral( + conversation_id=case.conversation.channel_id, + user=case.assignee.individual.email, + text=message_text, + blocks=[ + { + "type": "section", + "text": { + "type": "plain_text", + "text": f"Update the title, priority, case type and visibility during triage of this security event.", # noqa + }, + }, + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": {"type": "plain_text", "text": "Update Case"}, + "action_id": CaseNotificationActions.update, + "style": "primary", + "value": button_metadata + } + ], + }, + ], + ) + + log.debug(f"Security Event update reminder sent to {case.assignee.individual.email}.") + def send_event_paging_message(case: Case, db_session: Session, oncall_name: str) -> None: """ Sends a message to the case conversation channel to notify the reporter that they can engage diff --git a/src/dispatch/conversation/enums.py b/src/dispatch/conversation/enums.py index 643d4767bd7a..7906545515ab 100644 --- a/src/dispatch/conversation/enums.py +++ b/src/dispatch/conversation/enums.py @@ -10,6 +10,7 @@ class ConversationCommands(DispatchEnum): report_incident = "report-incident" tactical_report = "tactical-report" update_incident = "update-incident" + escalate_case = "escalate-case" class ConversationButtonActions(DispatchEnum): diff --git a/src/dispatch/plugins/dispatch_slack/case/enums.py b/src/dispatch/plugins/dispatch_slack/case/enums.py index 5291f82b5130..a55b211df837 100644 --- a/src/dispatch/plugins/dispatch_slack/case/enums.py +++ b/src/dispatch/plugins/dispatch_slack/case/enums.py @@ -15,6 +15,7 @@ class CaseNotificationActions(DispatchEnum): resolve = "case-notification-resolve" triage = "case-notification-triage" user_mfa = "case-notification-user-mfa" + update = "case-update" class CasePaginateActions(DispatchEnum): diff --git a/src/dispatch/plugins/dispatch_slack/case/interactive.py b/src/dispatch/plugins/dispatch_slack/case/interactive.py index 6a865ba0cf92..0c79c900ba6e 100644 --- a/src/dispatch/plugins/dispatch_slack/case/interactive.py +++ b/src/dispatch/plugins/dispatch_slack/case/interactive.py @@ -73,6 +73,7 @@ case_resolution_reason_select, case_status_select, case_type_select, + case_visibility_select, description_input, entity_select, extension_request_checkbox, @@ -265,7 +266,11 @@ def handle_update_case_command( Context( elements=[ MarkdownText( - text=f"Note: Cases cannot be escalated here. Please use the `{context['config'].slack_command_escalate_case}` slash command." + text=( + "Note: Cases cannot be escalated here. Please use the " + f"{SlackConversationConfiguration.model_json_schema()['properties']['slack_command_escalate_case']['default']} " + "slash command." + ) ) ] ), @@ -280,6 +285,9 @@ def handle_update_case_command( project_id=case.project.id, optional=True, ), + case_visibility_select( + initial_option={"text": case.visibility, "value": case.visibility}, + ) ] modal = Modal( @@ -1639,6 +1647,26 @@ def create_channel_button_click( client.views_open(trigger_id=body["trigger_id"], view=modal) +@app.action( + CaseNotificationActions.update, + middleware=[button_context_middleware, db_middleware, user_middleware], +) +def update_case_button_click( + ack: Ack, + body: dict, + client: WebClient, + context: BoltContext, + db_session: Session, +): + return handle_update_case_command( + ack=ack, + body=body, + client=client, + context=context, + db_session=db_session, + ) + + @app.action( CaseNotificationActions.user_mfa, middleware=[button_context_middleware, db_middleware, user_middleware], @@ -2007,6 +2035,10 @@ def handle_edit_submission_event( if form_data.get(DefaultBlockIds.case_type_select): case_type = {"name": form_data[DefaultBlockIds.case_type_select]["name"]} + case_visibility = case.visibility + if form_data.get(DefaultBlockIds.case_visibility_select): + case_visibility = form_data[DefaultBlockIds.case_visibility_select]["value"] + assignee_email = None if form_data.get(DefaultBlockIds.case_assignee_select): assignee_email = client.users_info( @@ -2023,7 +2055,7 @@ def handle_edit_submission_event( resolution=form_data[DefaultBlockIds.resolution_input], resolution_reason=resolution_reason, status=form_data[DefaultBlockIds.case_status_select]["name"], - visibility=case.visibility, + visibility=case_visibility, case_priority=case_priority, case_type=case_type, ) diff --git a/src/dispatch/plugins/dispatch_slack/fields.py b/src/dispatch/plugins/dispatch_slack/fields.py index bae73e41a1b2..888e6cd505cd 100644 --- a/src/dispatch/plugins/dispatch_slack/fields.py +++ b/src/dispatch/plugins/dispatch_slack/fields.py @@ -18,7 +18,7 @@ from dispatch.case.severity import service as case_severity_service from dispatch.case.type import service as case_type_service from dispatch.entity import service as entity_service -from dispatch.enums import DispatchEnum +from dispatch.enums import DispatchEnum, Visibility from dispatch.incident.enums import IncidentStatus from dispatch.incident.priority import service as incident_priority_service from dispatch.incident.severity import service as incident_severity_service @@ -55,6 +55,7 @@ class DefaultBlockIds(DispatchEnum): case_status_select = "case-status-select" case_severity_select = "case-severity-select" case_type_select = "case-type-select" + case_visibility_select = "case-visibility-select" case_assignee_select = "case-assignee-select" # entities @@ -94,6 +95,7 @@ class DefaultActionIds(DispatchEnum): case_status_select = "case-status-select" case_severity_select = "case-severity-select" case_type_select = "case-type-select" + case_visibility_select = "case-visibility-select" # entities entity_select = "entity-select" @@ -684,6 +686,30 @@ def case_type_select( ) +def case_visibility_select( + action_id: str = DefaultActionIds.case_visibility_select, + block_id: str = DefaultBlockIds.case_visibility_select, + label: str = "Case Visibility", + initial_option: dict | None = None, + **kwargs, +): + """Creates a case visibility select.""" + visibility = [ + {"text": Visibility.restricted, "value": Visibility.restricted}, + {"text": Visibility.open, "value": Visibility.open} + ] + + return static_select_block( + placeholder="Select Visibility", + options=visibility, + initial_option=initial_option, + action_id=action_id, + block_id=block_id, + label=label, + **kwargs, + ) + + def entity_select( signal_id: int, db_session: Session, diff --git a/src/dispatch/plugins/dispatch_slack/plugin.py b/src/dispatch/plugins/dispatch_slack/plugin.py index f457674129f0..5e10e0fafc2d 100644 --- a/src/dispatch/plugins/dispatch_slack/plugin.py +++ b/src/dispatch/plugins/dispatch_slack/plugin.py @@ -412,6 +412,7 @@ def get_command_name(self, command: str): ConversationCommands.list_participants: self.configuration.slack_command_list_participants, ConversationCommands.list_tasks: self.configuration.slack_command_list_tasks, ConversationCommands.tactical_report: self.configuration.slack_command_report_tactical, + ConversationCommands.escalate_case: self.configuration.slack_command_escalate_case, } return command_mappings.get(command, []) From f7c92a26de2954bb3bb5b682420b2ab376601399 Mon Sep 17 00:00:00 2001 From: Aaron Herman Date: Thu, 5 Jun 2025 13:56:03 -0500 Subject: [PATCH 098/226] fix(events): Update prompt should only be for events (#6040) --- src/dispatch/case/flows.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dispatch/case/flows.py b/src/dispatch/case/flows.py index bf627bd52ca4..38381bd26e4c 100644 --- a/src/dispatch/case/flows.py +++ b/src/dispatch/case/flows.py @@ -308,10 +308,11 @@ def case_new_create_flow( f"Failed to get oncall service: {e}. Falling back to default oncall_name string." ) + # send a message to the channel to inform them that they can engage the oncall send_event_paging_message(case, db_session, oncall_name) - # send reminder to assignee to update the security event - send_event_update_prompt_reminder(case, db_session) + # send ephemeral message to assignee to update the security event + send_event_update_prompt_reminder(case, db_session) if case and case.case_type.auto_close: # we transition the case to the closed state if its case type has auto close enabled From 2fde0edcd4f36dea13ca38e0cc7ccd61c450e76c Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Tue, 10 Jun 2025 15:55:21 -0700 Subject: [PATCH 099/226] fix(entity_type): send channel notification once (#6048) --- src/dispatch/entity_type/flows.py | 13 ------------- src/dispatch/entity_type/views.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/dispatch/entity_type/flows.py b/src/dispatch/entity_type/flows.py index 2018a2d530e5..c008d72f2785 100644 --- a/src/dispatch/entity_type/flows.py +++ b/src/dispatch/entity_type/flows.py @@ -1,6 +1,4 @@ -import logging from sqlalchemy.orm import Session -from dispatch.case.messaging import send_entity_update_notification from dispatch.entity_type.models import EntityScopeEnum from dispatch.signal.models import SignalInstance from dispatch.entity_type import service as entity_type_service @@ -8,8 +6,6 @@ from dispatch.entity_type.models import EntityType from dispatch.entity import service as entity_service -log = logging.getLogger(__file__) - def recalculate_entity_flow( db_session: Session, @@ -38,13 +34,4 @@ def recalculate_entity_flow( signal_instance.entities = entities db_session.commit() - try: - send_entity_update_notification( - db_session=db_session, - entity_type=entity_type, - case=signal_instance.case, - ) - except Exception as e: - log.warning(f"Failed to send entity update notification: {e}") - return signal_instance diff --git a/src/dispatch/entity_type/views.py b/src/dispatch/entity_type/views.py index 162600fbf88c..35343a9439e8 100644 --- a/src/dispatch/entity_type/views.py +++ b/src/dispatch/entity_type/views.py @@ -1,8 +1,10 @@ +import logging from fastapi import APIRouter, HTTPException, status from pydantic import ValidationError from sqlalchemy.exc import IntegrityError +from dispatch.case.messaging import send_entity_update_notification from dispatch.case.service import get as get_case from dispatch.database.core import DbSession from dispatch.database.service import CommonParameters, search_filter_sort_paginate @@ -18,6 +20,7 @@ from .flows import recalculate_entity_flow from .service import create, delete, get, update +log = logging.getLogger(__name__) router = APIRouter() @@ -113,6 +116,15 @@ def recalculate(db_session: DbSession, entity_type_id: PrimaryKey, case_id: Prim ) updated_signal_instances.append(updated_signal_instance) + try: + send_entity_update_notification( + db_session=db_session, + entity_type=entity_type, + case=signal_instances[0].case, + ) + except Exception as e: + log.warning(f"Failed to send entity update notification: {e}") + return updated_signal_instances From 11f84b49ce111b856f0687af04d6f6186cbcf800 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:29:58 -0700 Subject: [PATCH 100/226] chore(deps): bump @tanstack/vue-query in /src/dispatch/static/dispatch (#6045) Bumps [@tanstack/vue-query](https://github.com/TanStack/query/tree/HEAD/packages/vue-query) from 5.79.0 to 5.80.6. - [Release notes](https://github.com/TanStack/query/releases) - [Commits](https://github.com/TanStack/query/commits/v5.80.6/packages/vue-query) --- updated-dependencies: - dependency-name: "@tanstack/vue-query" dependency-version: 5.80.6 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 0af99bccddc5..d8b522a9917b 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1623,9 +1623,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.79.0.tgz", - "integrity": "sha512-s+epTqqLM0/TbJzMAK7OEhZIzh63P9sWz5HEFc5XHL4FvKQXQkcjI8F3nee+H/xVVn7mrP610nVXwOytTSYd0w==", + "version": "5.80.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.6.tgz", + "integrity": "sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==", "license": "MIT", "funding": { "type": "github", @@ -1633,13 +1633,13 @@ } }, "node_modules/@tanstack/vue-query": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.79.0.tgz", - "integrity": "sha512-ygVG70AqBLrKyIcSi+LCSCmr8ybN+vv3A421VG/pAtMtAR22sY2bmLgsp9ygdERMsTo1PW+LsUUndyiymgp9jw==", + "version": "5.80.6", + "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.80.6.tgz", + "integrity": "sha512-r6Yd01U6z1rPq++MFFEP9OtWNo4TQYMQQBNEgyNWn2vThv/BtYKhHnXgE7hQ1WZtDLQLYr23q8M68nGDxPwO/Q==", "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "^8.19.4", - "@tanstack/query-core": "5.79.0", + "@tanstack/query-core": "5.80.6", "@vue/devtools-api": "^6.6.3", "vue-demi": "^0.14.10" }, From fad3a725b46302e9343612f5113d10e449157960 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:30:06 -0700 Subject: [PATCH 101/226] chore(deps): bump @tiptap/starter-kit in /src/dispatch/static/dispatch (#6044) Bumps [@tiptap/starter-kit](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/starter-kit) from 2.12.0 to 2.14.0. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/next/packages/starter-kit/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/starter-kit) --- updated-dependencies: - dependency-name: "@tiptap/starter-kit" dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 174 +++++++++--------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index d8b522a9917b..603e32b291b3 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1683,9 +1683,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.12.0.tgz", - "integrity": "sha512-3qX8oGVKFFZzQ0vit+ZolR6AJIATBzmEmjAA0llFhWk4vf3v64p1YcXcJsOBsr5scizJu5L6RYWEFatFwqckRg==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.14.0.tgz", + "integrity": "sha512-MBSMzGYRFlwYCocvx3dU7zpCBSDQ0qWByNtStaEzuBUgzCJ6wn2DP/xG0cMcLmE3Ia0VLM4nwbLOAAvBXOtylA==", "license": "MIT", "funding": { "type": "github", @@ -1696,9 +1696,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.12.0.tgz", - "integrity": "sha512-XUC2A77YAPMJS2SqZ2S62IGcUH8gZ7cdhoWlYQb1pR4ZzXFByeKDJPxfYeAePSiuI01YGrlzgY2c6Ncx/DtO0A==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.14.0.tgz", + "integrity": "sha512-AwqPP0jLYNioKxakiVw0vlfH/ceGFbV+SGoqBbPSGFPRdSbHhxHDNBlTtiThmT3N2PiVwXAD9xislJV+WY4GUA==", "license": "MIT", "funding": { "type": "github", @@ -1709,9 +1709,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.12.0.tgz", - "integrity": "sha512-lAUtoLDLRc5ofD2I9MFY6MQ7d1qBLLqS1rvpwaPjOaoQb/GPVnaHj9qXYG0SY9K3erMtto48bMFpAcscjZHzZQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.14.0.tgz", + "integrity": "sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ==", "license": "MIT", "funding": { "type": "github", @@ -1739,9 +1739,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.12.0.tgz", - "integrity": "sha512-YTCjztB8MaIpwyxFYr81H4+LdKCq1VlaSXQyrPdB44mVdhhRqc46BYQb8/B//XE3UIu3X2QWFjwrqRlUq6vUiw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.14.0.tgz", + "integrity": "sha512-SWnL4bP8Mm/mWN42AMQNoqYE0V6LgSBTVsHwwAki2wIUQdr9HyoAnohvHy3IME56NMwoyZyo+Mzl45wOqUxziA==", "license": "MIT", "funding": { "type": "github", @@ -1752,9 +1752,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.12.0.tgz", - "integrity": "sha512-R7RaS+hJeHFim7alImQ9L9CSWSMjWXvz0Ote568x9ea5gdBGUYW8PcH+5a91lh8e1XGYWBM12a8oJZRyxg/tQA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.14.0.tgz", + "integrity": "sha512-kyo02mnzqgwXayMcyRA/fHQgb+nMmQQpIt1irZwjtEoFZshA7NnY/6b5SJmRcxQ4/X4r2Y2Ha2sWmOcEkLmt4A==", "license": "MIT", "funding": { "type": "github", @@ -1765,9 +1765,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.12.0.tgz", - "integrity": "sha512-1D7cYAjgxEFHdfC/35Ooi4GqWKB5sszbW8iI7N16XILNln26xb0d5KflXqYrwr9CN/ZnZoCl2o6YsP7xEObcZA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.14.0.tgz", + "integrity": "sha512-LRYYZeh8U2XgfTsJ4houB9s9cVRt7PRfVa4MaCeOYKfowVOKQh67yV5oom8Azk9XrMPkPxDmMmdPAEPxeVYFvw==", "license": "MIT", "funding": { "type": "github", @@ -1779,9 +1779,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.12.0.tgz", - "integrity": "sha512-sA1Q+mxDIv0Y3qQTBkYGwknNbDcGFiJ/fyAFholXpqbrcRx3GavwR/o0chBdsJZlFht0x7AWGwUYWvIo7wYilA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.14.0.tgz", + "integrity": "sha512-qwEgpPIJ3AgXdEtRTr88hODbXRdt14VAwLj27PTSqexB5V7Ra1Jy7iQDhqRwBCoUomVywBsWYxkSuDisSRG+9w==", "license": "MIT", "funding": { "type": "github", @@ -1792,9 +1792,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.12.0.tgz", - "integrity": "sha512-zcZSOXFj+7LVnmdPWTfKr5AoxYIzFPFlLJe35AdTQC5IhkljLn1Exct8I30ZREojX/00hKYsO7JJmePS6TEVlQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.14.0.tgz", + "integrity": "sha512-FIh5cdPuoPKvZ0GqSKhzMZGixm05ac3hSgqhMNCBZmXX459qBUI9CvDl/uzSnY9koBDeLVV3HYMthWQQLSXl9A==", "license": "MIT", "funding": { "type": "github", @@ -1823,9 +1823,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.12.0.tgz", - "integrity": "sha512-k8ji5v9YKn7bNjo8UtI9hEfXfl4tKUp1hpJOEmUxGJQa3LIwrwSbReupUTnHszGQelzxikS/l1xO9P0TIGwRoA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.14.0.tgz", + "integrity": "sha512-as+SqC39FRshw4Fm1XVlrdSXveiusf5xiC4nuefLmXsUxO7Yx67x8jS0/VQbxWTLHZ6R1YEW8prLtnxGmVLCAQ==", "license": "MIT", "funding": { "type": "github", @@ -1837,9 +1837,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.12.0.tgz", - "integrity": "sha512-08MNS2PK5DzdnAfqXn4krmJ/xebKmWpRpYqqN5EM8AvetYKlAJyTVSpo0ZUeGbZ3EZiPm9djgSnrLqpFUDjRCg==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.14.0.tgz", + "integrity": "sha512-A8c8n8881iBq3AusNqibh6Hloybr+FgYdg4Lg4jNxbbEaL0WhyLFge1bWlGVpbHXFqdv5YldMUAu6Rop3FhNvw==", "license": "MIT", "funding": { "type": "github", @@ -1850,9 +1850,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.12.0.tgz", - "integrity": "sha512-9DfES4Wd5TX1foI70N9sAL+35NN1UHrtzDYN2+dTHupnmKir9RaMXyZcbkUb4aDVzYrGxIqxJzHBVkquKIlTrw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.14.0.tgz", + "integrity": "sha512-vM//6G3Ox3mxPv9eilhrDqylELCc8kEP1aQ4xUuOw7vCidjNtGggOa1ERnnpV2dCa2A9E8y4FHtN4Xh29stXQg==", "license": "MIT", "funding": { "type": "github", @@ -1863,9 +1863,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.12.0.tgz", - "integrity": "sha512-+B9CAf2BFURC6mQiM1OQtahVTzdEOEgT/UUNlRZkeeBc0K5of3dr6UdBqaoaMAefja3jx5PqiQ7mhUBAjSt6AA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.14.0.tgz", + "integrity": "sha512-/qnOHQFCEPfkb3caykqd+sqzEC2gx30EQB/mM7+5kIG7CQy7XXaGjFAEaqzE1xJ783Q2E7GVk4JxWM+3NhYSLw==", "license": "MIT", "funding": { "type": "github", @@ -1877,9 +1877,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.12.0.tgz", - "integrity": "sha512-Vi2+6RIehDSpoJn/7PDuOieUj7W7WrEb4wBxK9TG8PDscihR0mehhhzm/K2xhH4TN48iPJGRsjDFrFjTbXmcnw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.14.0.tgz", + "integrity": "sha512-OrKWgHOhmJtVHjPYaEJetNLiNEvrI85lTrGxzeQa+a8ACb93h4svyHe9J+LHs5pKkXDQFcpYEXJntu0LVLLiDw==", "license": "MIT", "funding": { "type": "github", @@ -1891,9 +1891,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.12.0.tgz", - "integrity": "sha512-JKcXK3LmEsmxNzEq5e06rPUGMRLUxmJ2mYtBY4NlJ6yLM9XMDljtgeTnWT0ySLYmfINSFTkX4S7WIRbpl9l4pw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.14.0.tgz", + "integrity": "sha512-yEw2S+smoVR8DMYQMAWckVW2Sstf7z5+GBZ8zm8NMGhMKb1JFCPZUv5KTTIPnq7ZrKuuZHvjN9+Ef1dRYD8T2A==", "license": "MIT", "funding": { "type": "github", @@ -1904,9 +1904,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.12.0.tgz", - "integrity": "sha512-4YwZooC8HP+gPxs6YrkB1ayggyYbgVvJx/rWBT6lKSW2MVVg8QXi1zAcSI3MhIhHmqDysXXFPL8JURlbeGjaFA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.14.0.tgz", + "integrity": "sha512-t1jXDPEd82sC6vZVE/12/CB52uuiydCIcRfwdh21xNgBMckToKO9S0K6XEp4ROtrKQdlIH2JDVPfpUBvVrYN8Q==", "license": "MIT", "funding": { "type": "github", @@ -1917,9 +1917,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.12.0.tgz", - "integrity": "sha512-1ys0e/oqk09oXxrB1WzAx5EntK/QreObG/V1yhgihGm429fxHMsxzIYN6dKAYxx0YOPQG7qEZRrrPuWU70Ms7g==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.14.0.tgz", + "integrity": "sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==", "license": "MIT", "funding": { "type": "github", @@ -1930,9 +1930,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.12.0.tgz", - "integrity": "sha512-QNK5cgewCunWFxpLlbvvoO1rrLgEtNKxiY79fctP9toV+e59R+1i1Q9lXC1O5mOfDgVxCb6uFDMsqmKhFjpPog==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.14.0.tgz", + "integrity": "sha512-bsQesVpgvDS2e+wr2fp59QO7rWRp2FqcJvBafwXS3Br9U5Mx3eFYryx4wC7cUnhlhUwX5pmaoA7zISgV9dZDgg==", "license": "MIT", "funding": { "type": "github", @@ -1957,9 +1957,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.12.0.tgz", - "integrity": "sha512-nBaa5YtBsLJPZFfSs36sBz4Zgi/c8b3MsmS/Az8uXaHb0R9yPewOVUMDIQbxMct8SXUlIo9VtKlOL+mVJ3Nkpw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.14.0.tgz", + "integrity": "sha512-rD5d/IL3XPfBOrHRHxt+b+0X1jbIbWONGiad/3sX0ZYQD3PandtCWboH40r/J5tFksebuY12dVYyYQKgLpDBOQ==", "license": "MIT", "funding": { "type": "github", @@ -1970,9 +1970,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.12.0.tgz", - "integrity": "sha512-0ytN9V1tZYTXdiYDQg4FB2SQ56JAJC9r/65snefb9ztl+gZzDrIvih7CflHs1ic9PgyjexfMLeH+VzuMccNyZw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.14.0.tgz", + "integrity": "sha512-rHny566nGZHq61zRLwQ9BPG55W/O+eDKwUJl+LhrLiVWwzpvAl9QQYixtoxJKOY48VK41PKwxe3bgDYgNs/Fhg==", "license": "MIT", "funding": { "type": "github", @@ -1983,9 +1983,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.12.0.tgz", - "integrity": "sha512-Pxwt23ZlvbQUahV0PvHy8Ej6IAuKR1FvHobUvwP3T8AiY7hob66fWRe7tQbESzSAzm5Vv2xkvyHeU8vekMTezA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.14.0.tgz", + "integrity": "sha512-dl0oi2i0rjLpBqTf4wGy6SLidvPpjxLcmX727pwJlCklkFJVDf8wSFeD4ddxJXiD2Rwef0D/lkcwXSY73CoDcA==", "license": "MIT", "funding": { "type": "github", @@ -1996,9 +1996,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.12.0.tgz", - "integrity": "sha512-TNzVwpeNzFfHAcYTOKqX9iU4fRxliyoZrCnERR+RRzeg7gWrXrCLubQt1WEx0sojMAfznshSL3M5HGsYjEbYwA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.14.0.tgz", + "integrity": "sha512-cnsfaIlvTFCDtLP/A2Fd3LmpttgY0O/tuTM2fC71vetONz83wUTYT+aD9uvxdX0GkSocoh840b0TsEazbBxhpA==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.3.0", @@ -2026,32 +2026,32 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.12.0.tgz", - "integrity": "sha512-wlcEEtexd6u0gbR311/OFZnbtRWU97DUsY6/GsSQzN4rqZ7Ra6YbfHEN5Lutu+I/anomK8vKy8k9NyvfY5Hllg==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.14.0.tgz", + "integrity": "sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ==", "license": "MIT", "dependencies": { - "@tiptap/core": "^2.12.0", - "@tiptap/extension-blockquote": "^2.12.0", - "@tiptap/extension-bold": "^2.12.0", - "@tiptap/extension-bullet-list": "^2.12.0", - "@tiptap/extension-code": "^2.12.0", - "@tiptap/extension-code-block": "^2.12.0", - "@tiptap/extension-document": "^2.12.0", - "@tiptap/extension-dropcursor": "^2.12.0", - "@tiptap/extension-gapcursor": "^2.12.0", - "@tiptap/extension-hard-break": "^2.12.0", - "@tiptap/extension-heading": "^2.12.0", - "@tiptap/extension-history": "^2.12.0", - "@tiptap/extension-horizontal-rule": "^2.12.0", - "@tiptap/extension-italic": "^2.12.0", - "@tiptap/extension-list-item": "^2.12.0", - "@tiptap/extension-ordered-list": "^2.12.0", - "@tiptap/extension-paragraph": "^2.12.0", - "@tiptap/extension-strike": "^2.12.0", - "@tiptap/extension-text": "^2.12.0", - "@tiptap/extension-text-style": "^2.12.0", - "@tiptap/pm": "^2.12.0" + "@tiptap/core": "^2.14.0", + "@tiptap/extension-blockquote": "^2.14.0", + "@tiptap/extension-bold": "^2.14.0", + "@tiptap/extension-bullet-list": "^2.14.0", + "@tiptap/extension-code": "^2.14.0", + "@tiptap/extension-code-block": "^2.14.0", + "@tiptap/extension-document": "^2.14.0", + "@tiptap/extension-dropcursor": "^2.14.0", + "@tiptap/extension-gapcursor": "^2.14.0", + "@tiptap/extension-hard-break": "^2.14.0", + "@tiptap/extension-heading": "^2.14.0", + "@tiptap/extension-history": "^2.14.0", + "@tiptap/extension-horizontal-rule": "^2.14.0", + "@tiptap/extension-italic": "^2.14.0", + "@tiptap/extension-list-item": "^2.14.0", + "@tiptap/extension-ordered-list": "^2.14.0", + "@tiptap/extension-paragraph": "^2.14.0", + "@tiptap/extension-strike": "^2.14.0", + "@tiptap/extension-text": "^2.14.0", + "@tiptap/extension-text-style": "^2.14.0", + "@tiptap/pm": "^2.14.0" }, "funding": { "type": "github", From 9ea7c96b87bafcb13de75ad34564aa28c32c3128 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:30:14 -0700 Subject: [PATCH 102/226] chore(deps): bump @tiptap/vue-3 in /src/dispatch/static/dispatch (#6043) Bumps [@tiptap/vue-3](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/vue-3) from 2.12.0 to 2.14.0. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/next/packages/vue-3/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/vue-3) --- updated-dependencies: - dependency-name: "@tiptap/vue-3" dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 603e32b291b3..b074c4b3f9eb 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1722,9 +1722,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.12.0.tgz", - "integrity": "sha512-DYijoE0igV0Oi+ZppFsp2UrQsM/4HZtmmpD78BJM9zfCbd1YvAUIxmzmXr8uqU18OHd1uQy+/zvuNoUNYyw67g==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.14.0.tgz", + "integrity": "sha512-sN15n0RjPh+2Asvxs7l47hVEvX6c0aPempU8QQWcPUlHoGf1D/XkyHXy6GWVPSxZ5Rj5uAwgKvhHsG/FJ/YGKQ==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -1806,9 +1806,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.12.0.tgz", - "integrity": "sha512-BYpyZx/56KCDksWuJJbhki/uNgt9sACuSSZFH5AN1yS1ISD+EzIxqf6Pzzv8QCoNJ+KcRNVaZsOlOFaJGoyzag==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.14.0.tgz", + "integrity": "sha512-Khx7M7RfZlD1/T/PUlpJmao6FtEBa2L6td2hhaW1USflwGJGk0U/ud4UEqh+aZoJZrkot/EMhEvzmORF3nq+xw==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2059,13 +2059,13 @@ } }, "node_modules/@tiptap/vue-3": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.12.0.tgz", - "integrity": "sha512-NXvxIwBSYDhEiL6MwRnoUc5+KizAnokp4/BA3n4S5+hbmpuJCygebYdq8Tap0KU9caAh53qqiMlSonuLHny5vA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.14.0.tgz", + "integrity": "sha512-w7jzOYmaNgL/1p4q3wRJf4NdvO23IvOgGR6sUM/3ULtjG0dchn9JMpD3Vm7Y9FLSKBcwAWZim4gR6PFIvIsETA==", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.12.0", - "@tiptap/extension-floating-menu": "^2.12.0" + "@tiptap/extension-bubble-menu": "^2.14.0", + "@tiptap/extension-floating-menu": "^2.14.0" }, "funding": { "type": "github", From ae9d7111fbaa2b7870cd64303c0e1cde49083afa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:30:22 -0700 Subject: [PATCH 103/226] chore(deps): bump @tiptap/pm in /src/dispatch/static/dispatch (#6042) Bumps [@tiptap/pm](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/pm) from 2.12.0 to 2.14.0. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/next/packages/pm/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/pm) --- updated-dependencies: - dependency-name: "@tiptap/pm" dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 4df3bd2c062a134f1dfea67e33161b8d38e8cbdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:30:30 -0700 Subject: [PATCH 104/226] chore(deps): bump vuetify in /src/dispatch/static/dispatch (#6033) Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.8.7 to 3.8.8. - [Release notes](https://github.com/vuetifyjs/vuetify/releases) - [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.8.8/packages/vuetify) --- updated-dependencies: - dependency-name: vuetify dependency-version: 3.8.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index b074c4b3f9eb..f68e1760814b 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -8234,9 +8234,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/vuetify": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.7.tgz", - "integrity": "sha512-Xid5za36cOA9We0QShcjiI4qoWXcwABhlhDHi8/0qpjSrBgJ63GobQdZ9YYyRvjMT3XXJqgbkdis1RS/oGL8Bw==", + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.8.tgz", + "integrity": "sha512-EPFynvxh72PBgUVZnGpfYfGluz8dz/tXM1OzjszFOK7ywqS+bAm8K9jJq0MIlAG8HKE7gBFQwCJGkzIyuUDipA==", "license": "MIT", "engines": { "node": "^12.20 || >=14.13" From 34e303bb6e014935139f60b16509141fb5bdd297 Mon Sep 17 00:00:00 2001 From: Marc Vilanova <39573146+mvilanova@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:00:26 -0700 Subject: [PATCH 105/226] fix(slack): ensures we don't exceed 3000 limit (#6049) * fix(slack): ensures we don't exceed 3000 limit * pre commit --- .pre-commit-config.yaml | 2 +- src/dispatch/plugins/dispatch_slack/case/messages.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 37d7474cb362..a2352621f2ac 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,4 +41,4 @@ repos: entry: pytest -v tests/ language: system types: [python] - stages: [push] + stages: [pre-push] diff --git a/src/dispatch/plugins/dispatch_slack/case/messages.py b/src/dispatch/plugins/dispatch_slack/case/messages.py index 12d5cbdb0f93..c31f3c3ad16c 100644 --- a/src/dispatch/plugins/dispatch_slack/case/messages.py +++ b/src/dispatch/plugins/dispatch_slack/case/messages.py @@ -1,7 +1,6 @@ import logging from typing import NamedTuple - from blockkit import ( Actions, Button, @@ -358,10 +357,11 @@ def create_genai_signal_message_metadata_blocks( if isinstance(message, dict): message = json_to_slack_format(message) - # Truncate the message if it exceeds Block Kit's maximum length - message = message[:2997] + "..." if len(message) > 3000 else message + # Truncate the text if it exceeds Block Kit's maximum length of 3000 characters + text = f":magic_wand: *GenAI Alert Analysis*\n\n{message}" + text = f"{text[:2997]}..." if len(text) > 3000 else text signal_metadata_blocks.append( - Section(text=f":magic_wand: *GenAI Alert Analysis*\n\n{message}"), + Section(text=text), ) signal_metadata_blocks.append(Divider()) return Message(blocks=signal_metadata_blocks).build()["blocks"] From 99f08fd06f9230ff338dec65e723156bb03c0190 Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:10:09 -0700 Subject: [PATCH 106/226] fix(slack): log warning instead of throwing exception when user posts to main triage channel thread (#6050) --- src/dispatch/conversation/service.py | 16 +- .../conversation/test_conversation_service.py | 158 ++++++++++++++++++ 2 files changed, 173 insertions(+), 1 deletion(-) diff --git a/src/dispatch/conversation/service.py b/src/dispatch/conversation/service.py index 02dfbfd0ab4d..f0e1bae7e249 100644 --- a/src/dispatch/conversation/service.py +++ b/src/dispatch/conversation/service.py @@ -1,5 +1,8 @@ +import logging from .models import Conversation, ConversationCreate, ConversationUpdate +log = logging.getLogger(__name__) + def get(*, db_session, conversation_id: int) -> Conversation | None: """Gets a conversation by its id.""" @@ -26,7 +29,18 @@ def get_by_channel_id_ignoring_channel_type( conversation = conversations.filter(Conversation.thread_id == thread_id).one_or_none() if not conversation: - conversation = conversations.one_or_none() + # No conversations with that thread_id, check all conversations without thread filter + conversation_count = conversations.count() + if conversation_count > 1: + # this happens when a user posts in the main thread of a triage channel since + # there are multiple cases in the channel with that channel_id + # so we log a warning and return None + log.warning( + f"Multiple conversations found for channel_id: {channel_id}, thread_id: {thread_id}" + ) + conversation = None + else: + conversation = conversations.one_or_none() if conversation: if channel_id[0] != conversation.channel_id[0]: diff --git a/tests/conversation/test_conversation_service.py b/tests/conversation/test_conversation_service.py index abe5b2cb4d74..6bf950e6f087 100644 --- a/tests/conversation/test_conversation_service.py +++ b/tests/conversation/test_conversation_service.py @@ -50,3 +50,161 @@ def test_delete(session, conversation): delete(db_session=session, conversation_id=conversation.id) assert not get(db_session=session, conversation_id=conversation.id) + + +def test_get_by_channel_id_ignoring_channel_type_no_conversations(session): + """Test when no conversations match the channel_id.""" + from dispatch.conversation.service import get_by_channel_id_ignoring_channel_type + + result = get_by_channel_id_ignoring_channel_type( + db_session=session, channel_id="nonexistent_channel" + ) + assert result is None + + +def test_get_by_channel_id_ignoring_channel_type_single_conversation(session): + """Test when exactly one conversation matches the channel_id.""" + from dispatch.conversation.service import create, get_by_channel_id_ignoring_channel_type + from dispatch.conversation.models import ConversationCreate + + # Create a single conversation + conversation_in = ConversationCreate( + channel_id="test_channel", + resource_id="test_resource", + resource_type="test_type", + weblink="https://example.com/", + ) + created_conversation = create(db_session=session, conversation_in=conversation_in) + + # Test retrieval + result = get_by_channel_id_ignoring_channel_type(db_session=session, channel_id="test_channel") + + assert result is not None + assert result.id == created_conversation.id + assert result.channel_id == "test_channel" + + +def test_get_by_channel_id_ignoring_channel_type_multiple_conversations_warning(session, caplog): + """Test when multiple conversations match the channel_id with thread_id=None - should return first conversation.""" + from dispatch.conversation.service import create, get_by_channel_id_ignoring_channel_type + from dispatch.conversation.models import ConversationCreate + + # Create multiple conversations with the same channel_id + conversation_in_1 = ConversationCreate( + channel_id="duplicate_channel", + resource_id="resource_1", + resource_type="test_type", + weblink="https://example1.com/", + ) + conversation_in_2 = ConversationCreate( + channel_id="duplicate_channel", + resource_id="resource_2", + resource_type="test_type", + weblink="https://example2.com/", + ) + + created_1 = create(db_session=session, conversation_in=conversation_in_1) + create(db_session=session, conversation_in=conversation_in_2) + + # Test retrieval - should return first conversation when thread_id is None + result = get_by_channel_id_ignoring_channel_type( + db_session=session, channel_id="duplicate_channel" + ) + + # When thread_id is None, it uses .first() so should return the first conversation + assert result is not None + assert result.id == created_1.id + + +def test_get_by_channel_id_ignoring_channel_type_multiple_conversations_fallback_warning( + session, caplog +): + """Test when multiple conversations match in fallback logic - should log warning and return None.""" + from dispatch.conversation.service import create, get_by_channel_id_ignoring_channel_type + from dispatch.conversation.models import ConversationCreate + + # Create multiple conversations with the same channel_id but no thread_id + conversation_in_1 = ConversationCreate( + channel_id="fallback_channel", + resource_id="resource_1", + resource_type="test_type", + weblink="https://example1.com/", + ) + conversation_in_2 = ConversationCreate( + channel_id="fallback_channel", + resource_id="resource_2", + resource_type="test_type", + weblink="https://example2.com/", + ) + + create(db_session=session, conversation_in=conversation_in_1) + create(db_session=session, conversation_in=conversation_in_2) + + # Test retrieval with a thread_id that doesn't exist - should trigger fallback logic + result = get_by_channel_id_ignoring_channel_type( + db_session=session, channel_id="fallback_channel", thread_id="nonexistent_thread" + ) + + # Should return None and log warning in fallback logic + assert result is None + assert ( + "Multiple conversations found for channel_id: fallback_channel, thread_id: nonexistent_thread" + in caplog.text + ) + + +def test_get_by_channel_id_ignoring_channel_type_with_thread_id(session): + """Test the thread_id matching logic.""" + from dispatch.conversation.service import create, get_by_channel_id_ignoring_channel_type + from dispatch.conversation.models import ConversationCreate + + # Create conversations with different thread_ids + conversation_in_1 = ConversationCreate( + channel_id="thread_channel", + thread_id="thread_123", + resource_id="resource_1", + resource_type="test_type", + weblink="https://example1.com/", + ) + conversation_in_2 = ConversationCreate( + channel_id="thread_channel", + thread_id="thread_456", + resource_id="resource_2", + resource_type="test_type", + weblink="https://example2.com/", + ) + + created_1 = create(db_session=session, conversation_in=conversation_in_1) + create(db_session=session, conversation_in=conversation_in_2) + + # Test retrieval with specific thread_id + result = get_by_channel_id_ignoring_channel_type( + db_session=session, channel_id="thread_channel", thread_id="thread_123" + ) + + assert result is not None + assert result.id == created_1.id + assert result.thread_id == "thread_123" + + +def test_get_by_channel_id_ignoring_channel_type_incident_message_fallback(session): + """Test the incident message fallback logic (no thread_id provided).""" + from dispatch.conversation.service import create, get_by_channel_id_ignoring_channel_type + from dispatch.conversation.models import ConversationCreate + + # Create a conversation without thread_id (incident message) + conversation_in = ConversationCreate( + channel_id="incident_channel", + resource_id="incident_resource", + resource_type="test_type", + weblink="https://example.com/", + ) + created_conversation = create(db_session=session, conversation_in=conversation_in) + + # Test retrieval without thread_id - should use .first() + result = get_by_channel_id_ignoring_channel_type( + db_session=session, channel_id="incident_channel" + ) + + assert result is not None + assert result.id == created_conversation.id From aa755cfb7be7f0db968e15b912625a80df23d824 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:11:48 -0700 Subject: [PATCH 107/226] chore(deps): bump brace-expansion in /src/dispatch/static/dispatch (#6056) Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.12 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index f68e1760814b..e5f4a288732f 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -606,9 +606,10 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -776,9 +777,10 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3080,9 +3082,10 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4117,9 +4120,10 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6345,9 +6349,10 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" From 5dacde3eaf68a2bf77a5af6a8ff963f17573f2a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:11:55 -0700 Subject: [PATCH 108/226] chore(deps): bump sass-embedded in /src/dispatch/static/dispatch (#6055) Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.89.0 to 1.89.2. - [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/embedded-host-node/compare/1.89.0...1.89.2) --- updated-dependencies: - dependency-name: sass-embedded dependency-version: 1.89.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 211 ++++++------------ 1 file changed, 72 insertions(+), 139 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index e5f4a288732f..9032e02ec1dc 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -168,9 +168,10 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.2.tgz", - "integrity": "sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", + "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@date-io/core": { "version": "2.17.0", @@ -6495,12 +6496,12 @@ } }, "node_modules/sass-embedded": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.0.tgz", - "integrity": "sha512-EDrK1el9zdgJFpocCGlxatDWaP18tJBWoM1hxzo2KJBvjdmBichXI6O6KlQrigvQPO3uJ8DfmFmAAx7s7CG6uw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.2.tgz", + "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", "license": "MIT", "dependencies": { - "@bufbuild/protobuf": "^2.0.0", + "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", @@ -6516,32 +6517,28 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.89.0", - "sass-embedded-android-arm64": "1.89.0", - "sass-embedded-android-ia32": "1.89.0", - "sass-embedded-android-riscv64": "1.89.0", - "sass-embedded-android-x64": "1.89.0", - "sass-embedded-darwin-arm64": "1.89.0", - "sass-embedded-darwin-x64": "1.89.0", - "sass-embedded-linux-arm": "1.89.0", - "sass-embedded-linux-arm64": "1.89.0", - "sass-embedded-linux-ia32": "1.89.0", - "sass-embedded-linux-musl-arm": "1.89.0", - "sass-embedded-linux-musl-arm64": "1.89.0", - "sass-embedded-linux-musl-ia32": "1.89.0", - "sass-embedded-linux-musl-riscv64": "1.89.0", - "sass-embedded-linux-musl-x64": "1.89.0", - "sass-embedded-linux-riscv64": "1.89.0", - "sass-embedded-linux-x64": "1.89.0", - "sass-embedded-win32-arm64": "1.89.0", - "sass-embedded-win32-ia32": "1.89.0", - "sass-embedded-win32-x64": "1.89.0" + "sass-embedded-android-arm": "1.89.2", + "sass-embedded-android-arm64": "1.89.2", + "sass-embedded-android-riscv64": "1.89.2", + "sass-embedded-android-x64": "1.89.2", + "sass-embedded-darwin-arm64": "1.89.2", + "sass-embedded-darwin-x64": "1.89.2", + "sass-embedded-linux-arm": "1.89.2", + "sass-embedded-linux-arm64": "1.89.2", + "sass-embedded-linux-musl-arm": "1.89.2", + "sass-embedded-linux-musl-arm64": "1.89.2", + "sass-embedded-linux-musl-riscv64": "1.89.2", + "sass-embedded-linux-musl-x64": "1.89.2", + "sass-embedded-linux-riscv64": "1.89.2", + "sass-embedded-linux-x64": "1.89.2", + "sass-embedded-win32-arm64": "1.89.2", + "sass-embedded-win32-x64": "1.89.2" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.0.tgz", - "integrity": "sha512-s6jxkEZQQrtyIGZX6Sbcu7tEixFG2VkqFgrX11flm/jZex7KaxnZtFace+wnYAgHqzzYpx0kNzJUpT+GXxm8CA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", + "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", "cpu": [ "arm" ], @@ -6555,9 +6552,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.0.tgz", - "integrity": "sha512-pr4R3p5R+Ul9ZA5nzYbBJQFJXW6dMGzgpNBhmaToYDgDhmNX5kg0mZAUlGLHvisLdTiR6oEfDDr9QI6tnD2nqA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", + "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", "cpu": [ "arm64" ], @@ -6570,26 +6567,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-android-ia32": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.89.0.tgz", - "integrity": "sha512-GoNnNGYmp1F0ZMHqQbAurlQsjBMZKtDd5H60Ruq86uQFdnuNqQ9wHKJsJABxMnjfAn60IjefytM5PYTMcAmbfA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.0.tgz", - "integrity": "sha512-di+i4KkKAWTNksaQYTqBEERv46qV/tvv14TPswEfak7vcTQ2pj2mvV4KGjLYfU2LqRkX/NTXix9KFthrzFN51Q==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", + "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", "cpu": [ "riscv64" ], @@ -6603,9 +6584,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.0.tgz", - "integrity": "sha512-1cRRDAnmAS1wLaxfFf6PCHu9sKW8FNxdM7ZkanwxO9mztrCu/uvfqTmaurY9+RaKvPus7sGYFp46/TNtl/wRjg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", + "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", "cpu": [ "x64" ], @@ -6619,9 +6600,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.0.tgz", - "integrity": "sha512-EUNUzI0UkbQ6dASPyf09S3x7fNT54PjyD594ZGTY14Yh4qTuacIj27ckLmreAJNNu5QxlbhyYuOtz+XN5bMMxA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", + "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", "cpu": [ "arm64" ], @@ -6635,9 +6616,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.0.tgz", - "integrity": "sha512-23R8zSuB31Fq/MYpmQ38UR2C26BsYb66VVpJgWmWl/N+sgv/+l9ECuSPMbYNgM3vb9TP9wk9dgL6KkiCS5tAyg==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", + "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", "cpu": [ "x64" ], @@ -6651,9 +6632,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.0.tgz", - "integrity": "sha512-KAzA1XD74d8/fiJXxVnLfFwfpmD2XqUJZz+DL6ZAPNLH1sb+yCP7brktaOyClDc/MBu61JERdHaJjIZhfX0Yqw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", + "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", "cpu": [ "arm" ], @@ -6667,9 +6648,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.0.tgz", - "integrity": "sha512-g9Lp57qyx51ttKj0AN/edV43Hu1fBObvD7LpYwVfs6u3I95r0Adi90KujzNrUqXxJVmsfUwseY8kA8zvcRjhYA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", + "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", "cpu": [ "arm64" ], @@ -6682,26 +6663,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-linux-ia32": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.89.0.tgz", - "integrity": "sha512-5fxBeXyvBr3pb+vyrx9V6yd7QDRXkAPbwmFVVhjqshBABOXelLysEFea7xokh/tM8JAAQ4O8Ls3eW3Eojb477g==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.0.tgz", - "integrity": "sha512-0Q1JeEU4/tzH7fwAwarfIh+Swn3aXG/jPhVsZpbR1c1VzkeaPngmXdmLJcVXsdb35tjk84DuYcFtJlE1HYGw4Q==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", + "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", "cpu": [ "arm" ], @@ -6715,9 +6680,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.0.tgz", - "integrity": "sha512-50oelrOtN64u15vJN9uJryIuT0+UPjyeoq0zdWbY8F7LM9294Wf+Idea+nqDUWDCj1MHndyPFmR1mjeuRouJhw==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", + "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", "cpu": [ "arm64" ], @@ -6730,26 +6695,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.89.0.tgz", - "integrity": "sha512-ILWqpTd+0RdsSw977iVAJf4CLetIbcQgLQf17ycS1N4StZKVRZs1bBfZhg/f/HU/4p5HondPAwepgJepZZdnFA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.0.tgz", - "integrity": "sha512-n2V+Tdjj7SAuiuElJYhWiHjjB1YU0cuFvL1/m5K+ecdNStfHFWIzvBT6/vzQnBOWjI4eZECNVuQ8GwGWCufZew==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", + "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", "cpu": [ "riscv64" ], @@ -6763,9 +6712,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.0.tgz", - "integrity": "sha512-KOHJdouBK3SLJKZLnFYzuxs3dn+6jaeO3p4p1JUYAcVfndcvh13Sg2sLGfOfpg7Og6ws2Nnqnx0CyL26jPJ7ag==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", + "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", "cpu": [ "x64" ], @@ -6779,9 +6728,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.0.tgz", - "integrity": "sha512-0A/UWeKX6MYhVLWLkdX3NPKHO+mvIwzaf6TxGCy3vS3TODWaeDUeBhHShAr7YlOKv5xRGxf7Gx7FXCPV0mUyMA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", + "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", "cpu": [ "riscv64" ], @@ -6795,9 +6744,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.0.tgz", - "integrity": "sha512-dRBoOFPDWctHPYK3hTk3YzyX/icVrXiw7oOjbtpaDr6JooqIWBe16FslkWyvQzdmfOFy80raKVjgoqT7DsznkQ==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", + "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", "cpu": [ "x64" ], @@ -6811,9 +6760,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.0.tgz", - "integrity": "sha512-RnlVZ14hC/W7ubzvhqnbGfjU5PFNoFP/y5qycgCy+Mezb0IKbWvZ2Lyzux8TbL3OIjOikkNpfXoNQrX706WLAA==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", + "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", "cpu": [ "arm64" ], @@ -6826,26 +6775,10 @@ "node": ">=14.0.0" } }, - "node_modules/sass-embedded-win32-ia32": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.89.0.tgz", - "integrity": "sha512-eFe9VMNG+90nuoE3eXDy+38+uEHGf7xcqalq5+0PVZfR+H9RlaEbvIUNflZV94+LOH8Jb4lrfuekhHgWDJLfSg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/sass-embedded-win32-x64": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.0.tgz", - "integrity": "sha512-AaGpr5R6MLCuSvkvDdRq49ebifwLcuGPk0/10hbYw9nh3jpy2/CylYubQpIpR4yPcuD1wFwFqufTXC3HJYGb0g==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", + "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", "cpu": [ "x64" ], From 176ef00f9ae4c6bfe2986f71631143fa2ed09581 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:12:03 -0700 Subject: [PATCH 109/226] chore(deps): bump @tiptap/extension-placeholder (#6054) Bumps [@tiptap/extension-placeholder](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/extension-placeholder) from 2.12.0 to 2.14.0. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/v2.14.0/packages/extension-placeholder/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/v2.14.0/packages/extension-placeholder) --- updated-dependencies: - dependency-name: "@tiptap/extension-placeholder" dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 9032e02ec1dc..292fcb330cf6 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1946,9 +1946,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.12.0.tgz", - "integrity": "sha512-K7irDox4P+NLAMjVrJeG72f0sulsCRYpx1Cy4gxKCdi1LTivj5VkXa6MXmi42KTCwBu3pWajBctYIOAES1FTAA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.14.0.tgz", + "integrity": "sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w==", "license": "MIT", "funding": { "type": "github", From e587fe4cdec057915f78475fcada7e275426e66e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:12:11 -0700 Subject: [PATCH 110/226] chore(deps): bump @vue-flow/core in /src/dispatch/static/dispatch (#6053) Bumps [@vue-flow/core](https://github.com/bcakmakoglu/vue-flow/tree/HEAD/packages/core) from 1.44.0 to 1.45.0. - [Release notes](https://github.com/bcakmakoglu/vue-flow/releases) - [Changelog](https://github.com/bcakmakoglu/vue-flow/blob/master/packages/core/CHANGELOG.md) - [Commits](https://github.com/bcakmakoglu/vue-flow/commits/v1.45.0/packages/core) --- updated-dependencies: - dependency-name: "@vue-flow/core" dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 292fcb330cf6..c5cf5f4ba55f 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -2495,9 +2495,9 @@ } }, "node_modules/@vue-flow/core": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.44.0.tgz", - "integrity": "sha512-3efgrj3KCTSSUpPRefL+muRuPv+7Oy8nPDPOhLuJACyiGrBHzAZDyCC9irqsWD1E9ko8g1XYgupReRT0q78fOA==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.45.0.tgz", + "integrity": "sha512-+Qd4fTnCfrhfYQzlHyf5Jt7rNE4PlDnEJEJZH9v6hDZoTOeOy1RhS85cSxKYxdsJ31Ttj2v3yabhoVfBf+bmJA==", "license": "MIT", "dependencies": { "@vueuse/core": "^10.5.0", From f317fff56902a75382f8d6ba86d30fb0a439b4f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:12:19 -0700 Subject: [PATCH 111/226] chore(deps-dev): bump @playwright/test in /src/dispatch/static/dispatch (#6052) Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.52.0 to 1.53.0. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.52.0...v1.53.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.53.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index c5cf5f4ba55f..885a8fabe875 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1245,13 +1245,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", - "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", + "integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.52.0" + "playwright": "1.53.0" }, "bin": { "playwright": "cli.js" @@ -5869,13 +5869,13 @@ } }, "node_modules/playwright": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", - "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", + "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.52.0" + "playwright-core": "1.53.0" }, "bin": { "playwright": "cli.js" @@ -5888,9 +5888,9 @@ } }, "node_modules/playwright-core": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", - "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", + "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", "dev": true, "license": "Apache-2.0", "bin": { From 0633c58e957a0c85da4c1347ce7f336dec48945d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:12:27 -0700 Subject: [PATCH 112/226] chore(deps): bump vuetify in /src/dispatch/static/dispatch (#6051) Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.8.8 to 3.8.9. - [Release notes](https://github.com/vuetifyjs/vuetify/releases) - [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.8.9/packages/vuetify) --- updated-dependencies: - dependency-name: vuetify dependency-version: 3.8.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 885a8fabe875..7818e30c6030 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -8172,9 +8172,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/vuetify": { - "version": "3.8.8", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.8.tgz", - "integrity": "sha512-EPFynvxh72PBgUVZnGpfYfGluz8dz/tXM1OzjszFOK7ywqS+bAm8K9jJq0MIlAG8HKE7gBFQwCJGkzIyuUDipA==", + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.9.tgz", + "integrity": "sha512-X9kCxeqf7w5sca2Mfn4NCVsDDimi81jxKyqsZHjW0XG/rTdtwRFKttxOcv0Mmi+67ulPjDZywA7pBFK0rxoafA==", "license": "MIT", "engines": { "node": "^12.20 || >=14.13" From 2c8ff94cbf79b7ef1bc295d639a5264ee7210ae3 Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:50:54 -0700 Subject: [PATCH 113/226] fix(case): fixing case filtering (#6059) * fix(case): fixing case filtering * removing unused imports --- src/dispatch/database/service.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/dispatch/database/service.py b/src/dispatch/database/service.py index 96de7519a00d..2226693e718e 100644 --- a/src/dispatch/database/service.py +++ b/src/dispatch/database/service.py @@ -22,9 +22,6 @@ from dispatch.auth.models import DispatchUser from dispatch.auth.service import CurrentUser, get_current_role from dispatch.case.models import Case -from dispatch.case.type.models import CaseType -from dispatch.case.severity.models import CaseSeverity -from dispatch.case.priority.models import CasePriority from dispatch.data.query.models import Query as QueryModel from dispatch.data.source.models import Source from dispatch.database.core import DbSession @@ -461,13 +458,7 @@ def apply_filter_specific_joins(model: Base, filter_spec: dict, query: orm.query (SignalInstance, "EntityType"): (SignalInstance.entities, True), (Tag, "TagType"): (TagType, False), (Tag, "Project"): (Project, False), - (CaseType, "Project"): (Project, False), - (CaseSeverity, "Project"): (Project, False), - (CasePriority, "Project"): (Project, False), (IndividualContact, "Project"): (Project, False), - (Case, "IndividualContact"): (Case.assignee, False), # noqa: F601 - (Case, "Assignee"): (Case.assignee, False), - (Case, "Project"): (Case.project, False), } filters = build_filters(filter_spec) From c0cfaae3f5bfbad7002695a77e406d1625c653b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:03:13 -0700 Subject: [PATCH 114/226] chore(deps): bump vue in /src/dispatch/static/dispatch (#6065) Bumps [vue](https://github.com/vuejs/core) from 3.5.16 to 3.5.17. - [Release notes](https://github.com/vuejs/core/releases) - [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md) - [Commits](https://github.com/vuejs/core/compare/v3.5.16...v3.5.17) --- updated-dependencies: - dependency-name: vue dependency-version: 3.5.17 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 7818e30c6030..d0399433ad09 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -123,12 +123,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -155,9 +155,9 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2525,42 +2525,42 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", - "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", - "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", - "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", - "postcss": "^8.5.3", + "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, @@ -2574,13 +2574,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", - "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/devtools-api": { @@ -2589,53 +2589,53 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "node_modules/@vue/reactivity": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", - "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", + "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.16" + "@vue/shared": "3.5.17" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", - "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", + "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/reactivity": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", - "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", + "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", + "@vue/reactivity": "3.5.17", + "@vue/runtime-core": "3.5.17", + "@vue/shared": "3.5.17", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", - "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", + "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17" }, "peerDependencies": { - "vue": "3.5.16" + "vue": "3.5.17" } }, "node_modules/@vue/shared": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", - "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -5577,9 +5577,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -5915,9 +5915,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -5934,7 +5934,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -8036,16 +8036,16 @@ } }, "node_modules/vue": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", - "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", + "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-sfc": "3.5.16", - "@vue/runtime-dom": "3.5.16", - "@vue/server-renderer": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-sfc": "3.5.17", + "@vue/runtime-dom": "3.5.17", + "@vue/server-renderer": "3.5.17", + "@vue/shared": "3.5.17" }, "peerDependencies": { "typescript": "*" From ee241342cf981b5124601f884b4b3a86dd9e2ee3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:03:21 -0700 Subject: [PATCH 115/226] chore(deps-dev): bump @playwright/test in /src/dispatch/static/dispatch (#6064) Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.53.0 to 1.53.1. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.53.0...v1.53.1) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.53.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index d0399433ad09..03249aa689a6 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1245,13 +1245,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", - "integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.1.tgz", + "integrity": "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.0" + "playwright": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -5869,13 +5869,13 @@ } }, "node_modules/playwright": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", - "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz", + "integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.0" + "playwright-core": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -5888,9 +5888,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", - "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz", + "integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==", "dev": true, "license": "Apache-2.0", "bin": { From 93deaec6a291a2ee3e555ced9ee8d12a85351ce8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:03:29 -0700 Subject: [PATCH 116/226] chore(deps): bump @tanstack/vue-query in /src/dispatch/static/dispatch (#6063) Bumps [@tanstack/vue-query](https://github.com/TanStack/query/tree/HEAD/packages/vue-query) from 5.80.6 to 5.80.10. - [Release notes](https://github.com/TanStack/query/releases) - [Commits](https://github.com/TanStack/query/commits/v5.80.10/packages/vue-query) --- updated-dependencies: - dependency-name: "@tanstack/vue-query" dependency-version: 5.80.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 03249aa689a6..f2cedae827d5 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1626,9 +1626,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.80.6", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.6.tgz", - "integrity": "sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.10.tgz", + "integrity": "sha512-mUNQOtzxkjL6jLbyChZoSBP6A5gQDVRUiPvW+/zw/9ftOAz+H754zCj3D8PwnzPKyHzGkQ9JbH48ukhym9LK1Q==", "license": "MIT", "funding": { "type": "github", @@ -1636,13 +1636,13 @@ } }, "node_modules/@tanstack/vue-query": { - "version": "5.80.6", - "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.80.6.tgz", - "integrity": "sha512-r6Yd01U6z1rPq++MFFEP9OtWNo4TQYMQQBNEgyNWn2vThv/BtYKhHnXgE7hQ1WZtDLQLYr23q8M68nGDxPwO/Q==", + "version": "5.80.10", + "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.80.10.tgz", + "integrity": "sha512-ZvQI1bfi6zDZIak5hjUMDi18jpOBafPjm/cN7GopXM3AywALBQhqgKj8sF8xagiUk3pVYgwdmchwvX6EHvZHGA==", "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "^8.19.4", - "@tanstack/query-core": "5.80.6", + "@tanstack/query-core": "5.80.10", "@vue/devtools-api": "^6.6.3", "vue-demi": "^0.14.10" }, From 8b620e4c467c614db5b61e02dc89376bd2818f92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:03:37 -0700 Subject: [PATCH 117/226] chore(deps): bump vuetify in /src/dispatch/static/dispatch (#6062) Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.8.9 to 3.8.10. - [Release notes](https://github.com/vuetifyjs/vuetify/releases) - [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.8.10/packages/vuetify) --- updated-dependencies: - dependency-name: vuetify dependency-version: 3.8.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index f2cedae827d5..65f557ff1e50 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -8172,9 +8172,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/vuetify": { - "version": "3.8.9", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.9.tgz", - "integrity": "sha512-X9kCxeqf7w5sca2Mfn4NCVsDDimi81jxKyqsZHjW0XG/rTdtwRFKttxOcv0Mmi+67ulPjDZywA7pBFK0rxoafA==", + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.8.10.tgz", + "integrity": "sha512-3BETdCGh3eB1cV5+dA+L5CYi62Q/Jb09H512GImeYzMHd2R+LntO0F5pNCqVB4KoxymQ4Jej3Q0J6AYmf0KD8w==", "license": "MIT", "engines": { "node": "^12.20 || >=14.13" From be1e6c94f9459bbb59d54d25e31c75ac7dcf66b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:35:52 -0500 Subject: [PATCH 118/226] chore(deps): bump @tiptap/starter-kit in /src/dispatch/static/dispatch (#6075) Bumps [@tiptap/starter-kit](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/starter-kit) from 2.14.0 to 2.22.3. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/next/packages/starter-kit/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/starter-kit) --- updated-dependencies: - dependency-name: "@tiptap/starter-kit" dependency-version: 2.22.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../static/dispatch/package-lock.json | 174 +++++++++--------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 65f557ff1e50..07ad1f84c1da 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1686,9 +1686,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.14.0.tgz", - "integrity": "sha512-MBSMzGYRFlwYCocvx3dU7zpCBSDQ0qWByNtStaEzuBUgzCJ6wn2DP/xG0cMcLmE3Ia0VLM4nwbLOAAvBXOtylA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.22.3.tgz", + "integrity": "sha512-czyBPXZG/ZFyObZEF1kyusGf58Ai3X8TnaxlUUn3gqLLWPy0idXZg85NETCidzi/gAxWxL9j6Pcy+zwS4pbZYQ==", "license": "MIT", "funding": { "type": "github", @@ -1699,9 +1699,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.14.0.tgz", - "integrity": "sha512-AwqPP0jLYNioKxakiVw0vlfH/ceGFbV+SGoqBbPSGFPRdSbHhxHDNBlTtiThmT3N2PiVwXAD9xislJV+WY4GUA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.22.3.tgz", + "integrity": "sha512-HvTXvqeGaANg0owk0Xxkgyc4lJMO5CZES2Lc3JJp8u5kV+HZIwd78eJ7fbKBMtkpKb4zOk4xQsHQ/TuhghJaeA==", "license": "MIT", "funding": { "type": "github", @@ -1712,9 +1712,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.14.0.tgz", - "integrity": "sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.22.3.tgz", + "integrity": "sha512-J3GxKwijD42eqCwU1SS7PK5aSgnp0wgQDetLz9izAD0RQBrKj5WZA13GnPoTTlzLU4qwjcPRV+6mvF+llH6b6A==", "license": "MIT", "funding": { "type": "github", @@ -1742,9 +1742,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.14.0.tgz", - "integrity": "sha512-SWnL4bP8Mm/mWN42AMQNoqYE0V6LgSBTVsHwwAki2wIUQdr9HyoAnohvHy3IME56NMwoyZyo+Mzl45wOqUxziA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.22.3.tgz", + "integrity": "sha512-SYvLIxqmuV0kTj4/3ZFlnZ1fr9Y233qX00BKuIpGnczeFsWQmzBJo8vGm3d1IlKPCQN+jTRtDdDE1aSum8Kv2w==", "license": "MIT", "funding": { "type": "github", @@ -1755,9 +1755,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.14.0.tgz", - "integrity": "sha512-kyo02mnzqgwXayMcyRA/fHQgb+nMmQQpIt1irZwjtEoFZshA7NnY/6b5SJmRcxQ4/X4r2Y2Ha2sWmOcEkLmt4A==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.22.3.tgz", + "integrity": "sha512-s+W6jHezq+n9cC40xZ3hZF6cGGSl+fBELik1b2x8+cb0WoIlqmcdWin1dgeMNrWlRZUw1aD2DNwy/PdXI5vn2g==", "license": "MIT", "funding": { "type": "github", @@ -1768,9 +1768,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.14.0.tgz", - "integrity": "sha512-LRYYZeh8U2XgfTsJ4houB9s9cVRt7PRfVa4MaCeOYKfowVOKQh67yV5oom8Azk9XrMPkPxDmMmdPAEPxeVYFvw==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.22.3.tgz", + "integrity": "sha512-twPCBpb/ygNixlSBAXgvfo+t56Ucpb8lvPDiZn+cH8OjmmO0ayBoSfSrjKWgaEWGPcXBrFAfsBRbYHyoHj7pXg==", "license": "MIT", "funding": { "type": "github", @@ -1782,9 +1782,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.14.0.tgz", - "integrity": "sha512-qwEgpPIJ3AgXdEtRTr88hODbXRdt14VAwLj27PTSqexB5V7Ra1Jy7iQDhqRwBCoUomVywBsWYxkSuDisSRG+9w==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.22.3.tgz", + "integrity": "sha512-7MnILbhRZRyROlMUgyntzRZ/EZlqNB8fO761RNjJxR2WMb49R4yc04fz7/+f/QH/hwxoS13bKfsNUDAsDxA5Aw==", "license": "MIT", "funding": { "type": "github", @@ -1795,9 +1795,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.14.0.tgz", - "integrity": "sha512-FIh5cdPuoPKvZ0GqSKhzMZGixm05ac3hSgqhMNCBZmXX459qBUI9CvDl/uzSnY9koBDeLVV3HYMthWQQLSXl9A==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.22.3.tgz", + "integrity": "sha512-yQxSfTWjdUQS+bh6KiNLR9KIMsn1SElzycQe4XE+0eoaetapGtKqxfwkTbbQdNgQOU5wQG1KOda221mnPvkpAA==", "license": "MIT", "funding": { "type": "github", @@ -1826,9 +1826,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.14.0.tgz", - "integrity": "sha512-as+SqC39FRshw4Fm1XVlrdSXveiusf5xiC4nuefLmXsUxO7Yx67x8jS0/VQbxWTLHZ6R1YEW8prLtnxGmVLCAQ==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.22.3.tgz", + "integrity": "sha512-6Q8TLL4PVGcZLn27eQazCC+be8LP8uzuz5Z5e4TpIeswPAju49cerQOdEGNFKkuYv/FelWIhXNtkWFMf4eSmyw==", "license": "MIT", "funding": { "type": "github", @@ -1840,9 +1840,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.14.0.tgz", - "integrity": "sha512-A8c8n8881iBq3AusNqibh6Hloybr+FgYdg4Lg4jNxbbEaL0WhyLFge1bWlGVpbHXFqdv5YldMUAu6Rop3FhNvw==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.22.3.tgz", + "integrity": "sha512-tbEji/V4Za3UhxYwB36amYhyonwe5j66iYTNRWzgjNixjrcGDbWk6cfaF9jMAgPgIDBmmtQLJY+moKskwgpnZg==", "license": "MIT", "funding": { "type": "github", @@ -1853,9 +1853,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.14.0.tgz", - "integrity": "sha512-vM//6G3Ox3mxPv9eilhrDqylELCc8kEP1aQ4xUuOw7vCidjNtGggOa1ERnnpV2dCa2A9E8y4FHtN4Xh29stXQg==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.22.3.tgz", + "integrity": "sha512-+MexJD+kXtNwMDbNTFa7jCFipx1DqAdT+n9GgInqebAN9bK+CWjC+SskzZNRqeMrQ0Er7QTsi6YC09M+74sevA==", "license": "MIT", "funding": { "type": "github", @@ -1866,9 +1866,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.14.0.tgz", - "integrity": "sha512-/qnOHQFCEPfkb3caykqd+sqzEC2gx30EQB/mM7+5kIG7CQy7XXaGjFAEaqzE1xJ783Q2E7GVk4JxWM+3NhYSLw==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.22.3.tgz", + "integrity": "sha512-F9sC45zPw7vbjKrwSKuSLZ0ODyc/X3bGPeCa6HYLEHKfgqsdt2v2fQLvxjpmlwO2ZMrnkBkg76KDxHfVyrZ2zQ==", "license": "MIT", "funding": { "type": "github", @@ -1880,9 +1880,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.14.0.tgz", - "integrity": "sha512-OrKWgHOhmJtVHjPYaEJetNLiNEvrI85lTrGxzeQa+a8ACb93h4svyHe9J+LHs5pKkXDQFcpYEXJntu0LVLLiDw==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.22.3.tgz", + "integrity": "sha512-3GvY798p9pCXUBbCebIdSmi1q80l7VZz/B6NN4uUMQ9iwxWopd8yaZ0O7xx2hM2UBzPEtY3M4FAhhpYUTXNFgQ==", "license": "MIT", "funding": { "type": "github", @@ -1894,9 +1894,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.14.0.tgz", - "integrity": "sha512-yEw2S+smoVR8DMYQMAWckVW2Sstf7z5+GBZ8zm8NMGhMKb1JFCPZUv5KTTIPnq7ZrKuuZHvjN9+Ef1dRYD8T2A==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.22.3.tgz", + "integrity": "sha512-W/rQDo7qFL7MfwfaYEcdtbk862fOmBv30qIEwVdqElBye7BFJYKtRuWBzNbG2BwKanjwMbVc/tBXF5W1sqfT7Q==", "license": "MIT", "funding": { "type": "github", @@ -1907,9 +1907,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.14.0.tgz", - "integrity": "sha512-t1jXDPEd82sC6vZVE/12/CB52uuiydCIcRfwdh21xNgBMckToKO9S0K6XEp4ROtrKQdlIH2JDVPfpUBvVrYN8Q==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.22.3.tgz", + "integrity": "sha512-B7Fze+eM1sYbGOZtDDAwAivnj1ow2wN5RqaQPC1la3wdTK4Wgp7bdzGjvUbrN6gp3zMFCEWlqP2toc/mRAHCtA==", "license": "MIT", "funding": { "type": "github", @@ -1920,9 +1920,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.14.0.tgz", - "integrity": "sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.22.3.tgz", + "integrity": "sha512-pHGkuZhV/uAAHI9vzk/lpAkbdpMT4wUR1FI17/GE3zNrogfzx0VopCQrXq4+sQVsLUW4I6Cj6VeBjm9wB6qlIw==", "license": "MIT", "funding": { "type": "github", @@ -1933,9 +1933,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.14.0.tgz", - "integrity": "sha512-bsQesVpgvDS2e+wr2fp59QO7rWRp2FqcJvBafwXS3Br9U5Mx3eFYryx4wC7cUnhlhUwX5pmaoA7zISgV9dZDgg==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.22.3.tgz", + "integrity": "sha512-TYvgS7CweNFo/xVxsKWSt0wnm46Y8OtsfDSjnLbSC4Pj4ZNa6PU3zpvDTW+UxYakr+8zIPvI2WgLBkyTHq6oQA==", "license": "MIT", "funding": { "type": "github", @@ -1960,9 +1960,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.14.0.tgz", - "integrity": "sha512-rD5d/IL3XPfBOrHRHxt+b+0X1jbIbWONGiad/3sX0ZYQD3PandtCWboH40r/J5tFksebuY12dVYyYQKgLpDBOQ==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.22.3.tgz", + "integrity": "sha512-I+s2Csw2cTHae2vFJiojnHK+NnQjDr6441mSlAd+e7kEly1kjZ4g7J+JMj02ajNQhr/ob8/hb5r6EdIyv2xtoA==", "license": "MIT", "funding": { "type": "github", @@ -1973,9 +1973,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.14.0.tgz", - "integrity": "sha512-rHny566nGZHq61zRLwQ9BPG55W/O+eDKwUJl+LhrLiVWwzpvAl9QQYixtoxJKOY48VK41PKwxe3bgDYgNs/Fhg==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.22.3.tgz", + "integrity": "sha512-07cymWkPTfq6nuum88Yf90YYArbowed8nNiu0Tw3jCvwpzf9J9TDaovT+LAKuSKtrOsnNpFB/9IqUwFxZepOGw==", "license": "MIT", "funding": { "type": "github", @@ -1986,9 +1986,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.14.0.tgz", - "integrity": "sha512-dl0oi2i0rjLpBqTf4wGy6SLidvPpjxLcmX727pwJlCklkFJVDf8wSFeD4ddxJXiD2Rwef0D/lkcwXSY73CoDcA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.22.3.tgz", + "integrity": "sha512-M3FLOUPcO8fR+rM97mR2gQ54KFkdlAUQtEPKQpO1f312gtcVdBNxgq0WgqTnBY7thWLyqQSKiAsL6y88+JddSA==", "license": "MIT", "funding": { "type": "github", @@ -1999,9 +1999,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.14.0.tgz", - "integrity": "sha512-cnsfaIlvTFCDtLP/A2Fd3LmpttgY0O/tuTM2fC71vetONz83wUTYT+aD9uvxdX0GkSocoh840b0TsEazbBxhpA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.22.3.tgz", + "integrity": "sha512-uWPeIScnpQVCYdTnL140XgcvbT1qH288CstMJ6S0Y11lC5PclPK9CxfAipsqgWWrIK7yatxKUVCg6TzfG9zpmA==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.3.0", @@ -2029,32 +2029,32 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.14.0.tgz", - "integrity": "sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.22.3.tgz", + "integrity": "sha512-GkvheaR2ORnHJ9g9R6xIT38w2uppGja/iAIrXLZ9vY1QuR+0cya/ZZ5vKU6r9C2PeyBs3aKYxRD1/j3HDhuGXw==", "license": "MIT", "dependencies": { - "@tiptap/core": "^2.14.0", - "@tiptap/extension-blockquote": "^2.14.0", - "@tiptap/extension-bold": "^2.14.0", - "@tiptap/extension-bullet-list": "^2.14.0", - "@tiptap/extension-code": "^2.14.0", - "@tiptap/extension-code-block": "^2.14.0", - "@tiptap/extension-document": "^2.14.0", - "@tiptap/extension-dropcursor": "^2.14.0", - "@tiptap/extension-gapcursor": "^2.14.0", - "@tiptap/extension-hard-break": "^2.14.0", - "@tiptap/extension-heading": "^2.14.0", - "@tiptap/extension-history": "^2.14.0", - "@tiptap/extension-horizontal-rule": "^2.14.0", - "@tiptap/extension-italic": "^2.14.0", - "@tiptap/extension-list-item": "^2.14.0", - "@tiptap/extension-ordered-list": "^2.14.0", - "@tiptap/extension-paragraph": "^2.14.0", - "@tiptap/extension-strike": "^2.14.0", - "@tiptap/extension-text": "^2.14.0", - "@tiptap/extension-text-style": "^2.14.0", - "@tiptap/pm": "^2.14.0" + "@tiptap/core": "^2.22.3", + "@tiptap/extension-blockquote": "^2.22.3", + "@tiptap/extension-bold": "^2.22.3", + "@tiptap/extension-bullet-list": "^2.22.3", + "@tiptap/extension-code": "^2.22.3", + "@tiptap/extension-code-block": "^2.22.3", + "@tiptap/extension-document": "^2.22.3", + "@tiptap/extension-dropcursor": "^2.22.3", + "@tiptap/extension-gapcursor": "^2.22.3", + "@tiptap/extension-hard-break": "^2.22.3", + "@tiptap/extension-heading": "^2.22.3", + "@tiptap/extension-history": "^2.22.3", + "@tiptap/extension-horizontal-rule": "^2.22.3", + "@tiptap/extension-italic": "^2.22.3", + "@tiptap/extension-list-item": "^2.22.3", + "@tiptap/extension-ordered-list": "^2.22.3", + "@tiptap/extension-paragraph": "^2.22.3", + "@tiptap/extension-strike": "^2.22.3", + "@tiptap/extension-text": "^2.22.3", + "@tiptap/extension-text-style": "^2.22.3", + "@tiptap/pm": "^2.22.3" }, "funding": { "type": "github", From d37a522bff667672774a3eae2a65932cafdbe1ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:37:29 -0500 Subject: [PATCH 119/226] chore(deps): bump @tiptap/vue-3 in /src/dispatch/static/dispatch (#6076) Bumps [@tiptap/vue-3](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/vue-3) from 2.14.0 to 2.22.3. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/next/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/vue-3) --- updated-dependencies: - dependency-name: "@tiptap/vue-3" dependency-version: 2.22.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Aaron Herman --- .../static/dispatch/package-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index 07ad1f84c1da..fc047cce9813 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1725,9 +1725,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.14.0.tgz", - "integrity": "sha512-sN15n0RjPh+2Asvxs7l47hVEvX6c0aPempU8QQWcPUlHoGf1D/XkyHXy6GWVPSxZ5Rj5uAwgKvhHsG/FJ/YGKQ==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.22.3.tgz", + "integrity": "sha512-8iQLNrRf3iBPKqI3dQnfvMxMfgp6y9TAbO803LihvzbIGqBaX264ES7fHtoyFIIeVjy2xFruVsTZCZofWTupGg==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -1809,9 +1809,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.14.0.tgz", - "integrity": "sha512-Khx7M7RfZlD1/T/PUlpJmao6FtEBa2L6td2hhaW1USflwGJGk0U/ud4UEqh+aZoJZrkot/EMhEvzmORF3nq+xw==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.22.3.tgz", + "integrity": "sha512-GeJRRdulxpwsshxzBkpOf/xJkLD2fa+49o+3FqRCmrm7AioC8oUcZZmzuzjLj5a3ZNGKPuJ9xxDkYWUjH4tE1g==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2062,13 +2062,13 @@ } }, "node_modules/@tiptap/vue-3": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.14.0.tgz", - "integrity": "sha512-w7jzOYmaNgL/1p4q3wRJf4NdvO23IvOgGR6sUM/3ULtjG0dchn9JMpD3Vm7Y9FLSKBcwAWZim4gR6PFIvIsETA==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.22.3.tgz", + "integrity": "sha512-bndOqQJzFy/vTFib8jTG47CE86KJsgl+9+3Wp1qJNQMDKNoNvV2NQq46fb1eLGw2ZOaMH8+AGkOaUCiWxmreLg==", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.14.0", - "@tiptap/extension-floating-menu": "^2.14.0" + "@tiptap/extension-bubble-menu": "^2.22.3", + "@tiptap/extension-floating-menu": "^2.22.3" }, "funding": { "type": "github", From 7d454629876ca1697030fcf3e297a0f7e1a40e2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:39:00 -0500 Subject: [PATCH 120/226] chore(deps): bump @tiptap/extension-placeholder (#6078) Bumps [@tiptap/extension-placeholder](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/extension-placeholder) from 2.14.0 to 2.22.3. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Commits](https://github.com/ueberdosis/tiptap/commits/HEAD/packages/extension-placeholder) --- updated-dependencies: - dependency-name: "@tiptap/extension-placeholder" dependency-version: 2.22.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Aaron Herman --- src/dispatch/static/dispatch/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dispatch/static/dispatch/package-lock.json b/src/dispatch/static/dispatch/package-lock.json index fc047cce9813..46105fc08bd9 100644 --- a/src/dispatch/static/dispatch/package-lock.json +++ b/src/dispatch/static/dispatch/package-lock.json @@ -1946,9 +1946,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.14.0.tgz", - "integrity": "sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w==", + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.22.3.tgz", + "integrity": "sha512-kYrO2iTOtGRr6IaVsaWSWCJmQZL7wuPOl19AmTxIJaxsiOgViocuoU5k14Fd6pU06yn8jmglD+Rirrn6eW5+5g==", "license": "MIT", "funding": { "type": "github", From 3ff1002e935d112d2922587404e0f6ec4ac7b1d9 Mon Sep 17 00:00:00 2001 From: David Whittaker <84562015+whitdog47@users.noreply.github.com> Date: Mon, 23 Jun 2025 09:22:03 -0700 Subject: [PATCH 121/226] feat(case): adds ability to create and edit custom timeline events for cases (#6067) --- src/dispatch/auth/permissions.py | 14 + src/dispatch/case/service.py | 1 + src/dispatch/case/views.py | 125 +++++++- src/dispatch/document/service.py | 41 ++- src/dispatch/event/flows.py | 70 +++++ src/dispatch/event/models.py | 2 +- src/dispatch/event/service.py | 297 +++++++++++++++++- .../dispatch_slack/incident/interactive.py | 80 +++-- .../dispatch/src/case/CaseTimelineTabV1.vue | 215 +++++++++++-- .../dispatch/src/case/DeleteEventDialog.vue | 35 +++ .../dispatch/src/case/EditEventDialog.vue | 152 +++++++++ .../src/case/TimelineExportDialog.vue | 162 ++++++++++ .../src/case/TimelineFilterDialog.vue | 153 +++++++++ src/dispatch/static/dispatch/src/case/api.js | 16 + .../static/dispatch/src/case/store.js | 192 +++++++++++ tests/case/test_case_event_views.py | 246 +++++++++++++++ tests/case/test_case_service.py | 30 +- 17 files changed, 1747 insertions(+), 84 deletions(-) create mode 100644 src/dispatch/static/dispatch/src/case/DeleteEventDialog.vue create mode 100644 src/dispatch/static/dispatch/src/case/EditEventDialog.vue create mode 100644 src/dispatch/static/dispatch/src/case/TimelineExportDialog.vue create mode 100644 src/dispatch/static/dispatch/src/case/TimelineFilterDialog.vue create mode 100644 tests/case/test_case_event_views.py diff --git a/src/dispatch/auth/permissions.py b/src/dispatch/auth/permissions.py index 51342ef91ab3..b10642f0ce50 100644 --- a/src/dispatch/auth/permissions.py +++ b/src/dispatch/auth/permissions.py @@ -473,6 +473,20 @@ def has_required_permissions( return True +class CaseEventPermission(BasePermission): + def has_required_permissions( + self, + request: Request, + ) -> bool: + return any_permission( + permissions=[ + OrganizationAdminPermission, + CaseParticipantPermission, + ], + request=request, + ) + + class FeedbackDeletePermission(BasePermission): def has_required_permissions( self, diff --git a/src/dispatch/case/service.py b/src/dispatch/case/service.py index e2ce5ca40ed9..4e5742bb335a 100644 --- a/src/dispatch/case/service.py +++ b/src/dispatch/case/service.py @@ -222,6 +222,7 @@ def create(*, db_session, case_in: CaseCreate, current_user: DispatchUser = None "visibility": case.visibility, }, case_id=case.id, + pinned=True, ) assignee_email = None diff --git a/src/dispatch/case/views.py b/src/dispatch/case/views.py index 7b57456de8cb..8ac2205a7273 100644 --- a/src/dispatch/case/views.py +++ b/src/dispatch/case/views.py @@ -1,5 +1,6 @@ import json import logging +from datetime import datetime from typing import Annotated from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, status @@ -11,6 +12,7 @@ CaseEditPermission, CaseJoinPermission, CaseViewPermission, + CaseEventPermission, PermissionsDependency, ) from dispatch.auth.service import CurrentUser @@ -18,6 +20,8 @@ from dispatch.common.utils.views import create_pydantic_include from dispatch.database.core import DbSession from dispatch.database.service import CommonParameters, search_filter_sort_paginate +from dispatch.event import flows as event_flows +from dispatch.event.models import EventCreateMinimal, EventUpdate from dispatch.incident import service as incident_service from dispatch.incident.models import IncidentCreate, IncidentRead from dispatch.individual.models import IndividualContactRead @@ -39,7 +43,15 @@ case_update_flow, get_case_participants_flow, ) -from .models import Case, CaseCreate, CaseExpandedPagination, CasePagination, CasePaginationMinimalWithExtras, CaseRead, CaseUpdate +from .models import ( + Case, + CaseCreate, + CaseExpandedPagination, + CasePagination, + CasePaginationMinimalWithExtras, + CaseRead, + CaseUpdate, +) from .service import create, delete, get, get_participants, update log = logging.getLogger(__name__) @@ -144,6 +156,7 @@ def get_cases_minimal( return json.loads(CasePaginationMinimalWithExtras(**pagination).json()) + @router.post("", response_model=CaseRead, summary="Creates a new case.") def create_case( db_session: DbSession, @@ -413,3 +426,113 @@ def join_case( case_id=current_case.id, organization_slug=organization, ) + + +@router.post( + "/{case_id}/event", + summary="Creates a custom event.", + dependencies=[Depends(PermissionsDependency([CaseEventPermission]))], +) +def create_custom_event( + db_session: DbSession, + organization: OrganizationSlug, + case_id: PrimaryKey, + current_case: CurrentCase, + event_in: EventCreateMinimal, + current_user: CurrentUser, + background_tasks: BackgroundTasks, +): + if event_in.details is None: + event_in.details = {} + event_in.details.update({"created_by": current_user.email, "added_on": str(datetime.utcnow())}) + """Creates a custom event.""" + background_tasks.add_task( + event_flows.log_case_event, + user_email=current_user.email, + case_id=current_case.id, + event_in=event_in, + organization_slug=organization, + ) + + +@router.patch( + "/{case_id}/event", + summary="Updates a custom event.", + dependencies=[Depends(PermissionsDependency([CaseEventPermission]))], +) +def update_custom_event( + db_session: DbSession, + organization: OrganizationSlug, + case_id: PrimaryKey, + current_case: CurrentCase, + event_in: EventUpdate, + current_user: CurrentUser, + background_tasks: BackgroundTasks, +): + if event_in.details: + event_in.details.update( + { + **event_in.details, + "updated_by": current_user.email, + "updated_on": str(datetime.utcnow()), + } + ) + else: + event_in.details = {"updated_by": current_user.email, "updated_on": str(datetime.utcnow())} + """Updates a custom event.""" + background_tasks.add_task( + event_flows.update_case_event, + event_in=event_in, + organization_slug=organization, + ) + + +@router.post( + "/{case_id}/exportTimeline", + summary="Exports timeline events.", + dependencies=[Depends(PermissionsDependency([CaseEventPermission]))], +) +def export_timeline_event( + db_session: DbSession, + organization: OrganizationSlug, + case_id: PrimaryKey, + current_case: CurrentCase, + timeline_filters: dict, + current_user: CurrentUser, + background_tasks: BackgroundTasks, +): + try: + event_flows.export_case_timeline( + timeline_filters=timeline_filters, + case_id=case_id, + organization_slug=organization, + db_session=db_session, + ) + except Exception as e: + log.exception(e) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=[{"msg": (f"{str(e)}.",)}], + ) from e + + +@router.delete( + "/{case_id}/event/{event_uuid}", + summary="Deletes a custom event.", + dependencies=[Depends(PermissionsDependency([CaseEventPermission]))], +) +def delete_custom_event( + db_session: DbSession, + organization: OrganizationSlug, + case_id: PrimaryKey, + current_case: CurrentCase, + event_uuid: str, + current_user: CurrentUser, + background_tasks: BackgroundTasks, +): + """Deletes a custom event.""" + background_tasks.add_task( + event_flows.delete_case_event, + event_uuid=event_uuid, + organization_slug=organization, + ) diff --git a/src/dispatch/document/service.py b/src/dispatch/document/service.py index 21deb5866fe5..df95137d65d0 100644 --- a/src/dispatch/document/service.py +++ b/src/dispatch/document/service.py @@ -27,6 +27,19 @@ def get_by_incident_id_and_resource_type( ) +def get_by_case_id_and_resource_type( + *, db_session, case_id: int, project_id: int, resource_type: str +) -> Document | None: + """Returns a document based on the given case and id and document resource type.""" + return ( + db_session.query(Document) + .filter(Document.case_id == case_id) + .filter(Document.project_id == project_id) + .filter(Document.resource_type == resource_type) + .one_or_none() + ) + + def get_project_forms_export_template(*, db_session, project_id: int) -> Document | None: """Fetches the project forms export template.""" resource_type = DocumentResourceTemplateTypes.forms @@ -89,12 +102,14 @@ def create(*, db_session, document_in: DocumentCreate) -> Document: .one_or_none() ) if faq_doc: - raise ValidationError([ - { - "msg": "FAQ document already defined for this project.", - "loc": "document", - } - ]) + raise ValidationError( + [ + { + "msg": "FAQ document already defined for this project.", + "loc": "document", + } + ] + ) if document_in.resource_type == DocumentResourceTemplateTypes.forms: forms_doc = ( @@ -104,12 +119,14 @@ def create(*, db_session, document_in: DocumentCreate) -> Document: .one_or_none() ) if forms_doc: - raise ValidationError([ - { - "msg": "Forms export template document already defined for this project.", - "loc": "document", - } - ]) + raise ValidationError( + [ + { + "msg": "Forms export template document already defined for this project.", + "loc": "document", + } + ] + ) filters = [ search_filter_service.get(db_session=db_session, search_filter_id=f.id) diff --git a/src/dispatch/event/flows.py b/src/dispatch/event/flows.py index 83caf1b94fd8..2dd167949d47 100644 --- a/src/dispatch/event/flows.py +++ b/src/dispatch/event/flows.py @@ -3,8 +3,10 @@ from dispatch.decorators import background_task from dispatch.event import service as event_service from dispatch.incident import service as incident_service +from dispatch.case import service as case_service from dispatch.individual import service as individual_service from dispatch.event.models import EventUpdate, EventCreateMinimal +from dispatch.auth import service as auth_service log = logging.getLogger(__name__) @@ -71,3 +73,71 @@ def export_timeline( except Exception: raise + + +@background_task +def log_case_event( + user_email: str, + case_id: int, + event_in: EventCreateMinimal, + db_session=None, + organization_slug: str = None, +): + case = case_service.get(db_session=db_session, case_id=case_id) + individual = individual_service.get_by_email_and_project( + db_session=db_session, email=user_email, project_id=case.project.id + ) + event_in.source = f"Custom event created by {individual.name}" + event_in.owner = individual.name + + # Get dispatch user by email + dispatch_user = auth_service.get_by_email(db_session=db_session, email=user_email) + dispatch_user_id = dispatch_user.id if dispatch_user else None + + event_service.log_case_event( + db_session=db_session, + case_id=case_id, + dispatch_user_id=dispatch_user_id, + **event_in.__dict__, + ) + + +@background_task +def update_case_event( + event_in: EventUpdate, + db_session=None, + organization_slug: str = None, +): + event_service.update_case_event( + db_session=db_session, + event_in=event_in, + ) + + +@background_task +def delete_case_event( + event_uuid: str, + db_session=None, + organization_slug: str = None, +): + event_service.delete_case_event( + db_session=db_session, + uuid=event_uuid, + ) + + +def export_case_timeline( + timeline_filters: dict, + case_id: int, + db_session=None, + organization_slug: str = None, +): + try: + event_service.export_case_timeline( + db_session=db_session, + timeline_filters=timeline_filters, + case_id=case_id, + ) + + except Exception: + raise diff --git a/src/dispatch/event/models.py b/src/dispatch/event/models.py index 33c5bf6f44fa..5f7293435197 100644 --- a/src/dispatch/event/models.py +++ b/src/dispatch/event/models.py @@ -70,7 +70,7 @@ class EventCreateMinimal(DispatchBase): started_at: datetime source: str description: str - details: dict + details: dict | None = None type: str | None = None owner: str | None = None pinned: bool | None = False diff --git a/src/dispatch/event/service.py b/src/dispatch/event/service.py index aa1d7852843a..88dd5125d610 100644 --- a/src/dispatch/event/service.py +++ b/src/dispatch/event/service.py @@ -262,6 +262,27 @@ def delete_incident_event( delete(db_session=db_session, event_id=event.id) +def update_case_event( + db_session, + event_in: EventUpdate, +) -> Event: + """Updates an event in the case timeline.""" + event = get_by_uuid(db_session=db_session, uuid=event_in.uuid) + event = update(db_session=db_session, event=event, event_in=event_in) + + return event + + +def delete_case_event( + db_session, + uuid: str, +): + """Deletes a case event.""" + event = get_by_uuid(db_session=db_session, uuid=uuid) + + delete(db_session=db_session, event_id=event.id) + + def export_timeline( db_session, timeline_filters: str, @@ -463,9 +484,7 @@ def export_timeline( str_len = 0 row_idx = 0 insert_data_request = [] - print("cell indices") - print(len(cell_indices)) - print(len(data_to_insert)) + for index, text in zip(cell_indices, data_to_insert, strict=True): # Adjusting index based on string length new_idx = index + str_len @@ -545,3 +564,275 @@ def export_timeline( # raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=[{"msg": "No timeline data to export"}]) from None return True + + +def export_case_timeline( + db_session, + timeline_filters: str, + case_id: int, +): + case = case_service.get(db_session=db_session, case_id=case_id) + plugin = plugin_service.get_active_instance( + db_session=db_session, project_id=case.project_id, plugin_type="document" + ) + if not plugin: + log.error("Document not created. No storage plugin enabled.") + return False + + """gets timeline events for case""" + event = get_by_case_id(db_session=db_session, case_id=case_id) + table_data = [] + dates = set() + data_inserted = False + + """Filters events based on user filter""" + for e in event: + time_header = "Time (UTC)" + event_timestamp = e.started_at.strftime("%Y-%m-%d %H:%M:%S") + if not e.owner: + e.owner = "Dispatch" + if timeline_filters.get("timezone").strip() == "America/Los_Angeles": + time_header = "Time (PST/PDT)" + event_timestamp = ( + pytz.utc.localize(e.started_at) + .astimezone(pytz.timezone(timeline_filters.get("timezone").strip())) + .replace(tzinfo=None) + .strftime("%Y-%m-%d %H:%M:%S") + ) + date, time = str(event_timestamp).split(" ") + if e.pinned or timeline_filters.get(e.type): + if date in dates: + if timeline_filters.get("exportOwner"): + table_data.append( + {time_header: time, "Description": e.description, "Owner": e.owner} + ) + else: + table_data.append({time_header: time, "Description": e.description}) + + else: + dates.add(date) + if timeline_filters.get("exportOwner"): + table_data.append({time_header: date, "Description": "\t", "Owner": "\t"}) + table_data.append( + {time_header: time, "Description": e.description, "Owner": e.owner} + ) + else: + table_data.append({time_header: date, "Description": "\t"}) + table_data.append({time_header: time, "Description": e.description}) + + if table_data: + table_data = json.loads(json.dumps(table_data)) + num_columns = len(table_data[0].keys() if table_data else []) + column_headers = table_data[0].keys() + + documents_list = [] + if timeline_filters.get("caseDocument"): + documents = document_service.get_by_case_id_and_resource_type( + db_session=db_session, + case_id=case_id, + project_id=case.project.id, + resource_type="dispatch-case-document", + ) + if documents: + documents_list.append((documents.resource_id, "Case")) + + for doc_id, doc_name in documents_list: + # Checks for existing table in the document + table_exists, curr_table_start, curr_table_end, _ = plugin.instance.get_table_details( + document_id=doc_id, header="Timeline", doc_name=doc_name + ) + + # Deletes existing table + if table_exists: + delete_table_request = [ + { + "deleteContentRange": { + "range": { + "segmentId": "", + "startIndex": curr_table_start, + "endIndex": curr_table_end, + } + } + } + ] + if plugin.instance.delete_table(document_id=doc_id, request=delete_table_request): + log.debug("Existing table in the doc has been deleted") + + else: + log.debug("Table doesn't exist under header, creating new table") + curr_table_start += 1 + + # Insert new table with required rows & columns + insert_table_request = [ + { + "insertTable": { + "rows": len(table_data) + 1, + "columns": num_columns, + "location": {"index": curr_table_start - 1}, + } + } + ] + if plugin.instance.insert(document_id=doc_id, request=insert_table_request): + log.debug("Table skeleton inserted successfully") + + else: + log.error( + f"Unable to insert table skeleton in the {doc_name} document with id {doc_id}" + ) + raise Exception( + f"Unable to insert table skeleton for timeline export in the {doc_name} document" + ) + + # Formatting & inserting empty table + insert_data_request = [ + { + "updateTableCellStyle": { + "tableCellStyle": { + "backgroundColor": { + "color": {"rgbColor": {"green": 0.4, "red": 0.4, "blue": 0.4}} + } + }, + "fields": "backgroundColor", + "tableRange": { + "columnSpan": num_columns, + "rowSpan": 1, + "tableCellLocation": { + "columnIndex": 0, + "rowIndex": 0, + "tableStartLocation": {"index": curr_table_start}, + }, + }, + } + }, + { + "updateTableColumnProperties": { + "tableStartLocation": { + "index": curr_table_start, + }, + "columnIndices": [0], + "tableColumnProperties": { + "width": {"magnitude": 90, "unit": "PT"}, + "widthType": "FIXED_WIDTH", + }, + "fields": "width,widthType", + } + }, + ] + + if timeline_filters.get("exportOwner"): + insert_data_request.append( + { + "updateTableColumnProperties": { + "tableStartLocation": { + "index": curr_table_start, + }, + "columnIndices": [2], + "tableColumnProperties": { + "width": {"magnitude": 105, "unit": "PT"}, + "widthType": "FIXED_WIDTH", + }, + "fields": "width,widthType", + } + } + ) + + if plugin.instance.insert(document_id=doc_id, request=insert_data_request): + log.debug("Table Formatted successfully") + + else: + log.error( + f"Unable to format table for timeline export in {doc_name} document with id {doc_id}" + ) + raise Exception( + f"Unable to format table for timeline export in the {doc_name} document" + ) + + # Calculating table cell indices + _, _, _, cell_indices = plugin.instance.get_table_details( + document_id=doc_id, header="Timeline", doc_name=doc_name + ) + data_to_insert = list(column_headers) + [ + item for row in table_data for item in row.values() + ] + str_len = 0 + row_idx = 0 + insert_data_request = [] + + for index, text in zip(cell_indices, data_to_insert, strict=True): + # Adjusting index based on string length + new_idx = index + str_len + + insert_data_request.append( + {"insertText": {"location": {"index": new_idx}, "text": text}} + ) + + # Header field formatting + if text in column_headers: + insert_data_request.append( + { + "updateTextStyle": { + "range": {"startIndex": new_idx, "endIndex": new_idx + len(text)}, + "textStyle": { + "bold": True, + "foregroundColor": { + "color": {"rgbColor": {"red": 1, "green": 1, "blue": 1}} + }, + "fontSize": {"magnitude": 10, "unit": "PT"}, + }, + "fields": "bold,foregroundColor", + } + } + ) + + # Formating for date rows + if text == "\t": + insert_data_request.append( + { + "updateTableCellStyle": { + "tableCellStyle": { + "backgroundColor": { + "color": { + "rgbColor": {"green": 0.8, "red": 0.8, "blue": 0.8} + } + } + }, + "fields": "backgroundColor", + "tableRange": { + "columnSpan": num_columns, + "rowSpan": 1, + "tableCellLocation": { + "tableStartLocation": {"index": curr_table_start}, + "columnIndex": 0, + "rowIndex": row_idx // len(column_headers), + }, + }, + } + } + ) + + # Formating for time column + if row_idx % num_columns == 0: + insert_data_request.append( + { + "updateTextStyle": { + "range": {"startIndex": new_idx, "endIndex": new_idx + len(text)}, + "textStyle": { + "bold": True, + }, + "fields": "bold", + } + } + ) + + row_idx += 1 + str_len += len(text) if text else 0 + + data_inserted = plugin.instance.insert(document_id=doc_id, request=insert_data_request) + if not data_inserted: + raise Exception(f"Encountered error while inserting data into the {doc_name} document") + + else: + log.error("No data to export") + raise Exception("No data to export, please check filter selection") + + return True diff --git a/src/dispatch/plugins/dispatch_slack/incident/interactive.py b/src/dispatch/plugins/dispatch_slack/incident/interactive.py index b27ad1c5b57f..8bed0b649b65 100644 --- a/src/dispatch/plugins/dispatch_slack/incident/interactive.py +++ b/src/dispatch/plugins/dispatch_slack/incident/interactive.py @@ -141,6 +141,7 @@ from dispatch.ticket import flows as ticket_flows from dispatch.messaging.strings import reminder_select_values from dispatch.plugins.dispatch_slack.messaging import build_unexpected_error_message +from dispatch.auth import service as auth_service log = logging.getLogger(__file__) @@ -782,30 +783,28 @@ def replace_slack_users_in_message(client: Any, message: str) -> str: def handle_timeline_added_event( ack: Ack, client: Any, context: BoltContext, payload: Any, db_session: Session ) -> None: - """Handles an event where the configured timeline reaction is added to a message.""" + """Handles an event where the configured timeline reaction is added to a message for incidents or cases.""" ack() conversation_id = context["channel_id"] message_ts = payload["item"]["ts"] message_ts_utc = datetime.utcfromtimestamp(float(message_ts)) - # we fetch the message information response = dispatch_slack_service.list_conversation_messages( client, conversation_id, latest=message_ts, limit=1, inclusive=1 ) message_text = replace_slack_users_in_message(client, response["messages"][0]["text"]) message_sender_id = response["messages"][0]["user"] - # TODO: (wshel) handle case reactions - if context["subject"].type == IncidentSubjects.incident: - individual = None - # we fetch the incident + subject_type = context["subject"].type + individual = None + source = "Slack message" + event_id = None + + if subject_type == IncidentSubjects.incident: incident = incident_service.get( db_session=db_session, incident_id=int(context["subject"].id) ) - - # we fetch the individual who sent the message - # if user is not found, we default to "Unknown" try: message_sender_email = get_user_email(client=client, user_id=message_sender_id) if message_sender_email: @@ -814,24 +813,20 @@ def handle_timeline_added_event( email=message_sender_email, project_id=incident.project.id, ) - except Exception: + except Exception as e: + log.error(f"Error getting user email: {e}") individual = None - - source = "Slack message" - # if the individual is not found, see if it is a bot if not individual: - if bot_user_id := context["bot_user_id"]: + if bot_user_id := context.get("bot_user_id"): try: bot = dispatch_slack_service.get_user_info_by_id(client, bot_user_id) bot_name = bot["profile"]["real_name"] source = f"Slack message from {bot_name}" - except Exception: - pass + except Exception as e: + log.error(f"Error getting bot info: {e}") else: source = f"Slack message from {individual.name}" - - # we log the event - event_service.log_incident_event( + event = event_service.log_incident_event( db_session=db_session, source=source, description=message_text, @@ -841,6 +836,53 @@ def handle_timeline_added_event( type=EventType.imported_message, owner=individual.name if individual else None, ) + db_session.commit() + event_id = event.id + log.info(f"Logged incident event with ID: {event_id}") + elif subject_type == CaseSubjects.case: + case = case_service.get(db_session=db_session, case_id=int(context["subject"].id)) + try: + message_sender_email = dispatch_slack_service.get_user_email( + client=client, user_id=message_sender_id + ) + if message_sender_email: + individual = individual_service.get_by_email_and_project( + db_session=db_session, + email=message_sender_email, + project_id=case.project.id, + ) + except Exception as e: + log.error(f"Error getting user email: {e}") + individual = None + if not individual: + if bot_user_id := context.get("bot_user_id"): + try: + bot = dispatch_slack_service.get_user_info_by_id(client, bot_user_id) + bot_name = bot["profile"]["real_name"] + source = f"Slack message from {bot_name}" + except Exception as e: + log.error(f"Error getting bot info: {e}") + else: + source = f"Slack message from {individual.name}" + dispatch_user_id = None + if individual: + dispatch_user = auth_service.get_by_email(db_session=db_session, email=individual.email) + dispatch_user_id = dispatch_user.id if dispatch_user else None + event = event_service.log_case_event( + db_session=db_session, + source=source, + description=message_text, + case_id=int(context["subject"].id), + dispatch_user_id=dispatch_user_id, + started_at=message_ts_utc, + type=EventType.imported_message, + owner=individual.name if individual else "Unknown", + ) + db_session.commit() + event_id = event.id + log.info(f"Logged case event with ID: {event_id}") + else: + log.info(f"TIMELINE HANDLER: Unknown subject type: {subject_type}") @message_dispatcher.add( diff --git a/src/dispatch/static/dispatch/src/case/CaseTimelineTabV1.vue b/src/dispatch/static/dispatch/src/case/CaseTimelineTabV1.vue index b93af58b28c0..0cda2d0ea61e 100644 --- a/src/dispatch/static/dispatch/src/case/CaseTimelineTabV1.vue +++ b/src/dispatch/static/dispatch/src/case/CaseTimelineTabV1.vue @@ -1,31 +1,50 @@