@spencerboucher/switchyard 0.3.0 → 0.4.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.
Files changed (51) hide show
  1. package/README.md +2 -2
  2. package/dist/switchyard.mjs +1243 -742
  3. package/package.json +1 -1
  4. package/web-dist/assets/{AutomationView-Bt_v8JDx.js → AutomationView-BhEfjAtI.js} +2 -2
  5. package/web-dist/assets/{AutomationView-Bt_v8JDx.js.map → AutomationView-BhEfjAtI.js.map} +1 -1
  6. package/web-dist/assets/{InteractionCard-BRI9KgrO.js → InteractionCard-DxEZUNrD.js} +2 -2
  7. package/web-dist/assets/{InteractionCard-BRI9KgrO.js.map → InteractionCard-DxEZUNrD.js.map} +1 -1
  8. package/web-dist/assets/Menu-C4GUY_ym.js +2 -0
  9. package/web-dist/assets/Menu-C4GUY_ym.js.map +1 -0
  10. package/web-dist/assets/{Overlay-B9h5oAe6.js → Overlay-C-GqmwUn.js} +2 -2
  11. package/web-dist/assets/{Overlay-B9h5oAe6.js.map → Overlay-C-GqmwUn.js.map} +1 -1
  12. package/web-dist/assets/{attention-VkuGuoSf.js → attention-Dzqdk9Gz.js} +2 -2
  13. package/web-dist/assets/{attention-VkuGuoSf.js.map → attention-Dzqdk9Gz.js.map} +1 -1
  14. package/web-dist/assets/{automations-BY88rXFv.js → automations-DzTTwxBl.js} +2 -2
  15. package/web-dist/assets/{automations-BY88rXFv.js.map → automations-DzTTwxBl.js.map} +1 -1
  16. package/web-dist/assets/{board-OzxtnPgh.js → board-C5mG_8rg.js} +2 -2
  17. package/web-dist/assets/{board-OzxtnPgh.js.map → board-C5mG_8rg.js.map} +1 -1
  18. package/web-dist/assets/code-9shyh1Gw.js +8 -0
  19. package/web-dist/assets/code-9shyh1Gw.js.map +1 -0
  20. package/web-dist/assets/{describe-CRXLn3O6.js → describe-BbCZVvJP.js} +2 -2
  21. package/web-dist/assets/{describe-CRXLn3O6.js.map → describe-BbCZVvJP.js.map} +1 -1
  22. package/web-dist/assets/dist-PaQekTP8.js +56 -0
  23. package/web-dist/assets/dist-PaQekTP8.js.map +1 -0
  24. package/web-dist/assets/{enroll-C9-fBIKO.js → enroll-DWJANJtw.js} +2 -2
  25. package/web-dist/assets/{enroll-C9-fBIKO.js.map → enroll-DWJANJtw.js.map} +1 -1
  26. package/web-dist/assets/index-ByiuDoG0.css +2 -0
  27. package/web-dist/assets/{index-B11DJFHW.js → index-afOJ8NRR.js} +3 -3
  28. package/web-dist/assets/{index-B11DJFHW.js.map → index-afOJ8NRR.js.map} +1 -1
  29. package/web-dist/assets/{more-BUvq82hI.js → more-B6qxC6M-.js} +2 -2
  30. package/web-dist/assets/{more-BUvq82hI.js.map → more-B6qxC6M-.js.map} +1 -1
  31. package/web-dist/assets/{now-DR2wt1DG.js → now-BOWxgbt3.js} +2 -2
  32. package/web-dist/assets/{now-DR2wt1DG.js.map → now-BOWxgbt3.js.map} +1 -1
  33. package/web-dist/assets/settings-BpkmIv_4.js +8 -0
  34. package/web-dist/assets/settings-BpkmIv_4.js.map +1 -0
  35. package/web-dist/assets/{send-CFwekPNi.js → sliders-horizontal-S3tmwxsP.js} +2 -2
  36. package/web-dist/assets/sliders-horizontal-S3tmwxsP.js.map +1 -0
  37. package/web-dist/assets/{useNow-ChB9z-N6.js → useNow-D9Zxr5Jb.js} +2 -2
  38. package/web-dist/assets/{useNow-ChB9z-N6.js.map → useNow-D9Zxr5Jb.js.map} +1 -1
  39. package/web-dist/index.html +2 -2
  40. package/web-dist/sw.js +1 -1
  41. package/web-dist/sw.js.map +1 -1
  42. package/web-dist/assets/Menu-Cqil5qVF.js +0 -2
  43. package/web-dist/assets/Menu-Cqil5qVF.js.map +0 -1
  44. package/web-dist/assets/code-BR4PKt8F.js +0 -8
  45. package/web-dist/assets/code-BR4PKt8F.js.map +0 -1
  46. package/web-dist/assets/dist-C4YmDHPG.js +0 -56
  47. package/web-dist/assets/dist-C4YmDHPG.js.map +0 -1
  48. package/web-dist/assets/index-DGGOgcLZ.css +0 -2
  49. package/web-dist/assets/send-CFwekPNi.js.map +0 -1
  50. package/web-dist/assets/settings-C4tDpSCU.js +0 -7
  51. package/web-dist/assets/settings-C4tDpSCU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-9shyh1Gw.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","useRef","createContext","useContext","useMemo","useState","useRef","useCallback","useState","useRef","useCallback","useState","useMemo","useCallback","useRef","_Fragment","Trash2","useRef","useState","_Fragment","useMemo","useState","_Fragment","useId","useMemo","_Fragment","MessageCircleQuestion","useMemo","useState","_Fragment","useId","useRef","useState","_Fragment","useState","useRef","useId","_Fragment","useState","Wand2","useMemo","useRef","useState","useCallback","_Fragment","useState","useMemo","useRef","useState","useCallback","useMemo","_Fragment","__toESM","useSearchParams","useNavigate","Link","require_react","createLucideIcon","useParams","require_jsx_runtime","useLocation","useProjects","useHosts","isApiError","useTranscript","useSession","useStreams","usePanels","useSyncStore","apiPost","apiGet","errorMessage","RefreshCw","InteractionPending","UnsupportedCapability","buttonClasses","formatDuration","TriangleAlert","cn","HostUnavailable","useRunsForTask","usePendingInteractions","Button","formatTime","ErrorState","LoadingState","formatRelative","EmptyState","CircleAlert","MessageCircleQuestionMark","useViewingSession","ArrowDown","PanelRightOpen","ChevronDown","Menu","ArrowLeft","Check","Server","ChevronLeft","Send","FolderGit2","SlidersHorizontal","ChevronRight","Copy","parseUnifiedDiff","UINodeRenderer","DiffView","InteractionCard","GitBranch","Pencil","Hand","Link2","Play","Plus","Search","Trash","CircleX","LoaderCircle","CircleCheck","Info","PANE_LIMITS","Square","toast","StatusChip","X","useHideBottomNav","CountBadge","useBreakpoint","useFilter","usePrefs","SquareKanban","TextInput","TextArea","Tabs","CodeBlock","TabPanel","Markdown","SegmentedControl","IconButton","Drawer","Sheet","Dialog","__iconData$25","Archive","__iconData$24","Bot","__iconData$23","Brain","__iconData$22","Camera","__iconData$21","ChevronUp","__iconData$20","ChevronsDownUp","__iconData$19","ChevronsUpDown","__iconData$18","EllipsisVertical","__iconData$17","FileDiff","__iconData$16","File","__iconData$15","FolderOpen","__iconData$14","Folder","__iconData$13","ImagePlus","__iconData$12","ListPlus","__iconData$11","MessageSquarePlus","__iconData$10","MousePointerClick","__iconData$9","Navigation","__iconData$8","Network","__iconData$7","PanelRightClose","__iconData$6","Paperclip","__iconData$5","SearchX","__iconData$4","SendHorizontal","__iconData$3","Slash","__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","LIVE_RUNTIMES","BUSY_RUNTIMES","isLive","isBusy","branchSlug","branch","DEFAULT_WORKTREE_DIR","worktreePath","checkoutPath","worktreeDir","branchProblem","b","ch","NAV_LAYOUTS","sessionsNeedingAttention","out","a","attention","i","interactions","lastSegment","p","workspaceLabel","ws","cwd","emptyGroup","patch","projectLabel","project","projectId","branchFor","latest","best","r","g","c","l","sortGroups","last","groups","countSessions","n","buildNavTree","layout","opts","q","attn","input","entries","needs","hostId","hostName","row","ctx","hosts","hg","host","key","pg","projects","projectGroup","hostIds","ids","wsGroups","wsOf","wsGroup","la","lb","only","navTreeIsEmpty","tree","navGroupKeys","walk","gs","ACTIVE_RUN_STATES","runForSession","session","runs","automationControl","run","AUTOMATION_LABEL","hostLink","SUBAGENT_READ_ONLY","isSubagentView","composerBlockReason","link","sendModes","caps","buildTimeline","byItem","streams","seenInteractions","item","items","stream","orphans","pending","countAfter","baselineKey","idx","interactionDomId","interactionId","parseDataUrl","m","url","readImageFile","file","reject","reader","parsed","resolve","stringifyArgs","args","outputPreview","lines","output","maxLines","tail","SPLITTER","fitPanes","available","splitters","insp","over","nav","give","NO_ADAPTERS","useSessionContext","workspace","tasks","adapters","taskId","useMutation","busy","setBusy","error","setError","fnRef","fn","optsRef","mounted","msg","success","useNow","now","setNow","active","t","ms","DRAFT_PREFIX","REVIEW_PREFIX","read","write","loadDraft","sessionId","saveDraft","prev","timer","text","flushDraft","clearDraft","id","useDraft","setTextState","current","loadReviewComments","raw","saveReviewComments","comments","formatReviewFollowUp","where","useReviewComments","setComments","update","next","comment","w","codeApi","body","workspaceId","signal","normalizeEntries","normalizeFile","confirm","list","o","useWorkspaceDiff","connected","result","setResult","loading","setLoading","fetchedAt","setFetchedAt","nonce","setNonce","wsId","ac","f","useFileDiff","fromPatch","path","diff","fetched","setFetched","files","mine","STATUS_LABEL","ChangedFileList","commentCounts","selected","onSelect","large","FileDiffView","fd","marked","onComment","line","CommentForm","setText","ref","draft","Surface","mobile","onClose","onSave","ReviewPanel","overall","setOverall","block","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","isFrameMessage","CustomFrame","height","setHeight","minHeight","loaded","setLoaded","actionRef","onAction","onMessage","maxHeight","node","state","src","adapterId","ControlChip","automation","HostChip","sessionMenuItems","ConversationHeader","actions","inspector","Section","title","children","ControlButtons","hasRun","RunRow","Limits","TaskSection","dep","showControls","ADAPTER_STATUS","AdapterRow","PanelView","panel","actionId","payload","openFile","ExtensionsSection","panels","diagnostics","adapterIds","d","u","MobileDetails","subagents","parentDir","parts","extOf","FilesTab","dir","setDir","setFile","setEntries","content","setContent","openPath","rel","crumbs","Icon","Inspector","prefix","changed","hideTitle","tab","onTab","defaultPrefs","screen","Navigator","variant","defaults","stored","setPrefs","prefs","hydrated","workspaces","sessions","hostsMap","projectList","collapsed","toggle","allKeys","viewItems","anyExpanded","k","filterOptions","onNewSession","SessionRow","selectedId","GroupNode","GroupHeader","Chevron","depth","group","emptyText","INDENT","context","indent","SELECT_CLASS","Field","hint","hostOnline","h","useNewSessionForm","checkouts","profilesMap","selectedProject","profiles","setProjectId","mode","setMode","setWorkspaceId","checkoutId","setCheckoutId","setBranch","base","setBase","profileId","setProfileId","prompt","setPrompt","x","projectWorkspaces","projectCheckouts","preferred","checkout","problems","bp","ProjectField","form","WorkspaceFields","values","set","ProfileField","PromptField","Preview","Problems","STEPS","NewSessionFlow","setStep","submitting","setSubmitting","createdId","setCreatedId","slow","setSlow","arrived","delivered","reset","onCreated","create","starting","status","errorBox","stepProblems","useSessionActions","navigate","dialog","setDialog","setTitle","takeover","ret","stop","resume","rename","archive","close","archiveBlocked","dialogs","InfoRow","control","AUTOMATION_WARNING","Composer","sendWithEnter","attachments","setAttachments","focused","setFocused","attachSheet","setAttachSheet","commandSheet","setCommandSheet","slashDismissed","setSlashDismissed","textRef","fileRef","cameraRef","hintId","modes","running","noText","commandAdapters","slashOpen","sent","res","primaryMode","addFiles","sendReason","keepFocus","profile","profileText","queued","onTakeover","takeoverBusy","onResume","resumeBusy","SlashHint","setDraft","TimelineRow","props","entry","StreamEntry","InteractionEntry","UserMessage","AssistantMessage","ThinkingItem","ToolCard","NoticeItem","SystemItem","SubagentRow","InteractionRef","RowLabel","streaming","thinking","live","TOOL_STATUS","fullOutput","setFullOutput","data","elapsed","st","preview","NOTICE_ICON","NOTICE_LABEL","level","suggestion","draftEmpty","onUse","linked","interaction","highlight","readOnly","scrollWithin","container","target","top","smooth","LOAD_OLDER_THRESHOLD_PX","HIGHLIGHT_MS","Transcript","loadOlder","loadTranscript","scrollRef","atBottomRef","atBottom","setAtBottom","setBaselineKey","prependHeight","setHighlight","lastKey","firstKey","streamSize","requestOlder","el","onScroll","at","delta","handled","olderAttempts","focusInteractionId","jumpToLatest","openFirstPending","first","unseen","interactionReadOnly","SessionBanners","subagent","useComposerDraft","Conversation","mobileTabFor","MobileSession","setTab","tabRequest","metaOpen","setMetaOpen","tabKey","codeCtx","menuItems","useWidth","width","setWidth","ro","NoSession","missing","CodeDesktop","paneSizes","setPaneSize","setPref","newOpen","setNewOpen","drawerOpen","setDrawerOpen","showInspector","compact","fit","px","SessionPanes","setOpenPath","openInspector","setCollapsed","inspectorOpen","inspectorWidth","setInspectorWidth","CodeMobile","MobileSessionScreen","focus","INSPECTOR_TABS","CodeView","rawId","params","tabParam","requestedTab","requestKey","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.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/chevron-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-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/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-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.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/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/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/model.ts","../../src/features/code/hooks.ts","../../src/drafts.ts","../../src/features/code/api.ts","../../src/features/code/Changes.tsx","../../src/components/intent/CustomFrame.tsx","../../src/features/code/ConversationHeader.tsx","../../src/features/code/Details.tsx","../../src/features/code/Files.tsx","../../src/features/code/Inspector.tsx","../../src/features/code/Navigator.tsx","../../src/features/code/NewSession.tsx","../../src/features/code/SessionActions.tsx","../../src/features/code/Composer.tsx","../../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\",\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: \"chevron-up\",\n size: 24,\n node: [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]]\n};\n__iconData.node;\nconst ChevronUp = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronUp as default };\n//# sourceMappingURL=chevron-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-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: \"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-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\",\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: \"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: \"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 AttentionItem,\n Checkout,\n Connectivity,\n Host,\n Interaction,\n Project,\n Run,\n RuntimeCapabilities,\n Session,\n TranscriptItem,\n Workspace,\n} from \"@switchyard/protocol\";\nimport { PANE_LIMITS } from \"../../prefs\";\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 const LIVE_RUNTIMES: Session[\"runtime\"][] = [\"starting\", \"idle\", \"running\", \"waiting_input\"];\nexport const BUSY_RUNTIMES: Session[\"runtime\"][] = [\"running\", \"waiting_input\"];\n\nexport function isLive(s: Pick<Session, \"runtime\">): boolean {\n return LIVE_RUNTIMES.includes(s.runtime);\n}\n\nexport function isBusy(s: Pick<Session, \"runtime\">): boolean {\n return BUSY_RUNTIMES.includes(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/** The default managed worktree folder (`Project.worktreeDir`). */\nconst DEFAULT_WORKTREE_DIR = \".worktrees\";\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\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, needs-you first\" },\n { value: \"hosts\", label: \"Hosts\", hint: \"Host, then project\" },\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}\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 function sessionsNeedingAttention(\n attention: Record<string, AttentionItem>,\n interactions: Record<string, Interaction>,\n): Set<string> {\n const out = new Set<string>();\n for (const a of Object.values(attention)) {\n if (a.sessionId && a.resolvedAt === null) out.add(a.sessionId);\n }\n for (const i of Object.values(interactions)) if (i.state === \"pending\") out.add(i.sessionId);\n return out;\n}\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 sortGroups(groups: NavGroup[]): NavGroup[] {\n const last = (g: NavGroup) =>\n g.key.endsWith(\"__none\") || (g.kind === \"host\" && g.label === \"Unknown host\") ? 1 : 0;\n return groups.sort((a, b) => last(a) - last(b) || a.label.localeCompare(b.label));\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 (and, in Projects and Worktrees, projects and workspaces without\n * 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 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 entries.sort(\n (a, b) =>\n Number(b.attention) - Number(a.attention) ||\n b.session.lastActivityAt.localeCompare(a.session.lastActivityAt),\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()]);\n for (const g of groups) {\n sortGroups(g.groups);\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 if (opts.filter === \"all\" && !q)\n for (const p of Object.values(input.projects)) projectGroup(p.id);\n const groups = sortGroups([...projects.values()]);\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 // Workspaces and projects without sessions still appear, so a new session can start there.\n for (const ws of Object.values(input.workspaces)) {\n if (ws.archivedAt) 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 if (!q) for (const p of Object.values(input.projects)) projectGroup(p.id);\n }\n\n const groups = sortGroups([...projects.values()]);\n for (const g of groups) {\n g.groups.sort((a, b) => {\n const la = latest(a);\n const lb = latest(b);\n if (la !== lb) return lb.localeCompare(la);\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\" } | 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\") return { reason: \"Starting… you can send once Pi is ready\" };\n if (!isLive(session)) {\n return {\n reason: session.nativeHandle\n ? \"Session stopped: Resume to send\"\n : \"Session stopped: no native Pi session to resume\",\n action: session.nativeHandle ? \"resume\" : undefined,\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 | { type: \"item\"; key: string; item: TranscriptItem; stream: StreamBuffer | null }\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 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;\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","import type {\n AdapterInfo,\n Host,\n Project,\n Run,\n Session,\n Task,\n Workspace,\n} from \"@switchyard/protocol\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { errorMessage } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\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\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","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * Composer drafts and collected review comments, per session, in localStorage.\n * Drafts survive navigation, transient errors and reconnects (spec 18).\n */\n\nconst DRAFT_PREFIX = \"sy:draft:\";\nconst REVIEW_PREFIX = \"sy:review:\";\nexport const DRAFT_DEBOUNCE_MS = 300;\n\nfunction read(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction write(key: string, value: string | null): void {\n try {\n if (value === null || value === \"\") localStorage.removeItem(key);\n else localStorage.setItem(key, value);\n } catch {\n // storage full or unavailable: drafts are best effort\n }\n}\n\nexport function loadDraft(sessionId: string): string {\n return read(DRAFT_PREFIX + sessionId) ?? \"\";\n}\n\nconst pending = new Map<string, { timer: ReturnType<typeof setTimeout>; text: string }>();\n\n/** Save a draft after 300 ms of inactivity. */\nexport function saveDraft(sessionId: string, text: string): void {\n const prev = pending.get(sessionId);\n if (prev) clearTimeout(prev.timer);\n const timer = setTimeout(() => {\n pending.delete(sessionId);\n write(DRAFT_PREFIX + sessionId, text);\n }, DRAFT_DEBOUNCE_MS);\n pending.set(sessionId, { timer, text });\n}\n\n/** Write any pending debounced draft now (on unmount or pagehide). */\nexport function flushDraft(sessionId: string): void {\n const p = pending.get(sessionId);\n if (!p) return;\n clearTimeout(p.timer);\n pending.delete(sessionId);\n write(DRAFT_PREFIX + sessionId, p.text);\n}\n\nexport function clearDraft(sessionId: string): void {\n const p = pending.get(sessionId);\n if (p) clearTimeout(p.timer);\n pending.delete(sessionId);\n write(DRAFT_PREFIX + sessionId, null);\n}\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"pagehide\", () => {\n for (const id of [...pending.keys()]) flushDraft(id);\n });\n}\n\n/**\n * Draft state for a session's composer: `[text, setText, clear]`. Loads the\n * saved draft when the session changes and saves on every change (debounced).\n */\nexport function useDraft(sessionId: string | null): [string, (t: string) => void, () => void] {\n const [text, setTextState] = useState(() => (sessionId ? loadDraft(sessionId) : \"\"));\n const current = useRef(sessionId);\n useEffect(() => {\n current.current = sessionId;\n setTextState(sessionId ? loadDraft(sessionId) : \"\");\n return () => {\n if (sessionId) flushDraft(sessionId);\n };\n }, [sessionId]);\n const setText = useCallback((t: string) => {\n setTextState(t);\n if (current.current) saveDraft(current.current, t);\n }, []);\n const clear = useCallback(() => {\n setTextState(\"\");\n if (current.current) clearDraft(current.current);\n }, []);\n return [text, setText, clear];\n}\n\n/* Review comments collected in Changes and sent as one follow-up (spec 11). */\n\nexport interface ReviewComment {\n id: string;\n file: string;\n /** New-side line number, or null for a file-level comment. */\n line: number | null;\n /** The quoted diff line, for context in the follow-up. */\n excerpt: string | null;\n text: string;\n createdAt: string;\n}\n\nexport function loadReviewComments(sessionId: string): ReviewComment[] {\n const raw = read(REVIEW_PREFIX + sessionId);\n if (!raw) return [];\n try {\n const v = JSON.parse(raw);\n return Array.isArray(v) ? (v as ReviewComment[]) : [];\n } catch {\n return [];\n }\n}\n\nexport function saveReviewComments(sessionId: string, comments: ReviewComment[]): void {\n write(REVIEW_PREFIX + sessionId, comments.length ? JSON.stringify(comments) : null);\n}\n\nexport function clearReviewComments(sessionId: string): void {\n write(REVIEW_PREFIX + sessionId, null);\n}\n\n/** Format collected comments as one follow-up message. */\nexport function formatReviewFollowUp(comments: ReviewComment[]): string {\n const lines = [\"Please address these review comments:\", \"\"];\n for (const c of comments) {\n const where = c.line === null ? c.file : `${c.file}:${c.line}`;\n lines.push(`- ${where}: ${c.text}`);\n if (c.excerpt) lines.push(` > ${c.excerpt}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function useReviewComments(sessionId: string | null) {\n const [comments, setComments] = useState<ReviewComment[]>(() =>\n sessionId ? loadReviewComments(sessionId) : [],\n );\n useEffect(() => {\n setComments(sessionId ? loadReviewComments(sessionId) : []);\n }, [sessionId]);\n const update = useCallback(\n (next: ReviewComment[]) => {\n setComments(next);\n if (sessionId) saveReviewComments(sessionId, next);\n },\n [sessionId],\n );\n const add = useCallback(\n (c: Omit<ReviewComment, \"id\" | \"createdAt\">) => {\n const comment: ReviewComment = {\n ...c,\n id: `rc_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`,\n createdAt: new Date().toISOString(),\n };\n setComments((prev) => {\n const next = [...prev, comment];\n if (sessionId) saveReviewComments(sessionId, next);\n return next;\n });\n },\n [sessionId],\n );\n const remove = useCallback(\n (id: string) => {\n setComments((prev) => {\n const next = prev.filter((c) => c.id !== id);\n if (sessionId) saveReviewComments(sessionId, next);\n return next;\n });\n },\n [sessionId],\n );\n const clear = useCallback(() => update([]), [update]);\n return { comments, add, remove, clear, set: update };\n}\n","import type { DiffResult, FileEntry, Run, Session, Task } 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}\n\nexport const codeApi = {\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 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}\n\n/** `workspace.readFile` result: a string, or `{content|text, binary?, truncated?, size?}`. */\nexport function normalizeFile(raw: unknown): FileContent {\n if (typeof raw === \"string\") return { text: raw, binary: false, truncated: false, size: 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 };\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 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\nconst 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 [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 =\n review.comments.length === 0 ? \"Add comments by selecting diff lines\" : block?.reason;\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\">Select a diff line to add a comment.</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 <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 {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\">Request changes needs at least one comment.</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={cn(\"size-3.5\", diff.loading && \"animate-spin\")} />}\n disabled={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 }: { ctx: SessionContext }) {\n const diff = useWorkspaceDiff(ctx);\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 && <ReviewPanel ctx={ctx} review={review} />}\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 <ReviewPanel ctx={ctx} review={review} />\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 <ReviewPanel ctx={ctx} review={review} />\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 py-2 safe-pb\">\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 type { UINode } 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\ntype FrameMessage =\n | { type: \"action\"; actionId: string; payload?: unknown }\n | { type: \"resize\"; height: number };\n\nfunction isFrameMessage(v: unknown): v is FrameMessage {\n if (!v || typeof v !== \"object\") return false;\n const m = v as Record<string, unknown>;\n return (\n (m.type === \"action\" && typeof m.actionId === \"string\") ||\n (m.type === \"resize\" && typeof m.height === \"number\")\n );\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 = 1200,\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 if (!isFrameMessage(e.data)) return;\n if (e.data.type === \"resize\") {\n setHeight(Math.min(maxHeight, Math.max(minHeight, Math.ceil(e.data.height))));\n } else {\n actionRef.current?.(e.data.actionId, e.data.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({ type: \"render\", 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 Bot,\n EllipsisVertical,\n GitBranch,\n Hand,\n Info,\n PanelRightClose,\n PanelRightOpen,\n Pencil,\n Play,\n Server,\n Square,\n SquareKanban,\n} from \"lucide-react\";\nimport { Link } 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 { cn } from \"../../lib/cn\";\nimport type { SessionContext } 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 {\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: \"Native session information\",\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 return (\n <header className=\"flex min-w-0 shrink-0 flex-col gap-1.5 border-b border-border bg-surface px-4 py-2.5\">\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 && (\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.canTakeover && (\n <Button\n size=\"sm\"\n icon={<Hand className=\"size-3.5\" />}\n busy={actions.busy.takeover}\n onClick={actions.takeover}\n >\n Take over\n </Button>\n )}\n {actions.canReturn && (\n <Button\n size=\"sm\"\n icon={<Bot className=\"size-3.5\" />}\n busy={actions.busy.ret}\n onClick={actions.returnToAutomation}\n >\n Return to automation\n </Button>\n )}\n {actions.canResume && (\n <Button\n size=\"sm\"\n icon={<Play className=\"size-3.5\" />}\n busy={actions.busy.resume}\n onClick={actions.resume}\n >\n Resume\n </Button>\n )}\n {actions.canStop && (\n <Button\n size=\"sm\"\n variant=\"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={sessionMenuItems(ctx, actions)}\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=\"inline-flex min-w-0 items-center gap-1 text-xs text-muted\">\n <span className=\"truncate\">{project?.name ?? \"No project\"}</span>\n <GitBranch aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"truncate font-mono\">{workspaceLabel(workspace, session.cwd)}</span>\n </span>\n <HostChip ctx={ctx} />\n {session.readOnly && (\n <span className={cn(\"text-xs text-muted\")}>\n Subagent: view only. Live control is not supported.\n </span>\n )}\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 { EmptyState, HostUnavailable, UnsupportedCapability } from \"../../components/ui/states\";\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 { 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 as separate labeled actions, each explained. */\nexport function ControlButtons({ ctx, actions }: { ctx: SessionContext; actions: SessionActions }) {\n const hasRun = ctx.control !== \"none\";\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <ControlChip ctx={ctx} />\n {!hasRun && (\n <span className=\"text-sm text-muted\">Manual session: no automation run controls it.</span>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n icon={<Hand className=\"size-4\" />}\n disabled={!actions.canTakeover}\n busy={actions.busy.takeover}\n onClick={actions.takeover}\n >\n Take over\n </Button>\n <Button\n icon={<Bot className=\"size-4\" />}\n disabled={!actions.canReturn}\n busy={actions.busy.ret}\n onClick={actions.returnToAutomation}\n >\n Return to automation\n </Button>\n <Button\n variant=\"danger\"\n icon={<Square className=\"size-4\" />}\n disabled={!actions.canStop}\n busy={actions.busy.stop}\n onClick={actions.requestStop}\n >\n Stop\n </Button>\n </div>\n <p className=\"text-xs text-muted\">\n {!hasRun\n ? \"Take over and Return to automation apply to sessions run by a task.\"\n : ctx.control === \"automation\"\n ? \"Taking over pauses automatic continuations; Pi keeps running.\"\n : \"You have control; returning lets automation continue.\"}{\" \"}\n {!actions.canStop &&\n (ctx.link !== \"connected\"\n ? \"Stop needs the host to be online.\"\n : \"Stop is available while Pi is running.\")}\n </p>\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 (\n <EmptyState\n icon={<SquareKanban className=\"size-8\" />}\n title=\"No linked task\"\n description=\"This session was started directly. Tasks are optional; create one on the Board to automate work.\"\n action={{ label: \"Open Board\", to: \"/board\" }}\n className=\"py-6\"\n />\n );\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 <Link\n to={`/tasks/${encodeURIComponent(id)}`}\n className=\"min-w-0 truncate text-accent underline underline-offset-2\"\n >\n {dep?.title ?? id}\n </Link>\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&apos;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 <Link to=\"/settings/diagnostics\" className=\"text-sm text-accent underline\">\n All diagnostics\n </Link>\n </Section>\n </div>\n );\n}\n\n/** Mobile Details: task, control, host/workspace, subagents, limits, extensions. */\nexport function MobileDetails({ ctx, actions }: { ctx: SessionContext; actions: SessionActions }) {\n const { session, workspace, host } = ctx;\n const transcript = useTranscript(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=\"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=\"Host and workspace\">\n {ctx.link !== \"connected\" && (\n <HostUnavailable\n compact\n hostName={ctx.hostName}\n connectivity={ctx.link === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n lastSeenAt={host?.lastSeenAt}\n />\n )}\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-muted\">Host</dt>\n <dd className=\"min-w-0 break-words\">\n {ctx.hostName}\n {host?.piVersion && ` · Pi ${host.piVersion}`}\n </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\">\n {session.profileSnapshot.name}\n {session.profileSnapshot.model && ` · ${session.profileSnapshot.model}`}\n {session.profileSnapshot.thinking && ` · effort ${session.profileSnapshot.thinking}`}\n </dd>\n </dl>\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 <Link\n to={`/code/${encodeURIComponent(s.data.linkedSessionId)}`}\n className=\"text-accent underline\"\n >\n Open (view only)\n </Link>\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 type { FileEntry } from \"@switchyard/protocol\";\nimport { ArrowLeft, File, Folder, FolderOpen, Link2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { CodeBlock } from \"../../components/intent/CodeBlock\";\nimport { Button } from \"../../components/ui/Button\";\nimport {\n EmptyState,\n ErrorState,\n HostUnavailable,\n LoadingState,\n UnsupportedCapability,\n} from \"../../components/ui/states\";\nimport { codeApi, type FileContent } from \"./api\";\nimport type { SessionContext } from \"./hooks\";\n\nfunction parentDir(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n parts.pop();\n return parts.join(\"/\");\n}\n\nfunction extOf(path: string): string | undefined {\n const m = /\\.([A-Za-z0-9]+)$/.exec(path);\n return m?.[1];\n}\n\n/**\n * Read-only workspace browser (v1). `openPath` (from a file reference in the\n * transcript) opens that file directly.\n */\nexport function FilesTab({\n ctx,\n openPath,\n}: {\n ctx: SessionContext;\n openPath?: { path: string; nonce: number } | null;\n}) {\n const ws = ctx.workspace;\n const [dir, setDir] = useState(\"\");\n const [file, setFile] = useState<string | null>(null);\n const [entries, setEntries] = useState<FileEntry[] | null>(null);\n const [content, setContent] = useState<FileContent | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [nonce, setNonce] = useState(0);\n const connected = ctx.link === \"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 setDir(parentDir(rel));\n }, [openPath, ws]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nonce retries\n useEffect(() => {\n if (!ws || !connected) return;\n const ac = new AbortController();\n setLoading(true);\n setError(null);\n const p = file\n ? codeApi.file(ws.id, file, ac.signal).then((c) => setContent(c))\n : codeApi.files(ws.id, dir, ac.signal).then((e) => setEntries(e));\n p.catch((e) => {\n if (!ac.signal.aborted) setError(e);\n }).finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n return () => ac.abort();\n }, [ws?.id, connected, dir, file, nonce]);\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 const crumbs = dir.split(\"/\").filter(Boolean);\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <nav aria-label=\"Folder\" className=\"flex min-w-0 flex-wrap items-center gap-1 text-xs\">\n <button\n type=\"button\"\n className=\"tap rounded px-1 font-mono text-accent hover:underline\"\n onClick={() => {\n setFile(null);\n setDir(\"\");\n }}\n >\n {ws.branch ?? \"root\"}\n </button>\n {crumbs.map((c, i) => {\n const path = crumbs.slice(0, i + 1).join(\"/\");\n return (\n <span key={path} className=\"flex items-center gap-1\">\n <span aria-hidden className=\"text-subtle\">\n /\n </span>\n <button\n type=\"button\"\n className=\"tap rounded px-1 font-mono text-accent hover:underline\"\n onClick={() => {\n setFile(null);\n setDir(path);\n }}\n >\n {c}\n </button>\n </span>\n );\n })}\n {file && (\n <span className=\"flex min-w-0 items-center gap-1\">\n <span aria-hidden className=\"text-subtle\">\n /\n </span>\n <span className=\"truncate font-mono\">{file.split(\"/\").pop()}</span>\n </span>\n )}\n </nav>\n <p className=\"text-xs text-muted\">Read-only in this version.</p>\n\n {error !== null ? (\n <ErrorState\n compact\n title={file ? \"Could not read this file\" : \"Could not list this folder\"}\n error={error}\n onRetry={() => setNonce((n) => n + 1)}\n />\n ) : loading ? (\n <LoadingState label={file ? \"Loading file…\" : \"Loading folder…\"} />\n ) : file ? (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"self-start\"\n icon={<ArrowLeft className=\"size-3.5\" />}\n onClick={() => setFile(null)}\n >\n Back to folder\n </Button>\n {!content ? null : content.binary || content.text === null ? (\n <p className=\"text-sm text-muted\">Binary file not shown.</p>\n ) : (\n <>\n {content.truncated && (\n <p className=\"text-xs text-muted\">Showing the beginning of a large file.</p>\n )}\n <CodeBlock text={content.text} lang={extOf(file)} maxHeight=\"70vh\" />\n </>\n )}\n </div>\n ) : entries && entries.length === 0 ? (\n <EmptyState title=\"Empty folder\" className=\"py-6\" />\n ) : (\n <ul aria-label=\"Folder contents\" className=\"flex min-w-0 flex-col\">\n {dir && (\n <li>\n <button\n type=\"button\"\n className=\"tap flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-surface-2\"\n onClick={() => setDir(parentDir(dir))}\n >\n <FolderOpen aria-hidden className=\"size-4 text-muted\" />\n ..\n </button>\n </li>\n )}\n {(entries ?? []).map((e) => {\n const Icon = e.kind === \"dir\" ? Folder : e.kind === \"symlink\" ? Link2 : File;\n const rel = e.path\n ? e.path.startsWith(`${ws.path}/`)\n ? e.path.slice(ws.path.length + 1)\n : e.path\n : dir\n ? `${dir}/${e.name}`\n : e.name;\n return (\n <li key={rel} className=\"min-w-0\">\n <button\n type=\"button\"\n className=\"tap flex w-full min-w-0 items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-surface-2\"\n onClick={() => (e.kind === \"dir\" ? setDir(rel) : setFile(rel))}\n >\n <Icon aria-hidden className=\"size-4 shrink-0 text-muted\" />\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\">{e.name}</span>\n <span className=\"sr-only\">{e.kind === \"dir\" ? \"folder\" : \"file\"}</span>\n {e.size !== null && e.kind === \"file\" && (\n <span className=\"shrink-0 text-xs text-subtle tabular-nums\">\n {e.size < 1024 ? `${e.size} B` : `${Math.round(e.size / 1024)} KB`}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import { useId } 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 } 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 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 <TabPanel\n idPrefix={prefix}\n id={tab}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain p-3\"\n >\n {tab === \"changes\" && <ChangesTab ctx={ctx} />}\n {tab === \"files\" && <FilesTab ctx={ctx} openPath={openPath} />}\n {tab === \"task\" && <TaskSection ctx={ctx} actions={actions} />}\n {tab === \"extensions\" && <ExtensionsSection ctx={ctx} />}\n </TabPanel>\n </aside>\n );\n}\n","import {\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 { 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 { StatusChip } 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 NAV_LAYOUTS,\n type NavFilter,\n type NavGroup,\n type NavLayout,\n type NavRow,\n navGroupKeys,\n navTreeIsEmpty,\n} from \"./model\";\n\ninterface NavPrefs {\n filter: NavFilter;\n query: string;\n collapsed: string[];\n layout: NavLayout;\n showSubagents: 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 };\n}\n\nexport interface NavigatorProps {\n selectedId: string | null;\n onNewSession: () => 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 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 },\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 ],\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 {\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; a task is not required.\"\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 emptyText={\n prefs.layout === \"worktrees\" ? \"No workspaces discovered yet.\" : \"No sessions.\"\n }\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 title={\n hosts.length === 0\n ? \"Connect a host first\"\n : projectList.length === 0\n ? \"Add a project first\"\n : undefined\n }\n >\n New session\n </Button>\n </div>\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 emptyText,\n}: {\n group: NavGroup;\n depth: number;\n collapsed: Set<string>;\n toggle: (key: string) => void;\n selectedId: string | null;\n screen: boolean;\n emptyText: string;\n}) {\n const open = !collapsed.has(group.key);\n return (\n <li className=\"min-w-0\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => toggle(group.key)}\n className={cn(\n \"tap flex w-full min-w-0 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 {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\">{emptyText}</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 emptyText={emptyText}\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 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 && (\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 you\n </span>\n )}\n </span>\n <span className=\"flex min-w-0 items-center gap-x-1.5\">\n <StatusChip kind=\"runtime\" value={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","import type { Checkout, Host, Workspace } from \"@switchyard/protocol\";\nimport { GitBranch } from \"lucide-react\";\nimport { type ReactNode, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Dialog, Sheet } from \"../../components/ui/Overlay\";\nimport { ErrorState, LoadingState } from \"../../components/ui/states\";\nimport { TextArea, TextInput } from \"../../components/ui/TextArea\";\nimport { cn } from \"../../lib/cn\";\nimport { usePrefs } from \"../../prefs\";\nimport { errorMessage } from \"../../sync/api\";\nimport { useProjects, useSyncStore } from \"../../sync/store\";\nimport { codeApi } from \"./api\";\nimport { branchProblem, workspaceLabel, worktreePath } from \"./model\";\n\ntype WsMode = \"existing\" | \"new\";\n\nconst SELECT_CLASS =\n \"tap block h-9 w-full rounded-md border border-border bg-surface px-2 text-base text-text md:text-sm focus:border-accent focus:outline-none disabled:opacity-55\";\n\nfunction Field({\n label,\n htmlFor,\n hint,\n children,\n}: {\n label: string;\n htmlFor: string;\n hint?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <label htmlFor={htmlFor} className=\"text-sm font-medium\">\n {label}\n </label>\n {children}\n {hint && <div className=\"text-xs text-muted\">{hint}</div>}\n </div>\n );\n}\n\nfunction hostOnline(h: Host | undefined): boolean {\n return !!h && !h.revokedAt && h.connectivity === \"connected\";\n}\n\nfunction useNewSessionForm(open: boolean) {\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 selectedProject = usePrefs((s) => s.selectedProjectId);\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 [mode, setMode] = useState<WsMode>(\"new\");\n const [workspaceId, setWorkspaceId] = useState(\"\");\n const [checkoutId, setCheckoutId] = useState(\"\");\n const [branch, setBranch] = useState(\"\");\n const [base, setBase] = useState(\"\");\n const [profileId, setProfileId] = useState(\"\");\n const [prompt, setPrompt] = useState(\"\");\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 p = projects.find((x) => x.id === selectedProject) ?? projects[0] ?? null;\n setProjectId(p?.id ?? \"\");\n }, [open]);\n\n const project = projects.find((p) => p.id === projectId);\n const projectWorkspaces = useMemo(\n () =>\n Object.values(workspaces)\n .filter((w) => w.projectId === projectId && !w.archivedAt)\n .sort(\n (a, b) =>\n (a.provenance === \"main\" ? 0 : 1) - (b.provenance === \"main\" ? 0 : 1) ||\n (a.branch ?? \"\").localeCompare(b.branch ?? \"\"),\n ),\n [workspaces, projectId],\n );\n const projectCheckouts = useMemo(\n () => Object.values(checkouts).filter((c) => c.projectId === projectId),\n [checkouts, projectId],\n );\n\n // Project-dependent defaults.\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-default when the project changes\n useEffect(() => {\n if (!project) return;\n const preferred =\n projectCheckouts.find(\n (c) => c.hostId === project.defaultHostId && hostOnline(hosts[c.hostId]),\n ) ??\n projectCheckouts.find((c) => hostOnline(hosts[c.hostId])) ??\n projectCheckouts[0];\n setCheckoutId(preferred?.id ?? \"\");\n const ws = projectWorkspaces.find((w) => hostOnline(hosts[w.hostId])) ?? projectWorkspaces[0];\n setWorkspaceId(ws?.id ?? \"\");\n setProfileId(project.defaultProfileId ?? profiles[0]?.id ?? \"\");\n setBase(\"\");\n }, [projectId]);\n\n const workspace: Workspace | undefined = workspaces[workspaceId];\n const checkout: Checkout | undefined = checkouts[checkoutId];\n const hostId = mode === \"existing\" ? workspace?.hostId : checkout?.hostId;\n const host = hostId ? hosts[hostId] : undefined;\n\n const problems: string[] = [];\n if (!project) problems.push(\"Select a project.\");\n if (mode === \"existing\" && !workspace) problems.push(\"Select a workspace.\");\n if (mode === \"new\") {\n if (!checkout) problems.push(\"Select a host checkout.\");\n const bp = branchProblem(branch);\n if (bp) problems.push(bp);\n }\n if (host && !hostOnline(host)) problems.push(`Host ${host.name} is offline.`);\n if (host && !host.piCompatible) {\n problems.push(\n `Pi ${host.piVersion ?? \"(not found)\"} on ${host.name} is outside the tested range.`,\n );\n }\n\n const preview =\n mode === \"existing\"\n ? workspace\n ? { branch: workspaceLabel(workspace), path: workspace.path }\n : null\n : checkout && branch.trim()\n ? { branch: branch.trim(), path: worktreePath(checkout.path, branch, project?.worktreeDir) }\n : null;\n\n return {\n projects,\n profiles,\n hosts,\n projectWorkspaces,\n projectCheckouts,\n project,\n workspace,\n checkout,\n host,\n preview,\n problems,\n values: { projectId, mode, workspaceId, checkoutId, branch, base, profileId, prompt },\n set: {\n projectId: setProjectId,\n mode: setMode,\n workspaceId: setWorkspaceId,\n checkoutId: setCheckoutId,\n branch: setBranch,\n base: setBase,\n profileId: setProfileId,\n prompt: setPrompt,\n },\n reset: () => {\n setBranch(\"\");\n setBase(\"\");\n setPrompt(\"\");\n },\n };\n}\n\ntype Form = ReturnType<typeof useNewSessionForm>;\n\nfunction ProjectField({ form, id }: { form: Form; id: string }) {\n return (\n <Field label=\"Project\" htmlFor={`${id}-project`}>\n <select\n id={`${id}-project`}\n className={SELECT_CLASS}\n value={form.values.projectId}\n onChange={(e) => form.set.projectId(e.target.value)}\n >\n {form.projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n\nfunction WorkspaceFields({ form, id }: { form: Form; id: string }) {\n const { values, set, hosts } = form;\n return (\n <fieldset className=\"flex min-w-0 flex-col gap-3\">\n <legend className=\"mb-1 text-sm font-medium\">Workspace</legend>\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={`${id}-wsmode`}\n checked={values.mode === \"new\"}\n onChange={() => set.mode(\"new\")}\n className=\"size-4\"\n />\n Create a new worktree\n </label>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={`${id}-wsmode`}\n checked={values.mode === \"existing\"}\n onChange={() => set.mode(\"existing\")}\n disabled={form.projectWorkspaces.length === 0}\n className=\"size-4\"\n />\n Use an existing workspace\n {form.projectWorkspaces.length === 0 && (\n <span className=\"text-xs text-muted\">(none discovered)</span>\n )}\n </label>\n </div>\n {values.mode === \"existing\" ? (\n <Field\n label=\"Existing workspace\"\n htmlFor={`${id}-ws`}\n hint={form.host ? `Runs on ${form.host.name}` : undefined}\n >\n <select\n id={`${id}-ws`}\n className={SELECT_CLASS}\n value={values.workspaceId}\n onChange={(e) => set.workspaceId(e.target.value)}\n >\n {form.projectWorkspaces.map((w) => {\n const h = hosts[w.hostId];\n return (\n <option key={w.id} value={w.id} disabled={!hostOnline(h)}>\n {workspaceLabel(w)} on {h?.name ?? \"unknown host\"}\n {hostOnline(h) ? \"\" : \" (host offline)\"}\n </option>\n );\n })}\n </select>\n </Field>\n ) : (\n <>\n <Field label=\"Host and checkout\" htmlFor={`${id}-checkout`}>\n <select\n id={`${id}-checkout`}\n className={SELECT_CLASS}\n value={values.checkoutId}\n onChange={(e) => set.checkoutId(e.target.value)}\n >\n {form.projectCheckouts.length === 0 && <option value=\"\">No checkouts</option>}\n {form.projectCheckouts.map((c) => {\n const h = hosts[c.hostId];\n return (\n <option key={c.id} value={c.id} disabled={!hostOnline(h)}>\n {h?.name ?? \"Unknown host\"}: {c.path}\n {hostOnline(h) ? \"\" : \" (host offline)\"}\n </option>\n );\n })}\n </select>\n </Field>\n <Field\n label=\"New branch\"\n htmlFor={`${id}-branch`}\n hint={values.branch ? branchProblem(values.branch) : undefined}\n >\n <TextInput\n id={`${id}-branch`}\n value={values.branch}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n placeholder=\"e.g. fix/login-retry\"\n onChange={(e) => set.branch(e.target.value)}\n />\n </Field>\n <Field\n label=\"Base branch (optional)\"\n htmlFor={`${id}-base`}\n hint={`Defaults to ${form.checkout?.defaultBranch ?? \"the default branch\"}.`}\n >\n <TextInput\n id={`${id}-base`}\n value={values.base}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n placeholder={form.checkout?.defaultBranch ?? \"main\"}\n onChange={(e) => set.base(e.target.value)}\n />\n </Field>\n </>\n )}\n </fieldset>\n );\n}\n\nfunction ProfileField({ form, id }: { form: Form; id: string }) {\n const p = form.profiles.find((x) => x.id === form.values.profileId);\n return (\n <Field\n label=\"Pi profile\"\n htmlFor={`${id}-profile`}\n hint={\n p\n ? [p.provider, p.model, p.thinking ? `effort ${p.thinking}` : null]\n .filter(Boolean)\n .join(\" · \") || \"Pi defaults\"\n : undefined\n }\n >\n <select\n id={`${id}-profile`}\n className={SELECT_CLASS}\n value={form.values.profileId}\n onChange={(e) => form.set.profileId(e.target.value)}\n >\n {form.profiles.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n {form.project?.defaultProfileId === p.id ? \" (project default)\" : \"\"}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n\nfunction PromptField({ form, id }: { form: Form; id: string }) {\n return (\n <Field label=\"Initial prompt (optional)\" htmlFor={`${id}-prompt`}>\n <TextArea\n id={`${id}-prompt`}\n minRows={3}\n maxHeight=\"30vh\"\n value={form.values.prompt}\n placeholder=\"What should Pi work on?\"\n onChange={(e) => form.set.prompt(e.target.value)}\n />\n </Field>\n );\n}\n\nfunction Preview({ form }: { form: Form }) {\n return (\n <section\n aria-label=\"Preview\"\n data-testid=\"new-session-preview\"\n className=\"flex min-w-0 flex-col gap-1 rounded-md border border-border bg-surface-2 p-3 text-sm\"\n >\n <h3 className=\"flex items-center gap-1.5 font-medium\">\n <GitBranch aria-hidden className=\"size-4\" />\n Result\n </h3>\n {form.preview ? (\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-0.5\">\n <dt className=\"text-muted\">Branch</dt>\n <dd className=\"min-w-0 font-mono text-xs break-all\">{form.preview.branch}</dd>\n <dt className=\"text-muted\">Path</dt>\n <dd className=\"min-w-0 font-mono text-xs break-all\">{form.preview.path}</dd>\n <dt className=\"text-muted\">Host</dt>\n <dd className=\"min-w-0 break-words\">{form.host?.name ?? \"Unknown\"}</dd>\n </dl>\n ) : (\n <p className=\"text-muted\">Choose a workspace to see the branch and path.</p>\n )}\n {form.values.mode === \"new\" && form.preview && (\n <p className=\"text-xs text-muted\">A new Git worktree is created at this path.</p>\n )}\n </section>\n );\n}\n\nfunction Problems({ problems }: { problems: string[] }) {\n if (problems.length === 0) return null;\n return (\n <ul className=\"flex flex-col gap-0.5 text-xs text-muted\" aria-live=\"polite\">\n {problems.map((p) => (\n <li key={p}>{p}</li>\n ))}\n </ul>\n );\n}\n\nconst STEPS = [\"Project\", \"Workspace\", \"Profile\", \"Prompt\"] as const;\n\n/**\n * New session: a dialog on desktop, sequential sheets on mobile. Creating\n * posts `/api/sessions` and shows \"Starting…\" until the session arrives over\n * sync; it never reports success before that.\n */\nexport function NewSessionFlow({\n open,\n onClose,\n onCreated,\n mobile,\n}: {\n open: boolean;\n onClose: () => void;\n onCreated: (sessionId: string) => void;\n mobile: boolean;\n}) {\n const id = useId();\n const form = useNewSessionForm(open);\n const [step, setStep] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const [createdId, setCreatedId] = useState<string | null>(null);\n const [slow, setSlow] = useState(false);\n const arrived = useSyncStore((s) => (createdId ? !!s.sessions[createdId] : false));\n\n useEffect(() => {\n if (!open) {\n setStep(0);\n setError(null);\n setCreatedId(null);\n setSlow(false);\n setSubmitting(false);\n }\n }, [open]);\n\n const delivered = useRef<string | null>(null);\n const { reset } = form;\n useEffect(() => {\n if (createdId && arrived && delivered.current !== createdId) {\n delivered.current = createdId;\n reset();\n onCreated(createdId);\n }\n }, [createdId, arrived, onCreated, reset]);\n\n useEffect(() => {\n if (!createdId) return;\n const t = setTimeout(() => setSlow(true), 10_000);\n return () => clearTimeout(t);\n }, [createdId]);\n\n const create = async () => {\n if (form.problems.length || submitting) return;\n const v = form.values;\n setSubmitting(true);\n setError(null);\n try {\n const s = await codeApi.createSession({\n projectId: v.projectId,\n workspace:\n v.mode === \"existing\"\n ? { existingId: v.workspaceId }\n : { checkoutId: v.checkoutId, newBranch: v.branch.trim(), base: v.base.trim() || null },\n profileId: v.profileId || null,\n prompt: v.prompt,\n });\n setCreatedId(s.id);\n } catch (e) {\n setError(e);\n } finally {\n setSubmitting(false);\n }\n };\n\n const starting = createdId !== null;\n const status = starting ? (\n <div className=\"flex flex-col items-center gap-2\">\n <LoadingState label=\"Starting…\" className=\"py-4\" />\n {slow && (\n <>\n <p className=\"text-center text-sm text-muted\">\n The coordinator accepted the session but it has not synced yet. It may still be creating\n the worktree.\n </p>\n <Button onClick={() => createdId && onCreated(createdId)}>Open session</Button>\n </>\n )}\n </div>\n ) : null;\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 if (!mobile) {\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title=\"New session\"\n description=\"A task is not required.\"\n dismissOnBackdrop={!submitting && !starting}\n className=\"max-w-xl\"\n footer={\n <>\n <Button onClick={onClose}>{starting ? \"Close\" : \"Cancel\"}</Button>\n <Button\n variant=\"primary\"\n busy={submitting || starting}\n disabled={form.problems.length > 0}\n onClick={() => void create()}\n >\n {starting ? \"Starting…\" : \"Create session\"}\n </Button>\n </>\n }\n >\n {form.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-4\"\n onSubmit={(e) => {\n e.preventDefault();\n void create();\n }}\n >\n <ProjectField form={form} id={id} />\n <WorkspaceFields form={form} id={id} />\n <ProfileField form={form} id={id} />\n <PromptField form={form} id={id} />\n <Preview form={form} />\n <Problems problems={form.problems} />\n {errorBox}\n {status}\n </form>\n )}\n </Dialog>\n );\n }\n\n const last = step === STEPS.length - 1;\n const stepProblems =\n step === 0\n ? form.project\n ? []\n : [\"Select a project.\"]\n : step === 1\n ? form.problems.filter((p) => p !== \"Select a project.\")\n : [];\n return (\n <Sheet\n open={open}\n onClose={onClose}\n title={`New session: ${STEPS[step]}`}\n description={`Step ${step + 1} of ${STEPS.length}`}\n dismissOnBackdrop={!submitting && !starting}\n footer={\n <>\n {step > 0 && !starting && (\n <Button onClick={() => setStep((s) => s - 1)} disabled={submitting}>\n Back\n </Button>\n )}\n {last ? (\n <Button\n variant=\"primary\"\n busy={submitting || starting}\n disabled={form.problems.length > 0}\n onClick={() => void create()}\n >\n {starting ? \"Starting…\" : \"Create session\"}\n </Button>\n ) : (\n <Button\n variant=\"primary\"\n disabled={stepProblems.length > 0}\n onClick={() => setStep((s) => s + 1)}\n >\n Next\n </Button>\n )}\n </>\n }\n >\n <ol aria-label=\"Steps\" className=\"mb-3 flex gap-1\">\n {STEPS.map((s, i) => (\n <li\n key={s}\n aria-current={i === step ? \"step\" : undefined}\n className={cn(\"h-1 flex-1 rounded-full\", i <= step ? \"bg-accent\" : \"bg-border\")}\n >\n <span className=\"sr-only\">\n {s}\n {i < step ? \" (done)\" : \"\"}\n </span>\n </li>\n ))}\n </ol>\n <div className=\"flex min-w-0 flex-col gap-4\">\n {step === 0 && <ProjectField form={form} id={id} />}\n {step === 1 && <WorkspaceFields form={form} id={id} />}\n {step === 2 && <ProfileField form={form} id={id} />}\n {step === 3 && (\n <>\n <PromptField form={form} id={id} />\n <Preview form={form} />\n </>\n )}\n {step === 1 && <Preview form={form} />}\n <Problems problems={last ? form.problems : stepProblems} />\n {errorBox}\n {status}\n </div>\n </Sheet>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Dialog } from \"../../components/ui/Overlay\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { TextInput } from \"../../components/ui/TextArea\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { formatTime } from \"../../lib/time\";\nimport { errorMessage } from \"../../sync/api\";\nimport { codeApi } from \"./api\";\nimport type { SessionContext } from \"./hooks\";\nimport { useMutation } from \"./hooks\";\nimport { isBusy, isLive } from \"./model\";\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 busy: { takeover: boolean; ret: boolean; stop: boolean; resume: 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\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 = session.archivedAt\n ? \"Already archived\"\n : isBusy(session)\n ? \"Stop the session before archiving it\"\n : null;\n\n const dialogs = (\n <>\n <Dialog\n open={dialog === \"stop\"}\n onClose={close}\n title=\"Stop this session?\"\n description=\"Stops the current execution and clears queued messages.\"\n footer={\n <>\n <Button onClick={close}>Cancel</Button>\n <Button\n variant=\"danger\"\n busy={stop.busy}\n onClick={() => void stop.run().then((ok) => ok && setDialog(null))}\n >\n Stop session\n </Button>\n </>\n }\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 {stop.error !== null && (\n <ErrorState compact title=\"Could not stop\" error={errorMessage(stop.error)} />\n )}\n </Dialog>\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 <label htmlFor=\"sy-rename-input\" className=\"text-sm font-medium\">\n Title\n </label>\n <TextInput\n id=\"sy-rename-input\"\n value={title}\n maxLength={200}\n onChange={(e) => setTitle(e.target.value)}\n />\n {rename.error !== null && (\n <ErrorState compact title=\"Could not rename\" error={errorMessage(rename.error)} />\n )}\n </form>\n </Dialog>\n\n <Dialog\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 footer={\n <>\n <Button onClick={close}>Cancel</Button>\n <Button\n variant=\"primary\"\n busy={archive.busy}\n onClick={() =>\n void archive.run().then((ok) => {\n if (!ok) return;\n setDialog(null);\n navigate(\"/code\");\n })\n }\n >\n Archive\n </Button>\n </>\n }\n >\n {session.runtime === \"idle\" && (\n <p className=\"text-sm text-muted\">The idle Pi process is stopped first.</p>\n )}\n {archive.error !== null && (\n <ErrorState compact title=\"Could not archive\" error={errorMessage(archive.error)} />\n )}\n </Dialog>\n\n <Dialog open={dialog === \"info\"} onClose={close} title=\"Native session information\">\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={`${ctx.hostName} (${ctx.link})`} />\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 </dl>\n </Dialog>\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 busy: { takeover: takeover.busy, ret: ret.busy, stop: stop.busy, resume: resume.busy },\n dialogs,\n };\n}\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","import {\n Camera,\n Hand,\n ImagePlus,\n ListPlus,\n Navigation,\n Paperclip,\n Play,\n SendHorizontal,\n Slash,\n TriangleAlert,\n X,\n} from \"lucide-react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useHideBottomNav } from \"../../app/chrome\";\nimport { Button } from \"../../components/ui/Button\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { Sheet } from \"../../components/ui/Overlay\";\nimport { ErrorState } from \"../../components/ui/states\";\nimport { TextArea } from \"../../components/ui/TextArea\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { usePrefs } from \"../../prefs\";\nimport { errorMessage } from \"../../sync/api\";\nimport { codeApi, type PromptMode } from \"./api\";\nimport type { SessionContext } from \"./hooks\";\nimport {\n composerBlockReason,\n type ImageAttachment,\n isBusy,\n readImageFile,\n SUBAGENT_READ_ONLY,\n sendModes,\n} from \"./model\";\n\nexport interface ComposerProps {\n ctx: SessionContext;\n draft: string;\n setDraft: (t: string) => void;\n clearDraft: () => void;\n mobile: boolean;\n onTakeover?: () => void;\n takeoverBusy?: boolean;\n onResume?: () => void;\n resumeBusy?: 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({\n ctx,\n draft,\n setDraft,\n clearDraft,\n mobile,\n onTakeover,\n takeoverBusy,\n onResume,\n resumeBusy,\n className,\n}: 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 [slashDismissed, setSlashDismissed] = useState(false);\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 commandAdapters = ctx.adapters.filter(\n (a) => a.status === \"active\" && a.capabilities.includes(\"commands\"),\n );\n const slashOpen = !mobile && !slashDismissed && /^\\/\\S*$/.test(draft) && focused;\n\n const send = async (mode: PromptMode) => {\n if (block || noText || busy) return;\n const sent = draft;\n setBusy(mode);\n setError(null);\n try {\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?.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 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 : 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: tapping Send must not blur the draft first. The blur would bring back the bottom\n // nav (hidden while composing) and shift the composer under the finger, losing the tap.\n const keepFocus = mobile\n ? { onPointerDown: (e: React.PointerEvent) => e.preventDefault() }\n : undefined;\n\n const profile = session.profileSnapshot;\n const profileText = [\n profile.name,\n profile.provider && profile.model\n ? `${profile.provider}/${profile.model}`\n : (profile.model ?? null),\n profile.thinking ? `effort ${profile.thinking}` : null,\n ]\n .filter(Boolean)\n .join(\" · \");\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(\"shrink-0 border-t border-border bg-surface px-3 pt-2 pb-2\", className)}\n >\n <div className=\"mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-2\">\n {ctx.control === \"automation\" && !block && (\n <div\n role=\"note\"\n className=\"flex flex-wrap items-center gap-2 rounded-md bg-warning-soft px-3 py-1.5 text-sm\"\n >\n <TriangleAlert aria-hidden className=\"size-4 shrink-0 text-warning\" />\n <span className=\"min-w-0 flex-1\">{AUTOMATION_WARNING}</span>\n {onTakeover && (\n <Button\n size=\"sm\"\n icon={<Hand className=\"size-3.5\" />}\n busy={takeoverBusy}\n onClick={onTakeover}\n >\n Take over\n </Button>\n )}\n </div>\n )}\n {ctx.control === \"human\" && (\n <p className=\"flex items-center gap-1.5 text-xs text-muted\">\n <Hand aria-hidden className=\"size-3.5\" />\n You have control. Automatic continuations are paused.\n </p>\n )}\n {block && (\n <div\n role=\"status\"\n className=\"flex flex-wrap items-center gap-2 rounded-md bg-surface-2 px-3 py-1.5 text-sm\"\n >\n <span className=\"min-w-0 flex-1 font-medium\">{block.reason}</span>\n {block.action === \"resume\" && onResume && (\n <Button\n size=\"sm\"\n variant=\"primary\"\n icon={<Play className=\"size-3.5\" />}\n busy={resumeBusy}\n onClick={onResume}\n >\n Resume\n </Button>\n )}\n </div>\n )}\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 {slashOpen && (\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 adapters={commandAdapters.map((a) => a.id)}\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 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 (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.startsWith(\"/\")) setDraft(`/${draft}`);\n setSlashDismissed(false);\n textRef.current?.focus();\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 {profileText}\n </span>\n <span className=\"min-w-0 flex-1 sm:hidden\" />\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 icon={<Navigation className=\"size-3.5\" />}\n busy={busy === \"steer\"}\n disabled={!!block || noText || (busy !== null && busy !== \"steer\")}\n onClick={() => void send(\"steer\")}\n {...keepFocus}\n >\n Steer\n </Button>\n )}\n {modes.followUp && (\n <Button\n size=\"sm\"\n variant=\"primary\"\n icon={<ListPlus className=\"size-3.5\" />}\n busy={busy === \"followUp\"}\n disabled={!!block || noText || (busy !== null && busy !== \"followUp\")}\n onClick={() => void send(\"followUp\")}\n {...keepFocus}\n >\n Queue follow-up\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}\n onClick={() => void send(\"prompt\")}\n {...keepFocus}\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 <Sheet open={commandSheet} onClose={() => setCommandSheet(false)} title=\"Commands\">\n <SlashHint adapters={commandAdapters.map((a) => a.id)} />\n <div className=\"mt-3\">\n <Button\n block\n variant=\"primary\"\n onClick={() => {\n if (!draft.startsWith(\"/\")) setDraft(`/${draft}`);\n setCommandSheet(false);\n requestAnimationFrame(() => textRef.current?.focus());\n }}\n >\n Start a command\n </Button>\n </div>\n </Sheet>\n </section>\n );\n}\n\nfunction SlashHint({\n adapters,\n onClose,\n className,\n}: {\n adapters: string[];\n onClose?: () => void;\n className?: string;\n}) {\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&apos;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 {adapters.length > 0 && (\n <p className=\"mt-1 text-xs text-muted\">\n Extensions with commands on this host: {adapters.join(\", \")}\n </p>\n )}\n </div>\n );\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 { Link } from \"react-router\";\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 { Sheet } from \"../../components/ui/Overlay\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { formatDuration, formatTime } from \"../../lib/time\";\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\";\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 <NoticeItem level={item.data.level} text={item.data.text} />;\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 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 <LoaderCircle aria-hidden className=\"size-3 animate-spin\" />\n Writing…\n </span>\n )}\n </RowLabel>\n {thinking && <ThinkingItem text={thinking} live />}\n {text ? <Markdown text={text} /> : !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 <Icon\n aria-hidden\n className={cn(\n \"size-4 shrink-0\",\n running && \"animate-spin text-info\",\n data.status === \"ok\" && \"text-success\",\n data.status === \"error\" && \"text-danger\",\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({ level, text }: { level: \"info\" | \"warning\" | \"error\"; text: string }) {\n const Icon = NOTICE_ICON[level];\n return (\n <div\n role={level === \"error\" ? \"alert\" : \"note\"}\n className={cn(\n \"flex min-w-0 items-start gap-2 rounded-md border px-3 py-2 text-sm\",\n level === \"info\" && \"border-border bg-surface-2\",\n level === \"warning\" && \"border-transparent bg-warning-soft\",\n level === \"error\" && \"border-transparent bg-danger-soft\",\n )}\n >\n <Icon\n aria-hidden\n className={cn(\n \"mt-0.5 size-4 shrink-0\",\n level === \"warning\" && \"text-warning\",\n level === \"error\" && \"text-danger\",\n level === \"info\" && \"text-muted\",\n )}\n />\n <span className=\"sr-only\">{NOTICE_LABEL[level]}: </span>\n <span className=\"min-w-0 break-words whitespace-pre-wrap\">{text}</span>\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={() =>\n void navigator.clipboard?.writeText(text).then(() => toast.success(\"Copied\"))\n }\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\n aria-hidden\n className={cn(\"mt-0.5 size-4 shrink-0 text-muted\", Icon === LoaderCircle && \"animate-spin\")}\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 <Link\n to={`/code/${encodeURIComponent(data.linkedSessionId)}`}\n className=\"text-sm text-accent underline underline-offset-2\"\n >\n Open {linked?.title ?? \"subagent session\"}\n </Link>\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 rounded-lg 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 <LoaderCircle aria-hidden className=\"size-3.5 animate-spin\" />\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","import { ArrowDown } from \"lucide-react\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { ErrorState, InteractionPending, 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 { 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\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}\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}: TranscriptProps) {\n const t = useTranscript(sessionId);\n const streams = useStreams(sessionId);\n const pending = usePendingInteractions(sessionId);\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 [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 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) el.scrollTop = el.scrollHeight;\n }, [entries.length, lastKey, firstKey, streamSize, t.loaded]);\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 {pending.length > 0 && (\n <div data-testid=\"needs-answer-strip\" className=\"shrink-0 px-3 pt-2\">\n <InteractionPending\n count={pending.length}\n onOpen={openFirstPending}\n label={\n pending.length === 1\n ? `Needs your answer: ${pending[0]!.title}`\n : `${pending.length} questions need your answer`\n }\n />\n </div>\n )}\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 [overflow-anchor:none] focus-visible:outline-offset-[-2px]\"\n >\n <div className=\"mx-auto flex w-full max-w-3xl 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 ? (\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 <TimelineRow\n key={entry.key}\n entry={entry}\n sessionId={sessionId}\n interactionReadOnly={interactionReadOnly}\n draftEmpty={draftEmpty}\n onUseSuggestion={onUseSuggestion}\n highlightInteractionId={highlight}\n />\n ))\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 );\n}\n","import {\n ArrowLeft,\n ChevronDown,\n ChevronUp,\n CircleAlert,\n EllipsisVertical,\n Play,\n SquareKanban,\n} from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"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 { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { StatusChip } from \"../../components/ui/StatusChip\";\nimport { HostUnavailable } from \"../../components/ui/states\";\nimport { useDraft } from \"../../drafts\";\nimport { usePendingInteractions, useSyncStore } from \"../../sync/store\";\nimport { MobileChanges } from \"./Changes\";\nimport { Composer } from \"./Composer\";\nimport { ControlChip, ConversationHeader, sessionMenuItems } from \"./ConversationHeader\";\nimport { CodeContext, type CodeViewContext, type InspectorTab } from \"./context\";\nimport { MobileDetails } from \"./Details\";\nimport type { SessionContext } from \"./hooks\";\nimport { AUTOMATION_LABEL, isSubagentView, SUBAGENT_READ_ONLY, workspaceLabel } from \"./model\";\nimport type { SessionActions } from \"./SessionActions\";\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/** Host unavailable, failed and interrupted states shown above the transcript. */\nfunction SessionBanners({ ctx, actions }: { ctx: SessionContext; actions: SessionActions }) {\n const { session } = ctx;\n const loadTranscript = useSyncStore((s) => s.loadTranscript);\n const subagent = isSubagentView(session);\n // A subagent's transcript is re-read from its native file on every open to show progress.\n useEffect(() => {\n if (subagent) void loadTranscript(session.id, { force: true });\n }, [subagent, session.id, loadTranscript]);\n return (\n <>\n {ctx.link !== \"connected\" && (\n <div className=\"shrink-0 px-3 pt-2\">\n <HostUnavailable\n compact\n hostName={ctx.hostName}\n connectivity={ctx.link === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n lastSeenAt={ctx.host?.lastSeenAt}\n detail=\"Showing the last known transcript. Sending and answers resume when the host reconnects.\"\n />\n </div>\n )}\n {session.runtime === \"failed\" && (\n <div className=\"shrink-0 px-3 pt-2\">\n <div\n role=\"alert\"\n className=\"flex flex-wrap items-start gap-2 rounded-md border border-border bg-danger-soft px-3 py-2 text-sm\"\n >\n <CircleAlert aria-hidden className=\"mt-0.5 size-4 shrink-0 text-danger\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium\">This session failed</div>\n <div className=\"break-words text-muted\">\n {session.runtimeDetail ?? \"Pi exited with an error.\"}\n </div>\n <Link to=\"/settings/diagnostics\" className=\"text-accent underline\">\n Open diagnostics\n </Link>\n </div>\n {actions.canResume && (\n <Button\n size=\"sm\"\n icon={<Play className=\"size-3.5\" />}\n busy={actions.busy.resume}\n onClick={actions.resume}\n >\n Resume\n </Button>\n )}\n </div>\n </div>\n )}\n {session.runtime === \"interrupted\" && session.runtimeDetail && (\n <p role=\"status\" className=\"shrink-0 px-4 pt-2 text-sm text-muted\">\n Interrupted: {session.runtimeDetail}\n </p>\n )}\n {session.archivedAt && (\n <p role=\"status\" className=\"shrink-0 px-4 pt-2 text-sm text-muted\">\n This session is archived.\n </p>\n )}\n </>\n );\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 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 <SessionBanners ctx={ctx} actions={actions} />\n <Transcript\n sessionId={ctx.session.id}\n draftEmpty={d.draft.trim() === \"\"}\n onUseSuggestion={d.onUseSuggestion}\n interactionReadOnly={interactionReadOnly(ctx)}\n focusInteractionId={focusInteractionId}\n />\n <Composer\n ctx={ctx}\n draft={d.draft}\n setDraft={d.setDraft}\n clearDraft={d.clearDraft}\n mobile={false}\n onTakeover={actions.takeover}\n takeoverBusy={actions.busy.takeover}\n onResume={actions.resume}\n resumeBusy={actions.busy.resume}\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 { session, project, workspace, task } = ctx;\n const navigate = useNavigate();\n const [tab, setTab] = useState<MobileTab>(() => mobileTabFor(tabRequest?.tab));\n const [metaOpen, setMetaOpen] = useState(false);\n const pending = usePendingInteractions(session.id);\n const d = useComposerDraft(session.id);\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\n const codeCtx = useMemo<CodeViewContext>(\n () => ({ mobile: true, openInspector: (t) => setTab(t === \"changes\" ? \"changes\" : \"details\") }),\n [],\n );\n\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.canResume\n ? [\n {\n id: \"resume\",\n label: \"Resume\",\n icon: <Play className=\"size-4\" />,\n onSelect: actions.resume,\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 <header className=\"flex min-w-0 shrink-0 items-center gap-1 border-b border-border bg-surface px-1.5 py-1 safe-pt\">\n <Link\n to=\"/code\"\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 <div className=\"min-w-0 flex-1\">\n <h1 className=\"truncate text-base leading-6 font-semibold\" title={session.title}>\n {session.title}\n </h1>\n </div>\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=\"shrink-0 border-b border-border bg-surface px-3\">\n <button\n type=\"button\"\n aria-expanded={metaOpen}\n aria-controls=\"sy-session-meta\"\n onClick={() => setMetaOpen((o) => !o)}\n className=\"tap flex w-full min-w-0 items-center gap-2 py-1.5 text-left text-xs text-muted\"\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {project?.name ?? \"No project\"} · {workspaceLabel(workspace, session.cwd)} ·{\" \"}\n {ctx.hostName}\n {ctx.link !== \"connected\" ? \" (offline)\" : \"\"} · {AUTOMATION_LABEL[ctx.control]}\n </span>\n {metaOpen ? (\n <ChevronUp aria-hidden className=\"size-4 shrink-0\" />\n ) : (\n <ChevronDown aria-hidden className=\"size-4 shrink-0\" />\n )}\n <span className=\"sr-only\">{metaOpen ? \"Hide details\" : \"Show details\"}</span>\n </button>\n {metaOpen && (\n <dl\n id=\"sy-session-meta\"\n className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 pb-2 text-xs\"\n >\n <dt className=\"text-muted\">Project</dt>\n <dd className=\"min-w-0 break-words\">{project?.name ?? \"None\"}</dd>\n <dt className=\"text-muted\">Branch</dt>\n <dd className=\"min-w-0 font-mono break-all\">\n {workspaceLabel(workspace, session.cwd)}\n </dd>\n <dt className=\"text-muted\">Host</dt>\n <dd className=\"min-w-0 break-words\">\n {ctx.hostName} ({ctx.link})\n </dd>\n <dt className=\"text-muted\">Control</dt>\n <dd>\n <ControlChip ctx={ctx} />\n {ctx.control === \"none\" && \"Manual session\"}\n </dd>\n <dt className=\"text-muted\">Path</dt>\n <dd className=\"min-w-0 font-mono break-all\">{session.cwd}</dd>\n <dt className=\"text-muted\">Profile</dt>\n <dd className=\"min-w-0 break-words\">{session.profileSnapshot.name}</dd>\n </dl>\n )}\n </div>\n <div className=\"shrink-0 bg-surface px-3 py-2\" 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 <span className=\"rounded-full bg-warning-soft px-1.5 text-xs text-warning\">\n {pending.length}\n <span className=\"sr-only\"> pending questions</span>\n </span>\n ) : undefined,\n },\n { value: \"changes\", label: \"Changes\" },\n { value: \"details\", label: \"Details\" },\n ]}\n />\n </div>\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n {tab === \"chat\" && (\n <section\n data-testid=\"conversation\"\n aria-label=\"Chat\"\n className=\"flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n <SessionBanners ctx={ctx} actions={actions} />\n <Transcript\n sessionId={session.id}\n draftEmpty={d.draft.trim() === \"\"}\n onUseSuggestion={d.onUseSuggestion}\n interactionReadOnly={interactionReadOnly(ctx)}\n focusInteractionId={focusInteractionId}\n />\n <Composer\n ctx={ctx}\n draft={d.draft}\n setDraft={d.setDraft}\n clearDraft={d.clearDraft}\n mobile\n onTakeover={actions.takeover}\n takeoverBusy={actions.busy.takeover}\n onResume={actions.resume}\n resumeBusy={actions.busy.resume}\n className=\"safe-pb\"\n />\n </section>\n )}\n {tab === \"changes\" && (\n <section\n aria-label=\"Changes\"\n className=\"relative min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\"\n >\n <MobileChanges ctx={ctx} />\n </section>\n )}\n {tab === \"details\" && (\n <section\n aria-label=\"Details\"\n className=\"relative min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\"\n >\n <MobileDetails ctx={ctx} actions={actions} />\n </section>\n )}\n </div>\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, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\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, useSessionContext } from \"./hooks\";\nimport { Inspector } from \"./Inspector\";\nimport { CONVERSATION_MIN, fitPanes } from \"./model\";\nimport { Navigator } from \"./Navigator\";\nimport { NewSessionFlow } from \"./NewSession\";\nimport { useSessionActions } from \"./SessionActions\";\nimport { Conversation, MobileSession } from \"./SessionView\";\n\nfunction useWidth<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\nfunction NoSession({ missing }: { missing: boolean }) {\n return missing ? (\n <EmptyState\n icon={<SearchX className=\"size-8\" />}\n title=\"Session not found\"\n description=\"It may have been archived, or this link points 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 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 [newOpen, setNewOpen] = useState(false);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [ref, width] = useWidth<HTMLDivElement>();\n const ctx = useSessionContext(props.session);\n\n const showInspector = !compact && !collapsed && !!ctx;\n const fit = fitPanes(width, paneSizes.navigator, showInspector ? paneSizes.inspector : null);\n\n const onCreated = useCallback(\n (id: string) => {\n setNewOpen(false);\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={() => setNewOpen(true)}\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={PANE_LIMITS.navigator.max}\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} />\n )}\n </div>\n <NewSessionFlow\n open={newOpen}\n onClose={() => setNewOpen(false)}\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 className=\"[&>div:last-child]:p-0\"\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 [newOpen, setNewOpen] = useState(false);\n const ctx = useSessionContext(props.session);\n const onCreated = useCallback(\n (id: string) => {\n setNewOpen(false);\n navigate(`/code/${encodeURIComponent(id)}`);\n },\n [navigate],\n );\n if (props.sessionId) {\n if (!props.hydrated) return <LoadingState label=\"Loading session…\" />;\n if (!ctx) return <NoSession missing />;\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={() => setNewOpen(true)}\n className=\"min-h-0 flex-1 safe-pt\"\n />\n <NewSessionFlow\n open={newOpen}\n onClose={() => setNewOpen(false)}\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\";\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 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,\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],"mappings":"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"}