v2.2-paseo-providers: Paseo provider stack + v2.2.1 pane-scoped chat fixes

Ship Paseo-equivalent provider snapshot, AgentComposerBar, ACP dispatch
rewrite with streaming/persist, permission prompts, and agent commands.
Follow-up: pane-scoped chat resolution, CoderMessageList tool timeline,
WS user-delta replace, and inference orphan tool_call stripping.
Archive openspec v2-2; update CHANGELOG and CURRENT.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-26 15:18:31 +00:00
parent 04673eaf59
commit 93d3f86c2b
96 changed files with 6694 additions and 1329 deletions

View File

@@ -1,12 +1,13 @@
import { useEffect, useState } from 'react';
import { Link, useNavigate, useParams } from 'react-router-dom';
import { Plus, MessageSquare, Trash2, ChevronDown, ChevronRight, RotateCcw, Menu } from 'lucide-react';
import { Plus, MessageSquare, Trash2, ChevronDown, ChevronRight, RotateCcw, Menu, Code } from 'lucide-react';
import { toast } from 'sonner';
import { api } from '@/api/client';
import type { Project as ProjectType, Session } from '@/api/types';
import { Button } from '@/components/ui/button';
import { sessionEvents } from '@/hooks/sessionEvents';
import { useSessions } from '@/hooks/useSessions';
import { isCoderSessionName } from '@/lib/coder-session';
import { useSidebarDrawer } from '@/hooks/useSidebarDrawer';
import { useViewport } from '@/hooks/useViewport';
@@ -124,7 +125,11 @@ export function Project() {
{sessions.map((s) => (
<li key={s.id} className="flex items-center justify-between px-3 py-2 hover:bg-muted/50">
<Link to={`/session/${s.id}`} className="flex-1 flex items-center gap-2 min-w-0">
<MessageSquare className="size-3.5 opacity-70 shrink-0" />
{isCoderSessionName(s.name) ? (
<Code className="size-3.5 opacity-70 shrink-0" />
) : (
<MessageSquare className="size-3.5 opacity-70 shrink-0" />
)}
<span className="truncate text-sm">{s.name}</span>
<span className="text-xs text-muted-foreground font-mono ml-2 shrink-0">
{s.model}

View File

@@ -190,6 +190,9 @@ function SessionInner({ sessionId }: { sessionId: string }) {
[addSplitPane, isMobile, navigate, location.pathname, location.search],
);
const activePaneKind = panes[activePaneIdx]?.kind;
const showSessionModelPicker = activePaneKind !== 'coder';
// v1.10.3 keyboard shortcuts. Window-level keydown so they fire from
// anywhere in the session view. Only Cmd/Ctrl-Shift-C defers to the xterm
// (which has its own copy binding for that combo); everything else fires
@@ -351,7 +354,7 @@ function SessionInner({ sessionId }: { sessionId: string }) {
)}
</div>
{session && (
{session && showSessionModelPicker && (
<ModelPicker
value={session.model}
onChange={async (model) => {
@@ -449,7 +452,7 @@ function SessionInner({ sessionId }: { sessionId: string }) {
)}
<div className="ml-auto shrink-0">
{session && (
{session && showSessionModelPicker && (
<div className="inline-flex items-center rounded-full bg-muted/40 hover:bg-muted/70 px-1">
<ModelPicker
value={session.model}
@@ -478,6 +481,7 @@ function SessionInner({ sessionId }: { sessionId: string }) {
chatsHook={chatsHook}
session={session}
project={project}
onAddPane={addPaneAndSwitch}
/>
)}
</div>