diff --git a/README.md b/README.md index a4dd10811..1efadde90 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,9 @@ OpenReplay is a session replay suite you can host yourself, that lets you see wh - **Session replay:** Lets you relive your users' experience, see where they struggle and how it affects their behavior. Each session replay is automatically analyzed based on heuristics, for easy triage. - **DevTools:** It's like debugging in your own browser. OpenReplay provides you with the full context (network activity, JS errors, store actions/state and 40+ metrics) so you can instantly reproduce bugs and understand performance issues. - **Assist:** Helps you support your users by seeing their live screen and instantly hopping on call (WebRTC) with them without requiring any 3rd-party screen sharing software. +- **Feature flags:** Enable or disable a feature, make gradual releases and A/B test all without redeploying your app. - **Omni-search:** Search and filter by almost any user action/criteria, session attribute or technical event, so you can answer any question. No instrumentation required. -- **Funnels:** For surfacing the most impactful issues causing conversion and revenue loss. +- **Analytics:** For surfacing the most impactful issues causing conversion and revenue loss. - **Fine-grained privacy controls:** Choose what to capture, what to obscure or what to ignore so user data doesn't even reach your servers. - **Plugins oriented:** Get to the root cause even faster by tracking application state (Redux, VueX, MobX, NgRx, Pinia and Zustand) and logging GraphQL queries (Apollo, Relay) and Fetch/Axios requests. - **Integrations:** Sync your backend logs with your session replays and see what happened front-to-back. OpenReplay supports Sentry, Datadog, CloudWatch, Stackdriver, Elastic and more. diff --git a/api/routers/core.py b/api/routers/core.py index 3edcb9045..fa3037841 100644 --- a/api/routers/core.py +++ b/api/routers/core.py @@ -30,7 +30,7 @@ def events_search(projectId: int, q: str, return {"data": []} if live: return assist.autocomplete(project_id=projectId, q=q, - key=key if key is not None else type.value if type is not None else None) + key=key if key is not None else type) if type in [schemas.FetchFilterType._url]: type = schemas.EventType.request elif type in [schemas.GraphqlFilterType._name]: diff --git a/ee/api/clean-dev.sh b/ee/api/clean-dev.sh index 3e28345d6..37913fe91 100755 --- a/ee/api/clean-dev.sh +++ b/ee/api/clean-dev.sh @@ -93,4 +93,5 @@ rm -rf ./build_alerts.sh rm -rf ./run-dev.sh rm -rf ./run-alerts-dev.sh rm -rf ./schemas/overrides.py -rm -rf ./schemas/schemas.py \ No newline at end of file +rm -rf ./schemas/schemas.py +rm -rf ./schemas/transformers_validators.py \ No newline at end of file diff --git a/ee/api/schemas/schemas_ee.py b/ee/api/schemas/schemas_ee.py index a437c8152..2c1f49a36 100644 --- a/ee/api/schemas/schemas_ee.py +++ b/ee/api/schemas/schemas_ee.py @@ -113,7 +113,7 @@ class SessionModel(BaseModel): projectId: int sessionId: str startTs: int - timezone: str + timezone: Optional[str] userAnonymousId: Optional[str] userBrowser: str userCity: str diff --git a/ee/recommendation/ml_trainer/requirements.txt b/ee/recommendation/ml_trainer/requirements.txt index 4b6ae2175..7efa93d01 100644 --- a/ee/recommendation/ml_trainer/requirements.txt +++ b/ee/recommendation/ml_trainer/requirements.txt @@ -1,3 +1,3 @@ argcomplete==3.0.8 -apache-airflow==2.6.1 +apache-airflow==2.6.2 airflow-code-editor==7.2.1 diff --git a/frontend/app/components/Session_/Subheader.js b/frontend/app/components/Session_/Subheader.js index f0fb576f1..8bdb572b8 100644 --- a/frontend/app/components/Session_/Subheader.js +++ b/frontend/app/components/Session_/Subheader.js @@ -13,6 +13,8 @@ import { observer } from 'mobx-react-lite'; import AutoplayToggle from 'Shared/AutoplayToggle'; import { connect } from 'react-redux'; import SessionTabs from 'Components/Session/Player/SharedComponents/SessionTabs' +import { IFRAME } from 'App/constants/storageKeys'; +import cn from 'classnames'; const localhostWarn = (project) => project + '_localhost_warn'; @@ -22,6 +24,7 @@ function SubHeader(props) { const [showWarningModal, setWarning] = React.useState(defaultLocalhostWarn); const { player, store } = React.useContext(PlayerContext); const { width, height, endTime, location: currentLocation = 'loading...', } = store.get(); + const hasIframe = localStorage.getItem(IFRAME) === "true"; const enabledIntegration = useMemo(() => { @@ -104,7 +107,7 @@ function SubHeader(props) { ) : null}