Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
d381eef
fix(mcp): pin outbound connections to IPv4 to avoid unreachable-IPv6 …
waleedlatif1 Jul 21, 2026
3507934
fix(security): prefer IPv4 when pinning DB and 1Password connections …
waleedlatif1 Jul 21, 2026
7b8bbeb
fix(emails): sharpen wordmark, add clear space, and standardize foote…
waleedlatif1 Jul 21, 2026
53f8ce5
fix(emails): keep custom whitelabel logos at height 34, not the padde…
waleedlatif1 Jul 21, 2026
e01cd2c
fix(csp): allow X (Twitter) conversion pixel domains on hosted (#5804)
waleedlatif1 Jul 21, 2026
f6944b6
feat(models): sunset tiers for models mirroring blocks (legacy amber …
TheodoreSpeaks Jul 21, 2026
7db9108
fix(mcp): bound OAuth callback steps and log each phase to pinpoint h…
waleedlatif1 Jul 21, 2026
5be35b5
improvement(slack): merge slack_v2 auth into one credential picker fo…
TheodoreSpeaks Jul 21, 2026
da56246
chore(ci): add CI_PROVIDER toggle between Blacksmith and GitHub-hoste…
TheodoreSpeaks Jul 21, 2026
6e5f685
improvement(mcp): let users re-open OAuth authorization anytime (#5809)
waleedlatif1 Jul 21, 2026
108fea1
feat(providers): add Gemini 3.6 Flash and 3.5 Flash-Lite (#5812)
waleedlatif1 Jul 21, 2026
94b2334
improvement(emcn): consistent hugging tab bars via ChipModalTabs (#5815)
waleedlatif1 Jul 21, 2026
d35bc77
fix(mcp): don't blank the MCP tools page when tool discovery fails (#…
waleedlatif1 Jul 21, 2026
37628f1
fix(workflow-persistence): make persistMigratedBlocks' updated_at gua…
icecrasher321 Jul 21, 2026
407c729
fix(custom-blocks): render and execute custom blocks as agent tools (…
TheodoreSpeaks Jul 21, 2026
7ee8f46
feat(access-control): per-group chat-deploy auth modes + polish (#5818)
waleedlatif1 Jul 21, 2026
bcad4e3
fix(pii): mask offloaded large payloads chunk-by-chunk instead of abo…
TheodoreSpeaks Jul 21, 2026
051c86f
fix(mcp): keep the pooled connection warm on a request timeout (#5817)
waleedlatif1 Jul 21, 2026
9fb9ac5
diag(mcp): per-request phase logging on the streamable-HTTP transport…
waleedlatif1 Jul 21, 2026
6f96d4a
fix(mcp): retire pooled connections after consecutive request timeout…
waleedlatif1 Jul 21, 2026
daa2416
improvement(search-modal): remove matched-character bolding and move …
waleedlatif1 Jul 21, 2026
995167d
improvement(admin): cleanup included usage settings for enterprise (#…
icecrasher321 Jul 21, 2026
4b97978
fix(ci): make GitHub-hosted fallback actually build and test (#5814)
TheodoreSpeaks Jul 21, 2026
e9898ea
fix(ci): run Build App on the larger runner in GitHub mode (#5826)
TheodoreSpeaks Jul 22, 2026
3458220
fix(mcp): replace single-IP pinning with validate-at-connect SSRF gua…
waleedlatif1 Jul 22, 2026
e51a867
fix(mcp): open the OAuth popup synchronously and bound the start requ…
waleedlatif1 Jul 22, 2026
e3f9deb
fix(slack): allow empty status to clear the assistant status indicato…
TheodoreSpeaks Jul 22, 2026
1f9f65d
improvement(mcp): make the OAuth experience visible and verbally cons…
waleedlatif1 Jul 22, 2026
a360cd4
fix(workflow): align condition/router handles with their rows (#5831)
waleedlatif1 Jul 22, 2026
1b48eeb
improvement(subblocks): trust block registry over stored subblock typ…
icecrasher321 Jul 22, 2026
2cbecb5
improvement(mothership): stable thinking indicator and jump-free stre…
TheodoreSpeaks Jul 22, 2026
64353f2
feat(library): Best AI Agents for Data Extraction and RAG in 2026 (#5…
icecrasher321 Jul 22, 2026
943d184
fix(mcp): follow tools/list pagination instead of silently truncating…
waleedlatif1 Jul 22, 2026
93fbf58
feat(chat): soft-delete sidebar chats with restore from Recently Dele…
waleedlatif1 Jul 22, 2026
1410aae
fix(auth): gate email-otp auto-signup behind DISABLE_EMAIL_SIGNUP (#5…
waleedlatif1 Jul 22, 2026
c708add
fix(mcp): keep last-known-good tools instead of flashing red on a tra…
waleedlatif1 Jul 22, 2026
e0e6f24
improvement(deployments): shorten lock windows and add tx safety time…
waleedlatif1 Jul 22, 2026
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
36 changes: 36 additions & 0 deletions .github/actions/cache-mount/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Cache Mount
description: Mount a build cache directory using Blacksmith sticky disks, or the GitHub Actions cache when running on GitHub-hosted runners.

inputs:
provider:
description: Empty or 'blacksmith' selects sticky disks; anything else selects actions/cache.
required: false
default: ''
key:
description: Cache key, shared by both backends.
required: true
path:
description: Path to mount.
required: true

# Predicates must stay the exact complement of the caller's runs-on — stickydisk
# only runs on Blacksmith.
runs:
using: composite
steps:
- name: Mount sticky disk
if: inputs.provider == '' || inputs.provider == 'blacksmith'
uses: useblacksmith/stickydisk@4c034ba57b706cf0e3b4b0ce098c2a3b1071580c # v1
with:
key: ${{ inputs.key }}
path: ${{ inputs.path }}

# run_id suffix + prefix restore-key: actions/cache skips save on an exact hit,
# which would freeze the cache at the first run's contents.
- name: Restore and save cache
if: inputs.provider != '' && inputs.provider != 'blacksmith'
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
key: ${{ inputs.key }}-${{ github.run_id }}
restore-keys: ${{ inputs.key }}-
path: ${{ inputs.path }}
59 changes: 59 additions & 0 deletions .github/actions/docker-build/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Docker Build and Push
description: Set up a buildx builder and build/push an image, using Blacksmith's builder or the upstream Docker actions on GitHub-hosted runners.

inputs:
provider:
description: Empty or 'blacksmith' selects Blacksmith's builder; anything else selects the docker/* actions.
required: false
default: ''
context:
description: Build context.
required: false
default: .
file:
description: Path to the Dockerfile.
required: true
platforms:
description: Target platforms, e.g. linux/amd64.
required: true
tags:
description: Comma-separated list of tags to push.
required: true

# Registry logins must precede this action. provenance/sbom stay off: attestation
# manifests break `imagetools create` retagging in promote-images.
runs:
using: composite
steps:
- name: Set up Blacksmith builder
if: inputs.provider == '' || inputs.provider == 'blacksmith'
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1

- name: Build and push (Blacksmith)
if: inputs.provider == '' || inputs.provider == 'blacksmith'
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
with:
context: ${{ inputs.context }}
file: ${{ inputs.file }}
platforms: ${{ inputs.platforms }}
push: true
tags: ${{ inputs.tags }}
provenance: false
sbom: false

- name: Set up Docker Buildx
if: inputs.provider != '' && inputs.provider != 'blacksmith'
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4

# No cache-to: type=gha — it shares the 10 GB repo quota with the cache mounts.
- name: Build and push (GitHub)
if: inputs.provider != '' && inputs.provider != 'blacksmith'
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7
with:
context: ${{ inputs.context }}
file: ${{ inputs.file }}
platforms: ${{ inputs.platforms }}
push: true
tags: ${{ inputs.tags }}
provenance: false
sbom: false
77 changes: 44 additions & 33 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
name: CI

# Runner provider toggle, read from the CI_PROVIDER repo variable:
#
# gh variable set CI_PROVIDER --body github # fall back to GitHub-hosted
# gh variable delete CI_PROVIDER # back to Blacksmith (default)
#
# A repo variable, not a committed value: during a Blacksmith outage there is no
# working CI to merge a switchover through. Only unset/'blacksmith' selects
# Blacksmith; anything unrecognized selects GitHub so a typo can't queue jobs
# against the provider you're escaping. Every runs-on and both composite actions
# share this predicate and must change together.
#
# GitHub mode is break-glass, not a peer — cold layers, slower runs. The app image
# is the one job on a paid larger runner: next build needs ~32 GB and OOM-kills
# (exit 137) on the free 16 GB runners at any heap ceiling.

on:
push:
branches: [main, staging, dev]
Expand Down Expand Up @@ -28,7 +43,7 @@ jobs:
# Detect if this is a version release commit (e.g., "v0.5.24: ...")
detect-version:
name: Detect Version
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 5
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/dev')
outputs:
Expand Down Expand Up @@ -81,7 +96,7 @@ jobs:
name: Build Dev ECR
needs: [detect-version, migrate-dev]
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
runs-on: blacksmith-8vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || matrix.gh_runner }}
timeout-minutes: 30
permissions:
contents: read
Expand All @@ -90,14 +105,20 @@ jobs:
fail-fast: false
matrix:
include:
# Only the app image needs the paid 8-core/32 GB runner: next build
# exhausts the free 16 GB one (exit 137). The others build in <5 min.
- dockerfile: ./docker/app.Dockerfile
ecr_repo_secret: ECR_APP
gh_runner: linux-x64-8-core
- dockerfile: ./docker/db.Dockerfile
ecr_repo_secret: ECR_MIGRATIONS
gh_runner: ubuntu-latest
- dockerfile: ./docker/realtime.Dockerfile
ecr_repo_secret: ECR_REALTIME
gh_runner: ubuntu-latest
- dockerfile: ./docker/pii.Dockerfile
ecr_repo_secret: ECR_PII
gh_runner: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
Expand All @@ -118,25 +139,19 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up Docker Buildx
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1

- name: Resolve ECR repo name
id: ecr-repo
run: echo "name=$ECR_REPO" >> $GITHUB_OUTPUT
env:
ECR_REPO: ${{ matrix.ecr_repo_secret == 'ECR_APP' && secrets.ECR_APP || matrix.ecr_repo_secret == 'ECR_MIGRATIONS' && secrets.ECR_MIGRATIONS || matrix.ecr_repo_secret == 'ECR_REALTIME' && secrets.ECR_REALTIME || matrix.ecr_repo_secret == 'ECR_PII' && secrets.ECR_PII || '' }}

- name: Build and push
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
uses: ./.github/actions/docker-build
with:
context: .
provider: ${{ vars.CI_PROVIDER }}
file: ${{ matrix.dockerfile }}
platforms: linux/amd64
push: true
tags: ${{ steps.login-ecr.outputs.registry }}/${{ steps.ecr-repo.outputs.name }}:dev
provenance: false
sbom: false

# Dev: deploy Trigger.dev background tasks to the preview "dev-sim" branch.
# Gated after migrate-dev for the same reason as build-dev — the new task
Expand All @@ -145,7 +160,7 @@ jobs:
name: Deploy Trigger.dev (Dev)
needs: [migrate-dev]
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 15
steps:
- name: Checkout code
Expand Down Expand Up @@ -192,7 +207,7 @@ jobs:
if: >-
github.event_name == 'push' &&
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
runs-on: blacksmith-8vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || matrix.gh_runner }}
timeout-minutes: 30
permissions:
contents: read
Expand All @@ -205,15 +220,19 @@ jobs:
- dockerfile: ./docker/app.Dockerfile
ghcr_image: ghcr.io/simstudioai/simstudio
ecr_repo_secret: ECR_APP
gh_runner: linux-x64-8-core
- dockerfile: ./docker/db.Dockerfile
ghcr_image: ghcr.io/simstudioai/migrations
ecr_repo_secret: ECR_MIGRATIONS
gh_runner: ubuntu-latest
- dockerfile: ./docker/realtime.Dockerfile
ghcr_image: ghcr.io/simstudioai/realtime
ecr_repo_secret: ECR_REALTIME
gh_runner: ubuntu-latest
- dockerfile: ./docker/pii.Dockerfile
ghcr_image: ghcr.io/simstudioai/pii
ecr_repo_secret: ECR_PII
gh_runner: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
Expand Down Expand Up @@ -242,9 +261,6 @@ jobs:
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1

- name: Resolve ECR repo name
id: ecr-repo
run: echo "name=$ECR_REPO" >> $GITHUB_OUTPUT
Expand All @@ -270,15 +286,12 @@ jobs:
echo "tags=${TAGS}" >> $GITHUB_OUTPUT

- name: Build and push images
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
uses: ./.github/actions/docker-build
with:
context: .
provider: ${{ vars.CI_PROVIDER }}
file: ${{ matrix.dockerfile }}
platforms: linux/amd64
push: true
tags: ${{ steps.meta.outputs.tags }}
provenance: false
sbom: false

# Promote the sha-tagged ECR images to the deploy tags once tests and
# migrations pass. Pushing the ECR latest/staging tag is what triggers
Expand All @@ -292,7 +305,7 @@ jobs:
if: >-
github.event_name == 'push' &&
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
runs-on: blacksmith-2vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-2vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 10
permissions:
contents: read
Expand Down Expand Up @@ -362,7 +375,7 @@ jobs:
# never moves a documented tag.
build-ghcr-arm64:
name: Build ARM64 (GHCR Only)
runs-on: blacksmith-8vcpu-ubuntu-2404-arm
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404-arm' || matrix.gh_runner }}
timeout-minutes: 30
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
permissions:
Expand All @@ -374,12 +387,16 @@ jobs:
include:
- dockerfile: ./docker/app.Dockerfile
image: ghcr.io/simstudioai/simstudio
gh_runner: linux-arm64-8-core
- dockerfile: ./docker/db.Dockerfile
image: ghcr.io/simstudioai/migrations
gh_runner: ubuntu-24.04-arm
- dockerfile: ./docker/realtime.Dockerfile
image: ghcr.io/simstudioai/realtime
gh_runner: ubuntu-24.04-arm
- dockerfile: ./docker/pii.Dockerfile
image: ghcr.io/simstudioai/pii
gh_runner: ubuntu-24.04-arm

steps:
- name: Checkout code
Expand All @@ -392,26 +409,20 @@ jobs:
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1

- name: Build and push ARM64 to GHCR
uses: useblacksmith/build-push-action@fb9e3e6a9299c78462bfadd0d93352c316adc9b8 # v2
uses: ./.github/actions/docker-build
with:
context: .
provider: ${{ vars.CI_PROVIDER }}
file: ${{ matrix.dockerfile }}
platforms: linux/arm64
push: true
tags: ${{ matrix.image }}:${{ github.sha }}-arm64
provenance: false
sbom: false

# Publish all mutable GHCR tags (latest, latest-amd64/arm64, version tags)
# and the multi-arch manifests from the immutable sha tags — only on main,
# after the deploy gate (promote-images) and the ARM64 build both pass.
create-ghcr-manifests:
name: Create GHCR Manifests
runs-on: blacksmith-2vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-2vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 10
needs: [promote-images, build-ghcr-arm64, detect-version]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
Expand Down Expand Up @@ -477,7 +488,7 @@ jobs:
# Check if docs changed
check-docs-changes:
name: Check Docs Changes
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 5
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
outputs:
Expand Down Expand Up @@ -506,7 +517,7 @@ jobs:
# Create GitHub Release (only for version commits on main, after all builds complete)
create-release:
name: Create GitHub Release
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 10
needs: [create-ghcr-manifests, detect-version]
if: needs.detect-version.outputs.is_release == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs-embeddings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ permissions:
jobs:
process-docs-embeddings:
name: Process Documentation Embeddings
runs-on: blacksmith-8vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 30
if: github.ref == 'refs/heads/main'

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/migrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ permissions:
jobs:
migrate:
name: Apply Database Migrations
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 45

steps:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ permissions:

jobs:
publish-npm:
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 15
steps:
- name: Checkout repository
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-python-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ permissions:

jobs:
publish-pypi:
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 15
steps:
- name: Checkout repository
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-ts-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ permissions:

jobs:
publish-npm:
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 15
steps:
- name: Checkout repository
Expand Down
Loading
Loading