Merge branch 'dev' into feature/cross-team-communication

This commit is contained in:
iliya 2026-03-09 20:00:00 +02:00
commit 9f5d2d005d
4 changed files with 24 additions and 14 deletions

View file

@ -3157,9 +3157,14 @@ export class TeamProvisioningService {
}
}
} else {
// Pre-ready: provisioning narration is shown in the ProvisioningProgressBlock banner
// (via provisioningOutputParts). Do NOT push to live cache to avoid duplicate display
// and leaking internal provisioning monologue into the Activity timeline.
// Pre-ready: keep showing provisioning narration in the banner, but also mirror it
// into the live cache so Messages/Activity can show the earliest assistant output.
if (!run.silentUserDmForward && !hasCapturedSendMessage) {
const cleanText = stripAgentBlocks(text).trim();
if (cleanText.length > 0) {
this.pushLiveLeadTextMessage(run, cleanText);
}
}
}
}

View file

@ -1606,6 +1606,7 @@ export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Ele
expandOverrides={expandedSet}
onToggleExpandOverride={toggleExpandOverride}
teamSessionIds={teamSessionIds}
currentLeadSessionId={data?.config.leadSessionId}
onMemberClick={setSelectedMember}
onCreateTaskFromMessage={(subject, description) => {
openCreateTaskDialog(subject, description);

View file

@ -44,10 +44,12 @@ interface ActivityTimelineProps {
onToggleExpandOverride?: (key: string) => void;
/**
* All session IDs belonging to this team (current + history).
* When two adjacent messages have different leadSessionId but both are in this set,
* the "New session" separator is suppressed (it's a reconnect, not a new session).
* Used together with currentLeadSessionId to suppress only the reconnect boundary
* from the current live session back into the team's previous session history.
*/
teamSessionIds?: Set<string>;
/** Current lead session ID for the active team, if known. */
currentLeadSessionId?: string;
}
const VIEWPORT_THRESHOLD = 0.15;
@ -155,6 +157,7 @@ export const ActivityTimeline = ({
expandOverrides,
onToggleExpandOverride,
teamSessionIds,
currentLeadSessionId,
}: ActivityTimelineProps): React.JSX.Element => {
const [visibleCount, setVisibleCount] = useState(MESSAGES_PAGE_SIZE);
@ -361,13 +364,15 @@ export const ActivityTimeline = ({
const prevSessionId = getItemSessionId(timelineItems[realIndex - 1]);
const currSessionId = getItemSessionId(item);
if (prevSessionId && currSessionId && prevSessionId !== currSessionId) {
// Suppress separator when both sessions belong to the same team
// (reconnects produce new session IDs but are not "new sessions" from user's perspective)
const isSameTeam =
// Suppress only the boundary between the current live session and the team's
// older session history. Older historical session boundaries should still render.
const isReconnectBoundary =
!!currentLeadSessionId &&
teamSessionIds &&
teamSessionIds.has(prevSessionId) &&
teamSessionIds.has(currSessionId);
if (!isSameTeam) {
teamSessionIds.has(currSessionId) &&
(prevSessionId === currentLeadSessionId || currSessionId === currentLeadSessionId);
if (!isReconnectBoundary) {
sessionSeparator = (
<div
className="flex items-center gap-3"

View file

@ -158,7 +158,6 @@ export const MessageComposer = ({
trimmed.length > 0 &&
trimmed.length <= MAX_TEXT_LENGTH &&
!sending &&
!isProvisioning &&
!attachmentsBlocked;
// Track whether we initiated a send — clear draft only on confirmed success
@ -345,7 +344,7 @@ export const MessageComposer = ({
<div className="ml-auto flex shrink-0 items-center gap-2">
{isProvisioning ? (
<span className="text-[10px]" style={{ color: 'var(--warning-text)' }}>
Launching...
Launching... inbox delivery only
</span>
) : !isTeamAlive ? (
<span className="text-[10px]" style={{ color: 'var(--warning-text)' }}>
@ -462,7 +461,7 @@ export const MessageComposer = ({
id={`compose-${teamName}`}
placeholder={
isProvisioning
? 'Team is launching... Please wait.'
? 'Team is launching... message will be queued for inbox delivery.'
: 'Write a message... (Enter to send, Shift+Enter for new line)'
}
value={draft.text}
@ -476,7 +475,7 @@ export const MessageComposer = ({
minRows={2}
maxRows={6}
maxLength={MAX_TEXT_LENGTH}
disabled={sending || isProvisioning}
disabled={sending}
cornerAction={
<div className="flex items-center gap-2">
{/* NOTE: ContextRing disabled — usage formula is inaccurate */}