Skip to content

Promote v0.13.0 to production#577

Merged
mrubens merged 16 commits into
mainfrom
release/v0.13.0
Jul 19, 2026
Merged

Promote v0.13.0 to production#577
mrubens merged 16 commits into
mainfrom
release/v0.13.0

Conversation

@mrubens

@mrubens mrubens commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Promote v0.13.0

Frozen at 5ec38bdc67f381802c55e2fabc322ef3de1bb972 — the commit where 0.13.0 was versioned. Commits merged to develop after that point ship in the next release.

  • 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.13.0 and triggers the existing GHCR v* image publish (latest channel).
  • The release/v0.13.0 branch can be deleted after this PR merges.

Changelog

0.13.0 (2026-07-19)

Minor changes

  • Make presentational widgets follow the selected Roomote theme and provide native layout classes and CSS variables for agent-generated UI.
  • Add an OpenAI-compatible inference provider option for any OpenAI API endpoint, including multiple named connections in Settings > Models.
  • Add Triage GitHub Issues automation under Review Code that posts clarifying questions or a proposed plan on env-backed issues when they open or reopen.

Patch changes

  • Stop Discord (and Teams/Telegram) task runs from posting duplicate closeout messages after PR delivery by using the same parent-owned single-closeout lifecycle as Slack.
  • Discord account-link setup instructions now arrive by DM with a short channel acknowledgement instead of full setup copy in public channels, deduplicated to one link DM per user per day, and turn Settings → Personal → Linked Accounts into a link to Personal settings
  • Rebuild Discord thread context on follow-ups and snapshot resumes so agents receive earlier undelivered messages, the latest Roomote reply, and prior attachments instead of only the latest user text.
  • Apply Slack-style unmentioned follow-up gating in Discord task threads so natural replies only work for people already in the conversation until the next @mention.
  • Reuse the original Roomote task when a second GitHub issue @mention lands on the same issue.
  • Recover stalled worker bootstraps promptly with bounded claim retries, a single fresh sandbox restart, and a provider-neutral bootstrap watchdog instead of waiting for the full orphan-recovery window.
  • Strip Discord/Teams/Telegram prompt wrappers so task transcripts show only the user message text.
  • Frame third-party text (issue bodies, PR discussion, automation source context) as untrusted data in agent prompts, with escaped delimiter blocks and a shared injection-resistance policy

roomote-roomote Bot and others added 16 commits July 18, 2026 12:53
* fix(discord): attach full thread context on follow-ups like Slack

Rebuild undelivered Discord thread history into active-run and snapshot-
resume prompts with <thread_context> and <replying_to>, and keep launch
history from re-injecting on later turns.

* fix(discord): keep prior attachments in follow-up thread context

Claim attachment-only Discord messages on continuations, process their
images/documents into the queued follow-up, and surface filenames in
thread_context so later turns can still see referenced media.

* fix(discord): claim attachments on the latest Roomote reply

Keep Roomote text in <replying_to>, but still claim attachment-bearing bot
replies (including the newest one) so follow-ups can see that media.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* feat: add native widget theme contract

* refactor: isolate widget theme bridge

* fix: guide widgets away from overflow

