diff --git a/.env.sample b/.env.sample index 0ed160dff..f21de7484 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,5 @@ GATSBY_ALGOLIA_APP_ID= GATSBY_ALGOLIA_SEARCH_KEY= ALGOLIA_ADMIN_KEY= -BUILD_ENV=LOCAL \ No newline at end of file +GATSBY_CLOUDFLARE_URL= +BUILD_ENV=LOCAL diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c511a9d3c..2322d9adc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -79,13 +79,15 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - # Use NodeJS v12.18.3 + # Use NodeJS v20 - uses: actions/setup-node@v2 with: - node-version: '14.15.4' + node-version: '20' # Run npm install - name: Run npm install + env: + PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} run: npm install - name: create env file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5bdfabd1a..1030117d1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,13 +22,15 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - # Use NodeJS v14.19.0 + # Use NodeJS v20 - uses: actions/setup-node@v2 with: - node-version: '14.15.4' + node-version: '20' # Run npm install - name: Run npm install + env: + PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} run: npm install # Runs tests diff --git a/.npmrc b/.npmrc index f4e1e4ad0..b1a3833d8 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,3 @@ registry = 'https://registry.npmjs.org/' +@thoughtspot:registry=https://packagecloud.io/modeanalytics/tse/npm/ +//packagecloud.io/modeanalytics/tse/npm/:_authToken=${PACKAGECLOUD_TOKEN} diff --git a/gatsby-browser.js b/gatsby-browser.js new file mode 100644 index 000000000..e6d4c93ee --- /dev/null +++ b/gatsby-browser.js @@ -0,0 +1,31 @@ +exports.onClientEntry = () => { + // Dynamic imports so @thoughtspot/radiant-react (which reads `window` at + // module-load time) is never evaluated during Gatsby's SSR build. + Promise.all([ + import('./src/contexts/FloatingAssistantContext'), + import('./src/components/FloatingAssistant'), + import('react'), + import('react-dom/client'), + ]).then(([ + { FloatingAssistantProvider }, + { default: FloatingAssistant }, + React, + ReactDOM, + ]) => { + const container = document.createElement('div'); + container.id = 'floating-assistant-root'; + document.body.appendChild(container); + + ReactDOM.createRoot(container).render( + React.createElement( + FloatingAssistantProvider, + null, + React.createElement(FloatingAssistant) + ) + ); + }); +}; + +exports.onRouteUpdate = ({ location }) => { + window.dispatchEvent(new CustomEvent('gatsby-route-update', { detail: { location } })); +}; diff --git a/gatsby-node.js b/gatsby-node.js index 98a9cf3a9..a92e3c791 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -78,6 +78,13 @@ exports.onPostBuild = async ({ graphql, reporter }) => { node { document { title } pageAttributes { pageid } + fields { markdownBody } + parent { + ... on File { + sourceInstanceName + relativePath + } + } } } } @@ -85,17 +92,55 @@ exports.onPostBuild = async ({ graphql, reporter }) => { `); if (result.errors) { - reporter.warn(`llms.txt generation: GraphQL errors — ${JSON.stringify(result.errors)}`); + reporter.warn(`Build-time generation: GraphQL errors — ${JSON.stringify(result.errors)}`); return; } - const pageMap = {}; + // pageData keyed by pageid: { title, docPath } + // docPath is the URL-path segment (e.g. '/getting-started', '/tutorials/intro') + // derived from getDocLinkFromEdge so tutorials with subdirectories resolve correctly. + const pageData = {}; + let mdCount = 0; + // Pages whose markdown exceeds this limit are truncated with a continuation link. + // Keeps all pages within the agent-score page-size threshold while preserving crawlability. + const MAX_MD_CHARS = 95_000; + result.data.allAsciidoc.edges.forEach(({ node }) => { const pageid = node.pageAttributes?.pageid; const title = node.document?.title; - if (pageid && title) pageMap[pageid] = title; + const markdownBody = node.fields?.markdownBody; + const relativePath = node.parent?.relativePath || ''; + // Auto-generated per-symbol SDK reference pages (scripts/Converter/index.ts) — + // represented in llms.txt by the single curated VisualEmbedSdk entry, not individually. + const isTypedocGenerated = relativePath.startsWith('generated/typedoc/'); + + if (!pageid || pageid.startsWith('nav-')) return; + + const docPath = getDocLinkFromEdge({ node }); // e.g. '/getting-started' or '/tutorials/category/page' + if (title) pageData[pageid] = { title, docPath, isTypedocGenerated }; + + // Write static .md file — serves at /docs.md for agent crawlers + if (markdownBody) { + let body = markdownBody; + if (body.length > MAX_MD_CHARS) { + // Trim at the last complete line within the limit + const cut = body.lastIndexOf('\n', MAX_MD_CHARS); + body = body.slice(0, cut > MAX_MD_CHARS * 0.8 ? cut : MAX_MD_CHARS); + body += `\n\n---\n\n> **Content truncated.** This page exceeds the inline size limit. View the complete documentation at [${SITE_URL}${docPath}](${SITE_URL}${docPath})\n`; + } + const header = `# ${title ?? pageid}\n\n> For the complete documentation index, see [llms.txt](${SITE_URL}/llms.txt)\n\nSource: ${SITE_URL}${docPath}\n\n`; + fsExtra.outputFileSync( + `${__dirname}/public${docPath}.md`, + header + body, + ); + mdCount++; + } }); + reporter.info(`[md-gen] Wrote ${mdCount} .md files`); + + // Generate llms.txt — curated sections first, then any remaining pages + const coveredIds = new Set(); const lines = [ '# ThoughtSpot Developer Documentation', '', @@ -104,11 +149,29 @@ exports.onPostBuild = async ({ graphql, reporter }) => { ]; for (const section of LLMS_SECTIONS) { - lines.push(`## ${section.label}`); + const sectionLines = []; for (const pageId of section.pageIds) { - const title = pageMap[pageId]; - if (title) lines.push(`- [${title}](${SITE_URL}/${pageId})`); + const data = pageData[pageId]; + if (data) { + sectionLines.push(`- [${data.title}](${SITE_URL}${data.docPath}.md)`); + coveredIds.add(pageId); + } + } + if (sectionLines.length) { + lines.push(`## ${section.label}`); + lines.push(...sectionLines); + lines.push(''); } + } + + // Add pages that exist as Asciidoc nodes but aren't in any LLMS_SECTIONS entry. + // Excludes typedoc-generated pages — those are covered by the curated VisualEmbedSdk entry. + const uncovered = Object.entries(pageData).filter( + ([id, data]) => !coveredIds.has(id) && !data.isTypedocGenerated, + ); + if (uncovered.length) { + lines.push('## Additional documentation'); + uncovered.forEach(([, { title, docPath }]) => lines.push(`- [${title}](${SITE_URL}${docPath}.md)`)); lines.push(''); } @@ -116,9 +179,9 @@ exports.onPostBuild = async ({ graphql, reporter }) => { `${__dirname}/public/llms.txt`, lines.join('\n'), ); - reporter.info(`llms.txt generated with ${Object.keys(pageMap).length} pages`); + reporter.info(`llms.txt: ${coveredIds.size} curated + ${uncovered.length} additional = ${coveredIds.size + uncovered.length} total pages`); } catch (err) { - reporter.warn(`llms.txt generation failed: ${err.message}`); + reporter.warn(`Build-time generation failed: ${err.message}`); } }; exports.createPages = async function ({ actions, graphql }) { diff --git a/gatsby-ssr.js b/gatsby-ssr.js new file mode 100644 index 000000000..8a6bc41a4 --- /dev/null +++ b/gatsby-ssr.js @@ -0,0 +1,41 @@ +const React = require('react'); +const RADIANT_SPRITE = require('./src/components/FloatingAssistant/radiantSprite'); +const { SITE_URL } = require('./src/configs/doc-configs'); + +exports.onRenderBody = ({ setHeadComponents, setPreBodyComponents }) => { + setHeadComponents([ + React.createElement('link', { + key: 'llms-txt', + rel: 'llms-txt', + href: `${SITE_URL}/llms.txt`, + }), + ]); + + // Visually-hidden body element — picked up by agent crawlers that parse the DOM + // but ignore link tags. + setPreBodyComponents([ + React.createElement( + 'div', + { + key: 'llms-txt-directive', + style: { + position: 'absolute', + width: '1px', + height: '1px', + overflow: 'hidden', + clip: 'rect(0,0,0,0)', + whiteSpace: 'nowrap', + }, + }, + React.createElement( + 'a', + { href: `${SITE_URL}/llms.txt` }, + 'LLMs.txt: Complete documentation index for AI agents', + ), + ), + React.createElement('div', { + key: 'radiant-sprite', + dangerouslySetInnerHTML: { __html: RADIANT_SPRITE }, + }), + ]); +}; diff --git a/middleware.js b/middleware.js new file mode 100644 index 000000000..884582232 --- /dev/null +++ b/middleware.js @@ -0,0 +1,26 @@ +import { rewrite, next } from '@vercel/functions' + +// Content-negotiation for AEO: agents (Claude Code, Cursor, OpenCode, etc.) send +// `Accept: text/markdown` and expect the markdown sibling generated at build time. +// Vercel's vercel.json `rewrites` can't do this because filesystem match takes +// precedence over rewrites for a path that already resolves to an existing static +// file, so this has to run in Middleware instead, which executes before that +// filesystem check. +export const config = { + matcher: '/:path*', +} + +export default function middleware (request) { + const accept = request.headers.get('accept') || '' + if (!accept.includes('text/markdown')) return next() + + const url = new URL(request.url) + const { pathname } = url + if (pathname.endsWith('.md')) return next() + + const lastSegment = pathname.slice(pathname.lastIndexOf('/') + 1) + if (lastSegment.includes('.')) return next() // static asset (css/js/svg/png/...), not a doc page + + url.pathname = pathname.endsWith('/') ? `${pathname}index.md` : `${pathname}.md` + return rewrite(url) +} diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index da7ec9f9f..e37854c94 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -8,10 +8,64 @@ This page documents the changes introduced in each release of the Visual Embed SDK. For information about the REST API v2.0 changes, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +== Version 1.51.x, August 2026 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| + +[discrete] +===== Spotter embedding + +Spotter Analysts:: +The Visual Embed SDK introduces controls for the Spotter Analysts feature in embedded applications. The Analysts section in the Spotter sidebar is disabled by default in the embed mode. For more information, see xref:customize-spotter-embed.adoc#_spotter_analysts[Spotter Analysts in embed view]. + +Starter prompts:: +If quick starter prompts are enabled and configured for data models on a ThoughtSpot instance, you can display these prompts in the embed using the `enableStarterPrompts` parameter. For more information, see xref:customize-spotter-embed.adoc#_spotter_starter_prompts[Spotter quick starter prompts]. + +|[tag greenBackground]#MODIFIED# a| + +[discrete] +===== Liveboard embedding +The following Liveboard embedding settings are set to `true` by default on all ThoughtSpot embedded instances: + +* `hideIrrelevantChipsInLiveboardTabs` + +Hides filters that are not relevant to the displayed visualization. +* `isLiveboardCompactHeaderEnabled` + +Enables compact header layout in embedded Liveboards. +* `coverAndFilterOptionInPDF` + +Enables the *Include cover page* and *Include filter page(s)* checkboxes in the Liveboard download modal. +* `isLiveboardMasterpiecesEnabled` + +Enables the xref:embed-pinboard.adoc#_liveboard_grouping_and_styling[Liveboard styling and grouping] feature. +* `isEnhancedFilterInteractivityEnabled` + +Enables interactive filter chips that allow users to add, update, or remove filters in an embedded Liveboard. + +|[tag greenBackground]#NEW FEATURE# a| + +[discrete] +===== Object format support in HostEvent.Navigate +The `HostEvent.Navigate` event now supports an object format in addition to the existing string path format. Use the object format to replace the current browser history entry instead of pushing a new entry. + +//// +[source,JavaScript] +---- +// String format — push new history entry (existing behavior, unchanged) +appEmbed.trigger(HostEvent.Navigate, 'home'); +---- + +[source,JavaScript] +---- +// Object format — replace current history entry (new in SDK 1.51.0) +appEmbed.trigger(HostEvent.Navigate, { path: 'home', replace: true }); +---- +Supported embed types: `AppEmbed`. +//// + +|==== == Version 1.50.x, July 2026 -[width="100%", cols="1,4"] +[width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| @@ -19,9 +73,7 @@ This page documents the changes introduced in each release of the Visual Embed S ===== SpotterViz embed customization The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and `SpotterVizStarterPrompt` interface to allow embed developers to customize the SpotterViz panel on embedded Liveboards and full-application embeds. -A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` for the `spotterViz` object. This object provides branding customization controls for customizing the SpotterViz panel experience. - -To customize app interactions, visibility of the UI elements, and style and appearance of the SpotterViz panel, the SDK also introduces CSS variables, action IDs, and embed and host event identifiers. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. +A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` for the `spotterViz` object. This object provides branding customization controls for customizing the SpotterViz panel experience. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. |[tag greenBackground]#NEW FEATURE# a| @@ -45,13 +97,12 @@ customizations to the new answers from an embedded Search data interface at init The `visualOverrides` object provides the following customization controls to modify the chart and table display: -* `legend`: control legend visibility, position, and color palette of charts. +* `legend` to control legend visibility, position, and color palette of charts. * `dataLabel` attribute for data labels and per-column label filters. -* `display` attributes for such as regression line overlay and grid line visibility in charts and table themes and content density in tables. +* `display` attributes such as regression line overlay and grid line visibility in charts, and table themes and content density in tables. * `axis` property for axis name and label visibility and fixed y-axis range. -* `columns` property for per-column series color and conditional formatting rules. -* `updateMaskPaths` property for partial updates -* `columns` property for column visibility, text wrapping, conditional formatting, and column summary in tables. +* `columns` property for per-column series color and conditional formatting rules in charts, and column visibility, text wrapping, conditional formatting, and column summary in tables. +* `updateMaskPaths` property for partial updates. For more information, see xref:viz-overrides.adoc[Visualization overrides]. |[tag greenBackground]#NEW FEATURE# a| @@ -86,7 +137,6 @@ For more information, see xref:embed-spotter.adoc#fileUpload[Allowing file uploa |==== - == Version 1.48.x, May 2026 [width="100%" cols="1,4"] |==== @@ -155,8 +205,6 @@ EmbedEvent:: The SDK introduces the `EmbedEvent.Subscribed` to emit an event when a HostEvent listener is registered. You can use this event to dispatch host events during the initial load without race conditions. This is particularly useful for Spotter, where host events such as `HostEvent.ResetSpotterConversation` may be triggered immediately after load. * `EmbedEvent.Error` + The `EmbedEvent.Error` now fires on HostEvent payload validation failures. -* `EmbedEvent.ChangePersonalizedView` + -Emits when a user selects a different Personalized View or resets to default. HostEvent:: * `HostEvent.GetExportRequestForCurrentPinboard` [.version-badge.breaking]#Breaking# + @@ -164,8 +212,17 @@ The response payload of the `GetExportRequestForCurrentPinboard` passthrough host event has been updated to include a `type` discriminator field, making it consistent with the shape of other host event responses. It now returns `{ data: { v2Content }, type }` instead of `{ v2Content }` directly. This enhancement introduces a breaking change for any code that reads `result.v2Content` directly. Update your integration workflows to use `result.data.v2Content`. + +|[tag greenBackground]#NEW FEATURE# a| + +[discrete] +===== Personalized View selection via host event + +* `EmbedEvent.ChangePersonalizedView` + +Emits when a user selects a different Personalized View on an embedded Liveboard, or resets to the default view. For more information, see xref:EmbedEvent.adoc#_changepersonalizedview[EmbedEvent reference documentation]. + * `HostEvent.SelectPersonalizedView` + -Triggers the selection of a specific Personalized View and resets the default view on a Liveboard. +The SDK introduces `HostEvent.SelectPersonalizedView` to programmatically switch the active Personalized View on an embedded Liveboard from the host application. For more information, see xref:HostEvent.SelectPersonalizedView[HostEvent reference documentation]. ⚠️Deprecated events and action IDs️:: The following events are deprecated and replaced with new event IDs. @@ -177,7 +234,6 @@ The following events are deprecated and replaced with new event IDs. * `Action.PersonalisedViewsDropdown`. Use `Action.PersonalizedViewsDropdown`. * `Action.OrganiseFavourites`. Use `Action.OrganizeFavorites`. - |==== @@ -997,7 +1053,6 @@ Can be used to show or hide the *Verified Liveboard* banner. * `hidehomepageleftnav` * `hideorgswitcher` * `reorderedhomepagemodules` -* `hiddenhomeleftnavitems` * `HomeLeftNavItem` For more information, see xref:full-app-customize.adoc[Customize full application embedding] and xref:AppViewConfig.adoc[AppViewConfig]. @@ -1007,7 +1062,7 @@ For more information, see xref:full-app-customize.adoc[Customize full applicatio Emits when an embedded Liveboard or visualization is renamed. |[tag greenBackground]#NEW FEATURE# a| TML actions -The following TML menu actions are now grouped under *TML* sub-menu of the **More** image:./images/icon-more-10px.png[the more options menu] menu on Answer page. +The following TML menu actions are now grouped under the **TML** sub-menu of the **More** image:./images/icon-more-10px.png[the more options menu] menu on Answer page. * Export TML * Edit TML @@ -1272,7 +1327,6 @@ Use the following action enumeration members instead of `Action.Download` to sho * `Action.DownloadAsXlsx` * `Action.DownloadAsPng` -+ To disable or hide download actions, you can use `Action.Download` in the `disabledActions` and `hiddenActions` arrays respectively. However, if you are using the `visibleActions` array to show or hide actions on a visualization or Answer, include the following download action enumerations along with `Action.Download` in the array: + ** `Action.DownloadAsCsv` + @@ -1314,7 +1368,6 @@ For more information, see xref:css-customization.adoc[Customize CSS]. |[tag redBackground]#BREAKING CHANGE# a|The new Liveboard experience mode introduces changes to the data format of the JSON response payload triggered by callback custom actions. For example, the `reportBookData`, and `vizData` attributes are modified, and the custom action `id` now is part of the data attribute. These changes may break your current custom action event handlers. For interoperability, we recommend adding the data attribute to `payload` in your code as shown in the example here: [source,JavaScript] - ---- liveboardEmbed.on(EmbedEvent.CustomAction, payload => { if (payload.id === "callback-action-id" \|\| payload.data.id === "callback-action-id") { @@ -1819,7 +1872,7 @@ For more information, see xref:push-data-to-external-app.adoc#large-dataset[Call |==== |[tag greenBackground]#NEW FEATURE# a|+++
SAML authentication
+++ -The Visual Embed SDK packages now include the `noRedirect` attribute as an optional parameter for the SAMLRedirect SSO `AuthType`. If you want to display the SAML authentication workflow in a pop-up window, instead of refreshing the application web page to direct users to the SAML login page, you can set the `noRedirect` attribute to `true`. +The Visual Embed SDK packages now include the `noRedirect` attribute as an optional parameter for the SAMLRedirect SSO `AuthType`. If you want to display the SAML authentication workflow in a pop-up window, instead of refreshing the application web page to direct users to the SAML login page, you can set the `noRedirect` attribute to `true`. For more information, see the instructions for embedding xref:full-embed.adoc[ThoughtSpot pages], xref:embed-search.adoc[search], xref:embed-pinboard.adoc[pinboard], and xref:embed-a-viz.adoc[visualizations]. @@ -1864,4 +1917,4 @@ Users with edit permissions can view and access the *Edit* action. The *Download When a user accesses the embedded application from a web browser that has third-party cookies disabled, the Visual Embed SDK emits the `NoCookieAccess` event to notify the developer. Cookies are disabled by default in Safari. Users can enable third-party cookies in Safari’s Preferences setting page or use another web browser. To know how to enable this setting by default on Safari for a ThoughtSpot embedded instance, contact ThoughtSpot Support. -|==== \ No newline at end of file +|==== diff --git a/modules/ROOT/pages/best-practices.adoc b/modules/ROOT/pages/best-practices.adoc index 6ef2a84d3..277e950af 100644 --- a/modules/ROOT/pages/best-practices.adoc +++ b/modules/ROOT/pages/best-practices.adoc @@ -7,38 +7,31 @@ :page-pageid: best-practices :page-description: Getting Started - For performance optimization, the following best practices are recommended: Use the recommended SDK version:: - Always use the recommended SDK version. + ThoughtSpot publishes a new version of the SDK for every major ThoughtSpot Cloud release. Make sure you review the xref:api-changelog.adoc[changelog] to know about the new features and enhancements, breaking changes, bug fixes, and deprecated features. Use the appropriate embed package:: - The SDK provides different packages for embedding ThoughtSpot components in your app. Choose the appropriate package that suits your requirement. For example, if you need to embed multiple visualizations, consider adding them to a Liveboard and embed that Liveboard in your app. + To avoid page scroll as visualizations load on a Liveboard, you can set the `fullHeight` property to `true` in the `LiveboardEmbed` code. Prefetch and cache resources:: - Use the `prefetch` method in the SDK to xref:prefetch-and-cache.adoc[prefetch and cache] static resources required for loading the embedded components. You can achieve this in two ways: * Use the `prefetch` method before calling `init` to cache static assets as early as possible (Recommended, as developers may need to call the `init` method later in their code). * Alternatively, if you can call the `init` method early, you can use the `callPrefetch` attribute in `init` directly instead. Call init early:: - Call the `init` method as early as possible and complete authentication on application load. Cache query results:: - To cache query results, tune the underlying data warehouse. Use HTTP/2:: - Although your application platform and Web server setup can use HTTP/1.1, ThoughtSpot strongly recommends using HTTP/2 for faster response times and performance optimization. diff --git a/modules/ROOT/pages/collections.adoc b/modules/ROOT/pages/collections.adoc index a028490b6..2c4e7c00c 100644 --- a/modules/ROOT/pages/collections.adoc +++ b/modules/ROOT/pages/collections.adoc @@ -1,4 +1,4 @@ -= Collections [beta betaBackground]^Beta^ += Collections :toc: true :toclevels: 1 :page-title: Collections diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 4f5f8a246..347aa02bb 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -11,6 +11,7 @@ Embed ThoughtSpot in a web app * link:{{navprefix}}/tsembed[Quickstart guide] * link:{{navprefix}}/embed-ai-search-analytics[Embed AI Search and Analytics] ** link:{{navprefix}}/embed-spotter[Embed Spotter experience] +*** link:{{navprefix}}/customize-spotter-embed[Customize Spotter interface] ** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] * link:{{navprefix}}/embed-liveboard[Embed Analytics] ** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] diff --git a/modules/ROOT/pages/common/nav-in-product-help.adoc b/modules/ROOT/pages/common/nav-in-product-help.adoc index cf7312ff9..a90cc2ead 100644 --- a/modules/ROOT/pages/common/nav-in-product-help.adoc +++ b/modules/ROOT/pages/common/nav-in-product-help.adoc @@ -226,6 +226,7 @@ REST APIs *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] *** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] +*** link:{{navprefix}}/spotter-memory-migration[Spotter memory migration API] *** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] *** link:{{navprefix}}/spotter-nl-instructions[Data model instructions APIs ^BETA^] ** link:{{navprefix}}/style-customization-apis[Style customization APIs] @@ -244,6 +245,7 @@ REST API SDK * link:{{navprefix}}/rest-api-sdk[Overview] * link:{{navprefix}}/rest-api-sdk-typescript[TypeScript SDK] * link:{{navprefix}}/rest-api-sdk-java[Java SDK] +* link:{{navprefix}}/python-sdk[Python SDK] * link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] [.sidebar-title] @@ -305,4 +307,3 @@ Additional resources * link:https://training.thoughtspot.com/page/developer[Training resources, window=_blank] * link:https://docs.thoughtspot.com[Product Documentation, window=_blank] * link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] - diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index faa813ba1..b81241013 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -20,29 +20,34 @@ REST APIs *** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] *** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] ** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] +** link:{{navprefix}}/runtime-sort[Runtime sorting] ** link:{{navprefix}}/spotter-api[Spotter APIs] *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] *** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] -** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -** link:{{navprefix}}/spotter-nl-instructions[Data model instructions APIs ^BETA^] -** link:{{navprefix}}/style-customization-apis[Style customization APIs] +*** link:{{navprefix}}/spotter-memory-migration[Spotter memory migration API] +*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +*** link:{{navprefix}}/spotter-nl-instructions[Data model instructions APIs ^BETA^] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] ** link:{{navprefix}}/collections[Collections ^BETA^] ** link:{{navprefix}}/connections[Connections] ** link:{{navprefix}}/connection-config[Connection configuration] -** link:{{navprefix}}/runtime-sort[Runtime sorting] ** link:{{navprefix}}/manual-translation-api[Manual translations] +** link:{{navprefix}}/style-customization-apis[Style customization APIs] ** link:{{navprefix}}/webhooks-rest-api[Webhook APIs] + + [.sidebar-title] REST API SDK * link:{{navprefix}}/rest-api-sdk[Overview] * link:{{navprefix}}/rest-api-sdk-typescript[TypeScript SDK] * link:{{navprefix}}/rest-api-sdk-java[Java SDK] +* link:{{navprefix}}/python-sdk[Python SDK] +* link:{{navprefix}}/rest-api-sdk-csharp[C# SDK] * link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] [.sidebar-title] @@ -69,9 +74,3 @@ Additional resources * link:{{navprefix}}/faqs[FAQs] * link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] - - - - - - diff --git a/modules/ROOT/pages/common/nav-spottercode.adoc b/modules/ROOT/pages/common/nav-spottercode.adoc index b60c85c31..fb3d6f1b2 100644 --- a/modules/ROOT/pages/common/nav-spottercode.adoc +++ b/modules/ROOT/pages/common/nav-spottercode.adoc @@ -7,6 +7,6 @@ [.sidebar-title] SpotterCode agent -* link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] +* link:{{navprefix}}/SpotterCode[SpotterCode overview] * link:{{navprefix}}/integrate-SpotterCode[Integrating SpotterCode] * link:{{navprefix}}/spottercode-prompting-guide[SpotterCode prompting guide] diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 141aada68..688e73792 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -23,20 +23,16 @@ Live Playgrounds * link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] ** link:{{navprefix}}/rest-playground[How to use] -//** link:{{navprefix}}/graphql-play-ground[GraphQL Playground] //** +++REST API v1 Playground+++ * +++Theme Builder+++ ** link:{{navprefix}}/theme-builder-doc[How to use] -//*** link:{{navprefix}}/graphql-playground[GraphQL Playground] - - [.sidebar-title] Get started * link:{{navprefix}}/getting-started[Embed ThoughtSpot] -* link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] +* link:{{navprefix}}/SpotterCode[SpotterCode] * link:{{navprefix}}/rest-apis[REST APIs] * link:{{navprefix}}/ai-analytics-integration[AI analytics integration] * link:{{navprefix}}/mcp-integration[MCP Server integration] diff --git a/modules/ROOT/pages/customize-css-styles.adoc b/modules/ROOT/pages/customize-css-styles.adoc index 523961072..067cd0da9 100644 --- a/modules/ROOT/pages/customize-css-styles.adoc +++ b/modules/ROOT/pages/customize-css-styles.adoc @@ -8,7 +8,6 @@ The xref:css-customization.adoc[ThoughtSpot CSS customization framework] defines a number of variables for applying styles throughout embedded ThoughSpot components. - == Application-wide settings The following example shows the supported variables: @@ -43,6 +42,25 @@ The navigation panel appears at the top of the application page. |`--ts-var-search-data-button-font-family`| Font of the text on the *Search data* button. |====== +[#left-nav-css-vars] +=== Left navigation panel +Use the following CSS variables to customize the left navigation panel in full application embedding. + +[width="60%", cols="3,4"] +[options="header"] +|==== +|Variable |Description +|`--ts-var-left-nav-background` |Background color of the left navigation panel. +|`--ts-var-left-nav-active-tab-background` |Background color of the active tab in the left navigation panel. +|`--ts-var-left-nav-active-tab-border-color` |Border color of the active tab in the left navigation panel. +|`--ts-var-left-nav-section-title-color` |Font color of section title labels in the left navigation panel. +|`--ts-var-left-nav-item-color` |Font color of navigation items in the left navigation panel. +|`--ts-var-left-nav-item-selection-color` |Font color of the selected navigation item. +|`--ts-var-left-nav-item-selection-background` |Background color of the selected navigation item. +|`--ts-var-left-nav-tab-icon-active-color` |Icon color of the active tab in the left navigation panel. +|`--ts-var-left-nav-tab-icon-inactive-color` |Icon color of inactive tabs in the left navigation panel. +|==== + == Menu elements CSS Variables for **More** menu image:./images/icon-more-10px.png[the more options menu], contextual menu, and dropdown selection panels. The *More* menu appears on Liveboard, visualization, answers, SpotIQ, and several other application pages. Contextual menu appears when you right-click on a data point on a chart or table. diff --git a/modules/ROOT/pages/customize-homepage-full-embed.adoc b/modules/ROOT/pages/customize-homepage-full-embed.adoc index 70d9b1bbf..403ca7988 100644 --- a/modules/ROOT/pages/customize-homepage-full-embed.adoc +++ b/modules/ROOT/pages/customize-homepage-full-embed.adoc @@ -4,18 +4,13 @@ :page-title: Customize home page experience :page-pageid: customize-homepage-experience -:page-description: Customize the home page experience by including or excluding specific modules and arrange them as needed in full application embedding +:page-description: Customize the home page experience by including or excluding specific modules and arranging them as needed in full application embedding -Developers can customize the home page experience in full application embedding to show either the classic layout or the new modular home page. +Developers can customize the home page experience in full application embedding to show either the V3 modular layout or the V4 focused home page. [IMPORTANT] ==== -The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. -==== - -[NOTE] -==== -The focused homepage experience is an Early Access feature and is disabled by default. To enable this experience in your embedding application, ensure that the feature is enabled on your ThoughtSpot instance and in the Visual Embed SDK. +Starting from Visual Embed SDK 1.51.0, the classic v1 and v2 navigation and homepage experience are deprecated. Deployments using full application embed will be upgraded to the V3 navigation and home page experience. When your application is switched to V3 experience, you can choose to use the `HomePage.ModularWithStylingChanges` (V3) or `HomePage.Focused` (V4) experience. ==== == Home page layout @@ -27,17 +22,18 @@ The SDK provides the xref:HomePage.adoc[homePage] attribute to set the desired h * `homePage: HomePage.Focused` [earlyAccess eaBackground]#Early Access# + Enables the V4 home page experience. * `homePage: HomePage.ModularWithStylingChanges` + -Enables the V3 modular home page experience with customizable components, styling options, and enhanced layout. -* `homePage: HomePage.Modular` + -Enables the basic modular home page experience with customizable components. +Enables the V3 modular home page experience with customizable components, styling options, and enhanced layout. This experience includes charts in the **Watchlist** module that are arranged horizontally. Each chart includes menu actions to remove the KPI charts from the watchlist and create alerts, and allows drag-and-drop reordering. -Both V2 and V3 home page experience show customization modules. The V3 home page experience improves the layout with the following enhancements: +//// +=== V3 home page experience +The V3 home page experience improves the layout with the following enhancements: + +* -* The charts in the **Watchlist** module are arranged horizontally. Each chart includes menu actions to remove the KPI charts from the watchlist and create alerts, and allows drag-and-drop reordering. + [.bordered] [.widthAuto] -image::./images/watchlistv3andv2.png[V2 and V3 Watchlist module] +image::./images/watchlistv3andv2.png[V3 Watchlist module] * The **Trending** module displays separate lists for Liveboards and Answers objects. Both these lists show the objects trending for the last 15 days, or based on the overall views, or both. + [.bordered] @@ -51,6 +47,7 @@ image::./images/favoritesV3.png[V2 and V3 Trending module, scaledwidth=50%] * Style and CSS improvements to the **Learning** module. In both V2 and V3, the SDK allows customization to include or exclude modules, change their order, and adjust the overall layout. +//// [#_enable_focused_home_page] === V4 focused home page experience @@ -79,8 +76,38 @@ const embed = new AppEmbed("#embed", { ---- == Customization settings for home page -The following customization settings are available for the modular home page in the V2 and V3 experience modes. +The following customization settings are available for the modular home page in the V3 and V4 experience modes. + +[width="100%", cols="5,^3,^3"] +[options="header"] +|==== +|Feature |V3 experience + +|`hideHomepageLeftNav` + +Hides the left navigation panel on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|`hiddenHomepageModules` + +Hides specific modules on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|`reorderedHomepageModules` + +Reorders modules on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag redBackground tick]#x# Not supported +|`homePageModules` + +Specifies which modules to show on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag redBackground tick]#x# Not supported +|Left navigation panel customization +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|Custom reordering of left nav items +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|==== + +//// [width="100%", cols="2,2,2,2"] [options='header'] |==== @@ -122,7 +149,7 @@ Hides xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on | [tag greenBackground tick]#✓# Supported |==== -//// + [width="100%", cols="2,2,2,2,2"] [options='header'] |==== @@ -165,16 +192,79 @@ Hides xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on | [tag redBackground tick]#x# Not supported | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| // TODO: verify with engineering — confirm which nav items are available in V4 |==== //// == Control the visibility of home page modules - -In the V2 and V3 experience modes, the home page includes sections such as *Watchlist*, *Favorites*, *Library*, *Trending* charts, and more. You can hide a specific section of the home page and reorder these modules as needed using the xref:AppViewConfig.adoc#_hiddenhomepagemodules[hiddenHomepageModules] and xref:AppViewConfig.adoc#_reorderedhomepagemodules[reorderedHomepageModules] configuration options in the embed SDK. +In the V3 experience mode, the home page includes sections such as *Watchlist*, *Favorites*, *Library*, *Trending* charts, and more. You can hide a specific section of the home page and reorder these modules as needed using the xref:AppViewConfig.adoc#_hiddenhomepagemodules[hiddenHomepageModules] and xref:AppViewConfig.adoc#_reorderedhomepagemodules[reorderedHomepageModules] configuration options in the embed SDK. The `hiddenHomepageModules` and `reorderedHomepageModules` attributes support the following settings: +=== `hiddenHomepageModules` + +[source,TypeScript] +---- +hiddenHomepageModules?: HomepageModule[]; +---- + +Hides specific modules on the home page. Applies to V3 (`HomePage.ModularWithStylingChanges`) and V4 (`HomePage.Focused`) home page experiences. + +// SOURCE: visual-embed-sdk PR #530 — updated note in types.ts JSDoc +// TODO: [WRITER] Confirm which HomepageModule values apply to V4 experience only. + +=== `reorderedHomepageModules` + +[source,TypeScript] +---- +reorderedHomepageModules?: HomepageModule[]; +---- + +Reorders modules on the home page. Applies to V3 (`HomePage.ModularWithStylingChanges`) only. + +// SOURCE: visual-embed-sdk PR #530 +// TODO: [WRITER] Confirm with product team whether reordering is available in V4. + +=== `homePageModules` + +[source,TypeScript] +---- +homePageModules?: HomepageModule[]; +---- + +Specifies which modules to show on the home page. Applies to V3 (`HomePage.ModularWithStylingChanges`) only. + +== `HomepageModule` enum values +[width="100%", cols="3,6"] +[options="header"] +|==== +|Value |Description +|`HomepageModule.Watchlist` |The **Watchlist** module showing pinned objects. +|`HomepageModule.MyLibrary` |The **My Library** module showing user's content. +|`HomepageModule.Learning` |The **Learning** module with onboarding content. +|`HomepageModule.Trending` |The **Trending** module showing trending content. +|`HomepageModule.Answers` |The **Answers** module showing recent Answers. + +|==== + +== `HomeLeftNavItem` enum values + +Use `HomeLeftNavItem` to customize the left navigation panel items on the home page. +Applies to V3 (`HomePage.ModularWithStylingChanges`) and V4 (`HomePage.Focused`) home page experiences. + +[width="100%", cols="3,6"] +[options="header"] +|==== +|Value |Description +|`HomeLeftNavItem.Home` |The Home item in the left navigation panel. +|`HomeLeftNavItem.Liveboards` |The Liveboards item in the left navigation panel. +|`HomeLeftNavItem.Answers` |The Answers item in the left navigation panel. +|`HomeLeftNavItem.SpotIQ` |The SpotIQ item in the left navigation panel. +|`HomeLeftNavItem.MonitorAlerts` |The Monitor Alerts item in the left navigation panel. +|==== + + + +//// [width="100%", cols="2,2,2,2"] [options='header'] |=== @@ -219,6 +309,7 @@ For the **Watchlist** section, which is used for KPI monitoring. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported |=== +//// === Customize home page modules in the V3 experience The following example shows the configuration properties for customizing the home page modules: @@ -254,6 +345,7 @@ const embed = new AppEmbed("#embed", { }); ---- +//// === Customize home page modules in the V2 experience The following example shows the configuration properties for customizing the home page modules in the V2 experience: @@ -282,15 +374,15 @@ The following example shows the configuration properties for customizing the hom //... Other view configuration properties }); ---- - +//// [#_search_experience_on_home_page] === Customize the search experience on home page You can set the search experience on the home page to function as an object search bar that allows finding popular objects, or as an AI search interface that allows natural language queries or Spotter sessions. You can also choose to hide it from the home page. To configure your preference, specify the following values in the `homePageSearchBarMode` attribute. [width="100%", cols="4,8"] -[options='header'] -|===== +[options="header"] +|==== |Search bar mode|Description |`HomePageSearchBarMode.AI_ANSWER` | Sets the natural language search bar that allows queries in natural language. @@ -299,8 +391,7 @@ If Spotter is enabled on your instance, you can use this setting to set the Spot |`HomePageSearchBarMode.NONE` a| Hides the search bar on the home page. Note that it only hides the Search bar on the **Home** page and doesn't affect the Object Search bar visibility on the top navigation bar. To hide the search bar on the home page, you can also use the xref:customize-homepage-full-embed.adoc#_control_the_visibility_of_home_page_modules[homepageModule: HomepageModule.Search] setting. -|| -|===== +|==== [NOTE] ==== @@ -316,15 +407,15 @@ V3 experience:: ---- import { AppEmbed, - PrimaryNavbarVersion // Enum for V3 navigation experience + PrimaryNavbarVersion, // Enum for V3 navigation experience HomePage, // Enum for home page experience settings HomePageSearchBarMode // Import the enum for search bar mode options } from '@thoughtspot/visual-embed-sdk'; const embed = new AppEmbed("#embed", { discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable v3 experience - homePage: HomePage.ModularWithStylingChanges // Enable v3 home page experience + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 experience + homePage: HomePage.ModularWithStylingChanges // Enable V3 home page experience }, // Set the home page search bar to show the Spotter / AI search bar homePageSearchBarMode: HomePageSearchBarMode.AI_ANSWER @@ -332,17 +423,23 @@ const embed = new AppEmbed("#embed", { }); ---- -V2 experience:: + +V4 experience:: [source,javascript] ---- import { AppEmbed, + PrimaryNavbarVersion, // Enum for V3 navigation experience + HomePage, // Enum for home page experience settings HomePageSearchBarMode // Import the enum for search bar mode options } from '@thoughtspot/visual-embed-sdk'; const embed = new AppEmbed("#embed", { - modularHomeExperience: true, // Enable v2 modular home page experience + discoveryExperience: { + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 experience + homePage: HomePage.Focused, // Enable V4 home page experience + }, // Set the home page search bar to show the Spotter / AI search bar homePageSearchBarMode: HomePageSearchBarMode.AI_ANSWER // Other view configuration attributes @@ -350,24 +447,6 @@ const embed = new AppEmbed("#embed", { ---- -Classic (V1) experience:: - -[source,javascript] ----- -import { - AppEmbed, - HomePageSearchBarMode // Import the enum for search bar mode options -} from '@thoughtspot/visual-embed-sdk'; - -const embed = new AppEmbed("#embed", { - // Set the home page search bar to show the Spotter / AI search bar - homePageSearchBarMode: HomePageSearchBarMode.aiAnswer, - // Disable the unified search experience - isUnifiedSearchExperienceEnabled: false, - //... other embed view configuration attributes -}); ----- - //// ==== Enable AI Search To set AI Search as the default search experience on the Home page, use the settings shown in the following examples. diff --git a/modules/ROOT/pages/customize-links.adoc b/modules/ROOT/pages/customize-links.adoc index c4b185f00..310b00311 100644 --- a/modules/ROOT/pages/customize-links.adoc +++ b/modules/ROOT/pages/customize-links.adoc @@ -215,10 +215,9 @@ https://www.mysite.com/{path} == Override ThoughtSpot URLs -Link override settings allow embedded users to redirect native ThoughtSpot URLs to links within their host application. ThoughtSpot supports two Visual Embed SDK configurations for overriding links generated by ThoughtSpot. These settings work the same for multi-tenant ThoughtSpot embedded instances too. - -You can set the `linkOverride` to `true` in the Visual Embed SDK to override the link format of your embedded application pages and navigation links. Once enabled, all links opened in a new tab via the right-click menu will show host application URLs. +Link override settings allow embedded users to redirect native ThoughtSpot URLs to links within their host application. ThoughtSpot supports Visual Embed SDK configurations for overriding links generated by ThoughtSpot. These settings work the same for multi-tenant ThoughtSpot embedded instances too. +Set `enableLinkOverridesV2` to `true` in the Visual Embed SDK. Once enabled, all links will display host application URLs when hovered over or opened in a new tab. ThoughtSpot recommends using this enhanced configuration for your link override settings. [source,JavaScript] ---- @@ -229,12 +228,13 @@ const appEmbed = new AppEmbed(document.getElementById('ts-embed'), { }, pageId: Page.Home, showPrimaryNavbar: true, - linkOverride: true, + enableLinkOverridesV2: true, }); appEmbed.render(); ---- -Set `enableLinkOverridesV2` to `true` in the Visual Embed SDK. Once enabled, all links will display host application URLs when hovered over or opened in a new tab. ThoughtSpot recommends using this enhanced configuration for you link override settings. +If your ThoughtSpot instance uses the `linkOverride` in the Visual Embed SDK to override the link format of your embedded application pages and navigation links, this flag now gets auto-upgraded to `enableLinkOverridesV2` to ensure consistent link-override behavior. + [source,JavaScript] ---- @@ -245,10 +245,12 @@ const appEmbed = new AppEmbed(document.getElementById('ts-embed'), { }, pageId: Page.Home, showPrimaryNavbar: true, - enableLinkOverridesV2: true, + linkOverride: true, }); appEmbed.render(); ---- +[NOTE] +The `disableRedirectionLinksInNewTab` overrides these flags. When set to `true`, the link override settings will not work. == Verify system-generated links diff --git a/modules/ROOT/pages/customize-nav-full-embed.adoc b/modules/ROOT/pages/customize-nav-full-embed.adoc index cb4b45ceb..b90c71995 100644 --- a/modules/ROOT/pages/customize-nav-full-embed.adoc +++ b/modules/ROOT/pages/customize-nav-full-embed.adoc @@ -8,44 +8,24 @@ You can customize the navigation experience and the visibility of navigation menu elements using the Visual Embed SDK. -[div announcementBlock] --- [IMPORTANT] -The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. --- +==== +The classic V1 and V2 navigation and homepage experience modes are deprecated as of ThoughtSpot Cloud 26.8.0.cl. Starting from this release, all embedded sessions render in the V3 navigation experience by default. +==== == Navigation experience -The navigation structure in ThoughtSpot UI varies based on the UI experience mode set in your embed view. - -[width="100%", cols="2,4"] -[options='header'] -|==== -|UI experience| Navigation options -|Classic (V1) experience a|A standard top navigation bar with the following components: + +Both V3 and V4 experience provide the following navigation experience: -* A horizontal application menu -* Help and user profile icons -* Org switcher - -|V2 experience a| -* Simplified top navigation structure. Includes the following components: + -** Object search bar -** The application selector to switch between different application contexts -** Help and profile icons -** Org switcher for instances with Orgs -* A left navigation panel for each application context. -|V3 experience -a| * Top navigation bar with a modern look and feel. Includes the following components: ** A hamburger icon for the sliding navigation overlay ** Object search bar -** Help and profile icons + +** Help and profile icons ** Org switcher * Left navigation ** A sliding left navigation panel controlled via the hamburger icon ** Persona-based app selection icons in the panel header ** Left navigation menu that adjusts its contents according to the application context -|==== + [NOTE] ==== @@ -56,58 +36,52 @@ The V4 focused home page experience (`HomePage.Focused`) uses the same navigatio The following customization settings are available for the top navigation bar. -[width="100%", cols="2,2,2,2"] -[options='header'] +[width="100%", cols="3,^2,^2"] +[options="header"] |==== | SDK property -| Classic (V1) experience -| V2 experience -| V3 experience -|`showPrimaryNavbar` + +| V3 experience + +`HomePage.ModularWithStylingChanges` +| V4 experience + +`HomePage.Focused` + +| `showPrimaryNavbar` + To show or hide the navigation experience. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| [tag greenBackground tick]#✓# Supported - | `hideApplicationSwitcher` + To show or hide the application switcher. -| [tag redBackground tick]#x# Not supported | [tag greenBackground tick]#✓# Supported + -In V2 experience, hides the app selector in the top navigation bar. +Hides the app selection icons on the left navigation panel. | [tag greenBackground tick]#✓# Supported + -In the V3 experience, hides the app selection icons on the left navigation panel. +Hides the app selection icons on the left navigation panel. | `disableProfileAndHelp` + -To show or hide the help and user profile icons in top navigation bar. -| [tag greenBackground tick]#✓# Supported +To show or hide the help and user profile icons in the top navigation bar. | [tag greenBackground tick]#✓# Supported + Also hides or shows the *Help* menu on the left navigation panel of the home page. -| [tag greenBackground tick]#✓# Supported + +| [tag greenBackground tick]#✓# Supported | `hideOrgSwitcher` + To show or hide the Org switcher. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| [tag greenBackground tick]#✓# Supported | `hideNotification` + To show or hide the notification (bell) icon. -| [tag redBackground tick]#x# Not supported -| [tag redBackground tick]#x# Not supported +| [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `hideObjectSearch` + To show or hide the object search bar in the top navigation bar. -| __Not applicable__ + -The object search bar is hidden by default. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `hideHamburger` + To show or hide the hamburger icon in the top navigation bar. -| __Not applicable__ -| __Not applicable__ | [tag greenBackground tick]#✓# Supported + -Hides the hamburger icon available on pages where the left navigation panel is hidden by default. +Hides the hamburger icon available on pages where the left navigation +panel is hidden by default. +| [tag greenBackground tick]#✓# Supported |==== === Example @@ -117,15 +91,11 @@ The following example hides the icons in the top navigation and the application [source,JavaScript] ---- const embed = new AppEmbed("#embed", { - //... V3 experience attributes - // Show navigation bar + //... V3 experience attributes showPrimaryNavbar: true, hideApplicationSwitcher: true, - // Hide Help and User Profile icons in top navigation disableProfileAndHelp: true, - // Hide object search bar in top navigation hideObjectSearch: true, - // Hide the alert icon in top navigation hideNotification: true, //... other attributes }); @@ -135,161 +105,89 @@ const embed = new AppEmbed("#embed", { In ThoughtSpot application, users can open the link:https://docs.thoughtspot.com/cloud/latest/thoughtspot-homepage#command-palette[command palette] by pressing kbd:[Cmd+K] on macOS or kbd:[Ctrl+K] on Windows to quickly navigate to objects and perform actions. However, when you embed ThoughtSpot, this feature is disabled and embedded pages include only the standard object search experience. == Customize the left navigation panel on the home page -In the V2 and V3 experience modes, the left navigation panel on the *Insights* > *Home* page includes menu items such as *Answers*, *Liveboards*, *SpotIQ Analysis*, *Monitor Subscriptions*, and more. You can hide this navigation panel by setting the `hideHomepageLeftNav` property to `true` in the SDK. Note that this attribute hides the left navigation only on the home page. +In the V3 and V4 experience modes, the left navigation panel on the *Insights* > *Home* page includes menu items such as *Spotter*, *Answers*, *Liveboards*, *SpotIQ Analysis*, *Monitor Subscriptions*, and more. You can hide this navigation panel by setting the `hideHomepageLeftNav` property to `true` in the SDK. Note that this attribute hides the left navigation only on the home page. If you want to include the left navigation, but hide only a specific section in the *Insights* panel, use the `hiddenHomeLeftNavItems` property and specify the menu items to hide. The allowed values for `hiddenHomeLeftNavItems` are listed in the following table: -[width="100%", cols="2,2,2,2"] -[options='header'] - -|=== -|Allowed values -| Classic (V1) experience -| V2 experience -| V3 experience +[width="100%", cols="3,^2,^2"] +[options="header"] +|==== +| Allowed values +| V3 experience + +`HomePage.ModularWithStylingChanges` +| V4 experience + +`HomePage.Focused` | `HomeLeftNavItem.Create` + -To show or hide the `+` icon that allows users to create a Liveboard or Answer in the *Insights* panel. -| __Not applicable__ -| __Not applicable__ +To show or hide the `+` icon that allows users to create a +Liveboard or Answer in the *Insights* panel. +| [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Home` + To show or hide the *Home* menu in the *Insights* panel. -| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported + | `HomeLeftNavItem.Spotter` + -To show or hide the *Spotter* menu item in the *Insights* panel. -| __Not applicable__ -| __Not applicable__ +To show or hide the *Spotter* menu item in the *Insights* panel. +| [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.SearchData` + To show or hide the *Search Data* in the *Insights* panel. -| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Liveboards` + To show or hide the *Liveboards* menu in the *Insights* panel. -| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Answers` + To show or hide the *Answers* menu in the *Insights* panel. -| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| `HomeLeftNavItem.LiveboardSchedules` + -To show or hide the *Liveboard Schedules* menu in the *Insights* panel. -| __Not applicable__ +| `HomeLeftNavItem.MonitorAlerts` + +To show or hide the *Monitor* > *Alerts* menu in the *Insights* panel. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| `HomeLeftNavItem.MonitorSubscription` + -To show or hide the *Monitor subscriptions* in the *Insights* panel. -| __Not applicable__ -| [tag greenBackground tick]#✓# Supported -| [tag greenBackground tick]#✓# Supported -| `HomeLeftNavItem.SpotIQAnalysis` + -To show or hide the *SpotIQ analyses* in the *Insights* panel. -| __Not applicable__ +| `HomeLeftNavItem.MonitorSubscriptions` + +To show or hide the *Monitor* > *Subscriptions* menu in the +*Insights* panel. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported -| `HomeLeftNavItem.Favorites` + -To show or hide the `Favorites` section in the *Insights* panel. -| __Not applicable__ -| __Not applicable__ -| [tag greenBackground tick]#✓# Supported -|=== -== Examples -The following sections show code samples for customizing the default left navigation panel in the *Insights* section and the home page. - -=== V3 experience - -[source,JavaScript] ----- -import { - AppEmbed, // Main class to embed the full ThoughtSpot app - HomePage, // Enum for home page experience setting - PrimaryNavbarVersion, // Enum for navigation bar version - HomeLeftNavItem, // Enum for left navigation items -} from '@thoughtspot/visual-embed-sdk'; - -const embed = new AppEmbed("#embed", { - discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation - homePage: HomePage.ModularWithStylingChanges, // Enable V3 modular home page - }, - // Show navigation bar - showPrimaryNavbar: true, - // Show left navigation on home page - hideHomepageLeftNav: false, - // Hide SpotIQ analysis and Favorites menu options - hiddenHomeLeftNavItems: [ - HomeLeftNavItem.Favorites, - HomeLeftNavItem.SpotIQAnalysis - ], - //... other embed view configuration attributes -}); ----- - -=== V2 experience +| `HomeLeftNavItem.SpotIQAnalysis` + +To show or hide the *SpotIQ Analysis* menu in the *Insights* panel. +| [tag greenBackground tick]#✓# Supported +| [tag redBackground tick]#x# Not supported -[source,JavaScript] ----- -import { - AppEmbed, // Main class to embed the full ThoughtSpot app - HomeLeftNavItem, // Enum for left navigation items -} from '@thoughtspot/visual-embed-sdk'; -const embed = new AppEmbed("#embed", { - // Enable the V2 navigation experience - modularHomeExperience: true, - // Show left navigation panel - hideHomepageLeftNav: false, - // Hide SpotIQ analysis and Monitor subscriptions menu options - hiddenHomeLeftNavItems: [ - HomeLeftNavItem.MonitorSubscription, - HomeLeftNavItem.SpotIQAnalysis - ], - //... other embed view configuration attributes -}); ----- - -== Customize the Help menu +| `HomeLeftNavItem.Learning` + +To show or hide the *Learning* menu in the *Insights* panel. +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported -If you want to include the help menu and link:https://docs.thoughtspot.com/cloud/latest/customize-help[add custom links, window=_blank] to it, ensure that the top navigation bar is visible and `disableProfileAndHelp` is set to `false`. -By default, the help menu in the embedded view shows the legacy information center controlled using Pendo. To enable the new information center and add custom links, set `enablePendoHelp` to `false`. +| `HomeLeftNavItem.LiveboardSchedules` + +To show or hide the *Scheduled Liveboards* section in the +*Insights* panel. +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported -To add custom links to the help menu, use the customization options in the **Admin settings** > **Help customization** page. For more information, refer to the link:https://docs.thoughtspot.com/cloud/latest/customize-help[ThoughtSpot Product Documentation]. +|==== -[source,JavaScript] ----- -const embed = new AppEmbed("#embed", { - // Display the top navigation bar - showPrimaryNavbar: true, - // Show the profile and help icons in the top navigation bar. - disableProfileAndHelp: false, - // Use the new ThoughtSpot information center for help and support. - enablePendoHelp: false, - //... other embed view configuration attributes -}); ----- -== Additional resources -See also: +== Related resources -* xref:full-app-customize.adoc[Customize full application embed] -* xref:full-embed.adoc[Embed full application] +* xref:full-app-customize.adoc[Customize full application embedding] +* xref:customize-homepage-full-embed.adoc[Customize home page experience] * xref:AppViewConfig.adoc[AppViewConfig reference page] * xref:HostEvent.adoc[Host events] * xref:EmbedEvent.adoc[Embed Events] diff --git a/modules/ROOT/pages/customize-spotter-embed.adoc b/modules/ROOT/pages/customize-spotter-embed.adoc new file mode 100644 index 000000000..4dc6ed070 --- /dev/null +++ b/modules/ROOT/pages/customize-spotter-embed.adoc @@ -0,0 +1,370 @@ += Customizing the Spotter embed view +:toc: true +:toclevels: 2 + +:page-title: Customizing the Spotter embed view +:page-pageid: customize-spotter-embed +:page-description: You can customize the SpotterEmbed experience using the customization options available in the Visual Embed SDK. + +When you xref:embed-spotter.adoc[embed Spotter] in your application, you'll notice that the embedded component loads an initial page with a prompt interface. The look and feel of this page vary depending on the Spotter version used for embedding. + +== Spotter UI +If you have embedded Spotter Classic or Spotter 2, the initial page includes a prompt bar for user input, a data source selector, and the UI options to preview data and reset a Spotter session. + +== Spotter 3 experience +Spotter 3 experience is available with a new prompt interface that includes additional features and user elements to enrich your Spotter experience. + +To enable the new chat interface in your embed, set the `updatedSpotterChatPrompt` attribute: + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed configuration attributes + // Enable the updated Spotter chat prompt experience. + updatedSpotterChatPrompt: true, +}); +---- + +[.widthAuto] +[.bordered] +image::./images/spotter3-new-interface.png[Spotter 3 new interface] + +=== Spotter classic and Spotter 2 + +[.widthAuto] +[.bordered] +image::./images/spotter-embed-legacy.png[Spotter embed] + +You can load the page with a pre-selected data source or use the *Auto mode* to allow Spotter to automatically discover and select a relevant data model for user queries. + +**Default view**: + +[.widthAuto] +[.bordered] +image::./images/spotter3-legacy-interface.png[Spotter 3 interface] + +**With Auto mode enabled**: + +[.widthAuto] +[.bordered] +image::./images/spotter3-leagcy-interface-automode.png[Spotter 3 interface] + +[NOTE] +==== +When Auto mode is enabled, **Preview data** and **Data Model instructions** options will not be available. +==== + +=== Chat history panel +You can also include the *Chat history* panel to allow your users to access the chat history from their previous sessions. To enable and customize the chat history sidebar, configure the chat history properties in the `spotterSidebarConfig` object: + +[source,JavaScript] +---- +import { + SpotterEmbed, + SpotterEmbedViewConfig, + SpotterSidebarViewConfig +} from '@thoughtspot/visual-embed-sdk'; + +const embed = new SpotterEmbed('#tsEmbed', { + // ...other embed view configuration options + // Configuration for the Spotter sidebar UI + spotterSidebarConfig: { + enablePastConversationsSidebar: true, // Enable the chat history sidebar + spotterSidebarDefaultExpanded: true, // Expand the sidebar by default + spotterSidebarTitle: 'Chat History', // Custom sidebar header text + spotterNewChatButtonTitle: 'New Conversation', // Custom label for the New chat button + spotterChatRenameLabel: 'Rename session', // Custom label for the Rename action + spotterChatDeleteLabel: 'Delete session', // Custom label for the Delete action + spotterConversationsBatchSize: 20, // Conversations fetched per batch (default: 30) + spotterDocumentationUrl: 'https://your-help-center-url', // Custom best practices link + }, +}) +---- + +[NOTE] +==== +The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` is deprecated from Visual Embed SDK v1.47.0. Use the `enablePastConversationsSidebar` property within the `spotterSidebarConfig` object instead. When both properties are defined, the value in `spotterSidebarConfig` takes precedence. +==== + +== Spotter Analysts +ThoughtSpot allows users to create and manage AI agents (Analysts) directly within the Spotter interface. These AI agents or bots are referred to as link:https://docs.thoughtspot.com/cloud/latest/spotter-analysts[Spotter Analysts, window=_blank]. Each Analyst is scoped to a data model and can be configured with custom instructions, personas, and conversation starters. + +If you have Spotter Analysts on your ThoughtSpot instance, you can make these available to your embedding application users. + +=== Spotter Analyst panel +If your ThoughtSpot instance has Spotter Analysts, the Spotter Analysts panel and dashboard are visible by default in the Spotter sidebar in the embed view. To control the visibility of this panel in the embed view, use the `SpotterAnalystSidebar` action ID in the `disabledActions`, `hiddenActions`, or `visibleActions` arrays as needed. + +If Spotter Analysts are enabled in the embed view, you can use the following action IDs to show or hide the menu actions: + +* `Action.CreateAnalyst` + +Action ID for the **Create new** action in the Spotter Analysts page. +* `Action.EditAnalyst` + +Action ID for the Analyst edit option. +* `Action.CopyAnalyst` + +Action ID for the *Make a copy* action that creates a copy of the Analyst. +* `Action.ShareAnalyst` + +Action ID for the share action that allows sharing an Analyst with other users. +* `Action.DeleteAnalyst` + +Action ID for the delete option. + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + hiddenActions: [ + Action.CreateAnalyst, + Action.DeleteAnalyst, + ], +}); +---- + +=== Analysts label strings +Use `spotterAnalystLabel` and `spotterAnalystsLabel` to replace the default "Analyst" and "Analysts" label text in the embedded Spotter interface with custom terminology suited to your application: + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + // Custom label for a single Analyst (default: "Analyst") + spotterAnalystLabel: 'AI Assistant', + // Custom label for the Analysts section heading (default: "Analysts") + spotterAnalystsLabel: 'AI Assistants', +}); +---- + +== Quick search and deep analysis mode +When Spotter 3 experience is enabled on a ThoughtSpot instance, the Spotter interface displays a switcher to toggle between the Quick Search and Deep Analysis modes. + +To show, hide, or disable this feature in the embedded view, use the action ID, +`Action.SpotterChatModeSwitcher`. + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + hiddenActions: [ + Action.SpotterChatModeSwitcher, + ], +}); +---- + +== Spotter starter prompts +ThoughtSpot allows users to preselect prompts and display these prompts in the Spotter interface for quick analysis. This feature is disabled by default in the embedded view. To enable this feature, contact ThoughtSpot Support. + +When this feature is enabled on your instance, you can use the `enableStarterPrompts` property in the `spotterChatConfig` object to display the starter prompts to your embedding application users. These prompts appear below the search bar when the users open the Spotter embedded view. + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + spotterChatConfig: { + enableStarterPrompts: true, + }, +}); +---- + +[#mcp-connectors] +== MCP connectors and resource selection icon +If the Spotter 3 interface is enabled, the Spotter page displays the following options to connect external tools and resources for AI analytics. + +* Connector icon that allows you to connect to external applications such as Google Drive, Slack, Notion, Confluence, or Jira, which can be used as a data source in Spotter sessions. These connectors must be preconfigured by your ThoughtSpot administrator for your embedding deployments. +* Add files (+) icon for uploading files and resources for setting the conversation context. +* **Connectors** menu with a `+` icon in the prompt panel that lets your application users connect to external tools and resources. + +These integrations allow users to include both structured and unstructured data in their conversation sessions. + +To show, hide, or disable these options, use the following action IDs in the `disabledActions`, `hiddenActions`, or `visibleActions` arrays as needed: + +* `Action.SpotterChatConnectors` for the Connectors list. +* `Action.SpotterChatConnectorResources` for the connector resources section. + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + hiddenActions: [ + Action.SpotterChatConnectors, + Action.SpotterChatConnectorResources, + ], +}); +spotterEmbed.render(); +---- + +[#fileUpload] +== File uploads in Spotter chats +To enable file uploads in the Spotter chat panel: + +. Ensure that `spotterFileUploadEnabled` is set to `true` in the `spotterChatConfig` object. This setting enables the **+ Add files** option in the Spotter chat panel. +. Optionally, you can restrict the types of files users can upload by specifying the file types in the `spotterFileUploadFileTypes` array. If no file format is specified, all supported file types are allowed for uploads. + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + //... + spotterChatConfig: { + spotterFileUploadEnabled: true, + spotterFileUploadFileTypes: ['pdf', 'png', 'xlsx'], + }, +}); +---- + +//// +For earlier SDK versions, you can use CSS selectors as a workaround: + +[source,JavaScript] +---- +init({ + thoughtSpotHost: 'https://your-thoughtspot-host', // URL of your ThoughtSpot instance + authType: AuthType.None, // Authentication type; use appropriate AuthType for your environment + customizations: { + style: { + customCSS: { + rules_UNSTABLE: { + // Hide the MCP connectors module in the Spotter prompt panel + ".button-module__buttonWrapper.chat-connector-resources-module__addConnectorResourceButton": { + "display": "none !important" + }, + // Hide the add resources (+) icon in the Spotter prompt panel + "button.button-module__button.button-module__buttonWithIcon.button-module__tertiary.button-module__sizeM.button-module__backgroundLight.button-module__both": { + "display": "none !important" + } + } + } + } + }, + // ...other configuration attributes +}); +---- +//// + +== Spotter icon customization +To override an icon, you must find the ID of the icon, create an SVG file to replace this icon, and add the SVG hosting URL to your embed customization code. The most common icon to override is the default Spotter icon and its icon ID is `rd-icon-spotter`. + +The following example uses the link:https://github.com/thoughtspot/custom-css-demo/blob/main/alternate-spotter-icon.svg[alternate-spotter-icon.svg, window=_blank] file hosted on `\https://cdn.jsdelivr.net/` to override the Spotter icon. + +[source,JavaScript] +---- + init({ + //... + customizations: { + // Specify the SVG hosting URL to override the icon, for example Spotter (`rd-icon-spotter`) icon + iconSpriteUrl: "https://cdn.jsdelivr.net/gh/thoughtspot/custom-css-demo/alternate-spotter-icon.svg" + } + }); +---- + +The following figures show the customized Spotter icon: +[.widthAuto] +[.bordered] +image::./images/spotter-icon-customization.png[Spotter icon customization] + +== Spotter logo and ThoughtSpot branding label +To hide the Spotter logo and branding in the chat interface and tool response, use the following `SpotterChatViewConfig` object properties: + +* `hideToolResponseCardBranding` + +When set to `true`, hides the ThoughtSpot logo and icon in tool response cards. The branding label prefix is controlled separately via `toolResponseCardBrandingLabel`. + +* `toolResponseCardBrandingLabel` + +Custom label to replace the `ThoughtSpot` prefix in tool response cards. Set to an empty string (`''`) to hide the prefix entirely. + +Example:: ++ +[source,JavaScript] +---- +import { + SpotterEmbed, + SpotterEmbedViewConfig, + SpotterChatViewConfig +} from '@thoughtspot/visual-embed-sdk'; + +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ...other embed view configuration options + spotterChatConfig: { + // Hide the default logo and label on tool response cards in Spotter chat UI + hideToolResponseCardBranding: true, + // Set a custom label to display as the branding on tool response cards + toolResponseCardBrandingLabel: 'CompanyName', + }, +}); +---- + +== Styles and interface elements +The Visual Embed SDK provides a comprehensive style customization framework for overriding icons, text strings, and the appearance of UI elements. + +The `customizations` object allows you to add custom CSS definitions, replace text strings, and override icons. If your customization framework uses external sources or hosting servers, ensure they are added to the CSP allowlist. For more information, see the xref:css-customization.adoc[CSS customization framework], xref:customize-text-strings.adoc[Customize text strings], and xref:customize-icons.adoc[Customize icons] sections. + +[#SpotterCSS] +=== CSS variables for style customization +You can customize the background color of the conversation and prompt panels, button elements, and the components of the charts generated by Spotter using xref:customize-css-styles.adoc[CSS variables]. + +If Theme Builder is enabled on your ThoughtSpot instance, you can find the variables for Spotter customization by navigating to *Develop* > *Customizations* > *Theme Builder* in the ThoughtSpot UI and downloading the CSS variables. + +[source,JavaScript] +---- +// Initialize the SDK with CSS variables with custom style definitions +init({ + // ... + customizations: { + style: { + // Use CSS variables to customize styles + customCSS: { + variables: { + "--ts-var-button--primary-background": "#008000", + "--ts-var-spotter-prompt-background": "#F0EBFF", + "--ts-var-root-color": "#E3D9FC", + "--ts-var-root-background": "#F7F5FF", + }, + }, + }, + }, +}); +---- + +=== Text string customization +To replace text strings, you can use the `stringIDs` and `strings` properties in the content customization object. + +The following example shows how to replace "Spotter" and other text strings on the Spotter interface. + +[source,JavaScript] +---- +// Initialize the SDK with custom text string replacements +init({ + // ... + customizations: { + content: { + // Use the strings object to replace the visible UI text with custom labels. + strings: { + // Change all instances of "Preview data" to "Show data" + "Preview data": "Show data", + // Change all instances of "Spotter" to "dataAnalyzer" + "Spotter": "dataAnalyzer", + } + } + } +}); +---- + +[#spotterMenuActions] +=== Menu elements and action visibility +The SDK provides action IDs to disable, show, or hide the following elements and menu actions via `disabledActions`, `visibleActions`, or `hiddenActions` arrays. + +For example, you can hide the *Preview data*, *Reset* in the prompt panel, or *Pin*, *Download*, and other actions from a Spotter-generated response. + +The following code sample disables actions and menu elements using the xref:embed-actions.adoc[`disabledActions`] array: + +[source,JavaScript] +---- + // Hide these actions + hiddenActions: [Action.Pin,Action.ResetSpotterChat,Action.DeletePreviousPrompt], + // Disable actions + disabledActions:[Action.PreviewDataSpotter,Action.Edit], + disabledActionReason: "Contact your administrator to enable this feature" +---- +For a comprehensive list of supported actions, see xref:Action.adoc[Spotter menu actions]. + +== Additional resources +* xref:embed-ai-analytics.adoc[Spotter features and embedding options] +* link:https://developers.thoughtspot.com/docs/Class_SpotterEmbed[SpotterEmbed classes and methods] +* link:https://developers.thoughtspot.com/docs/Interface_SpotterEmbedViewConfig[Configuration options for Spotter interface customization] +* link:https://github.com/thoughtspot/developer-examples/tree/main/visual-embed/spotter/spotter-embed[Developer examples, window=_blank] +* link:https://docs.thoughtspot.com/cloud/latest/spotter[Spotter Product Documentation] diff --git a/modules/ROOT/pages/customize-style.adoc b/modules/ROOT/pages/customize-style.adoc index 45798283f..8f9d7c374 100644 --- a/modules/ROOT/pages/customize-style.adoc +++ b/modules/ROOT/pages/customize-style.adoc @@ -6,7 +6,7 @@ :page-pageid: customize-style :page-description: Rebrand embedded ThoughtSpot content -If you want to match the look and feel of embedded ThoughtSpot content with your core application, you can customize the ThoughtSpot application UI elements. Using style customization, you can create a uniform ThoughtSpot experience that complies with your company’s branding guidelines. +If you want to match the look and feel of embedded ThoughtSpot content with your core application, you can customize the ThoughtSpot application UI elements. Using style customization, you can create a uniform ThoughtSpot experience that complies with your company's branding guidelines. You can rebrand the ThoughtSpot interface elements such as the application logo, background color, and color scheme of visualizations. [NOTE] @@ -68,13 +68,16 @@ image::./images/style-applogo.png[Default Application Logo] + image::./images/style-widelogo.png[Wide application logo] ++ +// SOURCE: SCAL-319679 (doc task: SCAL-323307) — engineering commit 821c07db scaligent #64156 +// CHANGE: Updated wide logo recommended size from 330px by 100px to 250px by 50px (5:1 ratio) +// Effective from: ThoughtSpot Cloud 26.8.0.cl + [NOTE] ==== * The application logo (wide) appears on the login screen. - -* The recommended size is 330px by 100px. This will allow the system to preserve the aspect ratio of the uploaded logo image and prevent distortion. - +* The recommended size is 250px by 50px (5:1 aspect ratio). This allows the system to preserve the aspect ratio of the uploaded logo image and prevent distortion. +* The wide logo dimensions have changed in ThoughtSpot Cloud 26.8.0.cl and later versions. If you previously uploaded a logo sized at 330px by 100px, re-upload your logo at 250px by 50px to ensure it displays correctly on the login screen without distortion. * The accepted file formats for the logo image are jpg, jpeg, and png. ==== @@ -181,67 +184,42 @@ To change the color palette for charts: . To access the ThoughtSpot Developer portal, click *Develop* . Under *Customizations*, click *Styles*. -. Click the background color box under *Chart Color Palettes*. -. Click the color you would like to change in the *primary* color palette, and use the color menu to choose your new color. +. Click the color box under *Chart Color Palettes*. + -You can also add a HEX color code. -. Click the color you would like to change in the *secondary* color palette, and use the color menu to choose your new color. -You can also add a HEX color code. -+ -The colors from the secondary color palette are used after all of the primary colors from the primary palette have been exhausted. -Therefore, the secondary palette usually consists of secondary colors. - -=== Configure color rotation +image::./images/chart-colors.png[Chart Color Palettes] -If the chart requires only one color, ThoughtSpot selects a primary color depending on whether you enabled color rotation. The *Color rotation* feature determines whether single-color charts use a random primary color or always use the first primary color in the palette. If you enable Color Rotation, ThoughtSpot picks colors randomly and may choose any color from Primary 1 through Primary 6 in your color palette for single-color charts. If you disable Color Rotation, ThoughtSpot always chooses Primary 1. +. To choose a primary color, click the color box. ++ +image::./images/select-color.png[Select Primary Color] -If you disable color rotation, ThoughtSpot generates single-color charts in the order of your color palette, left to right. +. You can also add a HEX color code. +. To add more colors, click *Add Color*. +. To reset your chart colors to the ThoughtSpot default, click *Reset*. [#footer-text] == Customize footer text -You can customize the footer text in your ThoughtSpot instance to add your company-specific message. -To customize or rebrand the footer text, follow these steps: +You can add custom footer text to the ThoughtSpot UI. + +To customize footer text: . To access the ThoughtSpot Developer portal, click *Develop* . Under *Customizations*, click *Styles*. -. Click the text box under *Footer text* and enter the message. -+ -Your custom message will appear in the footer. - -//// -. Add `?customBrandingEnabled=true` to your application URL as shown in the following examples: -+ ----- -https://{ThoughtSpot-Host}/?customBrandingEnabled=true/#/ ----- -+ ----- -https://{ThoughtSpot-Host}/?customBrandingEnabled=true/#/pinboards ----- -. Go to *Admin* > *Application settings* > *Style customization* or *Develop* > *Customizations* > *Styles*. -+ -You require administrator or developer privilege to apply custom styles and footer text. -. Click the text box under *Footer text* and enter the message. -+ -Your custom message will appear in the footer. -. To enable footer text customization on your cluster by default, contact ThoughtSpot Support. -//// +. Add the footer text in the *Footer Text* box. -//// [#page-title] == Customize page title -To customize the page title displayed in the browser bar: +You can customize the page title that appears in the browser tab. + +To customize the page title: . To access the ThoughtSpot Developer portal, click *Develop* . Under *Customizations*, click *Styles*. -. Click the text box under *Page title*. -. Enter your new text message. -//// - -== Reset styles +. Add the page title in the *Page Title* box. -When you customize styles, the changes take effect after you refresh the browser. +== Related resources -To revert your changes, use the *Reset* button that appears when you move your cursor to the right of the style setting option. +* link:https://docs.thoughtspot.com/cloud/latest/style-customization[Style Customization in ThoughtSpot, window=_blank] +* xref:embed-liveboard.adoc[Embed Liveboards] +* xref:full-app-customize.adoc[Customize the full application] diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index b95b51895..f32d57f79 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -245,7 +245,7 @@ The default `file_format` is *CSV*. If you do not have .csv downloads enabled for your ThoughtSpot instance, select either `PDF` or `PNG` `file_format` to successfully download the report. Using any other format will cause the API to return an error. -For *CSV* downloads [earlyAccess eaBackground]#Early Access#, +For *CSV* downloads, * Each visualization is exported as a separate .csv file. * If multiple visualizations are selected, the downloaded report is a single compressed .zip file containing all .CSV files. @@ -269,14 +269,14 @@ curl -X POST \ }' ---- -For *XLSX* downloads [earlyAccess eaBackground]#Early Access#, +For *XLSX* downloads, * Visualization is exported as an Excel workbook (.xlsx). * If multiple visualizations are selected, the downloaded report is a single Excel workbook (.xlsx) containing each visualization in their individual tab. * A maximum of 255 tabs per .xlsx workbook are allowed. * It does not support any additional parameters to customize the page orientation and `include_cover_page`, `include_filter_page`, logo, footer text, and page numbers. * Charts are exported as tabular data. Downloaded reports may include columns not seen in the visualization if they were used as tokens in the underlying search query. -* New pivot tables generated in .xlsx workbooks using this API endpoint retain their complete visual formatting and structural integrity. To enable this on your ThoughtSpot instance, contact ThoughtSpot Support. +* New pivot tables generated in .xlsx workbooks using this API endpoint retain their complete visual formatting and structural integrity. ===== Sample API payload for XLSX downloads @@ -299,12 +299,11 @@ For *PDF* downloads, you can specify additional parameters to customize the page You can now also download continuous pdfs which matches the full length of your Liveboard, without breaking them into multiple A4 pages. -* `page_size = CONTINUOUS` [beta betaBackground]^Beta^ Unlike the A4 format, which introduces forced page breaks between visualizations, this continuous flow maintains your exact design and intended layout. +* `page_size = CONTINUOUS` Unlike the A4 format, which introduces forced page breaks between visualizations, this continuous flow maintains your exact design and intended layout. + When `page_size = CONTINUOUS`, the `include_filter_page` option works to show/hide the filter section in the PDF page (in a continuous PDF, there is no separate filter page, but the filters are included on the same page at the top). -* `zoom_level` [beta betaBackground]^Beta^ offers various download size options to suit the viewer's screen dimensions, thereby enhancing legibility. This can be set only when `page_size = CONTINUOUS`. Valid values are integers in the range of 45 and 175. +* `zoom_level` offers various download size options to suit the viewer's screen dimensions, thereby enhancing legibility. This can be set only when `page_size = CONTINUOUS`. Valid values are integers in the range of 45 and 175. -To enable this on your ThoughtSpot instance, contact ThoughtSpot Support. ===== Sample API payload for PDF downloads @@ -335,11 +334,9 @@ curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/report/liveboard' \ For *PNG* downloads, you can now define -* `image_resolution` [earlyAccess eaBackground]#Early Access# -* `image_scale` [earlyAccess eaBackground]#Early Access# -* `include_header` [earlyAccess eaBackground]#Early Access# - -Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. +* `image_resolution` +* `image_scale` +* `include_header` [IMPORTANT] ==== diff --git a/modules/ROOT/pages/developer-playground.adoc b/modules/ROOT/pages/developer-playground.adoc index ae6544fd9..7d80036f4 100644 --- a/modules/ROOT/pages/developer-playground.adoc +++ b/modules/ROOT/pages/developer-playground.adoc @@ -442,6 +442,7 @@ To open SpotterCode in the Playground: . Click *SpotterCode* on the right side of the Playground to open the panel. + The SpotterCode panel opens on the right. The header shows *SpotterCode* on the left and a collapse/expand control on the right. + === Quick starter prompts The SpotterCode panel displays a set of quick starter prompts for each embed component by default. diff --git a/modules/ROOT/pages/embed-pinboard.adoc b/modules/ROOT/pages/embed-pinboard.adoc index 131108899..acabc5b2a 100644 --- a/modules/ROOT/pages/embed-pinboard.adoc +++ b/modules/ROOT/pages/embed-pinboard.adoc @@ -10,6 +10,7 @@ This page explains how to embed a ThoughtSpot Liveboard in your web page, portal A ThoughtSpot Liveboard is an interactive dashboard that presents a collection of visualizations pinned by a user. + == Import the LiveboardEmbed package Import the `LiveboardEmbed` SDK library to your application environment: @@ -209,20 +210,17 @@ image::./images/liveboard-refresh.png[Liveboard refresh] The Visual Embed SDK also provides the following action IDs and events to customize the cache refresh visibility and workflow. -[width="100%",cols="2,1,4"] +[width="100%",cols="2,4"] |==== -|API | Description +|ID | Description -|`Action.RefreshLiveboardBrowserCache` -|xref:Action.adoc#_refreshliveboardbrowsercache[Action] +|xref:Action.adoc#_refreshliveboardbrowsercache[Action.RefreshLiveboardBrowserCache] |Action ID to show, hide, or disable the *Refresh* button in the Liveboard header. -|`EmbedEvent.RefreshLiveboardBrowserCache` -|xref:EmbedEvent.adoc#_refreshliveboardbrowsercache[EmbedEvent] +|xref:EmbedEvent.adoc#_refreshliveboardbrowsercache[EmbedEvent.RefreshLiveboardBrowserCache] |Emitted when a user clicks the *Refresh* button in the Liveboard header. -|`HostEvent.RefreshLiveboardBrowserCache` -|xref:HostEvent.adoc#_refreshliveboardbrowsercache[HostEvent] +|xref:HostEvent.adoc#_refreshliveboardbrowsercache[HostEvent.RefreshLiveboardBrowserCache] |Triggers a browser cache refresh programmatically for all visualization containers on the embedded Liveboard. |==== diff --git a/modules/ROOT/pages/embed-spotter.adoc b/modules/ROOT/pages/embed-spotter.adoc index eaaf2b1a0..01fbdf608 100644 --- a/modules/ROOT/pages/embed-spotter.adoc +++ b/modules/ROOT/pages/embed-spotter.adoc @@ -35,14 +35,13 @@ import { prefetch, EmbedEvent, HostEvent -} -from '@thoughtspot/visual-embed-sdk'; +} from '@thoughtspot/visual-embed-sdk'; ---- **ES6** [source,JavaScript] ---- - ---- == Initialize the SDK @@ -132,7 +131,6 @@ spotterEmbed.on(EmbedEvent.Subscribed, (eventData) => { }); ---- - To trigger actions on the embedded interface, use the xref:HostEvent.adoc[Host events]. The following example shows the host event to reset a Spotter conversation session: @@ -164,291 +162,7 @@ spotterEmbed.render(); [#configControls] == Customizing the embedded Spotter interface -When you embed Spotter, you'll notice that the embedded component loads an initial page with a prompt interface. The look and feel of this page vary depending on the Spotter version used for embedding. - -=== Spotter Classic and Spotter 2 experiences -If you have embedded Spotter Classic or Spotter 2, the initial page includes a prompt bar for user input, a data source selector, and the UI options to preview data and reset a Spotter session. - -[.widthAuto] -[.bordered] -image::./images/spotter-embed-legacy.png[Spotter embed] - -=== Spotter 3 experience -In Spotter 3 embedding, you can load the page with a pre-selected data source or use the *Auto mode* to allow Spotter to automatically discover and select a relevant data model for user queries. - -**Default view**: - -[.widthAuto] -[.bordered] -image::./images/spotter3-legacy-interface.png[Spotter 3 interface] - -**With Auto mode enabled**: - -[.widthAuto] -[.bordered] -image::./images/spotter3-leagcy-interface-automode.png[Spotter 3 interface] - -[NOTE] -==== -When Auto mode is enabled, **Preview data** and **Data Model instructions** options will not be available. -==== - - -==== New chat interface - -Spotter 3 experience is available with a new prompt interface that includes additional features and user elements to enrich your Spotter experience. - -To enable the new chat interface in your embed, set the `updatedSpotterChatPrompt` attribute: - -[source,JavaScript] ----- -const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { - // ...other embed configuration attributes - // Enable the updated Spotter chat prompt experience. - updatedSpotterChatPrompt: true, -}); ----- - -[.widthAuto] -[.bordered] -image::./images/spotter3-new-interface.png[Spotter 3 new interface] - -==== Chat history panel - -You can also include the *Chat history* panel to allow your users to access the chat history from their previous sessions. - -To enable chat history features, set the `enablePastConversationsSidebar` attribute to `true`. Additionally, you can customize the appearance and contents of the chat history panel using the configuration parameters available in the xref:SpotterSidebarViewConfig.adoc[`SpotterSidebarViewConfig`] interface and the xref:SpotterEmbedViewConfig.adoc#_spottersidebarconfig[spotterSidebarConfig] object. - -[source,JavaScript] ----- -import { - SpotterEmbed, - SpotterEmbedViewConfig, - SpotterSidebarViewConfig -} from '@thoughtspot/visual-embed-sdk'; - -const embed = new SpotterEmbed('#tsEmbed', { - // ...other embed view configuration options - // Configuration for the Spotter sidebar UI - spotterSidebarConfig: { - enablePastConversationsSidebar: true, // Show chat history sidebar - spotterSidebarTitle: 'My Conversations', // Update the title of the sidebar - spotterSidebarDefaultExpanded: true, // Expand Spotter chat history sidebar by default on load - }, -}) ----- - -[NOTE] -==== -The standalone `enablePastConversationsSidebar` attribute is deprecated in v1.47.0 and can no longer be used to enable or disable the chat history. -==== - - -==== Chat history panel - -To enable and customize the chat history sidebar, configure the chat history properties in the `spotterSidebarConfig` object: - -[source,JavaScript] ----- -const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { - // ... - worksheetId: '<%=datasourceGUID%>', - spotterSidebarConfig: { - enablePastConversationsSidebar: true, // Enable the chat history sidebar - spotterSidebarDefaultExpanded: true, // Expand the sidebar by default - spotterSidebarTitle: 'Chat History', // Custom sidebar header text - spotterNewChatButtonTitle: 'New Conversation', // Custom label for the New chat button - spotterChatRenameLabel: 'Rename session', // Custom label for the Rename action - spotterChatDeleteLabel: 'Delete session', // Custom label for the Delete action - spotterConversationsBatchSize: 20, // Conversations fetched per batch (default: 30) - spotterDocumentationUrl: 'https://your-help-center-url', // Custom best practices link - }, -}); ----- - -[NOTE] -==== -The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` is deprecated from Visual Embed SDK v1.47.0. Use the `enablePastConversationsSidebar` property within the `spotterSidebarConfig` object instead. When both properties are defined, the value in `spotterSidebarConfig` takes precedence. -==== - - -==== MCP connectors and resource selection icon -A connector is an external MCP server or tool, such as Google Drive, Slack, Notion, Confluence, or Jira, which can be used as a data source in Spotter sessions. ThoughtSpot administrators can configure connectors to enable Spotter users to include both structured and unstructured data in their conversation sessions. - -If the new prompt interface in Spotter 3 is enabled, the Spotter page displays the *MCP Connectors* menu along with a '\+' icon in the prompt panel. Your application users can connect to a tool preconfigured by your ThoughtSpot administrator directly from the Spotter 3 prompt interface using the '+' icon and add resources to their conversation context. - -[NOTE] -==== -The MCP connector module and the '+' icon are displayed by default if the new prompt interface is enabled in your embed. However, we do not recommend using this feature in your production environments. -==== - -Currently, the Visual Embed SDK does not provide any attributes or action IDs to hide these elements. As a workaround, you can use CSS selectors to hide these elements: - -[source,JavaScript] ----- -init({ - thoughtSpotHost: 'https://your-thoughtspot-host', // URL of your ThoughtSpot instance - authType: AuthType.None, // Authentication type; use appropriate AuthType for your environment - customizations: { - style: { - customCSS: { - rules_UNSTABLE: { - // Hide the MCP connectors module in the Spotter prompt panel - ".button-module__buttonWrapper.chat-connector-resources-module__addConnectorResourceButton": { - "display": "none !important" - }, - // Hide the add resources (+) icon in the Spotter prompt panel - "button.button-module__button.button-module__buttonWithIcon.button-module__tertiary.button-module__sizeM.button-module__backgroundLight.button-module__both": { - "display": "none !important" - } - } - } - } - }, - // ...other configuration attributes -}); ----- - -=== Customizing styles and interface elements -The Visual Embed SDK provides a comprehensive style customization framework for overriding icons, text strings, and the appearance of UI elements. - -The `customizations` object allows you to add custom CSS definitions, replace text strings, and override icons. If your customization framework uses external sources or hosting servers, ensure they are added to the CSP allowlist. For more information, see the xref:css-customization.adoc[CSS customization framework], xref:customize-text-strings.adoc[Customize text strings], and xref:customize-icons.adoc[Customize icons] sections. - -[#SpotterCSS] -=== Customize using CSS variables -You can customize the background color of the conversation and prompt panels, button elements, and the components of the charts generated by Spotter using xref:customize-css-styles.adoc[CSS variables]. - -If Theme Builder is enabled on your ThoughtSpot instance, you can find the variables for Spotter customization by navigating to *Develop* > *Customizations* > *Theme Builder* in the ThoughtSpot UI and downloading the CSS variables. - -[source,JavaScript] ----- -// Initialize the SDK with CSS variables with custom style definitions -init({ - // ... - customizations: { - style: { - // Use CSS variables to customize styles - customCSS: { - variables: { - "--ts-var-button--primary-background": "#008000", - "--ts-var-spotter-prompt-background": "#F0EBFF", - "--ts-var-root-color": "#E3D9FC", - "--ts-var-root-background": "#F7F5FF", - }, - }, - }, - }, ----- - -==== Customizing text strings -To replace text strings, you can use the `stringsIDs` and `strings` properties in the content customization object. - -The following example shows how to replace "Spotter" and other text strings on the Spotter interface. - -[source,JavaScript] ----- -// Initialize the SDK with custom text string replacements -init({ - // ... - customizations: { - content: { - // Use the strings object to replace the visible UI text with custom labels. - strings: { - // Change all instances of "Preview data" to "Show data" - "Preview data": "Show data", - // Change all instances of "Spotter" to "dataAnalyzer" - "Spotter": "dataAnalyzer", - } - } - } -}); ----- - -=== Customizing the Spotter icon -To override an icon, you must find the ID of the icon, create an SVG file to replace this icon, and add the SVG hosting URL to your embed customization code. The most common icon to override is the default Spotter icon and its icon ID is `rd-icon-spotter`. - -The following example uses the link:https://github.com/thoughtspot/custom-css-demo/blob/main/alternate-spotter-icon.svg[alternate-spotter-icon.svg, window=_blank] file hosted on `\https://cdn.jsdelivr.net/` to override the Spotter icon. - -[source,JavaScript] ----- - init({ - //... - customizations: { - // Specify the SVG hosting URL to override the icon, for example Spotter (`rd-icon-spotter`) icon - iconSpriteUrl: "https://cdn.jsdelivr.net/gh/thoughtspot/custom-css-demo/alternate-spotter-icon.svg" - } - }); ----- - -The following figures show the customized Spotter icon: -[.widthAuto] -[.bordered] -image::./images/spotter-icon-customization.png[Spotter icon customization] - -=== Hiding the Spotter icon and ThoughtSpot branding from the chat interface -To hide the Spotter logo and branding in the chat interface, use the following parameters in the `SpotterChatViewConfig` interface: - -* `hideToolResponseCardBranding` + -When set to `true`, hides the ThoughtSpot logo and icon in tool response cards. The branding label prefix is controlled separately via `toolResponseCardBrandingLabel`. - -* `toolResponseCardBrandingLabel` + -Custom label to replace the `ThoughtSpot` prefix in tool response cards. Set to an empty string (`''`) to hide the prefix entirely. - -Example:: -+ -[source,JavaScript] ----- -import { - SpotterEmbed, - SpotterEmbedViewConfig, - SpotterChatViewConfig -} from '@thoughtspot/visual-embed-sdk'; - -spotterChatConfig: { - // Hide the default logo and label on tool response cards in Spotter chat UI - hideToolResponseCardBranding: true, - // Set a custom label to display as the branding on tool response cards - toolResponseCardBrandingLabel: 'CompanyName', -} ----- - -[#fileUpload] -=== Allowing file uploads in Spotter chats -To enable file uploads in the Spotter chat panel: - -. Ensure that `spotterFileUploadEnabled` is set to `true` in the `spotterChatConfig` object. This setting enables ** + Add files** option in the Spotter chat panel. -. Optionally, you can restrict the types of files users can upload by specifying the file types in the `SpotterFileUploadFileTypes` array. If no file format is specified, all supported file types are allowed for uploads. - -[source,JavaScript] ----- -const embed = spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { - //... - spotterChatConfig: { - spotterFileUploadEnabled: true, - spotterFileUploadFileTypes: { types: ['pdf', 'png', 'xlsx'] - }, -}); ----- - -[#spotterMenuActions] -=== Customizing menu actions and elements - -The SDK provides action IDs to disable, show, or hide the following elements and menu actions via `disabledActions`, `visibleActions`, or `hiddenActions` arrays. - -For example, you can hide the *Preview data*, *Reset* in the prompt panel, or *Pin*, *Download*, and other actions from a Spotter-generated response. - -The following code sample disables actions and menu elements using the xref:embed-actions.adoc[`disabledActions`] array: - -[source,JavaScript] ----- - // Hide these actions - hiddenActions: [Action.Pin,Action.ResetSpotterChat,Action.DeletePreviousPrompt], - // Disable actions - disabledActions:[Action.PreviewDataSpotter,Action.Edit], - disabledActionReason: "Contact your administrator to enable this feature" ----- -For a comprehensive list of supported actions, see xref:Action.adoc[Spotter menu actions]. - +When you embed Spotter, you'll notice that the embedded component loads an initial page with a prompt interface. The look and feel of this page vary depending on the Spotter version used for embedding. To learn about the customization options available with the Visual Embed SDK, see xref:customize-spotter-embed.adoc[Customizing the Spotter embed view]. == Code samples @@ -465,8 +179,7 @@ import { prefetch, EmbedEvent, HostEvent -} -from '@thoughtspot/visual-embed-sdk'; +} from '@thoughtspot/visual-embed-sdk'; // Initialize the ThoughtSpot Visual Embed SDK with your ThoughtSpot URL and authentication type. init({ diff --git a/modules/ROOT/pages/embed-spotterViz.adoc b/modules/ROOT/pages/embed-spotterViz.adoc index 9c74008b6..cf059d4dc 100644 --- a/modules/ROOT/pages/embed-spotterViz.adoc +++ b/modules/ROOT/pages/embed-spotterViz.adoc @@ -8,12 +8,11 @@ [earlyAccess eaBackground]#Early Access# -The SpotterViz panel is supported in Liveboards embedded using `LiveboardEmbed` or `AppEmbed` components. ThoughtSpot link:https://docs.thoughtspot.com/cloud/26.6.0.cl/spotter-viz[SpotterViz, window=_blank] is the AI-powered analysis panel that appears when a user opens the Liveboard in edit mode. It provides Liveboard users with an in-context AI assistant and a prompt interface to ask questions on Liveboard data and receive automatically generated visualizations and insights in response. +ThoughtSpot link:https://docs.thoughtspot.com/cloud/latest/spotter-viz[SpotterViz, window=_blank] is the AI-powered analysis panel that appears when a user opens the Liveboard in edit mode. It provides Liveboard users with an in-context AI assistant and a prompt interface to ask questions on Liveboard data and receive automatically generated visualizations and insights in response. [NOTE] ==== -* SpotterViz is an early access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. -* The SpotterViz panel in Liveboard embedding is supported in Visual Embed SDK v1.50.0 and ThoughtSpot instances with 26.7.0.cl or later versions only. +SpotterViz is an early access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. ==== == Before you begin @@ -43,6 +42,16 @@ Description:: Use `description` to include your custom description text below th Input placeholder:: Use `inputChatPlaceholder` to customize the placeholder text shown in the chat input box when it is empty. By default, this text is displayed as "Let me help you build this Liveboard". +Loading state headline:: Use `loaderHeadline` to replace the default headline text shown in the SpotterViz panel when it is generating a Liveboard in response to a user prompt. Use this property to display a custom message that matches your application's tone. For example, __Crunching the numbers__, __Building your dashboard__, and other such text. + +Loading state tips:: Use `loaderTips` to replace the default tips shown alongside the loading state with a custom list. Each tip is defined using the `SpotterVizLoaderTip` interface with the following attributes: ++ +* `label`. __String__. Short label rendered alongside the tip text, for example, `'Tip'`. +* `text`. __String__. Tip body text shown to the user while the Liveboard is loading. Use this to guide users with context-specific hints, such as __Try asking about revenue by region__. ++ +If you set `loaderTips` to an empty array, no tips will be displayed. + + Starter prompts:: SpotterViz displays the question suggestions in the panel to help users begin an AI-assisted analysis. Each prompt has a short display label (`displayText`) and a full prompt string (`fullPrompt`) sent to Spotter when clicked. @@ -59,6 +68,16 @@ The SpotterViz panel displays the restore button on checkpoint cards and thumbs- * `Action.SpotterVizCheckpointRestore` * `Action.SpotterVizFeedback` +Terminology customization:: +Use the following properties to replace default ThoughtSpot terminology in the SpotterViz interface and in the agent's responses. These are useful when you want the AI assistant to use your application's language rather than ThoughtSpot-specific terms. + ++ +* `liveboardBrandName`. __String__. Replaces the term "Liveboard" in the agent's responses. For example, you can set this to `'Dashboard'` to have SpotterViz refer to generated views as dashboards. +* `spotterBrandName`. __String__. Replaces the term "Spotter" in the agent's responses. Use this parameter to rebrand Spotter with your own product name. For example, `'AI Analyst'`. +* `insightTileBrandName`. __String__. Replaces the term "Insight tile" in the UI and in the agent's responses. For example, `'Insight card'`. +* `insightTileViewPlanLabel`. __String__. Replaces the "View plan" label in the insight tile action menu. For example, `'Show details'`. Custom term used to replace "View plan" in the insight tile menu. +* `insightTileLoaderText`. __String__. Replaces the default loader text shown on an insight tile while it is generating content. For example,`'Generating insight...;'`. + === SpotterViz in Liveboard embedding [source,javascript] ---- @@ -81,6 +100,17 @@ const embed = new LiveboardEmbed('#embed-container', { brandHeadline: "Hi there! I'm", description: 'Ask me anything about your data.', inputChatPlaceholder: 'Ask a question...', + loaderHeadline: 'Building your dashboard\u2026', + loaderTips: [ + { label: 'Tip', text: 'Try asking about revenue by region.' }, + { label: 'Tip', text: 'Use natural language to describe the chart you want.' }, + ], + liveboardBrandName: 'Dashboard', + spotterBrandName: 'AI Analyst', + insightTileBrandName: 'Insight card', + insightTileViewPlanLabel: 'Show details', + insightTileLoaderText: 'Generating insight...', + hideStarterPrompts: false, hideStarterPrompts: false, customStarterPrompts: [ { diff --git a/modules/ROOT/pages/embed-ts-react-app.adoc b/modules/ROOT/pages/embed-ts-react-app.adoc index 22f191e43..2c75f3ed8 100644 --- a/modules/ROOT/pages/embed-ts-react-app.adoc +++ b/modules/ROOT/pages/embed-ts-react-app.adoc @@ -14,7 +14,12 @@ Before embedding ThoughtSpot, perform the following checks: === Prepare your environment +* Check if link:https://docs.npmjs.com/downloading-and-installing-node-js-and-npm[NPM and Node.js are installed, window=_blank] in your setup. Any link:https://nodejs.org/en/about/previous-releases[active LTS release, window=_blank] of Node.js is recommended for build tooling. +* Make sure you have installed React 16.8 or later and its dependencies. The SDK declares React and React DOM as peer dependencies at version 16.8 or later. If React is not installed, open a terminal window and run the following command: + * Check if link:https://docs.npmjs.com/downloading-and-installing-node-js-and-npm[NPM and Node.js are installed, window=_blank] in your setup. + + * Make sure you have installed React framework and its dependencies. If React is not installed, open a terminal window and run the following command: + ---- diff --git a/modules/ROOT/pages/events-hostEvents.adoc b/modules/ROOT/pages/events-hostEvents.adoc index b397dec92..732726929 100644 --- a/modules/ROOT/pages/events-hostEvents.adoc +++ b/modules/ROOT/pages/events-hostEvents.adoc @@ -7,9 +7,9 @@ :page-description: Events allow the host application to trigger actions in or payloads from the embedded ThoughtSpot components. [#host-events] -Host events provide programmatic entry points to actions that your host or embedding application can trigger into the embedded ThoughtSpot iframe to perform the same operations a user can perform in the UI, such as opening filters, editing, saving, pinning, drilling, or navigating to an answer. +Host events provide programmatic entry points to actions that your host or embedding application can trigger in the embedded ThoughtSpot iframe to perform the same operations a user can perform in the UI, such as opening filters, editing, saving, pinning, drilling, or navigating to an answer. -Host events use the `.trigger()` method to send the event message to embedded ThoughtSpot components in the `.trigger(hostEvent, data)` format. The host events are part of the *HostEvent* object; for example, `HostEvent.SetVisibleTabs`. +Host events use the `.trigger()` method to send the event message to embedded ThoughtSpot components in the `.trigger(hostEvent, data)` format. The host events are part of the `HostEvent` object; for example, `HostEvent.SetVisibleTabs`. == Event categories @@ -24,7 +24,7 @@ Host events can be categorized based on their schema and what they do: == Configuring host events -To configure a host event, use the `.trigger()`. +To configure a host event, use the `.trigger()` method. The following example uses `HostEvent.SetVisibleTabs` to show specific tabs whose IDs are specified in the payload. Any tabs whose IDs are not included in this array are hidden. @@ -47,7 +47,7 @@ In your host events implementation, you can choose to trigger an action without ==== Parameters for HostEvent.Pin -The *Pin* action is available on the charts and tables generated from a search query, saved Answers, and visualizations on a Liveboard. Generally, when a user initiates the pin action, the *Pin to Liveboard* modal opens, and the user is prompted to specify the Liveboard to pin the object. The modal also allows the user to add or edit the title text of the visualization and create a new Liveboard if required. +The *Pin* action is available on the charts and tables generated from a search query, saved Answers, and visualizations on a Liveboard. Generally, when a user initiates the pin action, the *Pin to Liveboard* modal opens, and the user is prompted to specify the Liveboard to pin the object to. The modal also allows the user to add or edit the title text of the visualization and create a new Liveboard if required. With `HostEvent.Pin`, you can automate the pin workflow to programmatically add an Answer or visualization to a Liveboard. For example, to pin an object to an existing Liveboard, use the following parameters in the host event object: @@ -56,15 +56,13 @@ __String__. GUID of the saved Answer or visualization to pin to a Liveboard. Not * `liveboardId` + __String__. GUID of the Liveboard to pin the Answer. If there is no Liveboard, you must specify the `newLiveboardName` to create a new Liveboard. * `newVizName` + -__String__. Name string for the Answer that will be added as a visualization to the Liveboard. Note that each time the user clicks, a new visualization object with a new GUID is generated. +__String__. Name string for the visualization. When specified, it adds a new visualization or creates a copy of the Answer or visualization specified in `vizId`. Note that each time this event is triggered, a new visualization object with a new GUID is generated. * `tabId` + __String__. GUID of the Liveboard tab. Adds the Answer to the Liveboard tab specified in the code. -* `newLiveboardName` +* `newLiveboardName` + __String__. Name string for the new Liveboard. Creates a new Liveboard object with the specified name. * `newTabName` + __String__. Name string for the new Liveboard tab. Adds a new tab to the Liveboard specified in the code. -* `newVizName` + -__String__. Name string for the visualization. When specified, it adds a new visualization or creates a copy of the Answer or visualization specified in `vizId`. In this example, when the `HostEvent.Pin` is triggered, the *Pin* action is initiated to add a specific visualization to a specific Liveboard tab: @@ -83,12 +81,12 @@ In this example, when the `HostEvent.Pin` is triggered, the *Pin* action is init [source,JavaScript] ---- const pinResponse = await searchEmbed.trigger(HostEvent.Pin, { - newVizName: `Sales by region`, + newVizName: "Sales by region", liveboardId: "5eb4f5bd-9017-4b87-bf9b-8d2bc9157a5b", }) ---- -In this example, when the `HostEvent.Pin` is triggered, the *Pin* action is initiated to create a new Liveboard with a tab, and then pin the Answer or visualization to it. +In this example, when the `HostEvent.Pin` is triggered, the *Pin* action is initiated to create a new Liveboard with a tab, and then pin the Answer or visualization to it: [source,JavaScript] ---- @@ -113,7 +111,7 @@ For `HostEvent.SaveAnswer`, you can pass the pre-defined attributes such as name * `name` + __String__. Name string for the Answer object. * `description` + -__String__. Description text for the Answer +__String__. Description text for the Answer. [source,JavaScript] ---- @@ -130,19 +128,67 @@ If `HostEvent.SaveAnswer` does not include any parameters, the event triggers th searchEmbed.trigger(HostEvent.SaveAnswer); ---- - === Retrieving and updating filters - The SDK provides the following events for filter retrieval and updates: -* `HostEvent.GetFilters` to get the filters that are currently applied on an embedded Liveboard. You can use this event to inspect the current filter state or to retrieve filter values. -* `HostEvent.UpdateFilters` to update the filters applied on an embedded Liveboard. -* `HostEvent.OpenFilter` to open the filter panel for the specified column. -* `HostEvent.UpdateRuntimeFilters` to update xref:runtime-filters.adoc[Runtime filters]. + -Runtime filters are applied at runtime, that is, when loading the embedded ThoughtSpot content. Runtime filters can also be updated after the load time using `HostEvent.UpdateRuntimeFilters`. You can add a UI option or button in your embedding app and assign the `HostEvent.UpdateRuntimeFilters` to trigger the `UpdateRuntimeFilters` event when that button is clicked. -+ +==== HostEvent.GetFilters +You can use this event to inspect the current filter state or to retrieve filter values. The `HostEvent.GetFilters` returns an array of filter objects representing the filters currently applied on the embedded Liveboard. Each filter object includes the following additional properties: + +`applicable_viz`:: +An object describing which visualizations on the Liveboard this filter applies to. Includes the following properties: + +* `type`. __String__. Scope of the filter. + +** `ALL` means the filter applies to all visualizations. + +** `SPECIFIC` means the filter applies only to the visualization IDs listed in `viz_ids`. +* `viz_ids`. __Array of strings__. Array of visualization GUIDs to which the filter applies. Populated only when `type` is `SPECIFIC`. + +`linking`:: +An object describing the filter-linking state of this filter. Includes the following properties: + +* `is_linked`. __Boolean__. Is `true` if this filter is linked to other filters on the Liveboard. +* `linked_columns`. __Array of strings__. Array of column names or GUIDs that this filter is linked to. + +[source,JSON] +---- +[ + { + "column": "Region", + "operator": "EQ", + "values": ["West"], + "applicable_viz": { + "type": "SPECIFIC", + "viz_ids": ["viz-guid-1", "viz-guid-2"] + }, + "linking": { + "is_linked": true, + "linked_columns": ["Country"] + } + }, + { + "column": "Date", + "operator": "BW_INC", + "values": ["2024-01-01", "2024-12-31"], + "applicable_viz": { + "type": "ALL", + "viz_ids": [] + }, + "linking": { + "is_linked": false, + "linked_columns": [] + } + } +] +---- + +==== HostEvent.UpdateFilters +Updates the filters applied on an embedded Liveboard. For more information and examples, see xref:HostEvent.adoc#_updatefilters[HostEvent reference documentation]. + +==== HostEvent.OpenFilter +Opens the filter panel for the specified column. For more information and examples, see xref:HostEvent.adoc#_openfilter[HostEvent reference documentation]. + +==== HostEvent.UpdateRuntimeFilters +xref:runtime-filters.adoc[Runtime filters] are applied at runtime, that is, when loading the embedded ThoughtSpot content. Runtime filters can also be updated after the load time using `HostEvent.UpdateRuntimeFilters`. You can add a UI option or button in your embedding app and assign `HostEvent.UpdateRuntimeFilters` to a button to trigger the event when that button is clicked. + In this example, the host event is assigned to a button that updates runtime filters when clicked. When `HostEvent.UpdateRuntimeFilters` is triggered, the filters are updated with the attributes specified in the code. -+ + [source,JavaScript] ---- document.getElementById('updateFilters').addEventListener('click', e => { @@ -163,12 +209,12 @@ In this example, the host event is assigned to a button that updates runtime fil === Filtering from the selection Filtering from a selection on a chart or table can be implemented by combining the `EmbedEvent.VizPointClick` or `EmbedEvent.VizPointDoubleClick` events with the `HostEvent.UpdateRuntimeFilters` event. -The callback function from the `VizPointClick` event will need to read the response, parse out the attributes from the response that will be sent to the Runtime Filters object, and then send the attributes and their target fields in the format used by `UpdateRuntimeFilters`. +The callback function from the `VizPointClick` event will need to read the response, parse out the attributes from the response that will be sent to the Runtime Filters object, and then send the attributes and their target fields in the format used by `HostEvent.UpdateRuntimeFilters`. === Using vizId to target a specific visualization If a host event allows the `vizId` parameter, you can use it to target a specific visualization where applicable. For example, to trigger the *Edit* action on a specific visualization in an embedded Liveboard, you can specify the `vizId` parameter in the host event payload. -In the following example, the host event triggers the **Edit** action on the specified visualization in a Liveboard embed: +In the following example, the host event triggers the *Edit* action on the specified visualization in a Liveboard embed: [source,JavaScript] ---- @@ -181,7 +227,7 @@ liveboardEmbed.trigger(HostEvent.Edit, { }); ---- -If `vizId` is not specified, the edit action is triggered at the Liveboard level, instead of the visualization layer. +If `vizId` is not specified, the *Edit* action is triggered at the Liveboard level, instead of the visualization layer. In Spotter embed, `vizId` is a required parameter for several host events. If it is not specified in the host event, the event trigger fails and results in an error indicating that the visualization context is missing. @@ -192,7 +238,7 @@ In the above example, if the visualization with the `730496d6-6903-4601-937e-2c6 == Host event behavior in single-layer and multi-layer UI scenarios -In single‑layer UI, such as a single visualization embed, Spotter embed, or Liveboards listing page in full application embed, a host event call typically results in a single visible action. However, in multi-modal or multi-layer UI, such as Spotter on Liveboard embed, a visualization opened from a Liveboard, or any experience with dialogs on top of a base page, a host event call can trigger multiple handlers at once. For example, the `HostEvent.OpenFilter` can open filters on both the visualization page in the overlay and the underlying Liveboard. +In single-layer UI, such as a single visualization embed, Spotter embed, or Liveboards listing page in full application embed, a host event call typically results in a single visible action. However, in multi-modal or multi-layer UI, such as Spotter on Liveboard embed, a visualization opened from a Liveboard, or any experience with dialogs on top of a base page, a host event call can trigger multiple handlers at once. For example, the `HostEvent.OpenFilter` can open filters on both the visualization page in the overlay and the underlying Liveboard. For context-aware routing and per‑context payload validation, we recommend using the host events framework with page context. For more information, see xref:events-context-aware-routing.adoc[Context-based execution of host events]. @@ -251,7 +297,6 @@ video::./images/hostEvent.mp4[width=100%,options="autoplay,loop"] ++++ Try it out in Playground - ++++ == Event enumerations and examples diff --git a/modules/ROOT/pages/filters_overview.adoc b/modules/ROOT/pages/filters_overview.adoc index d0659c9bb..d4c0d9849 100644 --- a/modules/ROOT/pages/filters_overview.adoc +++ b/modules/ROOT/pages/filters_overview.adoc @@ -35,7 +35,7 @@ xref:runtime-filters.adoc#_maximum_filter_count[Runtime filter limit] for more i 4. link:https://docs.thoughtspot.com/cloud/latest/liveboard-filters[Liveboard filters, window=_blank] + Liveboard filters apply to all visualizations on the Liveboard and are visible as UI components at the top of a Liveboard page. When a filter is clicked, a modal with filter options appropriate for the data type is displayed. + -Liveboard users can add or modify filters as needed. If you are embedding a Liveboard that includes preset filters, you can programmatically update, reset, or remove filters using the `HostEvent.UpdateFilters`. +Liveboard users can add or modify filters as needed. If you are embedding a Liveboard that includes preset filters, you can programmatically update, reset, or remove filters using `HostEvent.UpdateFilters`. 5. link:https://docs.thoughtspot.com/cloud/latest/liveboard-filters-cross[Liveboard cross filters, window=_blank] + Cross filters are ad-hoc filters based on user selection. These filters are used for brushing and linking Liveboard visualizations. + @@ -55,7 +55,7 @@ All operations result in a `WHERE` clause being applied to the queries generated A data filter object in ThoughtSpot typically includes the following attributes: `column`, `columnName`, **or** `columnId`:: -The name of the column to filter on. For example, `item type` or `product`. The column value must match the actual column name in the ThoughtSpot model. If the model uses column aliases, use the base column name, not the alias. This attribute is defined as `col1`, `col2`, `col3` in the object URLs and REST API requests, as `columnName` in the `runtimeFilters` array in the Visual Embed SDK. The filter object for host events in the SDK allows `column` or `columnName`. +The name of the column to filter on. For example, `item type` or `product`. The column value must match the actual column name in the ThoughtSpot model. If the model uses column aliases, use the base column name, not the alias. This attribute is defined as `col1`, `col2`, `col3` in the object URLs and REST API requests, and as `columnName` in the `runtimeFilters` array in the Visual Embed SDK. The filter object for host events in the SDK allows `column` or `columnName`. + If there are multiple columns with the same name, you can use the `WORKSHEET_NAME::COLUMN_NAME` format; for example, `"(Sample) Retail - Apparel::city"`. @@ -63,7 +63,7 @@ If there are multiple columns with the same name, you can use the `WORKSHEET_NAM The supported operators include: + [width="80%" cols="1,2,2"] -[options='header'] +[options="header"] |=== |Operator|Description|Number of Values @@ -122,6 +122,7 @@ The supported operators include: | `IN` | is included in this list of values | multiple + | `NOT_IN` | is not included in this list of values | multiple @@ -220,19 +221,38 @@ liveboardEmbed.trigger(HostEvent.UpdateFilters, { ---- === GetFilters and GetParameters events -If you want to build your own filter UI within the embedding app, you can find out details of the Liveboard and runtime filters that are defined using the link:https://developers.thoughtspot.com/docs/Enumeration_HostEvent#_getfilters[HostEvent.GetFilters]. There is an equivalent link:https://developers.thoughtspot.com/docs/Enumeration_HostEvent#_getparameters[HostEvent.GetParameters] to get the currently set Parameter values: +If you want to build your own filter UI within the embedding app, you can find out details of the Liveboard and runtime filters that are defined using `HostEvent.GetFilters`. + +**GetFilters** [source,JavaScript] ---- const data = await liveboardEmbed.trigger(HostEvent.GetFilters); console.log('data', data); +---- + +Each filter object in the `HostEvent.GetFilters` response includes two additional fields: + +* `applicable_viz`: indicates whether the filter applies to `ALL` visualizations or only `SPECIFIC` ones (with a `viz_ids` array). +* `linking`: indicates whether the filter is linked to other filters, and which columns it is linked to (`is_linked`, `linked_columns`). + +For more information, see xref:events-hostEvents.adoc#_hostevent_getfilters[HostEvent.GetFilters] and xref:HostEvent.adoc#_getfilters[HostEvent reference documentation]. + +**GetParameters** + +To get the currently set Parameter values, use `HostEvent.GetParameters`: + +[source,JavaScript] +---- liveboardEmbed.trigger(HostEvent.GetParameters).then((parameter) => { console.log('parameters', parameter); }); ---- -Note that `HostEvent.GetFilters` and `HostEvent.GetParameters` return a promise directly rather than taking a callback function as their second argument. +[NOTE] +==== +`HostEvent.GetFilters` and `HostEvent.GetParameters` return a promise directly rather than taking a callback function as their second argument. +==== === FilterChanged and ParameterChanged events You can also listen for the user's interactions with the filters using the link:https://developers.thoughtspot.com/docs/Enumeration_EmbedEvent#_filterchanged[EmbedEvent.FilterChanged]. @@ -267,7 +287,7 @@ When updating filters using `HostEvent.UpdateFilters`, you must include the date The following table lists the supported filter types and examples for each type: [width="100%" cols="3,8"] -[options='header'] +[options="header"] |===== |Type| Description @@ -460,7 +480,7 @@ The `override_filters` value is a JSON array of filter objects, with each object [IMPORTANT] ==== -* The `override_filters` accepts a JSON array directly, not an object that wraps the array. +* The `override_filters` parameter accepts a JSON array directly, not an object that wraps the array. * Specifying two or more filter objects that target the same date column returns the error, `more than one filter objects are not allowed for date type column `. However, columns with other data type do not have this restriction. Multiple filter objects on the same non-date column are merged. ==== @@ -508,6 +528,7 @@ Valid values for rolling date filters include: + * `TODAY` - The current calendar day. * `TOMORROW` - The next calendar day. * `THIS_PERIOD` - The current period (for example, this quarter). +* `LAST_PERIOD` - The previous single period (for example, last month). * `NEXT_PERIOD` - The next single period (for example, next month). * `LAST_N_PERIOD` - The last _N_ complete periods. * `NEXT_N_PERIOD` - The next _N_ complete periods. @@ -536,7 +557,7 @@ Valid values for `datePeriod` include: * `MONTH` - Calendar month * `QUARTER` - Calendar quarter * `YEAR` - Calendar year -* `HOUR` - Hour (`dateTime` columns only) +* `HOUR` - Hour (`datetime` columns only) * `MINUTE` - Minute (`datetime` columns only) * `SECOND` - Second (`datetime` columns only) @@ -675,7 +696,7 @@ Name of the month in uppercase. Required for `MONTH_YEAR`. Refer to the following table for examples of JSON object for date filters: [width="100%" cols="3,8"] -[options='header'] +[options="header"] |===== |Date filter type | Example @@ -917,4 +938,6 @@ Refer to the following documentation for more information: === Events There is no specific event to update `search_query filters` in the `SearchEmbed` component or the Liveboard edit mode. -You can set your app to listen to link:https://developers.thoughtspot.com/docs/Enumeration_EmbedEvent#_querychanged[EmbedEvent.QueryChanged] and trigger the link:https://developers.thoughtspot.com/docs/Enumeration_HostEvent#_gettml[HostEvent.GetTML] event to get a new TML generated for the `search_query` string after an update. \ No newline at end of file +You can set your app to listen to link:https://developers.thoughtspot.com/docs/Enumeration_EmbedEvent#_querychanged[EmbedEvent.QueryChanged] and trigger the link:https://developers.thoughtspot.com/docs/Enumeration_HostEvent#_gettml[HostEvent.GetTML] event to get a new TML generated for the `search_query` string after an update. + +//// \ No newline at end of file diff --git a/modules/ROOT/pages/full-app-customize.adoc b/modules/ROOT/pages/full-app-customize.adoc index b4e60b77e..9ba207551 100644 --- a/modules/ROOT/pages/full-app-customize.adoc +++ b/modules/ROOT/pages/full-app-customize.adoc @@ -1,73 +1,74 @@ -= Customize full application embedding += Customize the home page and navigation for full application embedding :toc: true :toclevels: 3 -:page-title: Customize full application embedding +:page-title: Customize the home page and navigation for full application embedding :page-pageid: full-app-customize -:page-description: Customize full application embedding +:page-description: Customize the home page and navigation for full application embedding -The Visual Embed SDK provides several controls to customize the embedded view, including setting the default landing page, navigation style, visibility of modules and menu items, and more. +ThoughtSpot supports the following experience modes in full application embedding: + +* *V3 experience* (`HomePage.ModularWithStylingChanges`)—The default home page experience as of ThoughtSpot Cloud 26.8.0.cl. Includes the left navigation panel, customizable modules, and styling changes. +* *V4 experience* (`HomePage.Focused`)—An enhanced home page experience with a focused layout and additional customization options. [IMPORTANT] ==== -The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. +The classic V1 and V2 navigation and homepage experience modes are deprecated as of ThoughtSpot Cloud 26.8.0.cl. Starting from this release, all embedded sessions render in the V3 navigation experience by default. ==== -== UI experience modes -ThoughtSpot application supports the following UI experience modes: - -* xref:full-app-customize.adoc#_upgrade_to_the_v3_experience[V3 navigation and home page experience] (__Recommended__) -* xref:full-app-customize.adoc#_upgrade_from_the_v2_experience_to_v3_experience[V2 navigation and home page experience] -* Classic (V1) experience (__Default experience__) - -The key differences between these UI experience modes are listed in the following table: - -[div boxAuto] --- -[width="100%", cols="2,4,4,5"] -[options='header'] - -|===== -|Feature component |Classic (V1) experience | V2 experience | V3 experience -|**UI experience**| Classic layout + - -Includes a standard top navigation, pages without a left navigation panel, and a static home page with limited customization options.| Improved look and feel + - -Includes a modular home page with customizable components, an application selector menu, and a left navigation panel for each application context. | Modern look and feel + -Includes a left navigation panel that dynamically adjusts its menu based on context and a modular home page with enhanced visual elements and customizable components. -|**Navigation experience**| Top navigation includes the application menu. + -Limited customization controls |Redesigned top navigation bar with an app selector and other icons + -Separate left navigation panel for each application context| Sliding left navigation panel with persona-based application icons + -A dynamic left navigation menu that adjusts its contents according to the application context. -|**Home page experience** | Static home page with limited customization control a| Modular home page with customizable components |Modular home page with customizable components, enhanced styling, and visual elements. - -[NOTE] -==== -The SDK also supports a V4 focused home page experience [earlyAccess eaBackground]#Early Access#. For more information, see xref:full-app-customize.adoc#_enable_the_v4_focused_home_page_experience[Enable the V4 focused home page experience]. -==== - -|**Feature availability**| Enabled by default| Disabled by default | Disabled by default -|===== --- +== UI experience modes +ThoughtSpot supports V3 and V4 home page and navigation experiences for full application embedding. + +[width="100%", cols="5,^3,^3"] +[options="header"] +|==== +|Feature |V3 experience + +`HomePage.ModularWithStylingChanges` |V4 experience + +`HomePage.Focused` +|`hideHomepageLeftNav` + +Hides the left navigation panel on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|`hiddenHomepageModules` + +Hides specific modules on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|`reorderedHomepageModules` + +Reorders modules on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag redBackground tick]#x# Not supported +|`homePageModules` + +Specifies which modules to show on the home page. +|[tag greenBackground tick]#✓# Supported +|[tag redBackground tick]#x# Not supported +|Left navigation panel customization +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|Custom reordering of left nav items +|[tag greenBackground tick]#✓# Supported +|[tag greenBackground tick]#✓# Supported +|==== **V3 navigation and home page experience** [.bordered] [.widthAuto] image::./images/v3-experience.png[V3 UI experience] -**V2 navigation and home page experience** +**V4 home page experience** [.bordered] [.widthAuto] -image::./images/v2-experience.png[V2 UI experience] +image::./images/v4-homepage-experience.png[V4 homepage experience] + -**V1 Classic experience** +//// +**Classic (V1) navigation and home page experience** [.bordered] [.widthAuto] image::./images/v1-experience.png[Classic experience] +//// == Customize the embedded application UI for your users - Before updating the UI experience, review the xref:full-app-customize.adoc#_ui_experience_modes[key features, limitations], and available SDK controls for customizing xref:customize-nav-full-embed.adoc[navigation] and the xref:customize-homepage-full-embed.adoc[home page]. For more information about the layout and UI elements in the V3 experience, refer to the link:https://docs.thoughtspot.com/cloud/latest/thoughtspot-homepage[ThoughtSpot Product Documentation, window=_blank]. @@ -92,72 +93,15 @@ Enables the V3 experience. The valid value is `PrimaryNavbarVersion.Sliding`. + Enables the modular or focused home page experience. Valid values include: ** `HomePage.ModularWithStylingChanges` (__Recommended for V3__) + Enables the V3 modular home page experience. You must include `primaryNavbarVersion` to update the UI experience to the V3 home page. -** `HomePage.Focused` [earlyAccess eaBackground]#Early Access# +** `HomePage.Focused` [earlyAccess eaBackground]#Early Access# + Enables the V4 focused home page experience, which consolidates the **Watchlist** and **Recents** sections into a single, focused view. + -** `HomePage.Modular` + -Enables the modular home page experience with customizable components. This experience does not include the styling options and visual changes available with the full V3 experience. We do not recommend using this option, as it will be deprecated in an upcoming release. - - -[IMPORTANT] -==== -* To enable the full V3 experience, both `primaryNavbarVersion` and `homePage` attributes must be set in the SDK. Not setting `primaryNavbarVersion` will result in no changes to the UI experience. -* If you include only the `homePage: HomePage.ModularWithStylingChanges` attribute in `discoveryExperience`, it will be ignored. + -* If you include only the homePage attribute with its value as `HomePage.Modular`, the V2 modular home page experience will be enabled. - -For information about these configuration combinations and their effects, see xref:full-app-customize.adoc#_ui_customization_options_and_resulting_experience[UI customization options and resulting experience]. -==== - -==== Upgrade from classic (V1) experience to V3 experience -To enable the V3 experience, set the `primaryNavbarVersion` and `homePage` parameters in the `discoveryExperience` object as shown in the following example. - -Note that these attributes use the values from the xref:PrimaryNavbarVersion.adoc[PrimaryNavbarVersion] and xref:HomePage.adoc[HomePage] enumerations. - -[source,JavaScript] ----- -// Import required components and enums for V3 experience -import { - AppEmbed, // Main class to embed the full ThoughtSpot app - HomePage, // Enum for home page experience settings - PrimaryNavbarVersion // Enum for V3 navigation experience -} from '@thoughtspot/visual-embed-sdk'; - -const embed = new AppEmbed("#embed", { - // Enable V3 navigation and home page experience - discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation - homePage: HomePage.ModularWithStylingChanges, // Enable V3 home page experience - }, - // Show navigation panels - showPrimaryNavbar: true, - //... other embed view configuration attributes -}); ----- - -==== Upgrade from the V2 experience to V3 experience -Both V2 and V3 experience modes support a modular home page with customizable components. The V3 modular home page experience includes additional improvements to the Watchlist, Trending, Learning, and Favorites panels. -To upgrade your UI to the V3 experience, set `homePage` to `HomePage.ModularWithStylingChanges`: +//// -[source,JavaScript] ----- -// Import required components and enums for V3 experience -import { - AppEmbed, // Main class to embed the full ThoughtSpot app - HomePage, // Enum for home page experience settings - PrimaryNavbarVersion // Enum for V3 navigation experience -} from '@thoughtspot/visual-embed-sdk'; +** `HomePage.Modular` + +Enables the modular home page experience with customizable components. This experience does not include the styling options and visual changes available with the full V3 experience. We do not recommend using this option, as it will be deprecated in an upcoming release. +//// -const embed = new AppEmbed("#embed", { - // Enable V3 navigation and home page experience - discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation experience - homePage: HomePage.ModularWithStylingChanges, // Enable V3 modular home page - }, - // Show navigation panels - showPrimaryNavbar: true, - //... other embed view configuration attributes -}); ----- [#_enable_the_v4_focused_home_page_experience] === Enable the V4 focused home page experience @@ -181,56 +125,27 @@ import { } from '@thoughtspot/visual-embed-sdk'; const embed = new AppEmbed("#embed", { - discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation experience - homePage: HomePage.Focused, // Enable V4 focused home page experience - }, - showPrimaryNavbar: true, - //... other embed view configuration attributes + discoveryExperience: { + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation experience + homePage: HomePage.Focused, // Enable V4 focused home page experience + }, + showPrimaryNavbar: true, + //... other embed view configuration attributes }); ---- -==== Post migration checks +==== Post upgrade checks After you enable the V3 experience: -* Ensure the UI shows the V3 navigation and home page. - -//// -+ -The following figure shows the user interface with the V3 experience: -+ -[.bordered] -[.widthAuto] -image::./images/new-nav3.png[New home page] -//// +* Verify whether the UI shows the new navigation and home page by default. * Verify that all the customization settings are applied correctly. * If you have set up custom routes for navigation within your embedded app, verify navigation workflows and check for breaking changes. -//// -=== Upgrade from classic (V1) experience to V2 experience -Setting `modularHomeExperience` to `true` in the SDK enables the V2 experience. - -[source,javascript] ----- -const embed = new AppEmbed("#embed", { - // Enable the V2 experience - modularHomeExperience: true, - //... other view config attributes -}); ----- - -[NOTE] -==== -The V2 experience will be deprecated in an upcoming release. ThoughtSpot strongly recommends upgrading to the V3 experience to ensure continued support and access to the latest features. -==== - -The following figure shows the user interface with the V2 experience enabled: - [.bordered] [.widthAuto] image::./images/homepage.png[New home page] -//// +//// === UI customization options and resulting experience The following table summarizes the resulting UI experience for different configuration combinations: @@ -352,7 +267,7 @@ a|`false` | V3 navigation and V4 home page experience |=== -- - +//// == Customize navigation experience @@ -368,9 +283,9 @@ In full application embedding, the home page is set as the default landing page A list page in ThoughtSpot refers to a page that displays a list of objects, such as Answers, Liveboards, and Liveboard schedules. The list pages include columns for sorting, filtering, tagging, sharing, or deleting objects. === List layouts -If your embed has the V3 navigation and homepage experience enabled, the ListPage v3 experience will be enabled by default. +If your embed has the V3 navigation and homepage experience enabled, the ListPage V3 experience is enabled by default. -The list layouts in full app embedding typically include columns such as *Name*, *Author*, *Favorites*, *Tags*, *Last Viewed* and more. For Liveboard lists, a *Verified* column is available to filter the list by verified objects. In addition to these columns, the ListPage v3 experience includes the **Views** column and the following enhancements: +The list layouts in full app embedding typically include columns such as *Name*, *Author*, *Favorites*, *Tags*, *Last Viewed* and more. For Liveboard lists, a *Verified* column is available to filter the list by verified objects. In addition to these columns, the ListPage V3 experience includes the **Views** column and the following enhancements: * Sorting options for **Name**, **Author**, and **Views** columns. * Filter addition by clicking the column header without opening the filter modal. This option is available for **Favorites**, **Views** columns, and **Verified** columns. @@ -398,7 +313,8 @@ const embed = new AppEmbed("#embed", { // hide Author, Share, and Tags columns on Answers and Liveboards listing pages hiddenListColumns: [ ListPageColumns.Author, - ListPageColumns.Share + ListPageColumns.Share, + ListPageColumns.Tags ], //... other view config attributes @@ -413,7 +329,7 @@ The `hiddenListColumns: [ListPageColumns.Share]` hides the *Share* column, but d == Additional customization controls xref:css-customization.adoc[CSS customization] allows overriding default styles in ThoughtSpot application pages. You can also use xref:theme-builder.adoc[Theme Builder] to explore the available CSS variables. -If there is a page element you cannot hide using ThoughtSpot or Visual Embed SDK options, you can use a CSS selector to target the element and apply CSS properties such as `display: none`;, `visibility: hidden`;, or `height: 0px` to hide it from the UI. To find the appropriate selector, use your browser’s *Inspect* tool to examine the style element in the *Elements* section of the browser's Developer Tools. +If there is a page element you cannot hide using ThoughtSpot or Visual Embed SDK options, you can use a CSS selector to target the element and apply CSS properties such as `display: none`, `visibility: hidden`, or `height: 0px` to hide it from the UI. To find the appropriate selector, use your browser's *Inspect* tool to examine the style element in the *Elements* section of the browser's Developer Tools. [source,css] ---- @@ -427,7 +343,6 @@ An example of using direct selectors in a file is available in the link:https:// You can also declare direct selectors using the xref:css-customization.adoc#_css_rules_using_selectors[rules] property in the Visual Embed SDK configuration. This is useful for real-time testing, especially in the Visual Embed SDK playground. Note the required format for encoding CSS rules as JavaScript objects. - == Additional resources * xref:full-embed.adoc[Embed full application] @@ -436,4 +351,9 @@ You can also declare direct selectors using the xref:css-customization.adoc#_css * xref:HostEvent.adoc[Host events] * xref:EmbedEvent.adoc[Embed Events] +== Related resources +* xref:customize-nav-full-embed.adoc[Customize the navigation for full application embedding] +* xref:customize-homepage-full-embed.adoc[Customize the home page for full application embedding] +* xref:full-embed.adoc[Embed full application] +* link:https://developers.thoughtspot.com/docs/typedoc/interfaces/AppViewConfig.html[AppViewConfig reference, window=_blank] diff --git a/modules/ROOT/pages/getting-started.adoc b/modules/ROOT/pages/getting-started.adoc index 803f62516..2a9165058 100644 --- a/modules/ROOT/pages/getting-started.adoc +++ b/modules/ROOT/pages/getting-started.adoc @@ -208,7 +208,15 @@ lb.trigger(HostEvent.UpdateRuntimeFilters, [{ `#container` is a selector for the DOM node which the code assumes is already attached to DOM. The SDK will render the ThoughtSpot component inside this container element. == Embed in a React app -ThoughtSpot provides React components for embedding Search, Liveboard, and the full ThoughtSpot application in a React app. The following code sample shows how to embed a Liveboard component in a React app: +ThoughtSpot provides React components for embedding Search, Liveboard, and the full ThoughtSpot application in a React app. + +[NOTE] +==== +If you are embedding ThoughtSpot using the React components (`@thoughtspot/visual-embed-sdk/react`), React 16.8 or later and React DOM are required as peer dependencies in your project. + +For information about React version support, see link:https://react.dev/versions[React releases, window=_blank]. +==== + +The following code sample shows how to embed a Liveboard component in a React app: [source,TypeScript] ---- diff --git a/modules/ROOT/pages/graphql-guide.adoc b/modules/ROOT/pages/graphql-guide.adoc deleted file mode 100644 index 24616f1e9..000000000 --- a/modules/ROOT/pages/graphql-guide.adoc +++ /dev/null @@ -1,232 +0,0 @@ -= GraphQL quick setup guide -:toc: true - -:page-title: GraphQL Guide -:page-pageid: graphql-guide -:page-description: ThoughtSpot Guide to GraphQL - -This section serves as a quick guide for initiating an interaction with ThoughtSpot's GraphQL endpoint. We will be using the Apollo client to interact with ThoughtSpot's GraphQL endpoint. - -== Pre-requisites - -Before you begin, make sure you have a JavaScript environment set up for your application. This requires `Node.js`, which you can download and install from link:https://nodejs.org/en/download/[https://nodejs.org/en/download/, window=_blank]. - -After Node.js is successfully installed, you can initiate a new project using the `npm init` command. - -== Install dependencies - -* @apollo/client -* graphql - -With npm -[source, shell] ----- -npm install @apollo/client graphql ----- - -With yarn -[source, shell] ----- -yarn add @apollo/client graphql ----- - -== Initializing Apollo client - -Import the following from the Apollo client library: - -[source, javascript] ----- -import { ApolloClient, InMemoryCache, gql } from '@apollo/client'; ----- - -Initialize the client using one of the methods described in the following sections. - -=== Using cookies - -For this method, we will utilize the cookies set by the browser for authentication. - -[source, javascript] ----- -const client = new ApolloClient({ - uri: BASE_URL + "/api/graphql/2.0", - cache: new InMemoryCache(), - credentials: "include", -}); ----- - -With the client defined above, add a link to ThoughtSpot's GraphQL endpoint and run queries. - -Because we're relying on cookies for authentication, it's important to have the cookies set up correctly before we run the queries. - -To make sure the cookies are in place, call the `login api` before running other queries. - -[source, javascript] ----- -client - .mutate({ - mutation: gql` - mutation Login { - login(username: "", password: "") - } - `, - }) - .then((result) => console.log(result)) - .catch((err) => console.log(err)); ----- - -[NOTE] -==== -You can also use your cluster's secret key here for authentication. For more information, see link:{{navprefix}}/trusted-auth#_secret_key_generation[Secret key generation]. -==== - -=== Cookieless authentication - -For this method, you need to obtain a full access token and use it for authentication. Let us first create a function to get a fill access token: - -[source, javascript] ----- -const getToken = async () => { - const fullAccessRes = await fetch( - BASE_URL + "/api/rest/2.0/auth/token/full", - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ username: "tsadmin", password: "admin" }), - } - ); - const fullAccessData = await fullAccessRes.json(); - return fullAccessData.token; -}; ----- - -Using this function, we can set up our client as shown in the following examples. Along with the imported functions described in the preceding example, you need `setContext` from the Apollo client library. - -[source, javascript] ----- -import { setContext } from "@apollo/client/link/context"; ----- - -[source, javascript] ----- -const authLink = setContext(async (_, { headers }) => { - // get the authentication token - const token = await getToken(); - // return the headers to the context so httpLink can read them - return { - headers: { - ...headers, - authorization: token ? `Bearer ${token}` : "", - }, - }; -}); - -// httpLink is the link to the graphql endpoint -const httpLink = createHttpLink({ - uri: BASE_URL + "/api/graphql/2.0" -}); ----- - -Now you can initialize the client as shown in this example: - -[source, javascript] ----- -const client = new ApolloClient({ - link: authLink.concat(httpLink), - cache: new InMemoryCache(), -}); ----- - -== Using the client - -After the client is set up, run a query. - -[source, javascript] ----- -client - .query({ - query: gql` - query GetCurrentUserInfo { - getCurrentUserInfo { - id - name - } - } - `, - }) - .then((result) => console.log(result)) - .catch((err) => console.log(err)); ----- - -To learn more about queries and mutations, see link:{{navprefix}}/graphql-play-ground/#_graphql_queries_and_mutations[GraphQL queries and mutations]. - -== Reset store on logout - -Apollo caches requests, so it's recommended to reset the store on logout. - -[source, javascript] ----- -client.resetStore() ----- - -To learn more about reset store, go to link:https://www.apollographql.com/docs/react/networking/authentication/#reset-store-on-logout[https://www.apollographql.com/docs/react/networking/authentication/#reset-store-on-logout, window=_blank]. - -== Integration with React - -=== Setting up Apollo Client -We can connect Apollo Client to React with the `ApolloProvider` component -Pass the client we created above to the `ApolloProvider` component. - -[source, javascript] ----- - - - ----- - -=== Using the useQuery hook -Import the following from the Apollo client library: - -[source, javascript] ----- -import { useQuery, gql } from '@apollo/client'; ----- - -Now you can use the `useQuery` hook to run queries. - - -[source, javascript] ----- -const GET_CURRENT_USER_INFO = gql` - query GetCurrentUserInfo { - getCurrentUserInfo { - id - name - } - } -`; - -function CurrentUserInfo() { - const { loading, error, data } = useQuery(GET_CURRENT_USER_INFO); - - if (loading) return

Loading...

; - if (error) return

Error : {error.message}

; - - return ( -
-

Current User Info

-

{data.getCurrentUserInfo.id}

-

{data.getCurrentUserInfo.name}

-
- ); -} ----- - -For more information, see link:https://www.apollographql.com/docs/react[https://www.apollographql.com/docs/react, window=_blank]. - -== Next steps - -Check the GraphQL APIs on the live playground: - -+++ GraphQL Playground +++ \ No newline at end of file diff --git a/modules/ROOT/pages/graphql-play-ground.adoc b/modules/ROOT/pages/graphql-play-ground.adoc deleted file mode 100644 index c3a561eb1..000000000 --- a/modules/ROOT/pages/graphql-play-ground.adoc +++ /dev/null @@ -1,194 +0,0 @@ -= GraphQL Playground -:toc: true - -:page-title: GraphQL Playground -:page-pageid: graphql-play-ground -:page-description: ThoughtSpot GraphQL Playground - -The GraphQL Playground [beta betaBackground]^Beta^ allows you to interact with v2.0 API endpoints using GraphQL. - -[NOTE] -==== -This feature is in beta and enabled by default on ThoughtSpot clusters. -==== - -== How to access GraphQL Playground - -ThoughtSpot users with developer or administrator privileges can access the GraphQL Playground from the *Develop* tab. - -To open the Playground, click *Develop* > *REST API* > *GraphQL Playground*. - -++++ -View the Playground -++++ - -== Playground experience -The GraphQL Playground provides an interactive development environment within your ThoughtSpot application instance. The Playground includes documentation, downloadable Schema, syntax highlighting, and error indicators. - -Code editor:: -The GraphQL code editor allows you to run queries and mutations and view API responses. Build your queries in the tab on the left side and click the Play button to view the API response. The code syntax is validated against the Schema and validation errors are highlighted as you type. -+ -The editor also allows you to add variables and HTTP headers to your query, and copy cURL commands for a GrpahQL operation. - -Settings icon:: -Allows defining schema polling attributes, query and response tracing parameters, font specification, and line width for the GraphQL code editor. - -Schema:: -The GraphQL schema consists of the data that a client can access. The schema defines the GraphQL API type and its objects, fields, and relationships. Note that the API calls are validated against the Schema. -+ -* To view all types defined in the Schema, click *Schema*. You can also use the following query snippet to get a list of types. - -+ -[source,JSON] ----- -query { - __schema { - types { - name - kind - description - fields { - name - } - } - } -} ----- - -* To download the Schema, click *Schema* > *Download*. - -Docs:: -Each type in the GraphQL schema includes a description field which is complied as documentation. To view documentation, click *Docs*. - -== GraphQL queries and mutations -The GraphQL Playground supports `query` and `mutation` operations. Both these types of operations consist of multiline JSON. You can also use copy Curl commands from an API request. - -[NOTE] ----- -The GraphQL clients must have a valid authorization token and user privileges to run query and mutation operations. ----- - -=== Query -A query operation is similar to a `GET` request that retrieves data in REST API. To fetch objects, data, and other details, you can run `query` operations. -A `query` must include the JSON object and all its sub-fields. For example, to get the details of a Liveboard, you must specify the Liveboard GUID in `fetchLiveboardData` and include the sub-fields. - -//// -If you try to return a field that is not a scalar, schema validation returns an error. -//// - -[source,JSON] ----- -query fetchLiveboardData { - fetchLiveboardData(metadata_identifier:"d084c256-e284-4fc4-b80c-111cb606449a") { - metadata_id - metadata_name - contents{ - column_names - } - } -} ----- - -If the request is valid, the endpoint returns the Liveboard data as shown in the example here: - -[source,json] ----- -{ - "data": { - "fetchLiveboardData": { - "metadata_id": "d084c256-e284-4fc4-b80c-111cb606449a", - "metadata_name": "(Sample) Sales Performance", - "contents": [ - { - "column_names": [ - "store", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Month(date)", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Total sales" - ] - }, - { - "column_names": [ - "product", - "Total sales" - ] - }, - { - "column_names": [ - "product", - "Total quantity purchased" - ] - }, - { - "column_names": [ - "state", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Month(date)", - "Total quantity purchased" - ] - } - ] - } - } -} ----- - -=== Mutation -A `mutation` operation creates, updates, or deletes a data object or its properties. It operates like the `POST` `PUT` or `DELETE` requests in REST API. - -A `mutation` request must include the following properties: - -* Mutation name -* Input properties of the mutable object -* Object properties to return from the server - -The following example shows the mutation code snippet for creating a user: - -[source,JSON] ----- -mutation { - createUser(name:"tsUser123", display_name:"tsUser123", password:"wiuefiouhwef@8213", email:"testUser@thoughtspot.com"){ - id, - name - } -} ----- -If the mutation request is successful, the GraphQL endpoint returns the following data in response: - -[source,JSON] ----- -{ - "data": { - "createUser": { - "id": "7f2b481c-256e-46fd-80a2-a23d251714e8", - "name": "tsUser123" - } - } -} ----- - -== Additional resources - -For detailed information about GraphQL operations and terminology, see link:https://graphql.org/learn/[GraphQL Documentation, window=_blank]. diff --git a/modules/ROOT/pages/graphql-playground.adoc b/modules/ROOT/pages/graphql-playground.adoc deleted file mode 100644 index 28113c964..000000000 --- a/modules/ROOT/pages/graphql-playground.adoc +++ /dev/null @@ -1,194 +0,0 @@ -= GraphQL Playground -:toc: true - -:page-title: GraphQL Playground -:page-pageid: graphql-playground -:page-description: ThoughtSpot GraphQL Playground - -The GraphQL Playground [beta betaBackground]^Beta^ allows you to interact with v2.0 API endpoints using GraphQL. - -[NOTE] -==== -This feature is in beta and enabled by default on ThoughtSpot clusters. -==== - -== How to access GraphQL Playground - -ThoughtSpot users with developer or administrator privileges can access the GraphQL Playground from the *Develop* tab. - -To open the Playground, click *Develop* > *REST API* > *GraphQL Playground*. - -++++ -View the Playground -++++ - -== Playground experience -The GraphQL Playground provides an interactive development environment within your ThoughtSpot application instance. The Playground includes documentation, downloadable Schema, syntax highlighting, and error indicators. - -Code editor:: -The GraphQL code editor allows you to run queries and mutations and view API responses. Build your queries in the tab on the left side and click the Play button to view the API response. The code syntax is validated against the Schema and validation errors are highlighted as you type. -+ -The editor also allows you to add variables and HTTP headers to your query, and copy cURL commands for a GrpahQL operation. - -Settings icon:: -Allows defining schema polling attributes, query and response tracing parameters, font specification, and line width for the GraphQL code editor. - -Schema:: -The GraphQL schema consists of the data that a client can access. The schema defines the GraphQL API type and its objects, fields, and relationships. Note that the API calls are validated against the Schema. -+ -* To view all types defined in the Schema, click *Schema*. You can also use the following query snippet to get a list of types. - -+ -[source,JSON] ----- -query { - __schema { - types { - name - kind - description - fields { - name - } - } - } -} ----- - -* To download the Schema, click *Schema* > *Download*. - -Docs:: -Each type in the GraphQL schema includes a description field which is complied as documentation. To view documentation, click *Docs*. - -== GraphQL queries and mutations -The GraphQL Playground supports `query` and `mutation` operations. Both these types of operations consist of multiline JSON. You can also use copy Curl commands from an API request. - -[NOTE] ----- -The GraphQL clients must have a valid authorization token and user privileges to run query and mutation operations. ----- - -=== Query -A query operation is similar to a `GET` request that retrieves data in REST API. To fetch objects, data, and other details, you can run `query` operations. -A `query` must include the JSON object and all its sub-fields. For example, to get the details of a Liveboard, you must specify the Liveboard GUID in `fetchLiveboardData` and include the sub-fields. - -//// -If you try to return a field that is not a scalar, schema validation returns an error. -//// - -[source,JSON] ----- -query fetchLiveboardData { - fetchLiveboardData(metadata_identifier:"d084c256-e284-4fc4-b80c-111cb606449a") { - metadata_id - metadata_name - contents{ - column_names - } - } -} ----- - -If the request is valid, the endpoint returns the Liveboard data as shown in the example here: - -[source,json] ----- -{ - "data": { - "fetchLiveboardData": { - "metadata_id": "d084c256-e284-4fc4-b80c-111cb606449a", - "metadata_name": "(Sample) Sales Performance", - "contents": [ - { - "column_names": [ - "store", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Month(date)", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Total sales" - ] - }, - { - "column_names": [ - "product", - "Total sales" - ] - }, - { - "column_names": [ - "product", - "Total quantity purchased" - ] - }, - { - "column_names": [ - "state", - "Total sales" - ] - }, - { - "column_names": [ - "item type", - "Month(date)", - "Total quantity purchased" - ] - } - ] - } - } -} ----- - -=== Mutation -A `mutation` operation creates, updates, or deletes a data object or its properties. It operates like the `POST` `PUT` or `DELETE` requests in REST API. - -A `mutation` request must include the following properties: - -* Mutation name -* Input properties of the mutable object -* Object properties to return from the server - -The following example shows the mutation code snippet for creating a user: - -[source,JSON] ----- -mutation { - createUser(name:"tsUser123", display_name:"tsUser123", password:"wiuefiouhwef@8213", email:"testUser@thoughtspot.com"){ - id, - name - } -} ----- -If the mutation request is successful, the GraphQL endpoint returns the following data in response: - -[source,JSON] ----- -{ - "data": { - "createUser": { - "id": "7f2b481c-256e-46fd-80a2-a23d251714e8", - "name": "tsUser123" - } - } -} ----- - -== Additional resources - -For detailed information about GraphQL operations and terminology, see link:https://graphql.org/learn/[GraphQL Documentation, window=_blank]. diff --git a/modules/ROOT/pages/mcp-server-changelog.adoc b/modules/ROOT/pages/mcp-server-changelog.adoc index 28b2d30c9..abb14bda8 100644 --- a/modules/ROOT/pages/mcp-server-changelog.adoc +++ b/modules/ROOT/pages/mcp-server-changelog.adoc @@ -25,6 +25,32 @@ This changelog lists the new features, enhancements, and other changes introduce // ============================================================ +== July 2026 +*API version string:* `?api-version=2026-05-01` + +*Upgrade notes*: Existing integrations using `?api-version=2026-05-01` or `?api-version=latest` will be automatically upgraded. + +[.cl-table, cols="1,4", frame=none, grid=none] +|==== +a| +[.cl-label] +*2026-07-10* + +a| + +[discrete] +==== Org switching tools +The OAuth MCP Server endpoints support the following MCP tools to discover the user's current Org and allow multi-Org users to switch to another Org mid-session without logging out or re-authenticating. + +* `list_orgs`: Returns a list of the Orgs that the ThoughtSpot account is currently an active member of, along with the Org used for the user session. +* `switch_org`: Switches the active Org for the current session. + +For more information, see xref:mcp-tool-reference-spotter3.adoc#org-switching-tools[Org switching tools]. + +[IMPORTANT] +The Org switching MCP tools are not available on Bearer-token connections. + +|==== + == May 2026 *API version string:* `?api-version=2026-05-01`. + @@ -61,6 +87,7 @@ Spotter MCP Server URLs now support date-based versioning, defined using the `?a ==== MCP tools and processing model [.version-badge.breaking]#Breaking# The MCP Server URL now points to the Spotter 3-powered MCP tools. With this enhancement, the legacy tools in your existing integrations will be replaced with new tools. If your app uses custom workflows, you must update your integrations to use the new MCP tools or pin a previous version using the `?api-version={YYYY-MM-DD}` parameter in the URL to preserve your existing changes. +[discrete] ===== Migration guidelines Migrating from your existing setup to the new version requires updating the MCP client configuration to point to the new URL and rewriting tool-calling logic to use the new asynchronous, polling model. @@ -105,6 +132,6 @@ Supports the following URLs: * `\https://agent.thoughtspot.app/bearer/mcp` (Bearer Token Apps) * `\https://agent.thoughtspot.app/openai/mcp` (OpenAI-compatible clients) -These URLs are deprecated as of the MCP Server 2026-05-01 release. See the xref:mcp-server-changelog.adoc#_mcp_server_url_changes_and_api_versioning[changelog] for more information. +These URLs are deprecated as of the MCP Server 2026-05-01 release. See the xref:mcp-server-changelog.adoc#_mcp_server_url_changes_and_api_versioning_breaking[changelog] for more information. |==== diff --git a/modules/ROOT/pages/mcp-server-spotter3.adoc b/modules/ROOT/pages/mcp-server-spotter3.adoc index 56d5ee302..e5f7cdfaf 100644 --- a/modules/ROOT/pages/mcp-server-spotter3.adoc +++ b/modules/ROOT/pages/mcp-server-spotter3.adoc @@ -44,7 +44,6 @@ Optionally, the `additional_context` parameter can be included to inject new ext |**API versioning support** |Not available. |Supports date-based API versioning, which is identified in the MCP Server URL as `?api-version=YYYY-MM-DD`. -|| |==== The following figure illustrates the MCP architecture, tool calls, and workflow in the new MCP Server version: @@ -87,8 +86,11 @@ ThoughtSpot creates a dashboard and returns a `dashboard_id` and a 6. *User asks a follow-up question (optional)* + The user can ask a follow-up question in the same session. The agent calls `send_session_message` again using the same `analytical_session_id`. ThoughtSpot retains the full conversation context automatically. The agent returns to step 4 to poll for the follow-up response. -For more information about the tool calls, input parameters, and response output, see xref:mcp-tool-reference-spotter3.adoc[MCP tool reference (Spotter 3)]. +7. *User switches to a different Org (optional)* + +If the user belongs to more than one Org and connects over OAuth, the agent calls `list_orgs` to return all accessible Orgs and flags the Org that the user is currently logged in. When the user requests a switch, the agent calls `switch_org` with the target `org_id`. For more information, see xref:mcp-tool-reference-spotter3.adoc#org-switching-tools[Org switching tools]. == Additional resources * For information about MCP, see the link:https://modelcontextprotocol.io[Model Context Protocol specification, window=_blank]. * For implementation details, see the link:https://github.com/thoughtspot/mcp-server[MCP Server GitHub repository, window=_blank]. + + diff --git a/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc b/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc index 509fb4d6b..b2a21dbd5 100644 --- a/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc +++ b/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc @@ -15,7 +15,11 @@ Send a natural language question or follow-up. * <> + Poll for streamed responses. * <> + -Create a Liveboard from session answers. +Create a dashboard from session answers. +* <> + +List the Orgs your account can access. (OAuth connections on Org-enabled instances only) +* <> + +Switch your active Org for the current session. (OAuth connections on Org-enabled instances only) * <> + Verify that the MCP Server is reachable. @@ -374,6 +378,141 @@ The following features are not supported directly. However, you can use the *Mak * Show underlying data, view query SQL or query visualizer * SpotIQ analysis +[#org-switching-tools] +== Org switching tools +Some ThoughtSpot deployments use Orgs, the isolated tenant workspaces within a single instance, each with its own users, data models, and resources. A user may have membership in one or several Orgs and want to analyze data from a different Org without ending the session, closing the connection, or re-authenticating. When connecting to the MCP Server over OAuth on an Org-enabled instance, users can discover and switch between Orgs during a session using `list_orgs` and `switch_org`. + +Org switching is a two-step pattern: + +. The agent calls `list_orgs` to retrieve the Orgs the user can currently access. The response identifies which Org is active and returns the `id` of the Orgs to switch. +. The agent calls `switch_org` with the target `org_id`. ThoughtSpot switches the active Org for the session and confirms the new active Org ID. + + +[IMPORTANT] +==== +* The `list_orgs` and `switch_org` tools are available on xref:mcp-integration.adoc#_mcp_server_url[OAuth MCP server endpoints] only. Bearer-token MCP Server endpoints do not expose these tools. +* The `switch_org` is a state-changing operation. Host applications that gate state-changing tools behind user confirmation will prompt the user before this tool runs. +* `list_orgs` reflects the user's current org membership at call time, not a snapshot taken at connection. Orgs granted or revoked mid-session appear immediately. +* Data models and resources in a target Org are not visible until after switching. Use `list_orgs` to discover Org names, then `switch_org` to enter an Org and explore its contents. +==== + +[#list_orgs] +=== list_orgs +Returns the `orgId` of the Orgs that the authenticated user has access to and flags the Org that the user is currently logged in to. + +Use the `list_orgs` tool to discover which Orgs you can reach before switching. The list always reflects your live access at call time, not a snapshot taken when you connected, so orgs granted or revoked since your session started are reflected immediately. + +==== Example call + +[div tabbed-code] +-- +[source,javascript] +---- +const orgs = await callMCPTool("list_orgs", {}); +---- + +[source,python] +---- +call_mcp_tool("list_orgs", {}) +---- +-- + +==== Response + +[source,json] +---- +{ + "orgs": [ + { + "id": 1001, + "name": "Finance", + "description": "Finance org — Q3 revenue models and budget data.", + "is_active": true + }, + { + "id": 1002, + "name": "Staging", + "description": "Staging environment for testing new data models." + } + ] +} +---- + +[cols="2,4", options="header"] +|==== +|Field|Description + +|`id`|Unique identifier for the Org. Pass this value to `switch_org` to switch to this Org. +|`name`|Display name of the Org. +|`description`|Description of the Org. +|`is_active`|Set to `true` if the user's current session is in this Org (the active Org). If the user's current session is not in this Org, this field is omitted from the response. +|==== + +[#switch_org] +=== switch_org +Switches the active Org for the current session. + +After a successful switch, all subsequent tool calls including `create_analysis_session` and data source lookups run against the Org to which the user is switched. This switch persists across all active sessions without requiring re-authentication or logging out. + +[IMPORTANT] +==== +* `switch_org` is a state-changing tool (`readOnlyHint: false`). Host applications that gate state-changing tools behind user confirmation will prompt the user before this tool runs. +* The data models that exist in a target Org cannot be viewed or accessed until after you have switched into it. Use `list_orgs` to discover available Orgs and then use `switch_org` to switch. +* After switching Orgs, the list of data model resources will stay static unless the LLM client provides dynamic resource lists. +* The active Org selection persists across sessions and applies across all your active sessions. It resets only on re-authentication or after prolonged inactivity. +==== + +==== Input parameters + +[cols="2,4", options="header"] +|==== +|Field|Description + +|`org_id` + +__Required__|The ID of the org to switch to. Obtain this value from `list_orgs`. +|==== + +=== Example call + +[div tabbed-code] +-- +[source,javascript] +---- +const result = await callMCPTool("switch_org", { + org_id: 1002 // ID of the org to switch to, obtained from list_orgs. +}); +---- + +[source,python] +---- +call_mcp_tool( + "switch_org", + {"org_id": 1002}, # ID of the org to switch to, obtained from list_orgs. +) +---- +-- + +=== Response + +[source,json] +---- +{ + "success": true, + "active_org_id": 1002 +} +---- + +* `success`: `true` if the org switch completed successfully. If the user lacks access to the requested Org, it is set as `false` and the active Org remains unchanged. +* `active_org_id`: The ID of the active Org. + + +=== Known limitations + +* Signing in currently relies on a browser cookie from your ThoughtSpot cluster. If your browser blocks third-party cookies, the connection may fail to complete. +* Re-authentication is required in the following scenarios: +** If connection remains idle for 14 days, the session expires and requires reauthentication. +** If your ThoughtSpot instance is temporarily unreachable when your session token renews, you may be signed out and prompted to reconnect. + [#check_connectivity] == check_connectivity Runs a basic health check to verify that the ThoughtSpot Spotter MCP Server is reachable and responding. Use this tool to confirm your connection before starting an analytical session. diff --git a/modules/ROOT/pages/rest-api-csharp-sdk.adoc b/modules/ROOT/pages/rest-api-csharp-sdk.adoc new file mode 100644 index 000000000..52269c2ea --- /dev/null +++ b/modules/ROOT/pages/rest-api-csharp-sdk.adoc @@ -0,0 +1,337 @@ += C# SDK for REST APIs +:toc: true +:toclevels: 3 + +:page-title: REST API C# SDK +:page-pageid: rest-api-sdk-csharp +:page-description: Use the C# SDK to call ThoughtSpot REST API v2 endpoints from .NET applications. + +The link:https://github.com/thoughtspot/rest-api-sdk/tree/release/sdks/csharp[REST API C# SDK, window=_blank] provides a client library to interact with ThoughtSpot REST API v2 endpoints from `.NET` applications. The SDK targets `net8.0` and ships both synchronous and asynchronous variants of every API method. + +The SDK package is available on link:https://www.nuget.org/packages/ThoughtSpot.RestApi.Sdk[NuGet, window=_blank]. + +== Before you begin + +Before you begin, check the following prerequisites: + +* Your environment targets .NET 8 (`net8.0`) or later. +* You have access to a ThoughtSpot instance and the following information: +** The URL of your ThoughtSpot instance +** User credentials (username and password, or a secret key for trusted authentication) +* You have user privileges and object permissions to view, edit, or create ThoughtSpot objects and resources. + +== Import the SDK + +Install the package: + +Using the .NET CLI:: + +[source,bash] +---- +dotnet add package ThoughtSpot.RestApi.Sdk --version 2.27.0 +---- + +Using the NuGet Package Manager console:: + +[source,bash] +---- +Install-Package ThoughtSpot.RestApi.Sdk -Version 2.27.0 +---- + +== API client configuration +All SDK clients are configured with an `ApiClientConfiguration` record. Provide your ThoughtSpot instance URL and one authentication option, then build your client using `CreateAsync`. + +`CreateAsync` is the recommended entry point. It is required for server-sent event (SSE) streaming methods and for automatic token refresh when using `Username`+`Password`, `Username`+`SecretKey`, or `TokenProvider`. + +[source,csharp] +---- +using ThoughtSpot.RestApi.Sdk; +using ThoughtSpot.RestApi.Sdk.Api; +using ThoughtSpot.RestApi.Sdk.Model; + +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + Username = "your-username", + Password = "your-password", +}; + +var api = await ThoughtSpotRestApi.CreateAsync(config); +---- + +=== Configuration options +[width="100%", cols="2,2,4"] +[options="header"] +|==== +|Option|Default|Description +|`Host`|—|Required. Base URL of your ThoughtSpot instance, for example, `\https://my-cluster.thoughtspot.cloud`. +|`Username` / `Password`|`null`|Credentials for password-based authentication. The SDK fetches and refreshes a bearer token automatically. +|`Username` / `SecretKey`|`null`|Credentials for trusted authentication. Use when Trusted authentication is enabled on your instance. +|`TokenProvider`|`null`|An async callback (`Func>`) invoked before every request. You own caching and refresh logic inside this function. +|`BearerToken`|`null`|Static bearer token. Does not refresh. Requests fail with 401 after the token expires. Use `TokenProvider` or `CreateAsync` for automatic refresh instead. +|`TokenValiditySeconds`|`300`|How long (in seconds) a fetched token is considered valid before the SDK refreshes it. The value is sent to the server and used client-side. +|`ConnectTimeout`|60 seconds|TCP connection establishment timeout. Matches the Java SDK's `connectTimeoutMillis` default. +|`ReadTimeout`|300 seconds|Time allowed to read a response after the connection is established. Matches the Java SDK's `readTimeoutMillis` default. +|`WriteTimeout`|300 seconds|Time allowed to send a request body. Matches the Java SDK's `writeTimeoutMillis` default. +|`IgnoreSslErrors`|`false`|Disables SSL certificate validation. Use only for development or test environments with self-signed certificates. +|`EnableRetries`|`false`|Set to `true` to enable the built-in Polly retry pipeline. +|`RetryPipeline`|`null`|A custom Polly `ResiliencePipeline`. Used only when `EnableRetries` is `true`. Falls back to `RetryConfiguration.Default` when `null`. +|`DefaultHeaders`|Empty|Headers added to every outgoing request. +|==== + +== Authentication +The SDK supports the following authentication modes. These modes use automatic token management and require `CreateAsync`. + +* xref:rest-api-csharp-sdk.adoc#username-and-password[Username and password] +* xref:rest-api-csharp-sdk.adoc#username-and-secret-key[Username and secret key] +* xref:rest-api-csharp-sdk.adoc#token-provider[Token provider] + +[NOTE] +==== +The SDK also accepts a static BearerToken. However, a static token does not refresh and when it expires, all requests fail with HTTP 401. Use the `Username` and `Password`, `Username` and `SecretKey`, or `TokenProvider` modes instead. +==== + +[#username-and-password] +=== Username and password +The SDK calls the `fullAccessToken` API internally with the provided credentials to obtain a bearer token on startup. The token is cached and refreshed automatically 30 seconds before it expires. No token management is required in your application code. + +[source,csharp] +---- +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + Username = "your-username", + Password = "your-password", +}; + +var api = await ThoughtSpotRestApi.CreateAsync(config); +var me = await api.GetCurrentUserInfoAsync(); +Console.WriteLine($"Logged in as: {me.Name}"); +---- + +[#username-and-secret-key] +=== Username and secret key (trusted authentication) +Use this mode when Trusted authentication is enabled on your ThoughtSpot instance. The SDK calls the `fullAccessToken` API internally with the provided username and xref:trusted-auth-secret-key.adoc[secret key] to obtain a bearer token on startup. The token is cached and refreshed automatically 30 seconds before it expires. No token management is required in your application code. + +[source,csharp] +---- +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + Username = "your-username", + SecretKey = "your-secret-key", +}; + +var api = await ThoughtSpotRestApi.CreateAsync(config); +---- + +[#token-provider] +=== Token provider +Use this mode when you manage tokens externally, for example, through an identity provider or a secrets vault. The `TokenProvider` delegate is invoked before every request. Implement your own caching and refresh logic inside the delegate. + +[source,csharp] +---- +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + TokenProvider = async cancellationToken => + await myIdentityProvider.FetchBearerAsync(cancellationToken), +}; + +var api = await ThoughtSpotRestApi.CreateAsync(config); +---- + +== Per-tag API classes and the aggregate client +The SDK exposes the ThoughtSpot REST API surface through two complementary access styles: + +* **28 per-tag API classes**: Each covers one functional area. Use a focused class when you only need a narrow surface (for example, `UsersApi`, `MetadataApi`, or `AIApi`). +* **`ThoughtSpotRestApi`**: Aggregates all 28 API classes behind a single object. Use this when your application calls endpoints across multiple areas. + +Both styles are created with `CreateAsync` and take the same `ApiClientConfiguration`: + +[source,csharp] +---- +// Using the aggregate client +var api = await ThoughtSpotRestApi.CreateAsync(config); +var users = await api.SearchUsersAsync(new SearchUsersRequest()); + +// Using a focused per-tag class +var usersApi = await UsersApi.CreateAsync(config); +var users = await usersApi.SearchUsersAsync(new SearchUsersRequest()); +---- + +== Synchronous and asynchronous usage +Every method has both an asynchronous variant (`XxxAsync`) and a blocking synchronous variant (the same name without the `Async` suffix). Use the synchronous variant from code that cannot use `await`. + +[source,csharp] +---- +// Async (recommended) +var me = await api.GetCurrentUserInfoAsync(); + +// Synchronous (blocking) +var me = api.GetCurrentUserInfo(); +Console.WriteLine(me.Name); +---- + +== Access response status and headers +Every method has a `WithHttpInfo` / `WithHttpInfoAsync` variant that returns an `ApiResponse` wrapping the HTTP status code, response headers, and deserialized data. + +[source,csharp] +---- +var response = await api.GetCurrentUserInfoWithHttpInfoAsync(); +Console.WriteLine(response.StatusCode); // e.g. 200 +Console.WriteLine(response.Data.Name); +---- + +[#streaming-sse] +== Streaming (SSE) +Endpoints that return server-sent events (SSE) expose a `XxxStreamAsync` method returning `IAsyncEnumerable`. This enables real-time streaming of AI responses from Spotter endpoints. Streaming requires the API class to be built with `CreateAsync`. + +[source,csharp] +---- +var aiApi = await AIApi.CreateAsync(config); + +await foreach (var chunk in aiApi.SendAgentConversationMessageStreamingStreamAsync( + conversationIdentifier: conversationId, + sendAgentConversationMessageStreamingRequest: new SendAgentConversationMessageStreamingRequest + { + Messages = new List { "What is the total revenue by region?" }, + })) +{ + Console.Write(chunk); +} +---- + +== File uploads +Multipart endpoints, for example, dbt and Style Customization, accept a `FileParameter` built from a `Stream` with an optional filename and content type. + +[source,csharp] +---- +var dbtApi = await DbtApi.CreateAsync(config); + +await using var stream = File.OpenRead("project.zip"); +await dbtApi.DbtConnectionAsync( + connectionName: "my-connection", + databaseName: "MY_DB", + importType: "ZIP_FILE", + fileContent: new FileParameter("project.zip", stream)); +---- + +[NOTE] +==== +The SDK automatically rewinds seekable upload streams before each retry attempt. If a stream is not seekable, the SDK aborts with a non-retryable error rather than sending incomplete data. +==== + +== File downloads +Export endpoints return a `FileParameter` wrapping the response stream, filename, and content type. + +[source,csharp] +---- +var reportsApi = await ReportsApi.CreateAsync(config); + +var file = await reportsApi.ExportLiveboardReportAsync( + new ExportLiveboardReportRequest + { + MetadataIdentifier = liveboardId, + FileFormat = "PDF", + }); + +await using var output = File.Create("report.pdf"); +await file.Content.CopyToAsync(output); +---- + +== Error handling +Failed calls throw `ThoughtSpot.RestApi.Sdk.Client.ApiException`. The exception exposes: + +* `ErrorCode`: the HTTP status code. +* `Message`: a human-readable error message. +* `ErrorContent`: the deserialized error response body. +* `Headers`: the HTTP response headers. + +[source,csharp] +---- +try +{ + await api.SearchUsersAsync(new SearchUsersRequest()); +} +catch (ThoughtSpot.RestApi.Sdk.Client.ApiException ex) +{ + Console.WriteLine($"{ex.ErrorCode}: {ex.Message}"); + Console.WriteLine(ex.ErrorContent); +} +---- + +== Retries +Retries are disabled by default. Set `EnableRetries = true` on `ApiClientConfiguration` to enable the built-in Polly pipeline, up to three attempts with exponential backoff (1 s / 2 s / 4 s) and up to 500 ms of random jitter, applied on network errors and `429`, `500`, `502`, and `503` responses. + +[source,csharp] +---- +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + Username = "your-username", + Password = "your-password", + EnableRetries = true, +}; +---- + +To apply a custom pipeline to a single client instance, set `RetryPipeline`: + +[source,csharp] +---- +var config = new ApiClientConfiguration +{ + Host = "https://your-thoughtspot-instance.thoughtspot.cloud", + Username = "your-username", + Password = "your-password", + EnableRetries = true, + RetryPipeline = new ResiliencePipelineBuilder() + .AddRetry(new RetryStrategyOptions { MaxRetryAttempts = 5 }) + .Build(), +}; +---- + +To set a global fallback pipeline used by all instances that do not supply a `RetryPipeline`: + +[source,csharp] +---- +RetryConfiguration.Default = new ResiliencePipelineBuilder() + .AddRetry(new RetryStrategyOptions { MaxRetryAttempts = 5 }) + .Build(); +---- + +== Runtime reconfiguration +You can swap the host, credentials, or timeouts at runtime without restarting your application. Call `ApplyConfigurationAsync` on any API client with a new `ApiClientConfiguration`. + +The swap is atomic. In-flight requests complete against the old configuration before the underlying resources are disposed. + +[source,csharp] +---- +var newConfig = config with +{ + Host = "https://new-cluster.thoughtspot.cloud", + Username = "new-username", + Password = "new-password", +}; + +await api.ApplyConfigurationAsync(newConfig); +---- + +== Supported versions + +[width="100%", cols="2,2"] +[options="header"] +|==== +|ThoughtSpot release|Recommended SDK version +|ThoughtSpot Cloud 26.8.0.cl|v2.27.0 or later +|==== + + +== Additional resources + +* link:https://www.nuget.org/packages/ThoughtSpot.RestApi.Sdk[ThoughtSpot.RestApi.Sdk on NuGet, window=_blank] +* link:https://github.com/thoughtspot/rest-api-sdk/tree/release/sdks/csharp[SDK source on GitHub, window=_blank] +* xref:authentication.adoc[REST API v2 authentication] +* +++REST API v2 Playground+++ +* xref:rest-api-v2-reference.adoc[REST API v2 reference] +* xref:rest-apiv2-changelog.adoc[REST API v2 changelog] diff --git a/modules/ROOT/pages/rest-api-java-sdk.adoc b/modules/ROOT/pages/rest-api-java-sdk.adoc index 92512748e..e4285cb47 100644 --- a/modules/ROOT/pages/rest-api-java-sdk.adoc +++ b/modules/ROOT/pages/rest-api-java-sdk.adoc @@ -281,6 +281,7 @@ Note the recommendation of Java SDK: [options='header'] |==== |ThoughtSpot release version|Supported SDK version +a|ThoughtSpot Cloud: 26.8.0.cl | v2.27.0 or later a|ThoughtSpot Cloud: 26.7.0.cl | v2.26.0 or later a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later diff --git a/modules/ROOT/pages/rest-api-python-sdk.adoc b/modules/ROOT/pages/rest-api-python-sdk.adoc new file mode 100644 index 000000000..a2567bc18 --- /dev/null +++ b/modules/ROOT/pages/rest-api-python-sdk.adoc @@ -0,0 +1,389 @@ += Python SDK for REST API +:toc: true +:toclevels: 3 + +:page-title: Python SDK for REST API +:page-pageid: python-sdk +:page-description: Use the ThoughtSpot Python SDK to integrate REST API v2 in Python applications. The SDK is an async-first, fully-typed client generated from the ThoughtSpot OpenAPI specification. + +The ThoughtSpot Python SDK is an async-first, fully-typed client generated from the ThoughtSpot REST API v2.0 OpenAPI specification. It wraps every endpoint into a typed Python method and supports both asynchronous and synchronous invocation, transparent token refresh, server-sent event (SSE) streaming, file uploads and downloads, and typed exception handling. + +The Python SDK is available on link:https://pypi.org/project/thoughtspot-rest-api-sdk/[PyPI, window=_blank]. + +== Prerequisites +Before you begin, ensure that: + +* Your environment is using Python 3.9 or later +* You have a valid ThoughtSpot user account with API access + +== Install the SDK + +Install the latest release from PyPI: + +[source,bash] +---- +pip install thoughtspot-rest-api-sdk +---- + +== Getting started +The ThoughtSpot Python SDK uses a single configuration field for bearer-token based authentication: `Configuration.access_token`. That field supports multiple input shapes, so you can start with a fixed token for simple use cases or use an automatic provider for production-grade token refresh. + +The SDK is async-first, but authentication works consistently across both async and synchronous SDK methods. When you supply a callable or the built-in token provider, the SDK resolves authentication at request time, so token refresh applies transparently to all API calls. + +=== Supported authentication options +The SDK supports a static token string, the built-in token provider, or your own callable token in `Configuration`. + +[width="100%",cols="1,2,3"] +[options="header"] +|==== +|Mode |When to use |How to configure + +|Static token |Use for short-lived scripts, testing purposes, or when your application already has a valid token. |Pass the bearer token string directly. + +|Custom callable |Custom identity provider or token store when your application fetches or refreshes tokens through its own identity flow. |Pass a sync or async function that returns a token string. + +|Built-in token provider a|Recommended in production environments when: + +* You are authenticating directly against ThoughtSpot +* You want the SDK to manage token refresh +* You want to avoid writing your own token lifecycle code. |Use `ThoughtSpotTokenProvider`. + +|==== + +=== Option 1: Static bearer token +Pass a bearer token string directly in the SDK configuration. + +[source,python] +---- +from thoughtspot_rest_api_sdk import Configuration, ThoughtSpotRestApi + +config = Configuration(host=BASE_URL, access_token="YOUR_BEARER_TOKEN") +---- + +In this mode, the SDK sends the token in the authorization header on each request. If the token expires, you must replace it manually. + +=== Option 2: Built-in token provider +The SDK includes a built-in `ThoughtSpotTokenProvider` for applications that require automatic token minting and refresh without writing their own token manager. + +This provider calls ThoughtSpot's `/auth/token/full` endpoint, caches the returned token until it nears expiry, and refreshes it automatically when needed. It also avoids redundant refreshes by collapsing concurrent refresh requests into a single token mint operation. + +For basic authentication, specify `password`: + +[source,python] +---- +from thoughtspot_rest_api_sdk import Configuration, ThoughtSpotRestApi, ThoughtSpotTokenProvider + +BASE_URL = "https://your-cluster.thoughtspot.cloud" # Replace with your ThoughtSpot cluster URL. + +# Basic authentication, supply password +provider = ThoughtSpotTokenProvider(BASE_URL, "USERNAME", password="PASSWORD") +config = Configuration(host=BASE_URL, access_token=provider) + +async with ThoughtSpotRestApi(configuration=config) as client: + user = await client.get_current_user_info() + print(user.name) +---- + +For trusted authentication, supply `secret_key`: + +[source,python] +---- +provider = ThoughtSpotTokenProvider(BASE_URL, "USERNAME", secret_key="YOUR_SECRET_KEY") +---- + +=== Option 3: Custom token callable +If your application already knows how to fetch or refresh tokens, you can pass a zero-argument function instead of a token string. The function can be synchronous or asynchronous, and the SDK invokes it for each request. + +[source,python] +---- +async def token_supplier() -> str: + return await my_identity_provider.fetch_bearer() + +config = Configuration(host=BASE_URL, access_token=token_supplier) +---- + +This pattern gives you full control over how tokens are sourced. For example, your callable can retrieve a token from an in-memory cache, an external identity provider, or a secrets-backed broker. + +== How to use +Create a `Configuration`, pass it to an `ApiClient`, and make calls through `ThoughtSpotRestApi` or a focused per-tag class such as `UsersApi` or `MetadataApi`. + +[source,python] +---- +import asyncio +from thoughtspot_rest_api_sdk import Configuration, ThoughtSpotRestApi + +BASE_URL = "https://your-cluster.thoughtspot.cloud" # Replace with your ThoughtSpot cluster URL. + +async def main(): + config = Configuration(host=BASE_URL, access_token="YOUR_BEARER_TOKEN") # Replace with a valid bearer token. + # Pass Configuration directly; the client manages its own connection pool. + # To share one pool across several API classes, build an ApiClient + # explicitly and pass that instead. See the Per-tag API classes section. + async with ThoughtSpotRestApi(configuration=config) as client: + + # Get current user + user = await client.get_current_user_info() + print(user.name) + + # Search with a request body (dict or the typed request model) + users = await client.search_users({"record_offset": 0, "record_size": 10}) + for u in users: + print(u.name) + +asyncio.run(main()) +---- + +=== Synchronous usage +Every async method has a blocking `*_sync` variant. No event loop or `await` is needed: + +[source,python] +---- +from thoughtspot_rest_api_sdk import Configuration, ThoughtSpotRestApi + +config = Configuration(host=BASE_URL, access_token="YOUR_BEARER_TOKEN") +client = ThoughtSpotRestApi(configuration=config) + +user = client.get_current_user_info_sync() +print(user.name) +---- +This makes the SDK usable from synchronous frameworks such as Django, Flask, scripts, and Jupyter notebooks. + +=== Per-tag API classes +`ThoughtSpotRestApi` exposes every endpoint on one class. For a focused surface, instantiate a per-tag class against a shared `ApiClient`. All classes share the same connection pool and authentication: + +[source,python] +---- +from thoughtspot_rest_api_sdk import ApiClient, Configuration, UsersApi, MetadataApi + +async with ApiClient(config) as api_client: + users = UsersApi(api_client) + metadata = MetadataApi(api_client) + await users.search_users({"record_offset": 0, "record_size": 10}) +---- + +The following per-tag classes are available: + +[width="100%",cols="1,2"] +[options="header"] +|==== +|Class |Endpoint group +|`AIApi` |AI and Spotter endpoints +|`AuthenticationApi` |Authentication and token management +|`CollectionsApi` |Collections management +|`ConnectionConfigurationsApi` |Connection configuration management +|`ConnectionsApi` |Data connection management +|`CustomActionApi` |Custom actions +|`CustomCalendarsApi` |Custom calendars +|`DBTApi` |dbt integration +|`DataApi` |Data fetch and search +|`EmailCustomizationApi` |Email customization +|`GroupsApi` |User group management +|`JobsApi` |Scheduled job management +|`LogApi` |Audit and security logs +|`ManualTranslationApi` |Manual translation +|`MetadataApi` |Metadata search, TML import/export, tags +|`OrgsApi` |Org management +|`ReportsApi` |Report export (Liveboard, Answer) +|`RolesApi` |Role-based access control +|`SchedulesApi` |Liveboard schedules +|`SecurityApi` |Object sharing and permissions +|`StyleCustomizationApi` |Style and branding customization +|`SystemApi` |System configuration and info +|`TagsApi` |Tag management +|`UsersApi` |User management +|`VariableApi` |Variables +|`VersionControlApi` |Git version control integration +|`WebhooksApi` |Webhook configuration +|`ThoughtSpotRestApi` |Mega-facade — all endpoints +|==== + +=== Accessing response status and headers +Each method has a `*_with_http_info` (and `*_sync_with_http_info`) variant that returns status code, headers, and deserialized data together: + +[source,python] +---- +response = await client.get_current_user_info_with_http_info() +print(response.status_code) +print(response.headers) +print(response.data) +---- + +=== Streaming (SSE) +Endpoints that return SSE streams expose an additional `*_stream` async generator that yields events as they arrive: + +[source,python] +---- +from thoughtspot_rest_api_sdk.models import SendAgentConversationMessageStreamingRequest + +async for event in client.send_agent_conversation_message_streaming_stream( + conversation_identifier="CONVERSATION_ID", + send_agent_conversation_message_streaming_request=( + SendAgentConversationMessageStreamingRequest(messages=["Hello"]) + ), +): + if event.get("type") == "text-chunk": + print(event.get("content", ""), end="", flush=True) +---- + +=== File uploads + +Multipart endpoints accept file content as raw bytes, a `(filename, bytes)` tuple, or an open file handle: + +[source,python] +---- +with open("project.zip", "rb") as f: + await client.dbt_connection( + connection_name="my-connection", + database_name="MY_DB", + import_type="ZIP_FILE", + file_content=f, + ) +---- + +=== File downloads + +Export endpoints return binary content as bytes. Write them to disk using `pathlib.Path`: + +[source,python] +---- +from pathlib import Path + +data = await client.export_liveboard_report( + metadata_identifier="LIVEBOARD_ID", + file_format="PDF", +) +Path("report.pdf").write_bytes(data) +---- + +=== Error handling +API errors raise typed exceptions. Catch by HTTP status code, or catch the base `ApiException`: + +[source,python] +---- +from thoughtspot_rest_api_sdk.exceptions import ( + ApiException, # base class, all API errors + BadRequestException, # 400 + UnauthorizedException, # 401 + ForbiddenException, # 403 + NotFoundException, # 404 + ConflictException, # 409 + UnprocessableEntityException, # 422 + ServiceException, # 5xx +) + +try: + await client.search_metadata({"metadata": [{"type": "LIVEBOARD"}]}) +except UnauthorizedException: + # Refresh credentials and retry + ... +except ApiException as e: + print(e.status, e.reason, e.body, e.headers) +---- + +Every exception exposes `.status`, `.reason`, `.body`, `.data`, and `.headers`. + +=== Retries +Retries are *off by default*. Enable automatic retries with exponential backoff and jitter by setting `retries` on `Configuration`: + +[source,python] +---- +config = Configuration(host=BASE_URL, access_token="...", retries=3) +---- + +When enabled, the SDK retries on `429, 502, 503, 504` status codes and on network or timeout errors. Once the retry budget is exhausted, the final response is returned and raises the usual typed exception. + +[NOTE] +==== +ThoughtSpot uses POST for many read endpoints. POST requests are retried by default. To avoid retrying non-idempotent write calls, restrict the eligible methods: + +[source,python] +---- +config.retry_methods = {"GET", "PUT", "DELETE"} +---- +==== + +=== Configuration reference +[width="100%",cols="2,1,4"] +[options="header"] +|==== +|Option |Default |Description +| `access_token` | `None` | Bearer token string, or a callable returning a token +| `verify_ssl` | `True` | Set `False` for clusters with self-signed certificates +| `ssl_ca_cert` / `ca_cert_data` | `None` | Custom CA bundle (file path / PEM string) +| `cert_file` / `key_file` | `None` | Client certificate and key for mutual TLS +| `proxy` | `None` | Proxy URL, for example, `http://127.0.0.1:8888` +| `connection_pool_maxsize` | `100` | Maximum number of concurrent connections +| `timeout` | `None` | Default request timeout, in seconds (float) or an `httpx.Timeout` +| `connect_timeout` / + +`read_timeout` / + +`write_timeout` / + +`pool_timeout` | `None` | Per-phase default timeouts in seconds; phases left unset default to 300s +| `default_headers` | `{}` | Headers added to every request +| `retries` | `None` (off) | Max retry attempts; set `> 0` to enable automatic retries +| `retry_backoff_factor` | `0.5` | Base seconds for exponential backoff (plus jitter) +| `retry_max_backoff` | `30` | Cap on a single retry's sleep, in seconds +| `retry_statuses` | `{429, 502, 503, 504}` | Status codes that trigger a retry +| `retry_methods` | all | Restrict retries to specific HTTP methods +|==== + +The default request timeout is **300s** when nothing is configured. The timeout and header options are constructor arguments: + +[source,python] +---- +config = Configuration( + host=BASE_URL, + access_token="...", + connect_timeout=5, + read_timeout=60, + default_headers={"X-My-App": "demo"}, +) +---- + +A single call can still override these: +`await client.search_users({...}, _request_timeout=30, _headers={"X-Trace": "1"})`. +`_request_timeout` accepts a float (all phases) or a `(connect, read)` tuple of floats. + +[NOTE] +==== +For clusters with self-signed certificates, disable verification: + +[source,python] +---- +config = Configuration(host=BASE_URL, access_token="YOUR_BEARER_TOKEN", verify_ssl=False) +---- +==== + +=== Updating configuration at runtime + +To apply a new `Configuration` to an existing client, for example, after rotating +credentials or changing timeouts, call `apply_configuration`: + +[source,python] +---- +client.apply_configuration(Configuration(host=BASE_URL, access_token=NEW_TOKEN)) +---- +This rebuilds the underlying API client. For continuous token refresh, you do not +need this. Set `access_token` to a callable; it is invoked +on every request. + + +== Supported versions + +[width="100%" cols="2,2"] +[options='header'] +|==== +|ThoughtSpot release version|Recommended SDK version +a|ThoughtSpot Cloud: 26.8.0.cl | v2.27.0 or later +a|ThoughtSpot Cloud: 26.7.0.cl | v2.26.0 or later +|==== + +== Documentation for API endpoints + +The full list of available methods is on the `ThoughtSpotRestApi` class. For more information, see link:https://github.com/thoughtspot/rest-api-sdk/blob/release/sdks/python/thoughtspot_rest_api_sdk/api/thought_spot_rest_api.py[thoughtspot_rest_api_sdk/api/thought_spot_rest_api.py, window=_blank]. + +== Additional resources + +* xref:rest-apiv2-changelog.adoc[REST API v2 changelog] +* link:https://pypi.org/project/thoughtspot-rest-api-sdk/[thoughtspot-rest-api-sdk on PyPI, window=_blank] +* link:https://github.com/thoughtspot/rest-api-sdk/tree/release/sdks/python[Python SDK source on GitHub, window=_blank] +* link:https://developers.thoughtspot.com/docs/rest-api-v2[REST API v2 Playground, window=_blank] diff --git a/modules/ROOT/pages/rest-api-sdk-libraries.adoc b/modules/ROOT/pages/rest-api-sdk-libraries.adoc index 0db64352d..31eafefd1 100644 --- a/modules/ROOT/pages/rest-api-sdk-libraries.adoc +++ b/modules/ROOT/pages/rest-api-sdk-libraries.adoc @@ -1,17 +1,22 @@ -= REST API v2.0 SDKs += SDK libraries :toc: true :toclevels: 1 -:page-title: REST API SDKs -:page-pageid: rest-api-sdk -:page-description: Use REST API SDKs to call APIs in a language-specific way. +:page-title: SDK libraries +:page-pageid: rest-api-sdk-libraries +:page-description: ThoughtSpot provides SDK libraries that allow you to integrate ThoughtSpot REST APIs in your application. ThoughtSpot provides native SDK libraries to help client applications call REST APIs in a specific language format. -Currently, the REST API client libraries are available for xref:rest-api-sdk-typescript.adoc[TypeScript] and xref:rest-api-java-sdk.adoc[Java]. These SDKs provide language-specific client libraries to call APIs from client applications. +The following SDKs provide client libraries to call APIs from your applications: + +* xref:rest-api-sdk-typescript.adoc[TypeScript SDK] +* xref:rest-api-java-sdk.adoc[Java SDK] +* xref:rest-api-python-sdk.adoc[Python SDK] +* xref:rest-api-sdk-csharp.adoc[C# SDK] == Community SDKs -You can use the following open-source, community-supported SDKs. +The following community-maintained SDK libraries are available for ThoughtSpot REST API integration. These SDKs are not officially maintained by ThoughtSpot. [IMPORTANT] ==== @@ -20,7 +25,6 @@ You can use the following open-source, community-supported SDKs. * ThoughtSpot-supported SDKs may not be backward-compatible with these community-based SDKs. ==== - [width="100%" cols="2,4"] [options='header'] |==== @@ -30,7 +34,6 @@ You can use the following open-source, community-supported SDKs. **Language**: Python + |link:https://github.com/thoughtspot/thoughtspot_tml[thoughtspot_tml, window=_blank]| Package for working with ThoughtSpot Modeling Language (TML) files programmatically + - **Language**: Python + |==== @@ -40,6 +43,5 @@ You can use the following open-source, community-supported SDKs. For more information about REST APIs, use the following resources: * For information about supported authentication types, see xref:authentication.adoc[REST API v2 authentication]. -* Browse through the +++REST API v2 Playground+++ before you start constructing your API requests. The playground offers an interactive portal with comprehensive information about the API endpoints, request and response workflows. * For information about supported API endpoints, see xref:rest-api-v2-reference.adoc[REST API v2 reference]. * For information about new and deprecated features and enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2 Changelog]. diff --git a/modules/ROOT/pages/rest-api-sdk-typescript.adoc b/modules/ROOT/pages/rest-api-sdk-typescript.adoc index 452dba9e6..12744fa42 100644 --- a/modules/ROOT/pages/rest-api-sdk-typescript.adoc +++ b/modules/ROOT/pages/rest-api-sdk-typescript.adoc @@ -203,6 +203,7 @@ Note the version recommendations for your ThoughtSpot instances: [options='header'] |==== |ThoughtSpot release version|Recommended SDK version +a|ThoughtSpot Cloud: 26.8.0.cl | v2.27.0 or later a|ThoughtSpot Cloud: 26.7.0.cl | v2.26.0 or later a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later diff --git a/modules/ROOT/pages/rest-api-v2-metadata-search.adoc b/modules/ROOT/pages/rest-api-v2-metadata-search.adoc index 718d098b8..109bf50fb 100644 --- a/modules/ROOT/pages/rest-api-v2-metadata-search.adoc +++ b/modules/ROOT/pages/rest-api-v2-metadata-search.adoc @@ -4,7 +4,7 @@ :page-title: Using REST API v2.0 metadata/search endpoint :page-pageid: rest-apiv2-metadata-search -:page-description: Many use cases are possible with the very V2.0 metadata/search endpoint +:page-description: Many use cases are possible with the V2.0 metadata/search endpoint The `link:https://developers.thoughtspot.com/docs/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fmetadata%2Fsearch-metadata[/metadata/search, target=_blank]` endpoint is the most versatile of all metadata endpoints. It can be used to search for lists or to retrieve very detailed information about specific objects. This endpoint replaces `metadata/list`, `metadata/listobjectheaders`, `metadata/details`, and `metadata/listvizheaders` from REST API v1. @@ -86,7 +86,7 @@ The response from any call to `metadata/search` returns an array of link:https:/ "metadata_detail": null, "metadata_header": {...}, "visualization_headers": null, - "stats": null, + "stats": null }, ... ] @@ -112,7 +112,7 @@ The value of `metadata_header` is a complex object with the most important set o "name": "Snowflake", "description": "Connection to Snowflake data warehouse", "author": "67e15c06-d153-4924-a4cd-ff615393b60f", - "authorName": "UserA, + "authorName": "UserA", "hasLenientDiscoverability": false, "descriptionAutoGenerated": false, "authorDisplayName": "UserA", @@ -3601,7 +3601,7 @@ The `permissions` object takes an array of objects that define a `principal` and The `share_mode` can be `READ_ONLY` ('Can View' in the UI), `MODIFY` ('Can Edit' in the UI), or `NO_ACCESS`, which shows denial of access and is not visible in the UI. === tag_identifiers -Thoughtspot objects can be assigned multiple **tags**, and the `/metadata/search` endpoint allows you to filter for items with a set of tags using the `tag_identifiers` parameter, which takes an array of tag names or GUIDs. +ThoughtSpot objects can be assigned multiple **tags**, and the `/metadata/search` endpoint allows you to filter for items with a set of tags using the `tag_identifiers` parameter, which takes an array of tag names or GUIDs. Including multiple tags behaves as a logical **OR** operation, retrieving all content with **any** of the listed tags. The following request body retrieves any content tagged with `Staging` or `Accounting` tags: @@ -3735,12 +3735,98 @@ The `include_details` parameter in the `metadata/search` API request adds the eq } ---- -The details of each object type is a complex object that is unique to each object type within ThoughtSpot. +The details of each object type are a complex object that is unique to each object type within ThoughtSpot. -The JSON output for `metadata_detail` varies for Liveboards based on the response version specified in the API request. For more information, see xref:rest-api-v2-metadata-search.adoc#lbResponse[Liveboard response format]. +The JSON output for `metadata_detail` varies for Liveboards based on the response version specified in the API request. For more information, see xref:rest-api-v2-metadata-search.adoc#_response_format_for_liveboards[Liveboard response format]. + +=== include_personalised_views +When fetching Liveboard metadata with `include_details: true`, you can also request the list of Personalized Views saved on each Liveboard by setting `include_personalised_views` to `true`. + +This parameter is only applicable to `LIVEBOARD` type objects and has no effect on other metadata types. It requires `include_details` to also be `true` in the same request. + +[source,JSON] +---- +{ + "metadata": [ + { + "type": "LIVEBOARD" + } + ], + "include_details": true, + "include_personalised_views": true +} +---- + +When both parameters are set to `true`, each Liveboard object in the response will include a `personalised_views` array nested within `metadata_detail`: + +[source,JSON] +---- +[ + { + "metadata_id": "4081f38c-1f26-4354-a418-af14136e3bd7", + "metadata_name": "Sales Overview", + "metadata_type": "LIVEBOARD", + "metadata_detail": { + "personalised_views": [ + { + "view_guid": "6e3d11b2-9a4f-4c1e-8b5a-2f3d7e0c1a9d", + "view_name": "Q1 Revenue View", + "author_guid": "59481331-ee53-42be-a548-bd87be6ddd4a", + "author_name": "Alice Johnson", + "is_public": false + }, + { + "view_guid": "a9c42f17-3b8e-4d20-91fa-7c5e2d0b8f3a", + "view_name": "Executive Summary", + "author_guid": "67e15c06-d153-4924-a4cd-ff615393b60f", + "author_name": "Bob Smith", + "is_public": true + } + ] + }, + "metadata_header": {...}, + "visualization_headers": null, + "dependent_objects": null, + "incomplete_objects": null, + "stats": null + } +] +---- + +The `personalised_views` array contains one object per saved Personalized View on the Liveboard. Each object has the following properties: + +[width="100%",cols="2,1,4"] +|==== +|Property|Type|Description + +|`view_guid` +|String +|Unique GUID of the Personalized View. + +|`view_name` +|String +|Display name of the Personalized View as set by its author. + +|`author_guid` +|String +|GUID of the ThoughtSpot user who created this Personalized View. + +|`author_name` +|String +|Display name of the user who created this Personalized View. + +|`is_public` +|Boolean +|If `true`, the Personalized View is shared publicly and visible to other users with access to the Liveboard. If `false`, the view is private to its author. +|==== + +[NOTE] +==== +If a Liveboard has no saved Personalized Views, the `personalised_views` array will be empty (`[]`). If `include_personalised_views` is `false` or omitted, the `personalised_views` key will not appear in `metadata_detail`. +==== === include_dependent_objects -Data objects in ThoughtSpot like Tables and Worksheets have **dependent objects** that connect to them. Liveboards and Answers do not have dependent objects, they can only be a dependent object. +Data objects in ThoughtSpot like Tables and Worksheets have **dependent objects** that connect to them. Liveboards and Answers do not have dependent objects; they can only be a dependent object. An object can only be deleted if all of its dependent objects are deleted first. @@ -3793,7 +3879,7 @@ The `include_hidden_objects`, `include_incomplete_objects`, and `include_auto_cr === Pagination settings -By default, the following pagination settings are applied to the API response retrieved search metadata endpoint: +By default, the following pagination settings are applied to the API response retrieved from the search metadata endpoint: [source,JSON] ---- diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index dfaf6a4ac..65bf32f9a 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -106,9 +106,19 @@ Permanently deletes a saved Spotter agent conversation and all its associated me |ThoughtSpot Cloud: __26.7.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ +a|`POST /api/rest/2.0/ai/memory/import` + +Imports Spotter memory entries in bulk for backup, migration, or seeding purposes. +|ThoughtSpot Cloud: __26.8.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`POST /api/rest/2.0/ai/memory/export` + +Exports Spotter memory entries for audit, backup, or cross-environment migration. +|ThoughtSpot Cloud: __26.8.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ |===== -- + == Authentication [div boxAuto] @@ -178,7 +188,7 @@ a| +++ *Security settings*. -. Click *Edit*. -. In the *CSP visual embed hosts* text box, add the domain names. For valid domain name formats, See xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. -. Click *Save changes*. - - [NOTE] ==== Only users with a valid embed license can add Visual Embed hosts. ==== -*Through the REST API v2* +In the UI:: -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add your application domain as a CSP visual embed host for your ThoughtSpot application instance by entering valid values for the parameter `visual_embed_hosts`. +. On your ThoughtSpot application instance, go to the *Develop* page. +. If your instance has Orgs, click the *All Orgs* tab. +. Go to *Customizations* > *Security settings*. +. Click *Edit*. +. In the *CSP visual embed hosts* text box, add the domain names. For valid domain name formats, see xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. +. Click *Save changes*. +Through the REST API v2:: +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add your application domain as a CSP visual embed host for your ThoughtSpot application instance by entering valid values for the parameter `visual_embed_hosts`. ++ [source,cURL] ---- curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/system/security-settings/configure' \ @@ -141,18 +140,19 @@ curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/system/security-settings/c ==== Add URLs to CSP connect-src allowlist If you plan to use a custom action or webhook to send data to an external endpoint or application, you must add the domains of the target endpoints or applications to the `CSP connect-src` allowlist. -. On your ThoughtSpot application instance, go to *Develop* page. +In the UI:: +. On your ThoughtSpot application instance, go to the *Develop* page. . If your instance has Orgs, click the *All Orgs* tab. . Go to *Customizations* > *Security settings*. . Click *Edit*. -. In the *CSP connect-src domains* text box, add the domain names. For valid domain name formats, See xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. +. In the *CSP connect-src domains* text box, add the domain names. For valid domain name formats, see xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. . Click *Save changes*. -*Through the REST API v2* - -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add domains of the target endpoints or applications to the `connect_src_urls` parameter for your ThoughtSpot application instance. +Through the REST API v2:: +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add domains of the target endpoints or applications to the `connect_src_urls` parameter for your ThoughtSpot application instance. ++ [source,cURL] ---- curl -X POST \ @@ -173,11 +173,11 @@ curl -X POST \ [#csp-trusted-domain] ==== Add other trusted domains - To import images, fonts, and stylesheets from external sites, or load the content from an external site using an iFrame element, you must add the source URLs as trusted domains in the CSP allowlist. For example, in the Liveboard Note tiles, if you want to insert an image from an external site or embed content from an external site in an iFrame, you must add domain URLs of these sites to the CSP allowList. Similarly, to import fonts and custom styles from an external source, you must add the source URL as a trusted domain in ThoughtSpot. -. On your ThoughtSpot application instance, go to *Develop* page. +In the UI:: +. On your ThoughtSpot application instance, go to the *Develop* page. . If your instance has Orgs, click the *All Orgs* tab. . Go to *Customizations* > *Security settings* and configure the settings: + @@ -195,14 +195,16 @@ Add the domains from which you want host scripts. For more information, see xref Add the iframe source URL domains. //// +Through the REST API v2:: +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add source URLs of sites, where from you can import images, fonts, and stylesheets, as trusted domains to the `img_src_urls`, `font_src_urls`, `style_src_urls`, `script_src_urls` parameters. -*Through the REST API v2* - -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add source URLs of sites, where from you can import images, fonts, and stylesheets, as trusted domains to the `img_src_urls`, `font_src_urls`, `style_src_urls`, `script_src_urls` parameters. - ++ [NOTE] +==== To be able to add allowed urls for custom JavaScript through `script_src_urls`, `enabled` should be set to `true` for script-src customization. +==== ++ [source,cURL] ---- curl -X POST \ @@ -232,11 +234,11 @@ curl -X POST \ }' ---- - ==== Add permitted iFrame domains -Features such as link:https://docs.thoughtspot.com/software/latest/liveboard-notes[Liveboard Note tiles, window=_blank] and link:https://docs.thoughtspot.com/cloud/latest/chart-custom[custom charts, window=_blank] allow iFrame content. If you are planning to embed content from an external site, make sure the domain URLs of these sites are added to the iFrame domain allowlist: +Features such as link:https://docs.thoughtspot.com/software/latest/liveboard-notes[Liveboard Note tiles, window=_blank] and link:https://docs.thoughtspot.com/cloud/latest/chart-custom[custom charts, window=_blank] allow iFrame content. If you are planning to embed content from an external site, make sure the domain URLs of these sites are added to the iFrame domain allowlist. -. On your ThoughtSpot application instance, go to *Develop* page. +In the UI:: +. On your ThoughtSpot application instance, go to the *Develop* page. . If your instance has Orgs, click the *All Orgs* tab. . Go to *Customizations* > *Security settings*. . Click *Edit*. @@ -244,10 +246,10 @@ Features such as link:https://docs.thoughtspot.com/software/latest/liveboard-not . Click *Save changes*. -*Through the REST API v2* - -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add domain URLs of external sites using iFrame content are added to the `iframe_src_urls` parameter for your ThoughtSpot application instance. +Through the REST API v2:: +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add domain URLs of external sites using iFrame content to the `iframe_src_urls` parameter for your ThoughtSpot application instance. ++ [source,cURL] ---- curl -X POST \ @@ -267,31 +269,31 @@ curl -X POST \ [#cors-hosts] ==== Enable CORS - To allow your embedding application to call ThoughtSpot, access its resources, and render embedded content, add your host application domain URL as a trusted host for CORS. The CORS configuration on your instance controls which domains can access and modify your application content. To allow your application to call ThoughtSpot or its REST API endpoints, and request resources, you must add your application domain to the CORS allowlist. For example, if your website is hosted on the `example.com` domain and the embedded ThoughtSpot content is hosted on the `example.thoughtspot.com`, you must add the `example.com` domain to the CORS allowlist for cross-domain communication. You can also add `\http://localhost:8080` to the CORS allowlist to test your deployments locally. However, we recommend that you disable `localhost` access in production environments. If you enable CORS for your application domain, ThoughtSpot adds the `Access-Control-Allow-Origin` header in its API responses when your host application sends a request to ThoughtSpot. -To add domain names to the CORS allowlist, follow these steps: +In the UI:: +To add domain names to the CORS allowlist, complete these steps: . On your ThoughtSpot instance, navigate to the *Develop* page. -. If your instance has Orgs, you can configure CORS allowlists for all Orgs globally at the cluster-level or per Org. + +. If your instance has Orgs, you can configure CORS allowlists for all Orgs globally at the cluster level or per Org. + * For cluster-wide configuration, click the *All Orgs* tab. * To configure settings at the Primary Org level, click the *Primary Org* tab. -* To configure CORS settings at the Org-level, switch the Org context via Org switcher in the top navigation bar. - -. On *Develop* page, go to *Customizations* > *Security settings*. +* To configure CORS settings at the Org level, switch the Org context via the Org switcher in the top navigation bar. +. On the *Develop* page, go to *Customizations* > *Security settings*. . Click *Edit*. -. In the *CORS whitelisted domains* text box, add the domain names. For valid domain name formats, See xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. +. In the *CORS whitelisted domains* text box, add the domain names. For valid domain name formats, see xref:security-settings.adoc#csp-cors-hosts[Domain name format for CSP and CORS configuration]. . Click *Save changes*. -*Through the REST API v2* +Through the REST API v2:: -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add CORS allowlist for cross-domain communication to the parameter `cors_whitelisted_urls` for the cluster or for the Org. +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Add CORS allowlist for cross-domain communication to the parameter `cors_whitelisted_urls` for the cluster or for the Org. ++ [source,cURL] ---- curl -X POST \ @@ -314,6 +316,95 @@ curl -X POST \ }' ---- +[#custom-app-schemes] +==== Allow custom app schemes for mobile and hybrid embeds +If you are embedding ThoughtSpot in a mobile or hybrid application built with frameworks such as Capacitor or Ionic, your application may use a custom URL scheme (for example, `capacitor://localhost` or `ionic://localhost`) rather than an `https://` origin. + +To allow these origins to embed ThoughtSpot content, add the custom scheme URL to the *CSP visual embed hosts* and *CORS whitelisted domains* allowlists. + +[IMPORTANT] +==== +Before allowlisting custom schemes, note that allowlisting a shared app scheme such as `capacitor://localhost` or `ionic://localhost` does not uniquely identify your application. Any application on the same device that uses the same framework presents the same origin to the browser. This means: + +* Allowlisting `capacitor://localhost` grants embedding access to all Capacitor-based apps on that device, not just your app. +* Custom-scheme allowlisting enables the feature but cannot be used as an access control boundary. Do not rely on origin allowlisting alone as a security mechanism for custom-scheme embeds. +* Security for these embeds must be enforced through authentication. Use xref:trusted-auth-sdk.adoc[`AuthType.TrustedAuthTokenCookieless`] (cookieless trusted auth) to ensure that only authenticated users in your app can access ThoughtSpot content. +==== + +===== Add a custom scheme to CSP visual embed hosts + +. On your ThoughtSpot application instance, go to *Develop* > *Customizations* > *Security settings*. +* For cluster-wide configuration, click the *All Orgs* tab. CSP Visual Embed hosts configuration is allowe only at the instance level. +* To configure CORS settings at the Org level, click the *Primary Org* tab, and set the Org context via the Org switcher in the top navigation bar. +. Click *Edit*. +. In the *CSP visual embed hosts* text box, add your custom scheme URL. For example: ++ +---- +capacitor://localhost +---- +. Click *Save changes*. + +===== Add a custom scheme to CORS whitelisted domains +. On your ThoughtSpot application instance, go to *Develop* > *Customizations* > *Security settings*. +. Click *Edit*. +. In the *CORS whitelisted domains* text box, add your custom scheme URL. For example: + +`capacitor://localhost` +. Click *Save changes*. + +===== Add a custom scheme via REST API +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` endpoint and add the custom scheme URL to the `visual_embed_hosts` and `cors_whitelisted_urls` arrays: + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/system/security-settings/configure' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + --data-raw '{ + "cluster_preferences": { + "cors_whitelisted_urls": [ + "capacitor://localhost" + ], + "csp_settings": { + "visual_embed_hosts": [ + "capacitor://localhost" + ] + } + } +}' +---- + + +[source,cURL] +---- +curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/system/security-settings/configure' \ + -H 'Authorization: Bearer {token}' \ + -H 'Content-Type: application/json' \ + --data-raw '{ + "org_preferences": [ + { + "cors_whitelisted_urls": [ + "capacitor://localhost" + ] + } + ] +}' +---- + +After allowlisting the custom scheme, initialize the Visual Embed SDK using `AuthType.TrustedAuthTokenCookieless` in your Capacitor or Ionic application: + +[source,JavaScript] +---- +import { init, AuthType } from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://your-thoughtspot-instance.thoughtspot.cloud', + authType: AuthType.TrustedAuthTokenCookieless, + getAuthToken: () => fetch('/api/get-token') + .then(r => r.json()) + .then(d => d.token), + }); +---- [#csp-cors-hosts] ==== Domain name format for CSP and CORS configuration @@ -324,9 +415,9 @@ curl -X POST \ * You can add multiple domains to the CORS and CSP Visual Embed allowlists on the **Develop** **Customizations** > **Security Settings** page. Ensure that the CORS and CSP allowlists do not exceed 4096 characters. * *Protocol in the domain URL*: -** CSP hosts — The UI allows adding a domain URL with or without the protocol (`http/https`). However, to avoid long URLs in the CSP header, you can exclude the protocol in the domain URL strings. -** CORS hosts — The UI allows adding a domain URL with the protocol (`http/https`). If the domain URLs are using `https`, you can exclude the protocol in domain URL strings, because ThoughtSpot assigns `https` to the URLs by default. -** For localhost and non-HTTPS URLs — For non-HTTPs domains or localhost such as `localhost:3000`, if you add the domain without the protocol, the `https` protocol will be assigned to the URL by default. Due to this, the localhost domain with `http` (`\http://localhost:3000`) might result in a CSP or CORS error. Therefore, include the `http` protocol in the domain name strings for non-HTTPS domains and localhost. +** CSP hosts: The UI allows adding a domain URL with or without the protocol (`http/https`). However, to avoid long URLs in the CSP header, you can exclude the protocol in the domain URL strings. +** CORS hosts: The UI allows adding a domain URL with the protocol (`http/https`). If the domain URLs are using `https`, you can exclude the protocol in domain URL strings, because ThoughtSpot assigns `https` to the URLs by default. +** For localhost and non-HTTPS URLs: For non-HTTPs domains or localhost such as `localhost:3000`, if you add the domain without the protocol, the `https` protocol will be assigned to the URL by default. Due to this, the localhost domain with `http` (`\http://localhost:3000`) might result in a CSP or CORS error. Therefore, include the `http` protocol in the domain name strings for non-HTTPS domains and localhost. * **Port**: If your domain URL has a non-standard port such as 8080, specify the port number in the domain name string. * **Websocket endpoints**: + You can add Websocket (`wss://`) endpoints for external tool script integrations, for example, tools that open WebSocket connections from the browser. Only hosts explicitly listed with `wss://` are permitted. @@ -364,6 +455,13 @@ a|Domain URL strings without port If your domain URL has a non-standard port, for example `mysite.com:8080`, make sure you add the port number in the domain name string. |[tag greenBackground tick]#✓# Supported |[tag greenBackground tick]#✓# Supported 2*|[tag greenBackground tick]#✓# Supported + +|URLs with custom schemes such as: + +`capacitor://localhost` + +`ionic://localhost` + +|[tag greenBackground tick]#✓# Supported |[tag greenBackground tick]#✓# Supported a|[tag greenBackground tick]#✓# Supported |[tag greenBackground tick]#✓# Supported + |Wildcard (`\*`) , (`.*`) for domain URL + |[tag greenBackground tick]#✓# Supported |[tag greenBackground tick]#✓# Supported a|[tag orangeBackground tick]#✓# Partial support + @@ -424,10 +522,12 @@ If you have embedded ThoughtSpot content in your app, you may want your users to *Through the REST API v2* -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Set `block_full_app_access` to `true` to restrict user access to non-embedded application pages from the embedding application context. Enter values for `groups_identifiers_with_access` to selectively grant access to specific user groups. +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Set `block_full_app_access` to `true` to restrict user access to non-embedded application pages from the embedding application context. Enter values for `groups_identifiers_with_access` to selectively grant access to specific user groups. [NOTE] +==== To be able to gives access through `groups_identifiers_with_access`, the selective user access feature must be turned on in the *Admin settings*. +==== [source,cURL] ---- @@ -460,7 +560,7 @@ Many web browsers do not allow third-party cookies. If you are using authenticat However, if your implementation uses cookie-based authentication or xref:embed-authentication.adoc#none[AuthType.None], ensure that you enable partitioned cookies: -. On your ThoughtSpot application instance, go to *Develop* page. +. On your ThoughtSpot application instance, go to the *Develop* page. . If your instance has Orgs, click the *All Orgs* tab. . Go to *Customizations* > *Security settings*. . Click *Edit*. @@ -476,7 +576,7 @@ Safari blocks all third-party cookies and does not support partitioned cookies. *Through the REST API v2* -Send a `POST` request to `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Set `enable_partitioned_cookies` to `true` to ensure a cookie is set with the partitioned attribute for applications using cookie-based authentication . +Send a request to the `POST /api/rest/2.0/system/security-settings/configure` API endpoint. Set `enable_partitioned_cookies` to `true` to ensure a cookie is set with the partitioned attribute for applications using cookie-based authentication. [source,cURL] ---- @@ -498,12 +598,12 @@ To find the trusted authentication configuration for the specified auth type at For more information on the trusted authentication configuration through APIs, see xref:authentication.adoc[Configuring authentication settings]. -See xref:trusted-authentication.adoc[Trusted authentication] and xref:_secret_key_management[Secret key management] for other related information. +See xref:trusted-authentication.adoc[Trusted authentication] and xref:trusted-auth-secret-key.adoc[Secret key management] for other related information. == Retrieve security settings -You can retrieve the security settings for your ThoughtSpot instance by sending a `POST` request to `POST /api/rest/2.0/system/security-settings/search` API endpoint. +You can retrieve the security settings for your ThoughtSpot instance by sending a request to the `POST /api/rest/2.0/system/security-settings/search` API endpoint. You can define the `scope` to get the cluster-level settings (`scope` as `CLUSTER`), or the Org-level settings for the current Org (`scope` as `ORG`). If the `scope` is not specified, the API returns both cluster and Org settings based on user privileges. [source,cURL] diff --git a/modules/ROOT/pages/spotter-ai-memory-api.adoc b/modules/ROOT/pages/spotter-ai-memory-api.adoc new file mode 100644 index 000000000..ce4546424 --- /dev/null +++ b/modules/ROOT/pages/spotter-ai-memory-api.adoc @@ -0,0 +1,691 @@ += Spotter memory migration API +:toc: true +:toclevels: 2 + +:page-title: Spotter memory migration API +:page-pageid: spotter-memory-migration +:page-description: Use the AI memory REST API v2 endpoints to export and import Spotter memory across ThoughtSpot environments. +:keywords: Spotter memory, AI memory, memory migration, memory export, memory import, Spotter memory, REST API + +[beta betaBackground]#Beta# + +ThoughtSpot provides public REST API v2 endpoints to import and export memory for the following purposes: + +* To promote validated Spotter knowledge from a development environment to production. +* To replicate a gold-standard Spotter configuration across multiple Orgs at scale. +* To back up and restore Spotter memory as part of your deployment pipeline. + +[NOTE] +==== +The API endpoints support importing and exporting memory defined at the model level. Exporting or importing user memory and analyst memory are currently not supported. +==== + +== Memory migration workflow +Spotter accumulates memory, which includes rules (business logic) and recipes (query patterns), as users interact with data models. To migrate Spotter memory from one data model to another, or from a source environment to a target environment: + +. <> + +Call `POST /api/rest/2.0/ai/memory/export` with the GUIDs of the data models to migrate. +. <> + +Save and modify the exported file as needed. +. <> + +Call `POST /api/rest/2.0/ai/memory/import` to import Spotter memory content into ThoughtSpot. You can validate the import operation using the dry run operation and review `import_summaries` and `failures` before proceeding. + +=== Required permissions +To use Spotter memory migration APIs, the user requires the following privileges: + +* *Can manage Spotter* and at least view access to the data model. +* *Can use Spotter* and edit access to the data model, or `SPOTTER_COACHING_PRIVILEGE` to import memory entries. + +Users with administration access can also export and import Spotter memory. + +[#export-memory] +== Exporting Spotter memory +The `/api/rest/2.0/ai/memory/export` API endpoint lets you export Spotter memory records for the specified data models as a single YAML payload. You can review the exported data, modify its contents, and re-import it into a ThoughtSpot Org or another environment. While the exported payload is human-readable, we do not recommend modifying its structure before re-importing it, as doing so may corrupt or invalidate the memory. + +=== Request parameters +[cols="2,4", options="header"] +|=== +|Parameter | Description +| `sources` +a|__Array of strings__. A list of data models from which you want to export. +Specify the following attributes: + +* `type`. __String__. The source object type. Default value is `DATA_MODEL`. This is the default source type for Spotter memory, which includes the rules, recipes, and always-apply rules attached directly to a data model. +* `identifiers`. __Array of strings__. GUIDs or object IDs of the data models. +|| +|=== + +=== Example request + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/memory/export' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "sources": [ + { + "type": "DATA_MODEL", + "identifiers": [ + "cd252e5c-b552-49a8-821d-3eadaa049cca" + ] + } + ] +}' +---- + +=== Example response +The API returns a response object with the following details: + +* `content` + +The serialized memory payload in YAML format. The exported file includes an array of memories, including rules and recipes added to Spotter memory, and data model GUID and object ID if present. +* `type` + +Indicates if the memory type is `RULE` or `RECIPE`. If the type is `RULE`, the response shows the rule definition. If the type is `RECIPE`, the contents of the recipe such as task, steps, TML tokens are included in the response. +* `datamodel_sources` + +GUID and object ID of the data model object. + +You can edit it locally and import it into your environment using the import memory API endpoint. + +[source,JSON] +---- +{ + "content":{ + "memories":[ + { + "type":"RULE", + "content":{ + "rule_definition":"Revenue is defined as Sales Monthly." + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + + ] + }, + { + "type":"RULE", + "content":{ + "rule_definition":"Hot products: top 20 products by sales." + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + "GLOBAL" + ] + }, + { + "type":"RULE", + "content":{ + "rule_definition":"Sales operations are organized into three geographic regions: east, midwest, and west." + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + "GLOBAL" + ] + }, + { + "type":"RECIPE", + "content":{ + "user_query":"Weekly sales for June", + "recipe":{ + "task":"Show total sales by week for the month of June", + "steps":[ + { + "instruction":"Query sales by weekly date filtered to June month", + "analytical_mappings":{ + "tml_tokens":[ + "[sales]", + "[date].weekly", + "[date] = 'june'" + ], + "formulas":[ + + ] + } + } + ] + } + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + + ] + }, + { + "type":"RECIPE", + "content":{ + "user_query":"What is the total sales by date?", + "recipe":{ + "brief_summary":"Visualizes total sales revenue over time on a daily basis.", + "nl_query":"What is the total sales by date?", + "lossy_tml_tokens":"[date] [sales]", + "lossy_formulas":[ + + ] + } + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + + ] + }, + { + "type":"ALWAYS_APPLY_RULES", + "content":{ + "rules":[ + "When asking for 'top' results without specifying a number, default to top 20", + "Use sales column as primary metric; if sales data unavailable, fall back to quantity purchased column" + ] + }, + "datamodel_sources":[ + { + "guid":"cd252e5c-b552-49a8-821d-3eadaa049cca", + "obj_id":"SampleRetail-Apparel-cd252e5c" + } + ], + "tags":[ + + ] + } + ] + } +} +---- + +[#update-memory-file] +== Updating the memory file content +The export memory API endpoint returns a YAML payload with a single top-level `memories` key holding a list of memory items. It includes the following object properties: + +* `type` + +A typed `content` block, indicating `RULE` or `RECIPE`. +* `datamodel_sources` list + +GUID and object ID of the data models. +* `tags` __Optional__. + +You can modify this file, add target data models, and submit it back through the import memory API endpoint. + +[IMPORTANT] +==== +When editing a memory record, do not manually add new entries, especially under ALWAYS_APPLY_RULES. You can modify the values or remove the existing entries. If you must add new entries, use the UI workflow to ensure the memory entries are created in the correct format. +==== + +[source,yaml] +---- +memories: +- type: RULE + content: + rule_definition: "Revenue is defined as Sales Monthly." + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: [] + +- type: RULE + content: + rule_definition: "Hot products: top 20 products by sales." + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: + - GLOBAL + +- type: RULE + content: + rule_definition: "Sales operations are organized into three geographic regions: east, midwest, and west." + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: + - GLOBAL + +- type: RECIPE + content: + user_query: "Weekly sales for June" + recipe: + task: "Show total sales by week for the month of June" + steps: + - instruction: "Query sales by weekly date filtered to June month" + analytical_mappings: + tml_tokens: + - "[sales]" + - "[date].weekly" + - "[date] = 'june'" + formulas: [] + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: [] + +- type: RECIPE + content: + user_query: "What is the total sales by date?" + recipe: + brief_summary: "Visualizes total sales revenue over time on a daily basis." + nl_query: "What is the total sales by date?" + lossy_tml_tokens: "[date] [sales]" + lossy_formulas: [] + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: [] + +- type: ALWAYS_APPLY_RULES + content: + rules: + - "When asking for 'top' results without specifying a number, default to top 20" + - "Use sales column as primary metric; if sales data unavailable, fall back to quantity purchased column" + datamodel_sources: + - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506 + obj_id: RetailSales-3bc18302 + tags: [] +---- + +A file can contain multiple `RULE` and multiple `RECIPE` items for a data model, but at most one `ALWAYS_APPLY_RULES` item per data model. + +=== Memory item fields +[cols="2,4", options="header"] +|=== +| Field | Description +| `type` | Type can be `RULE`, `RECIPE`, or `ALWAYS_APPLY_RULES`. + + +* `RULE`. A single semantic rule. The content for this type must include `rule_definition` and the data model IDs. +* `RECIPE`. A serialized string that includes responses to the natural-language query. +* `ALWAYS_APPLY_RULES`. Mandatory rules that must always apply when generating queries for the data model. The content must include a `rules` list. +| `content` | Type-specific content block. +| `datamodel_sources` a| The data models the memory attaches to. Each item must list at least one source. Each entry identifies a data model via: + +* `guid`: the data model GUID. +* `obj_id`: A stable object ID, resolved to a GUID server-side. + +If both are supplied, `obj_id` takes precedence and `guid` is ignored entirely; `guid` takes effect only when `obj_id` is absent. Exported files populate `guid` and, if present, `obj_id` as well. + +[IMPORTANT] +==== +When `obj_id` is present, the accompanying `guid` is not used as a fallback. If an `obj_id` does not exist in the target environment, that item fails with `UNRESOLVED_SOURCE`. Remove or replace the stale `obj_id` values before importing across environments. +==== + +| `tags` |Free-form labels. +|| +|=== + +[#memory-file-limits] +=== Limits +Note the following limits for the import file and its content: + +[cols="2,1", options="header"] +|=== +| Limit | Default +| Uploaded file size | 10 MiB +| Total memory items | 10,000 +| `rule_definition` length | 1,000 characters +| `user_query` length | 1,000 characters +| `recipe` length | 2,000 characters +| `rules` combined length (`ALWAYS_APPLY_RULES`) | 2,000 characters + +The `rules` limit in `ALWAYS_APPLY_RULES` applies to the combined length across all entries in the list, not per entry. +| Tags per item | 10 +| Characters per tag | 50 +|| +|=== + +[#structure-rules] +=== Structural rules +* The document must be a mapping with a `memories` key whose value is a list. +* Unknown keys at the top level, within an item, or under `content` are rejected. +* Each item's `type` must be one of the three supported values, and `content` must match that type's shape. +* Null, empty-string, or incorrect type values in a required field are treated as missing. +* Non-string or empty `tags` entries are dropped; certain tags reserved for internal use are stripped automatically before the item is stored. + +[#cross-item-rules] +=== Cross-item rules +A data model referenced by more than one `ALWAYS_APPLY_RULES` item is rejected. Combine them into a single item's `rules` list. + +[#import-memory] +== Importing Spotter memory +The `/api/rest/2.0/ai/memory/import` API endpoint imports Spotter memory content from a YAML payload into a target data model in your ThoughtSpot environment. Use this API endpoint to migrate Spotter memory with rules and recipes when seeding a new data model, or moving content across Orgs or between different environments. + +[IMPORTANT] +==== +* The import operation *replaces* the existing memory of the target data models with the YAML content. The import operation uses a targeted replacement model, not an append. +//To incrementally sync changes, export the relevant memory filtered by time window using the export memory API endpoint, merge with your existing file manually, and upload the merged result. +* The import replaces memory entries only for the data models referenced in the uploaded file. +* Since import replaces the existing memory entries, ThoughtSpot strongly recommends using the `dry_run` mode to validate before committing the content to the data model. +* The API operation does not include semantic or column-level validation, so you must ensure that the column names are valid in the target environment. +* If any part of the import fails, all changes are rolled back. +==== + +=== Request parameters + +Pass the following parameters in the API request body. + +[cols="2,4", options="header"] +|=== +| Parameter | Description +| `content` +|__String__. The full contents of the Spotter memory payload YAML file passed as a string. The content structure is the same as the payload received from the export memory API endpoint. The memory payload will be imported to the data models specified in the `datamodel_sources` property of the content string. For more information about the contents and structure of the import file, see xref:spotter-ai-memory-api.adoc#update-memory-file[Updating the memory file content]. + +| `dry_run` +a|__Boolean__. Controls whether the import runs as a preview or executes for real. + + +* When set to `true`, the API validates the memory payload and returns preview counts without writing anything to the target data models. ThoughtSpot recommends running a dry run first to inspect validation errors before committing. + +* When set to `false`, the API executes the import. The import replaces the existing global memories on the data models referenced in the payload with the entries supplied in the payload. If the import fails, ThoughtSpot rolls back the target to its pre-import state. + +|| +|=== + +=== Dry run operation +The import operation deletes and replaces the existing global memories on the referenced data models. ThoughtSpot strongly recommends using a `dry_run` to validate the payload and preview the results. + +* If the API returns validation errors, verify the `validation_failures` and `diagnostics` fields in the API response and fix errors if any. +* If the API returns a clean preview without any validation errors, call the API again with `dry_run` set as `false`. + +=== Example request + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/memory/export' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "content": "{ \"content\": \"memories:\\n- type: RULE\\n content:\\n rule_definition: Revenue is defined as Sales Monthly.\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n- type: RULE\\n content:\\n rule_definition: \\\"Hot products: top 20 products by sales.\\\"\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n- type: RULE\\n content:\\n rule_definition: \\\"Sales operations are organized into three geographic regions: east, midwest, and west.\\\"\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags:\\n - GLOBAL\\n- type: RECIPE\\n content:\\n user_query: Weekly sales for June\\n recipe: \\\"{\\\\\\\"task\\\\\\\": \\\\\\\"Show total sales by week for the month of June\\\\\\\", \\\\\\\"steps\\\\\\\": [{\\\\\\\"instruction\\\\\\\": \\\\\\\"Query sales by weekly date filtered to June month\\\\\\\", \\\\\\\"analytical_mappings\\\\\\\": {\\\\\\\"tml_tokens\\\\\\\": [\\\\\\\"[sales]\\\\\\\", \\\\\\\"[date].weekly\\\\\\\", \\\\\\\"[date] = '\''june'\''\\\\\\\"], \\\\\\\"formulas\\\\\\\": []}}]}\\\"\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n- type: RECIPE\\n content:\\n user_query: Compare this quarter'\''s sales with previous quarter by region\\n recipe: \\\"{\\\\\\\"task\\\\\\\": \\\\\\\"Compare total sales by region for this quarter versus previous quarter\\\\\\\", \\\\\\\"steps\\\\\\\": [{\\\\\\\"instruction\\\\\\\": \\\\\\\"Query total sales by region for this quarter compared to previous quarter\\\\\\\", \\\\\\\"analytical_mappings\\\\\\\": {\\\\\\\"tml_tokens\\\\\\\": [\\\\\\\"sales\\\\\\\", \\\\\\\"date = '\''this quarter'\''\\\\\\\", \\\\\\\"date = '\''last quarter'\''\\\\\\\", \\\\\\\"region\\\\\\\"], \\\\\\\"formulas\\\\\\\": []}}]}\\\"\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n- type: RECIPE\\n content:\\n user_query: What is the total sales by date?\\n recipe: |-\\n 1. Brief Answer Summary\\n {\\n \\\"brief_summary\\\": \\\"Visualizes total sales revenue over time on a daily basis.\\\",\\n \\\"nl_query\\\": \\\"What is the total sales by date?\\\",\\n \\\"display_tml_tokens\\\": \\\"\\\"\\n }\\n\\n 2. Call NLSV2_Tool with these arguments\\n {\\n \\\"lossy_tml_tokens\\\": \\\"[date] [sales]\\\",\\n \\\"lossy_formulas\\\": []\\n }\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n- type: ALWAYS_APPLY_RULES\\n content:\\n rules:\\n - \\\"When asking for '\''top'\'' results without specifying a number, default to top 20\\\"\\n - \\\"Use sales column as primary metric; if sales data unavailable, fall back to quantity purchased column\\\"\\n datamodel_sources:\\n - guid: 62f3e9b5-4fcc-4352-b8ad-fdddc2287506\\n obj_id: RetailSales-3bc18302\\n tags: []\\n\" }", + "dry_run": true +}' +---- + +=== Example response + +[source,JSON] +---- +{ + "status": "SUCCESS", + "summary": [ + { + "memory_type": "RULES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 3, + "deleted_record_count": 3, + "inserted_record_count": 3, + "failed_record_count": 0 + }, + { + "memory_type": "RECIPES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 3, + "deleted_record_count": 3, + "inserted_record_count": 3, + "failed_record_count": 0 + }, + { + "memory_type": "ALWAYS_APPLY_RULES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 0, + "deleted_record_count": 0, + "inserted_record_count": 1, + "failed_record_count": 0 + } + ], + "validation_failures": [], + "diagnostics": [], + "operation_id": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506" + } +---- + + +=== Response parameters +Based on the status of the import operation, the API returns a response code. Note that the `200` response does not guarantee a successful import. Verify the `status` field in the response body to ensure there are no validation errors. + +[cols="2,5", options="header"] +|=== +| Parameter | Description +| `status` +| Terminal status of the import operation. After an import operation, the 200 response can include one of the following status values: + +* `SUCCESS` to indicate a successful import. +* `VALIDATION_FAILED`. File or row-level validation failed before any data was written. Inspect `validation_failures` for per-item error details. +* `FAILED` to indicate that the import operation has failed. Verify the diagnostics section. + +A `sub_status` of `ROLLED_BACK` means all changes are rolled back and the original memory is intact. + +A `sub_status` of `FAILURE` indicates a non-rollback error. +| `summary` +a| Per data model and memory type result entries. Null when the import failed before any record processing occurred. Each entry in the `summary` array covers one (memory type, target data model) combination. + +* `memory_type`: Type of memory these counts apply to: `RULES`, `RECIPES`, or `ALWAYS_APPLY_RULES`. +* `source`: Data source type and ID. Type is always `DATA_MODEL`. +* `existing_record_count`: Number of memory entries of this type that existed on the target data model before the import. +* `deleted_record_count`: Number of existing entries that were deleted during the import operation. +* `inserted_record_count`: Number of entries from the memory file that were inserted. +* `failed_record_count`: Number of records of this type that failed validation or processing. + +| `validation_failures` +a| Per-item validation failure entries. + +* `line_number`: Best-effort line number of the offending item in the YAML file. May be null when the line cannot be determined. +* `reason`: Machine-readable category for the failure. For more information, see xref:spotter-ai-memory-api.adoc#validation-error-reference[Validation errors]. +* `field_name`: Dotted path to the offending field within the item. For example, `content.rule_definition`. Absent when the failure is at the item level rather than the field level. +* `message`: Human-readable description of the failure. + +| `diagnostics` +a| Diagnostic message groups for fatal errors, rollbacks, and non-fatal warnings, each grouped by severity. + +`sub_status`:: +Severity or disposition of this diagnostic group: + +** `WARNING`: The import succeeded but with non-fatal caveats. For example, some older memory entries could not be fully cleaned up. +** `FAILURE`: A fatal error prevented the import from completing. The state of memory on the target may be unpredictable. +** `ROLLED_BACK`: The insert of new memory entries failed. Every successful insert was undone and the original memory is intact. +** `UNKNOWN`: Uncategorized diagnostic. + +`messages`:: +Human-readable messages for this diagnostic group. + +| `operation_id` +a| Server-generated identifier for this import operation. Include this value in support tickets to correlate server-side logs with the request. +|| +|=== + +=== Validations reference +The payload is fully validated before anything is written irrespective of the `dry_run` parameter setting. If any item fails validation, the entire import is rejected, with the failure details returned in the response. + +To avoid validation errors: + +* Ensure that the memory file and its content do not exceed the xref:spotter-ai-memory-api.adoc#memory-file-limits[limits]. A data model referenced by more than one `ALWAYS_APPLY_RULES` item is rejected. Ensure that you combine them into a single item's `rules` list. +* The content string does not include any unknown keys at the top level, within an item, or under `content`. +* Ensure that the `type` for each item is set to the three supported values (`RULE`, `RECIPE`, and `ALWAYS_APPLY_RULES`), and the `content` string for each memory entry matches that type's shape and all required fields are defined. +* Ensure that there are no non-string or empty `tags`. Certain tags reserved for internal use are stripped automatically before the item is stored. + +[#validation-error-reference] +=== Validation error reference + +If the validation fails, the API returns `200` with a terminal `status` of `VALIDATION_FAILED` or `FAILED`, and includes the details in the `validation_failures` and `diagnostics` sections of the API response. + +* *VALIDATION_FAILED*: Indicates schema or semantic validation failure. Inspect `validation_failures` and fix the items. Each entry in `validation_failures` carries one of the following error types: + +** `SCHEMA`: Indicates that YAML structure is invalid or malformed. +** `VALIDATION`: Indicates that a required field is missing, exceeds the limit, or an incorrect GUID. +** `CHAR_LIMIT`: Indicates that a content field exceeds the character limit. +** `UNRESOLVED_SOURCE`: A referenced data model GUID could not be resolved on the target. Check that all GUIDs in the memory file correspond to data models that exist on the target environment. +** `ACCESS_DENIED`: The user making the API request does not have edit access on a referenced data model. +* *FAILED*: Indicates incomplete import. Inspect `diagnostics` to verify the errors. + +==== Validation failure response + +Invalid data model:: +[source,json] +---- +{ + "status": "VALIDATION_FAILED", + "summary": null, + "validation_failures": [ + { + "line_number": 2, + "reason": "UNRESOLVED_SOURCE", + "field_name": "datamodel_sources[0].guid", + "message": "unknown datamodel guid: 62f3e9b5-4fcc-4352-b8ad-fdddc228750" + } + ], + "diagnostics": [ + { + "sub_status": "FAILURE", + "messages": [ + "unknown datamodel guid: 62f3e9b5-4fcc-4352-b8ad-fdddc228750" + ] + } + ], + "operation_id": null +} +---- + +Inaccessible data models:: +[source,json] +---- +{ + "status": "VALIDATION_FAILED", + "summary": null, + "validation_failures": [ + { + "line_number": 2, + "reason": "ACCESS_DENIED", + "field_name": "datamodel_sources[0]", + "message": "Insufficient permissions on datamodel '62f3e9b5-4fcc-4352-b8ad-fdddc2287506'" + }, + { + "line_number": 8, + "reason": "ACCESS_DENIED", + "field_name": "datamodel_sources[0]", + "message": "Insufficient permissions on datamodel '62f3e9b5-4fcc-4352-b8ad-fdddc2287506'" + } + ], + "diagnostics": [ + { + "sub_status": "FAILURE", + "messages": [ + "Memory import validation failed with 2 error(s): Insufficient permissions on datamodel '44444444-4444-4444-4444-444444444444'; Insufficient permissions on datamodel '33333333-3333-3333-3333-333333333333'" + ] + } + ], + "operation_id": null +} +---- + +Character-limit validations:: +[source,json] +---- +{ + "status": "VALIDATION_FAILED", + "summary": [], + "validation_failures": [ + { + "line_number": 3, + "reason": "CHAR_LIMIT", + "field_name": "content.rule_definition", + "message": "content.rule_definition is 1073 characters; max allowed is 1000" + }, + { + "line_number": 49, + "reason": "CHAR_LIMIT", + "field_name": "content.user_query", + "message": "content.user_query is 1150 characters; max allowed is 1000" + }, + { + "line_number": 49, + "reason": "CHAR_LIMIT", + "field_name": "content.recipe", + "message": "content.recipe is 3574 characters; max allowed is 2000" + } + ], + "diagnostics": [ + { + "sub_status": "FAILURE", + "messages": [ + "Validation failures present; fix them and re-run to see the DRY_RUN preview." + ] + } + ], + "operation_id": "f0c0b5f3-6b48-4f20-9ebf-67e1b6bcd4e5" +} +---- + +Import success response:: + +[source,JSON] +---- +{ + "status": "SUCCESS", + "summary": [ + { + "memory_type": "RULES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 3, + "deleted_record_count": 3, + "inserted_record_count": 2, + "failed_record_count": 0 + }, + { + "memory_type": "RECIPES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 7, + "deleted_record_count": 7, + "inserted_record_count": 4, + "failed_record_count": 0 + }, + { + "memory_type": "ALWAYS_APPLY_RULES", + "source": { + "identifier": "62f3e9b5-4fcc-4352-b8ad-fdddc2287506", + "type": "DATA_MODEL" + }, + "existing_record_count": 0, + "deleted_record_count": 0, + "inserted_record_count": 1, + "failed_record_count": 0 + } + ], + "validation_failures": [], + "diagnostics": [], + "operation_id": "10f7b113-7872-403b-a3ab-0152dc591b54" +} +---- + +== Additional resources + +* link:https://docs.thoughtspot.com/cloud/latest/spotter-memory[Spotter memory documentation, window=_blank] +* +++ REST API Playground - Export memory endpoint +++ +* +++REST API Playground - Import memory endpoint+++ diff --git a/modules/ROOT/pages/spottercode-integration.adoc b/modules/ROOT/pages/spottercode-integration.adoc index 31209817e..6bdb97d9e 100644 --- a/modules/ROOT/pages/spottercode-integration.adoc +++ b/modules/ROOT/pages/spottercode-integration.adoc @@ -2,11 +2,11 @@ :toc: true :toclevels: 2 -:page-title: SpotterCode integration guide +:page-title: SpotterCode IDE integration guide :page-pageid: integrate-SpotterCode -:page-description: This document provides a comprehensive, step-by-step approach to integrating SpotterCode with your development environment +:page-description: Step-by-step guide to integrating SpotterCode with Cursor, Claude, and Visual Studio Code. -This guide walks you through the process of adding SpotterCode to your IDE. +This guide walks you through the process of adding SpotterCode to your AI-native IDE. == Before you begin @@ -15,6 +15,55 @@ This guide walks you through the process of adding SpotterCode to your IDE. * Ensure that the latest version of Node.js is installed in your environment. This is required for building embedding code with the SDK. * Ensure that you have access to a ThoughtSpot instance and can view the objects and resources that you want to embed or access via the REST API. +[#_authenticate_spottercode] +== Authentication +Starting with August 2026, the SpotterCode MCP Server endpoint requires you to authenticate with a ThoughtSpot instance. This allows SpotterCode to perform authenticated user operations using ThoughtSpot REST APIs. + +SpotterCode supports two authentication mechanisms: + +* OAuth and SAML authentication +* Bearer token authentication + +=== OAuth and SAML authentication + +This is the primary authentication flow for developers connecting an MCP client interactively. + +. When your MCP client connects to the `https://spottercode.thoughtspot.app/mcp` endpoint for the first time, a dialog appears requesting your ThoughtSpot instance URL. +. Enter your ThoughtSpot instance URL (for example, `https://your-org.thoughtspot.cloud`). +. You are redirected to the ThoughtSpot SAML login flow for your instance. +. After successful login, SpotterCode obtains a bearer token for your session and stores the session information securely. +. Subsequent MCP requests from your IDE agent use the session token automatically and you will not be prompted to log in again until the session expires. + +[NOTE] +==== +The session token is stored in a secure backend store. Contact your ThoughtSpot administrator if you encounter repeated authentication prompts. +==== + +=== Bearer token authentication +For programmatic or CI/CD scenarios where an MCP client cannot perform an interactive login, SpotterCode accepts a bearer token directly using a dedicated MCP Server endpoint: `https://spottercode.thoughtspot.app/bearer/mcp`. + +In your MCP client configuration, pass the following headers: + +* `Authorization: Bearer `, where `` is a valid ThoughtSpot bearer token obtained from the ThoughtSpot REST API. +* `x-ts-host: `, where `` is the full URL of your ThoughtSpot instance (for example, `https://your-org.thoughtspot.cloud`). + +SpotterCode extracts and validates the token and host from these headers, then injects the authentication context into each MCP tool request. + +For example, to add SpotterCode to Claude Code using the bearer token endpoint: + +[source,Bash] +---- +claude mcp add --transport http SpotterCode \ + https://spottercode.thoughtspot.app/bearer/mcp \ + -H "Authorization: Bearer " \ + -H "x-ts-host: https://your-org.thoughtspot.cloud" +---- + +[NOTE] +==== +To obtain a bearer token, use the xref:authentication.adoc[ThoughtSpot REST API v2 authentication endpoints] or trusted authentication. For more information, see xref:trusted-authentication.adoc[Trusted authentication]. +==== + == Integrate SpotterCode with Cursor You can add the SpotterCode MCP Server URL to Cursor using the one-click installation link or the `mcp.json` file. @@ -25,7 +74,7 @@ Via Cursor Marketplace:: SpotterCode is available as an official plugin in the link:https://cursor.com/marketplace/thoughtspot[Cursor Marketplace, window=_blank]. To install SpotterCode from the Cursor Marketplace: . Go to link:https://cursor.com/marketplace/thoughtspot[Cursor Marketplace, window=_blank]. . Ensure that you are signed in, and then click **Add to Cursor** -> **Add Plugin**. -. To view the plugin in Cursor, click *View in Editor*. +. To view the plugin in Cursor, click **View in Editor**. Via installation link:: . Copy the following link and open it in Cursor: + @@ -58,10 +107,8 @@ Cursor also allows you to integrate SpotterCode by adding the MCP server URL in } } ---- -. Click *Save* and close the `mcp.json` file. This installs the SpotterCode MCP server and makes its tools available for AI models in Cursor. - - -For information about configuring MCP servers in Cursor, refer to the link:https://cursor.com/docs/context/mcp[Cursor Documentation, window=_blank]. +. Click **Save** and close the `mcp.json` file. +. In **Cursor Settings** > **Tools and MCP**, click **Connect**. You will be prompted to provide the URL of your ThoughtSpot instance and complete authentication. If the authentication is successful, the SpotterCode MCP server makes its tools available for AI models in Cursor. == Integrate SpotterCode with Claude @@ -74,10 +121,11 @@ To add SpotterCode as a custom connector: . Go to **Customize** > **Connectors** . Click the `+` icon and select **Add custom connector**. -. Enter the SpotterCode MCP server URL: `https://spottercode.thoughtspot.app/mcp`. +. Enter the SpotterCode MCP server URL. . Click **Add**. +. When prompted for authentication, specify the URL of your ThoughtSpot instance and complete authentication. -This configuration automatically enables SpotterCode in Claude AI chat and Claude Code for users of the Claude account. +//This configuration automatically enables SpotterCode in Claude AI chat and Claude Code for users of the Claude account. === Claude Code-only setup @@ -88,6 +136,8 @@ To enable SpotterCode in Claude Code, add the MCP server URL using the following claude mcp add --transport http SpotterCode https://spottercode.thoughtspot.app/mcp ---- +When prompted for authentication, specify the URL of your ThoughtSpot instance and complete authentication. + === Claude Desktop integration If you are using Claude Desktop, add the URL directly to the Claude configuration JSON file: @@ -102,17 +152,17 @@ If you are using Claude Desktop, add the URL directly to the Claude configuratio } ---- +When prompted for authentication, specify the URL of your ThoughtSpot instance and complete authentication. + === Claude Cowork integration If you are using Claude Cowork with Claude AI or Claude Desktop, verify whether the SpotterCode MCP connector is enabled for Claude Cowork. If it's not enabled, add the SpotterCode MCP server: -. Open Claude Cowork either in Claude AI or Claude Desktop app. +. Open Claude Cowork in either Claude AI or the Claude Desktop app. . Navigate to **Settings** > **Connectors** > **Customize**. . If SpotterCode is already available in your organization's list of connectors, select the SpotterCode connector. If it's not available: .. Click the `+` icon and select **Add custom connector**. .. Add the SpotterCode MCP server URL: `\https://spottercode.thoughtspot.app/mcp`. - -//For more information about adding MCP servers to Claude Code, see link:https://code.claude.com/docs/en/mcp[Claude Code Documentation, window=_blank]. - +. When prompted for authentication, specify the URL of your ThoughtSpot instance and complete authentication. == Integrate SpotterCode with Visual Studio Code @@ -132,7 +182,48 @@ To add the SpotterCode MCP Server to Visual Studio Code, use the Extensions view } ---- -After you add the MCP server URL, the SpotterCode MCP server is available in the Extensions view. For more information about configuring MCP servers in Visual Studio Code, refer to link:https://code.visualstudio.com/docs/copilot/customization/mcp-servers[Visual Studio Code Documentation, window=_blank]. +When prompted for authentication, specify the URL of your ThoughtSpot instance and complete authentication. + +After you add the MCP server URL, the SpotterCode MCP server is available in the Extensions view. + +=== Configuring MCP Server endpoint for documentation retrieval only + +If you only need documentation and REST API reference retrieval, use the following unauthenticated MCP Server URL: `\https://spottercode.thoughtspot.app/mcp/docs`. + +This endpoint provides access to the `get-rest-api-reference` and `get-developer-docs-reference` skills only. The `run-ts-workflow` skill is not available through this endpoint. + +To use this endpoint in your IDE, replace the authenticated MCP server URL in your configuration: + +For Cursor (`mcp.json`):: +[source,JSON] +---- +{ + "mcpServers": { + "SpotterCode": { + "url": "https://spottercode.thoughtspot.app/mcp/docs" + } + } +} +---- + +For Claude Code (CLI):: +[source,Bash] +---- +claude mcp add --transport http SpotterCode https://spottercode.thoughtspot.app/mcp/docs +---- + +For Visual Studio Code (`mcp.json`):: +[source,JSON] +---- +{ + "servers": { + "SpotterCode": { + "url": "https://spottercode.thoughtspot.app/mcp/docs", + "type": "http" + } + } +} +---- == Verify the integration @@ -143,6 +234,8 @@ To verify the integration: If the integration is successful, you'll see SpotterCode in the MCP servers list. . Verify the available SpotterCode skills. + +//// + For example, Cursor shows the skills of MCP connectors in the **Tools and MCP** page. Check if the xref:spottercode.adoc#_supported_skills[SpotterCode MCP skills] appear under SpotterCode. As you hover over each skill, you can view the description and input schema used for agentic interactions. You can also disable the MCP skills that you don't want the AI model to use. @@ -151,7 +244,7 @@ For example, Cursor shows the skills of MCP connectors in the **Tools and MCP** -- video::./images/cursor_mcp-skills.mp4[width=100%,options="autoplay,loop"] -- - +//// . Initiate a chat session and ask a question related to ThoughtSpot embedding, REST APIs, or the SDKs. + In the following example, a chat session with Cursor AI is initiated with the prompt, "I want to embed a ThoughtSpot Liveboard in my React application. Use the available tools to get this information and generate the embed code". Notice how the AI agent uses the SpotterCode skills to get the required information: @@ -184,13 +277,15 @@ video::./images/cursor-lb-embed.mp4[width=100%,options="autoplay,loop"] * For prompt examples, see xref:spottercode-prompt-guide.adoc#_prompt_examples[Prompt examples and best practices]. * For troubleshooting tips and workarounds, refer to the xref:spottercode-prompt-guide.adoc#_troubleshooting_errors[Troubleshooting] section. - +* For more information about adding MCP servers to Claude Code, see link:https://code.claude.com/docs/en/mcp[Claude Code Documentation, window=_blank]. +* For information about configuring MCP servers in Cursor, refer to the link:https://cursor.com/docs/context/mcp[Cursor Documentation, window=_blank]. +* For more information about configuring MCP servers in Visual Studio Code, refer to link:https://code.visualstudio.com/docs/copilot/customization/mcp-servers[Visual Studio Code Documentation, window=_blank]. //// . If your IDE shows the step-by-step explanation of how the Agent how the AI reached its conclusion, you may see the following parameters. These parameters show the input schema of the MCP request to SpotterCode. * `query` - User's request or question. For example, `how do I embed Liveboard`. * `version` - Version of the SDK to use. Default is `latest`. -* `topK` - How many relevant documents to return for the query. Default is 5. The agent may increase or decreased the number to get the right answer. +* `topK` - How many relevant documents to return for the query. Default is 5. The agent may increase or decrease the number to get the right answer. * `symbolName` - Limiting search to a specific item, for example, `LiveboardEmbed`. * `apiName` - The API node for finding request/response details. * `additionalDocs` - To include more documentation for extra context, such as Java or TypeScript SDK guidance. diff --git a/modules/ROOT/pages/spottercode-prompt-guide.adoc b/modules/ROOT/pages/spottercode-prompt-guide.adoc index e9cfa41f0..807bbf8f6 100644 --- a/modules/ROOT/pages/spottercode-prompt-guide.adoc +++ b/modules/ROOT/pages/spottercode-prompt-guide.adoc @@ -6,9 +6,9 @@ :page-pageid: spottercode-prompting-guide :page-description: This document provides best practices, prompt examples and troubleshooting guidance. -Prompting is an essential step when building embed code for ThoughtSpot integration or when exploring ThoughtSpot REST APIs using SpotterCode. +Prompting is an essential step when using SpotterCode, whether you are building embed code in your IDE, experimenting in the Visual Embed Playground, or asking questions on the developer documentation site. -This guide provides prompting guidance and best practices to help you get the best results for a variety of use cases. +This guide provides prompting guidance and best practices to help you get the best results across all SpotterCode surfaces. == Best practices and recommendations @@ -89,6 +89,37 @@ How do I create a new user with admin privileges via REST API? Provide the endpo |How do I see new actions in my app? | How do I get a list of custom actions added in my embed via REST API? |===== +== Prompting in the Visual Embed Playground + +The Visual Embed Playground includes a built-in SpotterCode panel with quick-starter prompts for each embed component. You can use these as starting points and refine them with follow-up prompts. + +=== How prompting works in the Playground +* Click a quick-starter prompt to send a pre-built query for the selected embed component, or type your own prompt in the chat input. +* SpotterCode generates embed code and updates the code editor panel on the left automatically. +* If SpotterCode detects a conflict between generated code and the existing code in the editor, it does not update the editor. Review the current code, clear conflicting sections, and send your prompt again. +* Use *Reset chat* to clear the conversation and start fresh. This removes all prior context from the session. +* To cancel a response in progress, click the pause button in the chat input area. + +=== Playground prompt examples +The following examples show how to get precise results from SpotterCode in the Playground: + +* Embed a Liveboard with runtime filters for Region set to West and a full-height frame. +* Add a custom action to the Liveboard embed that sends selected row data to a Slack webhook. +* Change the background color of the embedded Liveboard header to `#1A2B3C` using CSS variables. +* Embed a Search component with the data panel collapsed and search tokens for `[sales][region]` pre-loaded. +* Embed Spotter as an AI assistant panel on the right side of my application layout. +* Rename the "Edit" menu action label to "Modify" in the full application embed. + +== Prompting on the developer documentation site +The AI assistant on `developers.thoughtspot.com/docs` provides documentation and REST API reference lookup only. + +When you open the AI assistant panel, it displays pre-built popular questions relevant to the page you are currently viewing. For example, if you are viewing an embedding guide, the panel shows the questions related to that topic. You can choose to click these questions to explore the topic or send a custom prompt. Use *Reset chat* to remove all prior context from the session. + +[NOTE] +==== +The SpotterCode AI assistant in the `developers.thoughtspot.com/docs` does not execute code or connect to a ThoughtSpot instance. For interactive code generation, use SpotterCode in the xref:developer-playground.adoc#spottercode-panel[Visual Embed Playground] or xref:spottercode-integration.adoc[your IDE]. +==== + == Troubleshooting errors This section lists the common error scenarios, root causes, and recommended actions for troubleshooting errors related to SpotterCode integration. If the error persists, contact ThoughtSpot Support for further assistance. diff --git a/modules/ROOT/pages/spottercode.adoc b/modules/ROOT/pages/spottercode.adoc index 968b3150d..0b29f2e5e 100644 --- a/modules/ROOT/pages/spottercode.adoc +++ b/modules/ROOT/pages/spottercode.adoc @@ -6,49 +6,86 @@ :page-pageid: SpotterCode :page-description: Use SpotterCode to accelerate code generation and the process of embedding and integrating ThoughtSpot. -ThoughtSpot’s SpotterCode is an AI-powered MCP tool that streamlines and speeds up the process of embedding ThoughtSpot content and integrating ThoughtSpot REST APIs in your application workflows. +ThoughtSpot's SpotterCode is an AI-powered coding assistant that streamlines and speeds up the process of embedding ThoughtSpot content and integrating ThoughtSpot REST APIs. SpotterCode is available in your IDE, the Visual Embed Playground, and on the ThoughtSpot developer documentation site. == What is SpotterCode? -SpotterCode connects your integrated development environment (IDE) to a ThoughtSpot-hosted MCP server. It empowers AI-native IDEs with tools and documentation lookup capabilities, providing direct access to ThoughtSpot SDKs, REST API documentation, code samples, and developer guides. The AI agents in the IDE can use these skills to assist developers in embedding ThoughtSpot content and integrating REST API workflows into their applications. +SpotterCode connects to a ThoughtSpot-hosted MCP server and provides AI-assisted coding and documentation capabilities across multiple surfaces. It gives developers direct access to ThoughtSpot SDKs, REST API documentation, code samples, and developer guides, whether they are working in an AI-native IDE, experimenting in the Visual Embed Playground, or browsing the ThoughtSpot developer documentation site. -[IMPORTANT] -==== -SpotterCode is an add-on tool available with the link:https://www.thoughtspot.com/pricing[ThoughtSpot Analytics and ThoughtSpot Embedded offerings, window=_blank]. If you have a ThoughtSpot Analytics license with an active ThoughtSpot Embedded subscription, you can integrate SpotterCode using the SpotterCode MCP Server URL in your coding application. -==== +SpotterCode is available in the following surfaces: + +[cols="1,3", options="header"] +|==== +| Surface | Description +| *IDE* +a| Connects your AI-native IDE to the SpotterCode MCP server. The AI agent in your IDE can generate embed code, execute authenticated ThoughtSpot API workflows, and look up documentation without leaving your development environment. SpotterCode supports the following IDEs: + +* Cursor AI +* Visual Studio Code with GitHub Copilot +* Claude Code + +For more information, see xref:spottercode-integration.adoc[Integrate SpotterCode with your IDE]. + +| *Visual Embed Playground* +a| A built-in AI coding assistant on the Playground page in your ThoughtSpot instance. SpotterCode appears as a slideout panel and generates embed code for the component you are configuring, using quick-starter prompts or custom instructions. See xref:developer-playground.adoc#spottercode-panel[SpotterCode in the Visual Embed Playground]. + +| *Developer documentation site* +a| The SpotterCode chat assistant is available on the ThoughtSpot developer documentation site (`link:https://developers.thoughtspot.com/docs`). You can use it to ask questions about embedding, REST APIs, and SDK configuration without leaving the documentation page. This surface uses the unauthenticated `/mcp/docs` endpoint and does not require a ThoughtSpot instance. +|==== == Who should use SpotterCode? -SpotterCode is intended for developers and technical teams integrating ThoughtSpot content and workflows into their applications using Visual Embed SDK and REST APIs, with a particular focus on those working in AI-native IDEs such as Cursor. +SpotterCode is designed for developers and technical teams who embed ThoughtSpot content or integrate ThoughtSpot REST APIs into their applications. + +* *IDE users*: Developers using AI-native IDEs such as Cursor, Visual Studio Code with GitHub Copilot, or Claude Code who want context-aware code generation and direct API execution from their development environment. +* *Playground users*: Developers exploring embedding options in the Visual Embed Playground who want to generate and iterate on embed code quickly without writing boilerplate manually. +* *Documentation site visitors*: Developers reading the ThoughtSpot developer documentation who want to ask questions about embedding, APIs, or SDK configuration in context. -When integrated, SpotterCode offers the following advantages: +=== SpotterCode for IDE users +SpotterCode is useful at every stage of an embedded ThoughtSpot project: -* Empowers your IDE with the documentation lookup and provides direct access to authoritative information on embedding ThoughtSpot or integrating REST API workflows in your development projects. +* *Setting up a new embedded project* + +Use the authenticated `/mcp` endpoint so the IDE agent can configure your ThoughtSpot instance directly. You can generate a trusted authentication secret key, add your application domain to CORS and CSP allowlists, and retrieve Liveboard and Answer object IDs, all without leaving your IDE. -* Accelerates the process of embedding and integration by providing code samples, SDK skills, and custom styling directly in the IDE. +* *Writing and reviewing embed code* + +SpotterCode gives your IDE agent direct access to Visual Embed SDK and REST API documentation, code samples, and developer guides. The agent can generate context-aware embed code tailored to your project structure and provide direct access to the SDK reference. -* Enables developers to build context-aware and deployment-ready code tailored to their project structure, thereby reducing manual effort and errors. +* *Integrating REST API workflows* + +Access up-to-date REST API specifications, request and response formats, authentication flows, and TypeScript and Java SDK references to accelerate API integration. -* Reduces operational strain by rapidly generating boilerplate code required for embedding ThoughtSpot in your application. +* *Looking up documentation* + +SpotterCode empowers your IDE with documentation lookup capabilities and provides direct access to authoritative information on embedding ThoughtSpot or integrating REST API workflows in your development projects. [NOTE] ==== SpotterCode is an acceleration tool designed to help developers streamline the process of integrating ThoughtSpot into their projects. It does not replace the Visual Embed SDK or the foundational knowledge required for embedding or application integration. ==== -== Supported IDEs - -The initial version of SpotterCode supports the following IDEs: - -* Cursor AI -* Visual Studio Code with GitHub Copilot -* Claude Code - -== Supported skills -SpotterCode provides the following skills to the AI agent on your IDE: - -//// -* `get-visual-embed-sdk-reference` + -A documentation lookup skill that accesses Visual Embed SDK documentation and generates code samples for embedding ThoughtSpot content, including supported embed types, authentication, configuration, customization, event hooks, and code samples. -//// +[#_mcp_server_endpoints] +== MCP server endpoints +SpotterCode is an add-on tool available with the link:https://www.thoughtspot.com/pricing[ThoughtSpot Analytics and ThoughtSpot Embedded offerings, window=_blank]. If you have a ThoughtSpot Analytics license with an active ThoughtSpot Embedded subscription, you can integrate SpotterCode using the SpotterCode MCP server URL in your coding application. + +ThoughtSpot provides the following MCP Server endpoints for SpotterCode: + +[cols="1,2,2", options="header"] +|==== +| Endpoint | URL | Available tools +a| *Authenticated endpoint* + +(`/mcp`) +a| `\https://spottercode.thoughtspot.app/mcp` + +The full-capability SpotterCode endpoint. Requires authentication with a ThoughtSpot instance. You can use this MCP endpoint to perform authenticated user operations on your ThoughtSpot instance via the public REST APIs. +a| `get-rest-api-reference` + +`get-developer-docs-reference` + +`execute-thoughtspot-code` + +a| *Documentation endpoint* + +(`/mcp/docs`) +| `\https://spottercode.thoughtspot.app/mcp/docs` + +This endpoint includes documentation retrieval skills only and doesn't require authentication. Use this endpoint if you only need the AI agent to look up ThoughtSpot developer documentation and REST API reference, without connecting to a live ThoughtSpot instance. +a| `get-rest-api-reference` + +`get-developer-docs-reference` +|==== + +=== Supported MCP tools +SpotterCode provides the following skills to the AI agent in your IDE. Authenticated skills require a valid ThoughtSpot session established through the xref:spottercode-integration.adoc#_authenticate_spottercode[SpotterCode authentication flow]. * `get-rest-api-reference` + Provides REST API specifications, endpoints, request/response formats, authentication flows, CRUD operations, and SDKs for TypeScript and Java. @@ -56,9 +93,66 @@ Provides REST API specifications, endpoints, request/response formats, authentic * `get-developer-docs-reference` + Provides access to documentation on embedding, UI customization, deployment, security, and best practices. -== Limitations +* `execute-thoughtspot-code` + +Executes authenticated ThoughtSpot API workflows directly from your IDE agent. This skill allows your IDE agent to perform common operations that can be done via public REST APIs. + +=== Choosing the right endpoint +Use the following guidance to decide which endpoint to configure in your IDE: + +* *Use `/mcp` (authenticated)* if: +** You want the AI agent to execute ThoughtSpot API workflows from your IDE, for example, to generate a trusted authentication secret key, configure your application domain in CORS/CSP allowlists, or retrieve Liveboard and Answer object IDs from your instance. +** You want your IDE to use the full set of SpotterCode skills, including `run-ts-workflow`. +** You are building or configuring a ThoughtSpot embedded application and want end-to-end setup assistance without leaving the IDE. + +* *Use `/mcp/docs` (unauthenticated)* if: +** You only need the AI agent to look up documentation, REST API reference material, and code samples. +** You are working in an environment where connecting to a ThoughtSpot instance is not appropriate. For example, a shared CI environment, a read-only developer workstation, or a demonstration setup. +** You do not have a ThoughtSpot Embedded subscription or instance credentials available. + +[NOTE] +==== +The IDE configuration steps in this guide use the authenticated `/mcp` endpoint by default. If you want to use the unauthenticated `/mcp/docs` endpoint instead, replace the endpoint URL in the relevant configuration snippet before saving. All other configuration steps remain the same. +==== + +[#_security_and_data_governance] +== Security and data governance +SpotterCode is designed to operate within ThoughtSpot's existing security and governance model. The following table shows what data SpotterCode sends to its hosted MCP server and how your ThoughtSpot access controls apply across all SpotterCode surfaces. +[cols="15,20,12,15,38", options="header"] +|==== +| Surface | Authentication required | RLS/CLS enforced | Connects to ThoughtSpot instance | Data sent to MCP server + +| *IDE* +a| Yes. OAuth/SAML or bearer token +| Yes +| Yes +a| User queries, the IDE agent's tool call requests, and the authentication context required to execute code on the user's behalf. SpotterCode does not send your source code, local file contents, or project structure to the MCP server. + +| *Visual Embed Playground* +a| Yes. Requires an active ThoughtSpot session. +| Yes +| Yes +a| User queries sent within the Playground session. The Playground operates within your authenticated ThoughtSpot session. No additional credentials are transmitted separately. + +| *Developer documentation site* +| No +| N/A +| No +a| User queries and page context. No authentication or instance data is required. The documentation site surface is publicly accessible. +||||| +|==== + +=== ThoughtSpot access controls and governance +SpotterCode does not bypass or modify ThoughtSpot's existing access control model. When SpotterCode executes operations against your ThoughtSpot instance via the `execute-thoughtspot-code` tool, it acts as the authenticated user whose session token is in use, and can perform both read and write operations permitted to that user. The following ThoughtSpot security features remain in effect: + +Because code executes as the authenticated user, write operations, such as create, update, delete, and share, generate the same audit log entries as equivalent REST API calls made directly by that user. For details on the events captured and how to retrieve them, see xref:audit-logs.adoc[Audit logs] and xref:logs-api.adoc[Audit logs API]. -* Responses from SpotterCode are determined by the features and parameters currently supported in the Visual Embed SDK, REST API, and official ThoughtSpot Developer documentation. SpotterCode cannot generate code or solutions that rely on unsupported or undocumented features. +[NOTE] +==== +SpotterCode performs operations as the authenticated user. Grant SpotterCode access only to accounts with the minimum permissions required for the intended use case. +==== + +== Limitations +* Responses from SpotterCode are determined by the features and parameters currently supported in the Visual Embed SDK, REST API, and official ThoughtSpot developer documentation. SpotterCode cannot generate code or solutions that rely on unsupported or undocumented features. * SpotterCode can generate code samples for the most common use cases. Scenarios that require advanced customization or highly specialized workflows may require manual intervention or additional coding beyond what SpotterCode provides. * SpotterCode does not influence how the Spotter feature in your ThoughtSpot embed infers semantic modeling. SpotterCode is not intended for querying data models or interpreting definitions such as measures and attributes in your metadata objects. * The behavior of the IDE agent, including tool selection and reasoning, is not controlled by SpotterCode. @@ -91,6 +185,3 @@ Learn how to use SpotterCode in your IDE for best results and explore example pr ++++ - - - diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 59b43476a..839794371 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -7,8 +7,6 @@ :page-description: Configure per-Org and per-user timezone settings in embedded ThoughtSpot deployments using the Variable API, so that all relative date and time keywords resolve correctly for every user. :keywords: timezone, ts_user_timezone, Variable API, date keywords, embedded, TSE, Org timezone, user timezone -[earlyAccess eaBackground]#Early Access# - The timezone awareness feature in ThoughtSpot allows you to configure a preferred timezone for a user or at the Org level, or both, and apply this timezone when generating search results for a user's query. == Overview @@ -242,8 +240,7 @@ If the `ts_user_timezone` variable is configured for the Org or user, you can re The following example shows the formula syntax with the `ts_user_timezone` variable: -`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), ts_var (ts_user_timezone), [])` - +`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1})", ts_var(ts_user_timezone), [])` Where: @@ -265,9 +262,7 @@ On query execution, the formula translates to: === Using hardcoded timezone values in formulas In ThoughtSpot Cloud 26.5.0.cl and earlier release versions, the timezone value was hardcoded in formulas to convert source values to the user's timezone. For example: ----- -sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), '', []) ----- +`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1})", '', [])` Where: @@ -294,6 +289,12 @@ To verify the configuration: * Verify whether the timezone configured for the user overrides the timezone set for the Org and system default on the ThoughtSpot instance. * Verify the Liveboard scheduled jobs. Note that the timezone changes will be applied only to the upcoming scheduled job executions. +== Limitations +On instances with a non-UTC timezone, during Daylight Saving Time (DST) transitions, queries using `Last X Hours` or `Next X Hours` filters on datetime columns may fail if the selected time range crosses a DST boundary. ThoughtSpot displays a generic query error in these cases. + +To work around this issue, modify the relative hour filter (for example, change `Last 24 Hours` to `Last 23 Hours` or `Last 25 Hours`) or use an equivalent date-based filter where applicable. + +To avoid this issue, change your cluster timezone to UTC. == Additional resources diff --git a/modules/ROOT/pages/tml.adoc b/modules/ROOT/pages/tml.adoc index 9ffba0d70..8619546fb 100644 --- a/modules/ROOT/pages/tml.adoc +++ b/modules/ROOT/pages/tml.adoc @@ -5,6 +5,7 @@ :page-title: TML :page-pageid: tml :page-description: The TML API endpoints allow you to export and import TML files +// SOURCE: SCAL-307283, SCAL-317357 ThoughtSpot Modeling Language (TML) is a scriptable format developed by ThoughtSpot for exporting, modifying, and migrating metadata objects such as Models, Views, Tables, Liveboards, and Answers. TML files allow you to manage and version control these objects outside the ThoughtSpot UI, supporting workflows like bulk changes, migration between environments, and programmatic edits via REST API. Users can use link:https://docs.thoughtspot.com/cloud/latest/tml[TML] to model data and build analytics content in the test environment in a flat-file format, and then import and deploy it in their environments. @@ -17,6 +18,7 @@ The TML syntax varies per object type. However, all TMLs follow a general patter See the following pages for the detailed syntax of TML files for each object type: + * link:https://docs.thoughtspot.com/cloud/latest/tml-answers[TML for Answers, window=_blank] + +* link:https://docs.thoughtspot.com/cloud/latest/tml-collections[TML for Collections, window=_blank] + * link:https://docs.thoughtspot.com/cloud/latest/tml-connections[TML for Connections, window=_blank] + * link:https://docs.thoughtspot.com/cloud/latest/tml-joins[TML for Joins, window=_blank] + * link:https://docs.thoughtspot.com/cloud/latest/tml-liveboards[TML for Liveboards, window=_blank] + @@ -76,6 +78,63 @@ If you import only a Model object, it may take some time for the Model to become However, if you import a Model along with Liveboards, answers, and other dependent objects in a single API call, the imported objects will be immediately available for use. ==== +[#personalized-views-portability] +=== Personalized Views portability [earlyAccess eaBackground]#Early Access# + +Personalized Views support improved portability across ThoughtSpot environments. When importing a Personalized View TML set the `enable_personalized_view_upsert` to `true` in the API request to `POST /api/rest/2.0/metadata/tml/import`. ThoughtSpot then checks the target environment for an existing Personalized View with a matching `obj_id`. If a match is found, the import updates the existing view rather than creating a duplicate. If no match is found, a new Personalized View is created. + +To enable this feature for your instance, contact your ThoughtSpot administrator. + +Two new fields are added to the TML, make it easier to migrate Personalized Views between environments without creating duplicates. + +`author`::: +A new `author` field is added to the Personalized View TML during export. This field is used to delegate ownership to another user during import. + +`obj_id`::: +A new `obj_id` field provides stable cross-environment object identity for inter-Org deployments. Use the same `obj_id` value across environments to ensure consistent identity during migrations. + + + +==== Example for a Personalized View TML with Object ID + +[source,yaml] +---- + views: + - view_guid: ff83055b-a867-43e7-978e-106e907e1912 + obj_id: California-LT-ff83855b + name: California - LT + view_filters: + - column: + - Retail Sales - Classic::Store State + oper: in + values: + - California + is_public: false + author: + username: user1 + user_email: user1@thoughtspot.com +---- + +==== Limitation without this feature enabled + +ThoughtSpot's link:https://docs.thoughtspot.com/cloud/latest/personalized-liveboard-views[personalized Liveboard views] let users apply filters and save configurations as named views on a Liveboard. +In multi-environment deployments (for example, a Dev instance and a Prod instance), these user-saved views can be lost when a Liveboard is updated and re-imported using the xref:tml.adoc[TML import API] or the UI *Import TML* option. +If the import is performed by an administrator account, all personalized views saved by end users are removed as part of this replacement. + +Why this happens?:: + +Personalized views are stored as user-owned objects linked to the Liveboard's GUID. +When an admin imports a Liveboard TML that matches an existing GUID, the import operation overwrites the Liveboard, and the associated user views are not carried forward. + +Workarounds:: +. Import as a non-admin user - ++ +The simplest workaround is to perform the final TML import in the production environment using a *non-admin user account* that has edit access to the Liveboard, rather than an admin account. +Because non-admin users do not have the authority to overwrite user-linked metadata during import, ThoughtSpot preserves the existing personalized views attached to the Liveboard. +. Embed existing saved views in the TML before import - ++ +You can export the current saved views from the production Liveboard, append them to the updated TML, and then import the combined TML. + == Import TML objects asynchronously The REST v1 and v2 `metadata/tml/import` APIs import TML objects synchronously. When you try to import large and complex metadata objects, the synchronous import operation takes more time to process data and sometimes can result in a timeout error. @@ -323,6 +382,7 @@ If Orgs are enabled on your instance, the API returns task status only for objec |**500**|Unexpected Error |==== + == Export a TML To export the TML data, your account must have the `DATAMANAGEMENT` (Can manage data) or `ADMINISTRATION` (Can administer ThoughtSpot) privilege. diff --git a/modules/ROOT/pages/tse-eco-mode.adoc b/modules/ROOT/pages/tse-eco-mode.adoc index 5b5fc8b2c..08904dbfc 100644 --- a/modules/ROOT/pages/tse-eco-mode.adoc +++ b/modules/ROOT/pages/tse-eco-mode.adoc @@ -1,88 +1,77 @@ = Cluster maintenance and upgrade :toc: true -:toclevels: 1 +:toclevels: 2 :page-title: Update cluster state :page-pageid: tse-cluster -:page-description: If you are using a ThoughtSpot Cloud cluster in the economy mode in your embedded deployments, use the APIs to restart an inactive cluster. +:page-description: If you are using a ThoughtSpot Cloud cluster in the economy mode in your embedded deployments, use the APIs to restart an inactive cluster. At any given time, a ThoughtSpot application instance can be in any one of the following states: * `ACTIVE` + -Indicates that the cluster is active and user activity is detected. +When the cluster is running and user activity is detected. * `UNDER_MAINTENANCE` + -Indicates that the cluster is down for maintenance due to upgrade or patching. -* `STOPPED` -Indicates that the cluster is stopped and no user activity is detected. +When the cluster is temporarily unavailable because maintenance, upgrade, or patching is in progress. +* `STOPPED` + +When the cluster is inactive and no user activity is detected. * `STARTING`/`PENDING` + -The cluster is currently starting, or some other workflow is running on the cluster. +When the cluster is starting, or another workflow is currently in progress. -== Cluster status during upgrade -With ThoughtSpot’s Minimal Downtime Ephemeral Mode upgrade option, we upgrade ThoughtSpot in the background while users can use ThoughtSpot in Ephemeral mode. This means that during the upgrade, the system will be in transient state, yet it allows users to create and view data. However, any new objects created during the upgrade will be lost. +== Check whether a cluster is under maintenance +To determine whether a cluster is under maintenance, send a `GET` request to one of the following endpoints: -When the upgrade starts, the ThoughtSpot instance operates in the Ephemeral (Read-Only mode) and the cluster state changes to `UNDER_MAINTENANCE`. +* `GET /api/rest/2.0/system/banner` (Recommended) +* `GET /tspublic/v1/admin/banner` (legacy REST API framework) -ThoughtSpot users can determine if their instance is under maintenance by sending a `GET` request to one of the following API endpoints: +These APIs return banner information that indicates whether maintenance is in progress. Embedded applications can also use the banner text to inform users about the current cluster status. -* REST API v1 endpoint + -`GET /tspublic/v1/admin/banner` -* REST API v2 endpoint + -`GET /api/rest/2.0/system/banner` +=== REST API v2 request -ThoughtSpot Embedded application users can also view the banner text by calling the above APIs. - -=== REST v1 API request - -.cURL [source,cURL] ---- curl -X GET \ --header 'Accept: application/json' \ -'https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/admin/banner' ----- - -.Request URL - ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/admin/banner +'https://{ThoughtSpot-Host}/api/rest/2.0/system/banner' ---- -=== REST v2 API request +=== REST API v1 request -.cURL [source,cURL] ---- curl -X GET \ --header 'Accept: application/json' \ -'https://{ThoughtSpot-Host}/api/rest/2.0/system/banner' +'https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/admin/banner' ---- -.Request URL ----- -https://{ThoughtSpot-Host}/api/rest/2.0/system/banner ----- === API response +In the API response, check the following fields: -If the cluster in maintenance mode, the API returns the following response: +* `under_maintenance`: A Boolean value that indicates whether the cluster is currently under maintenance. +* `banner_text`: A user-facing message that describes the current system state. + +[NOTE] +==== +Administrators of an embedded application can configure custom banner text to communicate maintenance status to users. +==== + +.Example response when the cluster is under maintenance ---- -{"banner_text":"This system is currently being upgraded and is in ephemeral mode. You can continue to use it to visualize data. Any objects you create or modify during this period will be lost when the upgrade is complete.","under_maintenance":true} +{"banner_text":"This system is currently under maintenance. Check back in a few hours.","under_maintenance":true} ---- -If the cluster is not in maintenance mode, the API returns the following response: +.Example response when the cluster is operating normally ---- {"banner_text":"This system is functioning normally. No maintenance is in progress.","under_maintenance":false} ---- -Administrators of the ThoughtSpot Embedded app can create their custom banner text and display it to indicate the cluster upgrade status. - -== Idle sensing -If you are using a ThoughtSpot Cloud instance for embedded deployments in your development or production environment, you can enable idle sensing to save costs and allow your cluster to operate in `economy` mode. +== Idle sensing and economy mode +If you use a ThoughtSpot Cloud instance for embedded deployments, you can enable idle sensing to reduce cost and allow the cluster to operate in economy mode. -If idle sensing is enabled on your cluster, your cluster will be automatically stopped if there is no user activity detected for a given time threshold. By default, the idle time threshold is set to 120 minutes. To enable this feature on your clusters, contact ThoughtSpot Support. +When idle sensing is enabled, the cluster automatically stops after a period of inactivity. The default idle threshold is 120 minutes. To enable this feature on your cluster, contact ThoughtSpot Support. -=== Get information about the status of a cluster -By default, a ThoughtSpot cluster running the `economy` mode stops if there is no user activity for two hours. When a user tries to access a cluster that's in the `STOPPED` state, the API calls will return the `"cluster-state": "Stopped"` in the response header. +=== Get the status of an inactive cluster +When a cluster in economy mode has no user activity for 120 minutes, it transitions to the `STOPPED` state. If a user accesses a stopped cluster, the response headers include the cluster state. [source,cURL] ---- @@ -96,65 +85,65 @@ By default, a ThoughtSpot cluster running the `economy` mode stops if there is n Cluster-State: Stopped ---- -To restart the cluster, complete the steps described in the following section. +If the cluster is stopped, restart it by using the API described in the next section. -== Start an inactive cluster using API -On a regular ThoughtSpot Cloud cluster, users can restart an inactive cluster using `CAPTCHA`. However, on embedded instances, the `CAPTCHA`-based cluster activation is not supported. Instead, the embedded application user can send a `GET` request to their instance with the following query parameters in the request URL: +=== Start an inactive cluster using API +On a standard ThoughtSpot Cloud cluster, users can restart an inactive cluster by using a Completely Automated Public Turing test to tell Computers and Humans Apart (CAPTCHA). For embedded deployments, CAPTCHA-based activation is not supported. Instead, send a GET request with the required query parameters: * `tse=true` * `start_cluster=true` -For example, to start an inactive cluster, send a `GET` request in the following parameters: - .Production environment [source,http] ---- https://{ThoughtSpot-Host}/?tse=true&start_cluster=true ---- -**Staging environment** - +.Staging environment [source,http] ---- https://{cluster-name}.thoughtspotstaging.cloud/?tse=true&start_cluster=true ---- -**Development environment** - +.Development environment [source,http] ---- https://{cluster-name}.thoughtspotdev.cloud/?tse=true&start_cluster=true ---- -In the request header, you must include the `security-key`. This `security-key` is used to authenticate your request when xref:trusted-auth-secret-key.adoc#trusted-auth-enable[trusted authentication is enabled]. ThoughtSpot Embedded users can obtain the `security key` for their instance or Org context from their ThoughtSpot administrator. +=== Required headers +In the request header, you must include `security-key` and `X-Thoughtspot-Org-Id`. -If your instance has Orgs: +`security-key`:: +Is required to authenticate your request when xref:trusted-auth-secret-key.adoc#trusted-auth-enable[trusted authentication is enabled]. ThoughtSpot Embedded users can obtain the `security-key` for their instance or Org context from their ThoughtSpot administrator. +`X-Thoughtspot-Org-Id`:: +If your instance has Orgs: * Specify the Org ID in the request header along with the security key of that specific Org context. If the security key does not match the Org ID, the API returns an error. -* If the request header includes only the security key with no Org ID, it's considered to be the security key of the global Org context (ALL Orgs). If it does not match the key generated for the All Orgs context, the API returns an error. - +* If the request header includes only the security key with no Org ID, it's considered to be the security key of the global Org context (**All Orgs**). If it does not match the key generated for the All Orgs context, the API returns an error. ++ When the cluster becomes available, users are logged into the Org context based on the key provided in the request. The following example shows the cURL request for restarting a cluster: -[source, cURL] +[source,cURL] ---- $ curl -X GET 'https://.thoughtspot.cloud/?tse=true&start_cluster=true' \ -H 'X-Thoughtspot-Org-Id: {Org_Id}' \ -H 'security-key: e8ade677-c3f1-461d-8b7f-7f0fe4e024f0' ---- -If the `GET` request is successful, the cluster starts. +If the `GET` request is successful, the cluster starts. When the cluster becomes available, users are signed in to the Org context associated with the provided key. -== Response header +=== Response header values Note the cluster state in the response header: * `STARTING` + -Indicates that the cluster is starting. It may take a few minutes for the cluster to become active. +If the cluster is starting. It may take a few minutes to become active. * `UNKNOWN` + -Indicates a possible error. Contact your administrator or ThoughtSpot Support if the cluster does not start in 5-10 minutes. +A possible error occurred. If the cluster does not start within 5 to 10 minutes, contact your administrator or ThoughtSpot Support. -[source,] +[source,http] ---- HTTP/1.1 200 OK Server: awselb/2.0 @@ -165,11 +154,11 @@ Indicates a possible error. Contact your administrator or ThoughtSpot Support if Cluster-State: Starting ---- -== Response codes +=== Response codes [options="header", cols="1,4"] |=== |HTTP status code|Description |**200**|Successful operation |**400**|Invalid request |**401**|Unauthorized access -|=== \ No newline at end of file +|=== diff --git a/modules/ROOT/pages/whats-new-prev-history.adoc b/modules/ROOT/pages/whats-new-prev-history.adoc index dfb3d083f..20b5cad0f 100644 --- a/modules/ROOT/pages/whats-new-prev-history.adoc +++ b/modules/ROOT/pages/whats-new-prev-history.adoc @@ -1335,7 +1335,7 @@ For more information, see xref:css-customization.adoc#_search_bar_and_data_panel ==== The *Develop* tab in the ThoughtSpot UI introduces the GraphQL playground to allow users to interact with GraphQL endpoints and run query and mutation operations. To enable this feature on your instance, contact ThoughtSpot Support. -For more information, see xref:graphql-playground.adoc[GraphQL Playground]. +//For more information, see xref:graphql-playground.adoc[GraphQL Playground]. ==== .Runtime Parameter overrides [%collapsible] diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6d9f374ea..627969434 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,14 +23,121 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== August 2026 + +**Release version**: ThoughtSpot Cloud 26.8.0.cl + +*Upgrade notes*: ⚠️ Includes breaking changes and deprecations. Refer to feature details in this page and xref:deprecated-features.adoc[Deprecation announcements]. + +*Recommended SDK versions*: Visual Embed SDK v1.51.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== +a| +[.cl-label] +*Version 26.8.0.cl* + +a| +[discrete] +==== Spotter embedding + +Spotter Analysts:: +[earlyAccess eaBackground]#Early Access# +Spotter now includes an *Analysts* panel in the sidebar that surfaces dedicated Spotter Analyst agents. Each Analyst is scoped to a specific data model and skill set, enabling your embedded users to start focused AI-driven conversations without manually selecting a data source. For more information, see xref:embed-spotter.adoc#spotter-analysts[Spotter Analysts in embedded applications]. + +Spotter onboarding starter prompts:: +Embedded Spotter interface supports onboarding starter prompts to guide first-time users. When enabled, Spotter presents suggested questions based on the connected data model. For more information, see xref:embed-spotter.adoc#_enable_starter_prompts[Enable starter prompts in Spotter]. + +--- + + +[discrete] +==== Liveboard embedding +The following features, previously in Early Access, are now generally available and enabled by default on ThoughtSpot Embedded instances: + +* Hide irrelevant filters (`hideIrrelevantChipsInLiveboardTabs`) + +Hides filters that are not relevant to the displayed visualization in a tab. +* Compact header (`isLiveboardCompactHeaderEnabled`) + +Enables compact header layout in embedded Liveboards. +* Cover page filtering options (`coverAndFilterOptionInPDF`) + +Enables the *Include cover page* and *Include filter page(s)* checkboxes in the Liveboard download modal. +* Liveboard styling and grouping (isLiveboardMasterpiecesEnabled) + +Enables the xref:embed-pinboard.adoc#_liveboard_grouping_and_styling[Liveboard styling and grouping] feature. +* Filter interactivity (`isEnhancedFilterInteractivityEnabled`) + +Enables interactive filter chips that allow users to add, update, or remove filters in an embedded Liveboard. + +--- + +[discrete] +==== Navigation and homepage V1/V2 deprecated [.version-badge.deprecated]#Deprecated# +Starting from ThoughtSpot Cloud 26.8.0.cl, the classic V1 and V2 navigation and homepage experience modes are deprecated. All ThoughtSpot Embedded sessions now render in the V3 navigation experience by default. For more information, see xref:full-app-customize.adoc#nav-v1-v2-deprecation[V1 and V2 deprecation]. + +--- + +[discrete] +==== Wide logo dimension [.version-badge.breaking]#Breaking# +Starting from ThoughtSpot Cloud 26.8.0.cl, the recommended dimensions for the wide logo displayed on the ThoughtSpot login page have changed from 330x100px to *250x50px (5:1 aspect ratio)*. Logos uploaded at the previous dimensions may appear distorted or incorrectly scaled on the login screen. If you previously uploaded a wide logo at 330x100px, re-upload it at 250x50px to ensure correct display. + +For more information, see xref:customize-style.adoc#wide-logo[Customize the login page logo]. + +--- + + +[discrete] +==== Granular download privileges +The new granular download privileges that replace the single general download privilege for RBAC enabled clusters are now generally available. + +* *Can Download Visuals* — Allows downloading chart images and visual exports. +* *Can Download Detailed Data* — Allows downloading raw tabular data (CSV, XLSX). + +These privileges can be assigned independently per user or group. Update privilege assignments in your embedded application accordingly. + +--- + +[discrete] +==== Personalized Views portability [earlyAccess eaBackground]#Early Access# +ThoughtSpot improves the portability of Personalized Views across environments. Import operations use smart merge logic to avoid duplicating Personalized Views. +Two new fields have been added to the TML for Personalized Views: + +* A new `author` field is added to the Personalized View TML during export. This field is used to assign ownership during import. +* Personalized Views now support `obj_id` for stable cross-environment object identity. + +For more information, see xref:tml.adoc#personalized-views-portability[Personalized Views portability]. + +--- + +[discrete] +==== Discoverability checkbox deprecation [.version-badge.breaking]#Breaking# +The *Make this Liveboard Discoverable* checkbox has been removed from the ThoughtSpot UI. Embedding applications that relied on discoverability for content visibility should review their sharing logic and update user-facing guidance for content access. For more information, see xref:deprecated-features.adoc#liveboardAnswerDiscoverable[Deprecation announcements]. + +--- + +[discrete] +==== SpotterCode widget documentation assistance +This developer documentation site now includes a SpotterCode AI assistant panel that replaces the earlier *AskDocs* feature. When you open the assistant panel, it displays prebuilt starter prompts relevant to the page you are currently viewing and allows you to explore topics instantly. You can also type your own questions about embedding, REST APIs, SDK configuration, and developer guides. + +--- + +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.51.0 includes new features and enhancements for Spotter Analysts, starter prompts, SpotterViz loading state customization, and the `HostEvent.Navigate` object format. For more information, see the xref:api-changelog.adoc[Visual Embed SDK changelog]. + +--- + +[discrete] +==== REST API v2 +For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- + +|=== + == July 2026 **Release version**: ThoughtSpot Cloud 26.7.0.cl + -*Upgrade notes*: No breaking changes + +*Upgrade notes*: Includes breaking changes to SpotterCode + *Recommended SDK versions*: Visual Embed SDK v1.50.0 and later [.cl-table, cols="2,4", frame=none, grid=none] -|===== +|=== a| [.cl-label] *Version 26.7.0.cl* @@ -65,6 +172,23 @@ In full application embedding with the V3 navigation and home page experience, T --- +[discrete] +==== SpotterCode authentication and workflow execution [.version-badge.breaking]#Breaking# +SpotterCode now supports authenticated sessions with your ThoughtSpot instance. When connecting your MCP client to the SpotterCode endpoint, you are now prompted to log in using your organization's identity provider. After authentication, SpotterCode can make ThoughtSpot API calls on your behalf. + +For more information, see the documentation on xref:spottercode.adoc#_mcp_server_endpoints[SpotterCode MCP Server] and xref:spottercode-integration.adoc#_authenticate_spottercode[Authenticating SpotterCode]. + +--- + +[discrete] +==== SpotterCode Agent in Visual Embed Playground [earlyAccess eaBackground]#Early Access# + +The Visual Embed SDK Playground now includes SpotterCode Agent, an AI-powered coding assistant. The SpotterCode panel displays pre-built prompts relevant to the component you are embedding, provides a prompt interface for user queries, and generates embed code. It generates boilerplate code automatically and accelerates building code and iterating embed configurations. + +For more information, see xref:developer-playground.adoc#spottercode-panel[Using SpotterCode in the Playground]. + +--- + [discrete] ==== Webhooks enhancements @@ -83,14 +207,6 @@ The xref:webhooks-api.adoc#_updating_a_webhook[webhook update API endpoint] supp --- -[discrete] -==== SpotterCode Agent in Visual Embed Playground [earlyAccess eaBackground]#Early Access# - -The Visual Embed SDK Playground now includes SpotterCode Agent, an AI-powered coding assistant. The SpotterCode panel displays pre-built prompts relevant to the component you are embedding, a prompt interface for user queries, and generates embed code. It generates boilerplate code automatically, accelerates building code and iterating embed configurations. - -For more information, see xref:developer-playground.adoc#spottercode-panel[Using SpotterCode in the Playground]. - ---- [discrete] ==== Org isolation for per-org SAML and OIDC authentication @@ -110,7 +226,7 @@ For information about REST API v2 enhancements in this release, see the xref:res --- -|===== +|=== == June 2026 @@ -119,7 +235,7 @@ For information about REST API v2 enhancements in this release, see the xref:res *Recommended SDK versions*: Visual Embed SDK v1.49.0 and later [.cl-table, cols="2,4", frame=none, grid=none] -|===== +|=== a| [.cl-label] *Version 26.6.0.cl* @@ -166,7 +282,7 @@ The menu link to the GraphQL playground has been removed from the UI. [discrete] ==== Liveboard browser cache refresh -To improve load performance and reduce, you can now enable the Liveboard cache option with a **Refresh** button to allow your users to clear cache and refresh visualization data when required. For more information, see xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. +To improve load performance and reduce reload times, you can now enable the Liveboard cache option with a **Refresh** button that lets your users clear the cache and refresh visualization data when required. For more information, see xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. --- @@ -180,7 +296,7 @@ The Visual Embed SDK version 1.49.0 includes several new features and enhancemen ==== REST API v2 This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|===== +|=== == May 2026 @@ -191,7 +307,7 @@ This release introduces new API endpoints for Spotter, connections and trusted a [.cl-table, cols="2,4", frame=none, grid=none] -|===== +|=== a| [.cl-label] *Version 26.5.0.cl* @@ -262,7 +378,7 @@ The Visual Embed SDK version 1.48.0 includes several new features and enhancemen ==== REST API v2 This release introduces new Spotter API endpoints and modifications to the agent conversation APIs, and deprecates legacy agent endpoints. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|===== +|=== == April 2026 @@ -283,7 +399,7 @@ a| [discrete] ==== Theme builder in AI mode -The Theme Builder now has an AI mode that enables developers to explore and preview style customizations for their embedded application’s branding using natural language instructions and uploaded brand assets. You can execute style updates such as applying colors directly from a PDF branding guide, updating all button shapes with higher contrast, matching a header to a dark background based on a screenshot, or importing typography and spacing from a JSON file. In the AI mode, Theme builder interprets your intent and applies the changes instantly. +The Theme Builder now has an AI mode that enables developers to explore and preview style customizations for their embedded application's branding using natural language instructions and uploaded brand assets. You can execute style updates such as applying colors directly from a PDF branding guide, updating all button shapes with higher contrast, matching a header to a dark background based on a screenshot, or importing typography and spacing from a JSON file. In the AI mode, Theme builder interprets your intent and applies the changes instantly. For more information, see xref:theme-builder.adoc[Theme builder]. @@ -650,4 +766,4 @@ For information about the new features and enhancements introduced in Visual Emb ==== REST API For information about REST API v2 enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|=== \ No newline at end of file +|=== diff --git a/modules/tutorials/pages/rest-api/rest-api_lesson-02.adoc b/modules/tutorials/pages/rest-api/rest-api_lesson-02.adoc index 3f551f338..5e08236a5 100644 --- a/modules/tutorials/pages/rest-api/rest-api_lesson-02.adoc +++ b/modules/tutorials/pages/rest-api/rest-api_lesson-02.adoc @@ -5,6 +5,10 @@ :page-pageid: rest-api__lesson-02 :description: A lesson on a simple implementation of the V2.0 using Python +[IMPORTANT] +==== +The workflows and examples in this tutorial use a legacy version of the ThoughtSpot REST API link:https://github.com/thoughtspot/thoughtspot_rest_api_python[ThoughtSpot Community SDK, window=_blank]. We recommend using the xref:python-sdk.adoc[ThoughtSpot-provided Python SDK for REST API v2], which supports both asynchronous and synchronous invocation, transparent token refresh, server-sent event (SSE) streaming, file uploads and downloads, and error handling. +==== == Get started We'll use the files from the link:https://github.com/thoughtspot/tse-api-tutorial[tse-api-tutorial GitHub repository, window=_blank] that you downloaded at the beginning of the tutorial. @@ -65,9 +69,8 @@ import requests import json thoughtspot_url = 'https://{}.thoughtspot.cloud' -org_id = 1613534286 +org_id = 0 api_version = '2.0' - ---- Now, let's construct the starting portion of any API endpoint URL and define the most basic headers that will be used by every call: @@ -77,12 +80,12 @@ Now, let's construct the starting portion of any API endpoint URL and define the ... base_url = '{thoughtspot_url}/api/rest/{version}/'.format(thoughtspot_url=thoughtspot_url, version=api_version) api_headers = { - 'X-Requested-By': 'ThoughtSpot', + 'X-Requested-By': 'ThoughtSpot', 'Accept': 'application/json' } ---- -== 02 - Use a Session object +== 02 - Use a session object Rather than setting the full configuration for each HTTP request, you can construct a `Session` object from the `requests` library, which keeps an open HTTP connection and maintains settings like headers and cookies between individual HTTP actions. @@ -99,7 +102,7 @@ requests_session = requests.Session() requests_session.headers.update(api_headers) # Define the JSON message, in Python object syntax (close but not exactly JSON) -json_post_data = { // a request body } +json_post_data = { # a request body } # Set the URL of the endpoint url = base_url + "{api_endpoint_ending}" @@ -123,7 +126,7 @@ In the REST API V2.0 Playground: . Go to *Authentication* > *Get Full Access Token*. . Specify the parameters. -. Copy the JSON body from the right side of the Playground. Python dicts use the same syntax, but you must update booleans to be *uppercase*. +. Copy the JSON body from the right side of the Playground. Python dicts use the same syntax, but you must capitalize Python's boolean keywords (`True`/`False`). . Replace any hard-coded values with the *global variables* you declared so that you can easily update requests at the top of your script and ensure those values change everywhere they are used: + [,python] @@ -137,13 +140,13 @@ json_post_data = { "password": "y0urP@ssword", "validity_time_in_sec": 3600, "org_id": org_id, - "auto_create": False # make sure to uppercase in Python + "auto_create": False # capitalize booleans in Python } ---- . Make a `.post()` request using the `Session` object. + + -We expect a JSON response on success, which you can access using the `.json()` method of the `Response` object. +We expect a JSON response on success, which you can access using the `.json()` method of the `Response` object. + From the Playground, we can see that there is a `token` property in the response. @@ -152,14 +155,13 @@ From the Playground, we can see that there is a `token` property in the response + [,python] ---- -.... +... resp = requests_session.post(url=url, json=json_post_data) resp_json = resp.json() print(json.dumps(resp_json, indent=2)) token = resp_json["token"] print("Here's the token:") print(token) -.... ---- ==== Run the script to test @@ -199,7 +201,7 @@ Unfortunately, making a REST API request to a web server can result in any numbe Good coding involves testing for and handling error situations. === Using try and except in Python -Python code raises `link:https://docs.python.org/3/tutorial/errors.html[Exceptions, target=_blank]` when an error is encountered. +Python code raises `link:https://docs.python.org/3/tutorial/errors.html[Exceptions, window=_blank]` when an error is encountered. If an `Exception` is raised and is not *handled*, the script exits and displays the message provided with the Exception and other details of what failed. @@ -210,28 +212,28 @@ Every HTTP request can potentially result in an error, and we don't want to cont The most generic `try...except` block will capture *any* `Exception`: [,python] ---- -try: +try: resp = requests_session.post(url=url, json=json_post_data) resp_json = resp.json() # Returns JSON body of resp to Python Dict print(resp_json) token = resp_json["token"] -except Exception as e: - # do whatever is necessary in exception case +except Exception as e: + # do whatever is necessary in exception case # Code after the try block will now run even after Exception ---- === Checking for requests HTTPError exceptions -The `requests` library does not raise an `Exception` when an HTTP request completes "properly", that is to say a well-formed HTTP response is received from a request. +The `requests` library does not raise an `Exception` when an HTTP request completes "properly," that is to say a well-formed HTTP response is received from a request. However, as you saw in the previous lesson, HTTP responses include a *Status Code* that indicates if the requested action was a *Success* or an *Error*. -To raise `Exceptions` when the response does not include a *Success* status code, call the `Response.raise_for_status()` method for each call, which throws the specific `requests.exceptions.HTTPError` `Exception` when a 400 series or 500 status code is returned: +To raise `Exceptions` when the response does not include a *Success* status code, call the `Response.raise_for_status()` method for each call, which throws the specific `requests.exceptions.HTTPError` `Exception` when a 400 or 500 series status code is returned: [source,python] ---- -try: +try: resp = requests_session.post(url=url, json=json_post_data) resp.raise_for_status() print(resp) @@ -265,7 +267,7 @@ json_post_data = { "password": "y0urP@ssword", "validity_time_in_sec": 3600, "org_id": org_id, - "auto_create": False # make sure to uppercase in Python + "auto_create": False # capitalize booleans in Python } try: @@ -309,7 +311,7 @@ try: ... ---- -You may have noticed many steps that are repeated each time for any given request. +You may have noticed many steps that are repeated each time for any given request. In the next lesson, we'll cover using a *library* that wraps most of these repeated steps, so that you can focus simply on the logic of your API workflows. diff --git a/package-lock.json b/package-lock.json index 00b381396..1f7de314b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,15 +7,20 @@ "name": "@thoughtspot/developer-docs", "license": "ThoughtSpot Development Tools End User License Agreement", "dependencies": { + "@thoughtspot/radiant-react": "^1.0.0-beta", + "@types/dompurify": "^3.0.5", "@vercel/analytics": "^1.0.2", + "@vercel/functions": "^3.7.6", "algoliasearch": "^4.10.5", "cheerio": "^1.2.0", "classnames": "^2.3.1", + "dompurify": "^3.3.3", "eventemitter3": "^4.0.7", "gatsby-plugin-vercel": "^1.0.3", "gatsby-source-git": "^1.1.0", "html-react-parser": "^1.4.12", "lodash": "^4.17.21", + "marked": "^18.0.0", "mixpanel-browser": "^2.45.0", "react-helmet": "^6.1.0", "turndown": "^7.2.4", @@ -95,10 +100,62 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ag-grid-community/client-side-row-model": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-27.2.0.tgz", + "integrity": "sha512-5TChi4q/jIFrmwbB+ZZibMhYzoYUJcdYW9BPt7+hWiM2IcTeLnXQV51fFtl+A+SET4m/5a0BUN37pGtWdBWI2Q==", + "license": "MIT", + "dependencies": { + "@ag-grid-community/core": "~27.2.0" + } + }, + "node_modules/@ag-grid-community/client-side-row-model/node_modules/@ag-grid-community/core": { + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.1.tgz", + "integrity": "sha512-ZR2n0Rki6+LG4yzjQ+nFW3gsh6s2Bc7Hj2Ct9G3M3628od7YZmwiT0A8d7szfEsp2o70cpp/QIRXjK5G0YJOmQ==", + "license": "MIT" + }, + "node_modules/@ag-grid-community/core": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.1.0.tgz", + "integrity": "sha512-f7AgQwCQSlCwmNTI/h31+S/12pQqw4vln98XAFKRDplsDqzOoGFxB6au7Ky93E5iS+Bi7kHQTSMCqCzzsTHHsg==", + "license": "MIT", + "peer": true + }, + "node_modules/@ag-grid-community/infinite-row-model": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/infinite-row-model/-/infinite-row-model-27.2.0.tgz", + "integrity": "sha512-7xWe6xTjvxL6I3nMlfzBlqaxAmW1mrcH6EiywmdDg23jOmUrzljspmmmrqXOocQG8uiRlxiMpPt2jbNpQdKNRw==", + "license": "MIT", + "dependencies": { + "@ag-grid-community/core": "~27.2.0" + } + }, + "node_modules/@ag-grid-community/infinite-row-model/node_modules/@ag-grid-community/core": { + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.1.tgz", + "integrity": "sha512-ZR2n0Rki6+LG4yzjQ+nFW3gsh6s2Bc7Hj2Ct9G3M3628od7YZmwiT0A8d7szfEsp2o70cpp/QIRXjK5G0YJOmQ==", + "license": "MIT" + }, + "node_modules/@ag-grid-community/react": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/react/-/react-27.2.0.tgz", + "integrity": "sha512-QDX8zakSrv45jwngoz4EMayP94n00Q7tBk3ezaNlPemt6GNPSum9ffNCurr1t+c31UhBpMxrIZjUFJ5Fse+Y0Q==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@ag-grid-community/core": "~27.1.0", + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0" + } }, "node_modules/@algolia/cache-browser-local-storage": { "version": "4.19.1", @@ -417,12 +474,36 @@ "yarn": ">=1.1.0" } }, + "node_modules/@atlaskit/pragmatic-drag-and-drop": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-1.7.7.tgz", + "integrity": "sha512-jX+68AoSTqO/fhCyJDTZ38Ey6/wyL2Iq+J/moanma0YyktpnoHxevjY1UNJHYp0NCburdQDZSL1ZFac1mO1osQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.0.0", + "bind-event-listener": "^3.0.0", + "raf-schd": "^4.0.3" + } + }, + "node_modules/@atlaskit/pragmatic-drag-and-drop-auto-scroll": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-auto-scroll/-/pragmatic-drag-and-drop-auto-scroll-2.1.2.tgz", + "integrity": "sha512-6BgAUxSNbQFiG3uqNxf53cDQADn5mSeh/JsQzCHo46GPQnVWIJk77zWC8yZ++0Mfg1ECy02zNrbniF7SgHAhXQ==", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "^1.7.0", + "@babel/runtime": "^7.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "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/highlight": "^7.22.5" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -483,14 +564,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "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/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@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" }, "engines": { "node": ">=6.9.0" @@ -609,13 +692,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "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" } @@ -632,26 +713,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "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/types": "^7.22.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "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-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -672,9 +754,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "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" } @@ -745,17 +828,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "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.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "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" } @@ -782,13 +867,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -808,9 +893,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "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.7" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1590,14 +1679,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "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-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@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" @@ -2211,57 +2301,54 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "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.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@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.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "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.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.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": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "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.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2297,6 +2384,35 @@ "node": ">=0.1.95" } }, + "node_modules/@cord-sdk/components": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/components/-/components-0.0.47.tgz", + "integrity": "sha512-6fScsnFc9BWpc6uaT+V8s4/H33EZmg6Mlp47HOUod2hYDfJxvdhXI7LkzBYocEP6S64bXzaVSKR56m0yNPzw2A==", + "license": "MIT", + "dependencies": { + "@cord-sdk/types": "0.0.47" + } + }, + "node_modules/@cord-sdk/react": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/react/-/react-0.0.47.tgz", + "integrity": "sha512-o4A9n3U5s5UIG58N8pX3Kghk4/RkT2wYB35vshpLYuTdnlA3PnMSsYcJ3lJJbgXr5d+YnYtv7cSIfWyVt+yT6g==", + "license": "MIT", + "dependencies": { + "@cord-sdk/components": "0.0.47", + "@cord-sdk/types": "0.0.47", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/@cord-sdk/types": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/types/-/types-0.0.47.tgz", + "integrity": "sha512-KNog4aJkHy70CnsgCB+H1KY7RBvFkUdlfRxEV5XwVx9HKlcUEkng4ttS2HtLN/nfZ7bIG9H1JGFD28S82yrvtg==", + "license": "MIT" + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2319,372 +2435,514 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@devexpress/utils": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.13.tgz", + "integrity": "sha512-DaTNDLcyepRegwKCWrikP+6WH0cY6/gVSLC/wd6o6AhuTpn6jrXEYcJm50+DwUSwAPVyoQcp6iYRTD1BdITrBQ==", + "license": "SEE LICENSE IN README.md", + "dependencies": { + "tslib": "2.0.1" + } + }, + "node_modules/@devexpress/utils/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "license": "0BSD" + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint/eslintrc": { @@ -2860,6 +3118,12 @@ "strip-ansi": "^6.0.0" } }, + "node_modules/@gilbarbara/deep-equal": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz", + "integrity": "sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==", + "license": "MIT" + }, "node_modules/@graphql-codegen/add": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", @@ -3320,6 +3584,20 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "license": "MIT", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4247,16 +4525,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4267,14 +4542,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", @@ -4285,23 +4552,26 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" }, "node_modules/@lezer/common": { "version": "0.15.12", @@ -5795,6 +6065,48 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/resize-observer": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", + "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.3.1", + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/@react-icons/all-files": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz", @@ -5818,9 +6130,10 @@ } }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -6185,6 +6498,135 @@ "react-dom": "^18.0.0" } }, + "node_modules/@thoughtspot/radiant-react": { + "version": "1.0.0-beta", + "resolved": "https://packagecloud.io/modeanalytics/tse/npm/@thoughtspot/radiant-react/-/radiant-react-1.0.0-beta.tgz", + "integrity": "sha1-nsAqfPGr8Bf7c5b4Y4eD/NtM5jM=", + "dependencies": { + "@ag-grid-community/client-side-row-model": "27.2.0", + "@ag-grid-community/core": "27.2.0", + "@ag-grid-community/infinite-row-model": "27.2.0", + "@ag-grid-community/react": "27.2.0", + "@atlaskit/pragmatic-drag-and-drop": "1.7.7", + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "2.1.2", + "@cord-sdk/react": "0.0.47", + "@cord-sdk/types": "0.0.47", + "@dnd-kit/core": "6.3.1", + "@dnd-kit/sortable": "10.0.0", + "@popperjs/core": "^2.4.0", + "@react-hook/resize-observer": "1.2.6", + "classnames": "^2.2.6", + "devextreme": "^20.2.10", + "dompurify": "^3.3.2", + "fuzzysort": "3.1.0", + "lodash": "^4.17.23", + "moment": "2.30.1", + "overlayscrollbars": "^1.13.2", + "overlayscrollbars-react": "^0.3.0", + "re-resizable": "^6.9.0", + "react-beautiful-dnd": "^13.1.1", + "react-datepicker": "^3.6.0", + "react-draggable": "4.4.5", + "react-flexview": "^6.0.1", + "react-joyride": "^2.2.1", + "react-modal": "^3.11.2", + "react-popper": "^2.2.3", + "react-use": "^15.1.0", + "requestidlecallback-polyfill": "^1.0.2", + "w3c-keys": "^1.0.2" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@thoughtspot/radiant-react/node_modules/@ag-grid-community/core": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.0.tgz", + "integrity": "sha512-X7h1brYSpsFB7EuXhify6yU9ub9+BI8xGY9dqJnfrUP0BeOZAn1A4wv4k8sUbiI/7NSF9xA3cpnnXP5PKyo8bw==", + "license": "MIT" + }, + "node_modules/@thoughtspot/radiant-react/node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@thoughtspot/radiant-react/node_modules/react-datepicker": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-3.8.0.tgz", + "integrity": "sha512-iFVNEp8DJoX5yEvEiciM7sJKmLGrvE70U38KhpG13XrulNSijeHw1RZkhd/0UmuXR71dcZB/kdfjiidifstZjw==", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.6", + "date-fns": "^2.0.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.10.0", + "react-popper": "^1.3.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17", + "react-dom": "^16.9.0 || ^17" + } + }, + "node_modules/@thoughtspot/radiant-react/node_modules/react-datepicker/node_modules/react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@thoughtspot/radiant-react/node_modules/react-use": { + "version": "15.3.8", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-15.3.8.tgz", + "integrity": "sha512-GeGcrmGuUvZrY5wER3Lnph9DSYhZt5nEjped4eKDq8BRGr2CnLf9bDQWG9RFc7oCPphnscUUdOovzq0E5F2c6Q==", + "license": "Unlicense", + "dependencies": { + "@types/js-cookie": "2.2.6", + "@xobotyi/scrollbar-width": "1.9.5", + "copy-to-clipboard": "^3.2.0", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.2.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.0.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^2.1.0", + "ts-easing": "^0.2.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -6199,14 +6641,6 @@ "node": ">= 6" } }, - "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==", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -6340,6 +6774,15 @@ "integrity": "sha512-AUmj9JHuHTD94slY1WR1VulFxRGC6D1pcNCN0MCulKFyiihvV/28lLS8oRHgfmc2Cxq954J8Vmosa8qzm7PLGQ==", "dev": true }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "*" + } + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -6349,19 +6792,11 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" }, "node_modules/@types/get-port": { "version": "3.2.0", @@ -6399,7 +6834,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dev": true, "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -6484,10 +6918,17 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/@types/js-cookie": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz", + "integrity": "sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==", + "license": "MIT" + }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -6612,6 +7053,18 @@ "@types/react": "*" } }, + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, "node_modules/@types/react-test-renderer": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.1.tgz", @@ -6681,6 +7134,12 @@ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@types/unist": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", @@ -6922,6 +7381,66 @@ "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" }, + "node_modules/@vercel/cli-config": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.1.tgz", + "integrity": "sha512-RhfyXmRLHdbnry8RJqHDc+5rGxMZ0bu+fpysZjtv3bE+BubpuwxTancHOKiH5zKQREsdwFVr3mOI2kOvxlOyxA==", + "license": "Apache-2.0", + "dependencies": { + "xdg-app-paths": "5", + "zod": "4.1.11" + } + }, + "node_modules/@vercel/cli-exec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vercel/cli-exec/-/cli-exec-1.0.0.tgz", + "integrity": "sha512-kQF8LGie/Hbdq9/psJxLE7owRTcqMQMhgybU04gCeR7cbQAr5t8OrjefDNColJv1QSSucFt4pLwRiARVmlOnug==", + "license": "Apache-2.0", + "dependencies": { + "execa": "5.1.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@vercel/functions": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-3.7.6.tgz", + "integrity": "sha512-QKlSfrgvo4pGEnzHw8Dha9GRTb5hhLBbImKi4rL4CmxClaVs+36hxgjW0MOqez57wWShstpKOWZY/mU8KuYoUQ==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/oidc": "3.8.1" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-web-identity": "*", + "ws": ">=8" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-provider-web-identity": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/@vercel/oidc": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.8.1.tgz", + "integrity": "sha512-ufdalm2MWOYksyj8KVpWjoOFPJO6zoYpuyvIggIQ2bB0CFCjTCiTkGXHqAKwG77GVRjOaN3/8S5ITlZpXWmqOw==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/cli-config": "0.2.1", + "@vercel/cli-exec": "1.0.0", + "jose": "^5.9.6" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", @@ -6931,145 +7450,168 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", + "license": "MIT" + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -7196,9 +7738,10 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7210,6 +7753,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -8220,9 +8802,10 @@ } }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -8265,6 +8848,18 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.36", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.36.tgz", + "integrity": "sha512-lVq/Df7LXlO79MVaaUHztSwWiG9oXoWHlgvNS51v8Dpd4+G4/VIy6qYePTw31nAVls33nUtnfezYeLkYAak9dg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -8301,9 +8896,15 @@ "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==" }, "node_modules/better-queue/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -8324,6 +8925,12 @@ "node": ">=8" } }, + "node_modules/bind-event-listener": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-3.0.0.tgz", + "integrity": "sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==", + "license": "MIT" + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -8353,40 +8960,34 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "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", - "content-type": "~1.0.4", + "bytes": "~3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8394,7 +8995,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", @@ -8498,20 +9100,22 @@ } }, "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.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", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -8530,9 +9134,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -8547,11 +9151,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -8620,9 +9226,10 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9359,9 +9966,10 @@ } }, "node_modules/clipboardy/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -9513,7 +10121,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "dev": true, "engines": { "node": ">=6" } @@ -9696,16 +10303,17 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -9725,10 +10333,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -9833,6 +10445,15 @@ "node": ">=0.10.0" } }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/core-js": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", @@ -9942,9 +10563,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -9974,6 +10596,15 @@ "urix": "^0.1.0" } }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -9985,6 +10616,15 @@ "postcss": "^8.0.9" } }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, "node_modules/css-loader": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", @@ -10407,6 +11047,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -10566,6 +11213,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -10656,9 +11304,10 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/devcert": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", - "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.3.tgz", + "integrity": "sha512-vmLo0hDNHmZ47HED1ZiouJ7cAcamL8HY7qa9YdmCBkXxHEVtdDgT9pN/Xy3ZkcF3pFjF0sqq8WMV93HF2nmHHw==", + "license": "MIT", "dependencies": { "@types/configstore": "^2.1.1", "@types/debug": "^0.0.30", @@ -10742,11 +11391,97 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/devexpress-diagram": { + "version": "2.0.45", + "resolved": "https://registry.npmjs.org/devexpress-diagram/-/devexpress-diagram-2.0.45.tgz", + "integrity": "sha512-jSYLq8oMddTPrrs5IAf4MtqvSkLAW8sEOcWOJKKlvPXM2PtjI76DsV444YA+/JexaRITI+CyDXcGtk+ta8b/2Q==", + "license": "SEE LICENSE IN README.md", + "dependencies": { + "@devexpress/utils": "1.3.13", + "es6-object-assign": "^1.1.0" + } + }, + "node_modules/devexpress-gantt": { + "version": "2.0.40", + "resolved": "https://registry.npmjs.org/devexpress-gantt/-/devexpress-gantt-2.0.40.tgz", + "integrity": "sha512-0+ZfOKO+zIDSaGBZgIoafid95zAPvS1kQv8szNn2p0newrQpnVosWzV5pKWHLZRwT7yziBY+6bQ/xwNdG9iShg==", + "license": "SEE LICENSE IN README.md", + "dependencies": { + "@devexpress/utils": "1.3.2", + "tslib": "2.1.0" + } + }, + "node_modules/devexpress-gantt/node_modules/@devexpress/utils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.2.tgz", + "integrity": "sha512-Ii7hpz6ItNMLKz23qQOlHom/k0e1TSnIQKCwZlKuYBwpIEBX5I/PQxvAwbdBnu5EZZSkdjnhzxl6luhl/k4LdA==", + "license": "SEE LICENSE IN README.md", + "dependencies": { + "tslib": "2.0.1" + } + }, + "node_modules/devexpress-gantt/node_modules/@devexpress/utils/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "license": "0BSD" + }, + "node_modules/devexpress-gantt/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "license": "0BSD" + }, + "node_modules/devextreme": { + "version": "20.2.13", + "resolved": "https://registry.npmjs.org/devextreme/-/devextreme-20.2.13.tgz", + "integrity": "sha512-KG+/vbC39df9viE5o+QF42eTQZyrZ8ymKH30EH3ZaRNc661/T5ml5nFwWtcOaH1xj21yWLVl4iKFccxW/rcDHQ==", + "license": "SEE LICENSE IN README.md", + "dependencies": { + "devexpress-diagram": "2.0.45", + "devexpress-gantt": "2.0.40", + "devextreme-quill": "~1.1.5", + "jszip": "^3.7.1", + "preact": "10.9.0", + "rrule": "2.7.0", + "showdown": "^1.9.1", + "turndown": "~7.0.0" + }, + "bin": { + "devextreme-bundler": "bin/bundler.js", + "devextreme-bundler-init": "bin/bundler-init.js" + } + }, + "node_modules/devextreme-quill": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/devextreme-quill/-/devextreme-quill-1.1.5.tgz", + "integrity": "sha512-fM3cFXGaA19PjTgNav7gJDEU2rNu+/8UOWQU4Ndq3QunZ9zm3HXlWhiQFAKdLWaAcvwSJHQ+9ZrORwPBl23AlQ==", + "license": "BSD-3-Clause", + "dependencies": { + "core-js": "^3.6.5", + "eventemitter3": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.5.0", + "parchment": "2.0.0-dev.2", + "quill-delta": "4.2.2" + } + }, + "node_modules/devextreme/node_modules/turndown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.0.0.tgz", + "integrity": "sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q==", + "license": "MIT", + "dependencies": { + "domino": "^2.1.6" + } + }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -10869,6 +11604,21 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/domino": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.7.tgz", + "integrity": "sha512-3rcXhx0ixJV2nj8J0tljzejTF73A35LVVdnTQu79UAqTBFEgYPMgGtykMuu/BDqaOZphATku1ddRUn/RtqUHYQ==", + "license": "BSD-2-Clause" + }, + "node_modules/dompurify": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.9.tgz", + "integrity": "sha512-4dPSRMRDqHvs0V4YDFCsaIZo4if5u0xM+llyxiM2fwuZFdKArUBAF3VtI2+n8NKg9P870WMdYk0UhqQNoWXbfQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -10996,12 +11746,14 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.485", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz", - "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==" + "version": "1.5.371", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz", + "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==", + "license": "ISC" }, "node_modules/emittery": { "version": "0.7.2", @@ -11029,9 +11781,10 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11163,12 +11916,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -11328,9 +12082,10 @@ "license": "MIT" }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -11345,13 +12100,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -11382,13 +12139,15 @@ } }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "hasInstallScript": true, + "license": "ISC", "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -11405,6 +12164,12 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "license": "MIT" + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -11431,47 +12196,52 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11487,7 +12257,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -12181,6 +12952,27 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -12272,6 +13064,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12334,8 +13127,7 @@ "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", - "dev": true + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/exit": { "version": "0.1.2", @@ -12630,44 +13422,49 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "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.1", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-graphql": { @@ -12749,9 +13546,10 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13072,6 +13870,27 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fast-uri": { + "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", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -13080,6 +13899,12 @@ "node": ">= 4.9.1" } }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -13189,9 +14014,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -13208,16 +14034,17 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -13228,6 +14055,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -13235,7 +14063,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -13290,9 +14119,10 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "license": "ISC" }, "node_modules/flexsearch": { "version": "0.6.32", @@ -13301,15 +14131,16 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "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", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -13557,13 +14388,16 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -13604,6 +14438,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13693,6 +14528,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "license": "MIT" + }, "node_modules/gatsby": { "version": "4.25.7", "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.25.7.tgz", @@ -14246,10 +15087,11 @@ } }, "node_modules/gatsby-page-utils/node_modules/gatsby-core-utils": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.14.0.tgz", - "integrity": "sha512-h0v20gB213PmhKjioCJ93SrUb7Hihnqxd6X6Iur4u1eiWTUDsGeV9g1bkquiuDl2qovUnjj7mOoHdWiu/Ax/9Q==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "ci-info": "2.0.0", @@ -14269,7 +15111,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-page-utils/node_modules/glob": { @@ -15433,18 +16275,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -15770,6 +16600,12 @@ "dev": true, "optional": true }, + "node_modules/gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", + "license": "MIT" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -16178,7 +17014,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "dependencies": { "react-is": "^16.7.0" } @@ -16186,8 +17021,7 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hosted-git-info": { "version": "3.0.8", @@ -16354,18 +17188,23 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-proxy-agent": { @@ -16430,6 +17269,12 @@ "node": ">=10.17.0" } }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -16491,6 +17336,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -16610,6 +17461,15 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -16780,7 +17640,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -17062,6 +17921,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-1.2.1.tgz", + "integrity": "sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==", + "license": "MIT" + }, "node_modules/is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", @@ -17109,6 +17974,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -18259,10 +19125,11 @@ } }, "node_modules/jest-environment-jsdom/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -19807,26 +20674,34 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -19900,13 +20775,16 @@ } }, "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -19914,14 +20792,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -20018,6 +20897,18 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -20104,6 +20995,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -20144,11 +21044,16 @@ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -20181,9 +21086,10 @@ "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -20227,6 +21133,13 @@ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -20401,15 +21314,15 @@ } }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 12" + "node": ">= 20" } }, "node_modules/math-intrinsics": { @@ -20484,6 +21397,12 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, "node_modules/memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", @@ -20500,9 +21419,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -20526,11 +21449,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -20613,9 +21537,10 @@ } }, "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" }, @@ -20670,9 +21595,10 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", "engines": { "node": "*" } @@ -20689,9 +21615,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msgpackr": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.6.tgz", - "integrity": "sha512-50rmb6+ZWvEm0vJn8R8CwI1Eavss3h5rgtKrcdUal3EkZcpqw82+xsmc7RoHb8fYB5V4EOU2NDaOitDAdO0t+w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", + "license": "MIT", "optionalDependencies": { "msgpackr-extract": "^3.0.2" } @@ -20750,16 +21677,37 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, + "node_modules/nano-css": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", + "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "license": "Unlicense", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "css-tree": "^1.1.2", + "csstype": "^3.1.2", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^7.0.1", + "rtl-css-js": "^1.16.1", + "stacktrace-js": "^2.0.2", + "stylis": "^4.3.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -21025,9 +21973,13 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-path": { "version": "3.0.0", @@ -21224,7 +22176,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -21356,6 +22307,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -21364,9 +22316,10 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -21437,6 +22390,15 @@ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.1.tgz", "integrity": "sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==" }, + "node_modules/os-paths": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", + "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==", + "license": "MIT", + "engines": { + "node": ">= 6.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -21445,6 +22407,22 @@ "node": ">=0.10.0" } }, + "node_modules/overlayscrollbars": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.3.tgz", + "integrity": "sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g==", + "license": "MIT" + }, + "node_modules/overlayscrollbars-react": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.3.0.tgz", + "integrity": "sha512-dV74p9VL/aImqJpeYz0vmpScZYu6UiNTmRKfyI4CS0OYUpYCUiTd723adY38Grz2W57hoNCECWDzkOJRFDQeZg==", + "license": "MIT", + "peerDependencies": { + "overlayscrollbars": "^1.10.0", + "react": "^16.4.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -21693,6 +22671,12 @@ "node": ">=0.10.0" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -21702,6 +22686,12 @@ "tslib": "^2.0.3" } }, + "node_modules/parchment": { + "version": "2.0.0-dev.2", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-2.0.0-dev.2.tgz", + "integrity": "sha512-4fgRny4pPISoML08Zp7poi52Dff3E2G1ORTi2D/acJ/RiROdDAMDB6VcQNfBcmehrX5Wixp6dxh6JjLyE5yUNQ==", + "license": "BSD-3-Clause" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -21963,9 +22953,10 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "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/path-type": { "version": "4.0.0", @@ -21999,14 +22990,16 @@ "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "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" }, @@ -22106,6 +23099,17 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -22124,9 +23128,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -22141,10 +23145,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -22659,6 +23664,16 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/preact": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.9.0.tgz", + "integrity": "sha512-jO6/OvCRL+OT8gst/+Q2ir7dMybZAX8ioP02Zmzh3BkQMHLyqZSujvxbUriXvHi8qmhcHKC2Gwbog6Kt+YTh+Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -22928,11 +23943,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "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.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -22994,6 +24010,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "license": "MIT", + "dependencies": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + } + }, + "node_modules/quill-delta/node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "license": "Apache-2.0" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -23030,27 +24069,20 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", @@ -23092,6 +24124,16 @@ "node": ">=0.10.0" } }, + "node_modules/re-resizable": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", + "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -23103,6 +24145,26 @@ "node": ">=0.10.0" } }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -23295,7 +24357,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", - "dev": true, "dependencies": { "clsx": "^1.1.1", "prop-types": "^15.8.1" @@ -23315,6 +24376,54 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, + "node_modules/react-flexview": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-flexview/-/react-flexview-6.0.1.tgz", + "integrity": "sha512-eEv8PxbRQsgiXkeTIMvkKUnsnGJl1mQNYx6TsrLJ0hIqnYvYFpNXXK33j/VLdaNqI9xIh8hZZVm2GlgAOI9hvw==", + "license": "ISC", + "dependencies": { + "prop-types": "^15.5.6" + } + }, + "node_modules/react-floater": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.9.tgz", + "integrity": "sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "is-lite": "^0.8.2", + "popper.js": "^1.16.0", + "prop-types": "^15.8.1", + "tree-changes": "^0.9.1" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-floater/node_modules/@gilbarbara/deep-equal": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz", + "integrity": "sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==", + "license": "MIT" + }, + "node_modules/react-floater/node_modules/is-lite": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", + "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==", + "license": "MIT" + }, + "node_modules/react-floater/node_modules/tree-changes": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.9.3.tgz", + "integrity": "sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.1.1", + "is-lite": "^0.8.2" + } + }, "node_modules/react-helmet": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", @@ -23329,11 +24438,61 @@ "react": ">=16.3.0" } }, + "node_modules/react-innertext": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-innertext/-/react-innertext-1.1.5.tgz", + "integrity": "sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">=0.0.0 <=99", + "react": ">=0.0.0 <=99" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-joyride": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.9.3.tgz", + "integrity": "sha512-1+Mg34XK5zaqJ63eeBhqdbk7dlGCFp36FXwsEvgpjqrtyywX2C6h9vr3jgxP0bGHCw8Ilsp/nRDzNVq6HJ3rNw==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.3.1", + "deep-diff": "^1.0.2", + "deepmerge": "^4.3.1", + "is-lite": "^1.2.1", + "react-floater": "^0.7.9", + "react-innertext": "^1.1.5", + "react-is": "^16.13.1", + "scroll": "^3.0.1", + "scrollparent": "^2.1.0", + "tree-changes": "^0.11.2", + "type-fest": "^4.27.0" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-joyride/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-joyride/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", @@ -23344,7 +24503,6 @@ "version": "3.16.1", "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", - "dev": true, "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -23359,11 +24517,65 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" } }, + "node_modules/react-onclickoutside": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.2.tgz", + "integrity": "sha512-h6Hbf1c8b7tIYY4u90mDdBLY4+AGQVMFtIE89HgC0DtVCh/JfKl477gYqUtGLmjZBKK3MJxomP/lFiLbz4sq9A==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "license": "MIT", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-property": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -23467,6 +24679,15 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, "node_modules/react-use-flexsearch": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/react-use-flexsearch/-/react-use-flexsearch-0.1.1.tgz", @@ -23977,10 +25198,11 @@ } }, "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -24008,6 +25230,12 @@ "uuid": "bin/uuid" } }, + "node_modules/requestidlecallback-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/requestidlecallback-polyfill/-/requestidlecallback-polyfill-1.0.2.tgz", + "integrity": "sha512-zzkRzvMe7UdV0M7AIU70vl2fh4rFnNYDL8U0ISwWiOX/5MowBV1ESYCWSQP/KsgJNUOC/AS6X3DApOmxoyE6MA==", + "license": "MIT AND Apache-2.0" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -24040,6 +25268,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -24080,15 +25314,6 @@ "node": ">=8" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -24271,6 +25496,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rrule": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.0.tgz", + "integrity": "sha512-PnSvdJLHrETO4qQxm9nlDvSxNfbPdDFbgdz2BSHXTP+IzHbdwSNvTHOeN0O9khiy91GjzWXyiVJhnPDOQvejNg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/rrule/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -24280,6 +25520,15 @@ "node": "6.* || >= 7.*" } }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -24461,10 +25710,11 @@ } }, "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -24799,10 +26049,11 @@ } }, "node_modules/sass/node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", + "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", + "dev": true, + "license": "MIT" }, "node_modules/sass/node_modules/readdirp": { "version": "4.0.2", @@ -24818,10 +26069,13 @@ } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "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" + } }, "node_modules/saxes": { "version": "5.0.1", @@ -24860,6 +26114,30 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scroll": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scroll/-/scroll-3.0.1.tgz", + "integrity": "sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==", + "license": "MIT" + }, + "node_modules/scrollparent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", + "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==", + "license": "ISC" + }, "node_modules/selderee": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", @@ -24892,23 +26170,24 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -24918,6 +26197,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -24925,12 +26205,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -24941,7 +26223,8 @@ "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/sentence-case": { "version": "3.0.4", @@ -24962,14 +26245,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -25012,6 +26296,15 @@ "node": ">= 0.4" } }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "license": "Unlicense", + "engines": { + "node": ">=6.9" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -25156,9 +26449,13 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -25182,6 +26479,189 @@ "vscode-textmate": "^8.0.0" } }, + "node_modules/showdown": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", + "license": "BSD-3-Clause", + "dependencies": { + "yargs": "^14.2" + }, + "bin": { + "showdown": "bin/showdown.js" + } + }, + "node_modules/showdown/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/showdown/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "license": "MIT" + }, + "node_modules/showdown/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/showdown/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/showdown/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/showdown/node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -25655,17 +27135,41 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "engines": { "node": ">=10.0.0" } }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -25680,9 +27184,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -25838,6 +27343,15 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -25872,6 +27386,36 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -25966,9 +27510,10 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -26265,6 +27810,12 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, "node_modules/sudo-prompt": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", @@ -26327,16 +27878,17 @@ } }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.2.tgz", + "integrity": "sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==", + "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", + "sax": "^1.5.0", "stable": "^0.1.8" }, "bin": { @@ -26384,14 +27936,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -26404,17 +27957,23 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -26483,12 +28042,13 @@ } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -26500,15 +28060,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -26521,17 +28081,72 @@ "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 } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -26553,12 +28168,29 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { @@ -26576,9 +28208,10 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -26631,6 +28264,15 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "node_modules/throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -26645,6 +28287,12 @@ "next-tick": "1" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", @@ -26654,14 +28302,12 @@ } }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "license": "MIT", "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/tmpl": { @@ -26670,14 +28316,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -26731,6 +28369,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -26738,6 +28377,12 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -26798,6 +28443,16 @@ "node": ">=8" } }, + "node_modules/tree-changes": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.11.3.tgz", + "integrity": "sha512-r14mvDZ6tqz8PRQmlFKjhUVngu4VZ9d92ON3tp0EGpFBE6PAHOq8Bx8m8ahbNoGE3uI/npjYcJiqVydyOiYXag==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.3.1", + "is-lite": "^1.2.1" + } + }, "node_modules/trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", @@ -26813,6 +28468,12 @@ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "license": "Unlicense" + }, "node_modules/ts-jest": { "version": "26.5.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", @@ -27002,13 +28663,13 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsx": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.2.tgz", - "integrity": "sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -27170,6 +28831,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", + "license": "MIT" + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -27205,21 +28872,36 @@ } }, "node_modules/typedoc/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.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/typedoc/node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -27561,9 +29243,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -27578,9 +29260,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -27817,6 +29500,15 @@ "react": ">=16.13" } }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -28011,6 +29703,12 @@ "browser-process-hrtime": "^1.0.0" } }, + "node_modules/w3c-keys": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/w3c-keys/-/w3c-keys-1.0.3.tgz", + "integrity": "sha512-us/8uEJL9s/TXLgkJ+MCIh4/ceena10XW/Bl+7trCYCxLcUigspZkcqpRPTxTs4x4usm04BGfex7dENoTQ6JaA==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", @@ -28036,28 +29734,22 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { "node": ">=10.13.0" } }, - "node_modules/watchpack/node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -28088,34 +29780,34 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" }, "bin": { "webpack": "bin/webpack.js" @@ -28199,9 +29891,10 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -28209,12 +29902,44 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/webpack/node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "acorn": "^8" + "ajv": "^8.8.2" } }, "node_modules/webpack/node_modules/glob-to-regexp": { @@ -28222,10 +29947,45 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -28411,10 +30171,11 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -28431,6 +30192,19 @@ } } }, + "node_modules/xdg-app-paths": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz", + "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==", + "license": "MIT", + "dependencies": { + "os-paths": "^4.0.1", + "xdg-portable": "^7.2.0" + }, + "engines": { + "node": ">= 6.0" + } + }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -28439,6 +30213,18 @@ "node": ">=8" } }, + "node_modules/xdg-portable": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", + "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", + "license": "MIT", + "dependencies": { + "os-paths": "^4.0.1" + }, + "engines": { + "node": ">= 6.0" + } + }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -28511,9 +30297,10 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", "engines": { "node": ">= 6" } @@ -28532,11 +30319,18 @@ } }, "node_modules/yaml-loader/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -28631,6 +30425,15 @@ "node": ">=6" } }, + "node_modules/zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -28649,11 +30452,55 @@ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" }, "@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", "dev": true }, + "@ag-grid-community/client-side-row-model": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-27.2.0.tgz", + "integrity": "sha512-5TChi4q/jIFrmwbB+ZZibMhYzoYUJcdYW9BPt7+hWiM2IcTeLnXQV51fFtl+A+SET4m/5a0BUN37pGtWdBWI2Q==", + "requires": { + "@ag-grid-community/core": "~27.2.0" + }, + "dependencies": { + "@ag-grid-community/core": { + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.1.tgz", + "integrity": "sha512-ZR2n0Rki6+LG4yzjQ+nFW3gsh6s2Bc7Hj2Ct9G3M3628od7YZmwiT0A8d7szfEsp2o70cpp/QIRXjK5G0YJOmQ==" + } + } + }, + "@ag-grid-community/core": { + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.1.0.tgz", + "integrity": "sha512-f7AgQwCQSlCwmNTI/h31+S/12pQqw4vln98XAFKRDplsDqzOoGFxB6au7Ky93E5iS+Bi7kHQTSMCqCzzsTHHsg==", + "peer": true + }, + "@ag-grid-community/infinite-row-model": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/infinite-row-model/-/infinite-row-model-27.2.0.tgz", + "integrity": "sha512-7xWe6xTjvxL6I3nMlfzBlqaxAmW1mrcH6EiywmdDg23jOmUrzljspmmmrqXOocQG8uiRlxiMpPt2jbNpQdKNRw==", + "requires": { + "@ag-grid-community/core": "~27.2.0" + }, + "dependencies": { + "@ag-grid-community/core": { + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.1.tgz", + "integrity": "sha512-ZR2n0Rki6+LG4yzjQ+nFW3gsh6s2Bc7Hj2Ct9G3M3628od7YZmwiT0A8d7szfEsp2o70cpp/QIRXjK5G0YJOmQ==" + } + } + }, + "@ag-grid-community/react": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/react/-/react-27.2.0.tgz", + "integrity": "sha512-QDX8zakSrv45jwngoz4EMayP94n00Q7tBk3ezaNlPemt6GNPSum9ffNCurr1t+c31UhBpMxrIZjUFJ5Fse+Y0Q==", + "requires": { + "prop-types": "^15.8.1" + } + }, "@algolia/cache-browser-local-storage": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.19.1.tgz", @@ -28918,12 +30765,33 @@ "unxhr": "1.0.1" } }, + "@atlaskit/pragmatic-drag-and-drop": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-1.7.7.tgz", + "integrity": "sha512-jX+68AoSTqO/fhCyJDTZ38Ey6/wyL2Iq+J/moanma0YyktpnoHxevjY1UNJHYp0NCburdQDZSL1ZFac1mO1osQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "bind-event-listener": "^3.0.0", + "raf-schd": "^4.0.3" + } + }, + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-auto-scroll/-/pragmatic-drag-and-drop-auto-scroll-2.1.2.tgz", + "integrity": "sha512-6BgAUxSNbQFiG3uqNxf53cDQADn5mSeh/JsQzCHo46GPQnVWIJk77zWC8yZ++0Mfg1ECy02zNrbniF7SgHAhXQ==", + "requires": { + "@atlaskit/pragmatic-drag-and-drop": "^1.7.0", + "@babel/runtime": "^7.0.0" + } + }, "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "requires": { - "@babel/highlight": "^7.22.5" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -28964,14 +30832,15 @@ } }, "@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "requires": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@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" } }, "@babel/helper-annotate-as-pure": { @@ -29054,13 +30923,10 @@ "@babel/types": "^7.22.5" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } + "@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==" }, "@babel/helper-member-expression-to-functions": { "version": "7.22.5", @@ -29071,23 +30937,22 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "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==", "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" } }, "@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" } }, "@babel/helper-optimise-call-expression": { @@ -29099,9 +30964,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "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==" }, "@babel/helper-remap-async-to-generator": { "version": "7.22.9", @@ -29148,14 +31013,14 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + "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==" }, "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + "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==" }, "@babel/helper-validator-option": { "version": "7.22.5", @@ -29173,13 +31038,12 @@ } }, "@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" } }, "@babel/highlight": { @@ -29193,9 +31057,12 @@ } }, "@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" + "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==", + "requires": { + "@babel/types": "^7.29.7" + } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.22.5", @@ -29679,14 +31546,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "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==", "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@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" } }, "@babel/plugin-transform-modules-umd": { @@ -30093,48 +31960,41 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "requires": { - "regenerator-runtime": "^0.13.11" - } + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==" }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" } }, "@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "requires": { + "@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" } }, "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" } }, "@bcoe/v8-coverage": { @@ -30158,6 +32018,29 @@ "minimist": "^1.2.0" } }, + "@cord-sdk/components": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/components/-/components-0.0.47.tgz", + "integrity": "sha512-6fScsnFc9BWpc6uaT+V8s4/H33EZmg6Mlp47HOUod2hYDfJxvdhXI7LkzBYocEP6S64bXzaVSKR56m0yNPzw2A==", + "requires": { + "@cord-sdk/types": "0.0.47" + } + }, + "@cord-sdk/react": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/react/-/react-0.0.47.tgz", + "integrity": "sha512-o4A9n3U5s5UIG58N8pX3Kghk4/RkT2wYB35vshpLYuTdnlA3PnMSsYcJ3lJJbgXr5d+YnYtv7cSIfWyVt+yT6g==", + "requires": { + "@cord-sdk/components": "0.0.47", + "@cord-sdk/types": "0.0.47", + "classnames": "^2.3.1" + } + }, + "@cord-sdk/types": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@cord-sdk/types/-/types-0.0.47.tgz", + "integrity": "sha512-KNog4aJkHy70CnsgCB+H1KY7RBvFkUdlfRxEV5XwVx9HKlcUEkng4ttS2HtLN/nfZ7bIG9H1JGFD28S82yrvtg==" + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -30179,164 +32062,235 @@ } } }, + "@devexpress/utils": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.13.tgz", + "integrity": "sha512-DaTNDLcyepRegwKCWrikP+6WH0cY6/gVSLC/wd6o6AhuTpn6jrXEYcJm50+DwUSwAPVyoQcp6iYRTD1BdITrBQ==", + "requires": { + "tslib": "2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } + }, + "@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "requires": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + } + }, + "@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "requires": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + } + }, + "@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "requires": { + "tslib": "^2.0.0" + } + }, "@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "dev": true, "optional": true }, @@ -30495,6 +32449,11 @@ "strip-ansi": "^6.0.0" } }, + "@gilbarbara/deep-equal": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz", + "integrity": "sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==" + }, "@graphql-codegen/add": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.3.tgz", @@ -30898,6 +32857,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -31615,13 +33583,12 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -31629,11 +33596,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, "@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", @@ -31644,26 +33606,24 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, "@lezer/common": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", @@ -32514,6 +34474,33 @@ } } }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "requires": {} + }, + "@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "requires": {} + }, + "@react-hook/resize-observer": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", + "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", + "requires": { + "@juggle/resize-observer": "^3.3.1", + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + } + }, "@react-icons/all-files": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz", @@ -32532,9 +34519,9 @@ } }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "requires": { "@hapi/hoek": "^9.0.0" } @@ -32805,6 +34792,113 @@ "@types/react-dom": "^18.0.0" } }, + "@thoughtspot/radiant-react": { + "version": "1.0.0-beta", + "resolved": "https://packagecloud.io/modeanalytics/tse/npm/@thoughtspot/radiant-react/-/radiant-react-1.0.0-beta.tgz", + "integrity": "sha1-nsAqfPGr8Bf7c5b4Y4eD/NtM5jM=", + "requires": { + "@ag-grid-community/client-side-row-model": "27.2.0", + "@ag-grid-community/core": "27.2.0", + "@ag-grid-community/infinite-row-model": "27.2.0", + "@ag-grid-community/react": "27.2.0", + "@atlaskit/pragmatic-drag-and-drop": "1.7.7", + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "2.1.2", + "@cord-sdk/react": "0.0.47", + "@cord-sdk/types": "0.0.47", + "@dnd-kit/core": "6.3.1", + "@dnd-kit/sortable": "10.0.0", + "@popperjs/core": "^2.4.0", + "@react-hook/resize-observer": "1.2.6", + "classnames": "^2.2.6", + "devextreme": "^20.2.10", + "dompurify": "^3.3.2", + "fuzzysort": "3.1.0", + "lodash": "^4.17.23", + "moment": "2.30.1", + "overlayscrollbars": "^1.13.2", + "overlayscrollbars-react": "^0.3.0", + "re-resizable": "^6.9.0", + "react-beautiful-dnd": "^13.1.1", + "react-datepicker": "^3.6.0", + "react-draggable": "4.4.5", + "react-flexview": "^6.0.1", + "react-joyride": "^2.2.1", + "react-modal": "^3.11.2", + "react-popper": "^2.2.3", + "react-use": "^15.1.0", + "requestidlecallback-polyfill": "^1.0.2", + "w3c-keys": "^1.0.2" + }, + "dependencies": { + "@ag-grid-community/core": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-27.2.0.tgz", + "integrity": "sha512-X7h1brYSpsFB7EuXhify6yU9ub9+BI8xGY9dqJnfrUP0BeOZAn1A4wv4k8sUbiI/7NSF9xA3cpnnXP5PKyo8bw==" + }, + "deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "requires": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + } + }, + "react-datepicker": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-3.8.0.tgz", + "integrity": "sha512-iFVNEp8DJoX5yEvEiciM7sJKmLGrvE70U38KhpG13XrulNSijeHw1RZkhd/0UmuXR71dcZB/kdfjiidifstZjw==", + "requires": { + "classnames": "^2.2.6", + "date-fns": "^2.0.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.10.0", + "react-popper": "^1.3.8" + }, + "dependencies": { + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + } + } + }, + "react-use": { + "version": "15.3.8", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-15.3.8.tgz", + "integrity": "sha512-GeGcrmGuUvZrY5wER3Lnph9DSYhZt5nEjped4eKDq8BRGr2CnLf9bDQWG9RFc7oCPphnscUUdOovzq0E5F2c6Q==", + "requires": { + "@types/js-cookie": "2.2.6", + "@xobotyi/scrollbar-width": "1.9.5", + "copy-to-clipboard": "^3.2.0", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.2.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.0.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^2.1.0", + "ts-easing": "^0.2.0", + "tslib": "^2.0.0" + } + } + } + }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -32816,11 +34910,6 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -32950,6 +35039,14 @@ "integrity": "sha512-AUmj9JHuHTD94slY1WR1VulFxRGC6D1pcNCN0MCulKFyiihvV/28lLS8oRHgfmc2Cxq954J8Vmosa8qzm7PLGQ==", "dev": true }, + "@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "requires": { + "@types/trusted-types": "*" + } + }, "@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -32959,19 +35056,10 @@ "@types/json-schema": "*" } }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" }, "@types/get-port": { "version": "3.2.0", @@ -33009,7 +35097,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dev": true, "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -33087,10 +35174,15 @@ } } }, + "@types/js-cookie": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz", + "integrity": "sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==" + }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "@types/json5": { "version": "0.0.29", @@ -33212,6 +35304,17 @@ "@types/react": "*" } }, + "@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, "@types/react-test-renderer": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.1.tgz", @@ -33280,6 +35383,11 @@ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, "@types/unist": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", @@ -33433,6 +35541,41 @@ "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" }, + "@vercel/cli-config": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.1.tgz", + "integrity": "sha512-RhfyXmRLHdbnry8RJqHDc+5rGxMZ0bu+fpysZjtv3bE+BubpuwxTancHOKiH5zKQREsdwFVr3mOI2kOvxlOyxA==", + "requires": { + "xdg-app-paths": "5", + "zod": "4.1.11" + } + }, + "@vercel/cli-exec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vercel/cli-exec/-/cli-exec-1.0.0.tgz", + "integrity": "sha512-kQF8LGie/Hbdq9/psJxLE7owRTcqMQMhgybU04gCeR7cbQAr5t8OrjefDNColJv1QSSucFt4pLwRiARVmlOnug==", + "requires": { + "execa": "5.1.1" + } + }, + "@vercel/functions": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-3.7.6.tgz", + "integrity": "sha512-QKlSfrgvo4pGEnzHw8Dha9GRTb5hhLBbImKi4rL4CmxClaVs+36hxgjW0MOqez57wWShstpKOWZY/mU8KuYoUQ==", + "requires": { + "@vercel/oidc": "3.8.1" + } + }, + "@vercel/oidc": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.8.1.tgz", + "integrity": "sha512-ufdalm2MWOYksyj8KVpWjoOFPJO6zoYpuyvIggIQ2bB0CFCjTCiTkGXHqAKwG77GVRjOaN3/8S5ITlZpXWmqOw==", + "requires": { + "@vercel/cli-config": "0.2.1", + "@vercel/cli-exec": "1.0.0", + "jose": "^5.9.6" + } + }, "@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", @@ -33442,136 +35585,141 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, + "@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -33676,9 +35824,9 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -33686,6 +35834,32 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -34442,9 +36616,9 @@ } }, "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", "requires": { "safe-buffer": "^5.0.1" } @@ -34459,6 +36633,11 @@ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" }, + "baseline-browser-mapping": { + "version": "2.10.36", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.36.tgz", + "integrity": "sha512-lVq/Df7LXlO79MVaaUHztSwWiG9oXoWHlgvNS51v8Dpd4+G4/VIy6qYePTw31nAVls33nUtnfezYeLkYAak9dg==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -34487,9 +36666,9 @@ }, "dependencies": { "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" } } }, @@ -34508,6 +36687,11 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bind-event-listener": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-3.0.0.tgz", + "integrity": "sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==" + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -34536,29 +36720,24 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", + "bytes": "~3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -34645,20 +36824,20 @@ } }, "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.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-lang": { @@ -34674,14 +36853,15 @@ "dev": true }, "browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "requires": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" } }, "bs-logger": { @@ -34724,9 +36904,9 @@ } }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cache-base": { "version": "1.0.1", @@ -35261,9 +37441,9 @@ }, "dependencies": { "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -35377,8 +37557,7 @@ "clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "dev": true + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, "co": { "version": "4.6.0", @@ -35531,16 +37710,16 @@ } }, "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "dependencies": { @@ -35557,10 +37736,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==" } } }, @@ -35646,6 +37825,14 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" }, + "copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, "core-js": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", @@ -35726,9 +37913,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -35752,12 +37939,28 @@ "urix": "^0.1.0" } }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, "css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "requires": {} }, + "css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "requires": { + "hyphenate-style-name": "^1.0.3" + } + }, "css-loader": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", @@ -36055,6 +38258,11 @@ } } }, + "deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" + }, "deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -36231,9 +38439,9 @@ } }, "devcert": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.2.tgz", - "integrity": "sha512-UsLqvtJGPiGwsIZnJINUnFYaWgK7CroreGRndWHZkRD58tPFr3pVbbSyHR8lbh41+azR4jKvuNZ+eCoBZGA5kA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.2.3.tgz", + "integrity": "sha512-vmLo0hDNHmZ47HED1ZiouJ7cAcamL8HY7qa9YdmCBkXxHEVtdDgT9pN/Xy3ZkcF3pFjF0sqq8WMV93HF2nmHHw==", "requires": { "@types/configstore": "^2.1.1", "@types/debug": "^0.0.30", @@ -36313,10 +38521,89 @@ } } }, + "devexpress-diagram": { + "version": "2.0.45", + "resolved": "https://registry.npmjs.org/devexpress-diagram/-/devexpress-diagram-2.0.45.tgz", + "integrity": "sha512-jSYLq8oMddTPrrs5IAf4MtqvSkLAW8sEOcWOJKKlvPXM2PtjI76DsV444YA+/JexaRITI+CyDXcGtk+ta8b/2Q==", + "requires": { + "@devexpress/utils": "1.3.13", + "es6-object-assign": "^1.1.0" + } + }, + "devexpress-gantt": { + "version": "2.0.40", + "resolved": "https://registry.npmjs.org/devexpress-gantt/-/devexpress-gantt-2.0.40.tgz", + "integrity": "sha512-0+ZfOKO+zIDSaGBZgIoafid95zAPvS1kQv8szNn2p0newrQpnVosWzV5pKWHLZRwT7yziBY+6bQ/xwNdG9iShg==", + "requires": { + "@devexpress/utils": "1.3.2", + "tslib": "2.1.0" + }, + "dependencies": { + "@devexpress/utils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.2.tgz", + "integrity": "sha512-Ii7hpz6ItNMLKz23qQOlHom/k0e1TSnIQKCwZlKuYBwpIEBX5I/PQxvAwbdBnu5EZZSkdjnhzxl6luhl/k4LdA==", + "requires": { + "tslib": "2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "devextreme": { + "version": "20.2.13", + "resolved": "https://registry.npmjs.org/devextreme/-/devextreme-20.2.13.tgz", + "integrity": "sha512-KG+/vbC39df9viE5o+QF42eTQZyrZ8ymKH30EH3ZaRNc661/T5ml5nFwWtcOaH1xj21yWLVl4iKFccxW/rcDHQ==", + "requires": { + "devexpress-diagram": "2.0.45", + "devexpress-gantt": "2.0.40", + "devextreme-quill": "~1.1.5", + "jszip": "^3.7.1", + "preact": "10.9.0", + "rrule": "2.7.0", + "showdown": "^1.9.1", + "turndown": "~7.0.0" + }, + "dependencies": { + "turndown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.0.0.tgz", + "integrity": "sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q==", + "requires": { + "domino": "^2.1.6" + } + } + } + }, + "devextreme-quill": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/devextreme-quill/-/devextreme-quill-1.1.5.tgz", + "integrity": "sha512-fM3cFXGaA19PjTgNav7gJDEU2rNu+/8UOWQU4Ndq3QunZ9zm3HXlWhiQFAKdLWaAcvwSJHQ+9ZrORwPBl23AlQ==", + "requires": { + "core-js": "^3.6.5", + "eventemitter3": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.5.0", + "parchment": "2.0.0-dev.2", + "quill-delta": "4.2.2" + } + }, "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true }, "diff-sequences": { @@ -36408,6 +38695,19 @@ "domelementtype": "^2.2.0" } }, + "domino": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.7.tgz", + "integrity": "sha512-3rcXhx0ixJV2nj8J0tljzejTF73A35LVVdnTQu79UAqTBFEgYPMgGtykMuu/BDqaOZphATku1ddRUn/RtqUHYQ==" + }, + "dompurify": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.9.tgz", + "integrity": "sha512-4dPSRMRDqHvs0V4YDFCsaIZo4if5u0xM+llyxiM2fwuZFdKArUBAF3VtI2+n8NKg9P870WMdYk0UhqQNoWXbfQ==", + "requires": { + "@types/trusted-types": "^2.0.7" + } + }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -36518,9 +38818,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.485", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz", - "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==" + "version": "1.5.371", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz", + "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==" }, "emittery": { "version": "0.7.2", @@ -36539,9 +38839,9 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, "encoding-sniffer": { "version": "0.2.1", @@ -36629,12 +38929,12 @@ "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==" }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" } }, "enquirer": { @@ -36759,9 +39059,9 @@ } }, "es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==" }, "es-object-atoms": { "version": "1.1.1", @@ -36772,13 +39072,14 @@ } }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" } }, "es-shim-unscopables": { @@ -36800,12 +39101,13 @@ } }, "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, @@ -36819,6 +39121,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -36845,40 +39152,43 @@ } }, "esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-goat": { "version": "2.1.1", @@ -37369,6 +39679,24 @@ } } }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + } + } + }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -37485,8 +39813,7 @@ "exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", - "dev": true + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "exit": { "version": "0.1.2", @@ -37714,47 +40041,47 @@ } }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" }, "debug": { "version": "2.6.9", @@ -38090,11 +40417,26 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==" + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" }, + "fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -38176,9 +40518,9 @@ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -38189,16 +40531,16 @@ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "dependencies": { @@ -38255,9 +40597,9 @@ } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==" }, "flexsearch": { "version": "0.6.32", @@ -38266,9 +40608,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "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==" }, "for-each": { "version": "0.3.5", @@ -38427,13 +40769,15 @@ } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" } }, "forwarded": { @@ -38521,6 +40865,11 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, + "fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==" + }, "gatsby": { "version": "4.25.7", "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-4.25.7.tgz", @@ -39086,9 +41435,9 @@ } }, "gatsby-core-utils": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.14.0.tgz", - "integrity": "sha512-h0v20gB213PmhKjioCJ93SrUb7Hihnqxd6X6Iur4u1eiWTUDsGeV9g1bkquiuDl2qovUnjj7mOoHdWiu/Ax/9Q==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", "dev": true, "requires": { "@babel/runtime": "^7.20.13", @@ -39879,15 +42228,6 @@ "get-intrinsic": "^1.1.1" } }, - "get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -40149,6 +42489,11 @@ "dev": true, "optional": true }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -40444,7 +42789,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "requires": { "react-is": "^16.7.0" }, @@ -40452,8 +42796,7 @@ "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -40577,15 +42920,15 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" } }, "http-proxy-agent": { @@ -40634,6 +42977,11 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, + "hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -40667,6 +43015,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -40748,6 +43101,14 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "requires": { + "css-in-js-utils": "^3.1.0" + } + }, "inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -40880,7 +43241,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -41057,6 +43417,11 @@ } } }, + "is-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-1.2.1.tgz", + "integrity": "sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==" + }, "is-lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", @@ -41930,9 +44295,9 @@ } }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "dev": true, "requires": {} } @@ -43113,26 +45478,31 @@ } }, "joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -43186,22 +45556,24 @@ "dev": true }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" } } } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-buffer": { "version": "3.0.1", @@ -43283,6 +45655,17 @@ "object.values": "^1.1.6" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -43348,6 +45731,14 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -43384,9 +45775,9 @@ } }, "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==" }, "loader-utils": { "version": "2.0.4", @@ -43412,9 +45803,9 @@ "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "lodash.camelcase": { "version": "4.3.0", @@ -43458,6 +45849,11 @@ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -43603,10 +45999,9 @@ } }, "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==" }, "math-intrinsics": { "version": "1.1.0", @@ -43657,6 +46052,11 @@ "fs-monkey": "^1.0.4" } }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", @@ -43673,9 +46073,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "merge-stream": { "version": "2.0.0", @@ -43693,11 +46093,11 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -43746,9 +46146,9 @@ } }, "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==", "requires": { "brace-expansion": "^1.1.7" } @@ -43791,9 +46191,9 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "moo": { "version": "0.5.2", @@ -43807,9 +46207,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "msgpackr": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.6.tgz", - "integrity": "sha512-50rmb6+ZWvEm0vJn8R8CwI1Eavss3h5rgtKrcdUal3EkZcpqw82+xsmc7RoHb8fYB5V4EOU2NDaOitDAdO0t+w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", "requires": { "msgpackr-extract": "^3.0.2" } @@ -43856,10 +46256,25 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, + "nano-css": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", + "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "css-tree": "^1.1.2", + "csstype": "^3.1.2", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^7.0.1", + "rtl-css-js": "^1.16.1", + "stacktrace-js": "^2.0.2", + "stylis": "^4.3.0" + } + }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==" }, "nanomatch": { "version": "1.2.13", @@ -44069,9 +46484,9 @@ "integrity": "sha512-jY5dPJzw6NHd/KPSfPKJ+IHoFS81/tJ43r34ZeNMXGzCOM8jwQDCD12HYayKIB6MuznrnqIYy2e891NA2g0ibA==" }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==" }, "normalize-path": { "version": "3.0.0", @@ -44210,7 +46625,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -44307,9 +46721,9 @@ } }, "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==" }, "once": { "version": "1.4.0", @@ -44359,11 +46773,27 @@ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.1.tgz", "integrity": "sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==" }, + "os-paths": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", + "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, + "overlayscrollbars": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.3.tgz", + "integrity": "sha512-1nB/B5kaakJuHXaLXLRK0bUIilWhUGT6q5g+l2s5vqYdLle/sd0kscBHkQC1kuuDg9p9WR4MTdySDOPbeL/86g==" + }, + "overlayscrollbars-react": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars-react/-/overlayscrollbars-react-0.3.0.tgz", + "integrity": "sha512-dV74p9VL/aImqJpeYz0vmpScZYu6UiNTmRKfyI4CS0OYUpYCUiTd723adY38Grz2W57hoNCECWDzkOJRFDQeZg==", + "requires": {} + }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -44550,6 +46980,11 @@ } } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -44559,6 +46994,11 @@ "tslib": "^2.0.3" } }, + "parchment": { + "version": "2.0.0-dev.2", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-2.0.0-dev.2.tgz", + "integrity": "sha512-4fgRny4pPISoML08Zp7poi52Dff3E2G1ORTi2D/acJ/RiROdDAMDB6VcQNfBcmehrX5Wixp6dxh6JjLyE5yUNQ==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -44751,9 +47191,9 @@ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "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==" }, "path-type": { "version": "4.0.0", @@ -44777,14 +47217,14 @@ "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "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==" }, "pirates": { "version": "4.0.6", @@ -44853,6 +47293,11 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -44864,13 +47309,13 @@ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" }, "postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-calc": { @@ -45182,6 +47627,11 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "preact": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.9.0.tgz", + "integrity": "sha512-jO6/OvCRL+OT8gst/+Q2ir7dMybZAX8ioP02Zmzh3BkQMHLyqZSujvxbUriXvHi8qmhcHKC2Gwbog6Kt+YTh+Q==" + }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -45396,11 +47846,11 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" } }, "query-string": { @@ -45430,6 +47880,28 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, + "quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "requires": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "dependencies": { + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + } + } + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -45460,21 +47932,14 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" } }, "raw-loader": { @@ -45504,6 +47969,12 @@ } } }, + "re-resizable": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", + "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", + "requires": {} + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -45512,6 +47983,20 @@ "loose-envify": "^1.1.0" } }, + "react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -45646,7 +48131,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", - "dev": true, "requires": { "clsx": "^1.1.1", "prop-types": "^15.8.1" @@ -45662,6 +48146,47 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, + "react-flexview": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-flexview/-/react-flexview-6.0.1.tgz", + "integrity": "sha512-eEv8PxbRQsgiXkeTIMvkKUnsnGJl1mQNYx6TsrLJ0hIqnYvYFpNXXK33j/VLdaNqI9xIh8hZZVm2GlgAOI9hvw==", + "requires": { + "prop-types": "^15.5.6" + } + }, + "react-floater": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.9.tgz", + "integrity": "sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==", + "requires": { + "deepmerge": "^4.3.1", + "is-lite": "^0.8.2", + "popper.js": "^1.16.0", + "prop-types": "^15.8.1", + "tree-changes": "^0.9.1" + }, + "dependencies": { + "@gilbarbara/deep-equal": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz", + "integrity": "sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==" + }, + "is-lite": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", + "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==" + }, + "tree-changes": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.9.3.tgz", + "integrity": "sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==", + "requires": { + "@gilbarbara/deep-equal": "^0.1.1", + "is-lite": "^0.8.2" + } + } + } + }, "react-helmet": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", @@ -45673,11 +48198,46 @@ "react-side-effect": "^2.1.0" } }, + "react-innertext": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-innertext/-/react-innertext-1.1.5.tgz", + "integrity": "sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==", + "requires": {} + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-joyride": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.9.3.tgz", + "integrity": "sha512-1+Mg34XK5zaqJ63eeBhqdbk7dlGCFp36FXwsEvgpjqrtyywX2C6h9vr3jgxP0bGHCw8Ilsp/nRDzNVq6HJ3rNw==", + "requires": { + "@gilbarbara/deep-equal": "^0.3.1", + "deep-diff": "^1.0.2", + "deepmerge": "^4.3.1", + "is-lite": "^1.2.1", + "react-floater": "^0.7.9", + "react-innertext": "^1.1.5", + "react-is": "^16.13.1", + "scroll": "^3.0.1", + "scrollparent": "^2.1.0", + "tree-changes": "^0.11.2", + "type-fest": "^4.27.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==" + } + } }, "react-lifecycles-compat": { "version": "3.0.4", @@ -45688,7 +48248,6 @@ "version": "3.16.1", "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", - "dev": true, "requires": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -45696,11 +48255,39 @@ "warning": "^4.0.3" } }, + "react-onclickoutside": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.2.tgz", + "integrity": "sha512-h6Hbf1c8b7tIYY4u90mDdBLY4+AGQVMFtIE89HgC0DtVCh/JfKl477gYqUtGLmjZBKK3MJxomP/lFiLbz4sq9A==", + "requires": {} + }, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, "react-property": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" }, + "react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + } + }, "react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -45777,6 +48364,12 @@ } } }, + "react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "requires": {} + }, "react-use-flexsearch": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/react-use-flexsearch/-/react-use-flexsearch-0.1.1.tgz", @@ -46179,9 +48772,9 @@ } }, "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", "dev": true }, "tough-cookie": { @@ -46202,6 +48795,11 @@ } } }, + "requestidlecallback-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/requestidlecallback-polyfill/-/requestidlecallback-polyfill-1.0.2.tgz", + "integrity": "sha512-zzkRzvMe7UdV0M7AIU70vl2fh4rFnNYDL8U0ISwWiOX/5MowBV1ESYCWSQP/KsgJNUOC/AS6X3DApOmxoyE6MA==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -46228,6 +48826,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -46256,12 +48859,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -46406,12 +49003,35 @@ "glob": "^7.1.3" } }, + "rrule": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.0.tgz", + "integrity": "sha512-PnSvdJLHrETO4qQxm9nlDvSxNfbPdDFbgdz2BSHXTP+IzHbdwSNvTHOeN0O9khiy91GjzWXyiVJhnPDOQvejNg==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -46543,9 +49163,9 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -46749,9 +49369,9 @@ } }, "immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", + "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", "dev": true }, "readdirp": { @@ -46802,10 +49422,9 @@ } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==" }, "saxes": { "version": "5.0.1", @@ -46834,6 +49453,21 @@ "ajv-keywords": "^3.5.2" } }, + "screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==" + }, + "scroll": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scroll/-/scroll-3.0.1.tgz", + "integrity": "sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==" + }, + "scrollparent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", + "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==" + }, "selderee": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", @@ -46857,23 +49491,23 @@ } }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "requires": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "dependencies": { "debug": { @@ -46922,14 +49556,14 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" } }, "set-blocking": { @@ -46961,6 +49595,11 @@ "has-property-descriptors": "^1.0.2" } }, + "set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==" + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -47072,9 +49711,9 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==" }, "shellwords": { "version": "0.1.1", @@ -47095,6 +49734,139 @@ "vscode-textmate": "^8.0.0" } }, + "showdown": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", + "requires": { + "yargs": "^14.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -47449,12 +50221,27 @@ } }, "socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", "requires": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } } }, "source-list-map": { @@ -47468,9 +50255,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "source-map-resolve": { "version": "0.5.3", @@ -47597,6 +50384,14 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, + "stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -47624,6 +50419,32 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, + "stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==" + } + } + }, + "stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "requires": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -47700,9 +50521,9 @@ } }, "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" }, "stop-iteration-iterator": { "version": "1.1.0", @@ -47920,6 +50741,11 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==" + }, "sudo-prompt": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", @@ -47966,16 +50792,16 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.2.tgz", + "integrity": "sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==", "requires": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", + "sax": "^1.5.0", "stable": "^0.1.8" }, "dependencies": { @@ -48013,14 +50839,14 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "json-schema-traverse": { @@ -48031,14 +50857,14 @@ } }, "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==" }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -48093,35 +50919,53 @@ } }, "terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "requires": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==" } } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "dependencies": { + "ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -48137,12 +50981,20 @@ "supports-color": "^8.0.0" } }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "requires": { - "randombytes": "^2.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } }, "supports-color": { @@ -48193,6 +51045,11 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -48207,6 +51064,11 @@ "next-tick": "1" } }, + "tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, "title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", @@ -48216,12 +51078,9 @@ } }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==" }, "tmpl": { "version": "1.0.5", @@ -48229,11 +51088,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -48281,6 +51135,11 @@ "is-number": "^7.0.0" } }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -48324,6 +51183,15 @@ "punycode": "^2.1.1" } }, + "tree-changes": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.11.3.tgz", + "integrity": "sha512-r14mvDZ6tqz8PRQmlFKjhUVngu4VZ9d92ON3tp0EGpFBE6PAHOq8Bx8m8ahbNoGE3uI/npjYcJiqVydyOiYXag==", + "requires": { + "@gilbarbara/deep-equal": "^0.3.1", + "is-lite": "^1.2.1" + } + }, "trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", @@ -48335,6 +51203,11 @@ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" }, + "ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, "ts-jest": { "version": "26.5.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", @@ -48467,14 +51340,13 @@ } }, "tsx": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.2.tgz", - "integrity": "sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "requires": { - "esbuild": "~0.19.10", - "fsevents": "~2.3.3", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.28.0", + "fsevents": "~2.3.3" } }, "tunnel-agent": { @@ -48585,6 +51457,11 @@ "is-typed-array": "^1.1.9" } }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -48611,21 +51488,27 @@ }, "dependencies": { "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.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" } } } @@ -48861,12 +51744,12 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, "update-notifier": { @@ -49033,6 +51916,12 @@ "dequal": "^2.0.2" } }, + "use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "requires": {} + }, "util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -49194,6 +52083,11 @@ "browser-process-hrtime": "^1.0.0" } }, + "w3c-keys": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/w3c-keys/-/w3c-keys-1.0.3.tgz", + "integrity": "sha512-us/8uEJL9s/TXLgkJ+MCIh4/ceena10XW/Bl+7trCYCxLcUigspZkcqpRPTxTs4x4usm04BGfex7dENoTQ6JaA==" + }, "w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", @@ -49216,25 +52110,16 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "requires": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" - }, - "dependencies": { - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - } } }, "weak-lru-cache": { @@ -49260,56 +52145,95 @@ "dev": true }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "requires": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==" }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "requires": {} }, + "ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + }, + "schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==" } } }, @@ -49506,17 +52430,34 @@ } }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "requires": {} }, + "xdg-app-paths": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz", + "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==", + "requires": { + "os-paths": "^4.0.1", + "xdg-portable": "^7.2.0" + } + }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, + "xdg-portable": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", + "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", + "requires": { + "os-paths": "^4.0.1" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -49570,9 +52511,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==" }, "yaml-loader": { "version": "0.8.0", @@ -49585,9 +52526,9 @@ }, "dependencies": { "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==" } } }, @@ -49658,6 +52599,11 @@ } } }, + "zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==" + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/package.json b/package.json index c93495e13..82468194d 100644 --- a/package.json +++ b/package.json @@ -20,15 +20,20 @@ "react-dom": "> 16.8.0" }, "dependencies": { + "@thoughtspot/radiant-react": "^1.0.0-beta", + "@types/dompurify": "^3.0.5", "@vercel/analytics": "^1.0.2", + "@vercel/functions": "^3.7.6", "algoliasearch": "^4.10.5", "cheerio": "^1.2.0", "classnames": "^2.3.1", + "dompurify": "^3.3.3", "eventemitter3": "^4.0.7", "gatsby-plugin-vercel": "^1.0.3", "gatsby-source-git": "^1.1.0", "html-react-parser": "^1.4.12", "lodash": "^4.17.21", + "marked": "^18.0.0", "mixpanel-browser": "^2.45.0", "react-helmet": "^6.1.0", "turndown": "^7.2.4", diff --git a/src/components/DevDocTemplate/index.tsx b/src/components/DevDocTemplate/index.tsx index 4b0ac293c..32b2bebb7 100644 --- a/src/components/DevDocTemplate/index.tsx +++ b/src/components/DevDocTemplate/index.tsx @@ -106,8 +106,20 @@ const DevDocTemplate: FC = (props) => { }); const [isDarkMode, setDarkMode] = useState(() => { if (typeof window === 'undefined') return false; + // URL param takes highest priority (set by embedding product to pass its theme). + const urlParams = new URLSearchParams(window.location.search); + const darkModeParam = urlParams.get('isDarkMode'); + if (darkModeParam !== null) { + const isDark = darkModeParam === 'true'; + localStorage.setItem('themeMode', isDark ? 'dark' : 'light'); + return isDark; + } // In-product (embedded) presentation always uses light mode — product UI has no theme toggle. - if (!isPublicSite(location.search)) return false; + if (!isPublicSite(location.search)){ + const explicitChoice = localStorage.getItem('themeMode'); + if (explicitChoice) return explicitChoice === 'dark'; + return false; + } /* themeMode is only written when the user explicitly clicks the toggle. If absent, follow OS preference fresh every load. */ const explicitChoice = localStorage.getItem('themeMode'); @@ -235,6 +247,12 @@ const isVersionedIframe = VERSION_DROPDOWN.some( if (isBrowser()) { // In-product (embedded) presentation always uses light mode. if (!isPublicSiteOpen) { + const explicitChoice = localStorage.getItem('themeMode'); + if (explicitChoice) { + const isDark = explicitChoice === 'dark'; + setDarkMode(isDark); + return; + } setDarkMode(false); setKey('dark'); return; @@ -265,6 +283,7 @@ const isVersionedIframe = VERSION_DROPDOWN.some( const newDarkMode = darkModeParam === 'true'; setDarkMode(newDarkMode); localStorage.setItem('theme', newDarkMode ? 'dark' : 'light'); + localStorage.setItem('themeMode', newDarkMode ? 'dark' : 'light'); } } }, [location.search]); @@ -434,18 +453,16 @@ const isVersionedIframe = VERSION_DROPDOWN.some( const customStyles = { overlay: { background: 'rgba(50,57,70, 0.9)', - zIndex: 10, + zIndex: 1100, }, content: { top: '50px', - left: 'auro', - right: 'auto', + left: 0, + right: 0, bottom: 'auto', - width: isMaxMobileResolution ? '40%' : '100%', + width: isMaxMobileResolution ? '40%' : 'calc(100% - 32px)', margin: 'auto', - transform: `translate(${ - isMaxMobileResolution ? '80%' : '0' - }, 70px)`, + transform: 'translate(0, 70px)', border: 'none', height: isMaxMobileResolution ? '400px' : '300px', boxShadow: 'none', @@ -458,6 +475,7 @@ const isVersionedIframe = VERSION_DROPDOWN.some( isOpen={showSearch} onRequestClose={() => setShowSearch(false)} style={customStyles} + portalClassName="DocsSearchModalPortal" >
{ langSpan.innerText = rawLang; header.appendChild(langSpan); - /* Copy button (right) */ + /* Right group: CTA + copy button */ + const rightGroup = document.createElement('div'); + rightGroup.classList.add('code-block-header-actions'); + + const ctaLink = document.createElement('button'); + ctaLink.classList.add('ctaButton'); + ctaLink.innerText = 'Ask SpotterCode'; + ctaLink.addEventListener('click', () => { + const code = copySource.innerText.trim(); + window.dispatchEvent(new CustomEvent('spotter-code-ask', { detail: { quotedText: code } })); + }); + rightGroup.appendChild(ctaLink); + + /* Copy button — icon style */ const buttonElement = document.createElement('button'); buttonElement.setAttribute('class', 'copyButton'); buttonElement.setAttribute('aria-label', t('CODE_COPY_BTN_HOVER_TEXT')); @@ -90,7 +103,9 @@ export const customizeDocContent = () => { buttonElement.appendChild(imageElement); enableCopyToClipboard(buttonElement, copySource); - header.appendChild(buttonElement); + rightGroup.appendChild(buttonElement); + + header.appendChild(rightGroup); /* ── Wrap pre in code-block-wrapper ── */ const wrapper = document.createElement('div'); diff --git a/src/components/Document/index.scss b/src/components/Document/index.scss index 44daed6ae..47c9a64c9 100644 --- a/src/components/Document/index.scss +++ b/src/components/Document/index.scss @@ -3,6 +3,97 @@ @import '../../assets/styles/admonition.scss'; @import '../../assets/styles/grid.scss'; +@keyframes selection-cta-border-spin { + from { --selection-cta-angle: 0deg; } + to { --selection-cta-angle: 360deg; } +} + +@property --selection-cta-angle { + syntax: ''; + inherits: false; + initial-value: 0deg; +} + +.selection-cta-button { + position: fixed; + z-index: 1000; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + color: #1d232f !important; + background: #fff; + border-radius: 100px; + text-decoration: none; + white-space: nowrap; + pointer-events: all; + box-shadow: + 0 4px 16px 0 rgba(25, 35, 49, 0.14), + 0 1px 4px 0 rgba(25, 35, 49, 0.06); + transition: box-shadow 0.15s ease; + font-family: 'Optimo-Plain', sans-serif; + border: 1px solid transparent; + isolation: isolate; + + // Sparkle icon + &::before { + content: ''; + display: inline-block; + width: 16px; + height: 16px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 27 27' fill='%232770EF' stroke='none'%3E%3Cpath fill='%232770EF' stroke='none' d='M8.25809 7.21109C8.83155 5.59342 11.1191 5.59349 11.6927 7.21109L13.4163 12.0753C13.4919 12.2885 13.6602 12.4568 13.8733 12.5324L18.7376 14.256C20.3555 14.8294 20.3555 17.1172 18.7376 17.6906L13.8733 19.4142C13.6601 19.4898 13.4918 19.658 13.4163 19.8712L11.6927 24.7355C11.1191 26.353 8.83157 26.3531 8.25809 24.7355L6.53445 19.8712C6.4589 19.658 6.29064 19.4898 6.07742 19.4142L1.21316 17.6906C-0.404397 17.1171 -0.404379 14.8295 1.21316 14.256L6.07742 12.5324C6.29058 12.4568 6.45883 12.2885 6.53445 12.0753L8.25809 7.21109ZM20.2805 0.49136C20.6395 -0.163697 21.6064 -0.163877 21.9651 0.49136L22.0315 0.642727L22.888 3.05972L25.3059 3.91616C26.1625 4.21966 26.1622 5.43079 25.3059 5.73452L22.888 6.59097L22.0315 9.00894C21.7279 9.86544 20.5167 9.86552 20.2132 9.00894L19.3567 6.59097L16.9397 5.73452C16.0831 5.43098 16.0831 4.21969 16.9397 3.91616L19.3567 3.05972L20.2132 0.642727L20.2805 0.49136Z'/%3E%3C/svg%3E"); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + flex-shrink: 0; + position: relative; + z-index: 1; + } + + // Animated gradient border via mask — shows only the 2px ring + &::after { + content: ''; + position: absolute; + inset: -2px; + border-radius: inherit; + background: conic-gradient( + from var(--selection-cta-angle), + #8C62F5, + #48D1E0, + #2770EF, + #8C62F5 + ); + // Cut out the inner area so only the border ring is visible + -webkit-mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + padding: 2px; + opacity: 0; + transition: opacity 0.2s ease; + pointer-events: none; + } + + &:hover { + color: #1d232f !important; + text-decoration: none; + box-shadow: + 0 4px 16px 0 rgba(25, 35, 49, 0.14), + 0 1px 4px 0 rgba(25, 35, 49, 0.06); + + &::after { + opacity: 1; + animation: selection-cta-border-spin 2s linear infinite; + } + } +} + .documentWrapper { width: calc(98%); color: var(--primary-color); @@ -102,52 +193,49 @@ font-family: $font-family-code; } + .code-block-header-actions { + display: flex; + align-items: center; + gap: 8px; + } + + .ctaButton { + display: inline-flex; + align-items: center; + padding: 4px 10px; + font-size: 12px; + font-weight: 500; + color: #2770ef; + background: transparent; + border: none; + border-radius: 5px; + cursor: pointer; + text-decoration: none; + white-space: nowrap; + font-family: $font-family-doc; + transition: opacity 0.15s ease; + &:hover { opacity: 0.75; } + } + .copyButton { display: inline-flex; align-items: center; justify-content: center; - width: 28px; + padding: 0 8px; height: 28px; - padding: 0; + font-size: 13px; + font-weight: 500; color: #fff; background: transparent; border: 1px solid rgba(255, 255, 255, 0.15); border-radius: 5px; cursor: pointer; + white-space: nowrap; + font-family: $font-family-doc; transition: background 0.15s ease, color 0.15s ease; - position: relative; - &:hover { - background: rgba(255, 255, 255, 0.1); - color: #fff; - } - - .copyIcon { - height: 14px; - width: 14px; - display: block; - flex-shrink: 0; - } - - /* Tooltip floats below — absolutely positioned so it doesn't shift layout */ - .tooltip { - position: absolute; - top: calc(100% + 6px); - right: 0; - z-index: 10; - pointer-events: none; - - .tooltiptext { - display: block; - background: #1d232f; - color: #fff; - font-size: 11px; - padding: 3px 8px; - border-radius: 4px; - white-space: nowrap; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); - } - } + &:hover { background: rgba(255, 255, 255, 0.1); } + &.copied { color: #0d9f6e; border-color: #0d9f6e; } } } diff --git a/src/components/Document/index.tsx b/src/components/Document/index.tsx index e77550308..6e3ab5942 100644 --- a/src/components/Document/index.tsx +++ b/src/components/Document/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; import './index.scss'; import { customizeDocContent, addScrollListener } from './helper'; import Footer from '../Footer'; @@ -18,6 +18,58 @@ const Document = (props: { breadcrumsData: any; markdownBody?: string; }) => { + const openAssistantWithQuote = (text: string) => { + window.dispatchEvent(new CustomEvent('spotter-code-ask', { detail: { quotedText: text } })); + }; + const [selectionPos, setSelectionPos] = useState<{ top: number; left: number } | null>(null); + const selectionRef = useRef(''); + + useEffect(() => { + let mouseDownX = 0; + let mouseDownY = 0; + + const handleMouseUp = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if (target.closest('.selection-cta-button')) return; + if (target.closest('.floating-assistant__panel, .floating-assistant__chip-ring')) return; + + // If mouse didn't move (plain click, not a drag-select), don't re-show + const moved = Math.abs(e.clientX - mouseDownX) > 3 || Math.abs(e.clientY - mouseDownY) > 3; + if (!moved) return; + + const selection = window.getSelection(); + const text = selection?.toString().trim() || ''; + if (!text) { + setSelectionPos(null); + return; + } + const range = selection!.getRangeAt(0); + const rect = range.getBoundingClientRect(); + selectionRef.current = text; + const HEADER_HEIGHT = 108; // main header (60) + secondary header (48) + const BUTTON_HEIGHT = 36; + const rawTop = rect.top - BUTTON_HEIGHT - 6; + setSelectionPos({ + top: Math.max(HEADER_HEIGHT + 4, rawTop), + left: Math.max(8, e.clientX - 80), + }); + }; + + const handleMouseDown = (e: MouseEvent) => { + mouseDownX = e.clientX; + mouseDownY = e.clientY; + if ((e.target as HTMLElement).closest('.selection-cta-button')) return; + setSelectionPos(null); + }; + + document.addEventListener('mouseup', handleMouseUp); + document.addEventListener('mousedown', handleMouseDown); + return () => { + document.removeEventListener('mouseup', handleMouseUp); + document.removeEventListener('mousedown', handleMouseDown); + }; + }, []); + useEffect(() => { customizeDocContent(); }, [props.docContent]); @@ -131,6 +183,19 @@ const Document = (props: { className="documentWrapper" style={!props.shouldShowRightNav ? { width: '100%' } : undefined} > + {selectionPos && ( + + )} {!isHomePage && ( ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default SpotterCodeLogo; diff --git a/src/components/FloatingAssistant/api.ts b/src/components/FloatingAssistant/api.ts new file mode 100644 index 000000000..2bb452195 --- /dev/null +++ b/src/components/FloatingAssistant/api.ts @@ -0,0 +1,46 @@ +import { CLOUDFLARE_URL, API_PATHS } from './constants'; +import { Message, SseEvent } from './types'; +import { parseSseStream } from './helpers'; + +export async function fetchSuggestedQuestions(pageId: string): Promise { + const res = await fetch( + `${CLOUDFLARE_URL}${API_PATHS.SUGGESTED_QUESTIONS}?pageId=${encodeURIComponent(pageId)}`, + ); + const data: { questions?: string[] } = await res.json(); + return data.questions ?? []; +} + +export async function* streamAgentResponse( + messages: Message[], + pageId: string | undefined, + signal: AbortSignal, +): AsyncGenerator { + const response = await fetch(`${CLOUDFLARE_URL}${API_PATHS.AGENT}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + signal, + body: JSON.stringify({ playgroundType: 'ask-docs', messages, pageId }), + }); + + if (!response.ok || !response.body) { + throw new Error(`API error: ${response.status}`); + } + + yield* parseSseStream(response); +} + +export async function sendFeedback( + traceId: string, + observationId: string | undefined, + value: 'up' | 'down', +): Promise { + const response = await fetch(`${CLOUDFLARE_URL}${API_PATHS.FEEDBACK}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ traceId, observationId, value }), + }); + + if (!response.ok) { + throw new Error(`Feedback API error: ${response.status}`); + } +} diff --git a/src/components/FloatingAssistant/constants.ts b/src/components/FloatingAssistant/constants.ts new file mode 100644 index 000000000..0711cf655 --- /dev/null +++ b/src/components/FloatingAssistant/constants.ts @@ -0,0 +1,47 @@ +export const CLOUDFLARE_URL = + process.env.CLOUDFLARE_URL || + 'https://spottercode.thoughtspot.app'; + +export const LOADING_PHASES = [ + 'Processing your request...', + 'Thinking...', + 'Understanding your query...', + 'Searching documentation...', + 'Generating response...', +]; + +export const PANEL_MIN_WIDTH = 360; +export const PANEL_MAX_WIDTH = 720; +export const PANEL_DEFAULT_WIDTH = 360; + +export const LOADING_PHASE_DELAYS = [0, 1200, 2800, 4800, 7000]; + +export const API_PATHS = { + SUGGESTED_QUESTIONS: '/suggested-questions', + AGENT: '/agent/embed-assistant', + FEEDBACK: '/agent/embed-assistant/feedback', +} as const; + +export const ERROR_MESSAGES = { + DEFAULT: 'Sorry, something went wrong. Please try again.', + NO_RESPONSE: 'No response received.', +} as const; + +export const STORAGE_KEY = 'floatingAssistantState'; + +export const LANG_LABEL_MAP: Record = { + javascript: 'JavaScript', typescript: 'TypeScript', python: 'Python', + bash: 'Bash', shell: 'Shell', sh: 'Shell', sql: 'SQL', json: 'JSON', + html: 'HTML', css: 'CSS', scss: 'SCSS', java: 'Java', go: 'Go', + ruby: 'Ruby', rust: 'Rust', cpp: 'C++', c: 'C', csharp: 'C#', + yaml: 'YAML', xml: 'XML', markdown: 'Markdown', curl: 'cURL', +}; + +export const isPageReload = (): boolean => { + try { + const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined; + return nav?.type === 'reload'; + } catch { + return false; + } +}; diff --git a/src/components/FloatingAssistant/helpers.ts b/src/components/FloatingAssistant/helpers.ts new file mode 100644 index 000000000..cc2496f19 --- /dev/null +++ b/src/components/FloatingAssistant/helpers.ts @@ -0,0 +1,128 @@ +import { marked } from 'marked'; +import DOMPurify from 'dompurify'; +import hljs from 'highlight.js'; +import { LANG_LABEL_MAP } from './constants'; +import { SseEvent } from './types'; + +export function renderMarkdown(text: string): string { + const cleaned = text + .replace(/【[\d]+】/g, '') + .replace(/【[\d†]+†?[^】]*】/g, '') + .replace(/\s*\bcite\w*/gi, '') + .replace(/\s*\[cite[^\]]*\]/gi, ''); + const html = marked.parse(cleaned, { async: false }) as string; + const sanitized = DOMPurify.sanitize(html, { ADD_ATTR: ['target', 'rel'] }); + const withLinks = sanitized.replace( + /]*>([^<]+)<\/a>/g, + (_, href, label) => { + const trimmed = label.trim(); + let display = trimmed; + if (/^https?:\/\//i.test(trimmed)) { + try { + const url = new URL(trimmed); + const slug = url.pathname.split('/').filter(Boolean).pop() || url.hostname; + display = slug.replace(/[-_]/g, ' ').replace(/\b\w/g, (c: string) => c.toUpperCase()); + } catch { + display = trimmed; + } + } + return `${display}`; + }, + ); + return withLinks.replace( + /
]*)>([\s\S]*?)<\/code><\/pre>/g,
+        (_, attrs, code) => {
+            const langMatch = attrs.match(/class="language-([^"]+)"/);
+            const lang = langMatch?.[1];
+            const decoded = code
+                .replace(/</g, '<')
+                .replace(/>/g, '>')
+                .replace(/"/g, '"')
+                .replace(/&/g, '&');
+            let highlighted = decoded;
+            let detectedLang = lang;
+            try {
+                if (lang && hljs.getLanguage(lang)) {
+                    highlighted = hljs.highlight(decoded, { language: lang }).value;
+                } else {
+                    const result = hljs.highlightAuto(decoded);
+                    highlighted = result.value;
+                    detectedLang = result.language;
+                }
+            } catch { /* fallback to plain */ }
+            const label = detectedLang ? (LANG_LABEL_MAP[detectedLang.toLowerCase()] || detectedLang.toUpperCase()) : 'Code';
+            return `
` + + `
` + + `${label}` + + `` + + `
` + + `
${highlighted}
` + + `
`; + }, + ); +} + +export function formatTimestamp(ts: number): string { + const d = new Date(ts); + const h = d.getHours(); + const m = d.getMinutes().toString().padStart(2, '0'); + const ampm = h >= 12 ? 'PM' : 'AM'; + const h12 = h % 12 || 12; + const month = (d.getMonth() + 1).toString().padStart(2, '0'); + const day = d.getDate().toString().padStart(2, '0'); + const year = d.getFullYear(); + return `${h12}:${m} ${ampm}, ${month}/${day}/${year}`; +} + +export function formatDuration(ms: number): string { + const totalSec = Math.round(ms / 1000); + if (totalSec < 60) return `${totalSec} second${totalSec !== 1 ? 's' : ''}`; + const mins = Math.floor(totalSec / 60); + const secs = totalSec % 60; + const minPart = `${mins} min${mins !== 1 ? 's' : ''}`; + return secs > 0 ? `${minPart} ${secs} second${secs !== 1 ? 's' : ''}` : minPart; +} + +export async function* parseSseStream(response: Response): AsyncGenerator { + const reader = response.body!.getReader(); + const decoder = new TextDecoder(); + let buffer = ''; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += decoder.decode(value, { stream: true }); + + const parts = buffer.split('\n\n'); + buffer = parts.pop() ?? ''; + + for (const part of parts) { + const line = part.trim(); + if (!line.startsWith('data:')) continue; + const json = line.slice('data:'.length).trim(); + try { + yield JSON.parse(json) as SseEvent; + } catch { + // skip malformed lines + } + } + } +} + +export const getPageId = (): string | undefined => { + if (typeof window === 'undefined') return undefined; + return new URLSearchParams(window.location.search).get('pageid') + || window.location.pathname.split('/').filter(Boolean).pop() + || undefined; +}; + +export const stripMarkdown = (md: string) => + md.replace(/```[\s\S]*?```/g, (m) => m.replace(/```\w*\n?/, '').replace(/```$/, '').trim()) + .replace(/`([^`]+)`/g, '$1') + .replace(/#{1,6}\s+/g, '') + .replace(/\*\*([^*]+)\*\*/g, '$1') + .replace(/\*([^*]+)\*/g, '$1') + .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + .replace(/^[-*+]\s+/gm, '') + .replace(/^\d+\.\s+/gm, '') + .trim(); diff --git a/src/components/FloatingAssistant/index.scss b/src/components/FloatingAssistant/index.scss new file mode 100644 index 000000000..f8276f276 --- /dev/null +++ b/src/components/FloatingAssistant/index.scss @@ -0,0 +1,841 @@ +@import '../../assets/styles/variables.scss'; +@import '../../assets/styles/highlight.scss'; + +// ── Chip trigger ───────────────────────────────────────────────────────────── +.floating-assistant__chip { + position: fixed; + top: 120px; + right: 24px; + z-index: 1001; + display: inline-flex; + align-items: center; + justify-content: center; + width: 56px; + height: 56px; + background: #fff; + border: 2px solid transparent; + border-radius: 50%; + cursor: pointer; + background-clip: padding-box; + box-shadow: 0 4px 16px 0 rgba(25, 35, 49, 0.10); + transition: box-shadow 0.2s ease, transform 0.2s ease; + outline: 2px solid transparent; + + // Gradient border using outline + pseudo-element on a wrapper isn't needed — + // use a parent wrapper div for the gradient ring + &:hover { + box-shadow: 0 8px 24px 0 rgba(25, 35, 49, 0.16); + } + + svg { + width: 26px; + height: 26px; + position: relative; + z-index: 1; + color: #2770ef; + } +} + +// Gradient ring wrapper rendered around the chip button — top right +.floating-assistant__chip-ring { + position: fixed; + top: 120px; + right: 24px; + width: 61px; + height: 61px; + border-radius: 50%; + background: linear-gradient(135deg, #8C62F5, #48D1E0, #2770EF); + padding: 1px; + z-index: 1001; + box-shadow: 0 4px 16px 0 rgba(25, 35, 49, 0.10); + cursor: pointer; + + .floating-assistant__chip { + position: static; + width: 100%; + height: 100%; + box-shadow: none; + top: unset; + right: unset; + z-index: unset; + } +} + +// ── Panel ───────────────────────────────────────────────────────────────────── +.floating-assistant__resize-handle { + position: absolute; + top: 0; + left: 0; + width: 5px; + height: 100%; + cursor: ew-resize; + z-index: 10; + + &:hover, &:active { + background: rgba(39, 112, 239, 0.15); + } +} + +.floating-assistant__panel { + position: fixed; + top: 108px; + right: 0; + bottom: 0; + width: 360px; + background: + linear-gradient(180deg, transparent 0%, #fff 35%), + linear-gradient(90deg, + rgba(255, 120, 160, 0.3) 0%, + rgba(160, 100, 255, 0.2) 60%, + rgba(100, 160, 255, 0.3) 90% + ), + #fff; + display: flex; + flex-direction: column; + overflow: hidden; + z-index: 1002; + box-shadow: -4px 0 24px 0 rgba(25, 35, 49, 0.10); + animation: fa-slide-in 0.25s ease-out forwards; + + &.closing { + animation: fa-slide-out 0.25s ease-in forwards; + } + + &--conversation { + background: #fff; + } + + &--embedded { + top: 0; // no header or secondary nav in embedded mode — panel takes full height + } +} + +// ── Header ──────────────────────────────────────────────────────────────────── +.floating-assistant__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + height: 52px; + flex-shrink: 0; + background: transparent; + border: none; + outline: none; + border-bottom: 1px solid #EAEDF2; +} + +.floating-assistant__close-btn { + background: none; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 4px; + border-radius: 4px; + transition: background 0.15s; + + &:hover { background: #f1f4f8; } +} + +.floating-assistant__title { + font-size: 16px; + font-weight: 600; + font-family: 'Optimo-Plain', sans-serif; + color: #1d232f; +} + + +// ── Messages area ───────────────────────────────────────────────────────────── +.floating-assistant__messages { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 16px 16px 8px; + display: flex; + flex-direction: column; + gap: 16px; + background: transparent; + + &::-webkit-scrollbar { width: 4px; } + &::-webkit-scrollbar-track { background: transparent; } + &::-webkit-scrollbar-thumb { + background: #d0d4db; + border-radius: 2px; + &:hover { background: #a5acb9; } + } + scrollbar-width: thin; + scrollbar-color: #d0d4db transparent; +} + +// ── Messages fade + scroll-to-bottom ───────────────────────────────────────── +.floating-assistant__messages-fade { + position: relative; + flex-shrink: 0; + height: 0; + pointer-events: none; + z-index: 10; + + &::before { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 48px; + background: linear-gradient(to top, #fff 0%, transparent 100%); + opacity: 0; + transition: opacity 0.2s ease; + } + + &--visible::before { + opacity: 1; + } +} + +.floating-assistant__scroll-down { + position: absolute; + bottom: 8px; + left: 50%; + transform: translateX(-50%); + pointer-events: all; + animation: fa-fade-in 0.15s ease-out forwards; + display: inline-flex; + align-items: center; + justify-content: center; + background: #fff; + border: 1px solid #e0e4ea; + border-radius: 50%; + width: 28px; + height: 28px; + cursor: pointer; + box-shadow: 0 2px 6px rgba(0,0,0,0.1); + @media (prefers-color-scheme: dark) { + background: #2a3142; + border-color: #3a4255; + } +} + +@keyframes fa-fade-in { + from { opacity: 0; transform: translateX(-50%) translateY(4px); } + to { opacity: 1; transform: translateX(-50%) translateY(0); } +} + +// ── Landing ─────────────────────────────────────────────────────────────────── +.floating-assistant__landing { + display: flex; + flex-direction: column; + flex: 1; + padding: 32px 16px 16px; +} + +.floating-assistant__landing-intro { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + gap: 24px; + flex: 1; +} + +.floating-assistant__landing-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + overflow: hidden; + flex-shrink: 0; + + svg { + width: 48px; + height: 48px; + } +} + +.floating-assistant__landing-title { + font-size: 22px; + font-weight: 700; + font-family: 'Optimo-Plain', sans-serif; + color: #1d232f; + line-height: 1.3; + letter-spacing: -0.4px; + text-align: center; + + span { color: #2770ef; } +} + +.floating-assistant__suggestions { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + padding-bottom: 8px; +} + +.floating-assistant__suggestion { + background: #F6F8FA; + border: 1px solid #EAEDF2; + border-radius: 40px; + color: #1d232f; + cursor: pointer; + font-size: 12px; + font-family: 'Optimo-Plain', sans-serif; + line-height: 1.4; + padding: 14px; + text-align: left; + backdrop-filter: blur(4px); + transition: background 0.15s ease, box-shadow 0.15s ease; + animation: fa-suggestion-in 0.3s ease-out both; + opacity: 0; + + &:hover { background: #eef1f5; } +} + +@keyframes fa-suggestion-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +// ── Conversation messages ───────────────────────────────────────────────────── +.floating-assistant__message { + display: flex; + flex-direction: column; + gap: 8px; +} + +// User message wrapper +.floating-assistant__user-message-wrap { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 4px; +} + +// Timestamp + edit row +.floating-assistant__user-meta { + display: flex; + align-items: center; + gap: 6px; + justify-content: flex-end; +} + +.floating-assistant__timestamp { + font-size: 11px; + color: #a5acb9; + font-family: 'Optimo-Plain', sans-serif; +} + +// Icon-only send/cancel buttons shown in edit mode (below the bubble) +.floating-assistant__edit-action-btn { + border: none; + cursor: pointer; + width: 26px; + height: 26px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: background 0.15s; + background: none; + + &:hover { + background: #d0d4db; + } + + &--send { + background: #2770ef; + + &:hover { + background: #1a5fd4; + } + } +} + +// Dismiss button on the input-row quote chip +.floating-assistant__quote-dismiss { + background: none; + border: none; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + opacity: 0.6; + border-radius: 3px; + transition: opacity 0.15s; + flex-shrink: 0; + &:hover { opacity: 1; } +} + +// Inline dismiss button inside the quote chip when editing +.floating-assistant__quote-dismiss-inline { + background: none; + border: none; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + opacity: 0.6; + border-radius: 3px; + transition: opacity 0.15s; + + &:hover { + opacity: 1; + } +} + + +// User bubble — light gray rounded box +.floating-assistant__user-bubble { + background: #f1f4f8; + border: 1px solid #e8eaed; + border-radius: 10px; + padding: 10px 14px; + font-size: 13px; + font-weight: 400; + color: #1d232f; + font-family: 'Optimo-Plain', sans-serif; + line-height: 1.5; + word-break: break-word; + outline: none; + width: 100%; + box-sizing: border-box; + + &--editing { + border-color: #2770ef; + background: #fff; + cursor: text; + white-space: pre-wrap; + } +} + +// Assistant block — avatar + content stacked +.floating-assistant__assistant-block { + display: flex; + flex-direction: column; + gap: 8px; +} + +// Small avatar +.floating-assistant__avatar-icon { + width: 24px; + height: 24px; + border-radius: 50%; + overflow: hidden; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 24px; + height: 24px; + } +} + +// Assistant message text — flat, no bubble +.floating-assistant__message-text { + font-size: 13px; + line-height: 1.6; + color: #1d232f; + word-break: break-word; + font-family: 'Optimo-Plain', sans-serif; + + &--md { + padding: 0; + white-space: normal; + + p { margin: 0 0 8px; &:last-child { margin-bottom: 0; } } + ul, ol { margin: 4px 0 8px; padding-left: 20px; } + li { margin-bottom: 3px; } + strong { font-weight: 600; } + em { font-style: italic; } + a { color: #2770ef; text-decoration: underline; } + h1, h2, h3 { font-weight: 600; margin: 10px 0 4px; color: #1d232f; } + h1 { font-size: 15px; } + h2 { font-size: 14px; } + h3 { font-size: 13px; } + + code { + font-family: $font-family-code; + font-size: 12px; + background: #f1f4f8; + color: #1d232f; + border-radius: 3px; + padding: 1px 5px; + border: 1px solid #e3e6eb; + } + + pre { + background: #1d232f; + color: #e6edf3; + border-radius: 8px; + padding: 10px 12px; + margin: 6px 0; + overflow-x: auto; + font-size: 12px; + line-height: 1.5; + + code { background: none; border: none; padding: 0; color: inherit; } + } + } +} + +// ── Generation summary bar ──────────────────────────────────────────────────── +.floating-assistant__gen-summary-header { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 13px; + font-weight: 400; + color: #6b7280; + font-family: 'Optimo-Plain', sans-serif; + cursor: default; + user-select: none; +} + +// Feedback thumbs +.floating-assistant__feedback { + display: flex; + align-items: center; + gap: 4px; + margin-top: 2px; + min-height: 26px; +} + +// Copy response button +.fa-msg-copy-btn { + display: inline-flex; + align-items: center; + gap: 4px; + background: none; + border: none; + cursor: pointer; + padding: 2px; + border-radius: 4px; + font-size: 11px; + font-family: 'Optimo-Plain', sans-serif; + color: #a5acb9; + transition: color 0.15s, background 0.15s; + + &:hover { + color: #1d232f; + background: #f1f4f8; + } + + &--copied { + color: #0d9f6e; + } +} + +// Feedback thumb buttons +.fa-feedback-btn { + display: inline-flex; + align-items: center; + justify-content: center; + background: none; + border: none; + cursor: pointer; + padding: 4px; + border-radius: 4px; + opacity: 0.7; + transition: opacity 0.15s, background 0.15s; + &:hover { opacity: 1; background: rgba(0,0,0,0.06); } + &.fa-feedback-btn--active { opacity: 1; } +} + + +// ── Loading status ──────────────────────────────────────────────────────────── +.floating-assistant__loading-status { + display: flex; + align-items: center; + gap: 8px; +} + +.floating-assistant__loading-phase { + font-size: 13px; + color: #5f6368; + font-family: 'Optimo-Plain', sans-serif; + animation: fa-phase-in 0.4s ease-out forwards; +} + +@keyframes fa-phase-in { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} + +// ── Quoted text chip above input ───────────────────────────────────────────── +.floating-assistant__quote-chip { + display: flex; + align-items: center; + gap: 6px; + background: #f1f4f8; + border-radius: 8px; + padding: 6px 8px 6px 10px; + margin-bottom: 4px; + color: #5f6368; + + svg { flex-shrink: 0; color: #a5acb9; } +} + +.floating-assistant__quote-text { + flex: 1; + font-size: 12px; + color: #5f6368; + font-family: 'Optimo-Plain', sans-serif; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 240px; +} + + +// ── Code blocks inside assistant messages ──────────────────────────────────── +.fa-code-block { + border-radius: 10px; + overflow: hidden; + margin: 6px 0; + background: #1d232f; + + pre { + background: #1a1f2b; + color: #e6edf3; + padding: 12px 14px; + overflow-x: auto; + overflow-y: auto; + max-height: 300px; + font-size: 12px; + line-height: 1.6; + margin: 0; + white-space: pre; + border-radius: 0 0 10px 10px; + + code { background: none; border: none; padding: 0; color: inherit; font-family: $font-family-code; white-space: pre; } + } +} + +.fa-code-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 14px; + background: #2a3142; + border-radius: 10px 10px 0 0; +} + +.fa-code-lang { + font-size: 12px; + font-family: 'Optimo-Plain', sans-serif; + color: #a5acb9; + font-weight: 500; + letter-spacing: 0.02em; +} + +.fa-code-copy { + background: none; + border: none; + color: #2770ef; + cursor: pointer; + font-size: 12px; + font-family: 'Optimo-Plain', sans-serif; + font-weight: 500; + padding: 0; + transition: color 0.3s ease, opacity 0.3s ease; + + &:hover { color: #5592f5; } + &--copied { color: #0d9f6e !important; } + &--fading { opacity: 0; } +} + +// ── Input area ──────────────────────────────────────────────────────────────── +.floating-assistant__input-row { + padding: 8px 12px 8px; + flex-shrink: 0; + border-top: 1px solid rgba(0, 0, 0, 0.06); + background: rgba(255,255,255,0.6); + backdrop-filter: blur(8px); +} + +.floating-assistant__input-wrapper { + display: flex; + flex-direction: column; + gap: 6px; + background: #fff; + border-radius: 12px; + padding: 10px 10px 8px; + cursor: text; + position: relative; + + // Gradient border via pseudo-element + &::before { + content: ''; + position: absolute; + inset: 0; + border-radius: 12px; + padding: 1.5px; + background: #d0d4db; + -webkit-mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + mask-composite: exclude; + transition: opacity 0.25s ease; + pointer-events: none; + } + + &::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 12px; + padding: 1.5px; + background: linear-gradient(135deg, #8C62F5, #48D1E0, #2770EF, #8C62F5); + background-size: 300% 300%; + -webkit-mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + mask-composite: exclude; + opacity: 0; + transition: opacity 0.25s ease; + animation: fa-gradient-border 3s ease 1 forwards; + pointer-events: none; + } + + &:focus-within::before { opacity: 0; } + &:focus-within::after { opacity: 1; } +} + +.floating-assistant__input { + flex: 0 1 auto; + resize: none; + border: none; + outline: none; + font-size: 14px; + font-family: 'Optimo-Plain', sans-serif; + background: transparent; + color: #1d232f; + min-height: 28px; + max-height: calc(14px * 1.5 * 4); // 4 lines at font-size 14px, line-height 1.5 + overflow-y: auto; + line-height: 1.5; + + &::placeholder { color: #a5acb9; } + scrollbar-width: thin; + scrollbar-color: #d0d4db transparent; +} + +.floating-assistant__input-buttons { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 6px; +} + +.floating-assistant__reset-input { + width: 30px; + height: 30px; + border-radius: 50%; + border: 1px solid #e3e6eb; + background: #fff; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + transition: background 0.15s; + &:hover { background: #f1f4f8; } +} + +.floating-assistant__send { + width: 30px; + height: 30px; + border-radius: 50%; + border: none; + background: #2770ef; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + transition: background 0.15s; + &:disabled { opacity: 0.4; cursor: not-allowed; } + &:not(:disabled):hover { background: #1a5ccc; } +} + +.floating-assistant__stop { + width: 30px; + height: 30px; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background: #2770ef; + border:0px; + color: #fff; + transition: background 0.15s, border-color 0.15s; +} + + +// ── Footer ──────────────────────────────────────────────────────────────────── +.floating-assistant__footer { + padding: 6px 16px 12px; + font-size: 11.5px; + color: #a5acb9; + text-align: center; + font-family: 'Optimo-Plain', sans-serif; + + a { + color: #2770ef; + text-decoration: none; + &:hover { text-decoration: underline; } + } +} + +// ── Animations ──────────────────────────────────────────────────────────────── +@keyframes fa-slide-in { + from { transform: translateX(100%); opacity: 0; } + to { transform: translateX(0); opacity: 1; } +} + +@keyframes fa-slide-out { + from { transform: translateX(0); opacity: 1; } + to { transform: translateX(100%); opacity: 0; } +} + +@keyframes fa-gradient-border { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + + +@media (max-width: 600px) { + .floating-assistant__panel { + width: 100vw; + } +} + +// ── Toast overrides ─────────────────────────────────────────────────────────── +.rd-alert-toast, +[class*="alertToast"], +[class*="toast"] { + text-align: center !important; + + &[class*="exit"], + &[class*="leaving"], + &[class*="hide"] { + animation: fa-toast-out 0.25s ease-in forwards !important; + } +} + +@keyframes fa-toast-out { + from { transform: translateY(0); opacity: 1; } + to { transform: translateY(-12px); opacity: 0; } +} diff --git a/src/components/FloatingAssistant/index.tsx b/src/components/FloatingAssistant/index.tsx new file mode 100644 index 000000000..e54a98e5a --- /dev/null +++ b/src/components/FloatingAssistant/index.tsx @@ -0,0 +1,719 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { createPortal } from 'react-dom'; +import { useFloatingAssistant } from '../../contexts/FloatingAssistantContext'; +import { isPublicSite } from '../../utils/app-utils'; +import { CUSTOM_PAGE_ID } from '../../configs/doc-configs'; +import { Alert, Icon, IconID, IconSize, IconColor, LoadingIndicator } from '@thoughtspot/radiant-react'; +import '@thoughtspot/radiant-react/styles'; +import './index.scss'; +import SpotterCodeLogo from './SpotterCodeLogo'; +import { LOADING_PHASES, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH, PANEL_DEFAULT_WIDTH, LOADING_PHASE_DELAYS, ERROR_MESSAGES } from './constants'; +import { Message } from './types'; +import { renderMarkdown, formatTimestamp, formatDuration, getPageId, stripMarkdown } from './helpers'; +import { fetchSuggestedQuestions, streamAgentResponse, sendFeedback } from './api'; + +const SparkleIcon = () => ( + +); + +const MsgCopyButton = ({ text }: { text: string }) => { + const [copied, setCopied] = React.useState(false); + const timerRef = React.useRef | null>(null); + const handleCopy = () => { + navigator.clipboard.writeText(stripMarkdown(text)).catch(() => {}); + if (timerRef.current) clearTimeout(timerRef.current); + setCopied(true); + timerRef.current = setTimeout(() => setCopied(false), 1500); + }; + return ( + + ); +}; + +const AssistantAvatar = () => ( +
+ +
+); + +const FloatingAssistant: React.FC = () => { + const [pageId, setPageId] = useState(getPageId); + const [isEmbedded, setIsEmbedded] = useState(false); + const { + isOpen, + setIsOpen, + messages, + setMessages, + suggestedQuestions, + setSuggestedQuestions, + suggestedQuestionsLoaded, + setSuggestedQuestionsLoaded, + resetConversation, + quotedText, + setQuotedText, + } = useFloatingAssistant(); + + const [feedbackGiven, setFeedbackGiven] = useState>({}); + const [loadingPhase, setLoadingPhase] = useState(0); + const [questionsKey, setQuestionsKey] = useState(0); + const loadingPhaseTimer = useRef | null>(null); + const [showFeedbackToast, setShowFeedbackToast] = useState(false); + const [toastExiting, setToastExiting] = useState(false); + const feedbackToastTimer = useRef | null>(null); + const toastExitTimer = useRef | null>(null); + + const hideToast = () => { + setToastExiting(true); + toastExitTimer.current = setTimeout(() => { + setShowFeedbackToast(false); + setToastExiting(false); + }, 250); + }; + + const giveFeedback = (idx: number, type: 'up' | 'down', message: Message) => { + const isUnfill = feedbackGiven[idx] === type; + setFeedbackGiven((prev: Record) => { + const next = { ...prev }; + if (isUnfill) delete next[idx]; + else next[idx] = type; + return next; + }); + if (!isUnfill) { + if (feedbackToastTimer.current) clearTimeout(feedbackToastTimer.current); + if (toastExitTimer.current) clearTimeout(toastExitTimer.current); + setToastExiting(false); + setShowFeedbackToast(true); + feedbackToastTimer.current = setTimeout(hideToast, 2500); + + if (message.traceId) { + sendFeedback(message.traceId, message.observationId, type).catch(() => { + // Feedback is best-effort — a failed submission shouldn't disrupt the chat UI. + }); + } + } + }; + const [editingIndex, setEditingIndex] = useState(null); + const [editDraft, setEditDraft] = useState(''); + const editDivRef = useRef(null); + const editOriginalRef = useRef(''); + + const [panelWidth, setPanelWidth] = useState(PANEL_DEFAULT_WIDTH); + const isResizing = useRef(false); + const resizeStartX = useRef(0); + const resizeStartWidth = useRef(0); + + const onResizeMouseDown = (e: React.MouseEvent) => { + e.preventDefault(); + isResizing.current = true; + resizeStartX.current = e.clientX; + resizeStartWidth.current = panelWidth; + document.body.style.cursor = 'ew-resize'; + document.body.style.userSelect = 'none'; + + const onMouseMove = (ev: MouseEvent) => { + if (!isResizing.current) return; + const delta = resizeStartX.current - ev.clientX; + const next = Math.min(PANEL_MAX_WIDTH, Math.max(PANEL_MIN_WIDTH, resizeStartWidth.current + delta)); + setPanelWidth(next); + }; + + const onMouseUp = () => { + isResizing.current = false; + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + window.removeEventListener('mousemove', onMouseMove); + window.removeEventListener('mouseup', onMouseUp); + }; + + window.addEventListener('mousemove', onMouseMove); + window.addEventListener('mouseup', onMouseUp); + }; + + const handleReset = () => { + abortRef.current?.abort(); + resetConversation(); + setInput(''); + setIsLoading(false); + setStreamingText(''); + setToolSteps([]); + setFeedbackGiven({}); + setEditingIndex(null); + setEditDraft(''); + }; + + const [editQuotedText, setEditQuotedText] = useState(undefined); + + const startEdit = (idx: number, content: string, quotedText?: string) => { + const draft = quotedText ? content.replace(`"${quotedText}"\n\n`, '') : content; + editOriginalRef.current = draft; + setEditingIndex(idx); + setEditQuotedText(quotedText); + setEditDraft(draft); + }; + + const cancelEdit = () => { + if (editDivRef.current) { + editDivRef.current.innerText = editOriginalRef.current; + } + setEditingIndex(null); + setEditDraft(''); + setEditQuotedText(undefined); + }; + + const submitEdit = async (idx: number) => { + const draft = editDraft.trim(); + if (!draft) return; + const original = messages[idx]; + const effectiveQuote = editQuotedText; + const fullText = effectiveQuote ? `"${effectiveQuote}"\n\n${draft}` : draft; + const updated: Message = { ...original, content: fullText, quotedText: effectiveQuote, sentAt: Date.now() }; + const trimmed = [...messages.slice(0, idx), updated]; + setEditingIndex(null); + setEditDraft(''); + setEditQuotedText(undefined); + await sendMessage(fullText, trimmed); + }; + const [isClosing, setIsClosing] = useState(false); + const [streamingText, setStreamingText] = useState(''); + const [toolSteps, setToolSteps] = useState([]); + const [input, setInput] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [showScrollDown, setShowScrollDown] = useState(false); + const messagesEndRef = useRef(null); + const messagesContainerRef = useRef(null); + const inputRef = useRef(null); + const abortRef = useRef(null); + const userScrolledRef = useRef(false); + + useEffect(() => { + setIsOpen(true); + }, []); + + useEffect(() => { + if (!userScrolledRef.current && messagesEndRef.current) { + messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }); + } + }, [messages, streamingText]); + + useEffect(() => { + if (isOpen && messages.length > 0) { + userScrolledRef.current = false; + setTimeout(() => { + const el = messagesContainerRef.current; + if (el) el.scrollTop = el.scrollHeight; + }, 280); + } + }, [isOpen]); + + const handleMessagesScroll = () => { + const el = messagesContainerRef.current; + if (!el) return; + const distFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight; + const isAtBottom = distFromBottom <= 80; + setShowScrollDown(!isAtBottom); + userScrolledRef.current = !isAtBottom; + }; + + const scrollToBottom = () => { + userScrolledRef.current = false; + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + setShowScrollDown(false); + }; + + useEffect(() => { + if (isOpen && inputRef.current) { + inputRef.current.focus(); + } + }, [isOpen]); + + useEffect(() => { + const el = inputRef.current; + if (!el) return; + el.style.height = 'auto'; + el.style.height = `${el.scrollHeight}px`; + }, [input]); + + useEffect(() => { + if (quotedText) { + setTimeout(() => inputRef.current?.focus(), 100); + } + }, [quotedText]); + + useEffect(() => { + const handler = (e: CustomEvent<{ location: Location }>) => { + const { location } = e.detail; + const newPageId = new URLSearchParams(location.search).get('pageid') + || location.pathname.split('/').filter(Boolean).pop() + || undefined; + setPageId(newPageId); + setSuggestedQuestionsLoaded(false); + }; + window.addEventListener('gatsby-route-update', handler as EventListener); + return () => window.removeEventListener('gatsby-route-update', handler as EventListener); + }, [setSuggestedQuestionsLoaded]); + + useEffect(() => { + setIsEmbedded(!isPublicSite(window.location.search)); + const handler = (e: CustomEvent<{ location: Location }>) => { + setIsEmbedded(!isPublicSite(e.detail.location.search)); + }; + window.addEventListener('gatsby-route-update', handler as EventListener); + return () => window.removeEventListener('gatsby-route-update', handler as EventListener); + }, []); + + useEffect(() => { + const handler = (e: CustomEvent<{ quotedText: string }>) => { + setQuotedText(e.detail.quotedText); + setIsOpen(true); + }; + window.addEventListener('spotter-code-ask', handler as EventListener); + return () => window.removeEventListener('spotter-code-ask', handler as EventListener); + }, [setIsOpen, setQuotedText]); + + useEffect(() => { + if (suggestedQuestionsLoaded || messages.length > 0) return; + const id = pageId || 'home'; + fetchSuggestedQuestions(id) + .then((questions) => { + setSuggestedQuestions(questions); + setSuggestedQuestionsLoaded(true); + setQuestionsKey((k: number) => k + 1); + }) + .catch(() => { + setSuggestedQuestionsLoaded(true); + }); + }, [pageId, suggestedQuestionsLoaded, messages.length, setSuggestedQuestions, setSuggestedQuestionsLoaded]); + + const stopGeneration = () => { + abortRef.current?.abort(); + }; + + const sendMessage = async (text?: string, historyOverride?: Message[]) => { + const messageText = (text ?? input).trim(); + if (!messageText || isLoading) return; + + let updatedMessages: Message[]; + if (historyOverride) { + updatedMessages = historyOverride; + } else { + const fullText = quotedText ? `"${quotedText}"\n\n${messageText}` : messageText; + const userMessage: Message = { role: 'user', content: fullText, quotedText: quotedText ?? undefined, sentAt: Date.now() }; + setQuotedText(null); + updatedMessages = [...messages, userMessage]; + } + + setMessages(updatedMessages); + if (!text) setInput(''); + setIsLoading(true); + setStreamingText(''); + setToolSteps([]); + setLoadingPhase(0); + userScrolledRef.current = false; + + LOADING_PHASE_DELAYS.forEach((delay, idx) => { + const t = setTimeout(() => setLoadingPhase(idx), delay); + if (idx === LOADING_PHASE_DELAYS.length - 1) loadingPhaseTimer.current = t; + }); + + abortRef.current = new AbortController(); + const startTime = Date.now(); + + let accumulated = ''; + let collectedSteps: string[] = []; + let finalContent: string = ERROR_MESSAGES.DEFAULT; + let aborted = false; + let traceId: string | undefined; + let observationId: string | undefined; + + try { + for await (const event of streamAgentResponse(updatedMessages, pageId, abortRef.current.signal)) { + if (event.type === 'trace') { + traceId = event.traceId; + observationId = event.observationId ?? event.generationId; + } else if (event.type === 'text') { + accumulated += event.content; + setStreamingText(accumulated); + } else if (event.type === 'tool-start') { + collectedSteps = [...collectedSteps, event.toolName]; + setToolSteps([...collectedSteps]); + } else if (event.type === 'done') { + break; + } else if (event.type === 'error') { + throw new Error(event.content); + } + } + + finalContent = accumulated || ERROR_MESSAGES.NO_RESPONSE; + } catch (err: unknown) { + if (err instanceof Error && err.name === 'AbortError') { + aborted = true; + finalContent = accumulated || ''; + } + } finally { + if (!aborted || accumulated) { + setMessages([...updatedMessages, { + role: 'assistant', + content: finalContent, + toolSteps: collectedSteps.length > 0 ? collectedSteps : undefined, + durationMs: Date.now() - startTime, + traceId, + observationId, + }]); + } + setStreamingText(''); + if (loadingPhaseTimer.current) clearTimeout(loadingPhaseTimer.current); + setLoadingPhase(0); + setToolSteps([]); + setIsLoading(false); + abortRef.current = null; + } + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + sendMessage(); + } + }; + + const copyTimers = useRef>>(new Map()); + const handleCodeCopy = (e: React.MouseEvent) => { + const btn = (e.target as HTMLElement).closest('.fa-code-copy'); + if (!btn) return; + const code = decodeURIComponent(btn.dataset.code ?? ''); + navigator.clipboard.writeText(code).catch(() => {}); + const existing = copyTimers.current.get(btn); + if (existing) clearTimeout(existing); + btn.textContent = 'Copied!'; + btn.classList.add('fa-code-copy--copied'); + btn.classList.remove('fa-code-copy--fading'); + const t = setTimeout(() => { + btn.classList.add('fa-code-copy--fading'); + const reset = setTimeout(() => { + btn.textContent = 'Copy'; + btn.classList.remove('fa-code-copy--copied', 'fa-code-copy--fading'); + copyTimers.current.delete(btn); + }, 300); + copyTimers.current.set(btn, reset); + }, 1500); + copyTimers.current.set(btn, t); + }; + + const handleClose = () => { + setIsClosing(true); + setTimeout(() => { + setIsOpen(false); + setIsClosing(false); + }, 300); + }; + + const isLandingPage = messages.length === 0 && !isLoading; + + if (pageId === CUSTOM_PAGE_ID.API_PLAYGROUND) return null; + + return ( + <> + {!isOpen && !isClosing && ( +
+ +
+ )} + + {(isOpen || isClosing) && ( +
+
+
+ SpotterCode + +
+ +
+ {isLandingPage ? ( +
+
+
+ +
+
+ Hey, I'm SpotterCode.
+ Where do we start? +
+ {suggestedQuestions.length > 0 && ( +
+ {suggestedQuestions.map((q, i) => ( + + ))} +
+ )} +
+
+ ) : ( + <> + {messages.map((msg, i) => ( +
+ {msg.role === 'user' ? ( +
+
{ + if (editingIndex === i) { + editDivRef.current = el; + if (el && document.activeElement !== el) { + el.focus(); + const range = document.createRange(); + range.selectNodeContents(el); + range.collapse(false); + window.getSelection()?.removeAllRanges(); + window.getSelection()?.addRange(range); + } + } + }} + onInput={e => setEditDraft((e.target as HTMLDivElement).innerText)} + onKeyDown={e => { + if (editingIndex !== i) return; + if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); submitEdit(i); } + if (e.key === 'Escape') cancelEdit(); + }} + onPaste={e => { + e.preventDefault(); + const text = e.clipboardData.getData('text/plain'); + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return; + const range = sel.getRangeAt(0); + range.deleteContents(); + range.insertNode(document.createTextNode(text)); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + setEditDraft((e.currentTarget as HTMLDivElement).innerText); + }} + > + {editingIndex === i ? ( + editQuotedText && ( +
+ + {editQuotedText} + +
+ ) + ) : ( + msg.quotedText && ( +
+ + {msg.quotedText} +
+ ) + )} + {msg.quotedText + ? msg.content.replace(`"${msg.quotedText}"\n\n`, '') + : msg.content} +
+
+ {msg.sentAt && editingIndex !== i && ( + {formatTimestamp(msg.sentAt)} + )} + {editingIndex === i ? ( + <> + + + + ) : ( + i === messages.map((m, idx) => m.role === 'user' ? idx : -1).filter(x => x >= 0).pop() && !isLoading && ( + + ) + )} +
+
+ ) : ( +
+ + {msg.durationMs !== undefined && ( +
+ Work done in {formatDuration(msg.durationMs)} +
+ )} +
+
+ + + +
+
+ )} +
+ ))} + + {isLoading && ( +
+
+ + {streamingText ? ( +
+ ) : ( +
+ + + {LOADING_PHASES[loadingPhase]} + +
+ )} +
+
+ )} + + )} +
+
+ + {!isLandingPage && ( +
+ {showScrollDown && ( + + )} +
+ )} + +
+
+ {quotedText && ( +
+ + {quotedText} + +
+ )} +