Skip to content

release: publish installable v0.4.0 - #53

Merged
2233admin merged 7 commits into
mainfrom
codex/public-release-v0.4.0
Jul 31, 2026
Merged

release: publish installable v0.4.0#53
2233admin merged 7 commits into
mainfrom
codex/public-release-v0.4.0

Conversation

@2233admin

Copy link
Copy Markdown
Owner

Summary

  • publish self-hosted v0.4.0 with public GHCR images
  • add Linux/macOS and Windows installers with generated bootstrap/fleet credentials
  • ship the Next.js console and loopback-only interactive noVNC browser
  • add clean Docker build/start and authenticated login smoke coverage

Verification

  • 1821 unit tests passed, 7 skipped
  • frontend typecheck, lint, and production build passed
  • release/auth targeted tests passed
  • Compose, actionlint, Bash, and PowerShell syntax checks passed
  • independent release verification and code review found no remaining P0/P1 blockers

Local Docker Desktop is unavailable on this workstation; the PR Public Install Smoke job performs the clean Docker build/start verification on GitHub Actions.

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@repowise-bot

repowise-bot Bot commented Jul 31, 2026

Copy link
Copy Markdown

✅ Health: 6.8
🚨 Change risk: 9.2/10 (high).

📋 At a glance
5 hotspots touched · 8 new findings introduced · 1 co-change pair left out · 5 dead-code findings.

Files & modules (2)
  • backend (4 files)
    • .../v1/nodes.py
    • backend/main.py
    • .../v1/browsers.py
    • backend/agent_server.py
  • tests (1 file)
    • tests/unit/test_workers_api.py

📌 Before you merge

  • Run tests/integration/test_webhooks_api.py, tests/unit/test_main.py: they import the changed files
  • backend/channels/opencli_channel.py changed together with backend/agent_server.py in 10 past commits and isn't in this PR
🔎 More signals (4)

🗺️ Change map

flowchart LR
  subgraph PR ["Changed in this PR (2 with dependents)"]
    f_backend_main_py["backend/main.py 🔥"]:::changed
    f_backend_config_py["backend/config.py"]:::changed
  end
  f_backend_api_v1_workers_py[".../v1/workers.py"]
  f_backend_main_py --> f_backend_api_v1_workers_py
  f_backend_channels_opencli_channel_py["backend/channels/opencli_channel.py"]
  f_backend_main_py --> f_backend_channels_opencli_channel_py
  f_backend_api_v1___init___py[".../v1/__init__.py"]
  f_backend_config_py --> f_backend_api_v1___init___py
  f_backend_api_v1_system_py[".../v1/system.py"]
  f_backend_config_py --> f_backend_api_v1_system_py
  f_backend_api_v1_webhooks_py[".../v1/webhooks.py"]
  f_backend_config_py --> f_backend_api_v1_webhooks_py
  f_backend_config_py --> f_backend_api_v1_workers_py
  more(["+6 more dependents"])
  PR --> more
  t_tests_unit_test_main_py(["✅ tests/unit/test_main.py"]):::guard
  t_tests_unit_test_main_py -.-> f_backend_main_py
  t_tests_integration_test_webhooks_api_py(["✅ tests/integration/test_webhooks_api.py"]):::guard
  t_tests_integration_test_webhooks_api_py -.-> f_backend_config_py
  classDef changed fill:#dbeafe,stroke:#1d4ed8,color:#1e3a5f
  classDef warn fill:#fef3c7,stroke:#b45309,color:#78350f
  classDef guard fill:#dcfce7,stroke:#15803d,color:#14532d
Loading

Solid arrows: code that imports the changed files (11 direct dependents, from the last indexed snapshot). Dashed: history/tests.

🔥 Hotspots touched (5)

  • .../v1/nodes.py: 10 commits/90d, 1 dependents · primary owner: xujinghua (100%)
  • backend/main.py: 17 commits/90d, 5 dependents · primary owner: xujinghua (100%)
  • .../v1/browsers.py: 16 commits/90d, 1 dependents · primary owner: xujinghua (100%)
2 more
  • backend/agent_server.py: 18 commits/90d, 0 dependents · primary owner: xujinghua (100%)
  • tests/unit/test_workers_api.py: 2 commits/90d, 1 dependents · primary owner: xujinghua (100%)

🔗 Hidden coupling (1 file)

  • backend/agent_server.py co-changes with backend/channels/opencli_channel.py (10×, 🟡 notable), not in this PR.

💀 Dead code (5 findings)

  • 💀 .../v1/nodes.py NodeRegisterRequest (confidence 1.00)
  • 💀 .../v1/browsers.py CdpEndpointRequest (confidence 1.00)
  • 💀 .../v1/browsers.py AgentRegisterRequest (confidence 1.00)
2 more
  • 💀 .../v1/browsers.py InstanceConfigUpdate (confidence 1.00)
  • 💀 backend/agent_server.py (file-level) (confidence 0.40)

