Skip to content

Promote v0.26.0 to production - #887

Merged
mrubens merged 26 commits into
mainfrom
release/v0.26.0
Jul 29, 2026
Merged

Promote v0.26.0 to production#887
mrubens merged 26 commits into
mainfrom
release/v0.26.0

Conversation

@mrubens

@mrubens mrubens commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Promote v0.26.0

Candidate updated to 85c66c0e735bf372b10ec1945f65e86f05167f6d, the latest origin/develop commit at the time of refresh. The original 0.26.0 version commit was 2b21bc9f331ec857ae9991edeb34cabfcbbae9b0.

Additional candidate fixes

  • Prevent duplicate GitHub follow-up quotes.

  • Resume Linear sessions with the correct authorized account.

  • Route the first Linear session correctly after OAuth.

  • Merge this PR with a merge commit (do not squash or rebase).

  • If multiple promote PRs are open, merge them in version order (oldest first).

  • Merging publishes a GitHub Release for v0.26.0 and triggers the existing GHCR v* image publish (latest channel).

  • The release/v0.26.0 branch can be deleted after this PR merges.

Changelog

0.26.0 (2026-07-29)

This release expands Linear and GitHub workflows, makes release information easier to find, and improves setup and task reliability.

Highlights

  • Set up and manage Linear, link user accounts, and start app-mention, issue-delegation, scheduled, and direct Linear tasks.
  • Create or fork a GitHub repository from Roomote, then bootstrap an empty repository and configure its environment automatically.
  • Manage GitHub labels, milestones, and project status values safely from Roomote tasks.
  • Find the running Roomote version easily, verify Teams credentials during setup, and start sandboxes more reliably through transient broker failures.

Minor changes

  • Announce newly published Roomote releases in Discord with the release title, notes, link, timestamp, and Roomote branding when a main-channel webhook is configured.
  • Set up and manage Linear from onboarding or Settings, link user accounts, and start app-mention, issue-delegation, scheduled, and direct Linear tasks with the correct workspace and account context.
  • Create a new GitHub repository or fork an existing one from Roomote, then automatically detect empty repositories, add their initial commit, and configure a working environment.
  • Manage GitHub labels, milestones, and project status values from Roomote tasks with scoped credentials, confirmation for destructive changes, and read-back verification.
  • See the running Roomote version from the signed-in user menu, open release details, and revisit the latest What's New notice without administrator access.

Patch changes

  • Hide self-hosted license controls from cloud deployments while keeping license management available to self-hosted administrators.
  • Make task conversations easier to follow by showing request-input questions as distinct quoted context, refining mobile task chrome, quoting web follow-ups in GitHub replies, and keeping internal routing context out of Slack and Discord quotes.
  • Retry transient compute-broker upload failures during sandbox startup so momentary upstream errors no longer prevent task environments from starting.
  • Choose the model used by the Onboarding Agent when editing an existing environment, matching the model selection already available when creating one.
  • Verify Microsoft Teams bot credentials with Microsoft before saving them, so a wrong app id, client secret, or tenant id fails the save with a message naming the field instead of reporting a configured bot that cannot authenticate. Teams settings now also reports when the saved credentials stop authenticating, and explains why the Teams app package cannot be pre-filled from a malformed App (Client) ID.

roomote-roomote Bot and others added 23 commits July 28, 2026 13:49
* [Fix] Let users select a model when editing environments

* [Fix] Place environment model picker after start action

---------

Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* feat(linear): guide self-hosted OAuth setup

* refactor(integrations): align provider app setup
* Enable Linear app mentions and delegation

* Simplify Linear reconnection
* Allow Linear credential reconfiguration

* Polish Linear setup copy

* Align integration card footer actions
The home page onboarding cards "Chat with Roomote on Slack" and "Assign
tasks to agents from Linear" were visible to all users, but their actions
call slack.connectApp / linear.connectApp, which are admin-gated and
return Unauthorized for members. A member clicking "Do it" hit a silent
dead end. Gate both cards on isAdmin, consistent with the
deployment-scoped MCP cards in the same component.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix: report configured inference providers

* fix: report configured compute providers

---------

Co-authored-by: Roomote <roomote@roomote.dev>
#792)

* feat: create a new repo (or fork) plus environment from within Roomote

Make brand-new GitHub repositories a first-class setup target instead of a
dead end:

- Handle installation_repositories.added/removed and
  repository.created/deleted/renamed webhooks with a full installation
  resync, so repos created on github.com appear without a manual refresh.
- Survive cloning empty repositories in the worker: point the unborn HEAD
  at the stored default branch and skip remote-ref sync steps; reject sha
  pins against empty remotes with a clear error.
- Teach the environment-setup skill an empty-repository bootstrap: push one
  initial commit (README + .gitignore) to the default branch, then define
  the smallest valid environment. No app scaffolding - building the project
  is the user's first task.
- Flag empty repos in the environment-definition kickoff prompt (inline
  fallback for older worker images) and stop blocking all-empty selections
  in onboarding and the environments start command.
