Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
393c8aa
[Fix] GitHub CLI helpers no longer shell-evaluate untrusted gh args (…
roomote-roomote[bot] Jul 16, 2026
c658c4e
[Fix] Automation labels show "Codeql Triage" instead of "CodeQL Triag…
roomote-roomote[bot] Jul 16, 2026
d18725c
[Fix] Slack transcript decoding can hang on crafted thread activity i…
roomote-roomote[bot] Jul 16, 2026
53d4158
[Fix] Discord gateway stuck when gateway secret was never created (#459)
roomote-roomote[bot] Jul 16, 2026
bd0404b
[Docs] Drop ENCRYPTION_KEY reuse notes for Discord gateway secret (#460)
roomote-roomote[bot] Jul 16, 2026
cf2d7fd
[Improve] Clarify Discord install flow and drop permissions integer (…
roomote-roomote[bot] Jul 16, 2026
36e3163
[Feat] Allow setting license key via R_LICENSE_KEY env var (#462)
roomote-roomote[bot] Jul 17, 2026
eaf3639
Add a flag-gated inference gateway so provider keys stay out of task …
mrubens Jul 17, 2026
86a3b93
Route ChatGPT-subscription inference through the gateway (Phase 3) (#…
mrubens Jul 17, 2026
889d7dc
[Chore] Bump OpenCode CLI and SDK to 1.17.18 (#464)
roomote-roomote[bot] Jul 17, 2026
f902450
[Fix] OpenRouter Connect fails when self-hosted app URL is loopback (…
roomote-roomote[bot] Jul 17, 2026
9c08733
Disable direct Vertex AI and Mistral providers (#466)
mrubens Jul 17, 2026
965bea1
[Fix] Theme boot script embeds storage key without script-context esc…
roomote-roomote[bot] Jul 17, 2026
1d26efc
Expose R_LICENSE_KEY in Railway template (#468)
mrubens Jul 17, 2026
17c3df8
[Fix] Tasks abort on OpenCode provider rate-limit errors (#469)
roomote-roomote[bot] Jul 17, 2026
5ebc032
[Fix] OpenAI provider section missing when ChatGPT is also connected …
roomote-roomote[bot] Jul 17, 2026
1d37f9a
[Improve] Clarify Review Code author scope as Roomote-only vs everyon…
roomote-roomote[bot] Jul 17, 2026
b6a01da
Revert "[Improve] Clarify Review Code author scope as Roomote-only vs…
mrubens Jul 17, 2026
746fdfd
Remove the InferenceGateway feature flag and enable the gateway every…
mrubens Jul 17, 2026
c0598b5
[Fix] Code reviewer still spawns judge subagents (#475)
roomote-roomote[bot] Jul 17, 2026
a3b863c
[Chore] Remove authorship rules feature and keep schema for N-1 rollb…
roomote-roomote[bot] Jul 17, 2026
0501c43
[Fix] Harden shell injection, OAuth account linking, and run-token au…
roomote-roomote[bot] Jul 17, 2026
9fce7a0
[Improve] Show richer static titles for shared app links (#479)
roomote-roomote[bot] Jul 17, 2026
85ab75f
[Feat] Add provider model mapping presets (#427)
roomote-roomote[bot] Jul 17, 2026
97dc8ef
[Chore] Remediate open CodeQL security and quality alerts (#478)
roomote-roomote[bot] Jul 17, 2026
c9d2787
Refresh worker runtime on task snapshot resume (#482)
mrubens Jul 17, 2026
e35ae8b
[Refactor] Data-drive automation destination fields (#483)
roomote-roomote[bot] Jul 17, 2026
9dbc8cb
Release Roomote 0.8.0 (#484)
roomote-roomote[bot] Jul 17, 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
2 changes: 1 addition & 1 deletion .docker/app/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ ENTRYPOINT ["/usr/bin/tini", "--", "/roomote/.docker/app/entrypoint.sh"]
# control-plane calls) starts a managed OpenCode SDK server in-process.
FROM runtime-base AS runtime-inference-base

ARG OPENCODE_CLI_VERSION=1.17.8
ARG OPENCODE_CLI_VERSION=1.17.18

# The install and version check run as root; with the image's HOME=/tmp they
# would bake root-owned dotdirs (npm cache, OpenCode's data/config/cache
Expand Down
7 changes: 4 additions & 3 deletions .docker/sandbox/install-worker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@
#
# Installation modes:
#
# Vercel Sandbox (production + local dev):
# Hosted sandbox (production + local dev):
# - Controller uploads this script + archive to /sandbox/worker.tar.gz
# - This script installs from the uploaded worker release archive
#
# Vercel Sandbox (snapshot resume):
# Hosted sandbox (snapshot resume):
# - Environment snapshot launches restore a cached sandbox first, then run
# this script to refresh the shipped Roomote worker/runtime in place
# - Task snapshot launches preserve exact state and skip this script
# - Task snapshot launches also refresh the shipped worker/runtime while
# preserving repositories, harness sessions, and other snapshot state
#
# Build worker release archive: ./scripts/build-worker-release.sh <version>

Expand Down
2 changes: 2 additions & 0 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
# Optional: local integration credentials. Leave unset until the integration is
# configured for this local instance.
# R_ALLOWED_EMAILS=you@example.com,teammate@example.com
# Optional paid-seat license key (RMLK1.…). Takes precedence over Settings → Users.
# R_LICENSE_KEY=

# Required for local tasks. Use models.dev-style provider/model ids.
# R_MODEL=openrouter/anthropic/claude-sonnet-4
Expand Down
9 changes: 5 additions & 4 deletions .env.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ PREVIEW_AUTH_PUBLIC_KEY=
# Random single-line secrets generated by the operator.
ENCRYPTION_KEY=
# Shared internal secret for Discord-gateway→API event delivery (API + BullMQ).
# Required when Discord is enabled. Use a dedicated random value — do not reuse
# ENCRYPTION_KEY. The installer and Railway/Render/Coolify templates generate
# it; UI Discord save also mints it when missing.
# Required when Discord is enabled. The installer and Railway/Render/Coolify
# templates generate it; UI Discord save also mints it when missing, and the
# runtime auto-heals when Discord is already configured without one.
# R_DISCORD_GATEWAY_SECRET=
ARTIFACT_SIGNING_KEY=
DASHBOARD_PASSWORD=
Expand All @@ -71,7 +71,6 @@ OPENROUTER_API_KEY=
# ANTHROPIC_API_KEY=
# GOOGLE_GENERATIVE_AI_API_KEY=
# GEMINI_API_KEY=
# MISTRAL_API_KEY=
# MOONSHOT_API_KEY=
# MINIMAX_API_KEY=
# OPENCODE_API_KEY=
Expand Down Expand Up @@ -120,6 +119,8 @@ DEFAULT_COMPUTE_PROVIDER=docker

# Sign-in providers.
# R_ALLOWED_EMAILS=
# Optional paid-seat license key (RMLK1.…). Takes precedence over Settings → Users.
# R_LICENSE_KEY=
# R_SLACK_CLIENT_ID=
# R_SLACK_CLIENT_SECRET=

Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ on:
branches: [main, develop]
workflow_dispatch:

permissions:
contents: read

env:
NODE_VERSION: 24.13.1
PNPM_VERSION: 10.29.3
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/publish-ghcr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ jobs:
prepare:
name: Resolve build metadata
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: read
outputs:
docs_only: ${{ steps.changed-paths.outputs.docs_only }}
owner: ${{ steps.vars.outputs.owner }}
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ This repository is open source. Treat GitHub and other public surfaces as fully
- Treat absolute home-directory skill paths such as `/home/roomote/.agents/skills/...` as activated or installed runtime copies, not as the checked-in source of truth for repository changes.
- Treat workflow prompts and instructions as a first-class control surface. When agent behavior is off, debug prompt clarity before defaulting to code enforcement.
- `apps/docs/` is the public product documentation site (published at `https://docs.roomote.dev`) and should be kept in sync with user-facing product changes.
- **Schema N-1 rollback guarantee:** Roomote must always be able to roll application code back one release against the current database. Do not drop tables or columns that the previous release still reads or writes in the same release that removes the feature. Stop using the columns in app code first, keep them in `packages/db` with an explicit N-1 comment, and drop them only after the next release is the supported rollback target. See `packages/db/AGENTS.md` for the package-local rules.

## Slack message formatting

Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

This file tracks product releases for Roomote (single monorepo version). Automated release entries are prepended by `pnpm run version`.

## 0.8.0 (2026-07-17)

### Minor changes

- Route task-sandbox inference through a control-plane gateway for every deployment: provider API keys and ChatGPT subscription auth stay server-side, sandboxes call `/api/inference` with a run-scoped token, and the InferenceGateway feature flag is removed so this is always on.
- Allow self-hosted operators to set the paid-seat license key via the `R_LICENSE_KEY` environment variable (takes precedence over Settings → Users).
- Add provider-local model mapping presets in Settings so operators can choose labeled mapping sets (including OpenRouter Balanced and Quick turnaround), confirm the selected mapping before it applies, and automatically add or enable referenced models.
- Remove the authorship-rules feature (settings UI, compiler, and enqueue-time evaluation). Task commit authors and PR assignees now always use default attribution.

### Patch changes

- Automation labels spell the CodeQL brand correctly, so `codeql_triage` surfaces as “CodeQL Triage” instead of “Codeql Triage” in task filters, analytics, and attribution.
- Temporarily disable Google Vertex AI and remove legacy direct Mistral execution. Model-provider credentials now enter task sandboxes only through the selected runtime provider allowlist, while unrelated task environment variables remain available.
- Clarify the Discord install flow (including dropping the permissions integer from operator-facing guidance) and recover the Discord gateway when a deployment never received a gateway secret instead of staying stuck offline.
- When both an OpenAI API key and a ChatGPT subscription are connected, Settings again shows a separate OpenAI provider section instead of folding every `openai/` model under ChatGPT (subscription).
- Tasks no longer abort when OpenCode surfaces a provider rate-limit as a terminal session error; the worker treats those limits as retryable and continues the run after backoff.
- OpenRouter Connect works for self-hosted deployments whose public app URL is a loopback address, instead of failing the OAuth handoff in that configuration.
- Refresh the shipped worker runtime when restoring task snapshots so snapshots created by an older release remain compatible with current runtime protocols such as the inference gateway.
- Shared links into the product app now resolve to short static page titles and one-line descriptions (task, settings, history, sign-in, setup, onboarding) instead of the generic global fallback.
- Harden high-confidence security gaps: shell-escape untrusted git and GitHub CLI arguments, tighten OAuth account linking, and strengthen run-token authentication used by sandbox runtime traffic.
- Slack transcript decoding no longer hangs when thread activity contains crafted or pathological input.

## 0.7.1 (2026-07-16)

### Patch changes
Expand Down
4 changes: 2 additions & 2 deletions LOCAL_DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,8 @@ pnpm eval:router:share
Eval configs and datasets live in `packages/cloud-agents/evals/router/`.
They are not run in CI by default. Runtime routing, title generation, and
summaries use `R_SMALL_MODEL`, falling back to `R_MODEL`. Set
`ROUTER_EVAL_PROVIDER`, `ROUTER_FOLLOWUP_EVAL_PROVIDER`, or
`AUTHORSHIP_RULES_EVAL_PROVIDER` to test a different promptfoo provider.
`ROUTER_EVAL_PROVIDER` or `ROUTER_FOLLOWUP_EVAL_PROVIDER` to test a
different promptfoo provider.

## Troubleshooting

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ cleans up after itself.
your account directly. No API key needed, no separate billing. Roomote uses
the models included in your subscription.
2. **API keys (BYOK).** Paste a key from OpenRouter, Anthropic, OpenAI, xAI,
Google Gemini, Amazon Bedrock, Google Vertex AI, Vercel AI Gateway,
Google Gemini, Amazon Bedrock, Vercel AI Gateway,
Baseten, Together AI, Moonshot AI (Kimi), MiniMax, or OpenCode Zen / Go.

**Sandbox compute:** Modal, E2B, Daytona, Blaxel, and Local Docker.
Expand Down Expand Up @@ -238,7 +238,7 @@ it runs.
**What models does it support?**
Two options. Connect your ChatGPT Plus or Pro subscription directly (no API key
needed), or paste an API key from OpenRouter, Anthropic, OpenAI, xAI, Google
Gemini, Amazon Bedrock, Google Vertex AI, Vercel AI Gateway, Baseten,
Gemini, Amazon Bedrock, Vercel AI Gateway, Baseten,
Together AI, Moonshot AI (Kimi), MiniMax, or OpenCode Zen / Go.

**What sandboxes does it support?**
Expand Down
15 changes: 10 additions & 5 deletions SELF_HOSTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,6 @@ common provider keys into worker containers:
- `AI_GATEWAY_API_KEY` (Vercel AI Gateway, `vercel/...` models)
- `OPENAI_API_KEY`
- `ANTHROPIC_API_KEY`
- `MISTRAL_API_KEY`
- `MOONSHOT_API_KEY`
- `MINIMAX_API_KEY`
- `OPENCODE_API_KEY`
Expand Down Expand Up @@ -484,7 +483,7 @@ base64 < preview-auth-private-pkcs8.pem | tr -d '\n' # PREVIEW_AUTH_PRIVATE_KEY
base64 < preview-auth-public.pem | tr -d '\n' # PREVIEW_AUTH_PUBLIC_KEY

openssl rand -base64 32 # ENCRYPTION_KEY
openssl rand -base64 32 # R_DISCORD_GATEWAY_SECRET (dedicated; do not reuse ENCRYPTION_KEY)
openssl rand -base64 32 # R_DISCORD_GATEWAY_SECRET
openssl rand -base64 32 # ARTIFACT_SIGNING_KEY
openssl rand -base64 24 # DASHBOARD_PASSWORD
openssl rand -hex 16 # SETUP_TOKEN
Expand All @@ -500,7 +499,7 @@ always take precedence. The random string secrets (`ENCRYPTION_KEY`,
`R_DISCORD_GATEWAY_SECRET`, `ARTIFACT_SIGNING_KEY`, `DASHBOARD_PASSWORD`,
`SETUP_TOKEN`) are still required and can come from the platform's secret
generator. API and BullMQ must share the same `R_DISCORD_GATEWAY_SECRET` value
when Discord is enabled; that value must not be the same as `ENCRYPTION_KEY`.
when Discord is enabled.

### Port exposure and the queue dashboard

Expand Down Expand Up @@ -790,8 +789,14 @@ registered user account counts toward the limit, whichever sign-in path or
surface it uses. Removing a user frees their seat.

To go beyond 10 users, obtain a license key from the Roomote maintainers and
enter it in **Settings → Users → License** as an admin. Keys are verified
offline; your deployment never phones home.
apply it in either of these ways:

- Enter it in **Settings → Users → License** as an admin, or
- Set `R_LICENSE_KEY` in the deployment environment (for example
`.env.production` / Compose). When set, the env var takes precedence over
any key stored in Settings.

Keys are verified offline; your deployment never phones home.

When a deployment is at its seat limit, existing users are unaffected — only
new sign-ups are blocked until a seat is freed (Settings → Users → remove a
Expand Down
3 changes: 3 additions & 0 deletions apps/api/src/handlers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ export { trpc } from './trpc';
export { mcp } from './mcp';
export { mcpRouting } from './mcp/routing';

// inference gateway
export { inference } from './inference';

// task runs
export { taskRunsRouter } from './task-runs';

Expand Down
Loading
Loading