Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
**/.output
**/.nuxt
**/.nuxt-storybook
**/.storybook
Expand Down
42 changes: 10 additions & 32 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1360,27 +1360,17 @@ jobs:
git clone -b develop https://oauth2:${GITLAB_SAAS_PAT}@gitlab.com/baserow/baserow-saas.git saas
cd saas

- name: Update image version files
- name: Update baserow submodule to current commit
working-directory: saas
run: |
echo "🧩 Generating updated image references..."

BACKEND_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_REPO }}/backend:ci-tested-${{ env.REAL_GITHUB_SHA }}"
BACKEND_DEV_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_REPO }}/backend_dev:ci-${{ env.REAL_GITHUB_SHA }}"
WEB_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_REPO }}/web-frontend:ci-tested-${{ env.REAL_GITHUB_SHA }}"
WEB_DEV_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_REPO }}/web-frontend_dev:ci-${{ env.REAL_GITHUB_SHA }}"
ALL_IN_ONE_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_REPO }}/baserow:ci-tested-${{ env.REAL_GITHUB_SHA }}"

echo "$BACKEND_IMAGE" > plugins/saas/backend/build_from_image.version
echo "$BACKEND_DEV_IMAGE" > plugins/saas/backend/build_from_dev_image.version
echo "$WEB_IMAGE" > plugins/saas/web-frontend/build_from_image.version
echo "$WEB_DEV_IMAGE" > plugins/saas/web-frontend/build_from_dev_image.version
echo "$ALL_IN_ONE_IMAGE" > all_in_one_image.version

echo "✅ Updated image references:"
cat plugins/saas/backend/build_from_image.version
cat plugins/saas/web-frontend/build_from_image.version
cat all_in_one_image.version
echo "🔄 Updating baserow submodule to ${{ github.sha }}..."
git submodule update --init
cd baserow
git fetch origin
git checkout ${{ github.sha }}
cd ..
git add baserow
echo "✅ Submodule updated."

- name: Commit and push changes to GitLab
working-directory: saas
Expand All @@ -1390,24 +1380,12 @@ jobs:
git config user.name "${GIT_USER_NAME}"
git config user.email "${GIT_USER_EMAIL}"

git add \
plugins/saas/backend/build_from_image.version \
plugins/saas/backend/build_from_dev_image.version \
plugins/saas/web-frontend/build_from_image.version \
plugins/saas/web-frontend/build_from_dev_image.version \
all_in_one_image.version

if git diff-index --quiet HEAD --; then
echo "No changes detected — skipping commit."
exit 0
fi

COMMIT_MSG="Automatic core image bump:
- backend: ${BACKEND_IMAGE}
- web-frontend: ${WEB_IMAGE}
- all-in-one: ${ALL_IN_ONE_IMAGE}"

git commit -m "$COMMIT_MSG"
git commit -m "Automatic baserow submodule bump to ${{ github.sha }}"
git push origin develop

echo "✅ Successfully pushed updates to baserow-saas."
3 changes: 1 addition & 2 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
procps \
tmux \
vim \
lsof \
sudo

ENV DOCKER_USER=baserow_docker_user \
Expand Down Expand Up @@ -303,9 +304,7 @@ RUN echo "set -g default-command \"\${SHELL}\"" > /baserow/.tmux.conf && \
'echo " j - See available commands"' \
> /baserow/.bashrc

COPY --chown=$UID:$GID LICENSE /baserow/LICENSE
COPY --chown=$UID:$GID backend/docker/docker-entrypoint.sh /baserow/backend/docker/docker-entrypoint.sh

RUN dos2unix /baserow/backend/docker/docker-entrypoint.sh \
&& chmod a+x /baserow/backend/docker/docker-entrypoint.sh

Expand Down
4 changes: 4 additions & 0 deletions backend/src/baserow/api/user/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,3 +471,7 @@ class ShareOnboardingDetailsWithBaserowSerializer(serializers.Serializer):
help_text="The country that the user has chosen during the onboarding.",
required=True,
)
how = serializers.CharField(
help_text="How the user found Baserow.",
required=True,
)
7 changes: 6 additions & 1 deletion backend/src/baserow/api/user/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,12 @@ class ShareOnboardingDetailsWithBaserowView(APIView):
@validate_body(ShareOnboardingDetailsWithBaserowSerializer)
def post(self, request, data):
UserHandler().start_share_onboarding_details_with_baserow(
request.user, data["team"], data["role"], data["size"], data["country"]
request.user,
data["team"],
data["role"],
data["size"],
data["country"],
data["how"],
)

return Response(status=204)
21 changes: 18 additions & 3 deletions backend/src/baserow/core/user/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -945,7 +945,13 @@ def send_email():
)(send_email)()