- New CreateGitHubRepoDialog (github.com/new with owner prefill, or fork an
  existing repo by URL) with live detection of newly synced repos, wired
  into onboarding repo selection, Settings > Environments > New
  (?create-repo=1 deep link), and the workspace picker.
- Docs: brand-new-repository flow in environments.mdx and the webhook-event
  note in the GitHub provider guide.

* feat(web): add repository creation to repository lists

* refactor(web): simplify repository creation dialog

* fix(web): remove unused repository UI code

* fix(web): reconcile repository creation UI after rebase

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
* feat: show Roomote version in user menu

* UI fixes

* menu

* review

---------

Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…nfigured (#884)

* [Fix] Verify Microsoft Teams bot credentials before reporting them configured

Saving Microsoft/Teams credentials only checked that the fields were
non-empty, so a wrong app id, client secret, or tenant id was stored and
reported as "Bot configured". The mismatch then surfaced as bare 401s on
the messaging endpoint, with the actual cause visible only in server logs.

Run the same client-credentials token request the bot uses at runtime and
map Entra's AADSTS codes back to the field an admin got wrong, then fail
the save with that field named. Both save paths (settings and onboarding)
verify before writing.

Presence still cannot answer the question for credentials injected as
environment variables or for secrets that expired after setup, so the
Teams integration status now carries a cached live verdict and the
settings panel reports a rejection instead of claiming success.

Also explain why the Teams app package download is unavailable rather than
leaving a dead button when the entered App (Client) ID is not a GUID.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Fix review findings: drop credential hashing, invalidate caches after commit

CodeQL flagged the status-check cache key as insecure password hashing: it
ran SHA-256 over a tuple containing the client secret. Compare the resolved
tuple directly instead — no digest over a secret, and no collision surface.

The onboarding save dropped the credential-check cache before its
transaction and never dropped the runtime credential cache, so the 30s
runtime cache kept serving the pre-save tuple and the next status refresh
reported the replaced credentials instead of the ones just verified. Both
caches now clear after the commit, matching the settings path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Trim Entra diagnostics out of the admin-facing credential error

The live AADSTS90002 response carried "Trace ID… Correlation ID…
Timestamp…" inline on the message line rather than after \r\n, so the
first-line trim let the whole diagnostics tail through to the toast.
Strip the trace metadata regardless of layout, and when the failing
field is identified keep only Entra's first sentence — our per-field
guidance already restates the actionable advice. Unrecognized errors
keep the fuller (trace-stripped) description since there is no guidance
to lean on. Server logs still carry the complete response body.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Warn about a malformed App (Client) ID at the field, not only at step 3

The GUID explanation lived under the package-download button two steps
below the input, so the person who typed the bad value never saw it.
Show a short inline warning directly under the app-id field (both
R_MICROSOFT_CLIENT_ID and the advanced R_TEAMS_BOT_APP_ID) whenever the
entered value cannot be an Entra client id, and keep the step-3 note to
explain the disabled download button.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Unexport getMicrosoftAppIdFormatWarning — only used in-module (knip)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Linear Dialog

* Refine Linear app manifest setup

* Use standard Linear integration action

* Align Linear credential inputs with providers

* feat(web): reorder integration onboarding

* Correct Linear manifest developer name

* feat(web): animate onboarding card transitions

* manifest and update

* Clarify integration configuration states

* Keep OAuth replay on public app URL

* Complete Linear OAuth connection flow

* Fix Linear task startup and account linking

* Fix integration settings section test labels

* Fix Linear integration lint errors

* Fix Linear integration static checks

* tweak

* fix(linear): secure account link authorization

* test(web): update integration section expectations
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
@roomote-roomote

roomote-roomote Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

1 issue outstanding. See task

  • apps/web/src/lib/server/mcp-linear.ts:175 The replay path accepts the OAuth viewer from any Linear user or organization, then consumes the original session replay and starts its task. Verify the viewer ID and organization against the replay's saved Linear identity before updating the link or resuming the session; otherwise a user who authorizes a different Linear account gets a successful but invalid link and bypasses the session identity check for that initial task.
  • packages/communication/src/messages.ts:57 A claim is retained for 30 days, but every later call generates a new claim token. If a worker/request stops after moving the message into the claim key, later deliveries see the mismatched claim and return no quote, so that follow-up is suppressed until the lease expires. Make an abandoned claim recoverable (or use a short lease) before treating it as unavailable.

Reviewed 85c66c0

@mintlify

mintlify Bot commented Jul 29, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
roomote 🟢 Ready View Preview Jul 29, 2026, 6:21 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

* fix: atomically claim GitHub reply quotes

* fix: retain quote claim generations

* fix: make GitHub quote claims replay-safe

---------

Co-authored-by: Daniel Riccio <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix(web): bind Linear OAuth replay to saved identity

* fix(web): preserve Linear links during OAuth replay

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
@mrubens
mrubens merged commit 327961f into main Jul 29, 2026
45 checks passed
@mrubens
mrubens deleted the release/v0.26.0 branch July 29, 2026 19:36
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.

3 participants