@spencerboucher/switchyard 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/bridge/lines.js +33 -0
- package/dist/bridge/switchyard-terminal.js +155 -23
- package/dist/switchyard.mjs +3879 -2658
- package/dist/terminal/holder.js +142 -51
- package/package.json +1 -1
- package/web-dist/apple-touch-icon.png +0 -0
- package/web-dist/assets/AutomationView-D7Syv1En.js +2 -0
- package/web-dist/assets/AutomationView-D7Syv1En.js.map +1 -0
- package/web-dist/assets/Checkbox-D6tRfEeI.js +2 -0
- package/web-dist/assets/Checkbox-D6tRfEeI.js.map +1 -0
- package/web-dist/assets/Copy-B6XSAIUd.js +2 -0
- package/web-dist/assets/Copy-B6XSAIUd.js.map +1 -0
- package/web-dist/assets/DangerZone-DfYlxDC1.js +2 -0
- package/web-dist/assets/DangerZone-DfYlxDC1.js.map +1 -0
- package/web-dist/assets/Field-D-Ty7fKT.js +2 -0
- package/web-dist/assets/Field-D-Ty7fKT.js.map +1 -0
- package/web-dist/assets/InteractionCard-DF1EcSpm.js +6 -0
- package/web-dist/assets/InteractionCard-DF1EcSpm.js.map +1 -0
- package/web-dist/assets/Menu-BfOszNC4.js +2 -0
- package/web-dist/assets/Menu-BfOszNC4.js.map +1 -0
- package/web-dist/assets/Overlay-DUQwh6_b.js +2 -0
- package/web-dist/assets/Overlay-DUQwh6_b.js.map +1 -0
- package/web-dist/assets/Priority-CHmzfoHg.js +2 -0
- package/web-dist/assets/Priority-CHmzfoHg.js.map +1 -0
- package/web-dist/assets/{SegmentedControl-D-2BCZzd.js → SegmentedControl-C_hEVQMB.js} +2 -2
- package/web-dist/assets/{SegmentedControl-D-2BCZzd.js.map → SegmentedControl-C_hEVQMB.js.map} +1 -1
- package/web-dist/assets/Select-Cfql4Nwu.js +2 -0
- package/web-dist/assets/Select-Cfql4Nwu.js.map +1 -0
- package/web-dist/assets/Switch-DBfzmqkm.js +2 -0
- package/web-dist/assets/Switch-DBfzmqkm.js.map +1 -0
- package/web-dist/assets/Tabs-BNuL3_Et.js +184 -0
- package/web-dist/assets/Tabs-BNuL3_Et.js.map +1 -0
- package/web-dist/assets/TextArea-CKybrQyn.js +2 -0
- package/web-dist/assets/TextArea-CKybrQyn.js.map +1 -0
- package/web-dist/assets/TextLink-OzzyP2-p.js +2 -0
- package/web-dist/assets/TextLink-OzzyP2-p.js.map +1 -0
- package/web-dist/assets/arrow-down-C-iLrN8I.js +2 -0
- package/web-dist/assets/arrow-down-C-iLrN8I.js.map +1 -0
- package/web-dist/assets/arrow-up-Dj-VTKx4.js +2 -0
- package/web-dist/assets/arrow-up-Dj-VTKx4.js.map +1 -0
- package/web-dist/assets/attention-V86Gye3I.js +2 -0
- package/web-dist/assets/attention-V86Gye3I.js.map +1 -0
- package/web-dist/assets/automations-Cw5Gacgm.js +2 -0
- package/web-dist/assets/automations-Cw5Gacgm.js.map +1 -0
- package/web-dist/assets/board-B8X7TYYR.js +10 -0
- package/web-dist/assets/board-B8X7TYYR.js.map +1 -0
- package/web-dist/assets/code-BKroYJmR.js +12 -0
- package/web-dist/assets/code-BKroYJmR.js.map +1 -0
- package/web-dist/assets/describe-D6KLGKWa.js +5 -0
- package/web-dist/assets/describe-D6KLGKWa.js.map +1 -0
- package/web-dist/assets/enroll-DwT7AcuS.js +2 -0
- package/web-dist/assets/enroll-DwT7AcuS.js.map +1 -0
- package/web-dist/assets/index-B3F7WcYf.css +2 -0
- package/web-dist/assets/index-hxvDvCS7.js +12 -0
- package/web-dist/assets/index-hxvDvCS7.js.map +1 -0
- package/web-dist/assets/logic-B46fwD-8.js +2 -0
- package/web-dist/assets/logic-B46fwD-8.js.map +1 -0
- package/web-dist/assets/more-DQR5uu1c.js +2 -0
- package/web-dist/assets/more-DQR5uu1c.js.map +1 -0
- package/web-dist/assets/queue-DUg1rS8t.js +2 -0
- package/web-dist/assets/queue-DUg1rS8t.js.map +1 -0
- package/web-dist/assets/repo-XzzzEI0d.js +2 -0
- package/web-dist/assets/repo-XzzzEI0d.js.map +1 -0
- package/web-dist/assets/server-BqZ-w6M8.js +2 -0
- package/web-dist/assets/server-BqZ-w6M8.js.map +1 -0
- package/web-dist/assets/settings-DyUu0tJM.js +8 -0
- package/web-dist/assets/settings-DyUu0tJM.js.map +1 -0
- package/web-dist/assets/states-ZhrxQa3K.js +56 -0
- package/web-dist/assets/states-ZhrxQa3K.js.map +1 -0
- package/web-dist/assets/terminal-BOV_MXPZ.js +2 -0
- package/web-dist/assets/terminal-BOV_MXPZ.js.map +1 -0
- package/web-dist/assets/terminal-login-S5CAd5xA.js +2 -0
- package/web-dist/assets/terminal-login-S5CAd5xA.js.map +1 -0
- package/web-dist/assets/useBackTo-BIrCq3W2.js +2 -0
- package/web-dist/assets/useBackTo-BIrCq3W2.js.map +1 -0
- package/web-dist/assets/useNow-Dj7oEiwn.js +2 -0
- package/web-dist/assets/useNow-Dj7oEiwn.js.map +1 -0
- package/web-dist/assets/useResource-CDGSq2At.js +2 -0
- package/web-dist/assets/useResource-CDGSq2At.js.map +1 -0
- package/web-dist/icon-192.png +0 -0
- package/web-dist/icon-512.png +0 -0
- package/web-dist/icon.svg +20 -8
- package/web-dist/index.html +3 -4
- package/web-dist/manifest.webmanifest +1 -1
- package/web-dist/maskable-512.png +0 -0
- package/web-dist/sw.js +1 -1
- package/web-dist/sw.js.map +1 -1
- package/web-dist/assets/AutomationView-BIW_pO0M.js +0 -2
- package/web-dist/assets/AutomationView-BIW_pO0M.js.map +0 -1
- package/web-dist/assets/Badge-BiDp7NKI.js +0 -2
- package/web-dist/assets/Badge-BiDp7NKI.js.map +0 -1
- package/web-dist/assets/InteractionCard-CWxyDv81.js +0 -6
- package/web-dist/assets/InteractionCard-CWxyDv81.js.map +0 -1
- package/web-dist/assets/Menu-BDt1bxwz.js +0 -2
- package/web-dist/assets/Menu-BDt1bxwz.js.map +0 -1
- package/web-dist/assets/Tabs-ByiPklAw.js +0 -184
- package/web-dist/assets/Tabs-ByiPklAw.js.map +0 -1
- package/web-dist/assets/TextArea-BYr88SnV.js +0 -2
- package/web-dist/assets/TextArea-BYr88SnV.js.map +0 -1
- package/web-dist/assets/arrow-left-C6YWM6y6.js +0 -2
- package/web-dist/assets/arrow-left-C6YWM6y6.js.map +0 -1
- package/web-dist/assets/attention-Bya8XHKI.js +0 -2
- package/web-dist/assets/attention-Bya8XHKI.js.map +0 -1
- package/web-dist/assets/automations-DiXKRcnE.js +0 -2
- package/web-dist/assets/automations-DiXKRcnE.js.map +0 -1
- package/web-dist/assets/board-BrLaJwLJ.js +0 -10
- package/web-dist/assets/board-BrLaJwLJ.js.map +0 -1
- package/web-dist/assets/code-DKLO8bzz.js +0 -11
- package/web-dist/assets/code-DKLO8bzz.js.map +0 -1
- package/web-dist/assets/copy-oWgGHmkS.js +0 -2
- package/web-dist/assets/copy-oWgGHmkS.js.map +0 -1
- package/web-dist/assets/describe-DnvH6_fl.js +0 -5
- package/web-dist/assets/describe-DnvH6_fl.js.map +0 -1
- package/web-dist/assets/dist-BE_V9dwJ.js +0 -56
- package/web-dist/assets/dist-BE_V9dwJ.js.map +0 -1
- package/web-dist/assets/enroll-DUDpbJoB.js +0 -2
- package/web-dist/assets/enroll-DUDpbJoB.js.map +0 -1
- package/web-dist/assets/index-DvRcMGEe.css +0 -2
- package/web-dist/assets/index-vIzH1m8u.js +0 -11
- package/web-dist/assets/index-vIzH1m8u.js.map +0 -1
- package/web-dist/assets/logic-xb-QF00E.js +0 -2
- package/web-dist/assets/logic-xb-QF00E.js.map +0 -1
- package/web-dist/assets/more-BP5x45cs.js +0 -2
- package/web-dist/assets/more-BP5x45cs.js.map +0 -1
- package/web-dist/assets/now--XjJC37b.js +0 -2
- package/web-dist/assets/now--XjJC37b.js.map +0 -1
- package/web-dist/assets/plus-BLP-wIYD.js +0 -2
- package/web-dist/assets/plus-BLP-wIYD.js.map +0 -1
- package/web-dist/assets/save-DEvZPWlS.js +0 -2
- package/web-dist/assets/save-DEvZPWlS.js.map +0 -1
- package/web-dist/assets/send-BKjswHxB.js +0 -2
- package/web-dist/assets/send-BKjswHxB.js.map +0 -1
- package/web-dist/assets/server-SxFxIScj.js +0 -2
- package/web-dist/assets/server-SxFxIScj.js.map +0 -1
- package/web-dist/assets/settings-D8T1esWq.js +0 -7
- package/web-dist/assets/settings-D8T1esWq.js.map +0 -1
- package/web-dist/assets/shared-CZ7fcu_B.js +0 -3
- package/web-dist/assets/shared-CZ7fcu_B.js.map +0 -1
- package/web-dist/assets/sliders-horizontal-DAoirila.js +0 -2
- package/web-dist/assets/sliders-horizontal-DAoirila.js.map +0 -1
- package/web-dist/assets/states--geW2Ntl.js +0 -2
- package/web-dist/assets/states--geW2Ntl.js.map +0 -1
- package/web-dist/assets/terminal-login-BJxV78au.js +0 -2
- package/web-dist/assets/terminal-login-BJxV78au.js.map +0 -1
- package/web-dist/assets/trash-C6X2OLrI.js +0 -2
- package/web-dist/assets/trash-C6X2OLrI.js.map +0 -1
- package/web-dist/assets/useNow-jxdoOC_1.js +0 -2
- package/web-dist/assets/useNow-jxdoOC_1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-BKroYJmR.js","names":["__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","useRef","createContext","useContext","useState","useMemo","useRef","useCallback","useState","useMemo","useCallback","useRef","_Fragment","Trash2","useRef","useState","_Fragment","useMemo","CodeView","FileJson","useState","useRef","useMemo","useCallback","CodeView","_Fragment","WrapText","useId","useState","useMemo","_Fragment","MessageCircleQuestion","useId","useRef","useState","useId","useState","useRef","useMemo","_Fragment","useMemo","useState","useId","_Fragment","_Fragment","useState","_Fragment","useState","useCallback","useRef","_Fragment","useState","useRef","useState","useState","useRef","useCallback","useState","useRef","useId","_Fragment","MessageCircleQuestion","useRef","useState","useState","Wand2","_Fragment","useMemo","useRef","useState","useCallback","useState","useMemo","_Fragment","useState","useCallback","useMemo","_Fragment","__toESM","useSearchParams","useNavigate","Link","require_react","createLucideIcon","useParams","require_jsx_runtime","useLocation","renderMessage","useHosts","MessageCircleQuestionMark","useRunsForTask","isLiveRuntime","useSession","usePanels","usePendingInteractions","useProjects","parseFrameMessage","useStreams","CircleAlert","useTranscript","isBusyRuntime","sessionsNeedingAttention","FRAME_MAX_HEIGHT","cn","isApiError","LoadingState","Button","buttonClasses","formatTime","apiGet","formatRelative","HostUnavailable","formatDuration","ErrorState","DEFAULT_WORKTREE_DIR","Spinner","EmptyState","UnsupportedCapability","ThinkingLevel","TriangleAlert","apiPost","RefreshCw","ServerOff","errorMessage","useSyncStore","useViewingSession","ArrowDown","ArrowLeft","Trash","Field","Check","copyText","Copy","PanelRightOpen","ChevronDown","Menu","FolderGit2","Send","repoLabel","ChevronLeft","SlidersHorizontal","matchesProject","ChevronRight","parseUnifiedDiff","DiffView","isDocumentPresentation","FileCode","UINodeRenderer","InteractionCard","GitBranch","Pencil","Hand","Link2","Play","Plus","backLinkClick","useBackTo","BACK_STATE","Search","Server","Info","RUNTIME_STATUS","Badge","Square","SquareKanban","CountBadge","LoaderCircle","StatusChip","Eye","CircleX","CircleCheck","PANE_LIMITS","toast","setDraftNow","useDraft","useHideBottomNav","X","useBreakpoint","useReviewComments","CirclePause","formatReviewFollowUp","useFilter","usePrefs","useFocusTrap","Sheet","Dialog","IconButton","Drawer","ConfirmDialog","TextArea","TextInput","TextLink","CodeBlock","Tabs","langFor","Markdown","useHighlight","TabPanel","SegmentedControl","Select","__iconData$31","ArchiveRestore","__iconData$30","Archive","__iconData$29","Bot","__iconData$28","Brain","__iconData$27","Camera","__iconData$26","ChevronsDownUp","__iconData$25","ChevronsUpDown","__iconData$24","Cpu","__iconData$23","EllipsisVertical","__iconData$22","FileBraces","__iconData$21","FileDiff","__iconData$20","FileImage","__iconData$19","FileText","__iconData$18","File","__iconData$17","FolderOpen","__iconData$16","Folder","__iconData$15","ImagePlus","__iconData$14","ListPlus","__iconData$13","MessageSquarePlus","__iconData$12","MousePointerClick","__iconData$11","Navigation","__iconData$10","Network","__iconData$9","PanelRightClose","__iconData$8","Paperclip","__iconData$7","SearchX","__iconData$6","SendHorizontal","__iconData$5","Shrink","__iconData$4","Slash","__iconData$3","TextWrap","__iconData$2","Undo2","__iconData$1","User","__iconData","WandSparkles","import_react","import_jsx_runtime","Splitter","start","clamp","max","min","v","sign","pane","label","value","className","e","onChange","onReset","s","step","CodeContext","useCodeContext","id","w","t","codeApi","signal","body","instructions","workspaceId","file","normalizeEntries","normalizeFile","taskId","confirm","list","raw","a","b","o","text","isLive","isBusy","branchSlug","branch","worktreePath","checkoutPath","worktreeDir","branchProblem","ch","hostOnline","h","compareWorkspaces","branchFromPrompt","slug","prompt","p","n","now","uniqueBranch","set","taken","base","i","projectIdOfGroup","m","key","newSessionDefaults","hostIds","checkouts","c","def","project","pick","hostId","hosts","main","workspaces","onHost","checkout","NAV_LAYOUTS","NAV_SORTS","DEFAULT_SORT","STATUS_RANK","lastSegment","workspaceLabel","ws","cwd","emptyGroup","patch","projectLabel","projectId","branchFor","latest","best","r","g","l","newest","sortGroups","last","sort","groups","countSessions","buildNavTree","layout","opts","needsFirst","q","attn","input","entries","needs","hostName","byActivity","row","ctx","hg","host","pg","projects","projectGroup","ids","wsGroups","wsOf","wsGroup","withSessions","la","lb","only","navTreeIsEmpty","tree","navGroupKeys","out","walk","gs","ACTIVE_RUN_STATES","runForSession","session","runs","automationControl","run","AUTOMATION_LABEL","hostLink","SUBAGENT_READ_ONLY","isSubagentView","composerBlockReason","link","sessionStatus","resume","seen","long","pending","sendModes","caps","buildTimeline","byItem","streams","seenInteractions","item","items","stream","prev","orphans","countAfter","baselineKey","idx","interactionDomId","interactionId","parseDataUrl","url","readImageFile","reject","reader","parsed","resolve","stringifyArgs","args","outputPreview","lines","output","maxLines","tail","SPLITTER","fitPanes","available","splitters","insp","over","nav","give","CLIENT_COMMANDS","TERMINAL_COMMANDS","TERMINAL_ONLY_COMMANDS","SOURCE_ORDER","mergeCommands","names","client","remote","terminal","rest","completionEligible","draft","applyCompletion","prefix","activeArgumentHint","entry","filterCommands","query","limit","scored","name","score","parseClientCommand","arg","slash","clientCommandProblem","cmd","running","hasNative","pillModelLabel","vendor","brand","modelLabel","favoriteModels","models","current","effortIndex","thinking","levels","profileSummary","modelSummary","model","effort","groupModels","tokens","hay","x","contextMeter","fmt","detail","piControlsAvailable","block","NO_ADAPTERS","useSessionLookup","absent","hydrated","sessionId","result","setResult","ctrl","useSessionContext","workspace","tasks","adapters","useMutation","busy","setBusy","error","setError","fnRef","fn","optsRef","mounted","msg","success","useNow","setNow","active","ms","useElementWidth","ref","width","setWidth","el","ro","useWorkspaceDiff","connected","loading","setLoading","fetchedAt","setFetchedAt","nonce","setNonce","wsId","ac","f","useFileDiff","fromPatch","path","diff","fetched","setFetched","files","mine","STATUS_LABEL","ChangedFileList","comments","commentCounts","selected","onSelect","large","FileDiffView","fd","marked","onComment","line","CommentForm","setText","Surface","mobile","where","onClose","onSave","ReviewPanel","overall","setOverall","send","review","feedback","requestChanges","task","accept","acceptNeedsConfirm","inReview","sendBlocked","ok","useCommentCounts","ChangesUnavailable","RefreshRow","ChangesTab","counts","setSelected","commentDraft","setCommentDraft","cur","MobileChanges","open","setOpen","FullScreenDiff","backRef","onBack","index","total","onPrev","onNext","onSaveComment","CustomFrame","height","setHeight","minHeight","loaded","setLoaded","actionRef","onAction","onMessage","maxHeight","node","state","src","adapterId","ControlChip","automation","HostChip","sessionMenuItems","ConversationHeader","navigate","narrow","menuItems","actions","inspector","Section","title","children","ControlButtons","canTakeover","canReturn","canStop","RunRow","Limits","TaskSection","dep","showControls","ADAPTER_STATUS","AdapterRow","PanelView","panel","actionId","payload","openFile","ExtensionsSection","panels","diagnostics","adapterIds","d","u","SessionFacts","meter","MobileDetails","subagents","CodeView$1","lang","plain","wrap","toks","j","IMAGE_MIME","BADGE","parentDir","parts","ancestors","extOf","formatSize","iconFor","ext","relPath","dir","StatusBadge","status","FilesTab","listings","setListings","expanded","setExpanded","setFile","filter","setFilter","focused","setFocused","listRef","changed","changedDirs","load","force","openPath","rel","dirs","toggle","next","FilePreview","rows","extra","depth","matches","root","visible","tabbable","move","from","delta","isDir","Icon","ev","parent","content","setContent","setWrap","view","setView","dims","setDims","isMarkdown","isSvg","imageMime","copy","checkerboard","Inspector","visited","setVisited","tab","panes","hideTitle","onTab","defaultPrefs","screen","Navigator","variant","defaults","stored","setPrefs","prefs","sessions","hostsMap","attention","interactions","projectList","collapsed","allKeys","viewItems","anyExpanded","k","filterOptions","onNewSession","SessionRow","selectedId","GroupNode","GroupHeader","Chevron","group","pid","INDENT","context","indent","rowStatus","runtime","Popover","panelRef","btnRef","onOpenChange","initialFocus","fixed","setFixed","fitViewport","place","rect","left","side","onDoc","trigger","align","CHIP_SELECT","CHIP_BUTTON","ProjectPicker","setQuery","setActive","inputRef","shown","choose","prompts","rememberInitialPrompt","initialPromptFor","NEW","useNewSessionForm","profilesMap","projectsById","selectedProject","lastProject","profiles","setProjectId","setHostId","setWorkspaceId","checkoutId","setCheckoutId","setBranch","branchTouched","setBranchTouched","setBase","profileId","setProfileId","setPrompt","setTitle","advancedOpen","setAdvancedOpen","initialProjectId","projectWorkspaces","projectCheckouts","changeHost","hostWorkspaces","hostCheckouts","mode","suggested","effectiveBranch","problem","summary","NewSessionFlow","submitting","setSubmitting","create","onCreated","onKeyDown","shortcut","defaultProfile","errorBox","footer","InfoRow","SessionInfoDialog","stats","hostLabel","useSessionActions","dialog","setDialog","takeover","ret","stop","rename","archive","unarchive","close","archiveBlocked","dialogs","control","CommandViewDrawer","onRun","ControlPill","ariaLabel","icon","ModelList","setModels","changeError","setChangeError","setPending","show","setShow","onChosen","hasFavorites","favoritesOnly","pool","search","searchRef","searchInFooter","ModelControl","enabled","useEffortDraft","server","setDraft","timer","commit","flush","EffortSlider","level","at","EffortControl","change","pill","ContextMeter","hint","fill","props","TreeDialog","setRows","live","onPick","ResumeDialog","onOpen","usable","SOURCE_LABEL","SlashCompletions","onHover","SlashPicker","EMPTY","useArgumentCompletions","setState","CACHE","STALE_MS","useSessionCommands","commands","setCommands","abort","hit","AUTOMATION_WARNING","Composer","sendWithEnter","attachments","setAttachments","attachSheet","setAttachSheet","commandSheet","setCommandSheet","CommandSurface","slashDismissed","setSlashDismissed","modelPickerOpen","setModelPickerOpen","viewBusy","setViewBusy","dialogKind","setDialogKind","textRef","fileRef","cameraRef","hintId","modes","noText","slashOpen","controls","cmdError","cmdLoading","argsDismissed","setArgsDismissed","completions","completing","argHint","applyItem","clientCmd","commandProblem","openSession","startNew","afterBranch","runViewCommand","command","pickBranch","fork","entryId","refresh","sent","runClientCommand","clearDraft","res","primaryMode","addFiles","sendReason","touchStart","tapToSend","pills","queued","SlashHint","ICON","ACTION_ICON","TONE","SessionStatusBar","tone","act","onAnswer","ActIcon","CATCH_UP_MS","MIN_RATE","revealRate","backlog","nextShownLength","target","rate","dtMs","useSmoothText","calm","smooth","shownRef","rateRef","setShown","frame","tick","TimelineRow","StreamEntry","InteractionEntry","UserMessage","AssistantMessage","ThinkingItem","ToolCard","NoticeItem","SystemItem","SubagentRow","InteractionRef","RowLabel","shownText","streaming","shownThinking","TOOL_STATUS","fullOutput","setFullOutput","data","elapsed","st","preview","NOTICE_ICON","NOTICE_LABEL","repeat","suggestion","draftEmpty","onUse","linked","interaction","highlight","readOnly","StartingCard","showPrompt","scrollWithin","container","top","LOAD_OLDER_THRESHOLD_PX","HIGHLIGHT_MS","ROW","Transcript","starting","loadOlder","loadTranscript","scrollRef","atBottomRef","savedTop","atBottom","setAtBottom","setBaselineKey","prependHeight","setHighlight","lastKey","firstKey","streamSize","requestOlder","onScroll","doc","landed","focusInteractionId","handled","olderAttempts","jumpToLatest","openFirstPending","first","unseen","interactionReadOnly","useSubagentRefresh","subagent","useComposerDraft","Conversation","mobileTabFor","MobileSession","back","setTab","tabRequest","infoOpen","setInfoOpen","tabKey","codeCtx","NoSession","missing","CodeDesktop","paneSizes","setPaneSize","setPref","newFor","setNewFor","drawerOpen","setDrawerOpen","showInspector","compact","navMax","fit","px","SessionPanes","setOpenPath","openInspector","setCollapsed","inspectorOpen","inspectorWidth","setInspectorWidth","CodeMobile","MobileSessionScreen","focus","INSPECTOR_TABS","CodeView","rawId","params","tabParam","requestedTab","requestKey","bp","lookup","lastSessionId","lastSession","Navigate"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/archive-restore.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/archive.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/bot.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/brain.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/camera.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/chevrons-down-up.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/chevrons-up-down.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/cpu.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/file-braces.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/file-diff.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/file-image.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/file-text.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/file.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/folder-open.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/folder.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/image-plus.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/list-plus.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/message-square-plus.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/navigation.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/network.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/panel-right-close.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/paperclip.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/search-x.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/send-horizontal.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/shrink.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/slash.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/text-wrap.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/undo-2.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/user.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/wand-sparkles.mjs","../../src/components/ui/Splitter.tsx","../../src/features/code/context.ts","../../src/features/code/api.ts","../../src/features/code/model.ts","../../src/features/code/hooks.ts","../../src/features/code/Changes.tsx","../../src/components/intent/CustomFrame.tsx","../../src/features/code/ConversationHeader.tsx","../../src/features/code/Details.tsx","../../src/components/intent/CodeView.tsx","../../src/features/code/Files.tsx","../../src/features/code/Inspector.tsx","../../src/features/code/Navigator.tsx","../../src/components/ui/Popover.tsx","../../src/features/code/ProjectPicker.tsx","../../src/features/code/startingPrompts.ts","../../src/features/code/NewSession.tsx","../../src/features/code/SessionInfoDialog.tsx","../../src/features/code/SessionActions.tsx","../../src/features/code/CommandViewDrawer.tsx","../../src/features/code/PiControls.tsx","../../src/features/code/SessionCommandDialogs.tsx","../../src/features/code/SlashPicker.tsx","../../src/features/code/useArgumentCompletions.ts","../../src/features/code/useSessionCommands.ts","../../src/features/code/Composer.tsx","../../src/features/code/SessionStatusBar.tsx","../../src/lib/useSmoothText.ts","../../src/features/code/TranscriptItems.tsx","../../src/features/code/Transcript.tsx","../../src/features/code/SessionView.tsx","../../src/features/code/CodeLayouts.tsx","../../src/features/code/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"archive-restore\",\n size: 24,\n node: [\n [\"rect\", { width: \"20\", height: \"5\", x: \"2\", y: \"3\", rx: \"1\", key: \"1wp1u1\" }],\n [\"path\", { d: \"M4 8v11a2 2 0 0 0 2 2h2\", key: \"tvwodi\" }],\n [\"path\", { d: \"M20 8v11a2 2 0 0 1-2 2h-2\", key: \"1gkqxj\" }],\n [\"path\", { d: \"m9 15 3-3 3 3\", key: \"1pd0qc\" }],\n [\"path\", { d: \"M12 12v9\", key: \"192myk\" }]\n ]\n};\n__iconData.node;\nconst ArchiveRestore = createLucideIcon(__iconData);\n\nexport { __iconData, ArchiveRestore as default };\n//# sourceMappingURL=archive-restore.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"archive\",\n size: 24,\n node: [\n [\"rect\", { width: \"20\", height: \"5\", x: \"2\", y: \"3\", rx: \"1\", key: \"1wp1u1\" }],\n [\"path\", { d: \"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\", key: \"1s80jp\" }],\n [\"path\", { d: \"M10 12h4\", key: \"a56b0p\" }]\n ]\n};\n__iconData.node;\nconst Archive = createLucideIcon(__iconData);\n\nexport { __iconData, Archive as default };\n//# sourceMappingURL=archive.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"bot\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n ]\n};\n__iconData.node;\nconst Bot = createLucideIcon(__iconData);\n\nexport { __iconData, Bot as default };\n//# sourceMappingURL=bot.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"brain\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 18V5\", key: \"adv99a\" }],\n [\"path\", { d: \"M15 13a4.17 4.17 0 01-3-4 4.17 4.17 0 01-3 4\", key: \"5nuw1p\" }],\n [\"path\", { d: \"M17.707 6.294A3 3 0 1012 5a3 3 0 10-5.707 1.294\", key: \"18ldcf\" }],\n [\"path\", { d: \"M17.996 5.125a4 4 0 012.526 5.77\", key: \"1sdu8q\" }],\n [\"path\", { d: \"M18 18a4 4 0 002-7.465\", key: \"7xqqvr\" }],\n [\"path\", { d: \"M19.967 17.482a4 4 0 11-7.967.517 4 4 0 11-7.967-.517\", key: \"t46ysz\" }],\n [\"path\", { d: \"M6 18a4 4 0 01-2-7.465\", key: \"1y2m15\" }],\n [\"path\", { d: \"M6.004 5.125a4 4 0 00-2.526 5.77\", key: \"3cw1ss\" }]\n ]\n};\n__iconData.node;\nconst Brain = createLucideIcon(__iconData);\n\nexport { __iconData, Brain as default };\n//# sourceMappingURL=brain.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"camera\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\n key: \"18u6gg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n ]\n};\n__iconData.node;\nconst Camera = createLucideIcon(__iconData);\n\nexport { __iconData, Camera as default };\n//# sourceMappingURL=camera.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevrons-down-up\",\n size: 24,\n node: [\n [\"path\", { d: \"m7 20 5-5 5 5\", key: \"13a0gw\" }],\n [\"path\", { d: \"m7 4 5 5 5-5\", key: \"1kwcof\" }]\n ]\n};\n__iconData.node;\nconst ChevronsDownUp = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronsDownUp as default };\n//# sourceMappingURL=chevrons-down-up.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevrons-up-down\",\n size: 24,\n node: [\n [\"path\", { d: \"m7 15 5 5 5-5\", key: \"1hf1tw\" }],\n [\"path\", { d: \"m7 9 5-5 5 5\", key: \"sgt6xg\" }]\n ]\n};\n__iconData.node;\nconst ChevronsUpDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronsUpDown as default };\n//# sourceMappingURL=chevrons-up-down.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"cpu\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M17 20v2\", key: \"1rnc9c\" }],\n [\"path\", { d: \"M17 2v2\", key: \"11trls\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M2 17h2\", key: \"7oei6x\" }],\n [\"path\", { d: \"M2 7h2\", key: \"asdhe0\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"M20 17h2\", key: \"1fpfkl\" }],\n [\"path\", { d: \"M20 7h2\", key: \"1o8tra\" }],\n [\"path\", { d: \"M7 20v2\", key: \"4gnj0m\" }],\n [\"path\", { d: \"M7 2v2\", key: \"1i4yhu\" }],\n [\"rect\", { x: \"4\", y: \"4\", width: \"16\", height: \"16\", rx: \"2\", key: \"1vbyd7\" }],\n [\"rect\", { x: \"8\", y: \"8\", width: \"8\", height: \"8\", rx: \"1\", key: \"z9xiuo\" }]\n ]\n};\n__iconData.node;\nconst Cpu = createLucideIcon(__iconData);\n\nexport { __iconData, Cpu as default };\n//# sourceMappingURL=cpu.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"ellipsis-vertical\",\n size: 24,\n node: [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"12\", cy: \"5\", r: \"1\", key: \"gxeob9\" }],\n [\"circle\", { cx: \"12\", cy: \"19\", r: \"1\", key: \"lyex9k\" }]\n ],\n aliases: [\"more-vertical\"]\n};\n__iconData.node;\nconst EllipsisVertical = createLucideIcon(__iconData);\n\nexport { __iconData, EllipsisVertical as default };\n//# sourceMappingURL=ellipsis-vertical.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"file-braces\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n { d: \"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\", key: \"1oajmo\" }\n ],\n [\n \"path\",\n { d: \"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\", key: \"mpwhp6\" }\n ]\n ],\n aliases: [\"file-json\"]\n};\n__iconData.node;\nconst FileBraces = createLucideIcon(__iconData);\n\nexport { __iconData, FileBraces as default };\n//# sourceMappingURL=file-braces.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"file-diff\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M9 10h6\", key: \"9gxzsh\" }],\n [\"path\", { d: \"M12 13V7\", key: \"h0r20n\" }],\n [\"path\", { d: \"M9 17h6\", key: \"r8uit2\" }]\n ]\n};\n__iconData.node;\nconst FileDiff = createLucideIcon(__iconData);\n\nexport { __iconData, FileDiff as default };\n//# sourceMappingURL=file-diff.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"file-image\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"10\", cy: \"12\", r: \"2\", key: \"737tya\" }],\n [\"path\", { d: \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\", key: \"wt3hpn\" }]\n ]\n};\n__iconData.node;\nconst FileImage = createLucideIcon(__iconData);\n\nexport { __iconData, FileImage as default };\n//# sourceMappingURL=file-image.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"file-text\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n ]\n};\n__iconData.node;\nconst FileText = createLucideIcon(__iconData);\n\nexport { __iconData, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"file\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n ]\n};\n__iconData.node;\nconst File = createLucideIcon(__iconData);\n\nexport { __iconData, File as default };\n//# sourceMappingURL=file.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder-open\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n ]\n};\n__iconData.node;\nconst FolderOpen = createLucideIcon(__iconData);\n\nexport { __iconData, FolderOpen as default };\n//# sourceMappingURL=folder-open.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n ]\n};\n__iconData.node;\nconst Folder = createLucideIcon(__iconData);\n\nexport { __iconData, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"image-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 5h6\", key: \"1vod17\" }],\n [\"path\", { d: \"M19 2v6\", key: \"4bpg5p\" }],\n [\"path\", { d: \"M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5\", key: \"1ue2ih\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }]\n ]\n};\n__iconData.node;\nconst ImagePlus = createLucideIcon(__iconData);\n\nexport { __iconData, ImagePlus as default };\n//# sourceMappingURL=image-plus.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"list-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 5H3\", key: \"m91uny\" }],\n [\"path\", { d: \"M11 12H3\", key: \"51ecnj\" }],\n [\"path\", { d: \"M16 19H3\", key: \"zzsher\" }],\n [\"path\", { d: \"M18 9v6\", key: \"1twb98\" }],\n [\"path\", { d: \"M21 12h-6\", key: \"bt1uis\" }]\n ]\n};\n__iconData.node;\nconst ListPlus = createLucideIcon(__iconData);\n\nexport { __iconData, ListPlus as default };\n//# sourceMappingURL=list-plus.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"message-square-plus\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\",\n key: \"18887p\"\n }\n ],\n [\"path\", { d: \"M12 8v6\", key: \"1ib9pf\" }],\n [\"path\", { d: \"M9 11h6\", key: \"1fldmi\" }]\n ]\n};\n__iconData.node;\nconst MessageSquarePlus = createLucideIcon(__iconData);\n\nexport { __iconData, MessageSquarePlus as default };\n//# sourceMappingURL=message-square-plus.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"mouse-pointer-click\",\n size: 24,\n node: [\n [\"path\", { d: \"M14 4.1 12 6\", key: \"ita8i4\" }],\n [\"path\", { d: \"m5.1 8-2.9-.8\", key: \"1go3kf\" }],\n [\"path\", { d: \"m6 12-1.9 2\", key: \"mnht97\" }],\n [\"path\", { d: \"M7.2 2.2 8 5.1\", key: \"1cfko1\" }],\n [\n \"path\",\n {\n d: \"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\",\n key: \"s0h3yz\"\n }\n ]\n ]\n};\n__iconData.node;\nconst MousePointerClick = createLucideIcon(__iconData);\n\nexport { __iconData, MousePointerClick as default };\n//# sourceMappingURL=mouse-pointer-click.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"navigation\",\n size: 24,\n node: [[\"polygon\", { points: \"3 11 22 2 13 21 11 13 3 11\", key: \"1ltx0t\" }]]\n};\n__iconData.node;\nconst Navigation = createLucideIcon(__iconData);\n\nexport { __iconData, Navigation as default };\n//# sourceMappingURL=navigation.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"network\",\n size: 24,\n node: [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n ]\n};\n__iconData.node;\nconst Network = createLucideIcon(__iconData);\n\nexport { __iconData, Network as default };\n//# sourceMappingURL=network.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"panel-right-close\",\n size: 24,\n node: [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M15 3v18\", key: \"14nvp0\" }],\n [\"path\", { d: \"m8 9 3 3-3 3\", key: \"12hl5m\" }]\n ]\n};\n__iconData.node;\nconst PanelRightClose = createLucideIcon(__iconData);\n\nexport { __iconData, PanelRightClose as default };\n//# sourceMappingURL=panel-right-close.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"paperclip\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\",\n key: \"1miecu\"\n }\n ]\n ]\n};\n__iconData.node;\nconst Paperclip = createLucideIcon(__iconData);\n\nexport { __iconData, Paperclip as default };\n//# sourceMappingURL=paperclip.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"search-x\",\n size: 24,\n node: [\n [\"path\", { d: \"m13.5 8.5-5 5\", key: \"1cs55j\" }],\n [\"path\", { d: \"m8.5 8.5 5 5\", key: \"a8mexj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n ]\n};\n__iconData.node;\nconst SearchX = createLucideIcon(__iconData);\n\nexport { __iconData, SearchX as default };\n//# sourceMappingURL=search-x.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"send-horizontal\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z\",\n key: \"117uat\"\n }\n ],\n [\"path\", { d: \"M6 12h16\", key: \"s4cdu5\" }]\n ],\n aliases: [\"send-horizonal\"]\n};\n__iconData.node;\nconst SendHorizontal = createLucideIcon(__iconData);\n\nexport { __iconData, SendHorizontal as default };\n//# sourceMappingURL=send-horizontal.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"shrink\",\n size: 24,\n node: [\n [\"path\", { d: \"m15 15 6 6m-6-6v4.8m0-4.8h4.8\", key: \"17vawe\" }],\n [\"path\", { d: \"M9 19.8V15m0 0H4.2M9 15l-6 6\", key: \"chjx8e\" }],\n [\"path\", { d: \"M15 4.2V9m0 0h4.8M15 9l6-6\", key: \"lav6yq\" }],\n [\"path\", { d: \"M9 4.2V9m0 0H4.2M9 9 3 3\", key: \"1pxi2q\" }]\n ]\n};\n__iconData.node;\nconst Shrink = createLucideIcon(__iconData);\n\nexport { __iconData, Shrink as default };\n//# sourceMappingURL=shrink.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"slash\",\n size: 24,\n node: [[\"path\", { d: \"M22 2 2 22\", key: \"y4kqgn\" }]]\n};\n__iconData.node;\nconst Slash = createLucideIcon(__iconData);\n\nexport { __iconData, Slash as default };\n//# sourceMappingURL=slash.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"text-wrap\",\n size: 24,\n node: [\n [\"path\", { d: \"m16 16-3 3 3 3\", key: \"117b85\" }],\n [\"path\", { d: \"M3 12h14.5a1 1 0 0 1 0 7H13\", key: \"18xa6z\" }],\n [\"path\", { d: \"M3 19h6\", key: \"1ygdsz\" }],\n [\"path\", { d: \"M3 5h18\", key: \"1u36vt\" }]\n ],\n aliases: [\"wrap-text\"]\n};\n__iconData.node;\nconst TextWrap = createLucideIcon(__iconData);\n\nexport { __iconData, TextWrap as default };\n//# sourceMappingURL=text-wrap.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"undo-2\",\n size: 24,\n node: [\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }],\n [\"path\", { d: \"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\", key: \"f3b9sd\" }]\n ]\n};\n__iconData.node;\nconst Undo2 = createLucideIcon(__iconData);\n\nexport { __iconData, Undo2 as default };\n//# sourceMappingURL=undo-2.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"user\",\n size: 24,\n node: [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n ]\n};\n__iconData.node;\nconst User = createLucideIcon(__iconData);\n\nexport { __iconData, User as default };\n//# sourceMappingURL=user.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"wand-sparkles\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72\",\n key: \"ul74o6\"\n }\n ],\n [\"path\", { d: \"m14 7 3 3\", key: \"1r5n42\" }],\n [\"path\", { d: \"M5 6v4\", key: \"ilb8ba\" }],\n [\"path\", { d: \"M19 14v4\", key: \"blhpug\" }],\n [\"path\", { d: \"M10 2v2\", key: \"7u0qdc\" }],\n [\"path\", { d: \"M7 8H3\", key: \"zfb6yr\" }],\n [\"path\", { d: \"M21 16h-4\", key: \"1cnmox\" }],\n [\"path\", { d: \"M11 3H9\", key: \"1obp7u\" }]\n ],\n aliases: [\"wand-2\"]\n};\n__iconData.node;\nconst WandSparkles = createLucideIcon(__iconData);\n\nexport { __iconData, WandSparkles as default };\n//# sourceMappingURL=wand-sparkles.mjs.map\n","import { useRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SplitterProps {\n /** Current size in px of the pane being resized. */\n value: number;\n min: number;\n max: number;\n onChange: (px: number) => void;\n /** Accessible name, e.g. \"Resize navigator\". */\n label: string;\n /**\n * Which side of the splitter the resized pane is on. \"before\" (default):\n * dragging right grows it (a left pane). \"after\": dragging left grows it (a right pane).\n */\n pane?: \"before\" | \"after\";\n /** Keyboard step in px (Shift multiplies by 4). */\n step?: number;\n /** Called on double-click / Enter to reset. */\n onReset?: () => void;\n className?: string;\n}\n\n/** Vertical resize handle with clamping, pointer drag and keyboard arrows (role=separator). */\nexport function Splitter({\n value,\n min,\n max,\n onChange,\n label,\n pane = \"before\",\n step = 16,\n onReset,\n className,\n}: SplitterProps) {\n const start = useRef<{ x: number; value: number } | null>(null);\n const clamp = (v: number) => Math.round(Math.min(max, Math.max(min, v)));\n const sign = pane === \"before\" ? 1 : -1;\n return (\n // biome-ignore lint/a11y/useSemanticElements: an interactive separator needs role=\"separator\" with focus\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={label}\n aria-valuenow={Math.round(value)}\n aria-valuemin={min}\n aria-valuemax={max}\n tabIndex={0}\n className={cn(\n \"group relative z-10 w-1.5 shrink-0 cursor-col-resize touch-none select-none\",\n \"focus-visible:outline-none\",\n className,\n )}\n onPointerDown={(e) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n start.current = { x: e.clientX, value };\n }}\n onPointerMove={(e) => {\n if (!start.current) return;\n onChange(clamp(start.current.value + sign * (e.clientX - start.current.x)));\n }}\n onPointerUp={(e) => {\n start.current = null;\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n }}\n onPointerCancel={() => {\n start.current = null;\n }}\n onDoubleClick={onReset}\n onKeyDown={(e) => {\n const s = e.shiftKey ? step * 4 : step;\n if (e.key === \"ArrowRight\") onChange(clamp(value + sign * s));\n else if (e.key === \"ArrowLeft\") onChange(clamp(value - sign * s));\n else if (e.key === \"Home\") onChange(min);\n else if (e.key === \"End\") onChange(max);\n else if (e.key === \"Enter\" && onReset) onReset();\n else return;\n e.preventDefault();\n }}\n >\n <div\n aria-hidden\n className=\"absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border group-hover:w-0.5 group-hover:bg-accent group-focus-visible:w-0.5 group-focus-visible:bg-accent\"\n />\n </div>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport type InspectorTab = \"changes\" | \"files\" | \"task\" | \"extensions\";\n\n/** Cross-pane wiring inside one session view. */\nexport interface CodeViewContext {\n /** Mobile presentation (collapsed tool output, sheets). */\n mobile: boolean;\n /** Open a workspace file in the inspector Files tab (or mobile Details). */\n openFile?: (path: string) => void;\n /** Show an inspector tab (opening the drawer on compact). */\n openInspector?: (tab: InspectorTab) => void;\n}\n\nexport const CodeContext = createContext<CodeViewContext>({ mobile: false });\nexport const useCodeContext = () => useContext(CodeContext);\n","import type {\n CommandView,\n DiffResult,\n FileEntry,\n ImportableSession,\n ModelStateResult,\n Run,\n Session,\n SessionCompleteResult,\n SessionModel,\n SlashCommand,\n Task,\n ThinkingLevel,\n TreeRow,\n} from \"@switchyard/protocol\";\nimport { apiGet, apiPost } from \"../../sync/api\";\n\n/** REST calls used by the Code feature (paths match packages/coordinator/src/routes). */\n\nconst s = (id: string) => `/api/sessions/${encodeURIComponent(id)}`;\nconst w = (id: string) => `/api/workspaces/${encodeURIComponent(id)}`;\nconst t = (id: string) => `/api/tasks/${encodeURIComponent(id)}`;\n\nexport type CreateSessionBody = {\n projectId: string;\n workspace:\n | { existingId: string }\n | { checkoutId: string; newBranch: string; base?: string | null };\n profileId?: string | null;\n prompt: string;\n title?: string;\n};\n\nexport type PromptMode = \"prompt\" | \"steer\" | \"followUp\";\n\nexport interface PromptResult {\n ok: boolean;\n clientMessageId: string | null;\n automationActive: boolean;\n result: { disposition: string; view?: CommandView | null } | null;\n}\n\nexport const codeApi = {\n get: (id: string, signal?: AbortSignal) => apiGet<Session>(s(id), undefined, signal),\n createSession: (body: CreateSessionBody) => apiPost<Session>(\"/api/sessions\", body),\n prompt: (\n id: string,\n body: {\n text: string;\n mode: PromptMode;\n images?: { mimeType: string; data: string }[];\n clientMessageId?: string;\n },\n ) => apiPost<PromptResult>(`${s(id)}/prompt`, body),\n models: (id: string, signal?: AbortSignal) =>\n apiGet<{ models: SessionModel[] }>(`${s(id)}/models`, undefined, signal),\n commands: (id: string, signal?: AbortSignal) =>\n apiGet<{ commands: SlashCommand[] }>(`${s(id)}/commands`, undefined, signal),\n tree: (id: string) => apiGet<{ rows: TreeRow[] }>(`${s(id)}/tree`),\n branch: (id: string, entryId: string | null, fork: boolean) =>\n apiPost<{ session: Session | null; prefill: string | null }>(`${s(id)}/branch`, {\n entryId,\n fork,\n }),\n reload: (id: string) => apiPost<{ ok: true }>(`${s(id)}/reload`),\n exportFile: (id: string) => apiGet<{ fileName: string; content: string }>(`${s(id)}/export`),\n importable: (hostId: string) =>\n apiGet<(ImportableSession & { importedSessionId: string | null })[]>(\n \"/api/sessions/importable\",\n { hostId },\n ),\n importSession: (hostId: string, sessionFile: string, projectId: string | null) =>\n apiPost<Session>(\"/api/sessions/import\", { hostId, sessionFile, projectId }),\n complete: (id: string, text: string, signal?: AbortSignal) =>\n apiPost<SessionCompleteResult>(`${s(id)}/complete`, { text }, signal),\n setModel: (id: string, provider: string, modelId: string) =>\n apiPost<ModelStateResult>(`${s(id)}/model`, { provider, modelId }),\n setThinking: (id: string, level: ThinkingLevel) =>\n apiPost<ModelStateResult>(`${s(id)}/thinking`, { level }),\n compact: (id: string, instructions?: string | null) =>\n apiPost<{ ok: true }>(`${s(id)}/compact`, instructions ? { instructions } : {}),\n abort: (id: string, clearQueue = false) => apiPost(`${s(id)}/abort`, { clearQueue }),\n stop: (id: string) => apiPost<Session>(`${s(id)}/stop`),\n resume: (id: string) => apiPost<Session>(`${s(id)}/resume`),\n takeover: (id: string) => apiPost<{ session: Session; run: Run }>(`${s(id)}/takeover`),\n returnToAutomation: (id: string) =>\n apiPost<{ session: Session; run: Run }>(`${s(id)}/return-to-automation`),\n rename: (id: string, title: string) => apiPost<Session>(`${s(id)}/rename`, { title }),\n archive: (id: string) => apiPost<Session>(`${s(id)}/archive`),\n unarchive: (id: string) => apiPost<Session>(`${s(id)}/unarchive`),\n adapterAction: (id: string, adapterId: string, actionId: string, payload?: unknown) =>\n apiPost<{ ok: boolean; result: unknown }>(`${s(id)}/adapter-action`, {\n adapterId,\n actionId,\n payload,\n }),\n\n diff: (workspaceId: string, file?: string, signal?: AbortSignal) =>\n apiGet<DiffResult>(`${w(workspaceId)}/diff`, file ? { file } : undefined, signal),\n files: async (workspaceId: string, dir: string, signal?: AbortSignal) =>\n normalizeEntries(await apiGet<unknown>(`${w(workspaceId)}/files`, { dir }, signal)),\n file: async (workspaceId: string, path: string, signal?: AbortSignal) =>\n normalizeFile(await apiGet<unknown>(`${w(workspaceId)}/file`, { path }, signal)),\n refreshWorkspace: (workspaceId: string) => apiPost(`${w(workspaceId)}/refresh`),\n\n requestChanges: (taskId: string, feedback: string[]) =>\n apiPost<Task>(`${t(taskId)}/request-changes`, { feedback }),\n accept: (taskId: string, confirm?: boolean) =>\n apiPost<Task>(`${t(taskId)}/accept`, confirm ? { confirm: true } : {}),\n};\n\n/** `workspace.files` result: an entry array, or `{entries}` / `{files}`. */\nexport function normalizeEntries(raw: unknown): FileEntry[] {\n const list = Array.isArray(raw)\n ? raw\n : ((raw as { entries?: unknown; files?: unknown } | null)?.entries ??\n (raw as { files?: unknown } | null)?.files ??\n []);\n if (!Array.isArray(list)) return [];\n return (list as FileEntry[])\n .filter((e) => e && typeof e.name === \"string\")\n .sort((a, b) => {\n const da = a.kind === \"dir\" ? 0 : 1;\n const db = b.kind === \"dir\" ? 0 : 1;\n return da - db || a.name.localeCompare(b.name);\n });\n}\n\nexport interface FileContent {\n text: string | null;\n binary: boolean;\n truncated: boolean;\n size: number | null;\n /** Base64 content of a binary file. */\n base64: string | null;\n}\n\n/** `workspace.readFile` result: a string, or `{content|text, binary?, truncated?, size?}`. */\nexport function normalizeFile(raw: unknown): FileContent {\n if (typeof raw === \"string\")\n return { text: raw, binary: false, truncated: false, size: null, base64: null };\n const o = (raw ?? {}) as Record<string, unknown>;\n const text =\n typeof o.content === \"string\" ? o.content : typeof o.text === \"string\" ? o.text : null;\n return {\n text,\n binary: o.binary === true || (text === null && o.encoding === \"base64\"),\n truncated: o.truncated === true,\n size: typeof o.size === \"number\" ? o.size : null,\n base64: o.encoding === \"base64\" && typeof o.content === \"string\" ? o.content : null,\n };\n}\n","import type {\n AttentionItem,\n Checkout,\n Connectivity,\n Host,\n Interaction,\n Profile,\n Project,\n Run,\n RuntimeCapabilities,\n Session,\n SessionModel,\n SlashCommand,\n TranscriptItem,\n Workspace,\n} from \"@switchyard/protocol\";\nimport { DEFAULT_WORKTREE_DIR, ThinkingLevel } from \"@switchyard/protocol\";\nimport { PANE_LIMITS } from \"../../prefs\";\nimport { isBusyRuntime, isLiveRuntime, sessionsNeedingAttention } from \"../../sync/selectors\";\nimport type { StreamBuffer } from \"../../sync/store\";\n\n/**\n * Pure helpers for the Code feature (navigator tree, composer state,\n * transcript timeline, new-session preview). Tested without a DOM.\n */\n\nexport function isLive(s: Pick<Session, \"runtime\">): boolean {\n return isLiveRuntime(s.runtime);\n}\n\nexport function isBusy(s: Pick<Session, \"runtime\">): boolean {\n return isBusyRuntime(s.runtime);\n}\n\n/* ------------------------------------------------------------------ */\n/* Worktree preview */\n/* ------------------------------------------------------------------ */\n\n/** Same rule as the coordinator: slashes in the branch become dashes. */\nexport function branchSlug(branch: string): string {\n return branch.replaceAll(\"/\", \"-\");\n}\n\n/** `<checkout>/<worktreeDir>/<branch with / replaced by ->`. */\nexport function worktreePath(\n checkoutPath: string,\n branch: string,\n worktreeDir: string = DEFAULT_WORKTREE_DIR,\n): string {\n return `${checkoutPath.replace(/\\/+$/, \"\")}/${worktreeDir}/${branchSlug(branch.trim())}`;\n}\n\n/** Client-side branch name check (the host validates again). Returns a reason or null. */\nexport function branchProblem(branch: string): string | null {\n const b = branch.trim();\n if (!b) return \"Enter a branch name.\";\n if (/\\s/.test(b)) return \"Branch names cannot contain spaces.\";\n if (b.startsWith(\"-\")) return \"Branch names cannot start with '-'.\";\n if (b.startsWith(\"/\") || b.endsWith(\"/\")) return \"Branch names cannot start or end with '/'.\";\n if (b.includes(\"..\")) return \"Branch names cannot contain '..'.\";\n if (b.includes(\"//\")) return \"Branch names cannot contain '//'.\";\n if (b.endsWith(\".lock\") || b.endsWith(\".\")) return \"Branch names cannot end with '.lock' or '.'.\";\n const control = [...b].some((ch) => ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127);\n if (control || /[~^:?*[\\\\]/.test(b) || b.includes(\"@{\")) {\n return \"Branch names cannot contain ~ ^ : ? * [ \\\\ or '@{'.\";\n }\n return null;\n}\n\nexport function hostOnline(h: Host | undefined): boolean {\n return !!h && !h.revokedAt && h.connectivity === \"connected\";\n}\n\n/** Main checkout first, then by branch. */\nexport function compareWorkspaces(a: Workspace, b: Workspace): number {\n return (\n (a.provenance === \"main\" ? 0 : 1) - (b.provenance === \"main\" ? 0 : 1) ||\n (a.branch ?? \"\").localeCompare(b.branch ?? \"\")\n );\n}\n\n/** Branch suggested from a prompt: first 5 words, kebab-case, at most 40 chars; else session-MMDD-HHMM. */\nexport function branchFromPrompt(prompt: string, now: Date = new Date()): string {\n const words = prompt\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim()\n .split(\" \")\n .filter(Boolean)\n .slice(0, 5);\n const slug = words.join(\"-\").slice(0, 40).replace(/-+$/, \"\");\n if (slug) return slug;\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `session-${p(now.getMonth() + 1)}${p(now.getDate())}-${p(now.getHours())}${p(now.getMinutes())}`;\n}\n\n/** `base`, or `base-2`, `base-3`… when a workspace already uses that branch. */\nexport function uniqueBranch(base: string, taken: Iterable<string | null>): string {\n const set = new Set([...taken].filter((b): b is string => !!b));\n if (!set.has(base)) return base;\n for (let i = 2; ; i++) if (!set.has(`${base}-${i}`)) return `${base}-${i}`;\n}\n\n/** Project id of a navigator project group (\"p:<id>\", \"h:<host>/p:<id>\"); null for other groups. */\nexport function projectIdOfGroup(key: string): string | null {\n const m = /(?:^|\\/)p:([^/]+)$/.exec(key);\n return m && m[1] !== \"__none\" ? m[1]! : null;\n}\n\nexport interface NewSessionDefaults {\n hostId: string;\n /** The main checkout's workspace on that host; null means \"New worktree…\". */\n workspaceId: string | null;\n checkoutId: string | null;\n}\n\n/** Host: the requested one, else the project default if online, else the first online host with a checkout. */\nexport function newSessionDefaults(\n project: Project,\n checkouts: Checkout[],\n workspaces: Workspace[],\n hosts: Record<string, Host>,\n hostId?: string,\n): NewSessionDefaults {\n const hostIds = [...new Set(checkouts.map((c) => c.hostId))];\n const def = project.defaultHostId;\n const pick =\n (hostId && hostIds.includes(hostId) ? hostId : undefined) ??\n (def && hostIds.includes(def) && hostOnline(hosts[def]) ? def : undefined) ??\n hostIds.find((id) => hostOnline(hosts[id])) ??\n hostIds[0] ??\n \"\";\n const main =\n workspaces.find((w) => w.hostId === pick && !w.archivedAt && w.provenance === \"main\") ?? null;\n const onHost = checkouts.filter((c) => c.hostId === pick);\n const checkout = onHost.find((c) => c.id === main?.checkoutId) ?? onHost[0] ?? null;\n return { hostId: pick, workspaceId: main?.id ?? null, checkoutId: checkout?.id ?? null };\n}\n\n/* ------------------------------------------------------------------ */\n/* Navigator tree */\n/* ------------------------------------------------------------------ */\n\nexport type NavFilter = \"active\" | \"attention\" | \"all\";\n\nexport type NavLayout = \"projects\" | \"worktrees\" | \"recent\" | \"hosts\";\n\nexport const NAV_LAYOUTS: { value: NavLayout; label: string; hint: string }[] = [\n { value: \"projects\", label: \"Projects\", hint: \"Sessions under each project\" },\n { value: \"worktrees\", label: \"Worktrees\", hint: \"Project, then branch or worktree\" },\n { value: \"recent\", label: \"Recent\", hint: \"One list of every session\" },\n { value: \"hosts\", label: \"Hosts\", hint: \"Host, then project\" },\n];\n\nexport type NavSort = \"activity\" | \"created\" | \"name\" | \"status\";\n\nexport const NAV_SORTS: { value: NavSort; label: string; hint: string }[] = [\n { value: \"activity\", label: \"Recent activity\", hint: \"Latest activity first\" },\n { value: \"created\", label: \"Newest\", hint: \"Most recently started first\" },\n { value: \"name\", label: \"Name\", hint: \"A to Z\" },\n { value: \"status\", label: \"Status\", hint: \"Waiting and running first\" },\n];\n\nexport const DEFAULT_SORT: Record<NavLayout, NavSort> = {\n projects: \"name\",\n worktrees: \"activity\",\n recent: \"activity\",\n hosts: \"name\",\n};\n\nconst STATUS_RANK: Record<Session[\"runtime\"], number> = {\n waiting_input: 0,\n running: 1,\n starting: 2,\n idle: 3,\n failed: 4,\n interrupted: 5,\n stopped: 6,\n};\n\nexport interface NavRow {\n session: Session;\n attention: boolean;\n /** Context shown on the row's second line; null = not shown in this layout. */\n project: string | null;\n host: string | null;\n branch: string | null;\n}\n\nexport interface NavGroup {\n /**\n * Collapse key: \"p:<projectId|__none>\", \"w:<workspaceId>\" or \"w:<projectKey>:cwd:<hostId>:<cwd>\",\n * \"h:<hostId>\", or \"h:<hostId>/p:<projectId|__none>\".\n */\n key: string;\n kind: \"project\" | \"workspace\" | \"host\";\n label: string;\n /** Muted text beside the label: the shared host on project/workspace headers. */\n detail: string | null;\n /** Workspace path (tooltip), workspace groups only. */\n path: string | null;\n /** Host connection state, host groups only (\"unreachable\" when revoked). */\n hostState: Connectivity | null;\n groups: NavGroup[];\n rows: NavRow[];\n /** Sessions in this group and its child groups. */\n sessionCount: number;\n}\n\nexport interface NavTree {\n groups: NavGroup[];\n /** Ungrouped rows (the Recent layout only). */\n rows: NavRow[];\n}\n\nexport interface NavOptions {\n filter: NavFilter;\n query: string;\n /** Default \"projects\". */\n layout?: NavLayout;\n /** Default false. */\n showSubagents?: boolean;\n /** Default: the layout's default sort. */\n sort?: NavSort;\n /** Sessions needing input before the rest. Default true. */\n needsInputFirst?: boolean;\n}\n\nexport interface NavInput {\n projects: Record<string, Project>;\n workspaces: Record<string, Workspace>;\n sessions: Record<string, Session>;\n hosts: Record<string, Host>;\n attention: Record<string, AttentionItem>;\n interactions: Record<string, Interaction>;\n}\n\nexport { sessionsNeedingAttention } from \"../../sync/selectors\";\n\nfunction lastSegment(p: string): string {\n return p.replace(/\\/+$/, \"\").split(\"/\").pop() || p;\n}\n\nexport function workspaceLabel(ws: Workspace | null | undefined, cwd?: string): string {\n if (!ws) return cwd ? lastSegment(cwd) : \"No workspace\";\n if (ws.branch) return ws.branch;\n return `${lastSegment(ws.path)} (detached)`;\n}\n\ninterface NavEntry {\n session: Session;\n attention: boolean;\n ws: Workspace | null;\n projectId: string | null;\n project: Project | null;\n hostId: string;\n hostName: string;\n}\n\nfunction emptyGroup(\n key: string,\n kind: NavGroup[\"kind\"],\n label: string,\n patch: Partial<NavGroup> = {},\n): NavGroup {\n return {\n key,\n kind,\n label,\n detail: null,\n path: null,\n hostState: null,\n groups: [],\n rows: [],\n sessionCount: 0,\n ...patch,\n };\n}\n\nfunction projectLabel(projectId: string | null, project: Project | null): string {\n return project?.name ?? (projectId ? \"Unknown project\" : \"Other sessions\");\n}\n\n/** Branch context for a row: hidden for the main checkout; the cwd folder for project-less sessions. */\nfunction branchFor(e: NavEntry): string | null {\n if (e.ws) return e.ws.provenance === \"main\" ? null : workspaceLabel(e.ws);\n return e.projectId === null ? lastSegment(e.session.cwd) : null;\n}\n\nfunction latest(g: NavGroup): string {\n let best = \"\";\n for (const r of g.rows) if (r.session.lastActivityAt > best) best = r.session.lastActivityAt;\n for (const c of g.groups) {\n const l = latest(c);\n if (l > best) best = l;\n }\n return best;\n}\n\nfunction newest(g: NavGroup): string {\n let best = \"\";\n for (const r of g.rows) if (r.session.createdAt > best) best = r.session.createdAt;\n for (const c of g.groups) {\n const l = newest(c);\n if (l > best) best = l;\n }\n return best;\n}\n\nfunction sortGroups(groups: NavGroup[], sort: NavSort): NavGroup[] {\n const last = (g: NavGroup) =>\n g.key.endsWith(\"__none\") || (g.kind === \"host\" && g.label === \"Unknown host\") ? 1 : 0;\n const key = (g: NavGroup) =>\n sort === \"activity\" ? latest(g) : sort === \"created\" ? newest(g) : \"\";\n return groups.sort(\n (a, b) => last(a) - last(b) || key(b).localeCompare(key(a)) || a.label.localeCompare(b.label),\n );\n}\n\nfunction countSessions(g: NavGroup): number {\n g.sessionCount = g.rows.length + g.groups.reduce((n, c) => n + countSessions(c), 0);\n return g.sessionCount;\n}\n\n/**\n * The navigator tree for a layout. `active` keeps live sessions and those\n * needing attention; `attention` only the latter; `all` includes stopped\n * sessions; projects without sessions are hidden (Worktrees still lists empty\n * workspaces of projects that have sessions). Archived sessions are never listed; subagents only on request.\n * Rows needing attention come first, then by last activity.\n */\nexport function buildNavTree(input: NavInput, opts: NavOptions): NavTree {\n const layout = opts.layout ?? \"projects\";\n const sort = opts.sort ?? DEFAULT_SORT[layout];\n const needsFirst = opts.needsInputFirst ?? true;\n const q = opts.query.trim().toLowerCase();\n const attn = sessionsNeedingAttention(input.attention, input.interactions);\n\n const entries: NavEntry[] = [];\n for (const s of Object.values(input.sessions)) {\n if (s.archivedAt !== null) continue;\n if (s.provenance === \"subagent\" && !opts.showSubagents) continue;\n const needs = attn.has(s.id);\n if (opts.filter === \"active\" && !isLive(s) && !needs) continue;\n if (opts.filter === \"attention\" && !needs) continue;\n const ws = s.workspaceId ? (input.workspaces[s.workspaceId] ?? null) : null;\n const projectId = s.projectId ?? ws?.projectId ?? null;\n const project = projectId ? (input.projects[projectId] ?? null) : null;\n const hostId = ws?.hostId ?? s.hostId;\n const hostName = input.hosts[hostId]?.name ?? \"Unknown host\";\n if (\n q &&\n ![s.title, s.subtitle ?? \"\", ws?.branch ?? \"\", project?.name ?? \"\", hostName, s.cwd]\n .join(\"\\n\")\n .toLowerCase()\n .includes(q)\n )\n continue;\n entries.push({ session: s, attention: needs, ws, projectId, project, hostId, hostName });\n }\n const byActivity = (a: NavEntry, b: NavEntry) =>\n b.session.lastActivityAt.localeCompare(a.session.lastActivityAt);\n entries.sort((a, b) => {\n if (needsFirst && a.attention !== b.attention) return Number(b.attention) - Number(a.attention);\n switch (sort) {\n case \"created\":\n return b.session.createdAt.localeCompare(a.session.createdAt) || byActivity(a, b);\n case \"name\":\n return (\n a.session.title.localeCompare(b.session.title, undefined, {\n numeric: true,\n sensitivity: \"base\",\n }) || byActivity(a, b)\n );\n case \"status\":\n return STATUS_RANK[a.session.runtime] - STATUS_RANK[b.session.runtime] || byActivity(a, b);\n default:\n return byActivity(a, b);\n }\n });\n\n const row = (e: NavEntry, ctx: Omit<NavRow, \"session\" | \"attention\">): NavRow => ({\n session: e.session,\n attention: e.attention,\n ...ctx,\n });\n\n if (layout === \"recent\") {\n return {\n groups: [],\n rows: entries.map((e) =>\n row(e, {\n project: projectLabel(e.projectId, e.project),\n host: e.hostName,\n branch: branchFor(e),\n }),\n ),\n };\n }\n\n if (layout === \"hosts\") {\n const hosts = new Map<string, NavGroup>();\n for (const e of entries) {\n let hg = hosts.get(e.hostId);\n if (!hg) {\n const host = input.hosts[e.hostId];\n hg = emptyGroup(`h:${e.hostId}`, \"host\", e.hostName, {\n hostState: host ? (host.revokedAt ? \"unreachable\" : host.connectivity) : \"unreachable\",\n });\n hosts.set(e.hostId, hg);\n }\n const key = `${hg.key}/p:${e.projectId ?? \"__none\"}`;\n let pg = hg.groups.find((g) => g.key === key);\n if (!pg) {\n pg = emptyGroup(key, \"project\", projectLabel(e.projectId, e.project));\n hg.groups.push(pg);\n }\n pg.rows.push(row(e, { project: null, host: null, branch: branchFor(e) }));\n }\n const groups = sortGroups([...hosts.values()], sort);\n for (const g of groups) {\n sortGroups(g.groups, sort);\n countSessions(g);\n }\n return { groups, rows: [] };\n }\n\n const projects = new Map<string, NavGroup>();\n const projectGroup = (projectId: string | null): NavGroup => {\n const key = `p:${projectId ?? \"__none\"}`;\n let g = projects.get(key);\n if (!g) {\n const project = projectId ? (input.projects[projectId] ?? null) : null;\n g = emptyGroup(key, \"project\", projectLabel(projectId, project));\n projects.set(key, g);\n }\n return g;\n };\n\n if (layout === \"projects\") {\n const hostIds = new Map<NavGroup, Set<string>>();\n for (const e of entries) {\n const pg = projectGroup(e.projectId);\n pg.rows.push(row(e, { project: null, host: e.hostName, branch: branchFor(e) }));\n const ids = hostIds.get(pg) ?? new Set<string>();\n ids.add(e.hostId);\n hostIds.set(pg, ids);\n }\n for (const [pg, ids] of hostIds) {\n if (ids.size !== 1) continue;\n pg.detail = pg.rows[0]!.host;\n for (const r of pg.rows) r.host = null;\n }\n const groups = sortGroups([...projects.values()], sort);\n for (const g of groups) countSessions(g);\n return { groups, rows: [] };\n }\n\n // Worktrees: project -> workspace -> sessions.\n const wsGroups = new Map<string, NavGroup>();\n const wsOf = new Map<NavGroup, Workspace | null>();\n const wsGroup = (pg: NavGroup, ws: Workspace | null, hostId: string, cwd: string): NavGroup => {\n const key = ws ? `w:${ws.id}` : `w:${pg.key}:cwd:${hostId}:${cwd}`;\n let g = wsGroups.get(key);\n if (!g) {\n g = emptyGroup(key, \"workspace\", workspaceLabel(ws, cwd), {\n detail: input.hosts[hostId]?.name ?? \"Unknown host\",\n path: ws?.path ?? null,\n });\n wsGroups.set(key, g);\n wsOf.set(g, ws);\n pg.groups.push(g);\n }\n return g;\n };\n\n for (const e of entries) {\n const wg = wsGroup(projectGroup(e.projectId), e.ws, e.hostId, e.session.cwd);\n wg.rows.push(row(e, { project: null, host: null, branch: null }));\n }\n\n if (opts.filter === \"all\") {\n // Empty workspaces still appear under projects that have sessions, so a new session can start there.\n const withSessions = new Set(entries.map((e) => e.projectId));\n for (const ws of Object.values(input.workspaces)) {\n if (ws.archivedAt || !withSessions.has(ws.projectId)) continue;\n const project = input.projects[ws.projectId] ?? null;\n if (\n q &&\n ![ws.branch ?? \"\", project?.name ?? \"\", ws.path].join(\"\\n\").toLowerCase().includes(q)\n )\n continue;\n wsGroup(projectGroup(ws.projectId), ws, ws.hostId, ws.path);\n }\n }\n\n const groups = sortGroups([...projects.values()], sort);\n for (const g of groups) {\n g.groups.sort((a, b) => {\n if (sort === \"activity\" || sort === \"created\") {\n const la = sort === \"activity\" ? latest(a) : newest(a);\n const lb = sort === \"activity\" ? latest(b) : newest(b);\n if (la !== lb) return lb.localeCompare(la);\n }\n // The main checkout first, then by branch.\n const ma = wsOf.get(a)?.provenance === \"main\" ? 0 : 1;\n const mb = wsOf.get(b)?.provenance === \"main\" ? 0 : 1;\n return ma - mb || a.label.localeCompare(b.label);\n });\n // A project with only its main checkout (or one plain folder) needs no workspace level.\n const only = g.groups.length === 1 ? g.groups[0]! : null;\n if (only && (only.path === null || wsOf.get(only)?.provenance === \"main\")) {\n g.rows = only.rows;\n g.detail = only.detail;\n g.groups = [];\n }\n countSessions(g);\n }\n return { groups, rows: [] };\n}\n\n/** True when the tree has no sessions and nothing to expand. */\nexport function navTreeIsEmpty(tree: NavTree): boolean {\n return (\n tree.rows.length === 0 &&\n tree.groups.every((g) => g.sessionCount === 0 && g.groups.length === 0)\n );\n}\n\n/** Every group key, depth-first (for Collapse all). */\nexport function navGroupKeys(tree: NavTree): string[] {\n const out: string[] = [];\n const walk = (gs: NavGroup[]) => {\n for (const g of gs) {\n out.push(g.key);\n walk(g.groups);\n }\n };\n walk(tree.groups);\n return out;\n}\n\n/* ------------------------------------------------------------------ */\n/* Session context */\n/* ------------------------------------------------------------------ */\n\nconst ACTIVE_RUN_STATES: Run[\"state\"][] = [\n \"queued\",\n \"dispatching\",\n \"uncertain\",\n \"running\",\n \"waiting_input\",\n \"checking\",\n];\n\n/** The run controlling a session: `session.runId`, else the newest active run on it. */\nexport function runForSession(runs: Record<string, Run>, session: Session): Run | null {\n if (session.runId && runs[session.runId]) return runs[session.runId]!;\n let best: Run | null = null;\n for (const r of Object.values(runs)) {\n if (r.sessionId !== session.id || !ACTIVE_RUN_STATES.includes(r.state)) continue;\n if (!best || r.createdAt > best.createdAt) best = r;\n }\n return best;\n}\n\nexport type AutomationControl = \"automation\" | \"human\" | \"none\";\n\nexport function automationControl(run: Run | null): AutomationControl {\n if (!run) return \"none\";\n return run.controlMode;\n}\n\nexport const AUTOMATION_LABEL: Record<AutomationControl, string> = {\n automation: \"Automation\",\n human: \"You have control\",\n none: \"Manual session\",\n};\n\nexport type HostLink = \"connected\" | \"reconnecting\" | \"unreachable\";\n\nexport function hostLink(host: Host | undefined, session: Session): HostLink {\n if (host?.revokedAt) return \"unreachable\";\n return host?.connectivity ?? session.connectivity;\n}\n\n/** Shown wherever a read-only subagent session would otherwise accept input. */\nexport const SUBAGENT_READ_ONLY = \"Subagent: view only. Live control is not supported.\";\n\n/** A read-only subagent session (its transcript comes from the native file on open). */\nexport function isSubagentView(session: Pick<Session, \"provenance\" | \"readOnly\">): boolean {\n return session.provenance === \"subagent\" && session.readOnly;\n}\n\n/** Why the composer cannot send, or null when it can. Ordered by what the user must fix first. */\nexport function composerBlockReason(input: {\n session: Session;\n hostLink: HostLink;\n hostName: string;\n}): { reason: string; action?: \"resume\"; pending?: boolean } | null {\n const { session, hostLink: link } = input;\n if (session.readOnly) return { reason: SUBAGENT_READ_ONLY };\n if (session.archivedAt) return { reason: \"Session archived: unarchive it to send\" };\n if (link !== \"connected\") {\n return {\n reason:\n link === \"reconnecting\"\n ? `Host offline: ${input.hostName} is reconnecting`\n : `Host offline: ${input.hostName} is unreachable`,\n };\n }\n if (session.runtime === \"starting\")\n return { reason: \"Starting… you can send once Pi is ready\", pending: true };\n // A stopped session with a Pi file resumes when you send to it.\n if (!isLive(session) && !session.nativeHandle) {\n return { reason: \"Session stopped: no native Pi session to resume\" };\n }\n if (session.compacting) return { reason: \"Compacting context: you can send when it finishes\" };\n return null;\n}\n\nexport type SessionStatusKind =\n | \"subagent\"\n | \"archived\"\n | \"host\"\n | \"answer\"\n | \"failed\"\n | \"interrupted\"\n | \"stopped\"\n | \"starting\"\n | \"compacting\"\n | \"automation\"\n | \"human\";\nexport type SessionStatusAction = \"unarchive\" | \"answer\" | \"resume\" | \"takeover\" | \"return\";\n\nexport interface SessionStatus {\n kind: SessionStatusKind;\n tone: \"neutral\" | \"info\" | \"warning\" | \"danger\";\n text: string;\n action: { kind: SessionStatusAction; label: string } | null;\n /** Transitional: show a spinner instead of the icon. */\n pending?: boolean;\n /** Secondary link (failed: diagnostics). */\n link?: { label: string; to: string };\n}\n\n/** An unreachable host turns the status from warning to danger after this long. */\nexport const HOST_OFFLINE_DANGER_MS = 5 * 60_000;\n\n/**\n * The one status line above the composer: what most needs the user, in priority order\n * (subagent, archived, host, question, failed, interrupted, stopped, starting, compacting,\n * automation, human control). Null when nothing needs saying.\n */\nexport function sessionStatus(input: {\n session: Session;\n hostLink: HostLink;\n hostName: string;\n hostLastSeenAt: string | null | undefined;\n control: AutomationControl;\n pending: Pick<Interaction, \"title\">[];\n canResume: boolean;\n now: number;\n}): SessionStatus | null {\n const { session: s, hostLink: link, hostName, pending } = input;\n const resume = input.canResume ? { kind: \"resume\" as const, label: \"Resume\" } : null;\n if (s.readOnly)\n return { kind: \"subagent\", tone: \"neutral\", text: SUBAGENT_READ_ONLY, action: null };\n if (s.archivedAt) {\n return {\n kind: \"archived\",\n tone: \"neutral\",\n text: \"This session is archived. Unarchive it to send messages.\",\n action: { kind: \"unarchive\", label: \"Unarchive\" },\n };\n }\n if (link !== \"connected\") {\n const seen = input.hostLastSeenAt ? Date.parse(input.hostLastSeenAt) : Number.NaN;\n const long =\n link === \"unreachable\" &&\n (!Number.isFinite(seen) || input.now - seen > HOST_OFFLINE_DANGER_MS);\n return link === \"reconnecting\"\n ? {\n kind: \"host\",\n tone: \"warning\",\n pending: true,\n text: `Host ${hostName} is reconnecting… Sending and answers resume when it is back.`,\n action: null,\n }\n : {\n kind: \"host\",\n tone: long ? \"danger\" : \"warning\",\n text: `Host ${hostName} is offline. Showing the last known transcript; sending resumes when it reconnects.`,\n action: null,\n };\n }\n if (pending.length > 0) {\n return {\n kind: \"answer\",\n tone: \"warning\",\n text:\n pending.length === 1\n ? `Needs input: ${pending[0]!.title}`\n : `${pending.length} questions need input`,\n action: { kind: \"answer\", label: \"Answer\" },\n };\n }\n if (s.runtime === \"failed\") {\n return {\n kind: \"failed\",\n tone: \"danger\",\n text: `This session failed: ${s.runtimeDetail ?? \"Pi exited with an error.\"}`,\n action: resume,\n link: { label: \"Diagnostics\", to: \"/settings/diagnostics\" },\n };\n }\n if (s.runtime === \"interrupted\") {\n return {\n kind: \"interrupted\",\n tone: \"neutral\",\n text: s.runtimeDetail\n ? `Interrupted: ${s.runtimeDetail}`\n : \"Interrupted. Resume to continue.\",\n action: resume,\n };\n }\n if (s.runtime === \"stopped\") {\n return s.nativeHandle\n ? {\n kind: \"stopped\",\n tone: \"neutral\",\n text: \"Stopped. Sending a message resumes it.\",\n action: resume,\n }\n : {\n kind: \"stopped\",\n tone: \"neutral\",\n text: \"Stopped: no native Pi session to resume.\",\n action: null,\n };\n }\n if (s.runtime === \"starting\") {\n return {\n kind: \"starting\",\n tone: \"info\",\n pending: true,\n text: \"Starting Pi… you can send once it is ready.\",\n action: null,\n };\n }\n if (s.compacting) {\n return {\n kind: \"compacting\",\n tone: \"info\",\n pending: true,\n text: \"Compacting context… you can send when it finishes.\",\n action: null,\n };\n }\n if (input.control === \"automation\") {\n return {\n kind: \"automation\",\n tone: \"info\",\n text: \"Automation is running this session. Take over to pause automatic continuations.\",\n action: { kind: \"takeover\", label: \"Take over\" },\n };\n }\n if (input.control === \"human\") {\n return {\n kind: \"human\",\n tone: \"neutral\",\n text: \"You have control. Automatic continuations are paused.\",\n action: { kind: \"return\", label: \"Return to automation\" },\n };\n }\n return null;\n}\n\nexport interface SendModes {\n /** Send as a normal prompt (session idle). */\n prompt: boolean;\n /** Immediate steering while running (only when the runtime supports it). */\n steer: boolean;\n /** Queue a follow-up while running. */\n followUp: boolean;\n}\n\nexport function sendModes(\n session: Pick<Session, \"runtime\">,\n caps: RuntimeCapabilities | null | undefined,\n): SendModes {\n if (!isBusy(session)) return { prompt: true, steer: false, followUp: false };\n return {\n prompt: false,\n steer: caps?.steer === true,\n followUp: caps ? caps.followUp : true,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Transcript timeline */\n/* ------------------------------------------------------------------ */\n\nexport type TimelineEntry =\n | {\n type: \"item\";\n key: string;\n item: TranscriptItem;\n stream: StreamBuffer | null;\n repeat?: number;\n }\n | { type: \"stream\"; key: string; stream: StreamBuffer }\n | { type: \"interaction\"; key: string; interaction: Interaction };\n\n/**\n * Durable transcript items in order, with stream deltas merged into their\n * item (or appended as live entries when the item has not arrived yet), plus\n * pending interactions that have no transcript item yet.\n */\nexport function buildTimeline(\n items: TranscriptItem[],\n streams: StreamBuffer[],\n pending: Interaction[],\n): TimelineEntry[] {\n const byItem = new Map(streams.map((s) => [s.itemId, s]));\n const out: TimelineEntry[] = [];\n const seenInteractions = new Set<string>();\n for (const item of items) {\n const stream = byItem.get(item.id) ?? null;\n if (stream) byItem.delete(item.id);\n if (item.kind === \"interaction\") seenInteractions.add(item.data.interactionId);\n // Consecutive identical notices (e.g. repeated \"Host agent restarted\") become one row with a count.\n const prev = out[out.length - 1];\n if (\n item.kind === \"notice\" &&\n !stream &&\n prev?.type === \"item\" &&\n prev.item.kind === \"notice\" &&\n prev.item.data.level === item.data.level &&\n prev.item.data.text === item.data.text\n ) {\n out[out.length - 1] = { ...prev, repeat: (prev.repeat ?? 1) + 1 };\n continue;\n }\n out.push({ type: \"item\", key: item.id, item, stream });\n }\n const orphans = [...byItem.values()].sort(\n (a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER),\n );\n for (const s of orphans) {\n if (!s.text && !s.thinking && !s.toolArgs && !s.toolOutput) continue;\n out.push({ type: \"stream\", key: `stream:${s.itemId}`, stream: s });\n }\n for (const i of pending) {\n if (seenInteractions.has(i.id)) continue;\n out.push({ type: \"interaction\", key: `interaction:${i.id}`, interaction: i });\n }\n return out;\n}\n\n/** Number of entries after the one with `baselineKey` (unseen while scrolled up). */\nexport function countAfter(entries: { key: string }[], baselineKey: string | null): number {\n if (baselineKey === null) return entries.length;\n const idx = entries.findIndex((e) => e.key === baselineKey);\n if (idx < 0) return 0;\n return entries.length - idx - 1;\n}\n\n/** DOM id of an interaction in the transcript (strip and deep links scroll to it). */\nexport function interactionDomId(interactionId: string): string {\n return `interaction-${interactionId}`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Attachments */\n/* ------------------------------------------------------------------ */\n\nexport interface ImageAttachment {\n id: string;\n name: string;\n mimeType: string;\n /** Base64 without the data: prefix. */\n data: string;\n size: number;\n}\n\nexport const MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;\n\n/** Split a data URL into `{mimeType, data}`. */\nexport function parseDataUrl(url: string): { mimeType: string; data: string } | null {\n const m = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(url);\n if (!m?.[2]) return null;\n return { mimeType: m[1] ?? \"application/octet-stream\", data: m[3] ?? \"\" };\n}\n\nexport function readImageFile(file: File): Promise<ImageAttachment> {\n return new Promise((resolve, reject) => {\n if (!file.type.startsWith(\"image/\")) {\n reject(new Error(`${file.name} is not an image`));\n return;\n }\n if (file.size > MAX_ATTACHMENT_BYTES) {\n reject(new Error(`${file.name} is larger than 10 MB`));\n return;\n }\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error ?? new Error(`Could not read ${file.name}`));\n reader.onload = () => {\n const parsed = parseDataUrl(String(reader.result ?? \"\"));\n if (!parsed) {\n reject(new Error(`Could not read ${file.name}`));\n return;\n }\n resolve({\n id: `att_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`,\n name: file.name,\n mimeType: parsed.mimeType || file.type,\n data: parsed.data,\n size: file.size,\n });\n };\n reader.readAsDataURL(file);\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Misc */\n/* ------------------------------------------------------------------ */\n\nexport function checkoutLabel(c: Checkout, hosts: Record<string, Host>): string {\n return `${hosts[c.hostId]?.name ?? \"Unknown host\"}: ${c.path}`;\n}\n\n/** First line of a tool's args for a compact summary. */\nexport function stringifyArgs(args: unknown): string {\n if (args === undefined || args === null) return \"\";\n if (typeof args === \"string\") return args;\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n}\n\n/** Tail of verbose output for the collapsed mobile preview. */\nexport function outputPreview(output: string, maxLines = 6): { text: string; truncated: boolean } {\n const lines = output.replace(/\\n+$/, \"\").split(\"\\n\");\n if (lines.length <= maxLines && output.length <= 600) return { text: output, truncated: false };\n const tail = lines.slice(-maxLines).join(\"\\n\");\n return { text: tail.length > 600 ? tail.slice(-600) : tail, truncated: true };\n}\n\n/* ------------------------------------------------------------------ */\n/* Pane layout */\n/* ------------------------------------------------------------------ */\n\nexport const CONVERSATION_MIN = 420;\n/** At the compact breakpoint the navigator is at most this wide (the inspector is a drawer). */\nexport const COMPACT_NAVIGATOR_MAX = 300;\nconst SPLITTER = 6;\n\n/**\n * Pane widths that always leave the conversation its 420 px minimum: the\n * inspector gives way first (down to 320), then the navigator (down to 220).\n * Stored preferences are not changed.\n */\nexport function fitPanes(\n available: number,\n nav: number,\n insp: number | null,\n): { nav: number; insp: number | null } {\n if (available <= 0) return { nav, insp };\n const splitters = insp === null ? SPLITTER : SPLITTER * 2;\n let over = nav + (insp ?? 0) + splitters + CONVERSATION_MIN - available;\n let i = insp;\n let n = nav;\n if (over > 0 && i !== null) {\n const give = Math.min(over, i - PANE_LIMITS.inspector.min);\n i -= give;\n over -= give;\n }\n if (over > 0) {\n const give = Math.min(over, n - PANE_LIMITS.navigator.min);\n n -= give;\n }\n return { nav: n, insp: i };\n}\n\n// ---- session controls: slash commands, model, effort, context ----\n\nexport type CommandSource = \"switchyard\" | SlashCommand[\"source\"] | \"terminal\";\n\nexport interface CommandEntry {\n name: string;\n description: string | null;\n source: CommandSource;\n argumentHint: string | null;\n}\n\nexport const CLIENT_COMMANDS: CommandEntry[] = [\n {\n name: \"model\",\n description: \"Switch this session's model\",\n source: \"switchyard\",\n argumentHint: \"<provider>/<model>\",\n },\n {\n name: \"thinking\",\n description: \"Set the effort (thinking level)\",\n source: \"switchyard\",\n argumentHint: \"<level>\",\n },\n {\n name: \"compact\",\n description: \"Compact the session context\",\n source: \"switchyard\",\n argumentHint: \"[instructions]\",\n },\n {\n name: \"name\",\n description: \"Rename this session\",\n source: \"switchyard\",\n argumentHint: \"<name>\",\n },\n {\n name: \"new\",\n description: \"Start a new session in this workspace\",\n source: \"switchyard\",\n argumentHint: \"[prompt]\",\n },\n {\n name: \"fork\",\n description: \"Start a new session from one of your messages\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"clone\",\n description: \"Copy this conversation into a new session\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"tree\",\n description: \"Start a new session from any point in the conversation tree\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"resume\",\n description: \"Open another Pi session from this folder\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"reload\",\n description: \"Reload extensions, skills, prompts and context files\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"export\",\n description: \"Download this session's .jsonl file\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"session\",\n description: \"Show session info and stats\",\n source: \"switchyard\",\n argumentHint: null,\n },\n {\n name: \"copy\",\n description: \"Copy the last reply to the clipboard\",\n source: \"switchyard\",\n argumentHint: null,\n },\n];\n\nexport const TERMINAL_COMMANDS: CommandEntry[] = [\n {\n name: \"settings\",\n description: \"Open settings menu\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"scoped-models\",\n description: \"Enable/disable models for Ctrl+P cycling\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"import\",\n description: \"Import and resume a session from a JSONL file\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"share\",\n description: \"Share session via a Radius artifact or a GitHub gist\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"bug\",\n description: \"Report a bug to the Pi developers\",\n source: \"terminal\",\n argumentHint: \"<description>\",\n },\n {\n name: \"changelog\",\n description: \"Show changelog entries\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"hotkeys\",\n description: \"Show all keyboard shortcuts\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"trust\",\n description: \"Save project trust decision for future sessions\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"login\",\n description: \"Configure provider authentication\",\n source: \"terminal\",\n argumentHint: \"<provider>\",\n },\n {\n name: \"logout\",\n description: \"Remove provider authentication\",\n source: \"terminal\",\n argumentHint: null,\n },\n {\n name: \"quit\",\n description: \"Quit Pi\",\n source: \"terminal\",\n argumentHint: null,\n },\n];\n\nexport const TERMINAL_ONLY_COMMANDS = TERMINAL_COMMANDS.map((c) => c.name);\n\nconst SOURCE_ORDER: Record<string, number> = { extension: 0, prompt: 1, skill: 2 };\n\nexport function mergeCommands(client: CommandEntry[], remote: SlashCommand[]): CommandEntry[] {\n const names = new Set([...client.map((c) => c.name), ...remote.map((c) => c.name)]);\n const terminal = TERMINAL_COMMANDS.filter((c) => !names.has(c.name)).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n const taken = new Set(client.map((c) => c.name));\n const rest: CommandEntry[] = remote\n .filter((c) => !taken.has(c.name))\n .map((c) => ({\n name: c.name,\n description: c.description,\n source: c.source,\n argumentHint: c.argumentHint ?? null,\n }))\n .sort(\n (a, b) =>\n (SOURCE_ORDER[a.source] ?? 9) - (SOURCE_ORDER[b.source] ?? 9) ||\n a.name.localeCompare(b.name),\n );\n return [...client, ...rest, ...terminal];\n}\n\nexport function completionEligible(draft: string): boolean {\n return !draft.includes(\"\\n\") && draft.length <= 500 && /^\\/\\S+ /.test(draft);\n}\n\nexport function applyCompletion(draft: string, prefix: string, value: string): string {\n if (!draft.endsWith(prefix)) return draft;\n return draft.slice(0, draft.length - prefix.length) + value + (value.endsWith(\" \") ? \"\" : \" \");\n}\n\n/** The hint of the command being typed (`/name ` followed by arguments), if it has one. */\nexport function activeArgumentHint(\n draft: string,\n entries: CommandEntry[],\n): { name: string; hint: string } | null {\n if (draft.includes(\"\\n\")) return null;\n const m = /^\\/(\\S+)[ \\t]/.exec(draft);\n if (!m) return null;\n const entry = entries.find((e) => e.name === m[1]);\n return entry?.argumentHint ? { name: entry.name, hint: entry.argumentHint } : null;\n}\n\nexport function filterCommands(entries: CommandEntry[], query: string, limit = 50): CommandEntry[] {\n const q = query.toLowerCase();\n if (!q) return entries.slice(0, limit);\n const scored: { e: CommandEntry; score: number; i: number }[] = [];\n entries.forEach((e, i) => {\n const name = e.name.toLowerCase();\n const score = name.startsWith(q)\n ? 0\n : name.includes(q)\n ? 1\n : (e.description ?? \"\").toLowerCase().includes(q)\n ? 2\n : -1;\n if (score >= 0) scored.push({ e, score, i });\n });\n scored.sort((a, b) => a.score - b.score || a.i - b.i);\n return scored.slice(0, limit).map((s) => s.e);\n}\n\nexport type ClientCommand =\n | { kind: \"model-picker\" }\n | { kind: \"model\"; provider: string; modelId: string }\n | { kind: \"thinking\"; level: ThinkingLevel }\n | { kind: \"compact\"; instructions: string | null }\n | { kind: \"name\"; title: string }\n | { kind: \"new\"; prompt: string }\n | { kind: \"fork\" | \"clone\" | \"tree\" | \"resume\" | \"reload\" | \"export\" | \"session\" | \"copy\" }\n | { kind: \"invalid\"; reason: string }\n | { kind: \"terminal-only\"; name: string };\n\nexport function parseClientCommand(text: string): ClientCommand | null {\n const m = /^\\/(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(text.trim());\n if (!m) return null;\n const name = m[1]!;\n const arg = (m[2] ?? \"\").trim();\n switch (name) {\n case \"model\": {\n if (!arg) return { kind: \"model-picker\" };\n const slash = arg.indexOf(\"/\");\n if (slash <= 0 || slash === arg.length - 1 || /\\s/.test(arg)) {\n return {\n kind: \"invalid\",\n reason: \"Use /model <provider>/<model>, or /model alone to pick one\",\n };\n }\n return { kind: \"model\", provider: arg.slice(0, slash), modelId: arg.slice(slash + 1) };\n }\n case \"thinking\": {\n const r = ThinkingLevel.safeParse(arg.toLowerCase());\n if (!r.success) {\n return {\n kind: \"invalid\",\n reason: `Use /thinking <level>: ${ThinkingLevel.options.join(\", \")}`,\n };\n }\n return { kind: \"thinking\", level: r.data };\n }\n case \"compact\":\n return { kind: \"compact\", instructions: arg || null };\n case \"name\":\n if (!arg) return { kind: \"invalid\", reason: \"Use /name <new name>\" };\n if (arg.length > 200) {\n return { kind: \"invalid\", reason: \"Session names are at most 200 characters\" };\n }\n return { kind: \"name\", title: arg };\n case \"new\":\n return { kind: \"new\", prompt: arg };\n case \"fork\":\n case \"clone\":\n case \"tree\":\n case \"resume\":\n case \"reload\":\n case \"export\":\n case \"session\":\n case \"copy\":\n return { kind: name };\n default:\n return TERMINAL_ONLY_COMMANDS.includes(name) ? { kind: \"terminal-only\", name } : null;\n }\n}\n\nexport function clientCommandProblem(\n cmd: ClientCommand,\n running: boolean,\n hasNative = true,\n): string | null {\n if (cmd.kind === \"invalid\") return cmd.reason;\n if (cmd.kind === \"terminal-only\") {\n return `/${cmd.name} is a Pi terminal command: open the session's terminal to use it`;\n }\n if (cmd.kind === \"compact\" && running) return \"Wait for the run to finish before compacting\";\n if (\n !hasNative &&\n (cmd.kind === \"fork\" ||\n cmd.kind === \"clone\" ||\n cmd.kind === \"tree\" ||\n cmd.kind === \"export\" ||\n cmd.kind === \"reload\")\n ) {\n return \"This session has no Pi session file yet\";\n }\n if (cmd.kind === \"reload\" && running) return \"Wait for the run to finish before reloading\";\n return null;\n}\n\n/** Model name for a pill: no provider or vendor prefix (the name is specific enough). */\nexport function pillModelLabel(m: SessionModel): string {\n let label = m.name ?? \"\";\n const vendor = /^[^:/]{1,40}:\\s+(.+)$/.exec(label);\n if (vendor) label = vendor[1]!;\n if (!label) label = m.id.slice(m.id.lastIndexOf(\"/\") + 1);\n const prefix = `${m.provider}/`;\n if (label.toLowerCase().startsWith(prefix.toLowerCase())) label = label.slice(prefix.length);\n const brand = /^Claude\\s+(.+)$/.exec(label);\n if (brand) label = brand[1]!;\n return label || modelLabel(m);\n}\n\n/** Pi's scoped (favorite) models, plus the current one, in the original order. */\nexport function favoriteModels(\n models: SessionModel[],\n current: SessionModel | null,\n): SessionModel[] {\n return models.filter(\n (m) => m.scoped === true || (current && m.provider === current.provider && m.id === current.id),\n );\n}\n\nexport function effortIndex(\n levels: readonly string[],\n thinking: string | null | undefined,\n): number {\n const i = thinking ? levels.indexOf(thinking) : -1;\n return Math.max(i, 0);\n}\n\nexport function modelLabel(m: SessionModel): string {\n return m.name ?? m.id;\n}\n\nexport function profileSummary(p: Profile): string {\n return [\n p.name,\n p.provider && p.model ? `${p.provider}/${p.model}` : (p.model ?? null),\n p.thinking ? `effort ${p.thinking}` : null,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function modelSummary(session: Session): string {\n const model = session.model;\n if (!model) return profileSummary(session.profileSnapshot);\n const effort =\n session.thinking && model.thinkingLevels.length > 1 ? ` · effort ${session.thinking}` : \"\";\n return `${modelLabel(model)}${effort}`;\n}\n\nexport function groupModels(\n models: SessionModel[],\n query: string,\n): { provider: string; models: SessionModel[] }[] {\n const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const groups: { provider: string; models: SessionModel[] }[] = [];\n for (const m of models) {\n const hay = `${m.provider}/${m.id} ${m.name ?? \"\"}`.toLowerCase();\n if (!tokens.every((t) => hay.includes(t))) continue;\n let g = groups.find((x) => x.provider === m.provider);\n if (!g) {\n g = { provider: m.provider, models: [] };\n groups.push(g);\n }\n g.models.push(m);\n }\n return groups;\n}\n\nexport function contextMeter(s: Pick<Session, \"stats\" | \"compacting\">): {\n label: string;\n detail: string;\n percent: number | null;\n tone: \"muted\" | \"warning\" | \"danger\";\n} | null {\n const c = s.stats?.context;\n if (!c) return null;\n const fmt = (n: number) => n.toLocaleString(\"en-US\");\n const label = s.compacting\n ? \"Compacting…\"\n : c.percent === null\n ? \"—\"\n : `${Math.round(c.percent)}%`;\n const detail =\n c.tokens === null\n ? `Known after the next reply (window ${fmt(c.window)} tokens)`\n : `${fmt(c.tokens)} of ${fmt(c.window)} tokens`;\n const p = c.percent ?? 0;\n return {\n label,\n detail,\n percent: c.percent,\n tone: p >= 90 ? \"danger\" : p >= 75 ? \"warning\" : \"muted\",\n };\n}\n\nexport function piControlsAvailable(host: Host | undefined, block: unknown): boolean {\n return !block && host?.capabilities?.sessionControls === true;\n}\n","import type {\n AdapterInfo,\n Host,\n Project,\n Run,\n Session,\n Task,\n Workspace,\n} from \"@switchyard/protocol\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { errorMessage, isApiError } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\nimport {\n type AutomationControl,\n automationControl,\n type HostLink,\n hostLink,\n runForSession,\n} from \"./model\";\n\nexport interface SessionContext {\n session: Session;\n host: Host | undefined;\n hostName: string;\n link: HostLink;\n project: Project | undefined;\n workspace: Workspace | undefined;\n run: Run | null;\n task: Task | undefined;\n control: AutomationControl;\n adapters: AdapterInfo[];\n}\n\nconst NO_ADAPTERS: AdapterInfo[] = [];\n\nexport type SessionLookup =\n | { state: \"idle\" }\n | { state: \"loading\" }\n | { state: \"missing\" }\n | { state: \"error\"; error: string };\n\n/**\n * A session the snapshot leaves out (archived) is fetched by id and kept in the sync store, so\n * its URL still opens after a reload and live events (Unarchive) update it.\n */\nexport function useSessionLookup(\n sessionId: string | null,\n session: Session | undefined,\n hydrated: boolean,\n): SessionLookup {\n const absent = hydrated && !!sessionId && !session;\n const [result, setResult] = useState<{ id: string; lookup: SessionLookup } | null>(null);\n useEffect(() => {\n if (!absent || !sessionId) return;\n const ctrl = new AbortController();\n setResult({ id: sessionId, lookup: { state: \"loading\" } });\n codeApi.get(sessionId, ctrl.signal).then(\n (s) => {\n useSyncStore.getState().upsertSessionIfMissing(s);\n setResult(null);\n },\n (e) => {\n if (ctrl.signal.aborted) return;\n setResult({\n id: sessionId,\n lookup: isApiError(e, \"not_found\")\n ? { state: \"missing\" }\n : { state: \"error\", error: errorMessage(e) },\n });\n },\n );\n return () => ctrl.abort();\n }, [absent, sessionId]);\n if (!absent) return { state: \"idle\" };\n return result?.id === sessionId ? result.lookup : { state: \"loading\" };\n}\n\n/** Everything the session views need about one session, from the store. */\nexport function useSessionContext(session: Session | undefined): SessionContext | null {\n const host = useSyncStore((s) => (session ? s.hosts[session.hostId] : undefined));\n const project = useSyncStore((s) =>\n session?.projectId ? s.projects[session.projectId] : undefined,\n );\n const workspace = useSyncStore((s) =>\n session?.workspaceId ? s.workspaces[session.workspaceId] : undefined,\n );\n const runs = useSyncStore((s) => s.runs);\n const tasks = useSyncStore((s) => s.tasks);\n const adapters = useSyncStore((s) =>\n session ? (s.adapters[session.hostId] ?? NO_ADAPTERS) : NO_ADAPTERS,\n );\n return useMemo(() => {\n if (!session) return null;\n const run = runForSession(runs, session);\n const taskId = session.taskId ?? run?.taskId ?? null;\n return {\n session,\n host,\n hostName: host?.name ?? \"Unknown host\",\n link: hostLink(host, session),\n project,\n workspace,\n run,\n task: taskId ? tasks[taskId] : undefined,\n control: automationControl(run),\n adapters,\n };\n }, [session, host, project, workspace, runs, tasks, adapters]);\n}\n\nexport interface Mutation<A extends unknown[]> {\n run: (...args: A) => Promise<boolean>;\n busy: boolean;\n error: unknown;\n reset: () => void;\n}\n\n/**\n * Wrap a REST mutation: busy state, error kept for inline display (with\n * retry), and a success toast only after the coordinator acknowledged.\n */\nexport function useMutation<A extends unknown[], R>(\n fn: (...args: A) => Promise<R>,\n opts: { success?: string | ((r: R) => string | null); errorToast?: boolean } = {},\n): Mutation<A> {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const fnRef = useRef(fn);\n fnRef.current = fn;\n const optsRef = useRef(opts);\n optsRef.current = opts;\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const run = useCallback(async (...args: A) => {\n setBusy(true);\n setError(null);\n try {\n const r = await fnRef.current(...args);\n const { success } = optsRef.current;\n const msg = typeof success === \"function\" ? success(r) : success;\n if (msg) toast.success(msg);\n return true;\n } catch (e) {\n if (mounted.current) setError(e);\n if (optsRef.current.errorToast) toast.error(errorMessage(e));\n return false;\n } finally {\n if (mounted.current) setBusy(false);\n }\n }, []);\n const reset = useCallback(() => setError(null), []);\n return { run, busy, error, reset };\n}\n\n/** Re-render every `ms` while `active` (elapsed timers). */\nexport function useNow(active: boolean, ms = 1000): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return;\n setNow(Date.now());\n const t = setInterval(() => setNow(Date.now()), ms);\n return () => clearInterval(t);\n }, [active, ms]);\n return now;\n}\n\n/** Width of an element, kept current with a ResizeObserver. */\nexport function useElementWidth<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState(0);\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n setWidth(el.clientWidth);\n const ro = new ResizeObserver(([entry]) => {\n if (entry) setWidth(entry.contentRect.width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n return [ref, width] as const;\n}\n","import type { DiffFile as ChangedFile, DiffResult } from \"@switchyard/protocol\";\nimport {\n ArrowLeft,\n Check,\n ChevronLeft,\n ChevronRight,\n FileDiff,\n MessageSquarePlus,\n RefreshCw,\n Send,\n Trash2,\n Undo2,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useHideBottomNav } from \"../../app/chrome\";\nimport { DiffView } from \"../../components/intent/DiffView\";\nimport { type DiffFile, parseUnifiedDiff } from \"../../components/intent/diff\";\nimport { Button } from \"../../components/ui/Button\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Dialog, Sheet } from \"../../components/ui/Overlay\";\nimport {\n EmptyState,\n ErrorState,\n HostUnavailable,\n LoadingState,\n UnsupportedCapability,\n} from \"../../components/ui/states\";\nimport { TextArea } from \"../../components/ui/TextArea\";\nimport { formatReviewFollowUp, type ReviewComment, useReviewComments } from \"../../drafts\";\nimport { cn } from \"../../lib/cn\";\nimport { formatTime } from \"../../lib/time\";\nimport { errorMessage, isApiError } from \"../../sync/api\";\nimport { codeApi } from \"./api\";\nimport { useCodeContext } from \"./context\";\nimport type { SessionContext } from \"./hooks\";\nimport { useMutation } from \"./hooks\";\nimport { composerBlockReason, isBusy } from \"./model\";\n\n/* ------------------------------------------------------------------ */\n/* Data */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceDiff {\n result: DiffResult | null;\n parsed: Map<string, DiffFile>;\n loading: boolean;\n error: unknown;\n fetchedAt: string | null;\n /** The workspace changed (git state event) after the last fetch. */\n outdated: boolean;\n refresh: () => void;\n}\n\n/** Changed files and the patch of a workspace; refetches on demand. */\nexport function useWorkspaceDiff(ctx: SessionContext): WorkspaceDiff {\n const ws = ctx.workspace;\n const connected = ctx.link === \"connected\";\n const [result, setResult] = useState<DiffResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const [fetchedAt, setFetchedAt] = useState<string | null>(null);\n const [nonce, setNonce] = useState(0);\n const wsId = ws?.id ?? null;\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nonce triggers a refetch\n useEffect(() => {\n if (!wsId || !connected) return;\n const ac = new AbortController();\n setLoading(true);\n setError(null);\n codeApi\n .diff(wsId, undefined, ac.signal)\n .then((r) => {\n setResult(r);\n setFetchedAt(new Date().toISOString());\n })\n .catch((e) => {\n if (!ac.signal.aborted) setError(e);\n })\n .finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n return () => ac.abort();\n }, [wsId, connected, nonce]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: clear when the workspace changes\n useEffect(() => {\n setResult(null);\n setFetchedAt(null);\n }, [wsId]);\n\n const parsed = useMemo(() => {\n const m = new Map<string, DiffFile>();\n if (result?.patch) for (const f of parseUnifiedDiff(result.patch)) m.set(f.path, f);\n return m;\n }, [result]);\n\n const outdated = !!ws && !!fetchedAt && ws.updatedAt > fetchedAt;\n const refresh = useCallback(() => setNonce((n) => n + 1), []);\n return { result, parsed, loading, error, fetchedAt, outdated, refresh };\n}\n\n/** Parsed diff of one file: from the full patch, else fetched with `?file=`. */\nfunction useFileDiff(ctx: SessionContext, diff: WorkspaceDiff, path: string | null) {\n const fromPatch = path ? diff.parsed.get(path) : undefined;\n const [fetched, setFetched] = useState<{ path: string; file: DiffFile | null } | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [nonce, setNonce] = useState(0);\n const wsId = ctx.workspace?.id;\n // biome-ignore lint/correctness/useExhaustiveDependencies: refetch on retry and after a refresh\n useEffect(() => {\n if (!path || fromPatch || !wsId || ctx.link !== \"connected\") return;\n const ac = new AbortController();\n setError(null);\n codeApi\n .diff(wsId, path, ac.signal)\n .then((r) => {\n const files = r.patch ? parseUnifiedDiff(r.patch) : [];\n setFetched({ path, file: files.find((f) => f.path === path) ?? files[0] ?? null });\n })\n .catch((e) => {\n if (!ac.signal.aborted) setError(e);\n });\n return () => ac.abort();\n }, [path, fromPatch, wsId, ctx.link, nonce, diff.fetchedAt]);\n if (!path) return { file: null, loading: false, error: null, retry: () => {} };\n if (fromPatch) return { file: fromPatch, loading: false, error: null, retry: () => {} };\n const mine = fetched?.path === path ? fetched : null;\n return {\n file: mine?.file ?? null,\n loading: !mine && !error,\n error,\n retry: () => setNonce((n) => n + 1),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Pieces */\n/* ------------------------------------------------------------------ */\n\nexport const STATUS_LABEL: Record<ChangedFile[\"status\"], string> = {\n added: \"Added\",\n modified: \"Modified\",\n deleted: \"Deleted\",\n renamed: \"Renamed\",\n untracked: \"Untracked\",\n binary: \"Binary\",\n};\n\nfunction ChangedFileList({\n files,\n selected,\n onSelect,\n commentCounts,\n large,\n}: {\n files: ChangedFile[];\n selected: string | null;\n onSelect: (path: string) => void;\n commentCounts: Map<string, number>;\n large?: boolean;\n}) {\n return (\n <ul aria-label=\"Changed files\" className=\"flex min-w-0 flex-col\">\n {files.map((f) => {\n const comments = commentCounts.get(f.path) ?? 0;\n return (\n <li key={f.path} className=\"min-w-0\">\n <button\n type=\"button\"\n aria-current={selected === f.path ? \"true\" : undefined}\n onClick={() => onSelect(f.path)}\n className={cn(\n \"tap flex w-full min-w-0 items-center gap-2 rounded-md px-2 text-left text-sm hover:bg-surface-2\",\n large ? \"min-h-12 py-2\" : \"py-1.5\",\n selected === f.path && \"bg-accent-soft\",\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-xs\" title={f.path}>\n {f.path}\n </span>\n <span className=\"block text-xs text-muted\">\n {STATUS_LABEL[f.status]}\n {comments > 0 && ` · ${comments} comment${comments === 1 ? \"\" : \"s\"}`}\n </span>\n </span>\n <span className=\"shrink-0 font-mono text-xs tabular-nums\">\n <span className=\"text-success\">\n +{f.added}\n <span className=\"sr-only\"> added</span>\n </span>{\" \"}\n <span className=\"text-danger\">\n -{f.deleted}\n <span className=\"sr-only\"> deleted</span>\n </span>\n </span>\n {large && <ChevronRight aria-hidden className=\"size-4 shrink-0 text-subtle\" />}\n </button>\n </li>\n );\n })}\n </ul>\n );\n}\n\ninterface CommentDraft {\n file: string;\n line: number | null;\n excerpt: string | null;\n}\n\n/** Diff of one file; clicking a line opens a comment form. */\nfunction FileDiffView({\n ctx,\n diff,\n path,\n comments,\n onComment,\n}: {\n ctx: SessionContext;\n diff: WorkspaceDiff;\n path: string;\n comments: ReviewComment[];\n onComment: (d: CommentDraft) => void;\n}) {\n const fd = useFileDiff(ctx, diff, path);\n if (fd.error) {\n return (\n <ErrorState compact title=\"Could not load this diff\" error={fd.error} onRetry={fd.retry} />\n );\n }\n if (fd.loading) return <LoadingState label=\"Loading diff…\" />;\n if (!fd.file) {\n return <p className=\"text-sm text-muted\">No textual diff for this file.</p>;\n }\n const marked = new Set(comments.filter((c) => c.file === path).map((c) => c.line));\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <DiffView\n files={[fd.file]}\n onLineClick={({ file, line }) =>\n onComment({ file, line: line.newLine ?? line.oldLine, excerpt: line.text })\n }\n isLineMarked={({ line }) => marked.has(line.newLine ?? line.oldLine)}\n />\n <Button\n size=\"sm\"\n variant=\"ghost\"\n icon={<MessageSquarePlus className=\"size-4\" />}\n onClick={() => onComment({ file: path, line: null, excerpt: null })}\n className=\"self-start\"\n >\n Comment on this file\n </Button>\n </div>\n );\n}\n\nfunction CommentForm({\n draft,\n mobile,\n onClose,\n onSave,\n}: {\n draft: CommentDraft | null;\n mobile: boolean;\n onClose: () => void;\n onSave: (text: string) => void;\n}) {\n const [text, setText] = useState(\"\");\n const ref = useRef<HTMLTextAreaElement>(null);\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset for each new target line\n useEffect(() => setText(\"\"), [draft]);\n const Surface = mobile ? Sheet : Dialog;\n const where = draft ? (draft.line === null ? draft.file : `${draft.file}:${draft.line}`) : \"\";\n return (\n <Surface\n open={!!draft}\n onClose={onClose}\n title=\"Add review comment\"\n description={where}\n initialFocus={ref}\n footer={\n <>\n <Button onClick={onClose}>Cancel</Button>\n <Button variant=\"primary\" disabled={!text.trim()} onClick={() => onSave(text.trim())}>\n Add comment\n </Button>\n </>\n }\n >\n {draft?.excerpt && (\n <pre className=\"mb-2 max-w-full overflow-x-auto rounded bg-surface-2 px-2 py-1 font-mono text-xs\">\n {draft.excerpt}\n </pre>\n )}\n <label htmlFor=\"sy-review-comment\" className=\"sr-only\">\n Comment\n </label>\n <TextArea\n id=\"sy-review-comment\"\n ref={ref}\n minRows={3}\n value={text}\n placeholder=\"What should change here?\"\n onChange={(e) => setText(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-muted\">\n Comments are collected and sent together, never one at a time.\n </p>\n </Surface>\n );\n}\n\n/** Collected comments with \"Send as one follow-up\" and, for a task in Review, the review actions. */\nfunction ReviewPanel({\n ctx,\n review,\n}: {\n ctx: SessionContext;\n review: ReturnType<typeof useReviewComments>;\n}) {\n const { session, task } = ctx;\n const { mobile } = useCodeContext();\n const [overall, setOverall] = useState(\"\");\n const block = composerBlockReason({ session, hostLink: ctx.link, hostName: ctx.hostName });\n const send = useMutation(\n () =>\n codeApi.prompt(session.id, {\n text: formatReviewFollowUp(review.comments),\n mode: isBusy(session) ? \"followUp\" : \"prompt\",\n }),\n { success: \"Review comments sent as one follow-up.\" },\n );\n const feedback = [\n ...(overall.trim() ? [overall.trim()] : []),\n ...review.comments.map((c) => {\n const where = c.line === null ? c.file : `${c.file}:${c.line}`;\n return `${where}: ${c.text}`;\n }),\n ];\n const requestChanges = useMutation(() => codeApi.requestChanges(task!.id, feedback), {\n success: \"Changes requested. The task stays in Review until a new attempt starts.\",\n });\n const accept = useMutation((confirm?: boolean) => codeApi.accept(task!.id, confirm), {\n success: \"Task accepted and marked Done.\",\n });\n const acceptNeedsConfirm =\n isApiError(accept.error, \"invalid_transition\") &&\n (accept.error.details as { needsConfirm?: boolean } | undefined)?.needsConfirm === true;\n const inReview = task?.state === \"review\";\n const sendBlocked = block?.reason ?? null;\n\n return (\n <section\n aria-label=\"Review\"\n className=\"flex min-w-0 flex-col gap-2 border-t border-border pt-3\"\n >\n <h3 className=\"text-sm font-semibold\">\n Review comments{review.comments.length > 0 && ` (${review.comments.length})`}\n </h3>\n {review.comments.length === 0 ? (\n <p className=\"text-sm text-muted\">\n {`${mobile ? \"Tap\" : \"Click\"} a line in the diff to comment. Comments go to Pi together as one message.`}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-1.5\">\n {review.comments.map((c) => (\n <li\n key={c.id}\n className=\"flex min-w-0 items-start gap-2 rounded-md border border-border px-2 py-1.5\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-xs text-muted\">\n {c.line === null ? c.file : `${c.file}:${c.line}`}\n </div>\n <p className=\"text-sm break-words whitespace-pre-wrap\">{c.text}</p>\n </div>\n <IconButton\n size=\"sm\"\n label=\"Remove comment\"\n icon={<Trash2 className=\"size-3.5\" />}\n onClick={() => review.remove(c.id)}\n />\n </li>\n ))}\n </ul>\n )}\n {review.comments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n size=\"sm\"\n variant={inReview ? \"secondary\" : \"primary\"}\n icon={<Send className=\"size-3.5\" />}\n disabled={!!sendBlocked}\n busy={send.busy}\n onClick={() => void send.run().then((ok) => ok && review.clear())}\n >\n Send as one follow-up\n </Button>\n {review.comments.length > 0 && (\n <Button size=\"sm\" variant=\"ghost\" onClick={review.clear}>\n Clear all\n </Button>\n )}\n </div>\n )}\n {sendBlocked && review.comments.length > 0 && (\n <p className=\"text-xs text-muted\">{sendBlocked}</p>\n )}\n {send.error !== null && (\n <ErrorState\n compact\n title=\"Comments not sent; they are kept.\"\n error={errorMessage(send.error)}\n onRetry={() => void send.run().then((ok) => ok && review.clear())}\n />\n )}\n\n {task && inReview && (\n <div className=\"mt-2 flex flex-col gap-2 rounded-md border border-border p-3\">\n <h3 className=\"text-sm font-semibold\">Task review: {task.title}</h3>\n <label htmlFor=\"sy-overall-feedback\" className=\"text-xs font-medium text-muted\">\n Overall feedback (optional, sent with the comments above)\n </label>\n <TextArea\n id=\"sy-overall-feedback\"\n minRows={2}\n value={overall}\n onChange={(e) => setOverall(e.target.value)}\n />\n <div className=\"flex flex-wrap gap-2\">\n <Button\n size=\"sm\"\n icon={<Undo2 className=\"size-3.5\" />}\n disabled={feedback.length === 0}\n busy={requestChanges.busy}\n onClick={() =>\n void requestChanges.run().then((ok) => {\n if (!ok) return;\n review.clear();\n setOverall(\"\");\n })\n }\n >\n Request changes\n </Button>\n <Button\n size=\"sm\"\n variant=\"primary\"\n icon={<Check className=\"size-3.5\" />}\n busy={accept.busy}\n onClick={() => void accept.run(false)}\n >\n Accept task\n </Button>\n </div>\n {feedback.length === 0 && (\n <p className=\"text-xs text-muted\">\n Add a comment or overall feedback to request changes.\n </p>\n )}\n <p className=\"text-xs text-muted\">\n Accepting marks the task Done. It does not merge or push.\n </p>\n {requestChanges.error !== null && (\n <ErrorState\n compact\n title=\"Could not request changes\"\n error={errorMessage(requestChanges.error)}\n />\n )}\n {accept.error !== null &&\n (acceptNeedsConfirm ? (\n <div\n role=\"alert\"\n className=\"flex flex-col gap-2 rounded-md bg-warning-soft p-2 text-sm\"\n >\n <p className=\"break-words\">{errorMessage(accept.error)}</p>\n <Button\n size=\"sm\"\n variant=\"primary\"\n className=\"self-start\"\n busy={accept.busy}\n onClick={() => void accept.run(true)}\n >\n Accept anyway\n </Button>\n </div>\n ) : (\n <ErrorState compact title=\"Could not accept\" error={errorMessage(accept.error)} />\n ))}\n </div>\n )}\n {task?.review.changesRequested && task.state === \"review\" && (\n <p className=\"text-xs text-muted\">\n Changes requested. The task stays in Review until a new attempt is requested.\n </p>\n )}\n </section>\n );\n}\n\nfunction useCommentCounts(comments: ReviewComment[]) {\n return useMemo(() => {\n const m = new Map<string, number>();\n for (const c of comments) m.set(c.file, (m.get(c.file) ?? 0) + 1);\n return m;\n }, [comments]);\n}\n\nfunction ChangesUnavailable({ ctx }: { ctx: SessionContext }) {\n if (!ctx.workspace) {\n return (\n <UnsupportedCapability\n capability=\"Changes\"\n reason={`This session is not linked to a Switchyard workspace (it runs in ${ctx.session.cwd}).`}\n fallback=\"Open a session in a project workspace to review changes.\"\n />\n );\n }\n return (\n <HostUnavailable\n compact\n hostName={ctx.hostName}\n connectivity={ctx.link === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n lastSeenAt={ctx.host?.lastSeenAt}\n detail=\"Changes are read from the host; they load when it reconnects.\"\n />\n );\n}\n\nfunction RefreshRow({ diff }: { diff: WorkspaceDiff }) {\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-2 text-xs text-muted\">\n <span className=\"min-w-0 flex-1\">\n {diff.result ? `Against ${diff.result.base}` : \"\"}\n {diff.fetchedAt && ` · updated ${formatTime(diff.fetchedAt)}`}\n {diff.outdated && \" · workspace changed since\"}\n </span>\n <Button\n size=\"sm\"\n variant={diff.outdated ? \"secondary\" : \"ghost\"}\n icon={<RefreshCw className=\"size-3.5\" />}\n busy={diff.loading}\n onClick={diff.refresh}\n >\n {diff.loading ? \"Refreshing…\" : \"Refresh\"}\n </Button>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Desktop inspector tab */\n/* ------------------------------------------------------------------ */\n\nexport function ChangesTab({ ctx, diff }: { ctx: SessionContext; diff: WorkspaceDiff }) {\n const review = useReviewComments(ctx.session.id);\n const counts = useCommentCounts(review.comments);\n const [selected, setSelected] = useState<string | null>(null);\n const [commentDraft, setCommentDraft] = useState<CommentDraft | null>(null);\n const files = diff.result?.files ?? [];\n\n if (!ctx.workspace || ctx.link !== \"connected\") {\n return (\n <div className=\"flex flex-col gap-3\">\n <ChangesUnavailable ctx={ctx} />\n {(review.comments.length > 0 || ctx.task?.state === \"review\") && (\n <ReviewPanel ctx={ctx} review={review} />\n )}\n </div>\n );\n }\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <RefreshRow diff={diff} />\n {diff.error !== null && !diff.result ? (\n <ErrorState\n compact\n title=\"Could not load changes\"\n error={diff.error}\n onRetry={diff.refresh}\n />\n ) : !diff.result ? (\n <LoadingState label=\"Loading changes…\" />\n ) : files.length === 0 ? (\n <EmptyState\n icon={<FileDiff className=\"size-8\" />}\n title=\"No changes yet\"\n description={`Nothing differs from ${diff.result.base} in this workspace.`}\n className=\"py-6\"\n />\n ) : (\n <>\n {diff.error !== null && (\n <ErrorState\n compact\n title=\"Refresh failed; showing earlier changes\"\n error={diff.error}\n onRetry={diff.refresh}\n />\n )}\n <ChangedFileList\n files={files}\n selected={selected}\n onSelect={(p) => setSelected((cur) => (cur === p ? null : p))}\n commentCounts={counts}\n />\n {selected && (\n <FileDiffView\n ctx={ctx}\n diff={diff}\n path={selected}\n comments={review.comments}\n onComment={setCommentDraft}\n />\n )}\n </>\n )}\n {(review.comments.length > 0 || ctx.task?.state === \"review\") && (\n <ReviewPanel ctx={ctx} review={review} />\n )}\n <CommentForm\n draft={commentDraft}\n mobile={false}\n onClose={() => setCommentDraft(null)}\n onSave={(text) => {\n if (commentDraft) review.add({ ...commentDraft, text });\n setCommentDraft(null);\n }}\n />\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Mobile: file list first, then a full-screen unified diff */\n/* ------------------------------------------------------------------ */\n\nexport function MobileChanges({ ctx }: { ctx: SessionContext }) {\n const diff = useWorkspaceDiff(ctx);\n const review = useReviewComments(ctx.session.id);\n const counts = useCommentCounts(review.comments);\n const [open, setOpen] = useState<string | null>(null);\n const [commentDraft, setCommentDraft] = useState<CommentDraft | null>(null);\n const files = diff.result?.files ?? [];\n const idx = open ? files.findIndex((f) => f.path === open) : -1;\n\n if (open && idx >= 0) {\n return (\n <FullScreenDiff\n ctx={ctx}\n diff={diff}\n file={files[idx]!}\n index={idx}\n total={files.length}\n comments={review.comments}\n onBack={() => setOpen(null)}\n onPrev={() => setOpen(files[idx - 1]?.path ?? open)}\n onNext={() => setOpen(files[idx + 1]?.path ?? open)}\n commentDraft={commentDraft}\n setCommentDraft={setCommentDraft}\n onSaveComment={(text) => {\n if (commentDraft) review.add({ ...commentDraft, text });\n setCommentDraft(null);\n }}\n />\n );\n }\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3 px-3 py-3\">\n {!ctx.workspace || ctx.link !== \"connected\" ? (\n <ChangesUnavailable ctx={ctx} />\n ) : (\n <>\n <RefreshRow diff={diff} />\n {diff.error !== null && !diff.result ? (\n <ErrorState title=\"Could not load changes\" error={diff.error} onRetry={diff.refresh} />\n ) : !diff.result ? (\n <LoadingState label=\"Loading changes…\" />\n ) : files.length === 0 ? (\n <EmptyState\n icon={<FileDiff className=\"size-8\" />}\n title=\"No changes yet\"\n description={`Nothing differs from ${diff.result.base} in this workspace.`}\n />\n ) : (\n <ChangedFileList\n files={files}\n selected={null}\n onSelect={setOpen}\n commentCounts={counts}\n large\n />\n )}\n </>\n )}\n {(review.comments.length > 0 || ctx.task?.state === \"review\") && (\n <ReviewPanel ctx={ctx} review={review} />\n )}\n </div>\n );\n}\n\nfunction FullScreenDiff({\n ctx,\n diff,\n file,\n index,\n total,\n comments,\n onBack,\n onPrev,\n onNext,\n commentDraft,\n setCommentDraft,\n onSaveComment,\n}: {\n ctx: SessionContext;\n diff: WorkspaceDiff;\n file: ChangedFile;\n index: number;\n total: number;\n comments: ReviewComment[];\n onBack: () => void;\n onPrev: () => void;\n onNext: () => void;\n commentDraft: CommentDraft | null;\n setCommentDraft: (d: CommentDraft | null) => void;\n onSaveComment: (text: string) => void;\n}) {\n useHideBottomNav(true);\n const backRef = useRef<HTMLButtonElement>(null);\n // biome-ignore lint/correctness/useExhaustiveDependencies: focus the header when the file changes\n useEffect(() => backRef.current?.focus(), [file.path]);\n const mine = comments.filter((c) => c.file === file.path).length;\n return (\n <section\n aria-label={`Diff of ${file.path}`}\n className=\"fixed inset-0 z-40 flex min-w-0 flex-col bg-bg safe-pt safe-px\"\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && !commentDraft) {\n e.preventDefault();\n onBack();\n }\n }}\n >\n <header className=\"flex min-w-0 shrink-0 items-center gap-1 border-b border-border bg-surface px-2 py-1.5\">\n <IconButton\n ref={backRef}\n label=\"Back to changed files\"\n icon={<ArrowLeft className=\"size-4\" />}\n onClick={onBack}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-xs\" title={file.path}>\n {file.path}\n </div>\n <div className=\"text-xs text-muted\">\n File {index + 1} of {total} · +{file.added} -{file.deleted}\n {mine > 0 && ` · ${mine} comment${mine === 1 ? \"\" : \"s\"}`}\n </div>\n </div>\n <IconButton\n label=\"Previous file\"\n icon={<ChevronLeft className=\"size-4\" />}\n disabled={index === 0}\n onClick={onPrev}\n />\n <IconButton\n label=\"Next file\"\n icon={<ChevronRight className=\"size-4\" />}\n disabled={index >= total - 1}\n onClick={onNext}\n />\n </header>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain px-2 pt-2 safe-pb-2\">\n <p className=\"mb-2 text-xs text-muted\">Tap a line to add a review comment.</p>\n <FileDiffView\n ctx={ctx}\n diff={diff}\n path={file.path}\n comments={comments}\n onComment={setCommentDraft}\n />\n </div>\n <CommentForm\n draft={commentDraft}\n mobile\n onClose={() => setCommentDraft(null)}\n onSave={onSaveComment}\n />\n </section>\n );\n}\n","import {\n FRAME_MAX_HEIGHT,\n parseFrameMessage,\n renderMessage,\n type UINode,\n} from \"@switchyard/protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CustomFrameProps {\n hostId: string;\n adapterId: string;\n /** Portable node sent to the renderer (its fallback content). */\n node: UINode | null;\n /** Adapter-defined state passed through to the renderer. */\n state?: unknown;\n /** The renderer asked to run an adapter action. */\n onAction?: (actionId: string, payload?: unknown) => void;\n title: string;\n className?: string;\n minHeight?: number;\n maxHeight?: number;\n}\n\n/**\n * Adapter web renderer in a sandboxed iframe (`allow-scripts` only, no\n * same-origin: it cannot read cookies, storage or the parent DOM). The bridge\n * is postMessage: parent sends `{type: \"render\", node, state}`; the frame\n * sends `{type: \"action\", actionId, payload}` or `{type: \"resize\", height}`.\n */\nexport function CustomFrame({\n hostId,\n adapterId,\n node,\n state,\n onAction,\n title,\n className,\n minHeight = 80,\n maxHeight = FRAME_MAX_HEIGHT,\n}: CustomFrameProps) {\n const ref = useRef<HTMLIFrameElement>(null);\n const [height, setHeight] = useState(minHeight);\n const [loaded, setLoaded] = useState(false);\n const actionRef = useRef(onAction);\n actionRef.current = onAction;\n\n useEffect(() => {\n const onMessage = (e: MessageEvent) => {\n // Sandboxed frames have an opaque origin; trust only our frame's window.\n if (e.source !== ref.current?.contentWindow) return;\n const msg = parseFrameMessage(e.data);\n if (!msg) return;\n if (msg.type === \"resize\") {\n setHeight(Math.min(maxHeight, Math.max(minHeight, Math.ceil(msg.height))));\n } else {\n actionRef.current?.(msg.actionId, msg.payload);\n }\n };\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [minHeight, maxHeight]);\n\n useEffect(() => {\n if (!loaded) return;\n // Target \"*\" is required for an opaque-origin frame; the payload holds no secrets.\n ref.current?.contentWindow?.postMessage(renderMessage(node, state), \"*\");\n }, [loaded, node, state]);\n\n const src = `/adapter-frames/${encodeURIComponent(hostId)}/${encodeURIComponent(adapterId)}`;\n return (\n <iframe\n ref={ref}\n title={title}\n src={src}\n sandbox=\"allow-scripts\"\n referrerPolicy=\"no-referrer\"\n loading=\"lazy\"\n onLoad={() => setLoaded(true)}\n style={{ height }}\n className={cn(\"block w-full rounded-md border border-border bg-surface\", className)}\n />\n );\n}\n","import {\n Archive,\n ArchiveRestore,\n Bot,\n EllipsisVertical,\n GitBranch,\n Hand,\n Info,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Server,\n Square,\n SquareKanban,\n} from \"lucide-react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { Button, buttonClasses } from \"../../components/ui/Button\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Menu, type MenuItem } from \"../../components/ui/Menu\";\nimport { StatusChip } from \"../../components/ui/StatusChip\";\nimport { type SessionContext, useElementWidth } from \"./hooks\";\nimport { AUTOMATION_LABEL, workspaceLabel } from \"./model\";\nimport type { SessionActions } from \"./SessionActions\";\n\n/** Automation-control state as icon + text. */\nexport function ControlChip({ ctx, className }: { ctx: SessionContext; className?: string }) {\n if (ctx.control === \"none\") return null;\n const automation = ctx.control === \"automation\";\n return (\n <StatusChip\n kind=\"custom\"\n size=\"sm\"\n className={className}\n status={{\n label: AUTOMATION_LABEL[ctx.control],\n icon: automation ? Bot : Hand,\n tone: automation ? \"info\" : \"neutral\",\n }}\n />\n );\n}\n\nexport function HostChip({ ctx }: { ctx: SessionContext }) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1 text-xs text-muted\">\n <Server aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{ctx.hostName}</span>\n {ctx.link !== \"connected\" && (\n <StatusChip kind=\"host\" value={ctx.link} size=\"sm\" className=\"ml-1\" />\n )}\n </span>\n );\n}\n\nexport function sessionMenuItems(ctx: SessionContext, a: SessionActions): MenuItem[] {\n return [\n {\n id: \"rename\",\n label: \"Rename\",\n icon: <Pencil className=\"size-4\" />,\n onSelect: a.openRename,\n disabled: ctx.session.readOnly,\n },\n ctx.session.archivedAt\n ? {\n id: \"unarchive\",\n label: \"Unarchive\",\n icon: <ArchiveRestore className=\"size-4\" />,\n onSelect: a.unarchive,\n }\n : {\n id: \"archive\",\n label: \"Archive\",\n icon: <Archive className=\"size-4\" />,\n onSelect: a.requestArchive,\n disabled: !!a.archiveBlocked,\n hint: a.archiveBlocked ?? undefined,\n },\n {\n id: \"info\",\n label: \"Session info\",\n icon: <Info className=\"size-4\" />,\n onSelect: a.openInfo,\n },\n ];\n}\n\n/** Desktop/compact conversation header: identity, status, control state and actions. */\nexport function ConversationHeader({\n ctx,\n actions,\n inspector,\n}: {\n ctx: SessionContext;\n actions: SessionActions;\n inspector: { open: boolean; toggle: () => void; label: string };\n}) {\n const { session, project, workspace, task } = ctx;\n const navigate = useNavigate();\n const [ref, width] = useElementWidth<HTMLElement>();\n const narrow = width > 0 && width < 640;\n const menuItems: MenuItem[] = [\n ...(narrow && task\n ? [\n {\n id: \"task\",\n label: \"Open linked task\",\n icon: <SquareKanban className=\"size-4\" />,\n onSelect: () => navigate(`/tasks/${encodeURIComponent(task.id)}`),\n },\n ]\n : []),\n ...sessionMenuItems(ctx, actions),\n ];\n return (\n <header\n ref={ref}\n className=\"flex min-w-0 shrink-0 flex-col gap-1.5 border-b border-border bg-surface px-4 py-2.5\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <h1 className=\"min-w-0 flex-1 truncate text-base font-semibold\" title={session.title}>\n {session.title}\n </h1>\n {task && !narrow && (\n <Link\n to={`/tasks/${encodeURIComponent(task.id)}`}\n className={buttonClasses(\"ghost\", \"sm\")}\n title={`Open linked task: ${task.title}`}\n >\n <SquareKanban aria-hidden className=\"size-4\" />\n <span className=\"hidden xl:inline\">Open linked task</span>\n <span className=\"xl:hidden\">Task</span>\n </Link>\n )}\n {actions.canStop && (\n <Button\n size=\"sm\"\n variant={session.runtime === \"waiting_input\" ? \"secondary\" : \"danger\"}\n icon={<Square className=\"size-3.5\" />}\n busy={actions.busy.stop}\n onClick={actions.requestStop}\n >\n Stop\n </Button>\n )}\n <Menu\n label=\"Session menu\"\n items={menuItems}\n trigger={(p) => (\n <IconButton\n {...p}\n label=\"Session menu\"\n icon={<EllipsisVertical className=\"size-4\" />}\n />\n )}\n />\n <IconButton\n label={inspector.label}\n aria-expanded={inspector.open}\n icon={\n inspector.open ? (\n <PanelRightClose className=\"size-4\" />\n ) : (\n <PanelRightOpen className=\"size-4\" />\n )\n }\n onClick={inspector.toggle}\n />\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1\">\n <StatusChip kind=\"runtime\" value={session.runtime} size=\"sm\" />\n <ControlChip ctx={ctx} />\n <span className=\"min-w-0 truncate text-xs text-muted\">{project?.name ?? \"No project\"}</span>\n <span className=\"inline-flex min-w-0 items-center gap-1 text-xs text-muted\">\n <GitBranch aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"sr-only\">Branch </span>\n <span className=\"truncate font-mono\">{workspaceLabel(workspace, session.cwd)}</span>\n </span>\n <HostChip ctx={ctx} />\n </div>\n </header>\n );\n}\n","import type { AdapterInfo, Panel, Run, Task } from \"@switchyard/protocol\";\nimport { Bot, CircleCheck, Hand, Square, SquareKanban } from \"lucide-react\";\nimport { type ReactNode, useMemo } from \"react\";\nimport { Link } from \"react-router\";\nimport { CustomFrame } from \"../../components/intent/CustomFrame\";\nimport { Markdown } from \"../../components/intent/Markdown\";\nimport { UINodeRenderer } from \"../../components/intent/UINodeRenderer\";\nimport { Button, buttonClasses } from \"../../components/ui/Button\";\nimport { StatusChip } from \"../../components/ui/StatusChip\";\nimport { UnsupportedCapability } from \"../../components/ui/states\";\nimport { TextLink } from \"../../components/ui/TextLink\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { formatRelative, formatTime } from \"../../lib/time\";\nimport { errorMessage } from \"../../sync/api\";\nimport { usePanels, useRunsForTask, useSyncStore, useTranscript } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\nimport { ControlChip } from \"./ConversationHeader\";\nimport { useCodeContext } from \"./context\";\nimport type { SessionContext } from \"./hooks\";\nimport { contextMeter, modelLabel, workspaceLabel } from \"./model\";\nimport type { SessionActions } from \"./SessionActions\";\n\nfunction Section({\n title,\n children,\n className,\n}: {\n title: string;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <section aria-label={title} className={cn(\"flex min-w-0 flex-col gap-2\", className)}>\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {children}\n </section>\n );\n}\n\n/** Take over, Return to automation and Stop: only the controls that apply, each explained. */\nexport function ControlButtons({ ctx, actions }: { ctx: SessionContext; actions: SessionActions }) {\n const { canTakeover, canReturn, canStop } = actions;\n if (!canTakeover && !canReturn && !canStop) {\n return <p className=\"text-sm text-muted\">Manual session: no automation run controls it.</p>;\n }\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <ControlChip ctx={ctx} />\n <div className=\"flex flex-wrap gap-2\">\n {canTakeover && (\n <Button\n icon={<Hand className=\"size-4\" />}\n busy={actions.busy.takeover}\n onClick={actions.takeover}\n >\n Take over\n </Button>\n )}\n {canReturn && (\n <Button\n icon={<Bot className=\"size-4\" />}\n busy={actions.busy.ret}\n onClick={actions.returnToAutomation}\n >\n Return to automation\n </Button>\n )}\n {canStop && (\n <Button\n variant={ctx.session.runtime === \"waiting_input\" ? \"secondary\" : \"danger\"}\n icon={<Square className=\"size-4\" />}\n busy={actions.busy.stop}\n onClick={actions.requestStop}\n >\n Stop\n </Button>\n )}\n </div>\n {(canTakeover || canReturn) && (\n <p className=\"text-xs text-muted\">\n {ctx.control === \"automation\"\n ? \"Taking over pauses automatic continuations; Pi keeps running.\"\n : \"You have control; returning lets automation continue.\"}\n </p>\n )}\n </div>\n );\n}\n\nfunction RunRow({ run }: { run: Run }) {\n return (\n <li className=\"flex min-w-0 flex-col gap-0.5 rounded-md border border-border px-2 py-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">Attempt {run.attempt}</span>\n <StatusChip kind=\"run\" value={run.state} size=\"sm\" />\n <span className=\"text-xs text-muted\">\n {run.startedAt ? formatTime(run.startedAt) : formatTime(run.createdAt)}\n </span>\n </div>\n {run.outcome && <p className=\"text-xs break-words text-muted\">{run.outcome.summary}</p>}\n <p className=\"text-xs text-muted\">\n {run.usage.accounting === \"available\"\n ? [\n run.usage.tokens !== null ? `${run.usage.tokens.toLocaleString()} tokens` : null,\n run.usage.costUsd !== null ? `$${run.usage.costUsd.toFixed(2)}` : null,\n ]\n .filter(Boolean)\n .join(\" · \") || \"No usage reported\"\n : (run.usage.note ?? \"Token/cost accounting not reported\")}\n {run.continuationsUsed > 0 && ` · ${run.continuationsUsed} continuations`}\n </p>\n </li>\n );\n}\n\nfunction Limits({ task, run }: { task: Task; run: Run | null }) {\n const c = run?.limits ?? task.policy.continuation;\n return (\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-muted\">Continuation</dt>\n <dd>{c.enabled ? \"Enabled\" : \"Off: stops after one turn\"}</dd>\n {c.enabled && (\n <>\n <dt className=\"text-muted\">Continuations</dt>\n <dd>\n {run ? `${run.continuationsUsed} of ` : \"up to \"}\n {c.maxContinuations}\n </dd>\n <dt className=\"text-muted\">Time limit</dt>\n <dd>{c.maxElapsedMinutes} min</dd>\n <dt className=\"text-muted\">Token limit</dt>\n <dd>{c.maxTokens?.toLocaleString() ?? \"None\"}</dd>\n <dt className=\"text-muted\">Cost limit</dt>\n <dd>{c.maxCostUsd !== null ? `$${c.maxCostUsd}` : \"None\"}</dd>\n </>\n )}\n <dt className=\"text-muted\">Checks</dt>\n <dd className=\"min-w-0 break-words\">\n {task.policy.completion.checks === null\n ? \"Project checks\"\n : task.policy.completion.checks.length\n ? task.policy.completion.checks.join(\", \")\n : \"None\"}\n </dd>\n <dt className=\"text-muted\">Human review</dt>\n <dd>{task.policy.completion.requireHumanReview ? \"Required\" : \"Not required\"}</dd>\n </dl>\n );\n}\n\n/** Linked task: objective, criteria, dependencies, limits, run history and takeover controls. */\nexport function TaskSection({\n ctx,\n actions,\n showControls = true,\n}: {\n ctx: SessionContext;\n actions: SessionActions;\n /** Mobile Details shows the control buttons in their own section. */\n showControls?: boolean;\n}) {\n const { task, run } = ctx;\n const runs = useRunsForTask(task?.id);\n const tasks = useSyncStore((s) => s.tasks);\n if (!task) {\n return <p className=\"text-sm text-muted\">No linked task: this session was started directly.</p>;\n }\n return (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <h3 className=\"min-w-0 flex-1 text-sm font-semibold break-words\">{task.title}</h3>\n <StatusChip kind=\"task\" value={task.state} size=\"sm\" />\n </div>\n {task.blocked && <p className=\"text-sm text-warning\">Blocked: {task.blocked.reason}</p>}\n <Link\n to={`/tasks/${encodeURIComponent(task.id)}`}\n className={buttonClasses(\"secondary\", \"sm\", \"self-start\")}\n >\n <SquareKanban aria-hidden className=\"size-4\" />\n Open task\n </Link>\n </div>\n <Section title=\"Objective\">\n {task.objective ? (\n <Markdown text={task.objective} />\n ) : (\n <p className=\"text-sm text-muted\">No objective written.</p>\n )}\n </Section>\n <Section title=\"Acceptance criteria\">\n {task.acceptanceCriteria.length === 0 ? (\n <p className=\"text-sm text-muted\">None.</p>\n ) : (\n <ul className=\"flex flex-col gap-1\">\n {task.acceptanceCriteria.map((c) => (\n <li key={c} className=\"flex items-start gap-2 text-sm\">\n <CircleCheck aria-hidden className=\"mt-0.5 size-4 shrink-0 text-muted\" />\n <span className=\"min-w-0 break-words\">{c}</span>\n </li>\n ))}\n </ul>\n )}\n </Section>\n <Section title=\"Dependencies\">\n {task.dependencies.length === 0 ? (\n <p className=\"text-sm text-muted\">None.</p>\n ) : (\n <ul className=\"flex flex-col gap-1\">\n {task.dependencies.map((id) => {\n const dep = tasks[id];\n return (\n <li key={id} className=\"flex min-w-0 items-center gap-2 text-sm\">\n {dep ? <StatusChip kind=\"task\" value={dep.state} size=\"sm\" /> : null}\n <TextLink to={`/tasks/${encodeURIComponent(id)}`} size=\"sm\" className=\"truncate\">\n {dep?.title ?? id}\n </TextLink>\n </li>\n );\n })}\n </ul>\n )}\n </Section>\n <Section title=\"Limits\">\n <Limits task={task} run={run} />\n </Section>\n {showControls && (\n <Section title=\"Control\">\n <ControlButtons ctx={ctx} actions={actions} />\n </Section>\n )}\n <Section title=\"Run history\">\n {runs.length === 0 ? (\n <p className=\"text-sm text-muted\">No runs yet.</p>\n ) : (\n <ul className=\"flex flex-col gap-1.5\">\n {runs.map((r) => (\n <RunRow key={r.id} run={r} />\n ))}\n </ul>\n )}\n </Section>\n </div>\n );\n}\n\nconst ADAPTER_STATUS = {\n active: { label: \"Active\", tone: \"success\" },\n disabled: { label: \"Disabled\", tone: \"neutral\" },\n error: { label: \"Error\", tone: \"danger\" },\n} as const;\n\nfunction AdapterRow({ a }: { a: AdapterInfo }) {\n const s = ADAPTER_STATUS[a.status];\n return (\n <li className=\"flex min-w-0 flex-col gap-0.5 rounded-md border border-border px-2 py-1.5\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"min-w-0 truncate font-mono text-sm\">{a.id}</span>\n <span className=\"text-xs text-muted\">v{a.version}</span>\n <span className=\"rounded-full border border-border px-1.5 text-xs text-muted\">\n Tier: {a.tier}\n </span>\n <StatusChip\n kind=\"custom\"\n size=\"sm\"\n status={{\n label: s.label,\n tone: s.tone,\n icon: a.status === \"active\" ? CircleCheck : Square,\n }}\n />\n </div>\n <p className=\"text-xs break-words text-muted\">\n For {a.target.extension} {a.target.versionRange}\n {a.target.testedVersions.length > 0 && ` (tested ${a.target.testedVersions.join(\", \")})`}\n </p>\n {a.capabilities.length > 0 && (\n <p className=\"text-xs text-muted\">Provides: {a.capabilities.join(\", \")}</p>\n )}\n {a.detail && <p className=\"text-xs break-words text-warning\">{a.detail}</p>}\n </li>\n );\n}\n\nfunction PanelView({ ctx, panel }: { ctx: SessionContext; panel: Panel }) {\n const { mobile, openFile } = useCodeContext();\n const onAction = (actionId: string, payload?: unknown) => {\n codeApi\n .adapterAction(ctx.session.id, panel.adapterId, actionId, payload)\n .then(() => toast.success(\"Action sent\"))\n .catch((e) => toast.error(errorMessage(e)));\n };\n let body: ReactNode;\n if (panel.webRenderer && !mobile && ctx.host) {\n body = (\n <CustomFrame\n hostId={ctx.session.hostId}\n adapterId={panel.adapterId}\n node={panel.node}\n title={panel.title}\n onAction={onAction}\n />\n );\n } else if (panel.node) {\n body = (\n <>\n {panel.webRenderer && mobile && (\n <p className=\"text-xs text-muted\">\n Showing the portable version; this panel's custom renderer is desktop-only.\n </p>\n )}\n <UINodeRenderer node={panel.node} onAction={(id) => onAction(id)} onOpenFile={openFile} />\n </>\n );\n } else {\n body = (\n <UnsupportedCapability\n capability=\"This panel\"\n reason=\"It only has a custom web renderer, which is desktop-only and is not shown on mobile.\"\n fallback={\n <p className=\"text-sm\">\n {panel.mobileFallback ?? \"The adapter provides no mobile fallback text.\"}\n </p>\n }\n />\n );\n }\n return (\n <article className=\"flex min-w-0 flex-col gap-2 rounded-md border border-border p-2\">\n <header className=\"flex min-w-0 items-baseline gap-2\">\n <h4 className=\"min-w-0 flex-1 truncate text-sm font-medium\">{panel.title}</h4>\n <span className=\"shrink-0 font-mono text-xs text-subtle\">{panel.adapterId}</span>\n </header>\n {body}\n </article>\n );\n}\n\n/** Extension panels, adapter compatibility and diagnostics. */\nexport function ExtensionsSection({ ctx }: { ctx: SessionContext }) {\n const panels = usePanels(ctx.session.id);\n const diagnostics = useSyncStore((s) => s.diagnostics);\n const adapterIds = useMemo(() => new Set(ctx.adapters.map((a) => a.id)), [ctx.adapters]);\n const mine = useMemo(\n () =>\n diagnostics\n .filter(\n (d) =>\n d.sessionId === ctx.session.id ||\n (d.sessionId === null && d.adapterId !== null && adapterIds.has(d.adapterId)),\n )\n .slice(-20)\n .reverse(),\n [diagnostics, ctx.session.id, adapterIds],\n );\n const caps = ctx.host?.capabilities;\n return (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Section title=\"Panels\">\n {panels.length === 0 ? (\n <p className=\"text-sm text-muted\">No extension panels for this session.</p>\n ) : (\n panels.map((p) => <PanelView key={`${p.adapterId}:${p.slot}`} ctx={ctx} panel={p} />)\n )}\n </Section>\n <Section title={`Adapters on ${ctx.hostName}`}>\n {ctx.adapters.length === 0 ? (\n <p className=\"text-sm text-muted\">No adapters reported by this host.</p>\n ) : (\n <ul className=\"flex flex-col gap-1.5\">\n {ctx.adapters.map((a) => (\n <AdapterRow key={a.id} a={a} />\n ))}\n </ul>\n )}\n </Section>\n {(caps?.unsupported.length || ctx.host?.piCompatible === false) && (\n <Section title=\"Runtime limitations\">\n {ctx.host?.piCompatible === false && (\n <UnsupportedCapability\n capability=\"This Pi version\"\n reason={`Pi ${ctx.host.piVersion ?? \"(not found)\"} on ${ctx.hostName} is outside the tested range.`}\n />\n )}\n {caps?.unsupported.map((u) => (\n <UnsupportedCapability key={u.capability} capability={u.capability} reason={u.reason} />\n ))}\n </Section>\n )}\n <Section title=\"Diagnostics\">\n {mine.length === 0 ? (\n <p className=\"text-sm text-muted\">No diagnostics.</p>\n ) : (\n <ul className=\"flex flex-col gap-1\">\n {mine.map((d, i) => (\n <li\n // biome-ignore lint/suspicious/noArrayIndexKey: diagnostics have no id\n key={`${d.at}-${i}`}\n className=\"min-w-0 rounded-md bg-surface-2 px-2 py-1 text-xs\"\n >\n <span\n className={cn(\n \"font-medium\",\n d.level === \"error\" && \"text-danger\",\n d.level === \"warning\" && \"text-warning\",\n )}\n >\n {d.level === \"error\" ? \"Error\" : d.level === \"warning\" ? \"Warning\" : \"Info\"}\n </span>{\" \"}\n {d.adapterId && <span className=\"font-mono\">{d.adapterId}: </span>}\n <span className=\"break-words\">{d.message}</span>{\" \"}\n <span className=\"text-subtle\">{formatRelative(d.at)}</span>\n </li>\n ))}\n </ul>\n )}\n <TextLink to=\"/settings/diagnostics\" size=\"sm\">\n All diagnostics\n </TextLink>\n </Section>\n </div>\n );\n}\n\n/** Project, host, branch, model and context facts for a session. */\nexport function SessionFacts({ ctx }: { ctx: SessionContext }) {\n const { session, workspace, host } = ctx;\n const meter = contextMeter(session);\n return (\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-muted\">Project</dt>\n <dd className=\"min-w-0 break-words\">{ctx.project?.name ?? \"None\"}</dd>\n <dt className=\"text-muted\">Host</dt>\n <dd className=\"min-w-0 break-words\">\n {ctx.hostName}\n {ctx.link !== \"connected\" && ` (${ctx.link})`}\n {host?.piVersion && ` · Pi ${host.piVersion}`}\n </dd>\n <dt className=\"text-muted\">Control</dt>\n <dd>{ctx.control === \"none\" ? \"Manual session\" : <ControlChip ctx={ctx} />}</dd>\n <dt className=\"text-muted\">Branch</dt>\n <dd className=\"min-w-0 font-mono text-xs break-all\">\n {workspaceLabel(workspace, session.cwd)}\n {workspace?.baseBranch && ` (from ${workspace.baseBranch})`}\n </dd>\n <dt className=\"text-muted\">Path</dt>\n <dd className=\"min-w-0 font-mono text-xs break-all\">{workspace?.path ?? session.cwd}</dd>\n {workspace && (\n <>\n <dt className=\"text-muted\">Git</dt>\n <dd>\n {workspace.git.dirty ? `${workspace.git.changedFiles} changed files` : \"Clean\"}\n {workspace.git.ahead > 0 && ` · ${workspace.git.ahead} ahead`}\n {workspace.git.behind > 0 && ` · ${workspace.git.behind} behind`}\n </dd>\n </>\n )}\n <dt className=\"text-muted\">Profile</dt>\n <dd className=\"min-w-0 break-words\">{session.profileSnapshot.name}</dd>\n {session.model && (\n <>\n <dt className=\"text-muted\">Model</dt>\n <dd className=\"min-w-0 break-words\">\n {`${modelLabel(session.model)} (${session.model.provider}/${session.model.id})`}\n {session.thinking && ` · effort ${session.thinking}`}\n </dd>\n </>\n )}\n {meter && (\n <>\n <dt className=\"text-muted\">Context</dt>\n <dd className=\"min-w-0 break-words\">{`${meter.label} · ${meter.detail}`}</dd>\n </>\n )}\n </dl>\n );\n}\n\n/** Mobile Details: facts, control, task, subagents, extensions. */\nexport function MobileDetails({ ctx, actions }: { ctx: SessionContext; actions: SessionActions }) {\n const transcript = useTranscript(ctx.session.id);\n const subagents = transcript.items.filter((i) => i.kind === \"subagent\");\n return (\n <div className=\"flex min-w-0 flex-col gap-5 px-3 py-3\">\n <Section title=\"Session\">\n <SessionFacts ctx={ctx} />\n </Section>\n <Section title=\"Automation and control\">\n <ControlButtons ctx={ctx} actions={actions} />\n </Section>\n <Section title=\"Task\">\n <TaskSection ctx={ctx} actions={actions} showControls={false} />\n </Section>\n <Section title=\"Subagents\">\n {subagents.length === 0 ? (\n <p className=\"text-sm text-muted\">No subagents in the loaded transcript.</p>\n ) : (\n <ul className=\"flex flex-col gap-1\">\n {subagents.map((s) =>\n s.kind === \"subagent\" ? (\n <li key={s.id} className=\"flex min-w-0 flex-wrap items-center gap-2 text-sm\">\n <span className=\"min-w-0 truncate\">{s.data.label}</span>\n <span className=\"text-xs text-muted\">{s.data.status}</span>\n {s.data.linkedSessionId && (\n <TextLink to={`/code/${encodeURIComponent(s.data.linkedSessionId)}`}>\n Open (view only)\n </TextLink>\n )}\n </li>\n ) : null,\n )}\n </ul>\n )}\n </Section>\n <Section title=\"Extensions\">\n <ExtensionsSection ctx={ctx} />\n </Section>\n </div>\n );\n}\n","import { cn } from \"../../lib/cn\";\nimport { useHighlight } from \"../../lib/highlight\";\n\n/** Flat, full-width source with syntax highlighting (when the language is known). */\nexport function CodeView({\n text,\n lang,\n wrap,\n className,\n}: {\n text: string;\n lang: string | null;\n wrap: boolean;\n className?: string;\n}) {\n const tokens = useHighlight(text, lang);\n const plain = text.split(\"\\n\");\n if (plain.length > 1 && plain[plain.length - 1] === \"\") plain.pop();\n return (\n <section\n aria-label=\"File contents\"\n className={cn(\n \"sy-code min-w-0 overflow-auto overscroll-contain bg-surface-2 py-2 font-mono text-xs leading-5\",\n className,\n )}\n >\n <pre\n className={cn(\n \"px-3\",\n wrap ? \"break-all whitespace-pre-wrap\" : \"w-max min-w-full whitespace-pre\",\n )}\n >\n <code>\n {plain.map((line, i) => {\n const toks = tokens?.[i];\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: lines have no identity\n <span key={i}>\n {toks\n ? toks.map((t, j) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tokens are positional\n <span key={j} style={t.style as React.CSSProperties}>\n {t.content}\n </span>\n ))\n : line}\n {i < plain.length - 1 ? \"\\n\" : \"\"}\n </span>\n );\n })}\n </code>\n </pre>\n </section>\n );\n}\n","import type { FileEntry } from \"@switchyard/protocol\";\nimport {\n ArrowLeft,\n ChevronRight,\n Copy,\n File,\n FileCode,\n FileImage,\n FileJson,\n FileText,\n Folder,\n FolderOpen,\n Link2,\n WrapText,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CodeView } from \"../../components/intent/CodeView\";\nimport { Markdown } from \"../../components/intent/Markdown\";\nimport { copyText } from \"../../components/ui/Copy\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport {\n EmptyState,\n ErrorState,\n HostUnavailable,\n LoadingState,\n UnsupportedCapability,\n} from \"../../components/ui/states\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { cn } from \"../../lib/cn\";\nimport { langFor } from \"../../lib/highlight\";\nimport { isApiError } from \"../../sync/api\";\nimport { codeApi, type FileContent } from \"./api\";\nimport { STATUS_LABEL, type WorkspaceDiff } from \"./Changes\";\nimport type { SessionContext } from \"./hooks\";\n\ntype Listing = FileEntry[] | \"loading\" | { error: unknown };\ntype ChangeStatus = keyof typeof STATUS_LABEL;\n\nconst IMAGE_MIME: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n};\n\nconst BADGE: Record<ChangeStatus, { letter: string; tone: string }> = {\n added: { letter: \"A\", tone: \"text-success\" },\n untracked: { letter: \"U\", tone: \"text-success\" },\n modified: { letter: \"M\", tone: \"text-warning\" },\n renamed: { letter: \"R\", tone: \"text-warning\" },\n deleted: { letter: \"D\", tone: \"text-danger\" },\n binary: { letter: \"B\", tone: \"text-muted\" },\n};\n\nfunction parentDir(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n parts.pop();\n return parts.join(\"/\");\n}\n\nfunction ancestors(path: string): string[] {\n const parts = path.split(\"/\").filter(Boolean);\n parts.pop();\n return parts.map((_, i) => parts.slice(0, i + 1).join(\"/\"));\n}\n\nfunction extOf(path: string): string {\n const m = /\\.([A-Za-z0-9]+)$/.exec(path);\n return (m?.[1] ?? \"\").toLowerCase();\n}\n\nfunction formatSize(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${Math.round(n / 1024)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction iconFor(name: string) {\n const ext = extOf(name);\n if (ext === \"json\" || ext === \"jsonc\") return FileJson;\n if ([\"md\", \"mdx\", \"markdown\", \"txt\"].includes(ext)) return FileText;\n if (ext in IMAGE_MIME) return FileImage;\n if (langFor(name)) return FileCode;\n return File;\n}\n\nfunction relPath(e: FileEntry, ws: { path: string }, dir: string): string {\n if (e.path) return e.path.startsWith(`${ws.path}/`) ? e.path.slice(ws.path.length + 1) : e.path;\n return dir ? `${dir}/${e.name}` : e.name;\n}\n\nfunction StatusBadge({ status }: { status: ChangeStatus | undefined }) {\n if (!status) return null;\n const b = BADGE[status];\n return (\n <span\n title={STATUS_LABEL[status]}\n className={cn(\"shrink-0 font-mono text-[11px] font-semibold\", b.tone)}\n >\n {b.letter}\n </span>\n );\n}\n\n/**\n * Workspace browser: a tree with change markers and a filter, and a preview with highlighted\n * source, rendered markdown and images. `openPath` (a file reference in the transcript) opens\n * that file directly.\n */\nexport function FilesTab({\n ctx,\n diff,\n openPath,\n}: {\n ctx: SessionContext;\n diff: WorkspaceDiff;\n openPath?: { path: string; nonce: number } | null;\n}) {\n const ws = ctx.workspace;\n const connected = ctx.link === \"connected\";\n const [listings, setListings] = useState<Map<string, Listing>>(new Map());\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [file, setFile] = useState<string | null>(null);\n const [filter, setFilter] = useState(\"\");\n const [focused, setFocused] = useState<string | null>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const changed = useMemo(\n () => new Map<string, ChangeStatus>(diff.result?.files.map((f) => [f.path, f.status]) ?? []),\n [diff.result],\n );\n const changedDirs = useMemo(() => {\n const s = new Set<string>();\n for (const p of changed.keys()) for (const a of ancestors(p)) s.add(a);\n return s;\n }, [changed]);\n\n const wsId = ws?.id;\n const load = useCallback(\n (dir: string, force = false) => {\n if (!wsId) return;\n setListings((prev) => {\n const cur = prev.get(dir);\n if (cur && !force && (cur === \"loading\" || Array.isArray(cur))) return prev;\n return new Map(prev).set(dir, \"loading\");\n });\n codeApi.files(wsId, dir).then(\n (entries) => setListings((prev) => new Map(prev).set(dir, entries)),\n (error) => setListings((prev) => new Map(prev).set(dir, { error })),\n );\n },\n [wsId],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: reload on workspace or reconnect\n useEffect(() => {\n if (!wsId || !connected) return;\n setListings(new Map());\n load(\"\", true);\n for (const d of expanded) load(d, true);\n }, [wsId, connected]);\n\n useEffect(() => {\n if (!openPath || !ws) return;\n const rel = openPath.path.startsWith(`${ws.path}/`)\n ? openPath.path.slice(ws.path.length + 1)\n : openPath.path.replace(/^\\.\\//, \"\");\n setFile(rel);\n const dirs = ancestors(rel);\n setExpanded((prev) => new Set([...prev, ...dirs]));\n for (const d of dirs) load(d);\n }, [openPath, ws, load]);\n\n const toggle = (dir: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(dir)) next.delete(dir);\n else {\n next.add(dir);\n load(dir);\n }\n return next;\n });\n };\n\n if (!ws) {\n return (\n <UnsupportedCapability\n capability=\"File browsing\"\n reason={`This session is not linked to a Switchyard workspace (it runs in ${ctx.session.cwd}).`}\n />\n );\n }\n if (!connected) {\n return (\n <HostUnavailable\n compact\n hostName={ctx.hostName}\n connectivity={ctx.link === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n lastSeenAt={ctx.host?.lastSeenAt}\n detail=\"Files are read from the host; browsing resumes when it reconnects.\"\n />\n );\n }\n\n if (file !== null) {\n return (\n <FilePreview ctx={ctx} file={file} status={changed.get(file)} onBack={() => setFile(null)} />\n );\n }\n\n // Visible rows of the tree.\n type Row = { entry: FileEntry; rel: string; depth: number };\n const rows: Row[] = [];\n const extra: { dir: string; depth: number; state: \"loading\" | { error: unknown } }[] = [];\n const walk = (dir: string, depth: number) => {\n const l = listings.get(dir);\n if (l === undefined || l === \"loading\") {\n if (dir !== \"\" || l === \"loading\") extra.push({ dir, depth, state: \"loading\" });\n return;\n }\n if (!Array.isArray(l)) {\n extra.push({ dir, depth, state: l });\n return;\n }\n for (const entry of l) {\n const rel = relPath(entry, ws, dir);\n rows.push({ entry, rel, depth });\n if (entry.kind === \"dir\" && expanded.has(rel)) walk(rel, depth + 1);\n }\n };\n walk(\"\", 0);\n\n const q = filter.trim().toLowerCase();\n const matches: Row[] = [];\n if (q) {\n for (const [dir, l] of listings) {\n if (!Array.isArray(l)) continue;\n for (const entry of l) {\n const rel = relPath(entry, ws, dir);\n if (entry.kind !== \"dir\" && rel.toLowerCase().includes(q)) {\n matches.push({ entry, rel, depth: 0 });\n }\n }\n }\n matches.sort((a, b) => a.rel.localeCompare(b.rel));\n }\n\n const root = listings.get(\"\");\n const visible = q ? matches.slice(0, 200) : rows;\n const tabbable = focused && visible.some((r) => r.rel === focused) ? focused : visible[0]?.rel;\n\n const move = (from: HTMLElement, delta: number) => {\n const items = [...(listRef.current?.querySelectorAll<HTMLElement>(\"[role=treeitem]\") ?? [])];\n items[items.indexOf(from) + delta]?.focus();\n };\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2 px-2 py-2\">\n <TextInput\n type=\"search\"\n aria-label=\"Filter files\"\n placeholder=\"Filter files\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"w-full\"\n />\n {root && !Array.isArray(root) && root !== \"loading\" ? (\n <ErrorState\n compact\n title=\"Could not list this folder\"\n error={root.error}\n onRetry={() => load(\"\", true)}\n />\n ) : root === undefined || root === \"loading\" ? (\n <LoadingState label=\"Loading folder…\" />\n ) : q && matches.length === 0 ? (\n <EmptyState title=\"No matching files\" className=\"py-6\" />\n ) : !q && rows.length === 0 ? (\n <EmptyState title=\"Empty folder\" className=\"py-6\" />\n ) : (\n <div\n ref={listRef}\n role=\"tree\"\n aria-label=\"Workspace files\"\n className=\"flex min-w-0 flex-col\"\n >\n {visible.map(({ entry: e, rel, depth }) => {\n const isDir = e.kind === \"dir\";\n const open = isDir && expanded.has(rel);\n const Icon = isDir\n ? open\n ? FolderOpen\n : Folder\n : e.kind === \"symlink\"\n ? Link2\n : iconFor(e.name);\n const status = changed.get(rel);\n return (\n <div key={rel} role=\"none\" className=\"min-w-0\">\n <button\n type=\"button\"\n role=\"treeitem\"\n aria-selected={false}\n aria-expanded={isDir ? open : undefined}\n tabIndex={rel === tabbable ? 0 : -1}\n onFocus={() => setFocused(rel)}\n style={{ paddingLeft: 8 + depth * 14 }}\n className=\"flex h-8 w-full min-w-0 items-center gap-1.5 rounded pr-2 text-left text-[13px] hover:bg-surface-2\"\n onClick={() => (isDir ? toggle(rel) : setFile(rel))}\n onKeyDown={(ev) => {\n if (ev.key === \"ArrowDown\") {\n ev.preventDefault();\n move(ev.currentTarget, 1);\n } else if (ev.key === \"ArrowUp\") {\n ev.preventDefault();\n move(ev.currentTarget, -1);\n } else if (ev.key === \"ArrowRight\" && isDir && !open) {\n ev.preventDefault();\n toggle(rel);\n } else if (ev.key === \"ArrowLeft\") {\n ev.preventDefault();\n if (isDir && open) toggle(rel);\n else if (rel.includes(\"/\")) {\n const parent = parentDir(rel);\n listRef.current\n ?.querySelector<HTMLElement>(`[data-path=\"${CSS.escape(parent)}\"]`)\n ?.focus();\n }\n }\n }}\n data-path={rel}\n >\n {q ? null : isDir ? (\n <ChevronRight\n aria-hidden\n className={cn(\n \"size-4 shrink-0 text-muted transition-transform\",\n open && \"rotate-90\",\n )}\n />\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n <Icon aria-hidden className=\"size-4 shrink-0 text-muted\" />\n <span className={cn(\"min-w-0 flex-1 truncate\", q && \"font-mono text-xs\")}>\n {q ? rel : e.name}\n <span className=\"sr-only\"> {isDir ? \"folder\" : \"file\"}</span>\n </span>\n {isDir && changedDirs.has(rel) && (\n <span\n title=\"Contains changes\"\n className=\"size-1.5 shrink-0 rounded-full bg-warning\"\n />\n )}\n {!isDir && <StatusBadge status={status} />}\n {!isDir && e.size !== null && (\n <span className=\"shrink-0 text-xs text-subtle tabular-nums\">\n {formatSize(e.size)}\n </span>\n )}\n </button>\n </div>\n );\n })}\n {!q &&\n extra.map((x) => (\n <div key={`x-${x.dir}`} role=\"none\" style={{ paddingLeft: 8 + x.depth * 14 }}>\n {x.state === \"loading\" ? (\n <span className=\"flex h-8 items-center text-xs text-muted\">Loading…</span>\n ) : (\n <ErrorState\n compact\n title=\"Could not list this folder\"\n error={x.state.error}\n onRetry={() => load(x.dir, true)}\n />\n )}\n </div>\n ))}\n </div>\n )}\n {q && <p className=\"text-xs text-muted\">Searches folders you have opened.</p>}\n </div>\n );\n}\n\nfunction FilePreview({\n ctx,\n file,\n status,\n onBack,\n}: {\n ctx: SessionContext;\n file: string;\n status: ChangeStatus | undefined;\n onBack: () => void;\n}) {\n const ws = ctx.workspace!;\n const [content, setContent] = useState<FileContent | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [nonce, setNonce] = useState(0);\n const [wrap, setWrap] = useState(false);\n const [view, setView] = useState<\"preview\" | \"source\">(\"preview\");\n const [dims, setDims] = useState<string | null>(null);\n\n const name = file.split(\"/\").pop() ?? file;\n const ext = extOf(file);\n const isMarkdown = [\"md\", \"mdx\", \"markdown\"].includes(ext);\n const isSvg = ext === \"svg\";\n const imageMime = IMAGE_MIME[ext];\n const Icon = iconFor(name);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nonce retries\n useEffect(() => {\n const ac = new AbortController();\n setLoading(true);\n setError(null);\n setContent(null);\n codeApi\n .file(ws.id, file, ac.signal)\n .then((c) => setContent(c))\n .catch((e) => {\n if (!ac.signal.aborted) setError(e);\n })\n .finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n return () => ac.abort();\n }, [ws.id, file, nonce]);\n\n const text = content && !content.binary ? content.text : null;\n const lines = text === null ? null : text.replace(/\\n$/, \"\").split(\"\\n\").length;\n const dir = parentDir(file);\n const copy = (value: string) => {\n void copyText(value, \"Copied\");\n };\n const checkerboard =\n \"flex justify-center bg-[conic-gradient(var(--sy-surface-2)_25%,var(--sy-surface)_0_50%,var(--sy-surface-2)_0_75%,var(--sy-surface)_0)] bg-[length:16px_16px] p-4\";\n\n let body: React.ReactNode;\n if (loading) body = <LoadingState label=\"Loading file…\" />;\n else if (error !== null) {\n body = isApiError(error, \"too_large\") ? (\n <EmptyState\n title=\"Too large to preview\"\n description=\"Switchyard previews files up to 1 MB.\"\n />\n ) : (\n <ErrorState\n compact\n title=\"Could not read this file\"\n error={error}\n onRetry={() => setNonce((n) => n + 1)}\n />\n );\n } else if (content && imageMime && content.base64) {\n body = (\n <div className={checkerboard}>\n <img\n alt={name}\n className=\"max-h-[60vh] max-w-full\"\n src={`data:${imageMime};base64,${content.base64}`}\n onLoad={(e) =>\n setDims(`${e.currentTarget.naturalWidth}×${e.currentTarget.naturalHeight}`)\n }\n />\n </div>\n );\n } else if (text !== null && isSvg && view === \"preview\") {\n body = (\n <div className={checkerboard}>\n <img\n alt={name}\n className=\"max-h-[60vh] max-w-full\"\n src={`data:image/svg+xml;charset=utf-8,${encodeURIComponent(text)}`}\n />\n </div>\n );\n } else if (text !== null && isMarkdown && view === \"preview\") {\n body = (\n <div className=\"px-4 py-2\">\n <Markdown text={text} />\n </div>\n );\n } else if (text !== null) {\n body = <CodeView text={text} lang={langFor(file)} wrap={wrap} />;\n } else if (content) {\n body = (\n <EmptyState\n title=\"Binary file\"\n description={`${content.size !== null ? formatSize(content.size) : \"Unknown size\"} — not shown`}\n />\n );\n }\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex flex-col gap-1 border-b border-border px-3 pt-2 pb-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <IconButton\n size=\"sm\"\n label=\"Back to files\"\n icon={<ArrowLeft className=\"size-4\" />}\n onClick={onBack}\n />\n <Icon aria-hidden className=\"size-4 shrink-0 text-muted\" />\n <h3 className=\"min-w-0 flex-1 truncate font-medium\">{name}</h3>\n {status && (\n <span className={cn(\"shrink-0 text-xs font-medium\", BADGE[status].tone)}>\n {STATUS_LABEL[status]}\n </span>\n )}\n </div>\n <p className=\"min-w-0 truncate text-xs text-muted\">\n <span className=\"font-mono\">{dir || (ws.branch ?? \"root\")}</span>\n {content?.size != null && ` · ${formatSize(content.size)}`}\n {lines !== null && ` · ${lines} lines`}\n {dims && ` · ${dims}`}\n </p>\n <div className=\"flex flex-wrap items-center gap-1\">\n {(isMarkdown || isSvg) && text !== null && (\n <SegmentedControl\n label=\"View\"\n value={view}\n onChange={setView}\n options={[\n { value: \"preview\", label: \"Preview\" },\n { value: \"source\", label: \"Source\" },\n ]}\n />\n )}\n {text !== null && (\n <>\n <IconButton\n size=\"sm\"\n label={wrap ? \"Don't wrap lines\" : \"Wrap lines\"}\n aria-pressed={wrap}\n icon={<WrapText className=\"size-4\" />}\n onClick={() => setWrap((w) => !w)}\n />\n <IconButton\n size=\"sm\"\n label=\"Copy contents\"\n icon={<Copy className=\"size-4\" />}\n onClick={() => copy(text)}\n />\n </>\n )}\n <IconButton\n size=\"sm\"\n label=\"Copy path\"\n icon={<Link2 className=\"size-4\" />}\n onClick={() => copy(file)}\n />\n </div>\n </div>\n <div className=\"min-w-0 pb-3\">{body}</div>\n </div>\n );\n}\n","import { type ReactNode, useEffect, useId, useState } from \"react\";\nimport { CountBadge } from \"../../components/ui/Badge\";\nimport { TabPanel, Tabs } from \"../../components/ui/Tabs\";\nimport { cn } from \"../../lib/cn\";\nimport { usePanels } from \"../../sync/store\";\nimport { ChangesTab, useWorkspaceDiff } from \"./Changes\";\nimport type { InspectorTab } from \"./context\";\nimport { ExtensionsSection, TaskSection } from \"./Details\";\nimport { FilesTab } from \"./Files\";\nimport type { SessionContext } from \"./hooks\";\nimport type { SessionActions } from \"./SessionActions\";\n\nexport interface InspectorProps {\n ctx: SessionContext;\n actions: SessionActions;\n tab: InspectorTab;\n onTab: (t: InspectorTab) => void;\n openPath: { path: string; nonce: number } | null;\n className?: string;\n /** Hide the visible heading (the drawer has its own). */\n hideTitle?: boolean;\n}\n\n/** Inspector: Changes, Files (read-only), Task, Extensions. */\nexport function Inspector({\n ctx,\n actions,\n tab,\n onTab,\n openPath,\n className,\n hideTitle,\n}: InspectorProps) {\n const prefix = useId();\n const panels = usePanels(ctx.session.id);\n const changed = ctx.workspace?.git.changedFiles ?? 0;\n const diff = useWorkspaceDiff(ctx);\n const [visited, setVisited] = useState<Set<InspectorTab>>(() => new Set([tab]));\n useEffect(() => setVisited((v) => (v.has(tab) ? v : new Set(v).add(tab))), [tab]);\n const panes: { id: InspectorTab; body: ReactNode; flush?: boolean }[] = [\n { id: \"changes\", body: <ChangesTab ctx={ctx} diff={diff} /> },\n { id: \"files\", body: <FilesTab ctx={ctx} diff={diff} openPath={openPath} />, flush: true },\n { id: \"task\", body: <TaskSection ctx={ctx} actions={actions} /> },\n { id: \"extensions\", body: <ExtensionsSection ctx={ctx} /> },\n ];\n return (\n <aside\n data-testid=\"inspector\"\n aria-label=\"Inspector\"\n className={cn(\"flex min-h-0 min-w-0 flex-col bg-surface\", className)}\n >\n {!hideTitle && <h2 className=\"sr-only\">Inspector</h2>}\n <Tabs\n idPrefix={prefix}\n label=\"Inspector\"\n value={tab}\n onChange={(t) => onTab(t as InspectorTab)}\n className=\"shrink-0 px-2\"\n scrollable\n tabs={[\n {\n id: \"changes\",\n label: \"Changes\",\n badge: <CountBadge count={changed} label=\"changed files\" tone=\"neutral\" />,\n },\n { id: \"files\", label: \"Files\" },\n { id: \"task\", label: \"Task\" },\n {\n id: \"extensions\",\n label: \"Extensions\",\n badge: <CountBadge count={panels.length} label=\"panels\" tone=\"neutral\" />,\n },\n ]}\n />\n {panes.map((p) => (\n <TabPanel\n key={p.id}\n idPrefix={prefix}\n id={p.id}\n hidden={tab !== p.id}\n className={cn(\n \"relative min-h-0 min-w-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain\",\n p.flush ? \"p-0\" : \"p-3\",\n )}\n >\n {(tab === p.id || visited.has(p.id)) && p.body}\n </TabPanel>\n ))}\n </aside>\n );\n}\n","import type { Session } from \"@switchyard/protocol\";\nimport {\n ChevronDown,\n ChevronRight,\n ChevronsDownUp,\n ChevronsUpDown,\n FolderGit2,\n GitBranch,\n MessageCircleQuestion,\n Plus,\n Search,\n Server,\n SlidersHorizontal,\n} from \"lucide-react\";\nimport { type CSSProperties, type ReactNode, useMemo } from \"react\";\nimport { Link } from \"react-router\";\nimport { BACK_STATE } from \"../../app/useBackTo\";\nimport { Button } from \"../../components/ui/Button\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Menu, type MenuHeading, type MenuItem } from \"../../components/ui/Menu\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { RUNTIME_STATUS, StatusChip, type StatusInfo } from \"../../components/ui/StatusChip\";\nimport { EmptyState, LoadingState } from \"../../components/ui/states\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { cn } from \"../../lib/cn\";\nimport { formatRelative } from \"../../lib/time\";\nimport { useFilter } from \"../../prefs\";\nimport { useHosts, useProjects, useSyncStore } from \"../../sync/store\";\nimport {\n buildNavTree,\n DEFAULT_SORT,\n NAV_LAYOUTS,\n NAV_SORTS,\n type NavFilter,\n type NavGroup,\n type NavLayout,\n type NavRow,\n type NavSort,\n navGroupKeys,\n navTreeIsEmpty,\n projectIdOfGroup,\n} from \"./model\";\n\ninterface NavPrefs {\n filter: NavFilter;\n query: string;\n collapsed: string[];\n layout: NavLayout;\n showSubagents: boolean;\n sorts: Partial<Record<NavLayout, NavSort>>;\n needsInputFirst: boolean;\n}\n\n/** The phone session list defaults to Recent; the desktop navigator to Projects. */\nfunction defaultPrefs(screen: boolean): NavPrefs {\n return {\n filter: \"active\",\n query: \"\",\n collapsed: [],\n layout: screen ? \"recent\" : \"projects\",\n showSubagents: false,\n sorts: {},\n needsInputFirst: true,\n };\n}\n\nexport interface NavigatorProps {\n selectedId: string | null;\n onNewSession: (projectId?: string) => void;\n /** \"pane\" for the desktop navigator, \"screen\" for the mobile session list. */\n variant: \"pane\" | \"screen\";\n className?: string;\n style?: CSSProperties;\n}\n\n/** Sessions in a chosen layout, with search, filters, view options, collapse controls and New session. */\nexport function Navigator({ selectedId, onNewSession, variant, className, style }: NavigatorProps) {\n const screen = variant === \"screen\";\n const defaults = defaultPrefs(screen);\n const [stored, setPrefs] = useFilter<NavPrefs>(screen ? \"sessionList\" : \"navigator\", defaults);\n const prefs = { ...defaults, ...stored };\n const hydrated = useSyncStore((s) => s.hydrated);\n const projects = useSyncStore((s) => s.projects);\n const workspaces = useSyncStore((s) => s.workspaces);\n const sessions = useSyncStore((s) => s.sessions);\n const sort = prefs.sorts?.[prefs.layout] ?? DEFAULT_SORT[prefs.layout];\n const hostsMap = useSyncStore((s) => s.hosts);\n const attention = useSyncStore((s) => s.attention);\n const interactions = useSyncStore((s) => s.interactions);\n const hosts = useHosts();\n const projectList = useProjects();\n const tree = useMemo(\n () =>\n buildNavTree(\n { projects, workspaces, sessions, hosts: hostsMap, attention, interactions },\n {\n filter: prefs.filter,\n query: prefs.query,\n layout: prefs.layout,\n showSubagents: prefs.showSubagents,\n sort,\n needsInputFirst: prefs.needsInputFirst,\n },\n ),\n [\n projects,\n workspaces,\n sessions,\n hostsMap,\n attention,\n interactions,\n prefs.filter,\n prefs.query,\n prefs.layout,\n prefs.showSubagents,\n sort,\n prefs.needsInputFirst,\n ],\n );\n const collapsed = new Set(prefs.collapsed);\n const toggle = (key: string) => {\n const next = new Set(collapsed);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n setPrefs({ ...prefs, collapsed: [...next] });\n };\n const allKeys = navGroupKeys(tree);\n const viewItems: (MenuItem | MenuHeading | \"separator\")[] = [\n { id: \"layout-heading\", heading: \"Group sessions\" },\n ...NAV_LAYOUTS.map(\n (l): MenuItem => ({\n id: `layout-${l.value}`,\n label: l.label,\n hint: l.hint,\n kind: \"radio\",\n checked: prefs.layout === l.value,\n onSelect: () => setPrefs({ ...prefs, layout: l.value }),\n }),\n ),\n \"separator\",\n { id: \"sort-heading\", heading: \"Sort sessions\" },\n ...NAV_SORTS.map(\n (s): MenuItem => ({\n id: `sort-${s.value}`,\n label: s.label,\n hint: s.value === DEFAULT_SORT[prefs.layout] ? `${s.hint} (default)` : s.hint,\n kind: \"radio\",\n checked: sort === s.value,\n onSelect: () => setPrefs({ ...prefs, sorts: { ...prefs.sorts, [prefs.layout]: s.value } }),\n }),\n ),\n {\n id: \"needs-first\",\n label: \"Needs input first\",\n kind: \"checkbox\",\n checked: prefs.needsInputFirst,\n onSelect: () => setPrefs({ ...prefs, needsInputFirst: !prefs.needsInputFirst }),\n },\n \"separator\",\n {\n id: \"subagents\",\n label: \"Show subagents\",\n kind: \"checkbox\",\n checked: prefs.showSubagents,\n onSelect: () => setPrefs({ ...prefs, showSubagents: !prefs.showSubagents }),\n },\n ];\n const anyExpanded = allKeys.some((k) => !collapsed.has(k));\n\n const filterOptions: { value: NavFilter; label: string }[] = screen\n ? [\n { value: \"active\", label: \"Active\" },\n { value: \"attention\", label: \"Needs input\" },\n { value: \"all\", label: \"All\" },\n ]\n : [\n { value: \"active\", label: \"Active\" },\n { value: \"all\", label: \"All\" },\n ];\n\n let body: ReactNode;\n if (!hydrated) {\n body = <LoadingState label=\"Loading sessions…\" />;\n } else if (hosts.length === 0) {\n body = (\n <EmptyState\n icon={<Server className=\"size-8\" />}\n title=\"Connect a host\"\n description=\"Sessions run on a host: a computer with Pi and the Switchyard host agent.\"\n action={{ label: \"Connect a host\", to: \"/settings/hosts\" }}\n secondaryAction={\n projectList.length === 0\n ? { label: \"Add a project\", to: \"/settings/projects\" }\n : undefined\n }\n />\n );\n } else if (projectList.length === 0) {\n body = (\n <EmptyState\n icon={<FolderGit2 className=\"size-8\" />}\n title=\"Add a project\"\n description=\"Point Switchyard at a Git checkout on one of your hosts to start sessions there.\"\n action={{ label: \"Add a project\", to: \"/settings/projects\" }}\n />\n );\n } else if (navTreeIsEmpty(tree)) {\n body = prefs.query ? (\n <EmptyState\n icon={<Search className=\"size-8\" />}\n title=\"No matches\"\n description={`Nothing matches \"${prefs.query}\".`}\n action={{ label: \"Clear search\", onClick: () => setPrefs({ ...prefs, query: \"\" }) }}\n />\n ) : (\n <EmptyState\n title={\n prefs.filter === \"attention\"\n ? \"Nothing needs your input\"\n : prefs.filter === \"active\"\n ? \"No active sessions\"\n : \"No sessions yet\"\n }\n description=\"Start a session in one of your projects.\"\n action={{ label: \"New session\", onClick: () => onNewSession() }}\n secondaryAction={\n prefs.filter !== \"all\"\n ? { label: \"Show all\", onClick: () => setPrefs({ ...prefs, filter: \"all\" }) }\n : undefined\n }\n />\n );\n } else if (prefs.layout === \"recent\") {\n body = (\n <ul aria-label=\"Recent sessions\" className=\"flex min-w-0 flex-col gap-0.5 pb-4\">\n {tree.rows.map((row) => (\n <SessionRow\n key={row.session.id}\n row={row}\n indent={0}\n selected={row.session.id === selectedId}\n screen={screen}\n />\n ))}\n </ul>\n );\n } else {\n body = (\n <ul\n aria-label={prefs.layout === \"hosts\" ? \"Hosts\" : \"Projects\"}\n className=\"flex min-w-0 flex-col gap-1 pb-4\"\n >\n {tree.groups.map((g) => (\n <GroupNode\n key={g.key}\n group={g}\n depth={0}\n collapsed={collapsed}\n toggle={toggle}\n selectedId={selectedId}\n screen={screen}\n onNewSession={onNewSession}\n />\n ))}\n </ul>\n );\n }\n\n return (\n <nav\n data-testid=\"navigator\"\n aria-label=\"Sessions\"\n style={style}\n className={cn(\"flex min-h-0 min-w-0 flex-col bg-surface\", className)}\n >\n <div className=\"flex shrink-0 flex-col gap-2 border-b border-border px-3 pt-3 pb-2\">\n <div className=\"flex items-center gap-2\">\n <h2 className={cn(\"min-w-0 flex-1 font-semibold\", screen ? \"text-lg\" : \"text-sm\")}>\n Sessions\n </h2>\n <Button\n data-testid=\"new-session\"\n size=\"sm\"\n variant=\"primary\"\n icon={<Plus className=\"size-4\" />}\n onClick={() => onNewSession()}\n disabled={!hydrated || hosts.length === 0 || projectList.length === 0}\n >\n New session\n </Button>\n </div>\n {hydrated && (hosts.length === 0 || projectList.length === 0) && (\n <p className=\"text-xs text-muted\">\n {hosts.length === 0\n ? \"Connect a host to start sessions.\"\n : \"Add a project to start sessions.\"}\n </p>\n )}\n <div className=\"relative\">\n <Search\n aria-hidden\n className=\"pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-subtle\"\n />\n <TextInput\n type=\"search\"\n aria-label=\"Search sessions\"\n placeholder=\"Search sessions, branches\"\n value={prefs.query}\n onChange={(e) => setPrefs({ ...prefs, query: e.target.value })}\n className=\"pl-8\"\n />\n </div>\n <div className=\"flex min-w-0 items-center gap-1\">\n <SegmentedControl\n label=\"Session filter\"\n options={filterOptions}\n value={prefs.filter}\n onChange={(v) => setPrefs({ ...prefs, filter: v })}\n className=\"min-w-0 flex-1\"\n block\n />\n <Menu\n label=\"View options\"\n items={viewItems}\n trigger={(p) => (\n <IconButton\n {...p}\n label=\"View options\"\n icon={<SlidersHorizontal className=\"size-4\" />}\n />\n )}\n />\n {tree.groups.length > 0 && (\n <IconButton\n label={anyExpanded ? \"Collapse all\" : \"Expand all\"}\n icon={\n anyExpanded ? (\n <ChevronsDownUp className=\"size-4\" />\n ) : (\n <ChevronsUpDown className=\"size-4\" />\n )\n }\n onClick={() => setPrefs({ ...prefs, collapsed: anyExpanded ? allKeys : [] })}\n />\n )}\n </div>\n </div>\n <div className=\"relative min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain px-2 pt-2\">\n {body}\n </div>\n </nav>\n );\n}\n\nfunction GroupHeader({ group, depth, open }: { group: NavGroup; depth: number; open: boolean }) {\n const Chevron = open ? ChevronDown : ChevronRight;\n if (depth === 0) {\n return (\n <>\n <Chevron aria-hidden className=\"size-4 shrink-0 text-muted\" />\n {group.kind === \"host\" && <Server aria-hidden className=\"size-3.5 shrink-0 text-muted\" />}\n <span className=\"min-w-0 flex-1 truncate\">\n {group.label}\n {group.detail && (\n <span className=\"ml-1.5 text-xs font-normal text-muted\">{group.detail}</span>\n )}\n </span>\n {group.hostState && group.hostState !== \"connected\" && (\n <StatusChip kind=\"host\" value={group.hostState} size=\"sm\" />\n )}\n <span className=\"shrink-0 text-xs font-normal text-muted\">\n {group.sessionCount}\n <span className=\"sr-only\"> sessions</span>\n </span>\n </>\n );\n }\n if (group.kind === \"workspace\") {\n return (\n <>\n <Chevron aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n <GitBranch aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-xs\" title={group.path ?? undefined}>\n {group.label}\n </span>\n {group.detail && (\n <span className=\"block truncate text-xs text-muted\">{group.detail}</span>\n )}\n </span>\n </>\n );\n }\n return (\n <>\n <Chevron aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n <FolderGit2 aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n <span className=\"min-w-0 flex-1 truncate text-sm\">{group.label}</span>\n </>\n );\n}\n\nfunction GroupNode({\n group,\n depth,\n collapsed,\n toggle,\n selectedId,\n screen,\n onNewSession,\n}: {\n group: NavGroup;\n depth: number;\n collapsed: Set<string>;\n toggle: (key: string) => void;\n selectedId: string | null;\n screen: boolean;\n onNewSession: (projectId?: string) => void;\n}) {\n const open = !collapsed.has(group.key);\n const pid = group.kind === \"project\" ? projectIdOfGroup(group.key) : null;\n return (\n <li className=\"min-w-0\">\n <div className=\"group/row flex min-w-0 items-center\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => toggle(group.key)}\n className={cn(\n \"tap flex min-w-0 flex-1 items-center gap-1.5 rounded-md text-left hover:bg-surface-2\",\n depth === 0 ? \"px-1.5 py-1.5 text-sm font-semibold\" : \"py-1 pr-1.5 pl-4\",\n )}\n >\n <GroupHeader group={group} depth={depth} open={open} />\n </button>\n {pid && (\n <IconButton\n size=\"sm\"\n label={`New session in ${group.label}`}\n icon={<Plus className=\"size-4\" />}\n onClick={() => onNewSession(pid)}\n className=\"opacity-0 focus-visible:opacity-100 group-hover/row:opacity-100 max-md:opacity-100\"\n />\n )}\n </div>\n {open && (\n <ul className={cn(\"flex min-w-0 flex-col\", depth > 0 && \"gap-0.5 py-0.5\")}>\n {group.rows.length === 0 && group.groups.length === 0 && (\n <li className=\"px-7 py-1 text-xs text-muted\">No sessions yet.</li>\n )}\n {group.groups.map((g) => (\n <GroupNode\n key={g.key}\n group={g}\n depth={depth + 1}\n collapsed={collapsed}\n toggle={toggle}\n selectedId={selectedId}\n screen={screen}\n onNewSession={onNewSession}\n />\n ))}\n {group.rows.map((row) => (\n <SessionRow\n key={row.session.id}\n row={row}\n indent={depth === 0 ? 1 : 2}\n selected={row.session.id === selectedId}\n screen={screen}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nconst INDENT = [\"pl-2\", \"pl-7\", \"pl-9\"] as const;\n\nfunction SessionRow({\n row,\n indent,\n selected,\n screen,\n}: {\n row: NavRow;\n indent: 0 | 1 | 2;\n selected: boolean;\n screen: boolean;\n}) {\n const { session, attention } = row;\n const context = [formatRelative(session.lastActivityAt), row.project, row.host, row.branch]\n .filter(Boolean)\n .join(\" · \");\n return (\n <li className=\"min-w-0\">\n <Link\n data-testid=\"session-row\"\n to={`/code/${encodeURIComponent(session.id)}`}\n state={BACK_STATE}\n aria-current={selected ? \"page\" : undefined}\n className={cn(\n \"tap flex min-w-0 flex-col gap-0.5 rounded-md py-1.5 pr-2 hover:bg-surface-2\",\n INDENT[indent],\n screen && \"py-2.5\",\n selected && \"bg-accent-soft hover:bg-accent-soft\",\n )}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">{session.title}</span>\n {attention && session.runtime !== \"waiting_input\" && (\n <span className=\"inline-flex shrink-0 items-center gap-0.5 text-xs font-medium text-warning\">\n <MessageCircleQuestion aria-hidden className=\"size-3.5\" />\n Needs input\n </span>\n )}\n </span>\n <span className=\"flex min-w-0 items-center gap-x-1.5\">\n <StatusChip kind=\"custom\" status={rowStatus(session.runtime)} size=\"sm\" />\n {session.provenance === \"subagent\" && (\n <span className=\"shrink-0 text-xs text-muted\">Subagent</span>\n )}\n <span className=\"min-w-0 truncate text-xs text-muted\">{context}</span>\n </span>\n </Link>\n </li>\n );\n}\n\n/** List rows stay calm: only failed and needs input stand out; interrupted reads like stopped. */\nfunction rowStatus(runtime: Session[\"runtime\"]): StatusInfo {\n const s = RUNTIME_STATUS[runtime];\n return runtime === \"interrupted\" ? { ...s, tone: \"neutral\" } : s;\n}\n","import {\n type CSSProperties,\n type ReactNode,\n type RefObject,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useFocusTrap } from \"./useFocusTrap\";\n\nexport interface PopoverTriggerProps {\n ref: React.Ref<HTMLButtonElement>;\n onClick: () => void;\n \"aria-haspopup\": \"dialog\";\n \"aria-expanded\": boolean;\n \"aria-controls\": string;\n}\n\nexport interface PopoverProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n trigger: (props: PopoverTriggerProps) => ReactNode;\n /** Accessible name of the panel. */\n label: string;\n side?: \"top\" | \"bottom\";\n align?: \"start\" | \"end\";\n initialFocus?: RefObject<HTMLElement | null>;\n /** Panel classes (width). */\n className?: string;\n /** Position the panel `fixed` and keep it inside the viewport (phones). */\n fitViewport?: boolean;\n children: ReactNode;\n}\n\n/** Non-modal panel anchored to its trigger: holds a search box or a slider. */\nexport function Popover({\n open,\n onOpenChange,\n trigger,\n label,\n side = \"bottom\",\n align = \"start\",\n initialFocus,\n className,\n fitViewport,\n children,\n}: PopoverProps) {\n const id = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const btnRef = useRef<HTMLButtonElement>(null);\n useFocusTrap(panelRef, open, () => onOpenChange(false), initialFocus);\n\n const [fixed, setFixed] = useState<CSSProperties | null>(null);\n useLayoutEffect(() => {\n if (!open || !fitViewport) {\n setFixed(null);\n return;\n }\n const place = () => {\n const rect = btnRef.current?.getBoundingClientRect();\n if (!rect) return;\n const width = Math.min(288, window.innerWidth - 16);\n const left = Math.min(Math.max(rect.left, 8), window.innerWidth - width - 8);\n setFixed(\n side === \"top\"\n ? { position: \"fixed\", width, left, bottom: window.innerHeight - rect.top + 4 }\n : { position: \"fixed\", width, left, top: rect.bottom + 4 },\n );\n };\n place();\n window.addEventListener(\"resize\", place);\n return () => window.removeEventListener(\"resize\", place);\n }, [open, fitViewport, side]);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: PointerEvent) => {\n const t = e.target as Node;\n if (!panelRef.current?.contains(t) && !btnRef.current?.contains(t)) onOpenChange(false);\n };\n document.addEventListener(\"pointerdown\", onDoc);\n return () => document.removeEventListener(\"pointerdown\", onDoc);\n }, [open, onOpenChange]);\n\n return (\n <div className=\"relative inline-flex\">\n {trigger({\n ref: btnRef,\n onClick: () => onOpenChange(!open),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": open,\n \"aria-controls\": id,\n })}\n {open && (\n <div\n ref={panelRef}\n id={id}\n role=\"dialog\"\n aria-label={label}\n tabIndex={-1}\n style={fixed ?? undefined}\n className={cn(\n fixed ? \"fixed\" : \"absolute\",\n \"z-40 max-w-[calc(100vw-1rem)] rounded-lg border border-border bg-surface p-3 shadow-pop\",\n !fixed && (side === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\"),\n !fixed && (align === \"end\" ? \"right-0\" : \"left-0\"),\n className,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import type { Project } from \"@switchyard/protocol\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { useId, useMemo, useRef, useState } from \"react\";\nimport { Popover } from \"../../components/ui/Popover\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { cn } from \"../../lib/cn\";\nimport { matchesProject, repoLabel } from \"../../lib/repo\";\n\n/** More projects than this: a searchable picker instead of a native select. */\nexport const PROJECT_SEARCH_THRESHOLD = 8;\n\nexport const CHIP_SELECT =\n \"tap h-9 min-w-0 max-w-full rounded-full border border-border bg-surface pr-7 pl-3 text-base text-text md:h-8 md:text-sm focus:border-accent focus:outline-none disabled:opacity-55\";\nconst CHIP_BUTTON =\n \"tap inline-flex h-9 min-w-0 max-w-full items-center gap-1 rounded-full border border-border bg-surface px-3 text-base text-text md:h-8 md:text-sm hover:bg-surface-2\";\n\nexport function ProjectPicker({\n projects,\n value,\n onChange,\n}: {\n projects: Project[];\n value: string;\n onChange: (id: string) => void;\n}) {\n const id = useId();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [active, setActive] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const shown = useMemo(() => projects.filter((p) => matchesProject(p, query)), [projects, query]);\n const current = projects.find((p) => p.id === value);\n\n if (projects.length <= PROJECT_SEARCH_THRESHOLD) {\n return (\n <>\n <label htmlFor={id} className=\"sr-only\">\n Project\n </label>\n <select\n id={id}\n className={CHIP_SELECT}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </>\n );\n }\n const choose = (pid: string) => {\n onChange(pid);\n setOpen(false);\n };\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n if (o) {\n setQuery(\"\");\n setActive(0);\n }\n }}\n label=\"Choose a project\"\n initialFocus={inputRef}\n fitViewport\n className=\"p-2\"\n trigger={(p) => (\n <button\n type=\"button\"\n {...p}\n aria-label={`Project: ${current?.name ?? \"none\"}`}\n className={CHIP_BUTTON}\n >\n <span className=\"truncate\">{current?.name ?? \"Choose a project\"}</span>\n <ChevronDown aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n </button>\n )}\n >\n <TextInput\n ref={inputRef}\n role=\"combobox\"\n aria-expanded\n aria-controls={`${id}-list`}\n aria-autocomplete=\"list\"\n aria-activedescendant={shown[active] ? `${id}-opt-${shown[active].id}` : undefined}\n aria-label=\"Search projects\"\n placeholder=\"Search projects\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActive(0);\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive((i) => Math.min(shown.length - 1, i + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((i) => Math.max(0, i - 1));\n } else if (e.key === \"Enter\") {\n // Also stops implicit form submission (the panel renders inside the New session form).\n e.preventDefault();\n e.stopPropagation();\n const p = shown[active];\n if (p) choose(p.id);\n }\n }}\n />\n <ul\n id={`${id}-list`}\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: combobox listbox pattern\n role=\"listbox\"\n aria-label=\"Projects\"\n className=\"mt-2 max-h-64 overflow-y-auto\"\n >\n {shown.length === 0 && <li className=\"px-2 py-2 text-sm text-muted\">No projects match.</li>}\n {shown.map((p, i) => (\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard selection goes through the combobox input\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the combobox input (aria-activedescendant)\n <li\n key={p.id}\n id={`${id}-opt-${p.id}`}\n // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: combobox option pattern\n role=\"option\"\n aria-selected={p.id === value}\n onPointerDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => choose(p.id)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm\",\n i === active && \"bg-surface-2\",\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{p.name}</span>\n <span className=\"block truncate text-xs text-muted\">{repoLabel(p.repoIdentity)}</span>\n </span>\n {p.id === value && <Check aria-hidden className=\"size-4 shrink-0 text-accent\" />}\n </li>\n ))}\n </ul>\n </Popover>\n );\n}\n","const prompts = new Map<string, string>();\n\n/** The first prompt of a session being created, shown while it starts. */\nexport function rememberInitialPrompt(sessionId: string, text: string): void {\n if (text.trim()) prompts.set(sessionId, text);\n}\n\nexport function initialPromptFor(sessionId: string): string | null {\n return prompts.get(sessionId) ?? null;\n}\n","import { ChevronDown, ChevronRight, GitBranch, TriangleAlert } from \"lucide-react\";\nimport { type KeyboardEvent, useEffect, useId, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Field } from \"../../components/ui/Field\";\nimport { Dialog, Sheet } from \"../../components/ui/Overlay\";\nimport { Select } from \"../../components/ui/Select\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { TextArea, TextInput } from \"../../components/ui/TextArea\";\nimport { usePrefs } from \"../../prefs\";\nimport { errorMessage } from \"../../sync/api\";\nimport { useProjects, useSyncStore } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\nimport {\n branchFromPrompt,\n branchProblem,\n compareWorkspaces,\n hostOnline,\n newSessionDefaults,\n uniqueBranch,\n workspaceLabel,\n worktreePath,\n} from \"./model\";\nimport { CHIP_SELECT, ProjectPicker } from \"./ProjectPicker\";\nimport { rememberInitialPrompt } from \"./startingPrompts\";\n\nconst NEW = \"__new\";\n\nfunction useNewSessionForm(open: boolean, initialProjectId: string | null) {\n const projects = useProjects();\n const workspaces = useSyncStore((s) => s.workspaces);\n const checkouts = useSyncStore((s) => s.checkouts);\n const profilesMap = useSyncStore((s) => s.profiles);\n const hosts = useSyncStore((s) => s.hosts);\n const projectsById = useSyncStore((s) => s.projects);\n const selectedProject = usePrefs((s) => s.selectedProjectId);\n const lastProject = usePrefs((s) => s.lastNewSessionProjectId);\n const profiles = useMemo(\n () => Object.values(profilesMap).sort((a, b) => a.name.localeCompare(b.name)),\n [profilesMap],\n );\n\n const [projectId, setProjectId] = useState(\"\");\n const [hostId, setHostId] = useState(\"\");\n const [workspaceId, setWorkspaceId] = useState(NEW);\n const [checkoutId, setCheckoutId] = useState(\"\");\n const [branch, setBranch] = useState(\"\");\n const [branchTouched, setBranchTouched] = useState(false);\n const [base, setBase] = useState(\"\");\n const [profileId, setProfileId] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\n const [title, setTitle] = useState(\"\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n // Defaults when the flow opens.\n // biome-ignore lint/correctness/useExhaustiveDependencies: initialize once per opening\n useEffect(() => {\n if (!open) return;\n const pick = [initialProjectId, lastProject, selectedProject].find(\n (id) => !!id && !!projectsById[id],\n );\n setProjectId(pick ?? projects[0]?.id ?? \"\");\n }, [open, initialProjectId]);\n\n const project = projects.find((p) => p.id === projectId);\n const projectWorkspaces = useMemo(\n () => Object.values(workspaces).filter((w) => w.projectId === projectId && !w.archivedAt),\n [workspaces, projectId],\n );\n const projectCheckouts = useMemo(\n () =>\n Object.values(checkouts)\n .filter((c) => c.projectId === projectId)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt)),\n [checkouts, projectId],\n );\n const hostIds = useMemo(\n () =>\n [...new Set(projectCheckouts.map((c) => c.hostId))].sort((a, b) =>\n (hosts[a]?.name ?? \"\").localeCompare(hosts[b]?.name ?? \"\"),\n ),\n [projectCheckouts, hosts],\n );\n\n // Project-dependent defaults.\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-default when the flow opens or the project changes\n useEffect(() => {\n if (!open || !project) return;\n const d = newSessionDefaults(project, projectCheckouts, projectWorkspaces, hosts);\n setHostId(d.hostId);\n setWorkspaceId(d.workspaceId ?? NEW);\n setCheckoutId(d.checkoutId ?? \"\");\n setProfileId(\"\");\n setBase(\"\");\n setBranch(\"\");\n setBranchTouched(false);\n }, [open, projectId]);\n\n const changeHost = (id: string) => {\n if (!project) return;\n const d = newSessionDefaults(project, projectCheckouts, projectWorkspaces, hosts, id);\n setHostId(d.hostId);\n setWorkspaceId(d.workspaceId ?? NEW);\n setCheckoutId(d.checkoutId ?? \"\");\n };\n\n const hostWorkspaces = useMemo(\n () => projectWorkspaces.filter((w) => w.hostId === hostId).sort(compareWorkspaces),\n [projectWorkspaces, hostId],\n );\n const hostCheckouts = useMemo(\n () => projectCheckouts.filter((c) => c.hostId === hostId),\n [projectCheckouts, hostId],\n );\n const mode = workspaceId === NEW ? \"new\" : \"existing\";\n const workspace = mode === \"existing\" ? workspaces[workspaceId] : undefined;\n const checkout = checkouts[checkoutId] ?? hostCheckouts[0];\n const host = hosts[hostId];\n const suggested = useMemo(\n () =>\n uniqueBranch(\n branchFromPrompt(prompt),\n projectWorkspaces.map((w) => w.branch),\n ),\n [prompt, projectWorkspaces],\n );\n const effectiveBranch = branchTouched ? branch : suggested;\n\n let problem: string | null = null;\n if (!project) problem = \"Choose a project.\";\n else if (hostIds.length === 0)\n problem = \"This project has no checkout yet. Add one in Settings › Projects.\";\n else if (!host) problem = \"Choose a host.\";\n else if (!hostOnline(host)) problem = `${host.name} is offline.`;\n else if (!host.piCompatible) {\n problem = `Pi ${host.piVersion ?? \"(not found)\"} on ${host.name} is outside the tested range.`;\n } else if (mode === \"existing\" && !workspace) problem = \"Choose a workspace.\";\n else if (mode === \"new\" && !checkout) problem = `No checkout of ${project.name} on ${host.name}.`;\n else if (mode === \"new\") problem = branchProblem(effectiveBranch);\n\n let summary: { text: string; path: string } | null = null;\n if (workspace) {\n summary = {\n text: `${workspaceLabel(workspace)} on ${host?.name ?? \"unknown host\"}`,\n path: workspace.path,\n };\n } else if (mode === \"new\" && checkout) {\n summary = {\n text: `New worktree ${effectiveBranch.trim()} from ${base.trim() || checkout.defaultBranch} on ${host?.name ?? \"unknown host\"}`,\n path: worktreePath(checkout.path, effectiveBranch, project?.worktreeDir),\n };\n }\n\n return {\n projects,\n profiles,\n hosts,\n project,\n projectId,\n setProjectId,\n hostId,\n hostIds,\n changeHost,\n workspaceId,\n setWorkspaceId,\n hostWorkspaces,\n hostCheckouts,\n setCheckoutId,\n mode,\n workspace,\n checkout,\n host,\n branch,\n setBranch,\n branchTouched,\n setBranchTouched,\n base,\n setBase,\n profileId,\n setProfileId,\n prompt,\n setPrompt,\n title,\n setTitle,\n advancedOpen,\n setAdvancedOpen,\n suggested,\n effectiveBranch,\n problem,\n summary,\n reset: () => {\n setPrompt(\"\");\n setTitle(\"\");\n setBranch(\"\");\n setBranchTouched(false);\n setBase(\"\");\n setAdvancedOpen(false);\n },\n };\n}\n\n/**\n * New session: prompt first, then project, workspace, host and profile as\n * compact choices. A dialog on desktop, one full-height sheet on mobile.\n * Creating posts `/api/sessions` and opens the session at once; the session view\n * shows its starting progress until Pi is ready.\n */\nexport function NewSessionFlow({\n open,\n onClose,\n onCreated,\n mobile,\n projectId = null,\n}: {\n open: boolean;\n onClose: () => void;\n onCreated: (sessionId: string) => void;\n mobile: boolean;\n projectId?: string | null;\n}) {\n const id = useId();\n const f = useNewSessionForm(open, projectId);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n if (!open) {\n setError(null);\n setSubmitting(false);\n }\n }, [open]);\n\n const create = async () => {\n if (f.problem || submitting) return;\n setSubmitting(true);\n setError(null);\n try {\n const s = await codeApi.createSession({\n projectId: f.projectId,\n workspace:\n f.mode === \"existing\"\n ? { existingId: f.workspaceId }\n : {\n checkoutId: f.checkout?.id ?? \"\",\n newBranch: f.effectiveBranch.trim(),\n base: f.base.trim() || null,\n },\n profileId: f.profileId || null,\n prompt: f.prompt,\n ...(f.title.trim() ? { title: f.title.trim() } : {}),\n });\n useSyncStore.getState().upsertSessionIfMissing(s);\n rememberInitialPrompt(s.id, f.prompt);\n usePrefs.getState().set(\"lastNewSessionProjectId\", f.projectId);\n f.reset();\n onCreated(s.id);\n } catch (e) {\n setError(e);\n } finally {\n setSubmitting(false);\n }\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLFormElement>) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey) && !e.nativeEvent.isComposing) {\n e.preventDefault();\n void create();\n }\n };\n const mac = typeof navigator !== \"undefined\" && /Mac|iPhone|iPad/.test(navigator.platform);\n const shortcut = mac ? \"⌘ Enter\" : \"Ctrl+Enter\";\n const defaultProfile = f.profiles.find((p) => p.id === f.project?.defaultProfileId);\n\n const errorBox =\n error !== null ? (\n <ErrorState\n compact\n title=\"Could not create the session\"\n error={errorMessage(error)}\n onRetry={() => void create()}\n />\n ) : null;\n\n const body =\n f.projects.length === 0 ? (\n <p className=\"text-sm text-muted\">Add a project in Settings first.</p>\n ) : (\n <form\n className=\"flex min-w-0 flex-col gap-3\"\n onSubmit={(e) => {\n e.preventDefault();\n void create();\n }}\n onKeyDown={onKeyDown}\n >\n <label htmlFor={`${id}-prompt`} className=\"text-base font-medium\">\n What should Pi do? <span className=\"text-sm font-normal text-muted\">(optional)</span>\n </label>\n <TextArea\n id={`${id}-prompt`}\n autoFocus\n minRows={mobile ? 6 : 5}\n maxHeight=\"40vh\"\n value={f.prompt}\n onChange={(e) => f.setPrompt(e.target.value)}\n placeholder=\"Describe the task. Leave empty to start Pi without a prompt.\"\n />\n {/* biome-ignore lint/a11y/useSemanticElements: a fieldset would restyle the chip row */}\n <div\n role=\"group\"\n aria-label=\"Session options\"\n className=\"flex min-w-0 flex-wrap items-center gap-2\"\n >\n <ProjectPicker projects={f.projects} value={f.projectId} onChange={f.setProjectId} />\n <label htmlFor={`${id}-ws`} className=\"sr-only\">\n Workspace\n </label>\n <select\n id={`${id}-ws`}\n className={CHIP_SELECT}\n value={f.workspaceId}\n onChange={(e) => f.setWorkspaceId(e.target.value)}\n >\n {f.hostWorkspaces.map((w) => (\n <option key={w.id} value={w.id}>\n {workspaceLabel(w)}\n {w.provenance === \"main\" ? \" (main checkout)\" : \"\"}\n </option>\n ))}\n <option value={NEW} disabled={f.hostCheckouts.length === 0}>\n New worktree…\n </option>\n </select>\n {f.hostIds.length > 1 && (\n <>\n <label htmlFor={`${id}-host`} className=\"sr-only\">\n Host\n </label>\n <select\n id={`${id}-host`}\n className={CHIP_SELECT}\n value={f.hostId}\n onChange={(e) => f.changeHost(e.target.value)}\n >\n {f.hostIds.map((h) => (\n <option key={h} value={h} disabled={!hostOnline(f.hosts[h])}>\n {f.hosts[h]?.name ?? \"Removed host\"}\n {hostOnline(f.hosts[h]) ? \"\" : \" (offline)\"}\n </option>\n ))}\n </select>\n </>\n )}\n {f.profiles.length > 0 && (\n <>\n <label htmlFor={`${id}-profile`} className=\"sr-only\">\n Pi profile\n </label>\n <select\n id={`${id}-profile`}\n className={CHIP_SELECT}\n value={f.profileId}\n onChange={(e) => f.setProfileId(e.target.value)}\n >\n <option value=\"\">\n {defaultProfile ? `${defaultProfile.name} (project default)` : \"Pi defaults\"}\n </option>\n {f.profiles\n .filter((p) => p.id !== f.project?.defaultProfileId)\n .map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </>\n )}\n </div>\n {f.mode === \"new\" && (\n <div className=\"grid min-w-0 gap-3 sm:grid-cols-2\">\n <Field\n label=\"Branch\"\n id={`${id}-branch`}\n hint={\n <>\n {branchProblem(f.effectiveBranch) ??\n (f.branchTouched && f.branch !== f.suggested\n ? \"Custom branch name.\"\n : \"Suggested from the prompt.\")}\n {f.branchTouched && f.branch !== f.suggested && (\n <>\n {\" \"}\n <button\n type=\"button\"\n className=\"font-medium text-accent\"\n onClick={() => {\n f.setBranch(\"\");\n f.setBranchTouched(false);\n }}\n >\n Use suggested name\n </button>\n </>\n )}\n </>\n }\n >\n <TextInput\n id={`${id}-branch`}\n value={f.effectiveBranch}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={(e) => {\n f.setBranch(e.target.value);\n f.setBranchTouched(true);\n }}\n />\n </Field>\n <Field\n label=\"Base branch\"\n id={`${id}-base`}\n hint={`Defaults to ${f.checkout?.defaultBranch ?? \"the default branch\"}.`}\n >\n <TextInput\n id={`${id}-base`}\n value={f.base}\n placeholder={f.checkout?.defaultBranch ?? \"main\"}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={(e) => f.setBase(e.target.value)}\n />\n </Field>\n </div>\n )}\n <div>\n <button\n type=\"button\"\n aria-expanded={f.advancedOpen}\n aria-controls={`${id}-adv`}\n onClick={() => f.setAdvancedOpen(!f.advancedOpen)}\n className=\"tap inline-flex items-center gap-1 text-sm font-medium text-muted hover:text-text\"\n >\n {f.advancedOpen ? (\n <ChevronDown aria-hidden className=\"size-4\" />\n ) : (\n <ChevronRight aria-hidden className=\"size-4\" />\n )}\n Advanced\n </button>\n {f.advancedOpen && (\n <div id={`${id}-adv`} className=\"mt-2 flex min-w-0 flex-col gap-3\">\n <Field label=\"Session title\" optional id={`${id}-title`}>\n <TextInput\n id={`${id}-title`}\n value={f.title}\n placeholder=\"Named from the prompt\"\n onChange={(e) => f.setTitle(e.target.value)}\n />\n </Field>\n {f.mode === \"new\" && f.hostCheckouts.length > 1 && (\n <Field label=\"Checkout\" id={`${id}-checkout`}>\n <Select\n id={`${id}-checkout`}\n value={f.checkout?.id ?? \"\"}\n onChange={(e) => f.setCheckoutId(e.target.value)}\n >\n {f.hostCheckouts.map((c) => (\n <option key={c.id} value={c.id}>\n {c.path}\n </option>\n ))}\n </Select>\n </Field>\n )}\n </div>\n )}\n </div>\n {f.summary && (\n <p\n data-testid=\"new-session-summary\"\n className=\"flex min-w-0 items-center gap-1.5 text-xs text-muted\"\n title={f.summary.path}\n >\n <GitBranch aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">\n {f.summary.text} · <span className=\"font-mono\">{f.summary.path}</span>\n </span>\n </p>\n )}\n {errorBox}\n </form>\n );\n\n const footer = (\n <>\n {f.problem ? (\n <p\n role=\"status\"\n aria-live=\"polite\"\n className=\"mr-auto flex min-w-0 flex-1 basis-full items-start gap-1 text-xs text-muted sm:basis-auto\"\n >\n <TriangleAlert aria-hidden className=\"mt-0.5 size-3.5 shrink-0 text-warning\" />\n {f.problem}\n </p>\n ) : !mobile ? (\n <span className=\"mr-auto text-xs text-subtle\">{shortcut} to create</span>\n ) : null}\n <Button onClick={onClose}>Cancel</Button>\n <Button\n variant=\"primary\"\n busy={submitting}\n disabled={!!f.problem}\n onClick={() => void create()}\n >\n Create session\n </Button>\n </>\n );\n\n if (!mobile) {\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title=\"New session\"\n dismissOnBackdrop={!submitting}\n className=\"max-w-xl\"\n footer={footer}\n >\n {body}\n </Dialog>\n );\n }\n return (\n <Sheet\n fullHeight\n open={open}\n onClose={onClose}\n title=\"New session\"\n dismissOnBackdrop={!submitting}\n footer={footer}\n >\n {body}\n </Sheet>\n );\n}\n","import type { Session } from \"@switchyard/protocol\";\nimport { Dialog } from \"../../components/ui/Overlay\";\nimport { formatTime } from \"../../lib/time\";\nimport { contextMeter } from \"./model\";\n\nfunction InfoRow({ label, value }: { label: string; value: string }) {\n return (\n <>\n <dt className=\"text-muted\">{label}</dt>\n <dd className=\"min-w-0 font-mono text-xs break-all\">{value}</dd>\n </>\n );\n}\n\nexport interface SessionInfoDialogProps {\n session: Session;\n hostLabel: string;\n open: boolean;\n onClose: () => void;\n}\n\n/** Session ids, Pi session file, tokens, cost and context. */\nexport function SessionInfoDialog({ session, hostLabel, open, onClose }: SessionInfoDialogProps) {\n const meter = contextMeter(session);\n const stats = session.stats;\n return (\n <Dialog open={open} onClose={onClose} title=\"Session info\">\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-2 text-sm\">\n <InfoRow label=\"Switchyard session\" value={session.id} />\n <InfoRow label=\"Pi session id\" value={session.nativeHandle?.sessionId ?? \"Not started\"} />\n <InfoRow label=\"Session file\" value={session.nativeHandle?.sessionFile ?? \"None yet\"} />\n <InfoRow label=\"Host\" value={hostLabel} />\n <InfoRow label=\"Working directory\" value={session.cwd} />\n <InfoRow label=\"Origin\" value={session.provenance} />\n <InfoRow label=\"Profile\" value={session.profileSnapshot.name} />\n <InfoRow label=\"Created\" value={formatTime(session.createdAt)} />\n {stats?.tokens != null && (\n <InfoRow label=\"Tokens\" value={stats.tokens.toLocaleString(\"en-US\")} />\n )}\n {stats?.costUsd != null && <InfoRow label=\"Cost\" value={`$${stats.costUsd.toFixed(2)}`} />}\n {meter && <InfoRow label=\"Context\" value={`${meter.label} (${meter.detail})`} />}\n </dl>\n </Dialog>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Field } from \"../../components/ui/Field\";\nimport { ConfirmDialog, Dialog } from \"../../components/ui/Overlay\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { errorMessage } from \"../../sync/api\";\nimport { codeApi } from \"./api\";\nimport type { SessionContext } from \"./hooks\";\nimport { useMutation } from \"./hooks\";\nimport { isBusy, isLive } from \"./model\";\nimport { SessionInfoDialog } from \"./SessionInfoDialog\";\n\nexport interface SessionActions {\n canTakeover: boolean;\n canReturn: boolean;\n canStop: boolean;\n canResume: boolean;\n /** Why archive is unavailable, or null. */\n archiveBlocked: string | null;\n takeover: () => void;\n returnToAutomation: () => void;\n requestStop: () => void;\n resume: () => void;\n openRename: () => void;\n requestArchive: () => void;\n openInfo: () => void;\n unarchive: () => void;\n busy: { takeover: boolean; ret: boolean; stop: boolean; resume: boolean; unarchive: boolean };\n /** Confirmation and form dialogs; render once in the view. */\n dialogs: ReactNode;\n}\n\n/** Session control and menu actions with confirmation dialogs (no optimistic success). */\nexport function useSessionActions(ctx: SessionContext): SessionActions {\n const { session, run, control } = ctx;\n const navigate = useNavigate();\n const [dialog, setDialog] = useState<null | \"stop\" | \"rename\" | \"archive\" | \"info\">(null);\n const [title, setTitle] = useState(session.title);\n\n const takeover = useMutation(() => codeApi.takeover(session.id), {\n success: \"You have control. Automatic continuations are paused.\",\n errorToast: true,\n });\n const ret = useMutation(() => codeApi.returnToAutomation(session.id), {\n success: \"Returned to automation.\",\n errorToast: true,\n });\n const stop = useMutation(() => codeApi.stop(session.id), { success: \"Session stopped.\" });\n const resume = useMutation(() => codeApi.resume(session.id), {\n success: \"Session resumed.\",\n errorToast: true,\n });\n const rename = useMutation((t: string) => codeApi.rename(session.id, t), {\n success: \"Session renamed.\",\n });\n const archive = useMutation(() => codeApi.archive(session.id), { success: \"Session archived.\" });\n const unarchive = useMutation(() => codeApi.unarchive(session.id), {\n success: \"Session unarchived.\",\n errorToast: true,\n });\n\n const connected = ctx.link === \"connected\";\n const close = () => {\n setDialog(null);\n stop.reset();\n rename.reset();\n archive.reset();\n };\n\n const archiveBlocked = isBusy(session) ? \"Stop the session before archiving it\" : null;\n\n const dialogs = (\n <>\n <ConfirmDialog\n open={dialog === \"stop\"}\n onClose={close}\n title=\"Stop this session?\"\n description=\"Stops the current execution and clears queued messages.\"\n confirmLabel=\"Stop session\"\n busy={stop.busy}\n error={stop.error}\n errorTitle=\"Could not stop\"\n onConfirm={() => void stop.run().then((ok) => ok && setDialog(null))}\n >\n <p className=\"text-sm text-muted\">\n {run\n ? \"The task keeps its run, marked interrupted and blocked (Stopped by user). Automation settings are unchanged.\"\n : \"Pi stays available; you can send a new message afterwards.\"}\n </p>\n </ConfirmDialog>\n\n <Dialog\n open={dialog === \"rename\"}\n onClose={close}\n title=\"Rename session\"\n footer={\n <>\n <Button onClick={close}>Cancel</Button>\n <Button\n variant=\"primary\"\n type=\"submit\"\n form=\"sy-rename-form\"\n busy={rename.busy}\n disabled={!title.trim()}\n >\n Save\n </Button>\n </>\n }\n >\n <form\n id=\"sy-rename-form\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!title.trim()) return;\n void rename.run(title.trim()).then((ok) => ok && setDialog(null));\n }}\n className=\"flex flex-col gap-2\"\n >\n <Field id=\"sy-rename-input\" label=\"Title\">\n <TextInput\n id=\"sy-rename-input\"\n value={title}\n maxLength={200}\n onChange={(e) => setTitle(e.target.value)}\n />\n </Field>\n {rename.error !== null && (\n <ErrorState compact title=\"Could not rename\" error={errorMessage(rename.error)} />\n )}\n </form>\n </Dialog>\n\n <ConfirmDialog\n open={dialog === \"archive\"}\n onClose={close}\n title=\"Archive this session?\"\n description=\"It leaves the navigator. The Pi session file stays on the host.\"\n danger={false}\n confirmLabel=\"Archive\"\n busy={archive.busy}\n error={archive.error}\n errorTitle=\"Could not archive\"\n onConfirm={() =>\n void archive.run().then((ok) => {\n if (!ok) return;\n setDialog(null);\n navigate(\"/code\");\n })\n }\n >\n {session.runtime === \"idle\" && (\n <p className=\"text-sm text-muted\">The idle Pi process is stopped first.</p>\n )}\n </ConfirmDialog>\n\n <SessionInfoDialog\n session={session}\n hostLabel={`${ctx.hostName} (${ctx.link})`}\n open={dialog === \"info\"}\n onClose={close}\n />\n </>\n );\n\n return {\n canTakeover: control === \"automation\",\n canReturn: control === \"human\",\n canStop: isBusy(session) && connected,\n canResume: !isLive(session) && !!session.nativeHandle && !session.readOnly && connected,\n archiveBlocked,\n takeover: () => void takeover.run(),\n returnToAutomation: () => void ret.run(),\n requestStop: () => setDialog(\"stop\"),\n resume: () => void resume.run(),\n openRename: () => {\n setTitle(session.title);\n setDialog(\"rename\");\n },\n requestArchive: () => {\n if (archiveBlocked) toast.info(archiveBlocked);\n else setDialog(\"archive\");\n },\n openInfo: () => setDialog(\"info\"),\n unarchive: () => void unarchive.run(),\n busy: {\n takeover: takeover.busy,\n ret: ret.busy,\n stop: stop.busy,\n resume: resume.busy,\n unarchive: unarchive.busy,\n },\n dialogs,\n };\n}\n","import type { CommandView } from \"@switchyard/protocol\";\nimport { UINodeRenderer } from \"../../components/intent/UINodeRenderer\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Drawer, Sheet } from \"../../components/ui/Overlay\";\n\nexport interface CommandViewDrawerProps {\n view: CommandView | null;\n open: boolean;\n busy: boolean;\n mobile: boolean;\n onClose: () => void;\n onRun: (command: string) => void;\n}\n\n/** A plugin command's web view, with its follow-up commands as buttons. */\nexport function CommandViewDrawer({\n view,\n open,\n busy,\n mobile,\n onClose,\n onRun,\n}: CommandViewDrawerProps) {\n if (!view) return null;\n const footer =\n view.actions.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {view.actions.map((a) => (\n <Button\n key={a.command}\n size=\"sm\"\n variant={\n a.tone === \"primary\" ? \"primary\" : a.tone === \"danger\" ? \"danger\" : \"secondary\"\n }\n disabled={busy}\n onClick={() => onRun(a.command)}\n >\n {a.label}\n </Button>\n ))}\n </div>\n ) : undefined;\n const body = <UINodeRenderer node={view.body} />;\n return mobile ? (\n <Sheet open={open} onClose={onClose} title={view.title} footer={footer}>\n {body}\n </Sheet>\n ) : (\n <Drawer open={open} onClose={onClose} title={view.title} footer={footer} width={720}>\n {body}\n </Drawer>\n );\n}\n","import type { Session, SessionModel, ThinkingLevel } from \"@switchyard/protocol\";\nimport { Brain, Check, Cpu, Shrink } from \"lucide-react\";\nimport { type ReactNode, type Ref, useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Menu, type MenuItem } from \"../../components/ui/Menu\";\nimport { Sheet } from \"../../components/ui/Overlay\";\nimport { Popover } from \"../../components/ui/Popover\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { ErrorState, LoadingState } from \"../../components/ui/states\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { errorMessage } from \"../../sync/api\";\nimport { codeApi } from \"./api\";\nimport {\n contextMeter,\n effortIndex,\n favoriteModels,\n groupModels,\n isBusy,\n modelLabel,\n pillModelLabel,\n} from \"./model\";\n\ninterface PillProps {\n icon: ReactNode;\n label: string;\n ariaLabel: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLButtonElement>;\n onClick: () => void;\n [aria: `aria-${string}`]: unknown;\n}\n\n/** Compact chip for the composer's action row (44 px tall on touch screens via `.tap`). */\nfunction ControlPill({ icon, label, ariaLabel, disabled, className, ...trigger }: PillProps) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n className={cn(\n \"tap inline-flex h-8 min-w-0 items-center gap-1.5 rounded-md bg-surface-2 px-2.5 text-xs font-medium text-text transition-colors hover:bg-border disabled:opacity-55\",\n className,\n )}\n {...trigger}\n >\n <span aria-hidden className=\"shrink-0 text-muted\">\n {icon}\n </span>\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n}\n\nfunction ModelList({\n session,\n searchInFooter,\n searchRef,\n onChosen,\n}: {\n session: Session;\n searchInFooter: boolean;\n searchRef: React.RefObject<HTMLInputElement | null>;\n onChosen: () => void;\n}) {\n const [models, setModels] = useState<SessionModel[] | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [changeError, setChangeError] = useState<unknown>(null);\n const [query, setQuery] = useState(\"\");\n const [pending, setPending] = useState(false);\n const [show, setShow] = useState<\"favorites\" | \"all\">(\"favorites\");\n\n const load = useCallback(() => {\n const ac = new AbortController();\n setError(null);\n codeApi.models(session.id, ac.signal).then(\n (r) => setModels(r.models),\n (e) => {\n if (!ac.signal.aborted) setError(e);\n },\n );\n return () => ac.abort();\n }, [session.id]);\n\n useEffect(() => load(), [load]);\n\n const choose = async (m: SessionModel) => {\n setPending(true);\n setChangeError(null);\n try {\n await codeApi.setModel(session.id, m.provider, m.id);\n toast.success(`Model: ${modelLabel(m)}`);\n onChosen();\n } catch (e) {\n setChangeError(e);\n } finally {\n setPending(false);\n }\n };\n\n const hasFavorites = models?.some((m) => m.scoped === true) ?? false;\n const favoritesOnly = hasFavorites && show === \"favorites\";\n const pool = models && favoritesOnly ? favoriteModels(models, session.model ?? null) : models;\n const groups = pool ? groupModels(pool, query) : [];\n const search = (\n <TextInput\n ref={searchRef}\n placeholder=\"Search models\"\n aria-label=\"Search models\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n );\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n {!searchInFooter && search}\n {hasFavorites && (\n <SegmentedControl\n label=\"Show\"\n value={show}\n onChange={setShow}\n options={[\n { value: \"favorites\", label: \"Favorites\" },\n { value: \"all\", label: \"All\" },\n ]}\n />\n )}\n {changeError != null && <ErrorState compact title=\"Could not change\" error={changeError} />}\n <div className=\"flex max-h-[60vh] min-w-0 flex-col gap-3 overflow-y-auto\">\n {error != null ? (\n <ErrorState title=\"Could not load models\" error={error} onRetry={load} />\n ) : !models ? (\n <LoadingState label=\"Loading models…\" />\n ) : groups.length === 0 ? (\n favoritesOnly ? (\n <div className=\"flex flex-col items-start gap-2\">\n <p className=\"text-sm text-muted\">No favorites match</p>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setShow(\"all\")}>\n Search all models\n </Button>\n </div>\n ) : (\n <p className=\"text-sm text-muted\">No models match</p>\n )\n ) : (\n groups.map((g) => (\n <section key={g.provider} className=\"flex flex-col gap-1\">\n <h3 className=\"text-xs font-medium text-muted\">{g.provider}</h3>\n {g.models.map((m) => {\n const current = session.model?.provider === m.provider && session.model.id === m.id;\n return (\n <button\n key={m.id}\n type=\"button\"\n disabled={pending}\n aria-current={current ? \"true\" : undefined}\n onClick={() => void choose(m)}\n className=\"tap flex min-h-11 min-w-0 items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm hover:bg-surface-2 disabled:opacity-55\"\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{modelLabel(m)}</span>\n <span className=\"block truncate font-mono text-xs text-muted\">\n {m.provider}/{m.id}\n {m.contextWindow !== null &&\n ` · ${Math.round(m.contextWindow / 1000)}k context`}\n </span>\n </span>\n {current && <Check aria-hidden className=\"size-4\" />}\n </button>\n );\n })}\n </section>\n ))\n )}\n </div>\n {searchInFooter && <div className=\"sticky bottom-0 bg-surface pt-2\">{search}</div>}\n </div>\n );\n}\n\nexport function ModelControl({\n session,\n enabled,\n mobile,\n open,\n onOpenChange,\n}: {\n session: Session;\n enabled: boolean;\n mobile: boolean;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const searchRef = useRef<HTMLInputElement>(null);\n const m = session.model;\n if (!m) return null;\n const label = pillModelLabel(m);\n const ariaLabel = enabled ? `Model: ${label}. Change model` : `Model: ${label}`;\n const list = (footer: boolean) => (\n <ModelList\n session={session}\n searchInFooter={footer}\n searchRef={searchRef}\n onChosen={() => onOpenChange(false)}\n />\n );\n if (mobile) {\n return (\n <>\n <ControlPill\n className=\"max-w-[60vw]\"\n icon={<Cpu className=\"size-3.5\" />}\n label={label}\n ariaLabel={ariaLabel}\n disabled={!enabled}\n onClick={() => onOpenChange(true)}\n />\n <Sheet open={open} onClose={() => onOpenChange(false)} title=\"Model\">\n {list(true)}\n </Sheet>\n </>\n );\n }\n return (\n <Popover\n open={open}\n onOpenChange={onOpenChange}\n side=\"top\"\n align=\"start\"\n label=\"Model\"\n className=\"w-96\"\n initialFocus={searchRef}\n trigger={(p) => (\n <ControlPill\n {...p}\n className=\"max-w-64\"\n icon={<Cpu className=\"size-3.5\" />}\n label={label}\n ariaLabel={ariaLabel}\n disabled={!enabled}\n />\n )}\n >\n {list(false)}\n </Popover>\n );\n}\n\nfunction useEffortDraft(session: Session) {\n const levels = session.model?.thinkingLevels ?? [];\n const server = session.thinking ?? levels[0] ?? \"off\";\n const [draft, setDraft] = useState<string>(server);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latest = useRef({ draft, session });\n latest.current = { draft, session };\n\n const commit = useCallback((l: string) => {\n const s = latest.current.session;\n if (l === s.thinking) return;\n codeApi.setThinking(s.id, l as ThinkingLevel).catch((e) => {\n toast.error(errorMessage(e));\n setDraft(s.thinking ?? s.model?.thinkingLevels[0] ?? \"off\");\n });\n }, []);\n\n const flush = useCallback(() => {\n if (timer.current === null) return;\n clearTimeout(timer.current);\n timer.current = null;\n commit(latest.current.draft);\n }, [commit]);\n\n const setLevel = (l: string) => {\n setDraft(l);\n if (timer.current !== null) clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n timer.current = null;\n commit(l);\n }, 400);\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: follow the server unless a change is pending\n useEffect(() => {\n if (timer.current === null) setDraft(server);\n }, [session.thinking, session.model?.id]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: flush once on unmount\n useEffect(() => flush, []);\n\n return { level: draft, setLevel, flush };\n}\n\nfunction EffortSlider({\n levels,\n level,\n onChange,\n large,\n}: {\n levels: readonly string[];\n level: string;\n onChange: (l: string) => void;\n large: boolean;\n}) {\n const index = effortIndex(levels, level);\n const last = Math.max(levels.length - 1, 1);\n // Dots sit where the (invisible, 16 px) native thumb's centre travels: 8 px in from each edge.\n const at = (i: number) => `calc(8px + (100% - 16px) * ${i / last})`;\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-xs text-muted\">Effort</span>\n <span className=\"text-sm font-medium capitalize\">{level}</span>\n </div>\n <div className={cn(\"group relative w-full\", large ? \"h-11\" : \"h-8\")}>\n <div className=\"pointer-events-none absolute inset-x-2 top-1/2 h-0.5 -translate-y-1/2 rounded-full bg-border-strong\" />\n <div\n className=\"pointer-events-none absolute left-2 top-1/2 h-0.5 -translate-y-1/2 rounded-full bg-accent transition-[width]\"\n style={{ width: `calc((100% - 16px) * ${index / last})` }}\n />\n {levels.map((l, i) => (\n <span\n key={l}\n aria-hidden\n data-effort-dot={i === index ? \"selected\" : undefined}\n className={cn(\n \"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full transition-all\",\n i === index\n ? \"size-4 bg-accent ring-4 ring-accent-soft group-has-[input:focus-visible]:outline-2 group-has-[input:focus-visible]:outline-offset-2 group-has-[input:focus-visible]:outline-accent\"\n : i < index\n ? \"size-2.5 bg-accent\"\n : \"size-2.5 bg-border-strong\",\n )}\n style={{ left: at(i) }}\n />\n ))}\n <input\n type=\"range\"\n min={0}\n max={levels.length - 1}\n step={1}\n value={index}\n onChange={(e) => onChange(levels[Number(e.target.value)]!)}\n aria-label=\"Effort\"\n aria-valuetext={level}\n className=\"peer absolute inset-0 m-0 h-full w-full cursor-pointer appearance-none bg-transparent opacity-0 [&::-moz-range-thumb]:size-4 [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:appearance-none\"\n />\n </div>\n <div className=\"relative h-4 text-[11px] text-muted\">\n {levels.map((l, i) => (\n <span\n key={l}\n className={cn(\n \"absolute top-0 -translate-x-1/2 whitespace-nowrap\",\n i === index && \"font-medium text-text\",\n )}\n style={{ left: at(i) }}\n >\n {l}\n </span>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted\">Applies from the next turn.</p>\n </div>\n );\n}\n\nexport function EffortControl({\n session,\n enabled,\n mobile,\n}: {\n session: Session;\n enabled: boolean;\n mobile: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const draft = useEffortDraft(session);\n const levels = session.model?.thinkingLevels ?? [];\n if (!session.model || levels.length <= 1) return null;\n const change = (o: boolean) => {\n if (!o) draft.flush();\n setOpen(o);\n };\n const pill = {\n icon: <Brain className=\"size-3.5\" />,\n label: draft.level,\n ariaLabel: `Effort: ${draft.level}`,\n disabled: !enabled,\n className: \"shrink-0 capitalize\",\n };\n return (\n <Popover\n open={open}\n onOpenChange={change}\n side=\"top\"\n align=\"start\"\n label=\"Effort\"\n className=\"w-72\"\n fitViewport={mobile}\n trigger={(p) => <ControlPill {...p} {...pill} />}\n >\n <EffortSlider levels={levels} level={draft.level} onChange={draft.setLevel} large={mobile} />\n </Popover>\n );\n}\n\nexport function ContextMeter({ session, enabled }: { session: Session; enabled: boolean }) {\n const meter = contextMeter(session);\n if (!meter) return null;\n const busy = isBusy(session);\n const hint = !enabled\n ? \"The session is not running\"\n : session.compacting\n ? \"Compaction is running\"\n : busy\n ? \"Wait for the run to finish\"\n : undefined;\n const items: (MenuItem | { id: string; heading: string })[] = [\n { id: \"detail\", heading: meter.detail },\n {\n id: \"compact\",\n label: \"Compact now\",\n icon: <Shrink className=\"size-4\" />,\n disabled: !!hint,\n hint,\n onSelect: () => {\n codeApi.compact(session.id).then(\n () => toast.success(\"Compacting context\"),\n (e) => toast.error(errorMessage(e)),\n );\n },\n },\n ];\n const fill = { danger: \"bg-danger\", warning: \"bg-warning\", muted: \"bg-subtle\" }[meter.tone];\n return (\n <Menu\n side=\"top\"\n align=\"start\"\n label=\"Context\"\n items={items}\n className=\"w-full\"\n trigger={(p) => (\n <button\n type=\"button\"\n {...p}\n aria-label={\n session.compacting\n ? \"Context compacting\"\n : meter.percent === null\n ? \"Context use not known yet\"\n : `Context ${meter.label} used`\n }\n title={\n session.compacting ? meter.detail : `Context ${meter.label} used · ${meter.detail}`\n }\n className=\"relative flex w-full items-center gap-2 py-0.5 text-[11px] leading-4 text-muted transition-colors before:absolute before:inset-x-0 before:-top-3 before:bottom-0 before:content-[''] hover:text-text [@media(pointer:coarse)]:before:-top-6\"\n >\n <span className=\"h-[3px] flex-1 overflow-hidden rounded-full bg-surface-2\">\n <span\n className={cn(\"block h-full rounded-full transition-[width]\", fill)}\n style={{ width: `${Math.min(100, meter.percent ?? 0)}%` }}\n />\n </span>\n <span className=\"tabular-nums\">\n {session.compacting ? meter.label : `Context ${meter.label}`}\n </span>\n </button>\n )}\n />\n );\n}\n","import type { ImportableSession, Session, TreeRow } from \"@switchyard/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { Badge } from \"../../components/ui/Badge\";\nimport { Dialog, Sheet } from \"../../components/ui/Overlay\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { cn } from \"../../lib/cn\";\nimport { formatRelative } from \"../../lib/time\";\nimport { errorMessage } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\n\nfunction Surface({\n mobile,\n ...props\n}: {\n mobile: boolean;\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n}) {\n return mobile ? <Sheet {...props} /> : <Dialog {...props} />;\n}\n\nexport interface TreeDialogProps {\n session: Session;\n mode: \"tree\" | \"fork\";\n open: boolean;\n mobile: boolean;\n onClose: () => void;\n onPick: (entryId: string) => void;\n}\n\n/** Pick a point in the conversation to start a new session from. */\nexport function TreeDialog({ session, mode, open, mobile, onClose, onPick }: TreeDialogProps) {\n const [rows, setRows] = useState<TreeRow[] | null>(null);\n const [error, setError] = useState<unknown>(null);\n useEffect(() => {\n if (!open) return;\n setRows(null);\n setError(null);\n let live = true;\n codeApi.tree(session.id).then(\n (r) => live && setRows(r.rows),\n (e) => live && setError(e),\n );\n return () => {\n live = false;\n };\n }, [open, session.id]);\n const shown =\n rows === null\n ? []\n : mode === \"fork\"\n ? rows.filter((r) => r.role === \"user\" && r.activeBranch).reverse()\n : rows;\n return (\n <Surface\n mobile={mobile}\n open={open}\n onClose={onClose}\n title={mode === \"fork\" ? \"Fork from a message\" : \"Start a new session from…\"}\n >\n {error !== null ? (\n <ErrorState compact title=\"Could not load the conversation\" error={errorMessage(error)} />\n ) : rows === null ? (\n <p className=\"text-sm text-muted\">Loading…</p>\n ) : shown.length === 0 ? (\n <p className=\"text-sm text-muted\">Nothing to branch from yet</p>\n ) : (\n <ul className=\"flex max-h-[60vh] flex-col gap-1 overflow-y-auto\">\n {shown.map((r) => (\n <li key={r.entryId} style={{ paddingLeft: `${Math.min(r.depth, 8) * 12}px` }}>\n <button\n type=\"button\"\n onClick={() => onPick(r.entryId)}\n className={cn(\n \"flex w-full min-w-0 items-start gap-2 rounded-md border-l-2 px-2 py-1.5 text-left text-sm hover:bg-surface-2\",\n r.activeBranch ? \"border-accent\" : \"border-transparent\",\n )}\n >\n <span className=\"w-8 shrink-0 text-xs text-muted\">\n {r.role === \"user\" ? \"You\" : \"Pi\"}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{r.text || \"(empty)\"}</span>\n {r.label && <Badge>{r.label}</Badge>}\n {r.leaf && <Badge>current</Badge>}\n </button>\n </li>\n ))}\n </ul>\n )}\n </Surface>\n );\n}\n\nexport interface ResumeDialogProps {\n session: Session;\n open: boolean;\n mobile: boolean;\n onClose: () => void;\n onOpen: (sessionId: string) => void;\n}\n\ntype Row = ImportableSession & { importedSessionId: string | null };\n\n/** Open another Pi session from this folder, importing it when needed. */\nexport function ResumeDialog({ session, open, mobile, onClose, onOpen }: ResumeDialogProps) {\n const [rows, setRows] = useState<Row[] | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [busy, setBusy] = useState(false);\n useEffect(() => {\n if (!open) return;\n setRows(null);\n setError(null);\n let live = true;\n codeApi.importable(session.hostId).then(\n (r) => live && setRows(r),\n (e) => live && setError(e),\n );\n return () => {\n live = false;\n };\n }, [open, session.hostId]);\n const list = (rows ?? [])\n .filter((r) => r.cwd === session.cwd && r.sessionFile !== session.nativeHandle?.sessionFile)\n .sort((a, b) => String(b.mtime).localeCompare(String(a.mtime)));\n const choose = async (r: Row) => {\n try {\n if (r.importedSessionId) {\n onOpen(r.importedSessionId);\n return;\n }\n setBusy(true);\n const s = await codeApi.importSession(session.hostId, r.sessionFile, session.projectId);\n useSyncStore.getState().upsertSessionIfMissing(s);\n onOpen(s.id);\n } catch (e) {\n setError(e);\n } finally {\n setBusy(false);\n }\n };\n return (\n <Surface mobile={mobile} open={open} onClose={onClose} title=\"Open another Pi session\">\n {error !== null ? (\n <ErrorState compact title=\"Could not open it\" error={errorMessage(error)} />\n ) : rows === null ? (\n <p className=\"text-sm text-muted\">Loading…</p>\n ) : list.length === 0 ? (\n <p className=\"text-sm text-muted\">No other Pi sessions in this folder</p>\n ) : (\n <ul className=\"flex max-h-[60vh] flex-col gap-1 overflow-y-auto\">\n {list.map((r) => {\n const usable = r.importedSessionId !== null || r.inactive;\n return (\n <li key={r.sessionFile}>\n <button\n type=\"button\"\n disabled={!usable || busy}\n onClick={() => void choose(r)}\n className=\"flex w-full min-w-0 flex-col rounded-md px-2 py-1.5 text-left text-sm hover:bg-surface-2 disabled:opacity-60\"\n >\n <span className=\"truncate\">{r.name ?? r.sessionId}</span>\n <span className=\"text-xs text-muted\">\n {formatRelative(r.mtime)}\n {!usable && \" · Open in Pi; close it there to import\"}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </Surface>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { Badge } from \"../../components/ui/Badge\";\nimport { cn } from \"../../lib/cn\";\nimport type { CommandEntry, CommandSource } from \"./model\";\n\nconst SOURCE_LABEL: Record<CommandSource, string> = {\n switchyard: \"Switchyard\",\n extension: \"Extension\",\n prompt: \"Prompt\",\n skill: \"Skill\",\n terminal: \"Terminal only\",\n};\n\nexport interface SlashPickerProps {\n id: string;\n entries: CommandEntry[];\n active: number;\n onPick: (entry: CommandEntry) => void;\n onHover?: (index: number) => void;\n status?: string | null;\n className?: string;\n}\n\nexport interface SlashCompletionsProps {\n id: string;\n items: { value: string; label: string; description: string | null }[];\n active: number;\n onPick: (value: string) => void;\n onHover?: (index: number) => void;\n className?: string;\n}\n\n/** Listbox of argument completions for the command being typed. */\nexport function SlashCompletions({\n id,\n items,\n active,\n onPick,\n onHover,\n className,\n}: SlashCompletionsProps) {\n return (\n <div className={className}>\n <div\n role=\"listbox\"\n id={id}\n aria-label=\"Arguments\"\n data-testid=\"arg-completions\"\n className=\"max-h-72 overflow-y-auto\"\n >\n {items.map((e, i) => (\n <div\n key={e.value}\n role=\"option\"\n id={`${id}-${i}`}\n aria-selected={i === active}\n tabIndex={-1}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1.5 text-sm\",\n i === active && \"bg-surface-2\",\n )}\n onMouseDown={(ev) => ev.preventDefault()}\n onClick={() => onPick(e.value)}\n onKeyDown={() => undefined}\n onMouseEnter={() => onHover?.(i)}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"font-mono\">{e.label}</span>\n {e.description && (\n <span className=\"truncate text-xs text-muted\">{e.description}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n/** Listbox of slash commands; the textarea keeps focus and drives `active`. */\nexport function SlashPicker({\n id,\n entries,\n active,\n onPick,\n onHover,\n status,\n className,\n}: SlashPickerProps) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n ref.current\n ?.querySelector<HTMLElement>(`[id=\"${id}-${active}\"]`)\n ?.scrollIntoView?.({ block: \"nearest\" });\n }, [active, id]);\n return (\n <div className={className}>\n <div\n ref={ref}\n role=\"listbox\"\n id={id}\n aria-label=\"Commands\"\n className=\"max-h-72 overflow-y-auto\"\n >\n {entries.map((e, i) => (\n <div\n key={`${e.source}:${e.name}`}\n role=\"option\"\n id={`${id}-${i}`}\n aria-selected={i === active}\n aria-disabled={e.source === \"terminal\" ? true : undefined}\n tabIndex={-1}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1.5 text-sm\",\n i === active && \"bg-surface-2\",\n e.source === \"terminal\" && \"opacity-60\",\n )}\n onMouseDown={(ev) => ev.preventDefault()}\n onClick={() => onPick(e)}\n onKeyDown={() => undefined}\n onMouseEnter={() => onHover?.(i)}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"font-mono\">/{e.name}</span>\n {e.argumentHint && <span className=\"text-muted\">{e.argumentHint}</span>}\n <Badge className=\"ml-auto\">{SOURCE_LABEL[e.source]}</Badge>\n </div>\n {e.description && <div className=\"truncate text-xs text-muted\">{e.description}</div>}\n </div>\n ))}\n </div>\n {status && <p className=\"px-2 py-1 text-xs text-muted\">{status}</p>}\n </div>\n );\n}\n","import type { CompletionItem } from \"@switchyard/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { codeApi } from \"./api\";\nimport { completionEligible } from \"./model\";\n\ninterface State {\n for: string;\n items: CompletionItem[];\n prefix: string;\n}\nconst EMPTY: State = { for: \"\", items: [], prefix: \"\" };\n\n/** Pi's argument completions for `/command arg`, debounced; empty when unavailable. */\nexport function useArgumentCompletions(\n sessionId: string,\n draft: string,\n enabled: boolean,\n): { items: CompletionItem[]; prefix: string } {\n const [state, setState] = useState<State>(EMPTY);\n useEffect(() => {\n if (!enabled || !completionEligible(draft)) {\n setState(EMPTY);\n return;\n }\n const ac = new AbortController();\n const timer = setTimeout(() => {\n codeApi\n .complete(sessionId, draft, ac.signal)\n .then((r) => {\n if (!ac.signal.aborted) setState({ for: draft, items: r.items, prefix: r.prefix });\n })\n .catch(() => {\n if (!ac.signal.aborted) setState(EMPTY);\n });\n }, 150);\n return () => {\n clearTimeout(timer);\n ac.abort();\n };\n }, [sessionId, draft, enabled]);\n if (state.for !== draft) return { items: [], prefix: \"\" };\n return { items: state.items.filter((i) => i.value !== state.prefix), prefix: state.prefix };\n}\n","import type { SlashCommand } from \"@switchyard/protocol\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { codeApi } from \"./api\";\n\nconst CACHE = new Map<string, { at: number; commands: SlashCommand[] }>();\nconst STALE_MS = 30_000;\n\n/** Pi's slash commands for a session, cached for 30 s. */\nexport function useSessionCommands(\n sessionId: string,\n enabled: boolean,\n): { commands: SlashCommand[]; loading: boolean; error: unknown; refresh: () => void } {\n const [commands, setCommands] = useState<SlashCommand[]>(CACHE.get(sessionId)?.commands ?? []);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const abort = useRef<AbortController | null>(null);\n\n const load = useCallback(() => {\n // Per-session state first: never show another session's commands, loading flag or error.\n const hit = CACHE.get(sessionId);\n setCommands(hit?.commands ?? []);\n setError(null);\n setLoading(false);\n abort.current?.abort();\n if (!enabled) return;\n if (hit && Date.now() - hit.at < STALE_MS) return;\n const ac = new AbortController();\n abort.current = ac;\n setLoading(true);\n codeApi\n .commands(sessionId, ac.signal)\n .then((r) => {\n if (ac.signal.aborted) return;\n CACHE.set(sessionId, { at: Date.now(), commands: r.commands });\n setCommands(r.commands);\n })\n .catch((e) => {\n if (!ac.signal.aborted) setError(e);\n })\n .finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n }, [sessionId, enabled]);\n\n useEffect(() => {\n load();\n return () => abort.current?.abort();\n }, [load]);\n\n return { commands, loading, error, refresh: load };\n}\n","import type { CommandView, Session } from \"@switchyard/protocol\";\nimport {\n Camera,\n ImagePlus,\n ListPlus,\n Navigation,\n Paperclip,\n SendHorizontal,\n Slash,\n X,\n} from \"lucide-react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { useHideBottomNav } from \"../../app/chrome\";\nimport { Button } from \"../../components/ui/Button\";\nimport { copyText } from \"../../components/ui/Copy\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Dialog, Sheet } from \"../../components/ui/Overlay\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { TextArea } from \"../../components/ui/TextArea\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { setDraftNow } from \"../../drafts\";\nimport { cn } from \"../../lib/cn\";\nimport { usePrefs } from \"../../prefs\";\nimport { errorMessage } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\nimport { codeApi, type PromptMode } from \"./api\";\nimport { CommandViewDrawer } from \"./CommandViewDrawer\";\nimport type { SessionContext } from \"./hooks\";\nimport {\n activeArgumentHint,\n applyCompletion,\n CLIENT_COMMANDS,\n type CommandEntry,\n clientCommandProblem,\n composerBlockReason,\n filterCommands,\n type ImageAttachment,\n isBusy,\n mergeCommands,\n modelSummary,\n parseClientCommand,\n piControlsAvailable,\n readImageFile,\n SUBAGENT_READ_ONLY,\n sendModes,\n} from \"./model\";\nimport { ContextMeter, EffortControl, ModelControl } from \"./PiControls\";\nimport { ResumeDialog, TreeDialog } from \"./SessionCommandDialogs\";\nimport { SessionInfoDialog } from \"./SessionInfoDialog\";\nimport { SlashCompletions, SlashPicker } from \"./SlashPicker\";\nimport { rememberInitialPrompt } from \"./startingPrompts\";\nimport { useArgumentCompletions } from \"./useArgumentCompletions\";\nimport { useSessionCommands } from \"./useSessionCommands\";\n\nexport interface ComposerProps {\n ctx: SessionContext;\n draft: string;\n setDraft: (t: string) => void;\n clearDraft: () => void;\n mobile: boolean;\n className?: string;\n}\n\nconst AUTOMATION_WARNING = \"Automation is active; take over to stop automatic continuations\";\n\n/**\n * Multiline composer. Desktop: Enter sends, Shift+Enter is a newline\n * (configurable). Mobile: Return is a newline and Send is explicit. While Pi is\n * running it offers \"Steer\" (only when the runtime supports it) and \"Queue\n * follow-up\". The draft is cleared only after the coordinator acknowledged.\n */\nexport function Composer({ ctx, draft, setDraft, clearDraft, mobile, className }: ComposerProps) {\n const { session, host } = ctx;\n const sendWithEnter = usePrefs((s) => s.sendWithEnter);\n const [attachments, setAttachments] = useState<ImageAttachment[]>([]);\n const [busy, setBusy] = useState<PromptMode | null>(null);\n const [error, setError] = useState<{ error: unknown; mode: PromptMode } | null>(null);\n const [focused, setFocused] = useState(false);\n const [attachSheet, setAttachSheet] = useState(false);\n const [commandSheet, setCommandSheet] = useState(false);\n const CommandSurface = mobile ? Sheet : Dialog;\n const [slashDismissed, setSlashDismissed] = useState(false);\n const [active, setActive] = useState(0);\n const [modelPickerOpen, setModelPickerOpen] = useState(false);\n const [view, setView] = useState<CommandView | null>(null);\n const [viewBusy, setViewBusy] = useState(false);\n const [dialogKind, setDialogKind] = useState<null | \"tree\" | \"fork\" | \"resume\" | \"info\">(null);\n const navigate = useNavigate();\n const textRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const cameraRef = useRef<HTMLInputElement>(null);\n const hintId = useId();\n useHideBottomNav(mobile && focused);\n\n // Attachments and errors belong to one session.\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset when the session changes\n useEffect(() => {\n setAttachments([]);\n setError(null);\n }, [session.id]);\n\n const block = composerBlockReason({ session, hostLink: ctx.link, hostName: ctx.hostName });\n const modes = sendModes(session, host?.capabilities);\n const running = isBusy(session);\n const text = draft.trim();\n const noText = !text;\n const slashOpen = !mobile && !slashDismissed && /^\\/\\S*$/.test(draft) && focused;\n const controls = piControlsAvailable(host, block);\n const {\n commands,\n error: cmdError,\n loading: cmdLoading,\n refresh,\n } = useSessionCommands(session.id, controls);\n const entries = controls ? mergeCommands(CLIENT_COMMANDS, commands) : [];\n const [argsDismissed, setArgsDismissed] = useState(false);\n const completions = useArgumentCompletions(session.id, draft, controls && focused && !slashOpen);\n const completing = completions.items.length > 0 && !argsDismissed;\n const argHint = controls && !slashOpen && !completing ? activeArgumentHint(draft, entries) : null;\n const applyItem = (v: string) => {\n setDraft(applyCompletion(draft, completions.prefix, v));\n textRef.current?.focus();\n };\n const shown = slashOpen ? filterCommands(entries, draft.slice(1)) : [];\n const clientCmd = controls ? parseClientCommand(text) : null;\n const commandProblem = clientCmd\n ? clientCommandProblem(clientCmd, running, !!session.nativeHandle)\n : null;\n const openSession = (id: string) => navigate(`/code/${encodeURIComponent(id)}`);\n const startNew = async (prompt: string): Promise<Session> => {\n if (!session.projectId || !session.workspaceId) {\n throw new Error(\"This session has no project workspace\");\n }\n const s = await codeApi.createSession({\n projectId: session.projectId,\n workspace: { existingId: session.workspaceId },\n prompt,\n });\n useSyncStore.getState().upsertSessionIfMissing(s);\n if (prompt) rememberInitialPrompt(s.id, prompt);\n return s;\n };\n const afterBranch = async (r: { session: Session | null; prefill: string | null }) => {\n if (r.session) {\n useSyncStore.getState().upsertSessionIfMissing(r.session);\n if (r.prefill) setDraftNow(r.session.id, r.prefill);\n void codeApi.resume(r.session.id).catch(() => {});\n openSession(r.session.id);\n return;\n }\n const s = await startNew(\"\");\n setDraftNow(s.id, r.prefill ?? \"\");\n openSession(s.id);\n };\n const runViewCommand = async (command: string) => {\n setViewBusy(true);\n try {\n const r = await codeApi.prompt(session.id, { text: command, mode: \"prompt\" });\n if (r?.result?.view) setView(r.result.view);\n else {\n setView(null);\n toast.success(`Ran ${command}`);\n }\n } catch (e) {\n toast.error(errorMessage(e));\n } finally {\n setViewBusy(false);\n }\n };\n const pickBranch = async (entryId: string) => {\n const fork = dialogKind === \"fork\";\n setDialogKind(null);\n try {\n await afterBranch(await codeApi.branch(session.id, entryId, fork));\n } catch (e) {\n toast.error(errorMessage(e));\n }\n };\n const pick = (e: CommandEntry) => {\n setDraft(`/${e.name} `);\n textRef.current?.focus();\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset the highlight as the draft changes\n useEffect(() => {\n setActive(0);\n setArgsDismissed(false);\n }, [draft]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: refresh when the picker opens\n useEffect(() => {\n if (slashOpen || commandSheet) refresh();\n }, [slashOpen, commandSheet]);\n\n const send = async (mode: PromptMode) => {\n if (block || noText || busy || commandProblem) return;\n const sent = draft;\n setBusy(mode);\n setError(null);\n try {\n if (clientCmd) {\n await runClientCommand(clientCmd);\n if (textRef.current?.value === sent) clearDraft();\n setSlashDismissed(false);\n return;\n }\n const res = await codeApi.prompt(session.id, {\n text,\n mode,\n images: attachments.map((a) => ({ mimeType: a.mimeType, data: a.data })),\n clientMessageId: `cm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`,\n });\n // Keep anything typed while sending.\n if (textRef.current?.value === sent) clearDraft();\n setAttachments([]);\n setSlashDismissed(false);\n if (res?.result?.view) setView(res.result.view);\n if (res?.automationActive) toast.info(AUTOMATION_WARNING);\n else if (mode === \"followUp\") toast.success(\"Follow-up queued\");\n else if (mode === \"steer\") toast.success(\"Steering message sent\");\n } catch (e) {\n setError({ error: e, mode });\n } finally {\n setBusy(null);\n }\n };\n\n const runClientCommand = async (cmd: NonNullable<typeof clientCmd>) => {\n switch (cmd.kind) {\n case \"model-picker\":\n setModelPickerOpen(true);\n return;\n case \"model\":\n await codeApi.setModel(session.id, cmd.provider, cmd.modelId);\n toast.success(`Model: ${cmd.provider}/${cmd.modelId}`);\n return;\n case \"thinking\":\n await codeApi.setThinking(session.id, cmd.level);\n toast.success(`Effort: ${cmd.level}`);\n return;\n case \"compact\":\n await codeApi.compact(session.id, cmd.instructions);\n toast.success(\"Compacting context\");\n return;\n case \"name\":\n await codeApi.rename(session.id, cmd.title);\n toast.success(\"Session renamed\");\n return;\n case \"new\":\n openSession((await startNew(cmd.prompt)).id);\n return;\n case \"fork\":\n setDialogKind(\"fork\");\n return;\n case \"tree\":\n setDialogKind(\"tree\");\n return;\n case \"resume\":\n setDialogKind(\"resume\");\n return;\n case \"clone\":\n await afterBranch(await codeApi.branch(session.id, null, false));\n return;\n case \"reload\":\n await codeApi.reload(session.id);\n toast.success(\"Reloading Pi…\");\n return;\n case \"export\": {\n const f = await codeApi.exportFile(session.id);\n const url = URL.createObjectURL(new Blob([f.content], { type: \"application/x-ndjson\" }));\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = f.fileName;\n a.click();\n URL.revokeObjectURL(url);\n return;\n }\n case \"session\":\n setDialogKind(\"info\");\n return;\n case \"copy\":\n if (session.lastAssistantText) {\n await copyText(session.lastAssistantText, \"Copied the last reply\");\n } else toast.info(\"No reply to copy yet\");\n return;\n default:\n return;\n }\n };\n\n const primaryMode: PromptMode | null = modes.prompt\n ? \"prompt\"\n : modes.followUp\n ? \"followUp\"\n : modes.steer\n ? \"steer\"\n : null;\n\n const addFiles = async (files: FileList | File[] | null) => {\n if (!files) return;\n for (const f of Array.from(files)) {\n try {\n const a = await readImageFile(f);\n setAttachments((prev) => [...prev, a]);\n } catch (e) {\n toast.error(errorMessage(e));\n }\n }\n };\n\n const sendReason = block\n ? block.reason\n : commandProblem\n ? commandProblem\n : running && !primaryMode\n ? \"Pi is running and this runtime cannot queue messages; wait or stop the session\"\n : noText && attachments.length > 0\n ? \"Add a message to send with the images\"\n : null;\n\n // Mobile: send on touchend and suppress the synthetic click. Losing focus first would bring the\n // bottom nav back and move the button from under the finger. Then blur, so the keyboard closes\n // after sending.\n const touchStart = useRef<{ x: number; y: number } | null>(null);\n const tapToSend = (mode: PromptMode, enabled: boolean) =>\n mobile\n ? {\n onPointerDown: (e: React.PointerEvent) => e.preventDefault(),\n onTouchStart: (e: React.TouchEvent<HTMLButtonElement>) => {\n const t = e.touches[0];\n touchStart.current = t ? { x: t.screenX, y: t.screenY } : null;\n },\n onTouchEnd: (e: React.TouchEvent<HTMLButtonElement>) => {\n // Compare touch to touch: iOS reports client coordinates relative to the visual\n // viewport while the keyboard is up, so they cannot be compared with the button's rect.\n const start = touchStart.current;\n touchStart.current = null;\n const t = e.changedTouches[0];\n if (!start || !t) return;\n if (Math.hypot(t.screenX - start.x, t.screenY - start.y) > 12) return; // a scroll\n e.preventDefault();\n if (!enabled) return;\n void send(mode);\n textRef.current?.blur();\n },\n }\n : undefined;\n\n const pills =\n controls && session.model ? (\n <>\n <ModelControl\n session={session}\n enabled={controls}\n mobile={mobile}\n open={modelPickerOpen}\n onOpenChange={setModelPickerOpen}\n />\n <span className={cn(\"contents\", running && \"max-md:hidden\")}>\n <EffortControl session={session} enabled={controls} mobile={mobile} />\n </span>\n </>\n ) : null;\n const queued = session.queue.steering.length + session.queue.followUp.length;\n\n return (\n <section\n data-testid=\"composer\"\n aria-label=\"Composer\"\n className={cn(\n \"shrink-0 border-t border-border bg-surface px-3 pt-2 md:px-6\",\n mobile ? \"safe-pb-2\" : \"pb-2\",\n className,\n )}\n >\n <div className=\"flex w-full min-w-0 flex-col gap-2\">\n {controls && session.model && <ContextMeter session={session} enabled={controls} />}\n {queued > 0 && (\n <p className=\"text-xs text-muted\">\n {session.queue.steering.length > 0 &&\n `${session.queue.steering.length} steering message${session.queue.steering.length === 1 ? \"\" : \"s\"} pending. `}\n {session.queue.followUp.length > 0 &&\n `${session.queue.followUp.length} follow-up${session.queue.followUp.length === 1 ? \"\" : \"s\"} queued.`}\n </p>\n )}\n\n {attachments.length > 0 && (\n <ul aria-label=\"Attachments\" className=\"flex flex-wrap gap-2\">\n {attachments.map((a) => (\n <li\n key={a.id}\n className=\"relative flex items-center gap-2 rounded-md border border-border bg-surface-2 py-1 pr-1 pl-1\"\n >\n <img\n src={`data:${a.mimeType};base64,${a.data}`}\n alt=\"\"\n className=\"size-9 rounded object-cover\"\n />\n <span className=\"max-w-32 truncate text-xs\">{a.name}</span>\n <IconButton\n size=\"sm\"\n label={`Remove ${a.name}`}\n icon={<X className=\"size-3.5\" />}\n onClick={() => setAttachments((prev) => prev.filter((x) => x.id !== a.id))}\n />\n </li>\n ))}\n </ul>\n )}\n\n <div className=\"relative min-w-0\">\n {completing && (\n <SlashCompletions\n className=\"absolute bottom-full left-0 z-20 mb-1 w-full rounded-lg border border-border bg-surface p-1 shadow-pop\"\n id={`${hintId}-args`}\n items={completions.items}\n active={Math.min(active, completions.items.length - 1)}\n onPick={applyItem}\n onHover={setActive}\n />\n )}\n {slashOpen && controls && (\n <SlashPicker\n className=\"absolute bottom-full left-0 z-20 mb-1 w-full rounded-lg border border-border bg-surface p-1 shadow-pop\"\n id={`${hintId}-cmds`}\n entries={shown}\n active={active}\n onPick={pick}\n onHover={setActive}\n status={\n cmdLoading && commands.length === 0\n ? \"Loading Pi's commands…\"\n : cmdError\n ? `Pi's commands could not be loaded: ${errorMessage(cmdError)}`\n : shown.length === 0\n ? \"No matching command; Enter sends the text to Pi\"\n : null\n }\n />\n )}\n {argHint && (\n <p\n data-testid=\"command-args-hint\"\n className=\"absolute bottom-full left-0 z-10 mb-1 rounded-md bg-surface px-2 py-0.5 font-mono text-xs text-muted\"\n >\n /{argHint.name} {argHint.hint}\n </p>\n )}\n {slashOpen && !controls && (\n <SlashHint\n className=\"absolute bottom-full left-0 z-20 mb-1 w-full rounded-lg border border-border bg-surface p-3 shadow-pop\"\n onClose={() => setSlashDismissed(true)}\n />\n )}\n <label htmlFor={`${hintId}-input`} className=\"sr-only\">\n Message to Pi\n </label>\n <TextArea\n id={`${hintId}-input`}\n ref={textRef}\n value={draft}\n minRows={mobile ? 1 : 2}\n maxHeight=\"33vh\"\n disabled={session.readOnly}\n {...(slashOpen && controls\n ? {\n role: \"combobox\" as const,\n \"aria-autocomplete\": \"list\" as const,\n \"aria-expanded\": true,\n \"aria-controls\": `${hintId}-cmds`,\n \"aria-activedescendant\": shown.length ? `${hintId}-cmds-${active}` : undefined,\n }\n : {})}\n aria-describedby={sendReason ? `${hintId}-reason` : undefined}\n placeholder={\n session.readOnly\n ? SUBAGENT_READ_ONLY\n : running\n ? \"Steer Pi or queue a follow-up…\"\n : \"Message Pi… (/ for commands)\"\n }\n onChange={(e) => {\n setDraft(e.target.value);\n if (!e.target.value.startsWith(\"/\")) setSlashDismissed(false);\n }}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onPaste={(e) => {\n const files = [...e.clipboardData.files].filter((f) => f.type.startsWith(\"image/\"));\n if (files.length) {\n e.preventDefault();\n void addFiles(files);\n }\n }}\n enterKeyHint={mobile ? \"enter\" : \"send\"}\n onKeyDown={(e) => {\n if (completing) {\n const n = completions.items.length;\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((a) => (e.key === \"ArrowDown\" ? (a + 1) % n : (a - 1 + n) % n));\n return;\n }\n if (\n e.key === \"Tab\" ||\n (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing)\n ) {\n e.preventDefault();\n applyItem(completions.items[Math.min(active, n - 1)]!.value);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setArgsDismissed(true);\n return;\n }\n }\n if (slashOpen && controls && shown.length > 0) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const n = shown.length;\n setActive((a) => (e.key === \"ArrowDown\" ? (a + 1) % n : (a - 1 + n) % n));\n return;\n }\n if (\n e.key === \"Tab\" ||\n (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing)\n ) {\n e.preventDefault();\n pick(shown[Math.min(active, shown.length - 1)]!);\n return;\n }\n }\n if (e.key === \"Escape\" && slashOpen) {\n e.preventDefault();\n setSlashDismissed(true);\n return;\n }\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing || mobile) return;\n const wantsSend = sendWithEnter ? !e.shiftKey : e.metaKey || e.ctrlKey;\n if (!wantsSend) return;\n e.preventDefault();\n if (primaryMode) void send(primaryMode);\n }}\n />\n </div>\n\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n hidden\n onChange={(e) => {\n void addFiles(e.target.files);\n e.target.value = \"\";\n setAttachSheet(false);\n }}\n />\n <input\n ref={cameraRef}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n hidden\n onChange={(e) => {\n void addFiles(e.target.files);\n e.target.value = \"\";\n setAttachSheet(false);\n }}\n />\n <IconButton\n label=\"Attach images\"\n icon={<Paperclip className=\"size-4\" />}\n disabled={session.readOnly}\n onClick={() => (mobile ? setAttachSheet(true) : fileRef.current?.click())}\n />\n <IconButton\n label=\"Commands\"\n icon={<Slash className=\"size-4\" />}\n disabled={session.readOnly}\n onClick={() => {\n if (mobile) {\n setCommandSheet(true);\n return;\n }\n if (draft.trim() === \"\") {\n setDraft(\"/\");\n setSlashDismissed(false);\n textRef.current?.focus();\n return;\n }\n if (/^\\/\\S*$/.test(draft)) {\n setSlashDismissed(false);\n textRef.current?.focus();\n return;\n }\n setCommandSheet(true);\n }}\n />\n {pills ? (\n <div\n data-testid=\"session-controls\"\n className=\"flex min-w-0 flex-1 items-center gap-1 max-md:overflow-hidden\"\n >\n {pills}\n </div>\n ) : (\n <>\n <span\n className=\"hidden min-w-0 flex-1 truncate text-xs text-muted sm:inline\"\n title=\"Profile, model and effort come from the session's Pi profile (Settings › Profiles). They apply when a session starts.\"\n >\n {modelSummary(session)}\n </span>\n <span className=\"min-w-0 flex-1 sm:hidden\" />\n </>\n )}\n {!mobile && !running && (\n <span className=\"hidden text-xs text-subtle lg:inline\">\n {sendWithEnter ? \"Enter to send · Shift+Enter for newline\" : \"Ctrl+Enter to send\"}\n </span>\n )}\n {running ? (\n <>\n {modes.steer && (\n <Button\n size=\"sm\"\n className=\"shrink-0\"\n icon={<Navigation className=\"size-3.5\" />}\n busy={busy === \"steer\"}\n disabled={\n !!block || noText || !!commandProblem || (busy !== null && busy !== \"steer\")\n }\n onClick={() => void send(\"steer\")}\n {...tapToSend(\n \"steer\",\n !block && !noText && !commandProblem && (busy === null || busy === \"steer\"),\n )}\n >\n <span className=\"max-[379px]:sr-only\">Steer</span>\n </Button>\n )}\n {modes.followUp && (\n <Button\n size=\"sm\"\n variant=\"primary\"\n className=\"shrink-0\"\n icon={<ListPlus className=\"size-3.5\" />}\n busy={busy === \"followUp\"}\n disabled={\n !!block || noText || !!commandProblem || (busy !== null && busy !== \"followUp\")\n }\n onClick={() => void send(\"followUp\")}\n {...tapToSend(\n \"followUp\",\n !block && !noText && !commandProblem && (busy === null || busy === \"followUp\"),\n )}\n >\n <span className=\"max-[379px]:hidden\">Queue follow-up</span>\n <span className=\"min-[380px]:hidden\">Queue</span>\n </Button>\n )}\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"primary\"\n icon={<SendHorizontal className=\"size-3.5\" />}\n busy={busy === \"prompt\"}\n disabled={!!block || noText || !!commandProblem}\n onClick={() => void send(\"prompt\")}\n {...tapToSend(\"prompt\", !block && !noText && !commandProblem && busy === null)}\n >\n Send\n </Button>\n )}\n </div>\n {running && !modes.steer && host?.capabilities && (\n <p className=\"text-xs text-muted\">\n Immediate steering is not supported by this runtime; messages are queued as follow-ups.\n </p>\n )}\n {sendReason && !block && (\n <p id={`${hintId}-reason`} className=\"text-xs text-muted\">\n {sendReason}\n </p>\n )}\n {block && (\n <p id={`${hintId}-reason`} className=\"sr-only\">\n Sending is unavailable: {block.reason}\n </p>\n )}\n {error && (\n <ErrorState\n compact\n title=\"Message not sent. Your draft is kept.\"\n error={errorMessage(error.error)}\n onRetry={() => void send(error.mode)}\n />\n )}\n </div>\n\n <Sheet open={attachSheet} onClose={() => setAttachSheet(false)} title=\"Attach images\">\n <div className=\"flex flex-col gap-2\">\n <Button\n block\n icon={<ImagePlus className=\"size-4\" />}\n onClick={() => fileRef.current?.click()}\n >\n Choose photos\n </Button>\n <Button\n block\n icon={<Camera className=\"size-4\" />}\n onClick={() => cameraRef.current?.click()}\n >\n Take photo\n </Button>\n <p className=\"text-xs text-muted\">Images up to 10 MB are sent with your next message.</p>\n </div>\n </Sheet>\n <CommandSurface open={commandSheet} onClose={() => setCommandSheet(false)} title=\"Commands\">\n {controls ? (\n <SlashPicker\n id={`${hintId}-sheet-cmds`}\n entries={entries}\n active={-1}\n status={\n cmdLoading && commands.length === 0\n ? \"Loading Pi's commands…\"\n : cmdError\n ? `Pi's commands could not be loaded: ${errorMessage(cmdError)}`\n : null\n }\n onPick={(e) => {\n setDraft(\n draft.trim() === \"\" || draft.startsWith(\"/\")\n ? `/${e.name} `\n : `/${e.name} ${draft}`,\n );\n setCommandSheet(false);\n requestAnimationFrame(() => textRef.current?.focus());\n }}\n />\n ) : (\n <SlashHint />\n )}\n {draft.trim() === \"\" && (\n <div className=\"mt-3\">\n <Button\n block\n variant=\"primary\"\n onClick={() => {\n setDraft(\"/\");\n setCommandSheet(false);\n requestAnimationFrame(() => textRef.current?.focus());\n }}\n >\n Start a command\n </Button>\n </div>\n )}\n </CommandSurface>\n <TreeDialog\n session={session}\n mode={dialogKind === \"fork\" ? \"fork\" : \"tree\"}\n open={dialogKind === \"tree\" || dialogKind === \"fork\"}\n mobile={mobile}\n onClose={() => setDialogKind(null)}\n onPick={(id) => void pickBranch(id)}\n />\n <ResumeDialog\n session={session}\n open={dialogKind === \"resume\"}\n mobile={mobile}\n onClose={() => setDialogKind(null)}\n onOpen={(id) => {\n setDialogKind(null);\n openSession(id);\n }}\n />\n <SessionInfoDialog\n session={session}\n hostLabel={`${ctx.hostName} (${ctx.link})`}\n open={dialogKind === \"info\"}\n onClose={() => setDialogKind(null)}\n />\n <CommandViewDrawer\n view={view}\n open={!!view}\n busy={viewBusy}\n mobile={mobile}\n onClose={() => setView(null)}\n onRun={(c) => void runViewCommand(c)}\n />\n </section>\n );\n}\n\nfunction SlashHint({ onClose, className }: { onClose?: () => void; className?: string }) {\n return (\n <div role=\"note\" aria-label=\"Slash commands\" className={className}>\n <div className=\"flex items-start gap-2\">\n <p className=\"min-w-0 flex-1 text-sm\">\n Text starting with <code className=\"font-mono\">/</code> is sent to Pi as a command\n (extension commands and prompt templates). Switchyard does not list Pi's commands;\n type the command name.\n </p>\n {onClose && (\n <IconButton\n size=\"sm\"\n label=\"Close command hint\"\n icon={<X className=\"size-3.5\" />}\n onClick={onClose}\n />\n )}\n </div>\n </div>\n );\n}\n","import {\n Archive,\n ArchiveRestore,\n Bot,\n CirclePause,\n CircleX,\n Eye,\n Hand,\n type LucideIcon,\n MessageCircleQuestion,\n Play,\n ServerOff,\n Square,\n} from \"lucide-react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Spinner } from \"../../components/ui/Spinner\";\nimport { TextLink } from \"../../components/ui/TextLink\";\nimport { cn } from \"../../lib/cn\";\nimport { usePendingInteractions } from \"../../sync/store\";\nimport { type SessionContext, useNow } from \"./hooks\";\nimport { type SessionStatus, type SessionStatusAction, sessionStatus } from \"./model\";\nimport type { SessionActions } from \"./SessionActions\";\n\nconst ICON: Record<SessionStatus[\"kind\"], LucideIcon> = {\n subagent: Eye,\n archived: Archive,\n host: ServerOff,\n answer: MessageCircleQuestion,\n failed: CircleX,\n interrupted: CirclePause,\n stopped: Square,\n starting: Square,\n compacting: Square,\n automation: Bot,\n human: Hand,\n};\nconst ACTION_ICON: Record<SessionStatusAction, LucideIcon> = {\n unarchive: ArchiveRestore,\n answer: MessageCircleQuestion,\n resume: Play,\n takeover: Hand,\n return: Bot,\n};\nconst TONE = {\n neutral: { row: \"border-border-strong bg-surface-2\", icon: \"text-muted\" },\n info: { row: \"border-info bg-surface-2\", icon: \"text-info\" },\n warning: { row: \"border-warning bg-warning-soft\", icon: \"text-warning\" },\n danger: { row: \"border-danger bg-danger-soft\", icon: \"text-danger\" },\n} as const;\n\n/** The session's one status line, directly above the composer: one message, one action. */\nexport function SessionStatusBar({\n ctx,\n actions,\n onAnswer,\n}: {\n ctx: SessionContext;\n actions: SessionActions;\n onAnswer: () => void;\n}) {\n const pending = usePendingInteractions(ctx.session.id);\n const now = useNow(ctx.link === \"unreachable\", 30_000);\n const status = sessionStatus({\n session: ctx.session,\n hostLink: ctx.link,\n hostName: ctx.hostName,\n hostLastSeenAt: ctx.host?.lastSeenAt,\n control: ctx.control,\n pending,\n canResume: actions.canResume,\n now,\n });\n if (!status) return null;\n const Icon = ICON[status.kind];\n const tone = TONE[status.tone];\n const act = status.action;\n const run =\n act &&\n {\n unarchive: actions.unarchive,\n answer: onAnswer,\n resume: actions.resume,\n takeover: actions.takeover,\n return: actions.returnToAutomation,\n }[act.kind];\n const busy = act\n ? {\n unarchive: actions.busy.unarchive,\n answer: false,\n resume: actions.busy.resume,\n takeover: actions.busy.takeover,\n return: actions.busy.ret,\n }[act.kind]\n : false;\n const ActIcon = act ? ACTION_ICON[act.kind] : null;\n return (\n <div className=\"shrink-0 px-3 pb-2 md:px-6\">\n <div\n data-testid=\"session-status\"\n data-kind={status.kind}\n role={status.tone === \"danger\" ? \"alert\" : \"status\"}\n className={cn(\n \"mx-auto flex w-full max-w-[80ch] min-w-0 items-center gap-2 rounded-md border-l-2 px-3 py-1.5 text-sm\",\n tone.row,\n )}\n >\n {status.pending ? (\n <Spinner className={cn(\"size-4 shrink-0\", tone.icon)} />\n ) : (\n <Icon aria-hidden className={cn(\"size-4 shrink-0\", tone.icon)} />\n )}\n <span className=\"min-w-0 flex-1 break-words\">{status.text}</span>\n {status.link && (\n <TextLink to={status.link.to} size=\"xs\" className=\"shrink-0\">\n {status.link.label}\n </TextLink>\n )}\n {act && run && (\n <Button\n size=\"sm\"\n variant={act.kind === \"return\" ? \"secondary\" : \"primary\"}\n className=\"shrink-0\"\n icon={ActIcon ? <ActIcon className=\"size-3.5\" /> : undefined}\n busy={busy}\n onClick={run}\n >\n {act.label}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Time to catch up with whatever has arrived, whatever the burst size. */\nconst CATCH_UP_MS = 160;\n/** Floor on reveal speed, so a slow trickle still moves (chars per second). */\nconst MIN_RATE = 60;\n\n/** Reveal speed (chars per second) that clears `backlog` in about CATCH_UP_MS. */\nexport function revealRate(backlog: number): number {\n return Math.max(MIN_RATE, (backlog * 1000) / CATCH_UP_MS);\n}\n\n/** Characters shown after `dtMs` at `rate`, at least one per frame, never past the target. */\nexport function nextShownLength(shown: number, target: number, dtMs: number, rate: number): number {\n if (shown >= target) return target;\n return Math.min(target, shown + Math.max(1, Math.round((rate * dtMs) / 1000)));\n}\n\n/**\n * Streamed text revealed smoothly while `live`; the full text at once otherwise (and always\n * with reduced motion).\n */\nexport function useSmoothText(text: string, live: boolean): string {\n const calm =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true;\n const smooth = live && !calm;\n const shownRef = useRef(smooth ? 0 : text.length);\n const rateRef = useRef(0);\n const [shown, setShown] = useState(shownRef.current);\n\n useEffect(() => {\n if (!smooth) {\n shownRef.current = text.length;\n setShown(text.length);\n return;\n }\n if (shownRef.current > text.length) shownRef.current = text.length;\n // Hold one speed per burst so it drains evenly, speeding up when more arrives meanwhile.\n rateRef.current = Math.max(rateRef.current, revealRate(text.length - shownRef.current));\n let frame = 0;\n let last = performance.now();\n const tick = (now: number) => {\n const next = nextShownLength(shownRef.current, text.length, now - last, rateRef.current);\n last = now;\n if (next !== shownRef.current) {\n shownRef.current = next;\n setShown(next);\n }\n if (next < text.length) frame = requestAnimationFrame(tick);\n else rateRef.current = 0;\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [text, smooth]);\n\n return smooth ? text.slice(0, Math.min(shown, text.length)) : text;\n}\n","import type { Interaction, ToolItemData, TranscriptItem } from \"@switchyard/protocol\";\nimport {\n Bot,\n Brain,\n ChevronRight,\n CircleAlert,\n CircleCheck,\n CircleX,\n Copy,\n Info,\n LoaderCircle,\n type LucideIcon,\n Network,\n TriangleAlert,\n User,\n Wand2,\n} from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport { CodeBlock } from \"../../components/intent/CodeBlock\";\nimport { InteractionCard } from \"../../components/intent/InteractionCard\";\nimport { Markdown } from \"../../components/intent/Markdown\";\nimport { UINodeRenderer } from \"../../components/intent/UINodeRenderer\";\nimport { Button } from \"../../components/ui/Button\";\nimport { copyText } from \"../../components/ui/Copy\";\nimport { Sheet } from \"../../components/ui/Overlay\";\nimport { Spinner } from \"../../components/ui/Spinner\";\nimport { TextLink } from \"../../components/ui/TextLink\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { formatDuration, formatTime } from \"../../lib/time\";\nimport { useSmoothText } from \"../../lib/useSmoothText\";\nimport { errorMessage } from \"../../sync/api\";\nimport type { StreamBuffer } from \"../../sync/store\";\nimport { useSyncStore } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\nimport { useCodeContext } from \"./context\";\nimport { useNow } from \"./hooks\";\nimport { interactionDomId, outputPreview, stringifyArgs, type TimelineEntry } from \"./model\";\nimport { initialPromptFor } from \"./startingPrompts\";\n\nexport interface TimelineRowProps {\n entry: TimelineEntry;\n sessionId: string;\n /** Answer controls are hidden with this explanation (read-only view, host offline). */\n interactionReadOnly: string | null;\n draftEmpty: boolean;\n onUseSuggestion: (text: string) => void;\n highlightInteractionId: string | null;\n}\n\n/** One transcript entry. */\nexport function TimelineRow(props: TimelineRowProps) {\n const { entry } = props;\n if (entry.type === \"stream\") return <StreamEntry stream={entry.stream} />;\n if (entry.type === \"interaction\") {\n return (\n <InteractionEntry\n interaction={entry.interaction}\n readOnly={props.interactionReadOnly}\n highlight={props.highlightInteractionId === entry.interaction.id}\n />\n );\n }\n const { item, stream } = entry;\n switch (item.kind) {\n case \"user\":\n return <UserMessage item={item} />;\n case \"assistant\":\n return (\n <AssistantMessage\n text={item.data.text + (stream?.text ?? \"\")}\n thinking={stream?.thinking ?? \"\"}\n streaming={!!stream || item.data.streaming === true}\n />\n );\n case \"thinking\":\n return <ThinkingItem text={item.data.text + (stream?.thinking ?? \"\")} live={!!stream} />;\n case \"tool\":\n return <ToolCard data={item.data} stream={stream} sessionId={props.sessionId} />;\n case \"notice\":\n return (\n <NoticeItem level={item.data.level} text={item.data.text} repeat={entry.repeat ?? 1} />\n );\n case \"system\":\n return (\n <SystemItem\n text={item.data.text}\n suggestion={item.data.suggestion === true}\n draftEmpty={props.draftEmpty}\n onUse={props.onUseSuggestion}\n />\n );\n case \"subagent\":\n return <SubagentRow data={item.data} />;\n case \"interaction\":\n return (\n <InteractionRef\n interactionId={item.data.interactionId}\n readOnly={props.interactionReadOnly}\n highlight={props.highlightInteractionId === item.data.interactionId}\n />\n );\n }\n}\n\nfunction RowLabel({ icon: Icon, children }: { icon: LucideIcon; children: ReactNode }) {\n return (\n <div className=\"mb-1 flex items-center gap-1.5 text-xs font-medium text-muted\">\n <Icon aria-hidden className=\"size-3.5 shrink-0\" />\n {children}\n </div>\n );\n}\n\nfunction UserMessage({ item }: { item: Extract<TranscriptItem, { kind: \"user\" }> }) {\n return (\n <div className=\"min-w-0 rounded-lg border border-border bg-surface-2 px-3 py-2\">\n <RowLabel icon={User}>\n You <span className=\"font-normal text-subtle\">· {formatTime(item.at)}</span>\n </RowLabel>\n <p className=\"text-sm break-words whitespace-pre-wrap\">{item.data.text}</p>\n {item.data.images ? (\n <p className=\"mt-1 text-xs text-muted\">\n {item.data.images} image{item.data.images === 1 ? \"\" : \"s\"} attached\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction AssistantMessage({\n text,\n thinking,\n streaming,\n}: {\n text: string;\n thinking: string;\n streaming: boolean;\n}) {\n const shownText = useSmoothText(text, streaming);\n const shownThinking = useSmoothText(thinking, streaming);\n return (\n <div className=\"min-w-0 px-1\">\n <RowLabel icon={Bot}>\n Pi\n {streaming && (\n <span className=\"inline-flex items-center gap-1 font-normal\">\n <Spinner className=\"size-3\" />\n Writing…\n </span>\n )}\n </RowLabel>\n {thinking && <ThinkingItem text={shownThinking} live />}\n {text ? <Markdown text={shownText} /> : !thinking && <p className=\"text-sm text-muted\">…</p>}\n </div>\n );\n}\n\nfunction ThinkingItem({ text, live }: { text: string; live?: boolean }) {\n return (\n <details className=\"group min-w-0 rounded-md border border-border bg-surface px-3 py-1.5\">\n <summary className=\"tap flex cursor-pointer list-none items-center gap-1.5 text-xs font-medium text-muted\">\n <ChevronRight aria-hidden className=\"size-3.5 transition-transform group-open:rotate-90\" />\n <Brain aria-hidden className=\"size-3.5\" />\n {live ? \"Thinking…\" : \"Thinking\"}\n </summary>\n <p className=\"mt-1 text-xs break-words whitespace-pre-wrap text-muted\">{text}</p>\n </details>\n );\n}\n\nconst TOOL_STATUS: Record<ToolItemData[\"status\"], { label: string; icon: LucideIcon }> = {\n running: { label: \"Running\", icon: LoaderCircle },\n ok: { label: \"Done\", icon: CircleCheck },\n error: { label: \"Failed\", icon: CircleX },\n};\n\n/** Restrained tool card: name, status (icon + text), summary, elapsed, expandable args/output. */\nexport function ToolCard({\n data,\n stream,\n sessionId,\n}: {\n data: ToolItemData;\n stream: StreamBuffer | null;\n sessionId: string;\n}) {\n const { mobile, openFile } = useCodeContext();\n const [fullOutput, setFullOutput] = useState(false);\n const running = data.status === \"running\";\n const now = useNow(running);\n const elapsed =\n data.durationMs ?? (running ? Math.max(0, now - Date.parse(data.startedAt)) : null);\n const st = TOOL_STATUS[data.status];\n const Icon = st.icon;\n const args = stringifyArgs(data.args) || stream?.toolArgs || \"\";\n const output = data.output + (stream?.toolOutput ?? \"\");\n const preview = outputPreview(output);\n\n const onAction = (actionId: string) => {\n if (!data.adapterId) return;\n codeApi\n .adapterAction(sessionId, data.adapterId, actionId)\n .then(() => toast.success(\"Action sent\"))\n .catch((e) => toast.error(errorMessage(e)));\n };\n\n return (\n <article\n data-testid=\"tool-card\"\n aria-label={`Tool ${data.name}: ${st.label}`}\n className=\"min-w-0 rounded-md border border-border bg-surface\"\n >\n <header className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-0.5 px-3 py-2\">\n {running ? (\n <Spinner className=\"size-4 text-info\" />\n ) : (\n <Icon\n aria-hidden\n className={cn(\n \"size-4 shrink-0\",\n data.status === \"ok\" && \"text-success\",\n data.status === \"error\" && \"text-danger\",\n )}\n />\n )}\n <span className=\"min-w-0 truncate font-mono text-sm font-medium\">{data.name}</span>\n <span\n className={cn(\n \"text-xs\",\n data.status === \"error\" ? \"text-danger\" : running ? \"text-info\" : \"text-muted\",\n )}\n >\n {st.label}\n </span>\n {elapsed !== null && (\n <span className=\"ml-auto text-xs text-subtle tabular-nums\">\n {formatDuration(elapsed)}\n </span>\n )}\n {data.summary && (\n <p className=\"w-full min-w-0 truncate text-xs text-muted\" title={data.summary}>\n {data.summary}\n </p>\n )}\n </header>\n {data.card && (\n <div className=\"border-t border-border px-3 py-2\">\n <UINodeRenderer node={data.card} onAction={onAction} onOpenFile={openFile} />\n </div>\n )}\n {(args || output) && (\n <div className=\"flex flex-col gap-1 border-t border-border px-3 py-1.5\">\n {args && (\n <details className=\"group min-w-0\">\n <summary className=\"tap flex cursor-pointer list-none items-center gap-1 text-xs font-medium text-muted\">\n <ChevronRight\n aria-hidden\n className=\"size-3.5 transition-transform group-open:rotate-90\"\n />\n Arguments\n </summary>\n <CodeBlock text={args} className=\"mt-1\" maxHeight=\"16rem\" />\n </details>\n )}\n {output &&\n (mobile ? (\n <div className=\"min-w-0\">\n <div className=\"text-xs font-medium text-muted\">\n Output{preview.truncated ? \" (last lines)\" : \"\"}\n </div>\n <CodeBlock text={preview.text} className=\"mt-1\" />\n {preview.truncated && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setFullOutput(true)}>\n Show full output\n </Button>\n )}\n <Sheet\n open={fullOutput}\n onClose={() => setFullOutput(false)}\n title={`${data.name} output`}\n >\n <CodeBlock text={output} />\n </Sheet>\n </div>\n ) : (\n <details className=\"group min-w-0\">\n <summary className=\"tap flex cursor-pointer list-none items-center gap-1 text-xs font-medium text-muted\">\n <ChevronRight\n aria-hidden\n className=\"size-3.5 transition-transform group-open:rotate-90\"\n />\n Output\n <span className=\"font-normal text-subtle\">\n ({output.split(\"\\n\").length} lines)\n </span>\n </summary>\n <CodeBlock text={output} className=\"mt-1\" maxHeight=\"24rem\" />\n </details>\n ))}\n </div>\n )}\n </article>\n );\n}\n\nconst NOTICE_ICON = { info: Info, warning: TriangleAlert, error: CircleAlert } as const;\nconst NOTICE_LABEL = { info: \"Notice\", warning: \"Warning\", error: \"Error\" } as const;\n\nfunction NoticeItem({\n level,\n text,\n repeat,\n}: {\n level: \"info\" | \"warning\" | \"error\";\n text: string;\n repeat: number;\n}) {\n const Icon = NOTICE_ICON[level];\n return (\n <div\n role={level === \"error\" ? \"alert\" : \"note\"}\n data-testid=\"notice\"\n data-level={level}\n className={cn(\n \"flex min-w-0 items-start gap-2 border-l-2 py-0.5 pl-2 text-xs\",\n level === \"info\" && \"border-transparent text-subtle\",\n level === \"warning\" && \"border-warning text-muted\",\n level === \"error\" && \"border-danger text-text\",\n )}\n >\n <Icon\n aria-hidden\n className={cn(\n \"mt-px size-3.5 shrink-0\",\n level === \"warning\" && \"text-warning\",\n level === \"error\" && \"text-danger\",\n level === \"info\" && \"text-subtle\",\n )}\n />\n <span className=\"sr-only\">{NOTICE_LABEL[level]}: </span>\n <span\n className={cn(\n \"min-w-0 flex-1\",\n level === \"error\" ? \"break-words whitespace-pre-wrap\" : \"truncate\",\n )}\n title={text}\n >\n {text}\n </span>\n {repeat > 1 && (\n <span className=\"shrink-0 text-subtle tabular-nums\">\n <span aria-hidden>×{repeat}</span>\n <span className=\"sr-only\">(repeated {repeat} times)</span>\n </span>\n )}\n </div>\n );\n}\n\nfunction SystemItem({\n text,\n suggestion,\n draftEmpty,\n onUse,\n}: {\n text: string;\n suggestion: boolean;\n draftEmpty: boolean;\n onUse: (text: string) => void;\n}) {\n if (!suggestion) {\n return <p className=\"px-1 text-xs break-words whitespace-pre-wrap text-muted\">{text}</p>;\n }\n return (\n <div className=\"min-w-0 rounded-md border border-dashed border-border-strong px-3 py-2\">\n <RowLabel icon={Wand2}>Suggested next message</RowLabel>\n <p className=\"text-sm break-words whitespace-pre-wrap\">{text}</p>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" disabled={!draftEmpty} onClick={() => onUse(text)}>\n Use suggestion\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n icon={<Copy className=\"size-3.5\" />}\n onClick={() => void copyText(text, \"Copied\")}\n >\n Copy\n </Button>\n {!draftEmpty && (\n <span className=\"text-xs text-muted\">\n Your draft is not empty; clear it to use this suggestion.\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction SubagentRow({ data }: { data: Extract<TranscriptItem, { kind: \"subagent\" }>[\"data\"] }) {\n const linked = useSyncStore((s) =>\n data.linkedSessionId ? s.sessions[data.linkedSessionId] : undefined,\n );\n const status = data.status.toLowerCase();\n const Icon = /run|start|progress/.test(status)\n ? LoaderCircle\n : /fail|error/.test(status)\n ? CircleX\n : /done|complete|success|ok/.test(status)\n ? CircleCheck\n : Network;\n return (\n <div className=\"flex min-w-0 items-start gap-2 rounded-md border border-border bg-surface px-3 py-2\">\n {Icon === LoaderCircle ? (\n <Spinner className=\"mt-0.5 size-4 text-muted\" />\n ) : (\n <Icon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-muted\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2\">\n <span className=\"text-xs font-medium text-muted\">Subagent</span>\n <span className=\"min-w-0 truncate text-sm font-medium\">{data.label}</span>\n <span className=\"text-xs text-muted\">{data.status}</span>\n </div>\n {data.linkedSessionId ? (\n <TextLink to={`/code/${encodeURIComponent(data.linkedSessionId)}`} size=\"sm\">\n Open {linked?.title ?? \"subagent session\"}\n </TextLink>\n ) : (\n <p className=\"text-xs break-all text-muted\">\n {data.sessionFile ? `Session file: ${data.sessionFile}` : \"Session not linked yet.\"}\n </p>\n )}\n <p className=\"text-xs text-muted\">Subagent: view only. Live control is not supported.</p>\n </div>\n </div>\n );\n}\n\nfunction InteractionRef({\n interactionId,\n readOnly,\n highlight,\n}: {\n interactionId: string;\n readOnly: string | null;\n highlight: boolean;\n}) {\n const interaction = useSyncStore((s) => s.interactions[interactionId]);\n if (!interaction) {\n return (\n <p id={interactionDomId(interactionId)} className=\"px-1 text-xs text-muted\">\n Question (details not loaded yet)\n </p>\n );\n }\n return <InteractionEntry interaction={interaction} readOnly={readOnly} highlight={highlight} />;\n}\n\nfunction InteractionEntry({\n interaction,\n readOnly,\n highlight,\n}: {\n interaction: Interaction;\n readOnly: string | null;\n highlight: boolean;\n}) {\n return (\n <div\n data-testid=\"interaction-card\"\n data-interaction-id={interaction.id}\n data-state={interaction.state}\n className={cn(\n \"min-w-0 scroll-mt-16 transition-shadow\",\n highlight && \"ring-2 ring-accent ring-offset-2 ring-offset-bg\",\n )}\n >\n <InteractionCard\n id={interactionDomId(interaction.id)}\n interaction={interaction}\n readOnlyReason={\n interaction.state === \"pending\" || interaction.state === \"unsupported\" ? readOnly : null\n }\n className=\"w-full\"\n />\n </div>\n );\n}\n\nfunction StreamEntry({ stream }: { stream: StreamBuffer }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {(stream.text || stream.thinking) && (\n <AssistantMessage text={stream.text} thinking={stream.thinking} streaming />\n )}\n {(stream.toolArgs || stream.toolOutput) && (\n <div className=\"min-w-0 rounded-md border border-border bg-surface px-3 py-2\">\n <div className=\"flex items-center gap-1.5 text-xs font-medium text-muted\">\n <Spinner className=\"size-3.5\" />\n Tool running…\n </div>\n {stream.toolArgs && (\n <CodeBlock text={stream.toolArgs} className=\"mt-1\" maxHeight=\"8rem\" />\n )}\n {stream.toolOutput && (\n <CodeBlock text={outputPreview(stream.toolOutput).text} className=\"mt-1\" />\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Shown at the end of the transcript while a session's Pi is starting. */\nexport function StartingCard({\n sessionId,\n detail,\n showPrompt,\n}: {\n sessionId: string;\n detail: string | null;\n showPrompt: boolean;\n}) {\n const prompt = showPrompt ? initialPromptFor(sessionId) : null;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"starting-card\"\n className=\"flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-surface p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"size-4 text-info\" />\n <span className=\"font-medium\">Starting session</span>\n </div>\n <p className=\"text-sm text-muted\">{detail ?? \"Starting Pi…\"}</p>\n {prompt && (\n <>\n <span className=\"text-xs font-medium text-muted\">\n Your first prompt (sent when Pi is ready)\n </span>\n <div className=\"line-clamp-6 rounded-md bg-surface-2 px-3 py-2 text-sm break-words whitespace-pre-wrap\">\n {prompt}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { ArrowDown } from \"lucide-react\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { isDocumentPresentation } from \"../../components/intent/InteractionCard\";\nimport { Button } from \"../../components/ui/Button\";\nimport { ErrorState, LoadingState } from \"../../components/ui/states\";\nimport { cn } from \"../../lib/cn\";\nimport { usePendingInteractions, useStreams, useSyncStore, useTranscript } from \"../../sync/store\";\nimport { buildTimeline, countAfter, interactionDomId } from \"./model\";\nimport { StartingCard, TimelineRow } from \"./TranscriptItems\";\n\n/**\n * Center `target` inside `container` by scrolling only the container\n * (scrollIntoView would also scroll overflow-hidden ancestors of the layout).\n */\nfunction scrollWithin(container: HTMLElement, target: HTMLElement, smooth = false): void {\n const c = container.getBoundingClientRect();\n const t = target.getBoundingClientRect();\n const top = container.scrollTop + (t.top - c.top) - Math.max(0, (c.height - t.height) / 2);\n container.scrollTo({ top: Math.max(0, top), behavior: smooth ? \"smooth\" : \"auto\" });\n}\n\n/** Within this distance of the bottom the view sticks to new content. */\nexport const STICK_THRESHOLD_PX = 48;\nconst LOAD_OLDER_THRESHOLD_PX = 160;\nconst HIGHLIGHT_MS = 4000;\n/** Every row sits in one centered column so the left edge stays aligned; plans span the full width. */\nconst ROW =\n \"mx-auto w-full min-w-0 max-w-[80ch] has-[[data-testid=document-interaction]]:max-w-none\";\n\nexport interface TranscriptProps {\n sessionId: string;\n draftEmpty: boolean;\n onUseSuggestion: (text: string) => void;\n /** Answer controls hidden with this reason (read-only view, host offline). */\n interactionReadOnly: string | null;\n /** `?interaction=<id>` deep link: scroll to and highlight it once. */\n focusInteractionId: string | null;\n className?: string;\n /** Rendered under the transcript, above the composer (the session status bar). */\n footer?: (api: { openFirstPending: () => void }) => ReactNode;\n /** False while the transcript is hidden (mobile tabs); restores the scroll position when shown. */\n active?: boolean;\n}\n\n/**\n * Session transcript with scroll anchoring: it follows new content only when\n * the reader is already at the bottom; otherwise \"Jump to latest (N)\" shows\n * the unseen count and the viewport stays put. Loading older pages keeps the\n * reading position.\n */\nexport function Transcript({\n sessionId,\n draftEmpty,\n onUseSuggestion,\n interactionReadOnly,\n focusInteractionId,\n className,\n footer,\n active = true,\n}: TranscriptProps) {\n const t = useTranscript(sessionId);\n const streams = useStreams(sessionId);\n const pending = usePendingInteractions(sessionId);\n const session = useSyncStore((s) => s.sessions[sessionId]);\n const starting = session?.runtime === \"starting\";\n const loadOlder = useSyncStore((s) => s.loadOlderTranscript);\n const loadTranscript = useSyncStore((s) => s.loadTranscript);\n const entries = useMemo(\n () => buildTimeline(t.items, streams, pending),\n [t.items, streams, pending],\n );\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const savedTop = useRef(0);\n const [atBottom, setAtBottom] = useState(true);\n const [baselineKey, setBaselineKey] = useState<string | null>(null);\n const prependHeight = useRef<number | null>(null);\n const [highlight, setHighlight] = useState<string | null>(null);\n\n const lastKey = entries.length ? entries[entries.length - 1]!.key : null;\n const firstKey = entries.length ? entries[0]!.key : null;\n const streamSize = streams.reduce(\n (n, s) => n + s.text.length + s.thinking.length + s.toolArgs.length + s.toolOutput.length,\n 0,\n );\n\n // Reset per session.\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset when the session changes\n useEffect(() => {\n atBottomRef.current = true;\n setAtBottom(true);\n setBaselineKey(null);\n prependHeight.current = null;\n }, [sessionId]);\n\n const requestOlder = useCallback(() => {\n const el = scrollRef.current;\n if (!el || !t.hasMore || t.loading) return;\n prependHeight.current = el.scrollHeight;\n void loadOlder(sessionId);\n }, [t.hasMore, t.loading, loadOlder, sessionId]);\n\n const onScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n if (el.clientHeight === 0) return; // hidden tab\n savedTop.current = el.scrollTop;\n const dist = el.scrollHeight - el.scrollTop - el.clientHeight;\n const at = dist <= STICK_THRESHOLD_PX;\n if (at !== atBottomRef.current) {\n atBottomRef.current = at;\n setAtBottom(at);\n setBaselineKey(at ? null : lastKey);\n }\n if (el.scrollTop < LOAD_OLDER_THRESHOLD_PX) requestOlder();\n };\n\n // Stick to the bottom when already there; keep the reading position when older items load.\n // biome-ignore lint/correctness/useExhaustiveDependencies: runs when content changes size\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (prependHeight.current !== null) {\n const delta = el.scrollHeight - prependHeight.current;\n prependHeight.current = null;\n if (!atBottomRef.current && delta > 0) {\n el.scrollTop += delta;\n return;\n }\n }\n if (atBottomRef.current) {\n // A new plan awaiting approval: show its start (the answer bar is pinned), not its end.\n const last = entries[entries.length - 1];\n const doc =\n last?.type === \"interaction\" && isDocumentPresentation(last.interaction.presentation)\n ? el.querySelector<HTMLElement>('[data-testid=\"document-interaction\"]:last-of-type')\n : null;\n if (doc) el.scrollTop = Math.max(0, doc.offsetTop - 8);\n else el.scrollTop = el.scrollHeight;\n }\n }, [entries.length, lastKey, firstKey, streamSize, t.loaded]);\n\n // Showing the Chat tab again: back to the bottom, or to where the reader was.\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!active || !el) return;\n el.scrollTop = atBottomRef.current ? el.scrollHeight : savedTop.current;\n }, [active]);\n\n // Opening a session with a plan awaiting approval lands on the plan, once.\n const landed = useRef<string | null>(null);\n useLayoutEffect(() => {\n if (!t.loaded || landed.current === sessionId) return;\n const doc = [...pending].reverse().find((i) => isDocumentPresentation(i.presentation));\n landed.current = sessionId;\n if (!doc || focusInteractionId) return;\n const el = document.getElementById(interactionDomId(doc.id));\n if (!el || !scrollRef.current) return;\n atBottomRef.current = false;\n setAtBottom(false);\n setBaselineKey(lastKey);\n scrollRef.current.scrollTop = Math.max(0, el.offsetTop - 8);\n });\n\n // Deep link: scroll to and highlight the interaction once it is rendered.\n const handled = useRef<string | null>(null);\n const olderAttempts = useRef(0);\n useLayoutEffect(() => {\n if (!focusInteractionId || handled.current === focusInteractionId || !t.loaded) return;\n const target = document.getElementById(interactionDomId(focusInteractionId));\n if (!target) {\n // It may be in an older page: load a few pages back.\n if (t.hasMore && !t.loading && olderAttempts.current < 5) {\n olderAttempts.current++;\n requestOlder();\n }\n return;\n }\n handled.current = focusInteractionId;\n olderAttempts.current = 0;\n atBottomRef.current = false;\n setAtBottom(false);\n setBaselineKey(lastKey);\n if (scrollRef.current) scrollWithin(scrollRef.current, target);\n setHighlight(focusInteractionId);\n });\n useEffect(() => {\n if (!highlight) return;\n const timer = setTimeout(() => setHighlight(null), HIGHLIGHT_MS);\n return () => clearTimeout(timer);\n }, [highlight]);\n\n const jumpToLatest = () => {\n const el = scrollRef.current;\n if (!el) return;\n atBottomRef.current = true;\n setAtBottom(true);\n setBaselineKey(null);\n el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n };\n\n const openFirstPending = () => {\n const first = pending[0];\n if (!first) return;\n const el = document.getElementById(interactionDomId(first.id));\n if (!el) return;\n atBottomRef.current = false;\n setAtBottom(false);\n setBaselineKey(lastKey);\n if (scrollRef.current) scrollWithin(scrollRef.current, el, true);\n setHighlight(first.id);\n // Move focus to the first control of the question for keyboard users.\n const control = el.querySelector<HTMLElement>(\n \"input, select, textarea, button:not([disabled])\",\n );\n (control ?? el).focus({ preventScroll: true });\n };\n\n const unseen = atBottom ? 0 : countAfter(entries, baselineKey);\n\n return (\n <div className={cn(\"relative flex min-h-0 min-w-0 flex-1 flex-col\", className)}>\n <div className=\"relative flex min-h-0 min-w-0 flex-1 flex-col\">\n <div\n ref={scrollRef}\n data-testid=\"transcript\"\n role=\"log\"\n aria-live=\"off\"\n aria-label=\"Transcript\"\n onScroll={onScroll}\n className=\"relative min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain px-3 py-3 md:px-6 [overflow-anchor:none] focus-visible:outline-offset-[-2px]\"\n >\n <div className=\"flex w-full min-w-0 flex-col gap-3\">\n {t.loaded && t.hasMore && (\n <div className=\"flex justify-center\">\n <Button size=\"sm\" variant=\"ghost\" busy={t.loading} onClick={requestOlder}>\n Load earlier messages\n </Button>\n </div>\n )}\n {t.error && t.loaded && (\n <ErrorState\n compact\n title=\"Could not load more of the transcript\"\n error={t.error}\n onRetry={requestOlder}\n />\n )}\n {!t.loaded && t.error ? (\n <ErrorState\n title=\"Could not load the transcript\"\n error={t.error}\n onRetry={() => void loadTranscript(sessionId, { force: true })}\n />\n ) : !t.loaded && entries.length === 0 ? (\n <LoadingState label=\"Loading transcript…\" />\n ) : entries.length === 0 && !starting ? (\n <p className=\"py-10 text-center text-sm text-muted\">\n No messages yet. Write a prompt below to start.\n </p>\n ) : (\n entries.map((entry) => (\n <div key={entry.key} className={ROW}>\n <TimelineRow\n entry={entry}\n sessionId={sessionId}\n interactionReadOnly={interactionReadOnly}\n draftEmpty={draftEmpty}\n onUseSuggestion={onUseSuggestion}\n highlightInteractionId={highlight}\n />\n </div>\n ))\n )}\n {starting && (\n <div className={ROW}>\n <StartingCard\n sessionId={sessionId}\n detail={session?.runtimeDetail ?? null}\n showPrompt={entries.length === 0}\n />\n </div>\n )}\n {t.stale && t.loaded && (\n <p role=\"status\" className=\"text-center text-xs text-muted\">\n Refreshing transcript…\n </p>\n )}\n </div>\n </div>\n {!atBottom && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n data-testid=\"jump-to-latest\"\n size=\"sm\"\n variant=\"secondary\"\n className=\"pointer-events-auto shadow-pop\"\n icon={<ArrowDown className=\"size-4\" />}\n onClick={jumpToLatest}\n >\n Jump to latest{unseen > 0 ? ` (${unseen})` : \"\"}\n </Button>\n </div>\n )}\n </div>\n {footer?.({ openFirstPending })}\n </div>\n );\n}\n","import type { Session } from \"@switchyard/protocol\";\nimport { ArrowLeft, EllipsisVertical, Square, SquareKanban } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { useHideBottomNav } from \"../../app/chrome\";\nimport { backLinkClick, useBackTo } from \"../../app/useBackTo\";\nimport { CountBadge } from \"../../components/ui/Badge\";\nimport { buttonClasses } from \"../../components/ui/Button\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Menu, type MenuItem } from \"../../components/ui/Menu\";\nimport { Sheet } from \"../../components/ui/Overlay\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { StatusChip } from \"../../components/ui/StatusChip\";\nimport { useDraft } from \"../../drafts\";\nimport { usePendingInteractions, useSyncStore } from \"../../sync/store\";\nimport { MobileChanges } from \"./Changes\";\nimport { Composer } from \"./Composer\";\nimport { ConversationHeader, sessionMenuItems } from \"./ConversationHeader\";\nimport { CodeContext, type CodeViewContext, type InspectorTab } from \"./context\";\nimport { MobileDetails, SessionFacts } from \"./Details\";\nimport type { SessionContext } from \"./hooks\";\nimport { isSubagentView, SUBAGENT_READ_ONLY } from \"./model\";\nimport type { SessionActions } from \"./SessionActions\";\nimport { SessionStatusBar } from \"./SessionStatusBar\";\nimport { Transcript } from \"./Transcript\";\n\nfunction interactionReadOnly(ctx: SessionContext): string | null {\n if (ctx.session.readOnly) return `${SUBAGENT_READ_ONLY} Answer in the parent session.`;\n if (ctx.link !== \"connected\") {\n return `Host ${ctx.hostName} is offline; answers can be sent when it reconnects.`;\n }\n return null;\n}\n\n/** A subagent's transcript is re-read from its native file on every open to show progress. */\nfunction useSubagentRefresh(session: Session) {\n const loadTranscript = useSyncStore((s) => s.loadTranscript);\n const subagent = isSubagentView(session);\n useEffect(() => {\n if (subagent) void loadTranscript(session.id, { force: true });\n }, [subagent, session.id, loadTranscript]);\n}\n\nfunction useComposerDraft(sessionId: string) {\n const [draft, setDraft, clearDraft] = useDraft(sessionId);\n const onUseSuggestion = (text: string) => {\n // Never overwrite a non-empty draft.\n if (draft.trim() === \"\") setDraft(text);\n };\n return { draft, setDraft, clearDraft, onUseSuggestion };\n}\n\n/** Desktop/compact conversation pane: header, banners, transcript and composer. */\nexport function Conversation({\n ctx,\n actions,\n focusInteractionId,\n inspector,\n}: {\n ctx: SessionContext;\n actions: SessionActions;\n focusInteractionId: string | null;\n inspector: { open: boolean; toggle: () => void; label: string };\n}) {\n const d = useComposerDraft(ctx.session.id);\n useSubagentRefresh(ctx.session);\n return (\n <section\n data-testid=\"conversation\"\n aria-label=\"Conversation\"\n className=\"flex h-full min-h-0 min-w-0 flex-col bg-bg\"\n >\n <ConversationHeader ctx={ctx} actions={actions} inspector={inspector} />\n <Transcript\n sessionId={ctx.session.id}\n draftEmpty={d.draft.trim() === \"\"}\n onUseSuggestion={d.onUseSuggestion}\n interactionReadOnly={interactionReadOnly(ctx)}\n focusInteractionId={focusInteractionId}\n footer={({ openFirstPending }) => (\n <SessionStatusBar ctx={ctx} actions={actions} onAnswer={openFirstPending} />\n )}\n />\n <Composer\n ctx={ctx}\n draft={d.draft}\n setDraft={d.setDraft}\n clearDraft={d.clearDraft}\n mobile={false}\n />\n {actions.dialogs}\n </section>\n );\n}\n\ntype MobileTab = \"chat\" | \"changes\" | \"details\";\n\n/** Mobile segment for a requested inspector tab (`?tab=`): Changes, else Details. */\nfunction mobileTabFor(tab: InspectorTab | null | undefined): MobileTab {\n if (!tab) return \"chat\";\n return tab === \"changes\" ? \"changes\" : \"details\";\n}\n\n/** Mobile session screen: one surface at a time (Chat, Changes, Details). */\nexport function MobileSession({\n ctx,\n actions,\n focusInteractionId,\n tabRequest,\n}: {\n ctx: SessionContext;\n actions: SessionActions;\n focusInteractionId: string | null;\n /** `?tab=` from the URL (e.g. Board \"Review changes\" opens Changes). */\n tabRequest?: { tab: InspectorTab; key: string } | null;\n}) {\n const back = useBackTo(\"/code\");\n const { session, task } = ctx;\n const navigate = useNavigate();\n const [tab, setTab] = useState<MobileTab>(() => mobileTabFor(tabRequest?.tab));\n const [visited, setVisited] = useState<Set<MobileTab>>(\n () => new Set([mobileTabFor(tabRequest?.tab)]),\n );\n const [infoOpen, setInfoOpen] = useState(false);\n const pending = usePendingInteractions(session.id);\n const d = useComposerDraft(session.id);\n useSubagentRefresh(session);\n useHideBottomNav(true); // Back replaces the bottom navigation here.\n\n // Deep links and session switches show Chat, unless the link asks for a tab (`?tab=changes`).\n const tabKey = tabRequest ? `${tabRequest.tab}:${tabRequest.key}` : null;\n // biome-ignore lint/correctness/useExhaustiveDependencies: apply once per navigation\n useEffect(() => setTab(mobileTabFor(tabRequest?.tab)), [session.id, focusInteractionId, tabKey]);\n // Changes and Details mount on first visit, then stay mounted.\n useEffect(() => setVisited((v) => (v.has(tab) ? v : new Set(v).add(tab))), [tab]);\n\n const codeCtx = useMemo<CodeViewContext>(\n () => ({ mobile: true, openInspector: (t) => setTab(t === \"changes\" ? \"changes\" : \"details\") }),\n [],\n );\n\n const changed = ctx.workspace?.git.changedFiles ?? 0;\n const menuItems: MenuItem[] = [\n ...(task\n ? [\n {\n id: \"task\",\n label: \"Open linked task\",\n icon: <SquareKanban className=\"size-4\" />,\n onSelect: () => navigate(`/tasks/${encodeURIComponent(task.id)}`),\n },\n ]\n : []),\n ...(actions.canStop\n ? [\n {\n id: \"stop\",\n label: \"Stop\",\n icon: <Square className=\"size-4\" />,\n danger: true,\n onSelect: actions.requestStop,\n },\n ]\n : []),\n ...sessionMenuItems(ctx, actions),\n ];\n\n return (\n <CodeContext.Provider value={codeCtx}>\n <div className=\"absolute inset-0 flex min-w-0 flex-col bg-bg\">\n <div className=\"shrink-0 border-b border-border bg-surface safe-pt\">\n <header className=\"flex min-w-0 items-center gap-1 px-1.5 py-1\">\n <Link\n to=\"/code\"\n onClick={backLinkClick(back)}\n aria-label=\"Back to sessions\"\n title=\"Back to sessions\"\n className={buttonClasses(\"ghost\", \"md\", \"size-11 px-0\")}\n >\n <ArrowLeft aria-hidden className=\"size-5\" />\n </Link>\n <h1 className=\"min-w-0 flex-1 text-base leading-6 font-semibold\">\n <button\n type=\"button\"\n aria-haspopup=\"dialog\"\n onClick={() => setInfoOpen(true)}\n className=\"tap block w-full truncate text-left\"\n >\n {session.title}\n </button>\n </h1>\n <StatusChip kind=\"runtime\" value={session.runtime} size=\"sm\" className=\"shrink-0\" />\n <Menu\n label=\"Session actions\"\n items={menuItems}\n trigger={(p) => (\n <IconButton\n {...p}\n label=\"More actions\"\n icon={<EllipsisVertical className=\"size-5\" />}\n />\n )}\n />\n </header>\n <div className=\"px-3 pb-1.5\" data-testid=\"mobile-tabs\">\n <SegmentedControl<MobileTab>\n label=\"Session view\"\n block\n value={tab}\n onChange={setTab}\n options={[\n {\n value: \"chat\",\n label: \"Chat\",\n badge:\n pending.length > 0 ? (\n <>\n <span aria-hidden className=\"size-2 shrink-0 rounded-full bg-warning\" />\n <span className=\"sr-only\">\n {pending.length} pending {pending.length === 1 ? \"question\" : \"questions\"}\n </span>\n </>\n ) : undefined,\n },\n {\n value: \"changes\",\n label: \"Changes\",\n badge: <CountBadge count={changed} label=\"changed files\" tone=\"neutral\" />,\n },\n { value: \"details\", label: \"Details\" },\n ]}\n />\n </div>\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <section\n data-testid=\"conversation\"\n aria-label=\"Chat\"\n hidden={tab !== \"chat\"}\n className=\"flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n <Transcript\n sessionId={session.id}\n draftEmpty={d.draft.trim() === \"\"}\n onUseSuggestion={d.onUseSuggestion}\n interactionReadOnly={interactionReadOnly(ctx)}\n focusInteractionId={focusInteractionId}\n active={tab === \"chat\"}\n footer={({ openFirstPending }) => (\n <SessionStatusBar ctx={ctx} actions={actions} onAnswer={openFirstPending} />\n )}\n />\n <Composer\n ctx={ctx}\n draft={d.draft}\n setDraft={d.setDraft}\n clearDraft={d.clearDraft}\n mobile\n />\n </section>\n <section\n aria-label=\"Changes\"\n hidden={tab !== \"changes\"}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\"\n >\n {(tab === \"changes\" || visited.has(\"changes\")) && <MobileChanges ctx={ctx} />}\n </section>\n <section\n aria-label=\"Details\"\n hidden={tab !== \"details\"}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\"\n >\n {(tab === \"details\" || visited.has(\"details\")) && (\n <MobileDetails ctx={ctx} actions={actions} />\n )}\n </section>\n </div>\n <Sheet open={infoOpen} onClose={() => setInfoOpen(false)} title=\"Session details\">\n <p className=\"mb-3 text-sm font-medium break-words\">{session.title}</p>\n <SessionFacts ctx={ctx} />\n </Sheet>\n {actions.dialogs}\n </div>\n </CodeContext.Provider>\n );\n}\n","import type { Session } from \"@switchyard/protocol\";\nimport { MousePointerClick, SearchX } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { BACK_STATE } from \"../../app/useBackTo\";\nimport { Drawer } from \"../../components/ui/Overlay\";\nimport { Splitter } from \"../../components/ui/Splitter\";\nimport { EmptyState, LoadingState } from \"../../components/ui/states\";\nimport { PANE_LIMITS, usePrefs } from \"../../prefs\";\nimport { CodeContext, type CodeViewContext, type InspectorTab } from \"./context\";\nimport { type SessionContext, useElementWidth, useSessionContext } from \"./hooks\";\nimport { Inspector } from \"./Inspector\";\nimport { COMPACT_NAVIGATOR_MAX, CONVERSATION_MIN, fitPanes } from \"./model\";\nimport { Navigator } from \"./Navigator\";\nimport { NewSessionFlow } from \"./NewSession\";\nimport { useSessionActions } from \"./SessionActions\";\nimport { Conversation, MobileSession } from \"./SessionView\";\n\nfunction NoSession({ missing, error }: { missing: boolean; error?: string | null }) {\n if (error) {\n return (\n <EmptyState\n icon={<SearchX className=\"size-8\" />}\n title=\"Could not load session\"\n description={error}\n action={{ label: \"Back to sessions\", to: \"/code\" }}\n />\n );\n }\n return missing ? (\n <EmptyState\n icon={<SearchX className=\"size-8\" />}\n title=\"Session not found\"\n description=\"This link may point to another coordinator.\"\n action={{ label: \"Back to sessions\", to: \"/code\" }}\n />\n ) : (\n <EmptyState\n icon={<MousePointerClick className=\"size-8\" />}\n title=\"Select a session\"\n description=\"Pick a session in the navigator, or start a new one.\"\n />\n );\n}\n\n/** `?tab=` in the URL: the inspector tab to open, keyed by navigation. */\nexport interface TabRequest {\n tab: InspectorTab;\n key: string;\n}\n\ninterface LayoutProps {\n session: Session | undefined;\n sessionId: string | null;\n hydrated: boolean;\n loadError: string | null;\n focusInteractionId: string | null;\n tabRequest: TabRequest | null;\n}\n\n/** Desktop (three panes) and compact (navigator + conversation, inspector drawer). */\nexport function CodeDesktop({ compact, ...props }: LayoutProps & { compact: boolean }) {\n const navigate = useNavigate();\n const paneSizes = usePrefs((s) => s.paneSizes);\n const setPaneSize = usePrefs((s) => s.setPaneSize);\n const collapsed = usePrefs((s) => s.inspectorCollapsed);\n const setPref = usePrefs((s) => s.set);\n const [newFor, setNewFor] = useState<{ projectId: string | null } | null>(null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [ref, width] = useElementWidth<HTMLDivElement>();\n const ctx = useSessionContext(props.session);\n\n const showInspector = !compact && !collapsed && !!ctx;\n const navMax = compact ? COMPACT_NAVIGATOR_MAX : PANE_LIMITS.navigator.max;\n const fit = fitPanes(\n width,\n Math.min(paneSizes.navigator, navMax),\n showInspector ? paneSizes.inspector : null,\n );\n\n const onCreated = useCallback(\n (id: string) => {\n setNewFor(null);\n navigate(`/code/${encodeURIComponent(id)}`);\n },\n [navigate],\n );\n\n return (\n <div ref={ref} className=\"absolute inset-0 flex min-w-0 overflow-hidden\">\n <Navigator\n variant=\"pane\"\n selectedId={props.sessionId}\n onNewSession={(pid) => setNewFor({ projectId: pid ?? null })}\n className=\"shrink-0 border-r border-border\"\n style={{ width: fit.nav }}\n />\n <Splitter\n label=\"Resize navigator\"\n value={fit.nav}\n min={PANE_LIMITS.navigator.min}\n max={navMax}\n onChange={(px) => setPaneSize(\"navigator\", px)}\n onReset={() => setPaneSize(\"navigator\", PANE_LIMITS.navigator.default)}\n className=\"-ml-1.5\"\n />\n <div className=\"relative min-h-0 min-w-0 flex-1\" style={{ minWidth: CONVERSATION_MIN }}>\n {!props.hydrated && props.sessionId ? (\n <LoadingState label=\"Loading session…\" />\n ) : ctx ? (\n <SessionPanes\n key={ctx.session.id}\n ctx={ctx}\n compact={compact}\n showInspector={showInspector}\n inspectorWidth={fit.insp}\n setInspectorWidth={(px) => setPaneSize(\"inspector\", px)}\n collapsed={collapsed}\n setCollapsed={(c) => setPref(\"inspectorCollapsed\", c)}\n drawerOpen={drawerOpen}\n setDrawerOpen={setDrawerOpen}\n focusInteractionId={props.focusInteractionId}\n tabRequest={props.tabRequest}\n />\n ) : (\n <NoSession missing={!!props.sessionId} error={props.loadError} />\n )}\n </div>\n <NewSessionFlow\n open={newFor !== null}\n projectId={newFor?.projectId ?? null}\n onClose={() => setNewFor(null)}\n onCreated={onCreated}\n mobile={false}\n />\n </div>\n );\n}\n\nfunction SessionPanes({\n ctx,\n compact,\n showInspector,\n inspectorWidth,\n setInspectorWidth,\n collapsed,\n setCollapsed,\n drawerOpen,\n setDrawerOpen,\n focusInteractionId,\n tabRequest,\n}: {\n ctx: SessionContext;\n compact: boolean;\n showInspector: boolean;\n inspectorWidth: number | null;\n setInspectorWidth: (px: number) => void;\n collapsed: boolean;\n setCollapsed: (c: boolean) => void;\n drawerOpen: boolean;\n setDrawerOpen: (o: boolean) => void;\n focusInteractionId: string | null;\n tabRequest: TabRequest | null;\n}) {\n const actions = useSessionActions(ctx);\n const [tab, setTab] = useState<InspectorTab>(tabRequest?.tab ?? \"changes\");\n const [openPath, setOpenPath] = useState<{ path: string; nonce: number } | null>(null);\n\n const openInspector = useCallback(\n (t: InspectorTab) => {\n setTab(t);\n if (compact) setDrawerOpen(true);\n else setCollapsed(false);\n },\n [compact, setDrawerOpen, setCollapsed],\n );\n const codeCtx = useMemo<CodeViewContext>(\n () => ({\n mobile: false,\n openInspector,\n openFile: (path) => {\n setOpenPath({ path, nonce: Date.now() });\n openInspector(\"files\");\n },\n }),\n [openInspector],\n );\n\n // `?tab=changes` (Board \"Review changes\", attention links) opens that inspector tab.\n const tabKey = tabRequest ? `${tabRequest.tab}:${tabRequest.key}` : null;\n // biome-ignore lint/correctness/useExhaustiveDependencies: apply once per navigation\n useEffect(() => {\n if (tabRequest) openInspector(tabRequest.tab);\n }, [tabKey]);\n\n // Leaving compact closes the drawer.\n useEffect(() => {\n if (!compact) setDrawerOpen(false);\n }, [compact, setDrawerOpen]);\n\n const inspectorOpen = compact ? drawerOpen : !collapsed;\n const inspector = {\n open: inspectorOpen,\n label: inspectorOpen ? \"Hide inspector\" : \"Show inspector\",\n toggle: () => (compact ? setDrawerOpen(!drawerOpen) : setCollapsed(!collapsed)),\n };\n\n return (\n <CodeContext.Provider value={codeCtx}>\n <div className=\"absolute inset-0 flex min-w-0\">\n <div className=\"min-h-0 min-w-0 flex-1\">\n <Conversation\n ctx={ctx}\n actions={actions}\n focusInteractionId={focusInteractionId}\n inspector={inspector}\n />\n </div>\n {showInspector && inspectorWidth !== null && (\n <>\n <Splitter\n label=\"Resize inspector\"\n pane=\"after\"\n value={inspectorWidth}\n min={PANE_LIMITS.inspector.min}\n max={PANE_LIMITS.inspector.max}\n onChange={setInspectorWidth}\n onReset={() => setInspectorWidth(PANE_LIMITS.inspector.default)}\n className=\"-mr-1.5\"\n />\n <div\n className=\"min-h-0 shrink-0 border-l border-border\"\n style={{ width: inspectorWidth }}\n >\n <Inspector\n ctx={ctx}\n actions={actions}\n tab={tab}\n onTab={setTab}\n openPath={openPath}\n className=\"h-full\"\n />\n </div>\n </>\n )}\n </div>\n {compact && (\n <Drawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n title=\"Inspector\"\n width={440}\n flush\n >\n <Inspector\n ctx={ctx}\n actions={actions}\n tab={tab}\n onTab={setTab}\n openPath={openPath}\n hideTitle\n />\n </Drawer>\n )}\n </CodeContext.Provider>\n );\n}\n\n/** Mobile: the session list at /code, one session screen at /code/:id. */\nexport function CodeMobile(props: LayoutProps) {\n const navigate = useNavigate();\n const [newFor, setNewFor] = useState<{ projectId: string | null } | null>(null);\n const ctx = useSessionContext(props.session);\n const onCreated = useCallback(\n (id: string) => {\n setNewFor(null);\n navigate(`/code/${encodeURIComponent(id)}`, { state: BACK_STATE });\n },\n [navigate],\n );\n if (props.sessionId) {\n if (!props.hydrated) return <LoadingState label=\"Loading session…\" />;\n if (!ctx) return <NoSession missing error={props.loadError} />;\n return (\n <MobileSessionScreen\n key={ctx.session.id}\n ctx={ctx}\n focus={props.focusInteractionId}\n tabRequest={props.tabRequest}\n />\n );\n }\n return (\n <div className=\"absolute inset-0 flex min-w-0 flex-col\">\n <Navigator\n variant=\"screen\"\n selectedId={null}\n onNewSession={(pid) => setNewFor({ projectId: pid ?? null })}\n className=\"min-h-0 flex-1 safe-pt\"\n />\n <NewSessionFlow\n open={newFor !== null}\n projectId={newFor?.projectId ?? null}\n onClose={() => setNewFor(null)}\n onCreated={onCreated}\n mobile\n />\n </div>\n );\n}\n\nfunction MobileSessionScreen({\n ctx,\n focus,\n tabRequest,\n}: {\n ctx: SessionContext;\n focus: string | null;\n tabRequest: TabRequest | null;\n}) {\n const actions = useSessionActions(ctx);\n return (\n <MobileSession ctx={ctx} actions={actions} focusInteractionId={focus} tabRequest={tabRequest} />\n );\n}\n","import { useEffect } from \"react\";\nimport { Navigate, useLocation, useParams, useSearchParams } from \"react-router\";\nimport { useBreakpoint } from \"../../app/useBreakpoint\";\nimport { usePrefs } from \"../../prefs\";\nimport { useViewingSession } from \"../../presence\";\nimport { useSession, useSyncStore } from \"../../sync/store\";\nimport { CodeDesktop, CodeMobile } from \"./CodeLayouts\";\nimport type { InspectorTab } from \"./context\";\nimport { useSessionLookup } from \"./hooks\";\n\nconst INSPECTOR_TABS: readonly string[] = [\"changes\", \"files\", \"task\", \"extensions\"];\n\n/**\n * Code view: `/code` and `/code/:sessionId` (`?interaction=<id>` scrolls to and\n * highlights that question). Desktop >= 1200 has three panes; compact\n * 768-1199 has navigator + conversation with the inspector in a drawer; mobile\n * shows one surface at a time.\n */\nexport default function CodeView() {\n const { sessionId: rawId } = useParams();\n const sessionId = rawId ?? null;\n const [params] = useSearchParams();\n const focusInteractionId = params.get(\"interaction\");\n const tabParam = params.get(\"tab\");\n const requestedTab =\n tabParam && INSPECTOR_TABS.includes(tabParam) ? (tabParam as InspectorTab) : null;\n // Each navigation (e.g. \"Review changes\" again) re-applies the requested tab.\n const { key: requestKey } = useLocation();\n const bp = useBreakpoint();\n const hydrated = useSyncStore((s) => s.hydrated);\n const session = useSession(sessionId);\n const lookup = useSessionLookup(sessionId, session, hydrated);\n const lastSessionId = usePrefs((s) => s.lastSessionId);\n const lastSession = useSession(lastSessionId);\n const setPref = usePrefs((s) => s.set);\n\n useViewingSession(session ? session.id : null);\n\n useEffect(() => {\n if (!session) return;\n if (session.id !== usePrefs.getState().lastSessionId) setPref(\"lastSessionId\", session.id);\n }, [session, setPref]);\n\n // Desktop and compact reopen the last session; mobile keeps the list at /code.\n if (!sessionId && bp !== \"mobile\" && hydrated && lastSession && lastSession.archivedAt === null) {\n return <Navigate to={`/code/${encodeURIComponent(lastSession.id)}`} replace />;\n }\n\n const props = {\n session,\n sessionId,\n hydrated: hydrated && lookup.state !== \"loading\",\n loadError: lookup.state === \"error\" ? lookup.error : null,\n focusInteractionId,\n tabRequest: requestedTab ? { tab: requestedTab, key: requestKey } : null,\n };\n return bp === \"mobile\" ? (\n <CodeMobile {...props} />\n ) : (\n <CodeDesktop {...props} compact={bp === \"compact\"} />\n );\n}\n"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"mappings":"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"}
|