Skip to content
Open
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
14 changes: 14 additions & 0 deletions apps/docs/fast-sessions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,20 @@ work.

Fast turns also survive API or worker interruptions. Roomote durably admits the turn before acknowledging it, records every action the turn takes as it happens, and resumes unfinished work on another process. The resumed run receives the transcript of its earlier attempt, up to the point it was cut off, so it continues from there instead of repeating actions or asking you to send the request again. If the cut lands on the final reply itself, the resumed run finishes from the transcript: a reply that was recorded is not posted again, and a reply the process died while posting goes out once more without another model request. This covers turns started by a typed message, by an emoji reaction, and by platform events such as a setup kickoff. Provider-side retry waits are honored the same way: short waits keep the turn in place, and longer waits park it durably until the scheduled time.

### Pull Request Reviews

PR-review updates appear in a compact strip above the Session composer. The strip
stays visible while you scroll and shows the latest update for each pull request,
instead of repeating review notifications in the conversation. Your messages and
the agent's ordinary replies remain in the transcript.

Use **Fix findings** to address the current feedback, **Auto-resolve** to enable
automatic resolution for that PR, or **Dismiss** to decline the offer. **View
review** opens the linked review task when available, or the pull request on its
source-control provider. An active linked review shows **Reviewing…**; reported
approval, merge, and closure replace the earlier feedback state. Completed review
status can be dismissed from the strip.

### Message Suggestions

An empty task or Session composer can show one contextual follow-up after an
Expand Down

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

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import {
useCallback,
useContext,
useEffect,
useMemo,
useReducer,
Expand All @@ -17,6 +18,7 @@ import {
getTextFromContentBlocks,
inferAcpMessageKind,
parsePrReviewActionOffer,
parseSessionPrReviewUpdate,
type AcpMessage,
type PrReviewActionChoice,
type AcpEventType,
Expand Down Expand Up @@ -49,11 +51,13 @@ import {
useOpenSessionTasksPanel,
useSessionRunningTaskCount,
useSessionTaskStateRevision,
SessionReviewTasksContext,
} from './session-task-panel-context';
import { useNarrationMode } from '@/hooks/useNarrationMode';
import { usePageTitle } from '@/hooks/usePageTitle';
import { truncatePageTitle } from '@/lib/page-title';
import { PrReviewActionOffer } from '@/components/ai-elements/pr-review-action-offer';
import { SessionPrReviewStrip } from './SessionPrReviewStrip';
import { getSessionPrReviews } from './session-pr-reviews';
import {
findPendingSessionInputRequest,
SessionUserInputCard,
Expand Down Expand Up @@ -306,6 +310,7 @@ export function FastSessionTranscript({
const openTasksPanel = useOpenSessionTasksPanel();
const runningTaskCount = useSessionRunningTaskCount();
const taskStateRevision = useSessionTaskStateRevision();
const reviewTasks = useContext(SessionReviewTasksContext);
const { enabled: narrationModeEnabled } = useNarrationMode();
const displayMode = narrationModeEnabled ? 'narration' : 'default';
const slackMentionScope = useMemo<SlackMentionScope>(
Expand Down Expand Up @@ -552,7 +557,9 @@ export function FastSessionTranscript({
(message) =>
message.eventType !== ACP_ENVELOPE_EVENT_TYPES.RequestUserInput &&
message.eventType !==
ACP_ENVELOPE_EVENT_TYPES.RequestUserInputResponse,
ACP_ENVELOPE_EVENT_TYPES.RequestUserInputResponse &&
!parsePrReviewActionOffer(message.payload) &&
!parseSessionPrReviewUpdate(message.payload),
)
.map((message) => {
const uiMessage = toAcpUiMessage({
Expand Down Expand Up @@ -607,13 +614,9 @@ export function FastSessionTranscript({
() => findPendingSessionInputRequest(messages),
[messages],
);
const reviewOffers = useMemo(
() =>
messages.flatMap((message) => {
const offer = parsePrReviewActionOffer(message.payload);
return offer ? [offer] : [];
}),
[messages],
const reviews = useMemo(
() => getSessionPrReviews(messages, reviewTasks),
[messages, reviewTasks],
);
const uiMessages = useMemo(
() =>
Expand Down Expand Up @@ -785,17 +788,6 @@ export function FastSessionTranscript({
onOpenTasks={openTasksPanel}
/>
) : null}
{reviewOffers.map((offer) => (
<PrReviewActionOffer
key={offer.deliveryId}
className="mt-3 rounded-lg border border-border/70 bg-muted/40 px-3 py-3"
offer={offer}
showQuestion
onAction={(choice) =>
handleReviewAction(offer.deliveryId, choice)
}
/>
))}
{pendingInputRequest ? (
<div className="mt-3">
{pendingInputRequest.preset === 'setup_starter_tasks' ? (
Expand All @@ -814,6 +806,7 @@ export function FastSessionTranscript({
</ConversationContent>
<ConversationScrollButton />
</Conversation>
<SessionPrReviewStrip reviews={reviews} onAction={handleReviewAction} />
{canReply && !pendingInputRequest ? (
<div className="mx-auto w-full shrink-0 overflow-clip rounded-t-md rounded-b-3xl border-2 border-background bg-card outline-0 outline-offset-[-2px] outline-accent-foreground transition-[background-color,border-color,outline-width] has-[textarea:focus]:outline-2 @[56rem]:rounded-t-lg">
<SessionPromptInput
Expand Down

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

Loading
Loading