📊 Full report · ⭐ Star Repowise · 📥 Install bot · Last updated 2026-07-31 09:43 UTC
Silence on a single PR with [skip repowise] in the title · Per-repo toggle on repowise.dev/settings?tab=bot

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@2233admin, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 6 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f79ae1a1-416e-4d25-bdb2-37a8227d3922

📥 Commits

Reviewing files that changed from the base of the PR and between 8bffbb0 and 244f681.

📒 Files selected for processing (16)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • backend/api/v1/browsers.py
  • backend/migrations/versions/j7k8l9m0n1o2_link_studio_runs_to_published_versions.py
  • backend/migrations/versions/k8l9m0n1o2p3_add_operations_agent_run_contract_payloads.py
  • frontend/.dockerignore
  • frontend/lib/flow/store-slices.ts
  • frontend/lib/flow/store-utils.ts
  • frontend/lib/flow/store.ts
  • frontend/scripts/check-workflow-regressions.mjs
  • scripts/install.ps1
  • scripts/install.sh
  • tests/integration/test_legacy_native_intelligence_migration.py
  • tests/integration/test_legacy_plugin_migration.py
  • tests/integration/test_workflow_capabilities_api.py
  • tests/unit/test_public_release_contract.py
📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Released version 0.4.0 with published multi-architecture container images.
    • Added automated Linux and Windows installers with generated credentials, health checks, and diagnostics.
    • Added a production-ready frontend container and integrated browser/noVNC service.
    • Added support for configurable image registries, ports, authentication, and deployment settings.
  • Bug Fixes

    • Restricted noVNC access to localhost by default.
    • Improved deployment defaults and service health checks.
  • Documentation

    • Updated installation, authentication, browser access, agent registration, and local development guidance.

Walkthrough

The project now provides a version 0.4.0 Docker release flow. It adds frontend and Chrome images, authenticated Compose services, Linux and Windows installers, release publishing workflows, deployment documentation, and public release contract tests.

Changes

Release deployment

