Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@

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

## 1.20.1 (2026-11-05)

Roomote 1.20.1 restores reliable Copilot task helpers, keeps Slack history reads useful in busy channels, and clarifies how agents carry out Slack replies and GitHub actions.

### Highlights

- Restore GitHub Copilot GPT-5.x task helpers that failed on an unsupported endpoint.
- Keep available Slack history when a busy channel cannot be read completely in one request.
- Avoid false lost-access reports for private Slack conversations and false refusals of authorized GitHub actions.

### Patch changes

- GitHub Copilot GPT-5.x task helpers use the correct inference endpoint instead of failing on requests sent to an unsupported endpoint.
- Coding tasks recognize their authorized GitHub write path when integration tools are read-only, avoiding false refusals to carry out requested pull request updates, comments, or workflow actions.
- Slack channel history reads return accumulated messages with explicit partial-result and continuation information instead of timing out and losing all results in busy channels.
- Slack destination guidance distinguishes unlisted private channels from lost access and directs replies, including automation results, to the current conversation without requiring standalone channel discovery.

## 1.20.0 (2026-11-04)

Roomote 1.20.0 adds MCP connection controls and testing, stops runaway agent activity, and includes security updates for redirects and static-file serving.
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.

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

125 changes: 122 additions & 3 deletions apps/api/src/handlers/mcp/__tests__/slack-channel-messages.test.ts

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

13 changes: 13 additions & 0 deletions apps/api/src/handlers/mcp/communication-channel-discovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -450,5 +450,18 @@ export async function listCommunicationDestinations(
destinations: filtered,
offset: input.offset,
limit: input.limit,
...(input.kind === 'channel'
? { limitations: [SLACK_CHANNEL_LISTING_LIMITATION] }
: {}),
});
}

/**
* An agent that cannot find its automation's private target channel here
* should not conclude that Slack access was lost.
*/
const SLACK_CHANNEL_LISTING_LIMITATION = {
provider: 'slack' as const,
reason:
'Only public Slack channels Roomote has joined are listed; private channels are never standalone destinations, and a missing channel does not mean Slack access was lost. To post in the current conversation, including a custom automation result for its configured channel, use send_chat_reply.',
};
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,29 @@ export function applyChannelMessagesResultBudget(
truncated: true,
omittedMessageCount: omitted,
...(newestOmitted ? { nextLatest: newestOmitted.id } : {}),
note: `Result truncated to the newest ${subset.length} of ${messages.length} messages in the requested range. To read the older messages, call again with latest set to nextLatest and the same oldest; that page will not repeat any message returned here.`,
...(newestOmitted
? {
sizeContinuation: {
...(payload.requestedOldest
? { oldest: payload.requestedOldest }
: {}),
latest: newestOmitted.id,
...(payload.provider === 'slack'
? {
historyLatest:
payload.requestedHistoryLatest ?? payload.requestedLatest,
}
: {}),
},
}
: {}),
note: [
`Result truncated to the newest ${subset.length} of ${messages.length} messages. Call again with sizeContinuation and the same channel/provider. Retain historyContinuation independently; process all further continuations with their own bounds and deduplicate by ID.`,
// A provider read that already stopped early keeps its explanation.
payload.note,
]
.filter(Boolean)
.join(' '),
};
};

Expand Down
Loading
Loading