def start_share_onboarding_details_with_baserow(
self, user, team: str, role: str, size: str, country: str
self,
user,
team: str,
role: str,
size: str,
country: str,
how: str,
):
"""
Starts a celery task that shares some user information with baserow.io. Note
Expand All @@ -962,10 +968,17 @@ def start_share_onboarding_details_with_baserow(
email = user.email

share_onboarding_details_with_baserow.delay(
email=email, team=team, role=role, size=size, country=country
email=email,
team=team,
role=role,
size=size,
country=country,
how=how,
)

def share_onboarding_details_with_baserow(self, email, team, role, size, country):
def share_onboarding_details_with_baserow(
self, email, team, role, size, country, how
):
"""
Makes an API request to baserow.io that shares the additional information. Note
that this is only triggered if the user given permission during the onboarding
Expand All @@ -975,6 +988,7 @@ def share_onboarding_details_with_baserow(self, email, team, role, size, country
:param role: The role that the user shared.
:param size: The company size that the user shared.
:param country: The country name that the user shared.
:param how: How the user found Baserow.
"""

settings_object = CoreHandler().get_settings()
Expand All @@ -990,6 +1004,7 @@ def share_onboarding_details_with_baserow(self, email, team, role, size, country
"size": size,
"country": country,
"email": email,
"how": how,
"instance_id": settings_object.instance_id,
},
timeout=settings.ADDITIONAL_INFORMATION_TIMEOUT_SECONDS,
Expand Down
2 changes: 2 additions & 0 deletions backend/tests/baserow/api/users/test_user_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1247,6 +1247,7 @@ def test_share_onboarding_details_with_baserow(mock_task, client, data_fixture):
"role": "CEO",
"size": "11 - 50",
"country": "The Netherlands",
"how": "Google",
},
format="json",
HTTP_AUTHORIZATION=f"JWT {token}",
Expand All @@ -1260,6 +1261,7 @@ def test_share_onboarding_details_with_baserow(mock_task, client, data_fixture):
role="CEO",
size="11 - 50",
country="The Netherlands",
how="Google",
)


Expand Down
5 changes: 4 additions & 1 deletion backend/tests/baserow/core/user/test_user_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,7 @@ def test_start_share_onboarding_details_with_baserow(mock_task, data_fixture):
user = data_fixture.create_user()

UserHandler().start_share_onboarding_details_with_baserow(
user, "Marketing", "CEO", "11 - 50", "The Netherlands"
user, "Marketing", "CEO", "11 - 50", "The Netherlands", "Google"
)

mock_task.delay.assert_called_with(
Expand All @@ -801,6 +801,7 @@ def test_start_share_onboarding_details_with_baserow(mock_task, data_fixture):
role="CEO",
size="11 - 50",
country="The Netherlands",
how="Google",
)


Expand All @@ -822,6 +823,7 @@ def test_share_onboarding_details_with_baserow_valid_response(data_fixture):
"role": "CEO",
"size": "11 - 50",
"country": "The Netherlands",
"how": "Google",
"instance_id": "1",
}
)
Expand All @@ -834,6 +836,7 @@ def test_share_onboarding_details_with_baserow_valid_response(data_fixture):
role="CEO",
size="11 - 50",
country="The Netherlands",
how="Google",
)

assert response1.call_count == 1
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"type": "feature",
"message": "Add Kuma to onboarding and reorganize the steps.",
"issue_origin": "github",
"issue_number": null,
"domain": "core",
"bullet_points": [],
"created_at": "2026-01-30"
}
2 changes: 1 addition & 1 deletion deploy/all-in-one/supervisor/supervisor.conf
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ startsecs=30
[program:webfrontend]
user=%(ENV_DOCKER_USER)s
directory=/baserow/web-frontend
command=/baserow/supervisor/wrapper.sh YELLOW WEBFRONTEND ./docker/docker-entrypoint.sh %(ENV_BASEROW_WEB_FRONTEND_STARTUP_COMMAND)s
command=/baserow/supervisor/wrapper.sh YELLOW WEBFRONTEND node --import ./env-remap.mjs .output/server/index.mjs
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stdout
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@
@import 'file_input_element_form';
@import 'custom_code';
@import 'assistant';
@import 'assistant_onboarding';
@import 'date_dependency';
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
.assistant-onboarding {
margin-top: 20px;
width: 360px;
height: 210px;
display: flex;
flex-direction: column;
align-items: center;
}

.assistant-onboarding__logo {
margin-bottom: 10px;
}

.assistant-onboarding__title {
font-size: 20px;
font-weight: 500;
color: $palette-neutral-1200;
margin-bottom: 32px;
display: flex;
align-items: center;
}

.assistant-onboarding__title-icon {
color: $palette-cyan-700;
margin-right: 6px;
}

.assistant-onboarding__message {
display: flex;
background-color: $palette-cyan-50;
border: 1px solid $palette-cyan-200;
border-radius: 12px;
padding: 12px 16px;
overflow-wrap: break-word;
width: 100%;
}

.assistant-onboarding__loading-wrapper {
flex: 0 0 28px;
width: 28px;
}

.assistant-onboarding__loading {
@include loading(1.4rem, $palette-cyan-500);
}

.assistant-onboarding__text {
display: -webkit-box;
max-width: 100%;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
line-height: 20px;
color: $palette-cyan-700;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<template>
<div class="assistant-onboarding">
<div class="assistant-onboarding__logo">
<img :src="image" alt="kuma" width="56" height="56" />
</div>
<div class="assistant-onboarding__title">
<i class="iconoir-magic-wand assistant-onboarding__title-icon"></i>
Kuma is building your database
</div>
<div class="assistant-onboarding__message">
<div class="assistant-onboarding__loading-wrapper">
<div class="assistant-onboarding__loading"></div>
</div>
<div class="assistant-onboarding__text">
{{ message }}
</div>
</div>
</div>
</template>

<script>
import { mapGetters } from 'vuex'
import image from '@baserow_enterprise/assets/images/kuma.svg?url'

export default {
name: 'AssistantOnboardingMessage',
computed: {
...mapGetters({
messages: 'assistant/messages',
}),
message() {
const defaultMessage = this.$t('assistantOnboardingMessage.instructing')
const messages = Array.isArray(this.messages) ? this.messages : []
const lastReasoning = [...messages]
.reverse()
.find(
(m) =>
m?.role === 'ai' &&
m?.reasoning === true &&
typeof m?.content === 'string' &&
m.content.trim()
)
return lastReasoning?.content ?? defaultMessage
},
image() {
return image
},
},
}
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export default {
)
},
isConfigured() {
return this.$config.public.baserowEnterpriseAssistantLLMModel !== null
return !!this.$config.public.baserowEnterpriseAssistantLLMModel
},
},
mounted() {
Expand Down
Loading
Loading