Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
7a265d5
Add kernel runtime management with Docker containerization (#281)
Edwardvaneechoud Jan 31, 2026
b24fa27
Add Kernel Manager UI for Python execution environments (#282)
Edwardvaneechoud Jan 31, 2026
2f1ae51
Add artifact context tracking for python_script nodes (#283)
Edwardvaneechoud Jan 31, 2026
6efdf2a
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 1, 2026
e6657c6
Add Python Script node with kernel and artifact support (#287)
Edwardvaneechoud Feb 1, 2026
9ee26f6
Add kernel persistence and multi-user access control (#286)
Edwardvaneechoud Feb 1, 2026
8b875d3
Add kernel runtime management with Docker containerization (#281) (#290)
Edwardvaneechoud Feb 2, 2026
fc4049f
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 2, 2026
7adb95a
Implement selective artifact clearing for incremental flow execution …
Edwardvaneechoud Feb 2, 2026
102522b
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 2, 2026
69e0a3a
fixing issue in index.ts
Edwardvaneechoud Feb 2, 2026
f358b66
Fix artifact not found on re-run when consumer deletes artifact (#294)
Edwardvaneechoud Feb 3, 2026
040c8f9
Add catalog service layer with repository pattern (#298)
Edwardvaneechoud Feb 3, 2026
431feaa
Add artifact visualization with edges and node badges (#288)
Edwardvaneechoud Feb 3, 2026
55ec489
Add synchronous kernel management and auto-restart functionality (#296)
Edwardvaneechoud Feb 3, 2026
736193f
fix ref to python image
Edwardvaneechoud Feb 3, 2026
076b3ff
adding python image
Edwardvaneechoud Feb 3, 2026
d011727
fixing img
Edwardvaneechoud Feb 3, 2026
d745da2
Add comprehensive README for kernel_runtime (#301)
Edwardvaneechoud Feb 3, 2026
84b8e41
Fix parquet corruption race condition in kernel execution (#302)
Edwardvaneechoud Feb 3, 2026
79d76a0
Add artifact persistence and recovery system to kernel runtime (#299)
Edwardvaneechoud Feb 3, 2026
477f4b4
Add interactive display outputs for notebook-like cell execution (#303)
Edwardvaneechoud Feb 4, 2026
96c5b02
Polish PythonScript.vue styling for more compact layout (#306)
Edwardvaneechoud Feb 4, 2026
7ef869f
Change read_inputs() to return list of LazyFrames per input (#309)
Edwardvaneechoud Feb 5, 2026
b266a03
Add comprehensive CLAUDE.md for AI-assisted development (#311)
Edwardvaneechoud Feb 6, 2026
6c60358
Global sharing of artifacts (#304)
Edwardvaneechoud Feb 6, 2026
9acbe78
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 6, 2026
967d39f
Add schema_callback to python_script node to fix slow editor opening …
Edwardvaneechoud Feb 6, 2026
cee6076
Link global artifacts to flow registrations (#312)
Edwardvaneechoud Feb 6, 2026
5dd8070
Add Jupyter-style notebook editor for Python Script nodes (#308)
Edwardvaneechoud Feb 6, 2026
1e7e8fd
Add artifact management and display to catalog system (#317)
Edwardvaneechoud Feb 7, 2026
75b88e0
Fix artifact availability to only show upstream DAG ancestors (#320)
Edwardvaneechoud Feb 7, 2026
1502bd8
Fix cursor styling in CodeMirror editor (#321)
Edwardvaneechoud Feb 7, 2026
44d6144
Refactor path resolution and add Docker integration tests (#323)
Edwardvaneechoud Feb 8, 2026
6946265
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 9, 2026
7802641
Offload collect() in add_python_script from core to worker (#327)
Edwardvaneechoud Feb 9, 2026
caa421d
Merge branch 'main' into feauture/kernel-implementation
Edwardvaneechoud Feb 9, 2026
a2ccd5b
Add interactive mode support to publish_global (#328)
Edwardvaneechoud Feb 9, 2026
75bd611
Fix Docker Kernel E2E test collection failure (#330)
Edwardvaneechoud Feb 9, 2026
f9086e8
Add kernel memory monitoring and OOM detection (#331)
Edwardvaneechoud Feb 11, 2026
f142b31
Improve error handling for missing upstream inputs in flowfile_client…
Edwardvaneechoud Feb 11, 2026
63f174a
Fix source_registration_id lost during flow restore (#334)
Edwardvaneechoud Feb 11, 2026
aec6d1d
Add Pydantic schemas for artifact metadata responses (#335)
Edwardvaneechoud Feb 13, 2026
d11da86
Fix backward compat for source_registration_id in legacy pickle files…
Edwardvaneechoud Feb 13, 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
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ FLOWFILE_ADMIN_PASSWORD=changeme
# Secret key for signing JWT tokens (min 32 characters)
# Generate with: openssl rand -hex 32
JWT_SECRET_KEY=your-secure-jwt-secret-key-change-in-production

# ============================================
# Internal Service Token
# ============================================
# Shared secret for kernel → Core API authentication.
# Core passes this token to kernel containers automatically.
# Generate with: openssl rand -hex 32
FLOWFILE_INTERNAL_TOKEN=your-secure-internal-token-change-in-production
94 changes: 94 additions & 0 deletions .github/workflows/test-docker-kernel-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Docker Kernel E2E Tests

permissions:
contents: read

on:
push:
branches: [ main ]
paths:
- 'kernel_runtime/**'
- 'flowfile_core/flowfile_core/kernel/**'
- 'flowfile_core/Dockerfile'
- 'flowfile_worker/Dockerfile'
- 'docker-compose.yml'
- 'tests/integration/**'
- '.github/workflows/test-docker-kernel-e2e.yml'
pull_request:
branches: [ main ]
paths:
- 'kernel_runtime/**'
- 'flowfile_core/flowfile_core/kernel/**'
- 'flowfile_core/Dockerfile'
- 'flowfile_worker/Dockerfile'
- 'docker-compose.yml'
- 'tests/integration/**'
- '.github/workflows/test-docker-kernel-e2e.yml'
workflow_dispatch:

jobs:
docker-kernel-e2e:
name: Docker Kernel E2E
runs-on: ubuntu-latest
timeout-minutes: 20

env:
COMPOSE_PROJECT_NAME: flowfile-ci-${{ github.run_id }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python -
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Cache Poetry dependencies
uses: actions/cache@v4
with:
path: .venv
key: poetry-${{ runner.os }}-${{ hashFiles('poetry.lock') }}
restore-keys: |
poetry-${{ runner.os }}-

- name: Install dependencies
run: |
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
poetry install --no-interaction --no-ansi

- name: Run Docker Kernel E2E tests
run: |
poetry run pytest tests/integration -m docker_integration -vv --tb=long --log-cli-level=INFO
timeout-minutes: 15

- name: Clean up Docker resources
if: always()
run: |
docker compose -p flowfile-ci-${{ github.run_id }} down -v --remove-orphans || true
docker ps -a --filter "name=flowfile-kernel" -q | xargs -r docker rm -f || true
docker system prune -f

- name: Show Docker logs on failure
if: failure()
run: |
echo "=== Docker containers ==="
docker ps -a
echo ""
echo "=== Compose service logs ==="
docker compose -p flowfile-ci-${{ github.run_id }} logs --tail=200 || true
echo ""
echo "=== Kernel container logs ==="
docker ps -a --filter "name=flowfile-kernel" --format "{{.Names}}" | while read name; do
echo "--- Logs for $name ---"
docker logs "$name" 2>&1 || true
done
91 changes: 91 additions & 0 deletions .github/workflows/test-kernel-integration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Kernel Integration Tests

permissions:
contents: read

on:
push:
branches: [ main ]
paths:
- 'kernel_runtime/**'
- 'flowfile_core/flowfile_core/kernel/**'
- 'flowfile_core/flowfile_core/artifacts/**'
- 'flowfile_core/tests/flowfile/test_kernel*.py'
- 'flowfile_core/tests/flowfile/test_global_artifacts*.py'
- 'flowfile_core/tests/kernel_fixtures.py'
- '.github/workflows/test-kernel-integration.yml'
pull_request:
branches: [ main ]
paths:
- 'kernel_runtime/**'
- 'flowfile_core/flowfile_core/kernel/**'
- 'flowfile_core/flowfile_core/artifacts/**'
- 'flowfile_core/tests/flowfile/test_kernel*.py'
- 'flowfile_core/tests/flowfile/test_global_artifacts*.py'
- 'flowfile_core/tests/kernel_fixtures.py'
- '.github/workflows/test-kernel-integration.yml'
workflow_dispatch:

jobs:
kernel-tests:
name: Kernel Integration Tests
runs-on: ubuntu-latest
timeout-minutes: 30

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python -
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Install dependencies
run: |
poetry install --no-interaction --no-ansi

- name: Build kernel Docker image
run: |
docker build -t flowfile-kernel -f kernel_runtime/Dockerfile kernel_runtime/
docker images | grep flowfile-kernel

- name: Run kernel integration tests
run: |
poetry run pytest flowfile_core/tests -m kernel -vv --tb=long --log-cli-level=INFO
timeout-minutes: 20
env:
# Set test mode to avoid conflicts
TEST_MODE: "1"
# Generate internal token for kernel <-> Core auth
FLOWFILE_INTERNAL_TOKEN: ${{ github.run_id }}-test-token

- name: Clean up Docker resources
if: always()
run: |
# Remove kernel containers
docker ps -a --filter "name=flowfile-kernel" -q | xargs -r docker rm -f
# Remove kernel image
docker images --filter "reference=flowfile-kernel" -q | xargs -r docker rmi -f || true
# Prune
docker system prune -f

- name: Show Docker logs on failure
if: failure()
run: |
echo "=== Docker containers ==="
docker ps -a
echo ""
echo "=== Kernel container logs ==="
docker ps -a --filter "name=flowfile-kernel" --format "{{.Names}}" | while read name; do
echo "--- Logs for $name ---"
docker logs "$name" 2>&1 || true
done
57 changes: 54 additions & 3 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
backend_worker: ${{ steps.filter.outputs.backend_worker }}
backend_frame: ${{ steps.filter.outputs.backend_frame }}
backend_flowfile: ${{ steps.filter.outputs.backend_flowfile }}
kernel: ${{ steps.filter.outputs.kernel }}
frontend: ${{ steps.filter.outputs.frontend }}
docs: ${{ steps.filter.outputs.docs }}
shared: ${{ steps.filter.outputs.shared }}
Expand All @@ -46,6 +47,11 @@ jobs:
- 'flowfile_frame/**'
backend_flowfile:
- 'flowfile/**'
kernel:
- 'kernel_runtime/**'
- 'flowfile_core/flowfile_core/kernel/**'
- 'flowfile_core/tests/flowfile/test_kernel_integration.py'
- 'flowfile_core/tests/kernel_fixtures.py'
frontend:
- 'flowfile_frontend/**'
docs:
Expand Down Expand Up @@ -145,7 +151,7 @@ jobs:
needs.detect-changes.outputs.shared == 'true' ||
needs.detect-changes.outputs.test_workflow == 'true' ||
github.event.inputs.run_all_tests == 'true'
run: poetry run pytest flowfile_core/tests --disable-warnings $COV_ARGS
run: poetry run pytest flowfile_core/tests -m "not kernel" --disable-warnings $COV_ARGS
env:
COV_ARGS: ${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12') && '--cov --cov-append --cov-report=' || '' }}

Expand Down Expand Up @@ -271,7 +277,7 @@ jobs:
needs.detect-changes.outputs.test_workflow == 'true' ||
github.event.inputs.run_all_tests == 'true'
shell: pwsh
run: poetry run pytest flowfile_core/tests --disable-warnings
run: poetry run pytest flowfile_core/tests -m "not kernel" --disable-warnings

- name: Run pytest for flowfile_worker
if: |
Expand Down Expand Up @@ -299,6 +305,48 @@ jobs:
shell: pwsh
run: poetry run pytest flowfile/tests --disable-warnings

# Kernel integration tests - runs in parallel on a separate worker
kernel-tests:
needs: detect-changes
if: |
needs.detect-changes.outputs.kernel == 'true' ||
needs.detect-changes.outputs.backend_core == 'true' ||
needs.detect-changes.outputs.shared == 'true' ||
needs.detect-changes.outputs.test_workflow == 'true' ||
github.event.inputs.run_all_tests == 'true'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: 'pip'

- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python -
echo "$HOME/.poetry/bin" >> $GITHUB_PATH

- name: Install Dependencies
run: |
poetry install --no-interaction --no-ansi --with dev

- name: Build kernel Docker image
run: |
docker build -t flowfile-kernel -f kernel_runtime/Dockerfile kernel_runtime/

- name: Run kernel_runtime unit tests
run: |
pip install -e "kernel_runtime/[test]"
python -m pytest kernel_runtime/tests -v --disable-warnings

- name: Run kernel integration tests
run: |
poetry run pytest flowfile_core/tests -m kernel -v --disable-warnings

# Frontend web build test - runs when frontend changes or test workflow changes
test-web:
needs: detect-changes
Expand Down Expand Up @@ -472,7 +520,7 @@ jobs:

# Summary job - always runs to provide status
test-summary:
needs: [detect-changes, backend-tests, backend-tests-windows, test-web, electron-tests-macos, electron-tests-windows, docs-test]
needs: [detect-changes, backend-tests, backend-tests-windows, kernel-tests, test-web, electron-tests-macos, electron-tests-windows, docs-test]
if: always()
runs-on: ubuntu-latest
steps:
Expand All @@ -485,6 +533,7 @@ jobs:
echo " - Backend Worker: ${{ needs.detect-changes.outputs.backend_worker }}"
echo " - Backend Frame: ${{ needs.detect-changes.outputs.backend_frame }}"
echo " - Backend Flowfile: ${{ needs.detect-changes.outputs.backend_flowfile }}"
echo " - Kernel: ${{ needs.detect-changes.outputs.kernel }}"
echo " - Frontend: ${{ needs.detect-changes.outputs.frontend }}"
echo " - Docs: ${{ needs.detect-changes.outputs.docs }}"
echo " - Shared/Dependencies: ${{ needs.detect-changes.outputs.shared }}"
Expand All @@ -493,6 +542,7 @@ jobs:
echo "Job results:"
echo " - Backend Tests: ${{ needs.backend-tests.result }}"
echo " - Backend Tests (Windows): ${{ needs.backend-tests-windows.result }}"
echo " - Kernel Tests: ${{ needs.kernel-tests.result }}"
echo " - Web Tests: ${{ needs.test-web.result }}"
echo " - Electron Tests (macOS): ${{ needs.electron-tests-macos.result }}"
echo " - Electron Tests (Windows): ${{ needs.electron-tests-windows.result }}"
Expand All @@ -501,6 +551,7 @@ jobs:
# Fail if any non-skipped job failed
if [[ "${{ needs.backend-tests.result }}" == "failure" ]] || \
[[ "${{ needs.backend-tests-windows.result }}" == "failure" ]] || \
[[ "${{ needs.kernel-tests.result }}" == "failure" ]] || \
[[ "${{ needs.test-web.result }}" == "failure" ]] || \
[[ "${{ needs.electron-tests-macos.result }}" == "failure" ]] || \
[[ "${{ needs.electron-tests-windows.result }}" == "failure" ]] || \
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ htmlcov/
# Docker
flowfile_data/

# Egg info
*.egg-info/

# Secrets and keys - NEVER commit these
master_key.txt
*.key
Expand Down
Loading
Loading