Layer / File(s) Summary
Release configuration and contracts
.env.docker.example, backend/..., package.json, pyproject.toml, docs/...
Adds release environment settings, updates project versions to 0.4.0, changes the default noVNC port, and documents seven additional capability operations.
Container image builds and runtime packaging
Dockerfile, agent/Dockerfile, chrome/Dockerfile, frontend/*, docker-compose.build.yml, scripts/install-agent.sh, tests/unit/test_agent_image_runtime_packaging.py
Adds the standalone frontend image, updates agent and browser images, removes implicit private runtime checkouts, and makes adapter-pack installation opt-in.
Compose service and browser integration
docker-compose.yml, backend/api/v1/*, backend/config.py, scripts/chrome-pool.sh, tests/unit/test_*deployment_contract.py, tests/unit/test_public_release_contract.py
Adds the frontend service, authenticated API settings, health checks, GHCR image defaults, built-in Chrome service, updated CDP ports, and loopback-only noVNC bindings.
Installation scripts and deployment documentation
scripts/install.sh, scripts/install.ps1, scripts/install-managed-opencli.ps1, README.md
Adds release installers that generate secrets, start services, wait for health, report credentials, and document the new deployment flow.
Release publishing and contract validation
.github/workflows/ci.yml, .github/workflows/release.yml, tests/unit/test_public_release_contract.py
Adds Compose release-contract checks and tag-triggered multi-architecture image publishing with GitHub release artifacts.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Poem

A rabbit packs images in rows,
GHCR-bound where the release flow goes.
Secrets bloom in .env bright,
Chrome ports stay loopback-tight.
Health checks hop, installers cheer—
Version 0.4.0 is here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: publishing an installable v0.4.0 release.
Description check ✅ Passed The description directly covers the release images, installers, console, browser, smoke tests, and verification results.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (1)
frontend/.dockerignore (1)

1-5: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Exclude environment files from the Docker build context.

frontend/Dockerfile copies every non-ignored file into the builder stage. This file does not exclude .env*. A local environment file can enter build layers or generated frontend artifacts.

Proposed change
 .next
 node_modules
+.env*
+!.env.example
 npm-debug.log*
 pnpm-debug.log*
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/.dockerignore` around lines 1 - 5, Update frontend/.dockerignore to
exclude all .env* environment files from the Docker build context, while
preserving the existing Next.js, dependency, and package-manager log exclusions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 8-11: Restrict workflow permissions and checkout credential
persistence: in .github/workflows/release.yml lines 8-11, default to contents:
read, grant packages: write only to images, and contents: write only to
github-release; remove unnecessary id-token access. In
.github/workflows/release.yml lines 55-56 and 110-111, set persist-credentials:
false on the images and github-release checkout steps. In
.github/workflows/ci.yml lines 93-104, set release-contract.permissions.contents
to read and disable checkout credential persistence.

In `@backend/config.py`:
- Line 125: Update the NOVNC_BASE_PORT fallback used by the dynamic Chrome
instance configuration in browsers.py from 3010 to 6080, matching
Settings.novnc_base_port and avoiding the frontend port.

In `@scripts/install.ps1`:
- Around line 85-109: Update the install.ps1 readiness check and final URL
banner to use the FRONTEND_PORT environment override, defaulting to 3010 when it
is unset, consistent with install.sh. Reuse the resolved port in the localhost
health-check URL and the displayed URL while leaving the Docker Compose commands
unchanged.
- Line 28: Update the release archive download Invoke-WebRequest call in the
install script to include the -UseBasicParsing option, matching the later
request while preserving the existing repository URL, version, and output file
arguments.
- Around line 9-10: Enable native command error propagation in the PowerShell
install flow before the Docker checks, by setting
$PSNativeCommandUseErrorActionPreference to $true alongside the existing
$ErrorActionPreference. Ensure failures from docker compose version and docker
info stop execution before pull or up runs.

In `@scripts/install.sh`:
- Around line 38-45: Update random_fernet so failures from openssl rand cannot
be masked by the transformation pipeline: capture or otherwise explicitly
validate the openssl result and return failure when generation fails or produces
an empty value. Ensure callers do not write CREDENTIAL_ENCRYPTION_KEY unless
random_fernet successfully returns a non-empty key, while preserving the
existing Docker fallback.

In `@tests/unit/test_agent_image_runtime_packaging.py`:
- Line 32: Update the assertion for OhMyOpenCliRepo in the relevant packaging
test to require both the [Parameter(Mandatory = $true)] attribute and the
[string]$OhMyOpenCliRepo declaration together, so the test fails if either
mandatory metadata or the parameter declaration is removed.

---

Nitpick comments:
In `@frontend/.dockerignore`:
- Around line 1-5: Update frontend/.dockerignore to exclude all .env*
environment files from the Docker build context, while preserving the existing
Next.js, dependency, and package-manager log exclusions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bc95da5f-9538-40e8-a400-ebf11b38e09b

📥 Commits

Reviewing files that changed from the base of the PR and between a37a1a7 and 8bffbb0.

⛔ Files ignored due to path filters (2)
  • package-lock.json is excluded by !**/package-lock.json
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (32)
  • .env.docker.example
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • Dockerfile
  • README.md
  • agent/Dockerfile
  • backend/agent_server.py
  • backend/api/v1/browsers.py
  • backend/api/v1/nodes.py
  • backend/config.py
  • backend/main.py
  • backend/mcp_server.py
  • chrome/Dockerfile
  • docker-compose.build.yml
  • docker-compose.yml
  • docs/backend-capability-exposure-matrix.yaml
  • frontend/.dockerignore
  • frontend/Dockerfile
  • frontend/eslint.config.mjs
  • frontend/next.config.mjs
  • frontend/package.json
  • package.json
  • pyproject.toml
  • scripts/chrome-pool.sh
  • scripts/install-agent.sh
  • scripts/install-managed-opencli.ps1
  • scripts/install.ps1
  • scripts/install.sh
  • tests/unit/test_agent_image_runtime_packaging.py
  • tests/unit/test_image_studio_deployment_contract.py
  • tests/unit/test_public_release_contract.py
  • tests/unit/test_workers_api.py

Comment thread .github/workflows/release.yml Outdated
Comment thread backend/config.py
Comment thread scripts/install.ps1
Comment thread scripts/install.ps1 Outdated
Comment thread scripts/install.ps1
Comment thread scripts/install.sh
"COPY scripts/verify_managed_opencli_runtime.py "
"./scripts/verify_managed_opencli_runtime.py"
) in dockerfile
assert '[string]$OhMyOpenCliRepo,' in windows

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert that OhMyOpenCliRepo is mandatory.

Line 32 passes if [Parameter(Mandatory = $true)] is removed. The installer could then clone an empty repository value. Assert the attribute and parameter declaration together.

Proposed test change
-    assert '[string]$OhMyOpenCliRepo,' in windows
+    assert (
+        '[Parameter(Mandatory = $true)]\n'
+        '    [string]$OhMyOpenCliRepo,'
+    ) in windows
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
assert '[string]$OhMyOpenCliRepo,' in windows
assert (
'[Parameter(Mandatory = $true)]\n'
' [string]$OhMyOpenCliRepo,'
) in windows
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/test_agent_image_runtime_packaging.py` at line 32, Update the
assertion for OhMyOpenCliRepo in the relevant packaging test to require both the
[Parameter(Mandatory = $true)] attribute and the [string]$OhMyOpenCliRepo
declaration together, so the test fails if either mandatory metadata or the
parameter declaration is removed.

@2233admin
2233admin merged commit 6bea969 into main Jul 31, 2026
15 checks passed
@2233admin
2233admin deleted the codex/public-release-v0.4.0 branch July 31, 2026 09:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant