1
0
Fork 0
forked from sr2/cloud.sr2.uk

Compare commits

...
Sign in to create a new pull request.

9 commits
main ... main

Author SHA1 Message Date
irl
7c0991acde fix: broken link 2026-05-29 12:32:12 +01:00
irl
2bceb2139e fix: broken link 2026-05-29 12:29:24 +01:00
irl
4dd8c63df0 feat: sso updates 2026-05-29 12:27:29 +01:00
irl
b9186f4749 feat: reorganise link docs and add proton mail 2026-05-29 11:29:38 +01:00
irl
68ffeeccf3 deps: audit fix 2026-05-27 15:52:58 +01:00
irl
c4aa78a76b fix: build warnings, broken link 2026-05-27 15:48:30 +01:00
irl
0d6676a154 feat: adds page about self-managed handsets 2026-05-23 12:17:07 +01:00
405ce462b1 Add renovate.json 2026-05-20 08:36:48 +00:00
66aa915464 Updating Link documentation with admin guides from Notion (#3)
Add the rest of the Admin guides from our Notion site. Closes #1, #2.

Reviewed-on: sr2/cloud.sr2.uk#3
Reviewed-by: Iain Learmonth <irl@sr2.uk>
Co-authored-by: Ana Custura <ana@sr2.uk>
Co-committed-by: Ana Custura <ana@sr2.uk>
2026-05-12 10:01:09 +00:00
48 changed files with 804 additions and 330 deletions

View file

@ -0,0 +1,11 @@
---
sidebar_position: 50
sidebar_label: E2EE Channels
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# End-to-End Encrypted Channels
<DocCardList items={useCurrentSidebarCategory().items} />

View file

@ -1,12 +1,15 @@
---
label: E2E channels
sidebar_position: 40
sidebar_label: Initial Setup
sidebar_position: 10
description: Setting up E2E channels (Signal and WhatsApp)
---
# End-to-end encrypted channels
# Initial setup
## Initial setup
:::info
If you have requested a Signal and/or WhatsApp channel as part of your helpdesk setup, or you have a fully-managed
handset provided by us, these steps will already have been completed by our support team.
:::
1. Log in to your CDR Link helpdesk admin panel using either Sign in with Google button or Sign in with Zammad credentials:
@ -137,5 +140,3 @@ You will see a pop up window like the one below:
- Click the blue Save button.
🎉 Congrats! Your connection is ready!
## Reconnection

View file

@ -0,0 +1,77 @@
---
title: Mobile Devices
sidebar_position: 50
description: E2EE channels require a physical mobile device for operation
---
Signal and WhatsApp channels require a physical mobile device to be set up to create the related accounts, and this
device must be monitored and maintained to ensure the integrity of the end-to-end encryption and the availability of
the channel.
## Fully Managed Devices
We will provide a fully managed Android device to support your use of one Signal and one WhatsApp channel, if desired,
per Link Helpdesk.
Our devices are provisioned with UK mobile numbers (+44 country code) however you can choose your own username and
provide any branding you would like to have set up.
Additional channels will be subject to a fee to cover the additional cost of each required mobile device.
If for any reason you choose to move away from our hosted platform in the future, see [Moving Away](../../moving_away)
for details on porting your number to your new provider.
## Self-Managed Devices
If due to your organisational policies you require to be in posession of the device, it is possible for you to manage
your own devices.
If you require support for these devices, an additional fee will be charged.
As of May 2026 this will be the same fee as is charged for an additional fully managed device.
:::info
There are no discounts available for self-managing your device as, in our experience, the increased support costs
outweigh the hardware and mobile service costs.
Support provided to self-managed device users is on a best-effort basis. We make no claims regarding expected
response times, time between failures, or time to recovery for any issues.
:::
### Hardware and Configuration
* We only support OEM Google Pixel devices and these must be in current security support
([end of life dates](https://endoflife.date/pixel)).
* The device must have a mobile service contract that:
* has a sufficient monthly allowance for data for operating system and application updates, as well as the messaging
data which may include audio and video content;
* allows inbound and outbound calls and SMS; and
* has a permanently assigned mobile number.
* The device must not be in use for any other purpose and interactions with the device should only be performed for the
purpose of monitoring and maintenance.
* The device should be managed with a Mobile Device Management (MDM) solution to:
* automatically install operating system and application updates;
* restrict the installed apps, which may only be installed when signed with a valid certificate from a trusted app
store;
* enforce lock timeouts and strong unlock credential requirements;
* disable unnecessary features that would otherwise provide attack surface (e.g., WiFi and Bluetooth); and
* provide remote wipe capability.
### Procedures
* The device:
* must be continuously connected to the mobile network with data access enabled;
* must be kept turned on and charged, **using a charging system that does not keep the device connected to power 24 hours a day as this will lead to battery failure and risk of fire**;
* must have sufficient physical security considerations taken (e.g. kept in locked room when unattended);
* must not have mobile signal blocked from operation (e.g. do not store it in a metal safe);
* must have well-documented access control policies in place; and
* must be restarted once a week.
* Monitor the logs of the MDM to ensure updates are applied.
* Subscribe to security advisories for Android, Signal, WhatsApp and your MDM solution to endure critical and high
impact vulnerabilities are patched promptly.
* Check channel operation regularly and relink the device if needed.
* Regularly audit the device configuration and procedures, and who can access it.
:::warning
While we can advise you on a configuration for the device, security is a combination of applied configuration,
physical security and formal processes such as regular internal or external audits.
Only your organisation is able to ensure these recommendations are followed when self-managing your device.
For this reason, we do not accept any responsibility related to any security incidents related to your self-management
of the device.
:::

View file

@ -0,0 +1,25 @@
---
title: Setting up a Google channel
sidebar_position: 102
---
# Setting up a Google channel
1. Create a new project called "Zammad" under the desired Google account from [https://console.cloud.google.com/apis/dashboard](https://console.cloud.google.com/apis/dashboard) (a new project is required to create the secure Google App that is linked to the helpdesk).
2. Enable the Gmail API for this project by going to [https://console.cloud.google.com/apis/library/browse](https://console.cloud.google.com/apis/library/browse), selecting Gmail API and then enabling it. This is the API needed for communication between the helpdesk and Google.
3. Create a Google Application called "Zammad", by going to [https://console.cloud.google.com/apis/credentials/consent](https://console.cloud.google.com/apis/credentials/consent).
Give this application permissions to read, write and modify (but not delete) emails in the inbox for the Google account that needs to be linked to the helpdesk, by granting it the Gmail API "modify" scope. We created this application as it will be used by the helpdesk to receive and send emails.
4. Create OAuth credentials by going to [https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials). Here configure the permitted callback url to be [https://\<instance-name\>/api/v1/external_credentials/google/callback](https://demo.cdr.link/api/v1/external_credentials/google/callback). This will create a Google client ID and secret.
5. Finally, link the helpdesk (Zammad) to the Google application by configuring a Google channel in [https://\<instance-name\>/#channels/google](https://cchub.cdr.link/#channels/google). Select "Configure App", where you can introduce the OAuth credentials (client ID and secret) created in the previous step.
6. Select "Add account" from [https://\<instance-name\>/#channels/google](https://demo.cdr.link/#channels/google)
from a browser session where you are logged into Google with the same email address that will be linked to the helpdesk. When prompted, opt to keep all messages on the server; otherwise Zammad will try to delete them.
## Troubleshooting
1. If the final step fails with a 403 forbidden error, it may be necessary to log into the helpdesk as the user, go to Profile:
![profile](/docs/link/admin/google_channel/zammad_profile.png)
From there, navigate to linked accounts, and select remove:
![linked_accounts](/docs/link/admin/google_channel/linked_accounts.png)

View file

@ -0,0 +1,11 @@
---
sidebar_position: 20
sidebar_label: Channels Guide
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# Channels Guide
<DocCardList items={useCurrentSidebarCategory().items} />

View file

@ -0,0 +1,65 @@
---
title: Proton Mail Channel
sidebar_label: Proton Mail Channel
sidebar_position: 55
description: Using a ProtonMail email account
---
[Proton Mail](https://proton.me/mail) is the largest end-to-end encrypted email hosting service.
It was launched in 2014 and is headquartered in Geneva, Switzerland.
It is owned by the non-profit Proton Foundation through its subsidiary Proton AG.
Proton Mail uses client-side encryption to protect email content and user data before they are sent to Proton Mail
servers, unlike other common email providers.
The source code for the back end of Proton Mail remains closed-source, but Proton Mail released the source code for the
web interface, iOS and Android apps, and the [Proton Mail Bridge app](https://github.com/ProtonMail/proton-bridge)
under an open-source licence.
Although Proton Mail's encryption uses the open standard OpenPGP, and the Link platform support OpenPGP when used with
other email providers, it is not possible to directly interact with the encryption from the Link platform.
This is because Proton Mail does not provide the traditional IMAP and SMTP server endpoints to send and receive emails
and only allows connection via the Proton Mail bridge app which handles all encryption and decryption of messages.
## Requirements
* You must have a paid plan to use the Proton Mail channel as the use of the Proton Mail Bridge app is not possible on
a free account.
* Additionally, a user must be dedicated for the use of the helpdesk, it is not sufficient to create an alias on an
existing user.
## Encryption & Key Management
OpenPGP private keys are created automatically for each Proton Mail account, although these are stored in a way that
they are not generally available other than when successfully authenticated to the platform.
In the case of Link, this means that the Proton Mail Bridge app is authenticated and then has access to the OpenPGP
private key.
It is not currently possible to import public keys of 3rd-party (i.e. non-Proton Mail) email addresses, and so only
emails between Proton Mail users will be end-to-end encrypted.
The service also
[does not support the Autocrypt standard](https://protonmail.uservoice.com/forums/945460-general-ideas/suggestions/32845105-autocrypt-support),
which allows other clients to import discovered public keys automatically on new conversations.
The Proton Mail documentation [has more on this topic](https://proton.me/support/proton-mail-encryption-explained).
We will provide you with your public OpenPGP key when the channel is set up, and you can make this discoverable via your
website, but for conversations with 3rd-party accounts we expect the conversations will only be encrypted in one
direction and your replies will not be encrypted.
The helpdesk is unaware of the encryption happening in Protonmail, and cannot inform agents when an email that was sent
or received by the helpdesk was encrypted or not.
## Setting up
If you do not have an organisational account, we can fully manage the Proton Mail account setup including billing.
Please [contact us](https://www.sr2.uk/contact) to discuss this.
If you have an organisational account,
[send an invite for the new user](https://proton.me/support/add-users-organization#create-a-new-user) (the new helpdesk
channel address) to contact@sr2.uk, and email the same address to let us know you are doing this and that you would
like the channel added to your helpdesk.
Once the setup is complete we will provide you with OpenPGP public key and will also upload it to
[keys.openpgp.org](https://keys.openpgp.org/) to aid in its discovery by users.
We can also provide support on setting up Web Key Discovery (WKD) on your custom email domain if desired to further
increase the chances that inbound emails will be automatically encrypted, although this still cannot help to encrypt
replies to 3rd-party email services.

View file

@ -1,6 +1,6 @@
---
title: Backups
sidebar_position: 90
sidebar_position: 20
---
## Daily Backups
@ -26,7 +26,7 @@ If you wish to export data yourself in CSV or similar formats, you can do so thr
## Receiving Regular Database Dumps
If you are moving away from SR2 Cloud, see [our page on Moving Away](./moving_away.md).
If you are moving away from SR2 Cloud, see [our page on Moving Away](./../moving_away.md).
This feature is not currently available, however we plan to make available a feature that makes regular database dumps
available to you via our upcoming object storage system, which would be encrypted to your GPG key.

View file

@ -0,0 +1,11 @@
---
sidebar_position: 10
sidebar_label: Features
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# Features
<DocCardList items={useCurrentSidebarCategory().items} />

View file

@ -1,6 +1,6 @@
---
title: Security
sidebar_position: 50
sidebar_position: 10
---
## Application Security

View file

@ -0,0 +1,54 @@
---
title: Autoresponders
sidebar_position: 103
---
# Setting up an autoresponder (WhatsApp/Signal auto reply)
In order to setup automatic replies for WhatsApp or Signal you need to:
1. use Zammad in version 6.1.0 or newer
2. have previously created WhatsApp/Signal bot
3. create a webhook:
- go to Settings → Webhook → New Webhook
- give it any name
- the endpoint is (for link based instances):
```
http://link:3000/link/api/whatsapp/bots/<bot-token>/send
http://link:3000/link/api/signal/bots/<bot-token>/send
```
where the \<bot-token\> can be found in admin panel of your helpdesk (helpdesk-name-admin.cdr.link) - go to WhatsApp/Signal, click on the bot, copy the token
- HMAC SHA1 SIGNATURE TOKEN - leave empty
- SSL VERIFY - no
- HTTP BASIC AUTHENTICATION USERNAME - empty
- HTTP BASIC AUTHENTICATION PASSWORD - empty
- CUSTOM PAYLOAD - use json below, you can modify it in order to create more customised message body:
```json
{
"to": "#{ticket.customer.phone}",
"message": "Your ticket has been received."
}
```
- set the Webhook to active and press Submit
4. now you need to create a Trigger:
- go to Settings → Trigger → New Trigger
- set the name
- ACTIVATED BY - Action
- ACTION EXECUTION - Selective (default)
- CONDITIONS FOR AFFECTED OBJECTS*:
- Action is Created
- State is not closed
- (Article) Type is cdr_signal/cdr_whatsapp
- EXPERT MODE - off
- EXECUTE CHANGES ON OBJECTS: Webhook: webhook created in point 3
- optional note
- set to active and Submit
<aside>
🤩 Thats it!
</aside>

11
docs/link/guide/index.mdx Normal file
View file

@ -0,0 +1,11 @@
---
sidebar_position: 20
sidebar_label: Agents Guide
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# Features
<DocCardList items={useCurrentSidebarCategory().items} />

View file

@ -8,6 +8,9 @@ To log in to your instance, visit the helpdesk URL provided. This will usually e
To begin the login flow, select to login with "SR2 Cloud".
![Screenshot of initial login screen](/docs/link/agent/login.png)
<p>
<img src="/docs/link/agent/login.png" alt="Screenshot of initial login screen showing the SR2 Cloud sign in button"
style={{margin: "auto", display: "block"}} />
</p>
You can then follow the instructions for [Single Sign-On](/docs/sso/) to complete the registration and login process.

96
docs/link/guide/pgp.md Normal file
View file

@ -0,0 +1,96 @@
---
title: PGP plugin usage
sidebar_position: 100
---
# PGP plugin usage
## Enabling the PGP plugin
1. To check whether the PGP plugin is installed, check the Integrations tab in Zammad. This should show PGP in the list of integrations. A green dot will appear next to its name if the plugin is enabled - here the plugin is not yet enabled:
![integrations](/docs/link/admin/pgp/integrations.png)
1. To enable the plugin, open the settings for PGP, and toggle the switch in the top left corner of the page:
![pgp_integration](/docs/link/admin/pgp/pgp_integration.png)
## Sending encrypted email to a user
1. The Public and Private Keys section will display all the known encryption keys and associated emails. To be able to send encrypted email to an email address, it is necessary to upload the public key associated with that email address. Usually the public keys will be sent from the PGP users themselves, as attachments to tickets created via email. Heres an example of such a ticket:
![example_public_key](/docs/link/admin/pgp/example_public_key.png)
1. To be able to reply to this user using encrypted email, download this attachment and upload it to the Public and Private Keys section of the PGP integrations, by selecting Add Public Key, and then Browse:
![add_public_key](/docs/link/admin/pgp/add_public_key.png)
1. The PGP key fingerprint and email will now show up in the list:
![public_key_list](/docs/link/admin/pgp/public_key_list.png)
1. Replying on the ticket will now show the option to Encrypt, enabled by default. This means the reply will be sent encrypted. The padlock can be clicked to disable encryption.:
![encrypt_replies](/docs/link/admin/pgp/encrypt_replies.png)
## Receiving encrypted email from a user:
1. To receive encrypted email, a PGP key must be generated for the helpdesk email. For example, on Linux systems, this can be done using the `gpg` command, and filling in the name and email address for the new key. In this example, we create a key for helpdesk with email address help@cdr.link:
```ruby
gpg --gen-key  ✔  8074  13:16:03
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
```ruby
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: helpdesk
Email address: help@cdr.link
You selected this USER-ID:
"helpdesk [help@cdr.link](mailto:help@cdr.link)"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 032591C6B1918366 marked as ultimately trusted
gpg: revocation certificate stored as '/home/helpdesk/.gnupg/openpgp-revocs.d/78A30920D68F5F1A6C6912D4032591C6B1918366.rev'
public and secret key created and signed.
pub rsa3072 2022-07-27 [SC] [expires: 2024-07-26]
78A30920D68F5F1A6C6912D4032591C6B1918366
uid helpdesk [help@cdr.link](mailto:help@cdr.link)
sub rsa3072 2022-07-27 [E] [expires: 2024-07-26]
```
1. Export both the public and private keys just created.
```ruby
gpg --export -a helpdesk > helpdesk.pub
gpg --export-secret-key -a helpdesk > helpdesk.priv
```
1. The next step is to upload the helpdesks public and private keys to Zammad. The private key will be used to decrypt messages that were sent encrypted to the helpdesk. The public key will be distributed to the helpdesk users who wish to send encrypted email. First, upload the public key to the Public and Private Keys section of the PGP integrations, by selecting Add Public Key, and then Browse and selecting the public key exported in the previous step:
![import_helpdesk_public_key](/docs/link/admin/pgp/import_helpdesk_public_key.png)
1. Now add the private key, by selecting Add Private Key, and then Browse and selecting the private key exported in the previous step:
![import_helpdesk_priv_key](/docs/link/admin/pgp/import_helpdesk_priv_key.png)
The display should now indicate the private key was uploaded
![show_imported_keys](/docs/link/admin/pgp/show_imported_keys.png)
1. Ticket replies will now be sent signed by default. When an encrypted email is sent by a user, its contents will automatically be decrypted and displayed in a ticket.
⚠ Note: for a user to be able to send encrypted email to the helpdesk, the helpdesk public key must first be distributed to that user.

View file

@ -0,0 +1,134 @@
---
title: Setting up projects in CDR Link
sidebar_position: 101
---
# Setting up projects in CDR Link
Setting up separate Projects in CDR link relies on groups, roles and also channel setup. This document details a minimal configuration for setting up such a Project that uses a simple email channel to receive notifications from customers.
## Terminology
`Link Instance Admin` = person with full admin rights over a link instance
`Link Instance Customer`= any person that submits a message via any of the configured channels of a Link instance
`Link Instance Agent` = a person specifically set up in Link to work on tickets submitted by Customers
`Channel Admin` = person responsible for setting up and administering the infrastructure that will be used to receive and send email messages and notifications for a specific project.
- in the case of email, this will be a mailbox
- in the case of whatsapp and signal, it will be a handset and sim card
- in the case of sms, this will be a twilio account and number
- in the case of telegram, this will be a telegram bot
## Prerequisites
Before adding a project to CDR link, the following must be decided:
- which channels will this project use?
Once channels are decided on, the Link Instance Admin can liaise with the Channel Administrator to set up the required channels and configure them in Link.
- what will be the project name?
Once the project name is known, groups, roles and overviews may be set up as per steps 1, 2, 3 below. Once a group is created, channels will require a modification as per step 4 below.
- who will be the project agents?
Once the agents are decided on, the Link Instance Admin can add them in Link, as described in step 5 below.
If an email signature is desired for the project, it can be configured prior to the steps below according to [https://admin-docs.zammad.org/en/latest/channels/email/signatures.html](https://admin-docs.zammad.org/en/latest/channels/email/signatures.html)
## 1. Create the required group
Groups are the main ways to differentiate between projects. Each CDR channel will add new incoming tickets to an associated group; and agents working on tickets can be given group permissions to work on them.
In the Admin panel, go the Groups tab, and select New Group.
Add the group name to match the name of the project. The “Assignment timeout” can be left blank. If a signature is already configured it can be selected under “Signature”. If this project uses an Email channel - select it from the drop-down menu under “Email”, then hit Submit.
![new_group](/docs/link/admin/projects/new_group.png)
## 2. Create an associated Agent Role
Roles are required to separate permissions between the groups, as they allow custom permissions for agents.
In the Admin panel, go the Roles tab, and select New Role.
![new_role](/docs/link/admin/projects/new_role.png)
Add the name of the new role, then scroll down to select the permissions for this role. Scroll over “admin”, “chat”, “cti”, “knowledge base” and “report” without making selecting them. Do select “agent”, and in the group table below it select only “full” for the group created above. Also select “user_preferences”.
Under permissions, “Default at signup” should be left to “no”.
Apply the changes by hitting “Submit”.
![role_permissions](/docs/link/admin/projects/role_permissions.png)
## 3. Create overviews for the new role
By default, Zammad comes with the following Overviews:
![overviews](/docs/link/admin/projects/overviews.png)
The default “Unassigned and Open” and “Open” overviews that come with Zammad allow all agents to see unassigned and open tickets, regardless of their group, even if agents do not have permissions for that group. Agents would not be able to modify tickets without the necessary permissions, however to “hide” the incoming tickets of a group from agents not belonging to that group, new Overviews must be created to take the place of the default “Unassigned and Open” and “Open” overviews that come with Zammad.
3.1 Create a new overview for unassigned and open tickets:
In the Admin panel, go the Overviews tab, and select New Overview. Give it the name “Unassigned & Open - \<project-name\>” and then make the overview available for the role created in the previous step:
![new_overview](/docs/link/admin/projects/new_overview.png)
Scroll down, and under “Conditions for shown tickets”, select “State” new and open; and use the “+” button on the right to add another condition. Change the condition to limit the shown tickets to the group created in the first step. Ensure the group is highlighted as selected before hitting “Submit”, as in the example below:
![overview_conditions](/docs/link/admin/projects/overview_conditions.png)
3.2 Creating a new overview for open tickets:
If you want to add a second overview for only open tickets, repeat the previous two steps to create an overview called “Open - Group \<your-group-name\>” - which restricts shown tickets by group (once more, ensure the group is highlighted as selected before hitting “Submit”, as in the example above), and only displays tickets in the open state. Ensure you make the overview available for the role previously created.
3.3 Allow the other default overviews in link to be used by the role previously created.
Edit the “My Assigned Tickets”, “My Subscribed Tickets” and optionally the “My Pending Reached Tickets” default overviews to make them available to the role created earlier:
![edit_overviews](/docs/link/admin/projects/edit_overviews.png)
<aside>
💡 Note that we did not discuss the “Pending reached” or “Escalated” overviews, but the same principles apply - as they have the option of “leaking” information about tickets for other groups new overviews must be created in their place.
</aside>
## 4. Check the email channel setup
Select the Email channel from the Admin panel. Click the group shown under “Destination Group”, and change it to match the group created above.
In the screenshot below we show the email channel for this helpdesk is configured to send tickets straight to group “Demo group 1”:
![email_channel](/docs/link/admin/projects/email_channel.png)
<aside>
💡 Note: A ticket can be added to a group by default if the channel is configured to do so. Another way that a ticket may be added to a group is manually, by changing the “Group” tab of a ticket by an agent with appropriate permissions.
</aside>
## 5. Adding Agents and verifying the configuration
Agents are added by selecting New Users from the Users admin tab. When adding a new agent user, ensure to only give assign them the role created in step 2, and untick the default “Agent” and “Customer” roles. Moreover, in the group table underneath, only select “Full” permissions for the group created in step 1. The screenshot below shows a configuration example:
![agent_permissions](/docs/link/admin/projects/agent_permissions.png)
### Finishing and checking agent configurations
To check the configuration for an agent, an administrator can view the helpdesk from that users perspective. In the Users tab, click the 3 dots on the right of the target user, and select “View from users perspective”:
![check_agent](/docs/link/admin/projects/check_agent.png)
This will allow you to view the helpdesk as the user - and going to overviews, only the overviews defined in step 3 should be visible.
In this mode, you can also modify that users notification preferences.
Access the users Profile from the bottom left corner panel, then navigate to Notifications to customize their notification settings. To ensure no notifications are received for any new tickets received in the system for this user, untick all the boxes in the “Not Assigned” column. The user will now only receive notifications whenever a ticket assigned to them is updated.
![customise_notifications](/docs/link/admin/projects/customise_notifications.png)

View file

@ -4,6 +4,15 @@ sidebar_position: 500
# CDR Link FAQ
:::warning[CDR Sunset]
The Center for Digital Resilience will be sunsetting, with all programs and activities drawing to a full close on
December 31st, 2026.
Existing CDR users have been contacted and will all be offered to migrate their service contracts to SR2 at time of
renewal.
Read more [on our blog](https://www.sr2.uk/posts/2026-link-new-home/).
:::
CDR offers hosted Link helpdesk instances managed by [SR2 Communications](https://www.sr2.uk/),
a trusted team within the digital rights community, with a proven track record of securely handling sensitive data.

View file

@ -8,14 +8,13 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
# Link Helpdesk
:::warning[Under construction]
This documentation is a work in progress. Please [get in touch with us](mailto:contact@sr2.uk) if you have any questions.
:::
Our secure digital helpdesk platform, Link, is customised and hardened version of Zammad, an open source, flexible,
multi-channel ticketing platform that enables those in need to ask for help, and providers to respond.
Our secure digital helpdesk platform, Link, is customised and hardened version of [Zammad](https://zammad.com/en),
an open source, flexible, multi-channel ticketing platform that enables those in need to ask for help, and providers to
respond.
The helpdesks have integrations with popular messaging apps, including Signal, WhatsApp, and Telegram, making it easier
to securely allow responders to request assistance.
<img src="/docs/link/active_support.png" style={{width: "100%", maxWidth: "450px", margin: "auto", display: "block"}} />
<DocCardList items={useCurrentSidebarCategory().items} />

View file

@ -1,6 +1,6 @@
---
title: Moving Away
sidebar_position: 100
sidebar_position: 150
---
## Data Portability

View file

@ -0,0 +1,52 @@
---
title: Troubleshooting
sidebar_position: 104
---
This is a short collection of issues Link helpdesks users may experience and how to get around them.
### My helpdesk is very slow or I see 504 errors
The Link helpdesk is a piece of software running on a server with a limited amount of memory and number of connections
it can efficiently handle at once.
The slowness usually happens due to a combination of two factors:
- several agents on the helpdesk have many open ticket tabs in left hand side panel
- many of the tickets loaded in the side panel have a large amounts of messages
CDR Link allows users to connect on Whatsapp and Signal, where the conversation in a ticket can grow to
many hundreds of messages. If several agents happen to keep such a large ticket open unnecessarily,
it can harm performance for everyone working on the helpdesk.
It is always good practice to close ticket tabs when not actively working on a specific ticket.
If coordinating all agents to close their unused tickets in the side panel does not help with the slowness,
please contact us.
### Google mail not working, Oauth token expired
#### Instructions
First, someone with admin permissions in your Google organisation needs to navigate to https://console.cloud.google.com/apis/credentials
and either refresh the existing token or create another set of Google Oauth 2.0 credentials.
To reconnect your Google email:
Remember that it is very important to not log in to the helpdesk with your personal admin/agent Google account as it will result in connecting your personal email with the helpdesk.
1. Close all 'incognito' windows of your browser and open a new one.
2. Open your helpdesk login page and log into it by pressing the 'Log in with Google' button.
3. For login use the same Google email account that the customers will be using to communicate with the helpdesk.
4. Please move the emails that you don't want to import into the helpdesk manually from the Inbox folder into another folder in your helpdesk Gmail account.
This will ensure that no automatic replies will be sent to your customers for existing tickets, as importing any email triggers an auto-reply to its customer.
You can also turn off auto-replies while you reconnect for your peace of mind.
5. Go to: Settings -> Channels -> Google and press the 'Reauthenticate' button.This will prompt you to reauthenticate into Google. Make sure the account you are connecting matches the helpdesk email rather than any personal email.
6. Once authenticated, in the settings screen that comes up - set 'keep messages on server' to 'yes', unless you want the messages to be deleted from the mail provider once imported, and to exist only in Link.
### Emails arrive in my Inbox but they dont create tickets
Zammad is checking only New emails in the INBOX folder. Make sure you are not using any filters or rules that move mail to other folders in the email client.
We recommend you do not access the mailbox outside of the Link connection, unless absolutely necessary or for debugging purposes.

View file

@ -20,7 +20,4 @@ special software or technical knowledge.
<figure style={{"text-align": "center"}}>
<img src="/img/mirrors/overview.png" style={{"max-width": "100%", "max-height": "500px"}} />
<figcaption style={{"font-weight": "bold"}}>
The jasima.app portal overview for web mirrors
</figcaption>
</figure>

View file

@ -26,7 +26,7 @@ users.
If this is not possible, then deploying mirrors for websites hosted on CDNs will require either configuration at, or
co-operation from, the CDN provider.
Additional headers can be configured for the origin to authenticate requests that originate from jasima.app, and these
Additional headers can be configured for the origin to authenticate requests that originate from the mirrors, and these
can be used to bypass the protection mechanisms at your CDN.
Consult your CDN's documentation or contact their support team to configure using an additional header to disable the
rate limiting for requests originating from jasima.app.
rate limiting for requests originating from the mirrors.

View file

@ -11,15 +11,14 @@ or connect your social or corporate identity if you or your organisation uses:
* Apple *(coming soon)*
* [Google Workspace](#google-workspace)
* [Microsoft 365 Copilot](#microsoft-365-copilot)
* Telegram *(coming soon)*
![Screenshot of sign in screen](/docs/sso/signin/cloud_login_start.png)
:::warning
When using external identity providers, it is possible for the external provider to impersonate your user to our single
sign-on service in a way that is not detectable to us.
Only use external identity providers that you fully trust.
:::
As an additional layer of validation, it will be necessary to verify your email address whichever login method is used.
@ -50,14 +49,12 @@ As an additional layer of validation, it will be necessary to verify your email
* **Last Name** - Enter your last name. This will be displayed within the services.
:::note
When entering your name in the system, please provide information in both the first name and last name fields such
that colleagues within your organisation can easily recognize you.
While first and last names are commonly used in English-speaking regions, we acknowledge that names may not always
fit this structure.
As long as each field contains at least one letter and consists only of Latin letters, spaces, and dashes, you may
format the entries in a way that best ensures clarity and recognition within your team.
:::
5. Click "Register" to submit the form.

517
package-lock.json generated
View file

@ -10,7 +10,7 @@
"dependencies": {
"@docusaurus/core": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@docusaurus/theme-mermaid": "^3.9.2",
"@docusaurus/theme-mermaid": "3.9.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
@ -272,12 +272,12 @@
}
},
"node_modules/@babel/code-frame": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
"integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
"integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
"@babel/helper-validator-identifier": "^7.29.7",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
@ -334,13 +334,13 @@
}
},
"node_modules/@babel/generator": {
"version": "7.29.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
"integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
"integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.29.0",
"@babel/types": "^7.29.0",
"@babel/parser": "^7.29.7",
"@babel/types": "^7.29.7",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@ -459,9 +459,9 @@
}
},
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
"integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -481,27 +481,27 @@
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
"integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
"integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.28.6",
"@babel/types": "^7.28.6"
"@babel/traverse": "^7.29.7",
"@babel/types": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
"integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
"integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.28.6",
"@babel/helper-validator-identifier": "^7.28.5",
"@babel/traverse": "^7.28.6"
"@babel/helper-module-imports": "^7.29.7",
"@babel/helper-validator-identifier": "^7.29.7",
"@babel/traverse": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@ -523,9 +523,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
"integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
"integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -579,18 +579,18 @@
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
"integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
"integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -633,12 +633,12 @@
}
},
"node_modules/@babel/parser": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
"integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
"integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.29.0"
"@babel/types": "^7.29.7"
},
"bin": {
"parser": "bin/babel-parser.js"
@ -1223,15 +1223,15 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz",
"integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz",
"integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.28.6",
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-validator-identifier": "^7.28.5",
"@babel/traverse": "^7.29.0"
"@babel/helper-module-transforms": "^7.29.7",
"@babel/helper-plugin-utils": "^7.29.7",
"@babel/helper-validator-identifier": "^7.29.7",
"@babel/traverse": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@ -1940,31 +1940,31 @@
}
},
"node_modules/@babel/template": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
"integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
"integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.28.6",
"@babel/parser": "^7.28.6",
"@babel/types": "^7.28.6"
"@babel/code-frame": "^7.29.7",
"@babel/parser": "^7.29.7",
"@babel/types": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
"integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
"integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
"@babel/types": "^7.29.0",
"@babel/code-frame": "^7.29.7",
"@babel/generator": "^7.29.7",
"@babel/helper-globals": "^7.29.7",
"@babel/parser": "^7.29.7",
"@babel/template": "^7.29.7",
"@babel/types": "^7.29.7",
"debug": "^4.3.1"
},
"engines": {
@ -1972,13 +1972,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
"integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
"integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.28.5"
"@babel/helper-string-parser": "^7.29.7",
"@babel/helper-validator-identifier": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@ -1990,43 +1990,10 @@
"integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
"license": "MIT"
},
"node_modules/@chevrotain/cst-dts-gen": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz",
"integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==",
"license": "Apache-2.0",
"dependencies": {
"@chevrotain/gast": "11.1.1",
"@chevrotain/types": "11.1.1",
"lodash-es": "4.17.23"
}
},
"node_modules/@chevrotain/gast": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.1.tgz",
"integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==",
"license": "Apache-2.0",
"dependencies": {
"@chevrotain/types": "11.1.1",
"lodash-es": "4.17.23"
}
},
"node_modules/@chevrotain/regexp-to-ast": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz",
"integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==",
"license": "Apache-2.0"
},
"node_modules/@chevrotain/types": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.1.tgz",
"integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==",
"license": "Apache-2.0"
},
"node_modules/@chevrotain/utils": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.1.tgz",
"integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==",
"version": "11.1.2",
"resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz",
"integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==",
"license": "Apache-2.0"
},
"node_modules/@colors/colors": {
@ -4727,12 +4694,12 @@
}
},
"node_modules/@mermaid-js/parser": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz",
"integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==",
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz",
"integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==",
"license": "MIT",
"dependencies": {
"langium": "^4.0.0"
"@chevrotain/types": "~11.1.1"
}
},
"node_modules/@noble/hashes": {
@ -5296,15 +5263,6 @@
"node": ">=14.16"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"license": "ISC",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@ -5949,6 +5907,16 @@
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"license": "ISC"
},
"node_modules/@upsetjs/venn.js": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",
"integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",
"license": "MIT",
"optionalDependencies": {
"d3-selection": "^3.0.0",
"d3-transition": "^3.0.1"
}
},
"node_modules/@webassemblyjs/ast": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
@ -6620,9 +6588,9 @@
}
},
"node_modules/body-parser": {
"version": "1.20.4",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
"integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
"version": "1.20.5",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
"integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
"license": "MIT",
"dependencies": {
"bytes": "~3.1.2",
@ -6633,7 +6601,7 @@
"http-errors": "~2.0.1",
"iconv-lite": "~0.4.24",
"on-finished": "~2.4.1",
"qs": "~6.14.0",
"qs": "~6.15.1",
"raw-body": "~2.5.3",
"type-is": "~1.6.18",
"unpipe": "~1.0.0"
@ -6718,9 +6686,9 @@
}
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
"integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@ -7061,32 +7029,6 @@
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/chevrotain": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz",
"integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==",
"license": "Apache-2.0",
"dependencies": {
"@chevrotain/cst-dts-gen": "11.1.1",
"@chevrotain/gast": "11.1.1",
"@chevrotain/regexp-to-ast": "11.1.1",
"@chevrotain/types": "11.1.1",
"@chevrotain/utils": "11.1.1",
"lodash-es": "4.17.23"
}
},
"node_modules/chevrotain-allstar": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz",
"integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==",
"license": "MIT",
"dependencies": {
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"chevrotain": "^11.0.0"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@ -8577,9 +8519,9 @@
}
},
"node_modules/dagre-d3-es": {
"version": "7.0.13",
"resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz",
"integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==",
"version": "7.0.14",
"resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",
"integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",
"license": "MIT",
"dependencies": {
"d3": "^7.9.0",
@ -8754,9 +8696,9 @@
}
},
"node_modules/delaunator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
"integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",
"integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",
"license": "ISC",
"dependencies": {
"robust-predicates": "^3.0.2"
@ -8901,9 +8843,9 @@
}
},
"node_modules/dompurify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz",
"integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==",
"version": "3.4.7",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.7.tgz",
"integrity": "sha512-2jBxDJY4RR06tQNy4w5FlFH7kfxsQZlufd0sbv+chfHCxeJwrFw2baUDsSwvBISD4K4RDbd0PTfy3uNXsR6siA==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
@ -9105,6 +9047,16 @@
"node": ">= 0.4"
}
},
"node_modules/es-toolkit": {
"version": "1.47.0",
"resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz",
"integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==",
"license": "MIT",
"workspaces": [
"docs",
"benchmarks"
]
},
"node_modules/esast-util-from-estree": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
@ -9416,14 +9368,14 @@
}
},
"node_modules/express": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
"integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"version": "4.22.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
"integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "~1.20.3",
"body-parser": "~1.20.5",
"content-disposition": "~0.5.4",
"content-type": "~1.0.4",
"cookie": "~0.7.1",
@ -9442,7 +9394,7 @@
"parseurl": "~1.3.3",
"path-to-regexp": "~0.1.12",
"proxy-addr": "~2.0.7",
"qs": "~6.14.0",
"qs": "~6.15.1",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "~0.19.0",
@ -9489,9 +9441,9 @@
"license": "MIT"
},
"node_modules/express/node_modules/path-to-regexp": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
"integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
"license": "MIT"
},
"node_modules/express/node_modules/range-parser": {
@ -9550,9 +9502,9 @@
"license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
"integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
"funding": [
{
"type": "github",
@ -9791,9 +9743,9 @@
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
"integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"funding": [
{
"type": "individual",
@ -11389,23 +11341,6 @@
"node": ">=6"
}
},
"node_modules/langium": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz",
"integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==",
"license": "MIT",
"dependencies": {
"chevrotain": "~11.1.1",
"chevrotain-allstar": "~0.3.1",
"vscode-languageserver": "~9.0.1",
"vscode-languageserver-textdocument": "~1.0.11",
"vscode-uri": "~3.1.0"
},
"engines": {
"node": ">=20.10.0",
"npm": ">=10.2.3"
}
},
"node_modules/latest-version": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
@ -11507,15 +11442,15 @@
}
},
"node_modules/lodash": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
"integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
"integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
"license": "MIT"
},
"node_modules/lodash.debounce": {
@ -12102,31 +12037,32 @@
}
},
"node_modules/mermaid": {
"version": "11.12.3",
"resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz",
"integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==",
"version": "11.15.0",
"resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz",
"integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==",
"license": "MIT",
"dependencies": {
"@braintree/sanitize-url": "^7.1.1",
"@iconify/utils": "^3.0.1",
"@mermaid-js/parser": "^1.0.0",
"@iconify/utils": "^3.0.2",
"@mermaid-js/parser": "^1.1.1",
"@types/d3": "^7.4.3",
"cytoscape": "^3.29.3",
"@upsetjs/venn.js": "^2.0.0",
"cytoscape": "^3.33.1",
"cytoscape-cose-bilkent": "^4.1.0",
"cytoscape-fcose": "^2.2.0",
"d3": "^7.9.0",
"d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.13",
"dayjs": "^1.11.18",
"dompurify": "^3.2.5",
"katex": "^0.16.22",
"dagre-d3-es": "7.0.14",
"dayjs": "^1.11.19",
"dompurify": "^3.3.1",
"es-toolkit": "^1.45.1",
"katex": "^0.16.25",
"khroma": "^2.1.0",
"lodash-es": "^4.17.23",
"marked": "^16.2.1",
"marked": "^16.3.0",
"roughjs": "^4.6.6",
"stylis": "^4.3.6",
"ts-dedent": "^2.2.0",
"uuid": "^11.1.0"
"uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"
}
},
"node_modules/methods": {
@ -14016,9 +13952,9 @@
"license": "ISC"
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@ -14077,9 +14013,9 @@
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"version": "3.3.12",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"funding": [
{
"type": "github",
@ -14704,9 +14640,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@ -14775,9 +14711,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"version": "8.5.15",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"funding": [
{
"type": "opencollective",
@ -14794,7 +14730,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11",
"nanoid": "^3.3.12",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@ -16389,9 +16325,9 @@
}
},
"node_modules/qs": {
"version": "6.14.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
"integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"version": "6.15.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
"integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"
@ -16596,9 +16532,9 @@
}
},
"node_modules/react-loadable-ssr-addon-v5-slorber": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz",
"integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz",
"integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.3"
@ -17216,9 +17152,9 @@
}
},
"node_modules/robust-predicates": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
"integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",
"license": "Unlicense"
},
"node_modules/roughjs": {
@ -17319,9 +17255,9 @@
"license": "MIT"
},
"node_modules/sax": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
"integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
"integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=11.0.0"
@ -17482,15 +17418,15 @@
}
},
"node_modules/serve-handler": {
"version": "6.1.6",
"resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
"integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz",
"integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==",
"license": "MIT",
"dependencies": {
"bytes": "3.0.0",
"content-disposition": "0.5.2",
"mime-types": "2.1.18",
"minimatch": "3.1.2",
"minimatch": "3.1.5",
"path-is-inside": "1.0.2",
"path-to-regexp": "3.3.0",
"range-parser": "1.2.0"
@ -18170,18 +18106,18 @@
"license": "MIT"
},
"node_modules/svgo": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
"integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz",
"integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==",
"license": "MIT",
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^5.1.0",
"css-tree": "^2.3.1",
"css-what": "^6.1.0",
"csso": "^5.0.5",
"picocolors": "^1.0.0"
"picocolors": "^1.0.0",
"sax": "^1.5.0"
},
"bin": {
"svgo": "bin/svgo"
@ -18235,15 +18171,14 @@
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.16",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
"integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz",
"integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==",
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"engines": {
@ -18257,12 +18192,39 @@
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@minify-html/node": {
"optional": true
},
"@swc/core": {
"optional": true
},
"@swc/css": {
"optional": true
},
"@swc/html": {
"optional": true
},
"clean-css": {
"optional": true
},
"cssnano": {
"optional": true
},
"csso": {
"optional": true
},
"esbuild": {
"optional": true
},
"html-minifier-terser": {
"optional": true
},
"lightningcss": {
"optional": true
},
"postcss": {
"optional": true
},
"uglify-js": {
"optional": true
}
@ -18944,16 +18906,16 @@
}
},
"node_modules/uuid": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz",
"integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist/esm/bin/uuid"
"uuid": "dist-node/bin/uuid"
}
},
"node_modules/value-equal": {
@ -19013,55 +18975,6 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/vscode-jsonrpc": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
"integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vscode-languageserver": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
"integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
"license": "MIT",
"dependencies": {
"vscode-languageserver-protocol": "3.17.5"
},
"bin": {
"installServerIntoExtension": "bin/installServerIntoExtension"
}
},
"node_modules/vscode-languageserver-protocol": {
"version": "3.17.5",
"resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
"integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
"license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.2.0",
"vscode-languageserver-types": "3.17.5"
}
},
"node_modules/vscode-languageserver-textdocument": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
"integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
"license": "MIT"
},
"node_modules/vscode-languageserver-types": {
"version": "3.17.5",
"resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
"integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
"license": "MIT"
},
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
"license": "MIT"
},
"node_modules/watchpack": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
@ -19241,9 +19154,9 @@
}
},
"node_modules/webpack-dev-server": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz",
"integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==",
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz",
"integrity": "sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==",
"license": "MIT",
"dependencies": {
"@types/bonjour": "^3.5.13",
@ -19328,9 +19241,9 @@
}
},
"node_modules/webpack-dev-server/node_modules/ws": {
"version": "8.19.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"version": "8.21.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
"integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"

View file

@ -17,7 +17,7 @@
"dependencies": {
"@docusaurus/core": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@docusaurus/theme-mermaid": "^3.9.2",
"@docusaurus/theme-mermaid": "3.9.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",

8
renovate.json Normal file
View file

@ -0,0 +1,8 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"minimumReleaseAge": "14 days",
"gitAuthor": "Renovate<noreply@sr2.uk>"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB