Conversation
WalkthroughLarge-scale code style normalization across the studio codebase, primarily switching string delimiters from double to single quotes, reformatting function signatures from multi-line to single-line layouts, and making minor type adjustments. Several behavioral changes are interspersed, including logic updates to hooks, type refinements for public interfaces, and Sentry integration restructuring. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (1)
studio/src/hooks/use-share-playground-modal.ts (1)
119-125: Note: Missing dependency in useEffect.The
useEffecton line 120 callsgenerateShareableUrlbut doesn't include it in the dependency array. While this is likely intentional (only run when modal opens), consider adding an eslint-disable comment to document this intent, similar to the pattern inuse-hydrate-playground-state-from-url.ts.📝 Suggested documentation
useEffect(() => { if (!isOpen) return; setSelectedOptions(DEFAULT_SELECTED_OPTIONS); generateShareableUrl(DEFAULT_SELECTED_OPTIONS); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen]);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/hooks/use-share-playground-modal.ts` around lines 119 - 125, The effect resets state and calls generateShareableUrl when the modal opens but omits generateShareableUrl from the dependency array without documenting that intent; update the useEffect in use-share-playground-modal.ts to either include generateShareableUrl in the deps or (preferred to match the existing pattern) add an eslint-disable-next-line react-hooks/exhaustive-deps comment with a short explanation (e.g., "Only run on open; generateShareableUrl is stable/intentional to omit") similar to the pattern used in use-hydrate-playground-state-from-url.ts, referencing useEffect, generateShareableUrl and DEFAULT_SELECTED_OPTIONS.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@studio/next.config.mjs`:
- Around line 72-75: The CSP currently includes "'unsafe-eval'" because
allowUnsafeEval is hardcoded true; change the logic so allowUnsafeEval (or the
inline conditional that appends "'unsafe-eval'") only evaluates true for
development builds (e.g., when NODE_ENV === 'development' or when !isProduction
&& !isPreview) so production/preview never emit 'unsafe-eval' in the script-src
string; update the allowUnsafeEval declaration or the template expression that
builds the script-src (the conditional adding "'unsafe-eval'") to be gated by
development-only checks.
In `@studio/src/components/analytics/useSyncTableWithQuery.ts`:
- Around line 91-95: The code sets selected group using router.query.group cast
unsafely which can produce undefined; validate router.query.group exists and is
a valid key of AnalyticsViewGroupName before calling setSelectedGroup. Check
that typeof router.query.group === "string", then test if (router.query.group as
string) is a key in AnalyticsViewGroupName (e.g., using
Object.prototype.hasOwnProperty.call or in operator) and only then call
setSelectedGroup(AnalyticsViewGroupName[router.query.group as keyof typeof
AnalyticsViewGroupName]); otherwise set a safe default or skip updating state.
Ensure this validation is applied where setSelectedGroup is invoked and
reference AnalyticsViewGroupName and router.query.group in the same scope.
- Around line 79-81: Wrap the decodeURI/JSON.parse call that produces
filterStateFromUrl in a try/catch to guard against malformed URLs: when reading
router.query.filterState in useSyncTableWithQuery.ts, perform decodeURI and
JSON.parse inside a try block, on error set filterStateFromUrl to an empty array
(or the existing safe default) and optionally log or silently ignore the parse
error; ensure you update the same variable name filterStateFromUrl so downstream
code uses the fallback instead of throwing.
In `@studio/src/components/member-groups/use-group-resources.ts`:
- Around line 180-185: The current call to mapGraph uses a non-null assertion on
the result of accessibleResources.federatedGraphs.find(...), which can throw if
no matching federated graph exists; modify the logic around mapGraph to safely
handle a missing federated graph (e.g., find result may be undefined) by
checking the find result before calling mapGraph (or providing a sensible
fallback/skipping this subgraph), updating the code paths that reference
fedGraph/federatedGraphs to avoid the `!` operator and handle the undefined case
(adjust where mapGraph is invoked and any callers expecting its result).
In `@studio/src/pages/cosmo-managed-solution-terms.md`:
- Line 71: The heading "## 10. Limitations of Liability.##" is malformed; update
the ATX heading to valid Markdown by removing the trailing hashes or adding a
space before them so it is either "## 10. Limitations of Liability." or "## 10.
Limitations of Liability ##" (replace the exact string in the file), ensuring
consistent rendering.
- Line 59: Fix the typos in the "BETA DISCLAIMER" paragraph: replace "IDENTIFED"
with "IDENTIFIED" and remove the stray word "FORM" so the clause starts
"FEATURES OF THE SOFTWARE OR SERVICE THAT ARE IDENTIFIED BY WUNDERGRAPH AS
“BETA” MAY CONTAIN DEFECTS."; update the single sentence under the BETA
DISCLAIMER heading accordingly to preserve punctuation and capitalization.
---
Nitpick comments:
In `@studio/src/hooks/use-share-playground-modal.ts`:
- Around line 119-125: The effect resets state and calls generateShareableUrl
when the modal opens but omits generateShareableUrl from the dependency array
without documenting that intent; update the useEffect in
use-share-playground-modal.ts to either include generateShareableUrl in the deps
or (preferred to match the existing pattern) add an eslint-disable-next-line
react-hooks/exhaustive-deps comment with a short explanation (e.g., "Only run on
open; generateShareableUrl is stable/intentional to omit") similar to the
pattern used in use-hydrate-playground-state-from-url.ts, referencing useEffect,
generateShareableUrl and DEFAULT_SELECTED_OPTIONS.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 302e98ef-5326-48e9-8c77-b74255f165db
📒 Files selected for processing (39)
studio/README.mdstudio/next.config.mjsstudio/sentry.client.config.tsstudio/sentry.edge.config.tsstudio/src/__tests__/playground-url-state-encoding-decoding.test.tsstudio/src/__tests__/schema-helpers.test.tsstudio/src/components/analytics/useSyncTableWithQuery.tsstudio/src/components/member-groups/use-group-resources.tsstudio/src/components/playground/types.tsstudio/src/components/ui/use-toast.tsstudio/src/env.mjsstudio/src/hooks/use-check-user-access.tsstudio/src/hooks/use-event-callback.tsstudio/src/hooks/use-event-listener.tsstudio/src/hooks/use-fireworks.tsstudio/src/hooks/use-form.tsstudio/src/hooks/use-hydrate-playground-state-from-url.tsstudio/src/hooks/use-new-features-popup-disabled.tsstudio/src/hooks/use-pagination-params.tsstudio/src/hooks/use-session-storage.tsstudio/src/hooks/use-share-playground-modal.tsstudio/src/hooks/use-star-banner-disabled.tsstudio/src/hooks/use-user.tsstudio/src/hooks/use-workspace.tsstudio/src/lib/constants.tsstudio/src/lib/download-string-as-file.tsstudio/src/lib/format-date.tsstudio/src/lib/format-number.tsstudio/src/lib/format-status.tsstudio/src/lib/insights-helpers.tsstudio/src/lib/playground-storage.tsstudio/src/lib/playground-url-state-decoding.tsstudio/src/lib/playground-url-state-encoding.tsstudio/src/lib/schema-helpers.tsstudio/src/lib/signup-content.tsstudio/src/lib/utils.tsstudio/src/middleware.tsstudio/src/pages/cosmo-managed-solution-terms.mdstudio/src/styles/login.css
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #2601 +/- ##
==========================================
- Coverage 62.40% 1.40% -61.01%
==========================================
Files 244 296 +52
Lines 25775 47245 +21470
Branches 0 432 +432
==========================================
- Hits 16085 662 -15423
- Misses 8314 46297 +37983
+ Partials 1376 286 -1090
🚀 New features to boost your workflow:
|
Aenimus
left a comment
There was a problem hiding this comment.
Please can we check why these files are changing to double quotations rather than single?
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
studio/src/components/analytics/defaultFilterFunction.ts (1)
35-52:⚠️ Potential issue | 🟠 MajorUse
includes()instead ofindexOf()to properly check operator membership.The
indexOf()call returns-1when the operator is not found in the array, and-1is truthy in JavaScript, soif (-1)executes. This causes the simple comparison operators (EQUALS,NOT_EQUALS,GREATER_THAN,LESS_THAN,GREATER_THAN_OR_EQUAL,LESS_THAN_OR_EQUAL) to have their comparison results overwritten byisFiltered = trueon line 51. The exception isCONTAINS(index0), which is falsy and accidentally skipped. UseArray.prototype.includes(), which returns a boolean, to properly gate the server-handled operators.🐛 Proposed fix
if ( [ AnalyticsViewFilterOperator.CONTAINS, AnalyticsViewFilterOperator.NOT_CONTAINS, AnalyticsViewFilterOperator.IN, AnalyticsViewFilterOperator.NOT_IN, AnalyticsViewFilterOperator.BETWEEN, AnalyticsViewFilterOperator.NOT_BETWEEN, AnalyticsViewFilterOperator.IS_NULL, AnalyticsViewFilterOperator.IS_NOT_NULL, - ].indexOf(filterOption.operator) + ].includes(filterOption.operator) ) { // complex filter operations - let server handle it isFiltered = true; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/components/analytics/defaultFilterFunction.ts` around lines 35 - 52, Replace the truthy indexOf check with a boolean membership check: in the condition that currently uses [...].indexOf(filterOption.operator) (inside defaultFilterFunction / the block that sets isFiltered based on AnalyticsViewFilterOperator values), use Array.prototype.includes to test membership (e.g., [...].includes(filterOption.operator)) so the condition correctly evaluates to true only when the operator is one of the server-handled operators and does not accidentally override earlier isFiltered assignments.studio/src/hooks/use-hydrate-playground-state-from-url.ts (1)
107-114:⚠️ Potential issue | 🟠 MajorPersist the script
typewhen hydrating the selected operation scripts.
setPreOpSelectedandsetPostOpSelectednow store the raw URL payload, butstudio/src/components/playground/custom-scripts.tsxtreats the selected entries asPlaygroundScriptand later routes updates viascript.type. Hydrating without'pre-operation'/'post-operation'leaves that state incomplete and can send later edits down an undefined key.🧩 Proposed fix
if (preOperation) { updated[newTabId]['pre-operation'] = preOperation; - setPreOpSelected(preOperation); + setPreOpSelected({ ...preOperation, type: 'pre-operation' }); } if (postOperation) { updated[newTabId]['post-operation'] = postOperation; - setPostOpSelected(postOperation); + setPostOpSelected({ ...postOperation, type: 'post-operation' }); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/hooks/use-hydrate-playground-state-from-url.ts` around lines 107 - 114, When hydrating selected operation scripts, the code calls setPreOpSelected and setPostOpSelected with the raw URL payload but does not include the script "type", causing components like custom-scripts.tsx to later access script.type and fail; update the hydration to store a full PlaygroundScript-shaped object for pre-operation and post-operation (i.e., include the "type" field matching 'pre-operation' / 'post-operation' and any other required PlaygroundScript properties) when assigning updated[newTabId]['pre-operation'] and updated[newTabId]['post-operation'] and before calling setPreOpSelected / setPostOpSelected so the selected state contains the expected type key.
🧹 Nitpick comments (3)
studio/src/lib/track.ts (1)
7-12: Consider removing dead code:window.kodeclaration.The
ko: anydeclaration on line 9 is unused. Based on learnings, all references towindow.ko(Koala tracking) should be removed as it is no longer used. This will clean up the file and reduce potential confusion.♻️ Proposed fix to remove dead code
declare global { interface Window { - ko: any; Reo: any; } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/lib/track.ts` around lines 7 - 12, Remove the dead Koala tracking declaration by deleting the `ko: any` entry from the global Window interface and any corresponding references to `window.ko` in this module; specifically edit the `declare global { interface Window { ... } }` block to drop `ko: any` and search for/remove usages of `window.ko` (or plain `ko`) in functions or exports in this file such as anything in track.ts that references Koala tracking so the code no longer declares or references the unused symbol.studio/src/lib/schema-helpers.ts (1)
796-803: Regex escaping appears adequate, but consider alternative.The static analysis tool flags potential ReDoS risk at line 799. The current escaping approach (
replaceAll(/[^_0-9A-Za-z]/g, ...)) should mitigate this by escaping special regex characters. However, for clearer intent and safety, consider using a dedicated regex escape utility.♻️ Optional: Use explicit regex escape pattern
function isMatch(sourceText: string, searchValue: string): boolean { try { - const escaped = searchValue.replaceAll(/[^_0-9A-Za-z]/g, (ch) => '\\' + ch); + // Escape all regex metacharacters: \ ^ $ . | ? * + ( ) [ ] { } + const escaped = searchValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return sourceText.search(new RegExp(escaped, 'i')) !== -1; } catch { return sourceText.toLowerCase().includes(searchValue.toLowerCase()); } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/lib/schema-helpers.ts` around lines 796 - 803, The isMatch function uses a custom replaceAll to escape regex metacharacters which triggered a ReDoS warning; replace this with a dedicated, well-known regex-escaping utility or a small deterministic escape function (e.g. escapeRegExp that replaces all characters in the class [.*+?^${}()|[\]\\] with a backslash) and use its output to build new RegExp(escaped, 'i'); update isMatch to call that escape function (and you can remove the broad try/catch or keep it as a fallback) so escaping intent is explicit and safer.studio/src/hooks/use-share-playground-modal.ts (1)
164-176: Keep thesetSelectedOptionsupdater pure.React can invoke state updaters more than once in Strict Mode. Calling
generateShareableUrlfrom inside the updater makes this callback impure and can duplicate the state updates/toasts in development. Regenerate from an effect or after computing the next options object outsidesetSelectedOptions, then verify the toggle flow under React 18 Strict Mode.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@studio/src/hooks/use-share-playground-modal.ts` around lines 164 - 176, handleOptionChange currently calls generateShareableUrl from inside the setSelectedOptions updater, making the updater impure; change it so you compute the next options object (e.g., const updated = { ...selectedOptions, [id]: !!checked } or derive it outside the updater), then call setSelectedOptions(updated) and invoke generateShareableUrl(updated) only after (or move the share URL generation into a useEffect that watches selectedOptions), ensuring the setSelectedOptions updater remains a pure function; update references to handleOptionChange, setSelectedOptions, and generateShareableUrl accordingly and verify behavior under React 18 Strict Mode.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@studio/src/hooks/use-share-playground-modal.ts`:
- Around line 127-135: The catch block in use-share-playground-modal leaves
stale values in shareableUrl and warning after a failed generate, so reset the
cached share state there: inside the catch for the URL generation in the
useSharePlaygroundModal hook, clear/reset shareableUrl and warning (and
optionally isGenerating) back to their initial/empty values so the modal won’t
show an outdated link after an error; locate the variables shareableUrl and
warning in the hook and set them to undefined/empty in the catch before/after
showing the toast.
---
Outside diff comments:
In `@studio/src/components/analytics/defaultFilterFunction.ts`:
- Around line 35-52: Replace the truthy indexOf check with a boolean membership
check: in the condition that currently uses [...].indexOf(filterOption.operator)
(inside defaultFilterFunction / the block that sets isFiltered based on
AnalyticsViewFilterOperator values), use Array.prototype.includes to test
membership (e.g., [...].includes(filterOption.operator)) so the condition
correctly evaluates to true only when the operator is one of the server-handled
operators and does not accidentally override earlier isFiltered assignments.
In `@studio/src/hooks/use-hydrate-playground-state-from-url.ts`:
- Around line 107-114: When hydrating selected operation scripts, the code calls
setPreOpSelected and setPostOpSelected with the raw URL payload but does not
include the script "type", causing components like custom-scripts.tsx to later
access script.type and fail; update the hydration to store a full
PlaygroundScript-shaped object for pre-operation and post-operation (i.e.,
include the "type" field matching 'pre-operation' / 'post-operation' and any
other required PlaygroundScript properties) when assigning
updated[newTabId]['pre-operation'] and updated[newTabId]['post-operation'] and
before calling setPreOpSelected / setPostOpSelected so the selected state
contains the expected type key.
---
Nitpick comments:
In `@studio/src/hooks/use-share-playground-modal.ts`:
- Around line 164-176: handleOptionChange currently calls generateShareableUrl
from inside the setSelectedOptions updater, making the updater impure; change it
so you compute the next options object (e.g., const updated = {
...selectedOptions, [id]: !!checked } or derive it outside the updater), then
call setSelectedOptions(updated) and invoke generateShareableUrl(updated) only
after (or move the share URL generation into a useEffect that watches
selectedOptions), ensuring the setSelectedOptions updater remains a pure
function; update references to handleOptionChange, setSelectedOptions, and
generateShareableUrl accordingly and verify behavior under React 18 Strict Mode.
In `@studio/src/lib/schema-helpers.ts`:
- Around line 796-803: The isMatch function uses a custom replaceAll to escape
regex metacharacters which triggered a ReDoS warning; replace this with a
dedicated, well-known regex-escaping utility or a small deterministic escape
function (e.g. escapeRegExp that replaces all characters in the class
[.*+?^${}()|[\]\\] with a backslash) and use its output to build new
RegExp(escaped, 'i'); update isMatch to call that escape function (and you can
remove the broad try/catch or keep it as a fallback) so escaping intent is
explicit and safer.
In `@studio/src/lib/track.ts`:
- Around line 7-12: Remove the dead Koala tracking declaration by deleting the
`ko: any` entry from the global Window interface and any corresponding
references to `window.ko` in this module; specifically edit the `declare global
{ interface Window { ... } }` block to drop `ko: any` and search for/remove
usages of `window.ko` (or plain `ko`) in functions or exports in this file such
as anything in track.ts that references Koala tracking so the code no longer
declares or references the unused symbol.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 880b3e23-972e-43d5-b630-dd49072ee677
📒 Files selected for processing (73)
studio/next.config.mjsstudio/prettier.config.jsstudio/sentry.client.config.tsstudio/sentry.edge.config.tsstudio/sentry.server.config.tsstudio/src/__tests__/lint-page.test.tsstudio/src/__tests__/playground-url-state-encoding-decoding.test.tsstudio/src/__tests__/schema-helpers.test.tsstudio/src/components/analytics/constructAnalyticsTableQueryState.tsstudio/src/components/analytics/defaultFilterFunction.tsstudio/src/components/analytics/getDataTableFilters.tsstudio/src/components/analytics/useAnalyticsQueryState.tsstudio/src/components/analytics/useSyncTableWithQuery.tsstudio/src/components/checks/use-open-usage.tsstudio/src/components/member-groups/use-group-resources.tsstudio/src/components/playground/prettyPrint.tsstudio/src/components/playground/types.tsstudio/src/components/schema/monaco-dark-theme.tsstudio/src/components/ui/use-toast.tsstudio/src/env.mjsstudio/src/hooks/use-check-user-access.tsstudio/src/hooks/use-cookie-organization.tsstudio/src/hooks/use-cookie.tsstudio/src/hooks/use-current-organization.tsstudio/src/hooks/use-current-plan.tsstudio/src/hooks/use-event-callback.tsstudio/src/hooks/use-event-listener.tsstudio/src/hooks/use-feature-limit.tsstudio/src/hooks/use-feature.tsstudio/src/hooks/use-fireworks.tsstudio/src/hooks/use-form.tsstudio/src/hooks/use-hash.tsstudio/src/hooks/use-hydrate-playground-state-from-url.tsstudio/src/hooks/use-is-admin.tsstudio/src/hooks/use-is-creator.tsstudio/src/hooks/use-isomorphic-layout-effect.tsstudio/src/hooks/use-local-storage.tsstudio/src/hooks/use-new-features-popup-disabled.tsstudio/src/hooks/use-pagination-params.tsstudio/src/hooks/use-resolved-theme.tsstudio/src/hooks/use-roles.tsstudio/src/hooks/use-session-storage.tsstudio/src/hooks/use-share-playground-modal.tsstudio/src/hooks/use-star-banner-disabled.tsstudio/src/hooks/use-subgraph.tsstudio/src/hooks/use-subscription.tsstudio/src/hooks/use-user.tsstudio/src/hooks/use-window-size.tsstudio/src/hooks/use-workspace.tsstudio/src/instrumentation.tsstudio/src/lib/constants.tsstudio/src/lib/download-string-as-file.tsstudio/src/lib/format-date.tsstudio/src/lib/format-metric.tsstudio/src/lib/format-number.tsstudio/src/lib/format-status.tsstudio/src/lib/insights-helpers.tsstudio/src/lib/page.d.tsstudio/src/lib/playground-storage.tsstudio/src/lib/playground-url-state-decoding.tsstudio/src/lib/playground-url-state-encoding.tsstudio/src/lib/posthog.tsstudio/src/lib/schema-helpers.tsstudio/src/lib/signup-content.tsstudio/src/lib/stripe.tsstudio/src/lib/trace-utils.tsstudio/src/lib/track.tsstudio/src/lib/utils.tsstudio/src/pages/_error.jsxstudio/src/styles/globals.cssstudio/src/styles/utils.cssstudio/tailwind.config.jsstudio/vitest.config.mts
✅ Files skipped from review due to trivial changes (24)
- studio/src/hooks/use-subscription.ts
- studio/tailwind.config.js
- studio/src/lib/posthog.ts
- studio/src/components/schema/monaco-dark-theme.ts
- studio/src/hooks/use-local-storage.ts
- studio/src/hooks/use-feature.ts
- studio/src/hooks/use-isomorphic-layout-effect.ts
- studio/src/hooks/use-feature-limit.ts
- studio/src/pages/_error.jsx
- studio/src/hooks/use-is-admin.ts
- studio/src/hooks/use-user.ts
- studio/src/hooks/use-subgraph.ts
- studio/src/hooks/use-is-creator.ts
- studio/sentry.server.config.ts
- studio/src/tests/lint-page.test.ts
- studio/src/components/analytics/useAnalyticsQueryState.ts
- studio/vitest.config.mts
- studio/src/hooks/use-current-plan.ts
- studio/src/hooks/use-window-size.ts
- studio/src/components/ui/use-toast.ts
- studio/src/components/checks/use-open-usage.ts
- studio/src/lib/format-status.ts
- studio/src/hooks/use-cookie.ts
- studio/src/lib/playground-storage.ts
🚧 Files skipped from review as they are similar to previous changes (14)
- studio/src/lib/format-number.ts
- studio/src/lib/insights-helpers.ts
- studio/src/lib/playground-url-state-encoding.ts
- studio/src/hooks/use-new-features-popup-disabled.ts
- studio/src/hooks/use-workspace.ts
- studio/src/lib/signup-content.ts
- studio/src/lib/download-string-as-file.ts
- studio/src/lib/constants.ts
- studio/src/lib/playground-url-state-decoding.ts
- studio/src/hooks/use-pagination-params.ts
- studio/next.config.mjs
- studio/src/hooks/use-form.ts
- studio/src/components/analytics/useSyncTableWithQuery.ts
- studio/src/hooks/use-fireworks.ts
…-drift-enforce-formatting-in-ci-pt2
Summary by CodeRabbit
Style
Chores
Checklist
Fixes formatting drift in studio just for *.ts, *.css, *.md files. There will be follow up PR(s) to fix rest