* fix: make widget guidance product agnostic
…ipt (#561)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* Fail stalled worker bootstraps promptly

* Restart failed worker bootstraps once

* Address bootstrap recovery review feedback

* Format bootstrap recovery test

* Retry immediate Modal worker exits

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…ng the original (#564)

* fix: reuse original task on repeated GitHub issue @mentions

Route a second @roomote comment on the same GitHub issue into the existing
issue-linked task instead of starting a sibling standard task.

* chore: add changeset for GitHub issue task reuse

* fix: wait for booting issue task before starting a sibling

Retry second GitHub issue @mentions when the original task is still
booting (409 no active sandbox), matching PR follow-up wait behavior.

* fix: retry issue follow-ups on sandbox-still-booting 409

Treat the RPC booting 409 the same as missing-sandbox so second issue
@mentions keep retrying the original task instead of spawning a sibling.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Give teams/telegram/discord the same parent-owned single-closeout guidance Slack already has so agents stop re-posting duplicate PR delivery messages.

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* feat: add Issue Fixer background automation

Add a scheduled Issue Fixer automation that scans open GitHub issues on
environment-backed repos and launches focused implement-changes follow-ups,
with settings UI, jobs, skill, and docs.

* feat: make Issue Fixer webhook-driven like code review

Run Issue Fixer immediately on issues.opened/reopened for environment-
backed GitHub repos, use an on/off toggle instead of a daily/weekly
schedule, and drop the hourly batch scan path.

* feat: triage GitHub issues with plan-only immediate webhooks

Rename to Triage GitHub Issues, place it under Review Code, launch on
issue open/reopen to post a plan comment only, and fix CI schedule-only
and webhook router tests.

* fix: launch one Triage GitHub Issues task per issue without debounce

Remove Redis debounce so each opened/reopened issue gets its own task.

* refactor: drop Slack suggestion surface for Triage GitHub Issues

Remove scheduled-summary Slack copy and destinations: plans post on the
GitHub issue. Clean product skill wording and suggestion-source plumbing.

* docs: move    Triage GitHub Issues under PR automations

Document it next to Review Code and drop it from the manager-automation
table so docs match the product: plan comments on GitHub, no Manager Channel.

* refactor: make Triage GitHub Issues webhook-only with clarifying questions

Remove Run now and the duplicate manual prompt. Prompt/skill now ask for
relevant clarifying information on the GitHub issue when the plan is blocked.

* docs: ask clarifying questions in Triage GitHub Issues skill

Align the packaged skill with the webhook prompt: request missing
acceptance criteria or scope on the issue when needed.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
)

* improve: match Discord unmentioned replies to Slack gating

Apply Slack/Teams-style eligibility and interjection rules so natural
follow-ups in Discord task threads stop requiring drive-by side chat to
be treated as agent turns.

* refactor: share unmentioned thread-reply core across Slack, Discord, Teams

Extract eligibility and interjection-window evaluation into a single pure
helper so the three providers stay behavior-aligned without duplicating
the decision loop.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* feat: add OpenAI-compatible inference provider

Add a first-class OpenAI-compatible endpoint provider so operators can
connect any OpenAI API server without guessing LiteLLM, Ollama, or vLLM.

* fix: stop openai-compatible leaking OPENAI_API_KEY

Keep OpenAI-compatible providers on dedicated env vars only,
and update the fixture expecting the new non-secret base URL.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
#569)

* improve: refresh Triage GitHub Issues comment formats

Use clearer clarifying-question and proposed-plan issue comments, with less
gh CLI ceremony in the prompt and skill.

* fix: use configured GitHub app slug in triage issue mentions

Inject resolveConfiguredGitHubAppSlug into Triage GitHub Issues comment
templates instead of hard-coding @roomote.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
#570)

* [Improve] Frame third-party text in agent prompts as untrusted content

GitHub issue bodies, PR discussion context, and automation work-item
source context now land in agent prompts inside escaped delimiter blocks
alongside a shared untrusted-content policy, so quoted external text is
treated as data rather than instructions. The review-code skill gains
matching constraints for reviewing externally authored pull requests.

* Wrap automation work-item descriptive fields in untrusted-content blocks

Addresses review feedback: the work-item title is now escaped inline and
the brief and investigation context land inside escaped delimiter blocks.
The execution prompt stays unwrapped because it is the automation's
instruction channel; the provenance boundary for it belongs to the scan
run that distills external sources into the work item.

* Scope scan-authored execution prompts and harden the issue triage prompt

Addresses the remaining review finding: automation work-item execution
prompts are scan-agent output over external sources, so they no longer
ride as a fully trusted instruction channel. They are delivered inside an
escaped automation_execution_guidance block that the shared policy limits
to the named work item, unable to expand scope or authorize new actions.

Also extends the untrusted-content framing to the surfaces that arrived
with the develop merge: the Triage GitHub Issues prompt now escapes the
issue title, labels, author, and URL inside task_context, delimits the
issue body, and carries the policy; repeat-mention issue follow-up
messages get the same mention-request framing as the initial mention.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
* fix(discord): DM account-link instructions from guild channels

Keep full setup copy out of public channels when an unlinked user pings
Roomote: open a DM with the full link prompt and acknowledge briefly in
the channel. Fall back to public instructions when DMs are blocked.

* fix(discord): only public-fallback account-link on blocked DMs

Rethrow retryable Discord DM failures so the Gateway keeps the event
instead of leaking full setup instructions into the guild channel.

* fix(discord): require 50007 before account-link public fallback

Only Discord's cannot-send-messages code treats DMs as blocked. Bare 403s
like Missing Access no longer dump full setup instructions in guild channels.

* Dedupe account-link DMs across entry paths and share the slot helpers

Review feedback: the mention-flow link prompt sent a fresh DM on every
unlinked ping while the auto-start nudge next door already had a Redis
dedupe. Both paths now share one claim/release slot (24h TTL per user)
in account-link.ts, so repeated pings acknowledge the existing DM, a
Gateway retry after a partial failure cannot double-send, and any entry
path suppresses the others' duplicates. The mention flow fails open when
Redis is unavailable (a possible duplicate DM beats silence); the
best-effort nudge keeps failing closed.

Also composes the fallback instruction into the full link message so
the copy cannot drift, documents the intentional silence on permanent
non-50007 DM failures, covers the unlinked guild slash-command path
with a test, and adds the missing changeset.

* fix(discord): wait for in-flight account-link DMs before ack

Split the per-user DM slot into pending vs sent so concurrent mention
acks never treat a claimed but undelivered DM as sent. Wait briefly for
settlement, then retry or 503 instead of a false channel acknowledgement.

* Expire pending link-DM claims quickly so a crashed claimant self-heals

The pending slot carried the full 24h dedupe TTL, so a claimant that
crashed between claim and mark/release would wedge the slot for a day:
every later unlinked ping would wait out the in-flight window and bounce
back to the Gateway with no user-visible reply. Pending claims now
expire after 120 seconds; only a confirmed delivery holds the slot for
the full window.

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Stop endpoint credential saves from rejecting the primary base URL when it is
also present for display, use a URL keyboard for endpoint fields, and remove the
doubled optional API key label.

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
)

* feat: allow multiple named OpenAI-compatible provider connections

Operators can add several OpenAI-compatible endpoints, each with a
connection name, namespaced env vars, and distinct model-id prefixes.

* fix: clean up lint issues after multi-provider change

* fix: linearize OpenAI-compatible connection name normalization

Avoid CodeQL polynomial-regex warnings, cap connection name length, keep bare
endpoint edits working without a name, and only show the catalog template in
Add Provider for another OpenAI-compatible connection.

* improve: simplify OpenAI-compatible connection name helper copy

---------

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
…575)

Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
Co-authored-by: Matt Rubens <2600+mrubens@users.noreply.github.com>
@roomote-roomote

roomote-roomote Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

No code issues found. See task

Reviewed 5ec38bd

@mrubens
mrubens merged commit 7c84ea3 into main Jul 19, 2026
44 checks passed
@mrubens
mrubens deleted the release/v0.13.0 branch July 19, 2026 02:44
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.

2 participants