Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
72cb31e
fix: include manually active sessions in board filter (#3346)
roomote-roomote[bot] Sep 30, 2026
d2043d0
[Fix] Approvals no longer check parallel calls with another call's ar…
daniel-lxs Sep 30, 2026
bccaaf7
[Feat] Auto pauses a Session when calls can't be checked (#3337)
daniel-lxs Oct 1, 2026
041e792
[Improve] Auto runs calls the owner asked for or already approved (#3…
daniel-lxs Oct 1, 2026
e1e4a8d
Auto guidance flags only the action it names, not steps toward it (#3…
daniel-lxs Oct 1, 2026
9fd1c48
[Improve] Auto asks less often about writes the owner asked for (#3349)
daniel-lxs Oct 1, 2026
55856ee
[Improve] Auto treats check-reads as part of the request and keeps gu…
daniel-lxs Oct 1, 2026
400a50e
[Improve] Auto checks which item an id refers to before running a cal…
daniel-lxs Oct 1, 2026
e60993d
[Fix] Task detail hides human prompts beginning with commands (#3199)
roomote-roomote[bot] Oct 1, 2026
2bc221e
refactor: require automation run context (#3358)
roomote-roomote[bot] Oct 1, 2026
06496e7
[Feat] Add configurable model fallbacks (#3360)
roomote-roomote[bot] Oct 1, 2026
c2ca30b
[Improve] Auto no longer asks about reads the user did not request (#…
daniel-lxs Oct 1, 2026
447cb91
[Feat] Choose Auto per session from a tool approvals mode in the comp…
daniel-lxs Oct 1, 2026
7a05957
[Improve] Integrations page no longer offers Auto as a tool choice (#…
daniel-lxs Oct 1, 2026
997f2d5
Auto singles out no kind of action: remove the money question (#3364)
daniel-lxs Oct 2, 2026
c35b290
Release Roomote 1.15.1 (#3375)
roomote-roomote[bot] Oct 2, 2026
5a8254b
[Improve] Auto runs harmless actions nobody asked for (#3367)
daniel-lxs Oct 2, 2026
7280641
[Improve] Auto judges a task's calls with its session's context (#3368)
daniel-lxs Oct 2, 2026
8216a07
[Fix] Apply subagent model fallbacks when roles inherit the coding mo…
mrubens Oct 2, 2026
bd80c46
Amend Roomote 1.15.1 release notes (#3378)
mrubens Oct 2, 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
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ This repository is open source. Treat GitHub and other public surfaces as fully
- Keep equivalent functionality in sync across supported source-control, communication, and sandbox providers whenever applicable. Do not intentionally make provider-specific exceptions unless the user explicitly requests one.
- When adding or changing a built-in automation, explicitly evaluate whether it needs text-based Additional rules for repository scope, per-repository communication-output routing, and residual workflow/report guidance. Opt in when its output goes to a communication provider and can contain material relevant to different people or teams; exclude inherently global, triage-oriented (except CI Failure Triage), and non-communication-output automations. Keep the eligibility metadata, settings UI, save-time compilation and validation, persisted automation settings, runtime scope/routing enforcement, and prompt propagation aligned.
- **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.
- **Model roles:** `TASK_MODEL_ROLE_DESCRIPTORS` in `packages/types/src/model-provider-config.ts` is the single source of truth for model roles. When adding a role, define its fallback model and reasoning env vars and its fallback runtimes; wire those runtimes through the shared fallback classifier and application path; map subagents in `MODEL_FALLBACK_AGENT_ROLES`; and update the role fallback contract test and `apps/docs/models.mdx`. Do not hard-code role env lists or confuse provider-error fallback with `modelFallback`, which means **Same as coding model** inheritance.

## Slack message formatting

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

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

## 1.15.1 (2026-10-02)

Roomote 1.15.1 adds resilient model fallbacks, reduces Auto approval prompts, and fixes approval, sessions board, and task-detail edge cases.

### Highlights

- Configure per-role model fallbacks that keep work moving through eligible provider failures and make each switch visible to users.
- Fewer unnecessary Auto approval prompts.
- Review the correct arguments when an agent calls the same integration tool several times at once.
- Keep manually active sessions and human command-style prompts visible in the views where users expect them.

### Patch changes

- Fix tool approvals showing and checking the wrong arguments when an agent calls the same tool several times at once.
- Add configurable per-role model fallbacks with sticky runtime switching, provider-error retry classification, user-visible notices, notifications, and anonymous telemetry.
- Keep manually active sessions visible in the sessions board's Active lane.
- Keep human prompts that begin with commands visible in task details while continuing to hide generated setup and automation prompts.
- Reduce unnecessary Auto approval prompts for harmless actions and for steps a session's owner already approved.
- Apply model fallbacks to subagents that use the "Same as coding" model.

## 1.15.0 (2026-09-30)

Roomote 1.15 makes sessions and automation runs easier to follow while adding opt-in Judgement repository rules, prompt history, and more reliable approval and resume flows.
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/api/src/handlers/discord/__tests__/fast-agent.test.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/api/src/handlers/discord/__tests__/task-launch.test.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/api/src/handlers/discord/callback-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ async function launchClaimedDiscordSuggestion(input: {
input.triggerId,
),
createAnchoredThread: false,
visibleInTranscript: false,
});
return fastStart.accepted
? {
Expand Down Expand Up @@ -468,6 +469,7 @@ async function launchClaimedDiscordSuggestion(input: {
applicationId: input.applicationId,
requesterDiscordUserId: input.sender.id,
launchOwnerUserId: input.senderUserId,
visibleInTranscript: false,
queuedMessage,
metadata,
channel: launchChannel,
Expand Down
2 changes: 2 additions & 0 deletions apps/api/src/handlers/discord/channel-auto-start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ export async function maybeHandleDiscordChannelAutoStart(input: {
await processDiscordFastAgentMessage({
...fastEntry,
senderUserId: launchOwnerUserId!,
visibleInTranscript: true,
});
return;
}
Expand All @@ -417,6 +418,7 @@ export async function maybeHandleDiscordChannelAutoStart(input: {
...fastEntry,
senderUserId: automationLaunchUserId,
delegatedTaskInitiator: initiator,
visibleInTranscript: false,
});
if (fastStart.accepted) {
apiLogger.info(
Expand Down
5 changes: 5 additions & 0 deletions apps/api/src/handlers/discord/fast-agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ export async function processDiscordFastAgentMessage(
* turns pass their automation initiator so delegated work keeps automation
* provenance instead of appearing installer-initiated. */
delegatedTaskInitiator?: TaskInitiator;
/** Visibility comes from the entry surface, not the delegated task initiator. */
visibleInTranscript?: boolean;
onAccepted?: (abort: () => Promise<void>) => void;
onRejected?: () => void;
} & DiscordFastAgentSource,
Expand Down Expand Up @@ -505,6 +507,9 @@ export async function processDiscordFastAgentMessage(
applicationId: input.applicationId,
requesterDiscordUserId: input.sender.id,
launchOwnerUserId: input.senderUserId,
...(input.visibleInTranscript !== undefined
? { visibleInTranscript: input.visibleInTranscript }
: {}),
...(input.delegatedTaskInitiator
? { initiator: input.delegatedTaskInitiator }
: {}),
Expand Down
3 changes: 3 additions & 0 deletions apps/api/src/handlers/discord/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1074,6 +1074,7 @@ async function processDiscordGatewayEvent(
createAnchoredThread: false,
...(fastInteraction ? { interaction: fastInteraction } : {}),
directedAtRoomote: true,
visibleInTranscript: true,
});
return { ok: true, fastAnswered: true, fastStartedNew: true };
}
Expand Down Expand Up @@ -1107,6 +1108,7 @@ async function processDiscordGatewayEvent(
isDiscordBotMentioned(message, resolved.botUserId),
addressedToRoomote: unmentionedReplyAddressedToRoomote,
peerConversationsEnabled,
visibleInTranscript: true,
});
return { ok: true, fastAnswered: true, fastContinued: true };
}
Expand Down Expand Up @@ -1172,6 +1174,7 @@ async function processDiscordGatewayEvent(
...(reactionTarget ? { anchorMessageId: reactionTarget.messageId } : {}),
activeTasks: activeRun ? [{ taskId: activeRun.taskId }] : [],
directedAtRoomote: true,
visibleInTranscript: true,
});
return { ok: true, fastAnswered: true, fastDefaulted: true };
}
Expand Down
5 changes: 5 additions & 0 deletions apps/api/src/handlers/discord/task-launch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,8 @@ export async function launchDiscordTask(input: {
* automation-owned launches for bot-authored messages.
*/
initiator?: TaskInitiator;
/** Explicit visibility from the task-launch origin, independent of initiator. */
visibleInTranscript?: boolean;
/**
* Agent-facing prompt override (e.g. auto-respond channel instructions
* prepended to the message); the queued message text stays the
Expand Down Expand Up @@ -473,6 +475,9 @@ export async function launchDiscordTask(input: {
: {}),
}
: {}),
...(input.visibleInTranscript !== undefined
? { visibleInTranscript: input.visibleInTranscript }
: {}),
},
};

Expand Down
5 changes: 5 additions & 0 deletions apps/api/src/handlers/discord/task-orchestration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ export async function startNewDiscordTask(input: {
launchOwnerUserId?: string;
/** Attribution override; takes precedence over the default user initiator. */
initiator?: TaskInitiator;
/** Explicit visibility from the task-launch origin, independent of initiator. */
visibleInTranscript?: boolean;
queuedMessage: QueuedCommunicationMessage;
metadata: DiscordEventCommunicationMetadata;
channel: DiscordChannelContext;
Expand Down Expand Up @@ -245,6 +247,9 @@ export async function startNewDiscordTask(input: {
provider: input.provider,
launchOwnerUserId: input.launchOwnerUserId,
...(input.initiator ? { initiator: input.initiator } : {}),
...(input.visibleInTranscript !== undefined
? { visibleInTranscript: input.visibleInTranscript }
: {}),
...(agentPromptText ? { agentPromptText } : {}),
queuedMessage: {
...input.queuedMessage,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions apps/api/src/handlers/mcp/native-tool-approvals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export async function resolveNativeToolApprovalGuard(input: {
tokenType: input.auth.tokenType,
resolveActingUserId: () => resolveTaskOrSessionUserIdOrNull(input.auth),
resolveTaskId: () => resolveRunTokenTaskId(input.auth),
requestHeaders: input.requestHeaders,
});

const inert =
Expand Down
1 change: 1 addition & 0 deletions apps/api/src/handlers/mcp/proxy-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1002,6 +1002,7 @@ export function createMcpProxy(config: McpProxyConfig) {
tokenType: auth.tokenType,
resolveActingUserId: () => resolveTaskOrSessionUserIdOrNull(auth),
resolveTaskId: () => resolveRunTokenTaskId(auth),
requestHeaders: c.req.raw.headers,
});
} catch (error) {
// Fail closed: an unreadable policy must not let a gated tool run.
Expand Down
Loading
Loading