@agimon-ai/po-template-advanced 0.0.0-alpha.85 → 0.0.0-alpha.87

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.
@@ -3,7 +3,7 @@ import { View } from "react-native-unistyles/components/native/View";
3
3
  import { Text } from "react-native-unistyles/components/native/Text";
4
4
  import { SectionList } from "react-native-unistyles/components/native/SectionList";
5
5
  import { Pressable } from "react-native-unistyles/components/native/Pressable";
6
- import { ActivityIcon, AlertIcon, Badge, BranchIcon, Button, CheckIcon, CountBadge, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, EditIcon, EmptyState, FolderIcon, ForkIcon, HostTag, InfoStrip, Input, KebabIcon, Label, ListRow, LiveDuration, PlusIcon, Sheet, SheetBody, SheetContent, SheetHeader, SheetTitle, Spinner, Textarea, TrashIcon, UsersIcon, fontOf } from "@agimon-ai/po-native-components";
6
+ import { ActivityIcon, AlertIcon, Badge, BranchIcon, Button, CheckIcon, CountBadge, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, EditIcon, EmptyState, FolderIcon, ForkIcon, HostTag, InfoStrip, Input, KebabIcon, Label, ListRow, LiveDuration, MonitorIcon, PlusIcon, Sheet, SheetBody, SheetContent, SheetHeader, SheetTitle, Spinner, Textarea, TrashIcon, UsersIcon, fontOf } from "@agimon-ai/po-native-components";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
8
  import { StyleSheet } from "react-native-unistyles";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1183,25 +1183,46 @@ function SessionCard({ session, onOpen, onMenu, onSetupMenu, hostLabel, stale =
1183
1183
  ]
1184
1184
  }), /* @__PURE__ */ jsxs(View, {
1185
1185
  style: styles.statusRow,
1186
- children: [stale ? null : session.restarting ? /* @__PURE__ */ jsx(Spinner, {
1187
- size: "small",
1188
- color: "dim",
1189
- label: "Restarting"
1190
- }) : tone === "running" ? /* @__PURE__ */ jsx(Spinner, {
1191
- size: "small",
1192
- color: "yellow"
1193
- }) : tone === "failed" ? /* @__PURE__ */ jsx(AlertIcon, {
1194
- size: 12,
1195
- color: "red"
1196
- }) : null, !stale && session.clock ? /* @__PURE__ */ jsx(LiveDuration, {
1197
- style: styles.status(tone),
1198
- label: session.clock.label,
1199
- since: session.clock.since
1200
- }) : /* @__PURE__ */ jsx(Text, {
1201
- style: styles.status(tone),
1202
- numberOfLines: 1,
1203
- children: stale ? "Last known" : session.status
1204
- })]
1186
+ children: [
1187
+ stale ? null : session.restarting ? /* @__PURE__ */ jsx(Spinner, {
1188
+ size: "small",
1189
+ color: "dim",
1190
+ label: "Restarting"
1191
+ }) : tone === "running" ? /* @__PURE__ */ jsx(Spinner, {
1192
+ size: "small",
1193
+ color: "yellow"
1194
+ }) : tone === "failed" ? /* @__PURE__ */ jsx(AlertIcon, {
1195
+ size: 12,
1196
+ color: "red"
1197
+ }) : null,
1198
+ !stale && session.clock ? /* @__PURE__ */ jsx(LiveDuration, {
1199
+ style: styles.status(tone),
1200
+ label: session.clock.label,
1201
+ since: session.clock.since
1202
+ }) : /* @__PURE__ */ jsx(Text, {
1203
+ style: styles.status(tone),
1204
+ numberOfLines: 1,
1205
+ children: stale ? "Last known" : session.status
1206
+ }),
1207
+ session.git ? /* @__PURE__ */ jsxs(View, {
1208
+ style: styles.branchRow,
1209
+ children: [
1210
+ /* @__PURE__ */ jsx(BranchIcon, {
1211
+ size: 13,
1212
+ color: "dim"
1213
+ }),
1214
+ /* @__PURE__ */ jsx(Text, {
1215
+ style: styles.branch,
1216
+ numberOfLines: 1,
1217
+ children: session.git.branch
1218
+ }),
1219
+ session.git.dirty ? /* @__PURE__ */ jsx(Text, {
1220
+ style: styles.modified,
1221
+ children: "modified"
1222
+ }) : null
1223
+ ]
1224
+ }) : null
1225
+ ]
1205
1226
  })]
1206
1227
  }),
1207
1228
  !stale ? /* @__PURE__ */ jsx(IconButton, {
@@ -1215,24 +1236,6 @@ function SessionCard({ session, onOpen, onMenu, onSetupMenu, hostLabel, stale =
1215
1236
  ]
1216
1237
  }),
1217
1238
  hostLabel ? /* @__PURE__ */ jsx(HostTag, { label: hostLabel }) : null,
1218
- session.git ? /* @__PURE__ */ jsxs(View, {
1219
- style: [styles.branchRow, session.profile && styles.underAvatar],
1220
- children: [
1221
- /* @__PURE__ */ jsx(BranchIcon, {
1222
- size: 13,
1223
- color: "dim"
1224
- }),
1225
- /* @__PURE__ */ jsx(Text, {
1226
- style: styles.branch,
1227
- numberOfLines: 1,
1228
- children: session.git.branch
1229
- }),
1230
- session.git.dirty ? /* @__PURE__ */ jsx(Text, {
1231
- style: styles.modified,
1232
- children: "modified"
1233
- }) : null
1234
- ]
1235
- }) : null,
1236
1239
  session.groups !== void 0 && session.groups.length > 0 ? /* @__PURE__ */ jsxs(View, {
1237
1240
  style: [styles.groupsRow, session.profile && styles.underAvatar],
1238
1241
  accessibilityLabel: "groups",
@@ -1510,19 +1513,24 @@ function AdvancedSessions({ workspaces, openSession, openWorkspace, actions, set
1510
1513
  } else if (!stale(section.workspace.id)) actions.createSession(section.workspace.id);
1511
1514
  }
1512
1515
  }) : null, /* @__PURE__ */ jsxs(View, {
1513
- style: [styles.hostGroup, !section.showWorkspace && styles.hostGroupNext],
1516
+ style: styles.hostGroup,
1514
1517
  children: [
1515
- hosts.length > 1 && selected === null && hostOf(section.workspace.id) ? /* @__PURE__ */ jsx(Text, {
1516
- style: styles.hostLabel,
1518
+ /* @__PURE__ */ jsxs(View, {
1519
+ style: styles.hostRow,
1517
1520
  accessibilityRole: "header",
1518
- numberOfLines: 2,
1519
- children: hostOf(section.workspace.id).label
1520
- }) : null,
1521
- /* @__PURE__ */ jsx(Text, {
1522
- style: styles.groupRoot,
1523
- numberOfLines: 1,
1524
- ellipsizeMode: "middle",
1525
- children: section.workspace.root
1521
+ children: [hosts.length > 1 && selected === null && hostOf(section.workspace.id) ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MonitorIcon, {
1522
+ size: 14,
1523
+ color: "dim"
1524
+ }), /* @__PURE__ */ jsxs(Text, {
1525
+ style: styles.hostLabel,
1526
+ numberOfLines: 1,
1527
+ children: [hostOf(section.workspace.id).label, " ·"]
1528
+ })] }) : null, /* @__PURE__ */ jsx(Text, {
1529
+ style: styles.groupRoot,
1530
+ numberOfLines: 1,
1531
+ ellipsizeMode: "middle",
1532
+ children: section.workspace.root
1533
+ })]
1526
1534
  }),
1527
1535
  !section.workspace.available ? /* @__PURE__ */ jsx(Text, {
1528
1536
  style: styles.unavailable,
@@ -1534,7 +1542,10 @@ function AdvancedSessions({ workspaces, openSession, openWorkspace, actions, set
1534
1542
  }) : null
1535
1543
  ]
1536
1544
  })] }),
1537
- renderSectionFooter: ({ section }) => /* @__PURE__ */ jsx(View, { style: section === sections[sections.length - 1] ? void 0 : styles.sectionGap }),
1545
+ renderSectionFooter: ({ section }) => {
1546
+ const next = sections[sections.indexOf(section) + 1];
1547
+ return /* @__PURE__ */ jsx(View, { style: next === void 0 ? void 0 : next.showWorkspace ? styles.sectionGap : styles.hostGap });
1548
+ },
1538
1549
  renderItem: ({ item: session, section }) => /* @__PURE__ */ jsx(View, {
1539
1550
  style: styles.sessionRow,
1540
1551
  children: /* @__PURE__ */ jsx(SessionCard, {
@@ -1693,7 +1704,7 @@ const styles = StyleSheet.create((theme) => {
1693
1704
  },
1694
1705
  groupHead: {
1695
1706
  flexDirection: "row",
1696
- alignItems: "flex-start",
1707
+ alignItems: "center",
1697
1708
  gap: theme.spacing(2),
1698
1709
  paddingHorizontal: theme.spacing(1),
1699
1710
  paddingBottom: theme.spacing(2),
@@ -1715,21 +1726,34 @@ const styles = StyleSheet.create((theme) => {
1715
1726
  groupRoot: {
1716
1727
  ...text("sm", theme.colors.dim),
1717
1728
  fontFamily: fontOf(theme.fontFamily.mono),
1729
+ flexShrink: 1,
1718
1730
  uni__dependencies: [0]
1719
1731
  },
1720
1732
  hostGroup: {
1721
1733
  gap: theme.spacing(1),
1722
1734
  paddingHorizontal: theme.spacing(1),
1723
- paddingBottom: theme.spacing(2),
1735
+ paddingBottom: theme.spacing(1),
1724
1736
  uni__dependencies: [0]
1725
1737
  },
1726
- hostGroupNext: {
1727
- borderTopWidth: 1,
1738
+ hostGap: {
1739
+ height: theme.spacing(3),
1740
+ uni__dependencies: [0]
1741
+ },
1742
+ hostRow: {
1743
+ flexDirection: "row",
1744
+ alignItems: "center",
1745
+ gap: theme.spacing(1.5),
1746
+ paddingBottom: theme.spacing(2),
1747
+ borderBottomWidth: 1,
1728
1748
  borderColor: theme.colors["border-soft"],
1729
- paddingTop: theme.spacing(3),
1730
1749
  uni__dependencies: [0]
1731
1750
  },
1732
- hostLabel: text("sm", theme.colors.dim),
1751
+ hostLabel: {
1752
+ ...text("sm", theme.colors.dim),
1753
+ flexShrink: 0,
1754
+ maxWidth: "60%",
1755
+ uni__dependencies: [0]
1756
+ },
1733
1757
  noSessions: {
1734
1758
  ...text("sm", theme.colors.dim),
1735
1759
  paddingHorizontal: theme.spacing(1),
@@ -1841,8 +1865,10 @@ const styles = StyleSheet.create((theme) => {
1841
1865
  },
1842
1866
  statusRow: {
1843
1867
  flexDirection: "row",
1868
+ flexWrap: "wrap",
1844
1869
  alignItems: "center",
1845
- gap: theme.spacing(1.5),
1870
+ columnGap: theme.spacing(1.5),
1871
+ rowGap: 2,
1846
1872
  uni__dependencies: [0]
1847
1873
  },
1848
1874
  status: (tone) => ({
@@ -1857,7 +1883,7 @@ const styles = StyleSheet.create((theme) => {
1857
1883
  branchRow: {
1858
1884
  flexDirection: "row",
1859
1885
  alignItems: "center",
1860
- gap: theme.spacing(1.5),
1886
+ gap: theme.spacing(1),
1861
1887
  uni__dependencies: [0]
1862
1888
  },
1863
1889
  branch: {
@@ -1 +1 @@
1
- {"version":3,"file":"native.mjs","names":["NativeTemplateSessionsActions","WebTemplateRailDirectoryListing","WebTemplateRailPendingSetup","WebTemplateRailSession","WebTemplateRailWorkspace","Button","CheckIcon","EditIcon","FolderIcon","fontOf","Input","Label","ListRow","PlusIcon","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","TrashIcon","Spinner","Textarea","ReactNode","useEffect","useState","StyleSheet","createProblem","MAX_GROUPS","sessionGroupOptions","Item","label","hint","danger","disabled","onPress","Items","items","styles","list","map","item","index","pressed","divider","itemLabel","meta","SessionStep","SessionMenuSheet","session","actions","onGroups","onClose","step","setStep","draft","setDraft","busy","setBusy","error","setError","close","name","remove","result","removeSession","id","undefined","open","body","trim","renameSession","text","strong","resumeSession","restartBlocked","restarting","restartSession","WorkspaceMenuSheet","workspace","confirming","setConfirming","deleteWorkspace","mono","root","available","resumeInWorkspace","SessionGroupsActions","Required","Pick","SessionGroupsSheet","sessions","forId","setForId","value","setValue","query","setQuery","renaming","setRenaming","group","deleting","setDeleting","groups","rowCancel","run","work","Promise","done","typed","options","shown","filter","includes","canCreate","some","problem","length","toggle","create","renameConfirm","to","renameGroup","current","Set","deleteConfirm","deleteGroup","on","total","members","reach","String","edge","rowEdit","rowActions","join","check","setSessionGroups","SetupMenuSheet","target","removePendingSetup","sessionId","setup","NonNullable","SUGGESTION_DEBOUNCE_MS","TRAILING_SEPARATORS","folderName","path","trimmed","replace","slice","lastIndexOf","AddWorkspaceActions","FolderBrowser","start","listDirectory","onSelect","setTarget","listing","setListing","stale","then","parent","browserHead","inset","directories","directory","AdmissionRow","instructions","workspaceId","checked","AddWorkspaceView","rows","discovering","manual","canSubmit","onPathChange","onNameChange","onInstructionsChange","onBrowse","onToggle","onSubmit","folderContent","count","row","retry","next","field","pathRow","admissionPathInput","entry","added","unchecked","admissionRow","AddWorkspaceSheet","setName","nameEdited","setNameEdited","setPath","setInstructions","discoveryRevision","setDiscoveryRevision","browsing","setBrowsing","suggestions","setSuggestions","discovery","setDiscovery","searchDirectories","discoverWorkspaces","addDeclaredWorkspaces","supportsDiscovery","shownName","trimmedPath","timer","setTimeout","declarations","clearTimeout","found","changePath","revision","finish","submit","selected","results","names","updated","find","addWorkspace","startsWith","theme","sans","fontFamily","size","color","fontSize","lineHeight","gap","spacing","uni__dependencies","borderRadius","lg","borderWidth","borderColor","colors","overflow","minHeight","justifyContent","paddingHorizontal","paddingVertical","borderTopWidth","hairlineWidth","borderTopColor","flexDirection","alignItems","pathInput","flex","minWidth","borderBottomWidth","borderBottomColor","width","height","dim","flexShrink","flexGrow","paddingBottom","enabled","magenta","faint","backgroundColor","red","hi","fontWeight","medium","lineHeightRelaxed","base","semibold","sm","styles","NativeTemplateSessionsActions","NativeTemplateSessionsProps","WebTemplateRailPendingSetup","WebTemplateRailSession","WebTemplateRailWorkspace","ActivityIcon","AlertIcon","Badge","BranchIcon","Button","CountBadge","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","FolderIcon","fontOf","ForkIcon","KebabIcon","HostTag","InfoStrip","Sheet","SheetContent","SheetHeader","SheetTitle","SheetBody","LiveDuration","PlusIcon","Spinner","UsersIcon","ReactNode","useCallback","useEffect","useMemo","useRef","useState","StyleSheet","AddWorkspaceSheet","SessionGroupsSheet","SessionMenuSheet","SetupMenuSheet","WorkspaceMenuSheet","NO_HOSTS","NonNullable","UNAVAILABLE_LABEL","StatusTone","statusTone","status","startsWith","includes","IconButton","label","onPress","children","disabled","pressed","styles","iconButton","iconPressed","SessionCard","session","onOpen","onMenu","onSetupMenu","hostLabel","stale","id","setup","tone","name","markColor","active","waiting","waitingCount","awaitingInput","String","card","nested","cardPressed","cardActive","cardHead","profile","avatar","initials","avatarBadge","cardText","nameRow","provenance","nameBadge","statusRow","restarting","clock","since","git","branchRow","underAvatar","branch","dirty","modified","groups","undefined","length","groupsRow","map","group","error","pendingSetups","setupHead","setupName","setupStatus","failed","recovery","WorkspaceHeader","workspace","actions","onWorkspaceMenu","onCreate","merged","groupHead","groupText","workspaceLink","groupName","legacy","available","createSession","sessionSections","workspaces","presentation","selectedHost","filter","hosts","some","visible","owner","hostForId","sections","key","members","data","item","kind","sessions","existing","find","section","push","flatMap","showWorkspace","index","SessionCreateMenu","onCreateWorkspace","onCreateSession","workspaceDisabled","sessionDisabled","defaultOpen","AdvancedSessions","openSession","openWorkspace","setHeaderAction","hostPresentation","setSelectedHost","initialHostId","selected","hostOf","host","choosing","setChoosing","chooseAction","setChooseAction","addHost","setAddHost","sessionMenu","setSessionMenu","workspaceMenu","setWorkspaceMenu","groupsFor","setGroupsFor","setupMenu","setSetupMenu","sessionId","adding","setAdding","addWorkspace","searchDirectories","listDirectory","addActions","addWorkspaceActions","canAdd","beginAdd","generalAction","createGeneralSession","current","canGeneral","beginGeneral","generalHost","createMenu","titleAdd","setSessionGroups","renameGroup","deleteGroup","removePendingSetup","groupActions","screen","listContent","member","entry","hostGroup","hostGroupNext","groupRoot","root","unavailable","noSessions","sectionGap","sessionRow","listHeader","onRetry","onGroups","open","create","theme","sans","fontFamily","text","size","color","fontSize","lineHeight","flex","backgroundColor","colors","rail","uni__dependencies","content","padding","spacing","gap","paddingBottom","height","paddingTop","railHead","flexDirection","alignItems","paddingHorizontal","marginBottom","listRailHead","railTitle","hi","fontWeight","semibold","minWidth","minHeight","justifyContent","dim","mono","borderTopWidth","borderColor","red","empty","paddingVertical","borderRadius","lg","borderWidth","borderStyle","border","emptyText","emptyButton","panel","marginLeft","width","green","position","top","right","bg","flexShrink","yellow","paddingLeft","flexWrap","md","marginVertical","templatePoTemplateAdvanced","templatePoTemplateAdvanced2","templatePoTemplateAdvanced3"],"sources":["../../src/extensions/(frontend)/template/_lib/sessionGroups.ts","../../src/extensions/(frontend)/template/_components/AdvancedSessionMenus.native.tsx","../../src/extensions/(frontend)/template/_components/AdvancedSessions.native.tsx","../../src/extensions/(frontend)/template/_lib/nativeDefinition.native.ts","../../src/extensions/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native.ts","../../generated/native.ts"],"sourcesContent":["import type { WebTemplateRailSession } from '@agimon-ai/po-core/web';\n\n/** Mirrors the server's limits so the groups editor can say no before a round trip. */\nexport const MAX_GROUPS = 8;\nexport const MAX_GROUP_LENGTH = 32;\n\nexport interface SessionGroupOption {\n name: string;\n /** Other sessions in the group; the edited session is left out, since its check says it. */\n members: readonly string[];\n}\n\n/** Every group some session uses, in rail order, with the other sessions in it. */\nexport function sessionGroupOptions(\n sessions: readonly WebTemplateRailSession[],\n editedId: string,\n extra: readonly string[] = [],\n): SessionGroupOption[] {\n const names = [...new Set([...sessions.flatMap((session) => session.groups ?? []), ...extra])];\n return names.map((name) => ({\n name,\n members: sessions\n .filter((session) => session.id !== editedId && session.groups?.includes(name) === true)\n .map((session) => session.name || 'Untitled'),\n }));\n}\n\n/** Why a typed name cannot become a group, or undefined when it can. */\nexport function createProblem(name: string, count: number): string | undefined {\n if (name.length > MAX_GROUP_LENGTH) return `group names are at most ${String(MAX_GROUP_LENGTH)} characters.`;\n if (count >= MAX_GROUPS) return `a session can belong to at most ${String(MAX_GROUPS)} groups.`;\n return undefined;\n}\n","import type {\n NativeTemplateSessionsActions,\n WebTemplateRailDirectoryListing,\n WebTemplateRailPendingSetup,\n WebTemplateRailSession,\n WebTemplateRailWorkspace,\n} from '@agimon-ai/po-core/native';\nimport {\n Button,\n CheckIcon,\n EditIcon,\n FolderIcon,\n fontOf,\n Input,\n Label,\n ListRow,\n PlusIcon,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n TrashIcon,\n Spinner,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { createProblem, MAX_GROUPS, sessionGroupOptions } from '../_lib/sessionGroups';\n\ninterface Item {\n label: string;\n hint?: string;\n danger?: boolean;\n disabled?: boolean;\n onPress: () => void;\n}\n\nfunction Items({ items }: { items: readonly Item[] }) {\n return (\n <View style={styles.list}>\n {items.map((item, index) => (\n <Pressable\n key={item.label}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: item.disabled === true }}\n disabled={item.disabled}\n onPress={item.onPress}\n style={({ pressed }) => [styles.item, index > 0 && styles.divider, pressed && styles.pressed]}\n >\n <Text style={styles.itemLabel(item.danger === true, item.disabled === true)}>{item.label}</Text>\n {item.hint ? <Text style={styles.meta}>{item.hint}</Text> : null}\n </Pressable>\n ))}\n </View>\n );\n}\n\ntype SessionStep = 'menu' | 'rename' | 'confirm';\n\n/** A session card's ⋮: the cockpit's rename, groups, resume, restart and remove, with remove confirmed first. */\nexport function SessionMenuSheet({\n session,\n actions,\n onGroups,\n onClose,\n}: {\n session: WebTemplateRailSession | null;\n actions: NativeTemplateSessionsActions;\n /** Opens the groups sheet; absent when the phone app cannot change groups. */\n onGroups?: (session: WebTemplateRailSession) => void;\n onClose: () => void;\n}) {\n const [step, setStep] = useState<SessionStep>('menu');\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setStep('menu');\n setError('');\n onClose();\n };\n const name = session?.name || 'Untitled';\n const remove = async () => {\n if (session === null) return;\n setBusy(true);\n setError('');\n const result = await actions.removeSession(session.id);\n setBusy(false);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n setStep('menu');\n onClose();\n };\n return (\n <Sheet open={session !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {session === null ? null : step === 'rename' ? (\n <>\n <SheetHeader>\n <SheetTitle>Rename session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Input value={draft} onChangeText={setDraft} autoFocus accessibilityLabel=\"Session name\" />\n <Button\n variant=\"primary\"\n size=\"lg\"\n disabled={draft.trim() === ''}\n onPress={() => {\n actions.renameSession(session.id, draft);\n close();\n }}\n >\n Rename\n </Button>\n </SheetBody>\n </>\n ) : step === 'confirm' ? (\n <>\n <SheetHeader>\n <SheetTitle>Remove session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.text}>\n This stops <Text style={styles.strong}>{name}</Text> and removes it from the list. Anything it is\n running ends now. You can restore it for 7 days.\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button variant=\"danger\" size=\"lg\" loading={busy} loadingLabel=\"Removing\" onPress={() => void remove()}>\n Remove\n </Button>\n <Button variant=\"ghost\" size=\"lg\" disabled={busy} onPress={() => setStep('menu')}>\n Cancel\n </Button>\n </SheetBody>\n </>\n ) : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: 'Rename',\n onPress: () => {\n setDraft(session.name);\n setStep('rename');\n },\n },\n ...(onGroups\n ? [\n {\n label: 'Groups',\n hint: 'Sessions in a group can message each other',\n onPress: () => {\n close();\n onGroups(session);\n },\n },\n ]\n : []),\n {\n label: 'Resume',\n hint: 'Open an earlier conversation in this session',\n onPress: () => {\n close();\n actions.resumeSession(session.id);\n },\n },\n {\n label: 'Restart',\n hint: session.restartBlocked ? 'Not while a turn runs' : 'Reloads extensions',\n disabled: session.restarting || session.restartBlocked === true,\n onPress: () => {\n close();\n actions.restartSession(session.id);\n },\n },\n { label: 'Remove', danger: true, onPress: () => setStep('confirm') },\n ]}\n />\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\n/** A workspace's ⋮: resume a saved conversation here, or remove the workspace after confirming. */\nexport function WorkspaceMenuSheet({\n workspace,\n actions,\n onClose,\n}: {\n workspace: WebTemplateRailWorkspace | null;\n actions: NativeTemplateSessionsActions;\n onClose: () => void;\n}) {\n const [confirming, setConfirming] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setConfirming(false);\n setError('');\n onClose();\n };\n const remove = async () => {\n if (workspace === null) return;\n setBusy(true);\n setError('');\n const result = await actions.deleteWorkspace(workspace.id);\n setBusy(false);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n setConfirming(false);\n onClose();\n };\n return (\n <Sheet open={workspace !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {workspace === null ? null : confirming ? (\n <>\n <SheetHeader>\n <SheetTitle>Remove workspace</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.text}>\n This unregisters <Text style={styles.strong}>{workspace.name}</Text> from Po only. Files at{' '}\n <Text style={styles.mono}>{workspace.root}</Text> stay on disk. Its sessions must be removed first.\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button variant=\"danger\" size=\"lg\" loading={busy} loadingLabel=\"Removing\" onPress={() => void remove()}>\n Remove\n </Button>\n <Button variant=\"ghost\" size=\"lg\" disabled={busy} onPress={() => setConfirming(false)}>\n Cancel\n </Button>\n </SheetBody>\n </>\n ) : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{workspace.name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: 'Resume session',\n disabled: !workspace.available,\n onPress: () => {\n close();\n actions.resumeInWorkspace(workspace.id);\n },\n },\n { label: 'Remove workspace', danger: true, onPress: () => setConfirming(true) },\n ]}\n />\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\nexport type SessionGroupsActions = Required<\n Pick<NativeTemplateSessionsActions, 'setSessionGroups' | 'renameGroup' | 'deleteGroup'>\n>;\n\n/**\n * The cockpit's groups dialog as a sheet. Rows check groups on and off and the typed name can\n * become a new one; rename and delete act on every session in the group at once, the checks wait for Save.\n */\nexport function SessionGroupsSheet({\n session,\n sessions,\n actions,\n onClose,\n}: {\n session: WebTemplateRailSession | null;\n /** Every listed session, which is where the known groups and their members come from. */\n sessions: readonly WebTemplateRailSession[];\n actions: SessionGroupsActions;\n onClose: () => void;\n}) {\n const [forId, setForId] = useState<string | null>(null);\n const [value, setValue] = useState<string[]>([]);\n const [query, setQuery] = useState('');\n const [renaming, setRenaming] = useState<{ group: string; draft: string }>();\n const [deleting, setDeleting] = useState<string>();\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n // A new session starts from its own groups and a clean editor.\n if ((session?.id ?? null) !== forId) {\n setForId(session?.id ?? null);\n setValue([...(session?.groups ?? [])]);\n setQuery('');\n setRenaming(undefined);\n setDeleting(undefined);\n setError('');\n }\n const close = () => {\n if (!busy) onClose();\n };\n const rowCancel = () => {\n setRenaming(undefined);\n setDeleting(undefined);\n };\n const run = async (work: () => Promise<{ error: string } | undefined>, done: () => void) => {\n setBusy(true);\n setError('');\n const result = await work();\n setBusy(false);\n if (result === undefined) done();\n else setError(result.error);\n };\n const typed = query.trim();\n const options = session === null ? [] : sessionGroupOptions(sessions, session.id, value);\n const shown = options.filter((group) => group.name.includes(typed));\n const canCreate = typed !== '' && !options.some((group) => group.name === typed);\n const problem = canCreate ? createProblem(typed, value.length) : undefined;\n const toggle = (group: string) => {\n setError('');\n if (value.includes(group)) setValue(value.filter((name) => name !== group));\n else if (value.length >= MAX_GROUPS) setError(createProblem('', value.length) ?? '');\n else setValue([...value, group]);\n };\n const create = () => {\n if (!canCreate || problem !== undefined) return;\n setValue([...value, typed]);\n setQuery('');\n };\n const renameConfirm = () => {\n if (renaming === undefined) return;\n const to = renaming.draft.trim();\n if (to === '' || to === renaming.group) return rowCancel();\n void run(\n () => actions.renameGroup(renaming.group, to),\n () => {\n setValue((current) => [...new Set(current.map((name) => (name === renaming.group ? to : name)))]);\n rowCancel();\n },\n );\n };\n const deleteConfirm = () => {\n if (deleting === undefined) return;\n void run(\n () => actions.deleteGroup(deleting),\n () => {\n setValue((current) => current.filter((name) => name !== deleting));\n rowCancel();\n },\n );\n };\n\n return (\n <Sheet open={session !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {session === null ? null : (\n <>\n <SheetHeader>\n <SheetTitle>Session groups</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.meta}>Sessions that share a group can message each other.</Text>\n <Input\n value={query}\n onChangeText={setQuery}\n placeholder={value.length === 0 ? 'Find or create a group' : 'Add another'}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"done\"\n onSubmitEditing={() => {\n if (canCreate) create();\n else if (shown[0] !== undefined) {\n toggle(shown[0].name);\n setQuery('');\n }\n }}\n accessibilityLabel=\"Find or create a group\"\n />\n {shown.length > 0 || canCreate ? (\n <View style={styles.list}>\n {shown.map((group, index) => {\n const on = value.includes(group.name);\n const total = group.members.length + (on ? 1 : 0);\n const reach = total === 1 ? 'its one session' : `all ${String(total)} sessions`;\n const edge = index > 0 && styles.divider;\n if (renaming?.group === group.name)\n return (\n <View key={group.name} style={[styles.rowEdit, edge]}>\n <Input\n value={renaming.draft}\n onChangeText={(draft) => setRenaming({ ...renaming, draft })}\n autoFocus\n autoCapitalize=\"none\"\n autoCorrect={false}\n onSubmitEditing={renameConfirm}\n accessibilityLabel={`Rename ${group.name}`}\n />\n <Text style={styles.meta}>Renames it on {reach}.</Text>\n <View style={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onPress={rowCancel}>\n Cancel\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={renaming.draft.trim() === ''}\n loading={busy}\n loadingLabel=\"Renaming\"\n onPress={renameConfirm}\n >\n Rename\n </Button>\n </View>\n </View>\n );\n if (deleting === group.name)\n return (\n <View key={group.name} style={[styles.rowEdit, edge]}>\n <Text style={styles.text}>\n Remove <Text style={styles.strong}>{group.name}</Text> from {reach}? They can no longer\n message through it.\n </Text>\n <View style={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onPress={rowCancel}>\n Cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"sm\"\n loading={busy}\n loadingLabel=\"Deleting\"\n onPress={deleteConfirm}\n >\n Delete\n </Button>\n </View>\n </View>\n );\n return (\n <ListRow\n key={group.name}\n title={group.name}\n description={group.members.length === 0 ? 'No other sessions yet' : group.members.join(', ')}\n selected={on}\n leading={<View style={styles.check}>{on ? <CheckIcon size={16} color=\"green\" /> : null}</View>}\n trailing={\n <View style={styles.rowActions}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n accessibilityLabel={`Rename ${group.name}`}\n onPress={() => {\n setDeleting(undefined);\n setRenaming({ group: group.name, draft: group.name });\n }}\n >\n <EditIcon size={16} color=\"dim\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n accessibilityLabel={`Delete ${group.name}`}\n onPress={() => {\n setRenaming(undefined);\n setDeleting(group.name);\n }}\n >\n <TrashIcon size={16} color=\"dim\" />\n </Button>\n </View>\n }\n disclosure={false}\n onPress={() => toggle(group.name)}\n style={edge}\n />\n );\n })}\n {canCreate ? (\n <ListRow\n title={\n <Text style={styles.create(problem === undefined)} numberOfLines={1}>\n Create group “{typed}”\n </Text>\n }\n description={problem === undefined ? undefined : <Text style={styles.error}>{problem}</Text>}\n leading={<PlusIcon size={16} color={problem === undefined ? 'magenta' : 'faint'} />}\n disabled={problem !== undefined}\n disclosure={false}\n onPress={create}\n style={shown.length > 0 && styles.divider}\n />\n ) : null}\n </View>\n ) : null}\n <Text style={styles.meta}>\n {value.length} of {MAX_GROUPS} groups\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={busy && renaming === undefined && deleting === undefined}\n loadingLabel=\"Saving\"\n disabled={busy}\n onPress={() => void run(() => actions.setSessionGroups(session.id, value), onClose)}\n >\n Save\n </Button>\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\n/** A pending setup's ⋮: it has no runtime, so removing it is the only action, as in the cockpit. */\nexport function SetupMenuSheet({\n target,\n removePendingSetup,\n onClose,\n}: {\n target: { sessionId: string; setup: WebTemplateRailPendingSetup } | null;\n removePendingSetup: NonNullable<NativeTemplateSessionsActions['removePendingSetup']>;\n onClose: () => void;\n}) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setError('');\n onClose();\n };\n const remove = async () => {\n if (target === null) return;\n setBusy(true);\n setError('');\n const result = await removePendingSetup(target.sessionId, target.setup.id);\n setBusy(false);\n if (result === undefined) onClose();\n else setError(result.error);\n };\n return (\n <Sheet open={target !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {target === null ? null : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{target.setup.name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: busy ? 'Removing…' : 'Remove setup',\n danger: true,\n disabled: busy,\n onPress: () => void remove(),\n },\n ]}\n />\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\nconst SUGGESTION_DEBOUNCE_MS = 120;\nconst TRAILING_SEPARATORS = /\\/+$/u;\n\nfunction folderName(path: string): string {\n const trimmed = path.trim().replace(TRAILING_SEPARATORS, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1) || trimmed;\n}\n\nexport type AddWorkspaceActions = Required<\n Pick<NativeTemplateSessionsActions, 'addWorkspace' | 'searchDirectories' | 'listDirectory'>\n> &\n Pick<NativeTemplateSessionsActions, 'discoverWorkspaces' | 'addDeclaredWorkspaces'>;\n\n/** The cockpit's folder browser, in place: up, into a child, or use the current folder. */\nfunction FolderBrowser({\n start,\n listDirectory,\n onSelect,\n}: {\n start?: string;\n listDirectory: AddWorkspaceActions['listDirectory'];\n onSelect: (path: string) => void;\n}) {\n const [target, setTarget] = useState(start);\n const [listing, setListing] = useState<WebTemplateRailDirectoryListing | null>(null);\n const [error, setError] = useState('');\n useEffect(() => {\n let stale = false;\n void listDirectory(target).then((result) => {\n if (stale) return;\n if ('error' in result) setError(result.error);\n else {\n setError('');\n setListing(result);\n }\n });\n return () => {\n stale = true;\n };\n }, [target, listDirectory]);\n const parent = listing?.parent;\n return (\n <View style={styles.list}>\n <View style={styles.browserHead}>\n <Text style={styles.path} numberOfLines={1} ellipsizeMode=\"head\">\n {listing?.path ?? 'Loading…'}\n </Text>\n <Button size=\"sm\" disabled={listing === null} onPress={() => listing !== null && onSelect(listing.path)}>\n Use this folder\n </Button>\n </View>\n {error ? (\n <Text style={[styles.error, styles.inset]} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n {parent === undefined ? null : (\n <ListRow title=\"Parent folder\" disclosure={false} onPress={() => setTarget(parent)} style={styles.divider} />\n )}\n {listing?.directories.length === 0 ? <Text style={[styles.meta, styles.inset]}>No folders here</Text> : null}\n {listing?.directories.map((directory) => (\n <ListRow\n key={directory}\n title={folderName(directory)}\n leading={<FolderIcon size={16} color=\"dim\" />}\n onPress={() => setTarget(directory)}\n style={styles.divider}\n />\n ))}\n </View>\n );\n}\n\nexport interface AdmissionRow {\n name: string;\n instructions?: string;\n workspaceId?: string;\n checked: boolean;\n error?: string;\n}\n\n/** The approved native composition, shared by the real sheet and deterministic stories. */\nexport function AddWorkspaceView({\n open,\n path,\n name,\n instructions,\n rows,\n discovering,\n error,\n busy,\n manual,\n canSubmit,\n onPathChange,\n onNameChange,\n onInstructionsChange,\n onBrowse,\n onToggle,\n onSubmit,\n onClose,\n folderContent,\n}: {\n open: boolean;\n path: string;\n name: string;\n instructions: string;\n rows: readonly AdmissionRow[];\n discovering: boolean;\n error: string;\n busy: boolean;\n manual: boolean;\n canSubmit: boolean;\n onPathChange: (path: string) => void;\n onNameChange: (name: string) => void;\n onInstructionsChange: (instructions: string) => void;\n onBrowse: () => void;\n onToggle: (name: string) => void;\n onSubmit: () => void;\n onClose: () => void;\n folderContent?: ReactNode;\n}) {\n const count = rows.filter((row) => row.checked && !row.workspaceId).length;\n const retry = rows.some((row) => row.error);\n return (\n <Sheet open={open} onOpenChange={(next) => !next && !busy && onClose()}>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Add workspace</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <View style={styles.field}>\n <Label>Folder</Label>\n <View style={styles.pathRow}>\n <Input\n value={path}\n onChangeText={onPathChange}\n disabled={busy}\n placeholder=\"~/workspace/my-project\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n accessibilityLabel=\"Workspace folder\"\n style={styles.admissionPathInput}\n />\n <Button variant=\"outline\" disabled={busy} onPress={onBrowse}>\n Browse\n </Button>\n </View>\n </View>\n {folderContent}\n {discovering ? (\n <View style={styles.pathRow}>\n <Spinner label=\"Reading workspace declarations\" />\n <Text style={styles.meta}>Reading workspace declarations…</Text>\n </View>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n {rows.length > 0 ? (\n <View style={styles.field}>\n <Label>Workspaces</Label>\n <Text style={styles.meta}>Declared in .po/config.yaml. Choose which to add.</Text>\n {rows.map((entry) => {\n const added = entry.workspaceId !== undefined;\n return (\n <View key={entry.name}>\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityLabel={`${entry.name}${added ? ', Added' : ''}`}\n accessibilityHint={entry.instructions}\n accessibilityState={{ checked: entry.checked, disabled: added || busy }}\n disabled={added || busy}\n onPress={() => onToggle(entry.name)}\n >\n <ListRow\n title={entry.name}\n disclosure={false}\n description={\n <Text numberOfLines={1} style={styles.meta}>\n {entry.instructions}\n </Text>\n }\n leading={\n entry.checked ? <CheckIcon size={18} color=\"green\" /> : <View style={styles.unchecked} />\n }\n trailing={added ? <Text style={styles.meta}>Added</Text> : undefined}\n style={styles.admissionRow}\n />\n </Pressable>\n {entry.error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {entry.error}\n </Text>\n ) : null}\n </View>\n );\n })}\n </View>\n ) : null}\n {manual ? (\n <>\n <View style={styles.field}>\n <Label>Name</Label>\n <Input\n value={name}\n onChangeText={onNameChange}\n disabled={busy}\n placeholder=\"my-project\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n accessibilityLabel=\"Workspace name\"\n />\n </View>\n <View style={styles.field}>\n <Label>Instructions (optional)</Label>\n <Textarea\n rows={3}\n value={instructions}\n onChangeText={onInstructionsChange}\n disabled={busy}\n accessibilityLabel=\"Workspace instructions\"\n />\n <Text style={styles.meta}>For main sessions in this workspace.</Text>\n </View>\n {path.trim() === '' && name.trim() !== '' ? (\n <Text style={styles.meta}>\n Creates <Text style={styles.mono}>~/.po/workspace/{name.trim()}</Text>\n </Text>\n ) : null}\n </>\n ) : null}\n <Button\n variant=\"primary\"\n size=\"lg\"\n disabled={!canSubmit}\n loading={busy}\n loadingLabel=\"Adding\"\n onPress={onSubmit}\n >\n {rows.length > 0\n ? `${retry ? 'Retry' : 'Add'} ${count} workspace${count === 1 ? '' : 's'}`\n : 'Add workspace'}\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\n/** Discovery is optional so fetched templates still work with older phone providers. */\nexport function AddWorkspaceSheet({\n open,\n actions,\n onClose,\n}: {\n open: boolean;\n actions: AddWorkspaceActions;\n onClose: () => void;\n}) {\n const [name, setName] = useState('');\n const [nameEdited, setNameEdited] = useState(false);\n const [path, setPath] = useState('');\n const [instructions, setInstructions] = useState('');\n const [discoveryRevision, setDiscoveryRevision] = useState(0);\n const [browsing, setBrowsing] = useState(false);\n const [suggestions, setSuggestions] = useState<readonly string[]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const [discovery, setDiscovery] = useState<{ path: string; root: string; rows: AdmissionRow[]; error: string }>();\n const { searchDirectories, discoverWorkspaces, addDeclaredWorkspaces } = actions;\n const supportsDiscovery = discoverWorkspaces !== undefined && addDeclaredWorkspaces !== undefined;\n const shownName = nameEdited ? name : folderName(path);\n const trimmedPath = path.trim().replace(TRAILING_SEPARATORS, '') || (path.trim() === '' ? '' : '/');\n const current = discovery?.path === trimmedPath ? discovery : undefined;\n const discovering = supportsDiscovery && trimmedPath !== '' && current === undefined;\n const rows = current?.rows ?? [];\n const manual = !discovering && !current?.error && rows.length === 0;\n const canSubmit =\n !busy &&\n !discovering &&\n !current?.error &&\n (rows.length > 0\n ? rows.some((row) => row.checked && !row.workspaceId)\n : trimmedPath !== '' || shownName.trim() !== '');\n\n useEffect(() => {\n if (!open || !supportsDiscovery || trimmedPath === '' || discoverWorkspaces === undefined) return;\n let stale = false;\n const timer = setTimeout(() => {\n void discoverWorkspaces(trimmedPath).then(\n (result) => {\n if (stale) return;\n setDiscovery({\n path: trimmedPath,\n root: 'root' in result ? result.root : trimmedPath,\n rows: 'declarations' in result ? result.declarations.map((row) => ({ ...row, checked: true })) : [],\n error: 'error' in result ? result.error : '',\n });\n },\n () => {\n if (!stale)\n setDiscovery({\n path: trimmedPath,\n root: trimmedPath,\n rows: [],\n error: 'Could not read workspace declarations. Choose the folder again to retry.',\n });\n },\n );\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [open, trimmedPath, supportsDiscovery, discoverWorkspaces, discoveryRevision]);\n\n useEffect(() => {\n if (!open || path.trim() === '') return;\n let stale = false;\n const timer = setTimeout(async () => {\n const found = await searchDirectories(path.trim());\n if (!stale) setSuggestions(found.filter((directory) => directory !== path.trim()));\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [open, path, searchDirectories]);\n\n const changePath = (next: string) => {\n setPath(next);\n setDiscovery(undefined);\n setSuggestions([]);\n setError('');\n setDiscoveryRevision((revision) => revision + 1);\n };\n const finish = () => {\n setName('');\n setNameEdited(false);\n setPath('');\n setInstructions('');\n setBrowsing(false);\n setSuggestions([]);\n setError('');\n setDiscovery(undefined);\n onClose();\n };\n const submit = async () => {\n if (!canSubmit) return;\n setBusy(true);\n setError('');\n try {\n if (rows.length > 0 && addDeclaredWorkspaces !== undefined && current !== undefined) {\n const selected = rows.filter((row) => row.checked && !row.workspaceId);\n const { results } = await addDeclaredWorkspaces({ path: current.root, names: selected.map((row) => row.name) });\n const updated = rows.map((row) => {\n if (!selected.includes(row)) return row;\n const result = results.find((entry) => entry.name === row.name);\n return {\n ...row,\n workspaceId: result?.workspaceId,\n error: result?.error ?? (result?.workspaceId ? undefined : 'Could not add this workspace. Try again.'),\n };\n });\n setDiscovery({ ...current, rows: updated });\n if (updated.some((row) => row.checked && !row.workspaceId)) return;\n } else {\n const result = await actions.addWorkspace({\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n ...(instructions === '' ? {} : { instructions }),\n });\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n }\n finish();\n } catch {\n setError('Could not add the workspace. Try again.');\n } finally {\n setBusy(false);\n }\n };\n return (\n <AddWorkspaceView\n open={open}\n path={path}\n name={shownName}\n instructions={instructions}\n rows={rows}\n discovering={discovering}\n error={current?.error || error}\n busy={busy}\n manual={manual}\n canSubmit={canSubmit}\n onPathChange={changePath}\n onNameChange={(next) => {\n setNameEdited(true);\n setName(next);\n }}\n onInstructionsChange={setInstructions}\n onBrowse={() => setBrowsing((value) => !value)}\n onToggle={(name) =>\n current &&\n setDiscovery({\n ...current,\n rows: rows.map((row) => (row.name === name && !row.workspaceId ? { ...row, checked: !row.checked } : row)),\n })\n }\n onSubmit={() => void submit()}\n onClose={finish}\n folderContent={\n busy ? null : browsing ? (\n <FolderBrowser\n {...(trimmedPath.startsWith('/') ? { start: trimmedPath } : {})}\n listDirectory={actions.listDirectory}\n onSelect={(selected) => {\n changePath(selected);\n setBrowsing(false);\n }}\n />\n ) : suggestions.length > 0 ? (\n <View style={styles.list} accessibilityLabel=\"Matching folders\">\n {suggestions.map((directory, index) => (\n <ListRow\n key={directory}\n title={\n <Text style={styles.path} numberOfLines={1} ellipsizeMode=\"head\">\n {directory}\n </Text>\n }\n disclosure={false}\n onPress={() => changePath(`${directory}/`)}\n style={index > 0 && styles.divider}\n />\n ))}\n </View>\n ) : null\n }\n />\n );\n}\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const text = (size: 'sm' | 'base', color: string) => ({\n fontFamily: sans,\n fontSize: theme.fontSize[size],\n lineHeight: theme.lineHeight[size],\n color,\n });\n return {\n body: { gap: theme.spacing(3) },\n list: {\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n overflow: 'hidden',\n },\n item: {\n minHeight: 48,\n justifyContent: 'center',\n gap: 2,\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2.5),\n },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n field: { gap: theme.spacing(1.5) },\n pathRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n pathInput: { flex: 1, minWidth: 0 },\n admissionPathInput: { flex: 1, minWidth: 0, fontFamily: fontOf(theme.fontFamily.mono) },\n admissionRow: {\n minHeight: 44,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: theme.colors['border-soft'],\n },\n unchecked: { width: 18, height: 18, borderWidth: 1, borderColor: theme.colors.dim },\n browserHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2),\n },\n path: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1, flexGrow: 1 },\n inset: { paddingHorizontal: theme.spacing(4), paddingBottom: theme.spacing(2) },\n rowEdit: { gap: theme.spacing(2), paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(3) },\n rowActions: { flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', gap: theme.spacing(1) },\n check: { width: 16, alignItems: 'center' },\n // Creating a group is the person's own naming, so it reads rose like the group chips.\n create: (enabled: boolean) => text('base', enabled ? theme.colors.magenta : theme.colors.faint),\n pressed: { backgroundColor: theme.colors['tint-green'] },\n itemLabel: (danger: boolean, disabled: boolean) => ({\n ...text('base', disabled ? theme.colors.faint : danger ? theme.colors.red : theme.colors.hi),\n fontWeight: theme.fontWeight.medium,\n }),\n meta: text('sm', theme.colors.dim),\n text: { ...text('base', theme.colors.text), lineHeight: theme.lineHeightRelaxed.base },\n strong: { fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n mono: { fontFamily: fontOf(theme.fontFamily.mono), color: theme.colors.hi },\n error: { ...text('sm', theme.colors.red), lineHeight: theme.lineHeightRelaxed.sm },\n };\n});\n","import type {\n NativeTemplateSessionsActions,\n NativeTemplateSessionsProps,\n WebTemplateRailPendingSetup,\n WebTemplateRailSession,\n WebTemplateRailWorkspace,\n} from '@agimon-ai/po-core/native';\nimport {\n ActivityIcon,\n AlertIcon,\n Badge,\n BranchIcon,\n Button,\n CountBadge,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n EmptyState,\n FolderIcon,\n fontOf,\n ForkIcon,\n KebabIcon,\n HostTag,\n InfoStrip,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n LiveDuration,\n PlusIcon,\n Spinner,\n UsersIcon,\n} from '@agimon-ai/po-native-components';\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Pressable, SectionList, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n AddWorkspaceSheet,\n SessionGroupsSheet,\n SessionMenuSheet,\n SetupMenuSheet,\n WorkspaceMenuSheet,\n} from './AdvancedSessionMenus.native';\n\nconst NO_HOSTS: NonNullable<NativeTemplateSessionsProps['hostPresentation']>['hosts'] = [];\nconst UNAVAILABLE_LABEL = ' · Unavailable';\n\ntype StatusTone = 'failed' | 'running' | 'quiet';\n\n/** The same reading of the status line as the cockpit card. */\nfunction statusTone(status: string): StatusTone {\n if (status.startsWith('failed') || status.includes(' failed')) return 'failed';\n if (status.startsWith('running')) return 'running';\n return 'quiet';\n}\n\n/** A 44 point icon target, as the cockpit's ghost icon buttons. */\nfunction IconButton({\n label,\n onPress,\n children,\n disabled = false,\n}: {\n label: string;\n onPress: () => void;\n children: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled }}\n disabled={disabled}\n hitSlop={6}\n onPress={onPress}\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconPressed]}\n >\n {children}\n </Pressable>\n );\n}\n\nfunction SessionCard({\n session,\n onOpen,\n onMenu,\n onSetupMenu,\n hostLabel,\n stale = false,\n}: {\n session: WebTemplateRailSession;\n hostLabel?: string;\n stale?: boolean;\n onOpen: (id: string) => void;\n onMenu: (session: WebTemplateRailSession) => void;\n /** Absent when the phone app cannot remove a setup, so the panel shows no menu. */\n onSetupMenu?: (setup: WebTemplateRailPendingSetup) => void;\n}) {\n const tone = stale ? 'quiet' : statusTone(session.status);\n const name = session.name || 'Untitled';\n const markColor = session.active ? 'green' : 'faint';\n // A host without the count still marks a waiting card as one.\n const waiting = stale ? 0 : (session.waitingCount ?? (session.awaitingInput ? 1 : 0));\n return (\n <>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={waiting > 0 ? `Open ${name}, ${String(waiting)} waiting for you` : `Open ${name}`}\n disabled={stale}\n accessibilityState={{ disabled: stale }}\n onPress={() => onOpen(session.id)}\n style={({ pressed }) => [\n styles.card,\n session.nested && styles.nested,\n pressed && styles.cardPressed,\n !stale && session.active && styles.cardActive,\n ]}\n >\n <View style={styles.cardHead}>\n {session.profile ? (\n <View style={styles.avatar} accessibilityLabel={session.profile.label}>\n <Text style={styles.initials}>{session.profile.initials}</Text>\n {/* The rose count of things waiting on the person, on the avatar's top-right. */}\n <CountBadge count={waiting} style={styles.avatarBadge} />\n </View>\n ) : null}\n <View style={styles.cardText}>\n <View style={styles.nameRow}>\n {/* The cockpit card's provenance mark: a workflow pulse, or a fork for any other child. */}\n {session.nested && session.provenance === 'workflow-session' ? (\n <ActivityIcon size={13} color={markColor} accessibilityLabel=\"workflow session\" />\n ) : session.nested && session.provenance ? (\n <ForkIcon\n size={13}\n color={markColor}\n accessibilityLabel={\n session.provenance === 'worktree' ? 'automatic per-conversation worktree' : session.provenance\n }\n />\n ) : null}\n <Text style={styles.name} numberOfLines={2}>\n {name}\n </Text>\n {/* No avatar to sit on, so the count follows the name. */}\n {session.profile ? null : <CountBadge count={waiting} style={styles.nameBadge} />}\n </View>\n <View style={styles.statusRow}>\n {stale ? null : session.restarting ? (\n <Spinner size=\"small\" color=\"dim\" label=\"Restarting\" />\n ) : tone === 'running' ? (\n <Spinner size=\"small\" color=\"yellow\" />\n ) : tone === 'failed' ? (\n <AlertIcon size={12} color=\"red\" />\n ) : null}\n {!stale && session.clock ? (\n <LiveDuration style={styles.status(tone)} label={session.clock.label} since={session.clock.since} />\n ) : (\n <Text style={styles.status(tone)} numberOfLines={1}>\n {stale ? 'Last known' : session.status}\n </Text>\n )}\n </View>\n </View>\n {!stale ? (\n <IconButton label={`${name} actions`} onPress={() => onMenu(session)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </View>\n {hostLabel ? <HostTag label={hostLabel} /> : null}\n {session.git ? (\n <View style={[styles.branchRow, session.profile && styles.underAvatar]}>\n <BranchIcon size={13} color=\"dim\" />\n <Text style={styles.branch} numberOfLines={1}>\n {session.git.branch}\n </Text>\n {session.git.dirty ? <Text style={styles.modified}>modified</Text> : null}\n </View>\n ) : null}\n {session.groups !== undefined && session.groups.length > 0 ? (\n <View style={[styles.groupsRow, session.profile && styles.underAvatar]} accessibilityLabel=\"groups\">\n <UsersIcon size={13} color=\"dim\" />\n <View style={styles.groups}>\n {session.groups.map((group) => (\n <Badge key={group} tone=\"magenta\" size=\"xs\">\n {group}\n </Badge>\n ))}\n </View>\n </View>\n ) : null}\n {session.error ? (\n <Text style={styles.error} numberOfLines={3}>\n {session.error}\n </Text>\n ) : null}\n </Pressable>\n {/* A pending reservation has no runtime, so it sits outside the card and never opens the session. */}\n {session.pendingSetups.map((setup) => (\n <View key={setup.id} style={styles.setup}>\n <View style={styles.setupHead}>\n <Text style={[styles.name, styles.setupName]} numberOfLines={1}>\n {setup.name}\n </Text>\n {!stale && onSetupMenu ? (\n <IconButton label={`${setup.name} setup actions`} onPress={() => onSetupMenu(setup)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </View>\n <Text style={styles.setupStatus(setup.failed)}>{setup.status}</Text>\n {setup.recovery ? (\n <Text style={styles.recovery} accessibilityRole={setup.failed ? 'alert' : undefined}>\n {setup.recovery}\n </Text>\n ) : null}\n </View>\n ))}\n </>\n );\n}\n\nfunction WorkspaceHeader({\n workspace,\n actions,\n onWorkspaceMenu,\n onCreate,\n onOpen,\n merged = false,\n stale = false,\n}: {\n workspace: WebTemplateRailWorkspace;\n actions: NativeTemplateSessionsActions;\n onCreate?: () => void;\n onOpen?: () => void;\n merged?: boolean;\n stale?: boolean;\n onWorkspaceMenu: (workspace: WebTemplateRailWorkspace) => void;\n}) {\n return (\n <View style={styles.group}>\n <View style={styles.groupHead} accessibilityRole=\"header\">\n <FolderIcon size={16} color=\"dim\" />\n <Pressable\n style={[styles.groupText, styles.workspaceLink]}\n accessibilityRole={onOpen ? 'button' : 'header'}\n accessibilityLabel={onOpen ? `Open ${workspace.name} workspace` : workspace.name}\n disabled={!onOpen}\n onPress={onOpen}\n >\n <Text style={styles.groupName} numberOfLines={1}>\n {workspace.name}\n </Text>\n </Pressable>\n {workspace.legacy ? null : (\n <>\n {workspace.available && (!stale || merged) ? (\n <IconButton\n label={`New session in ${workspace.name}`}\n onPress={onCreate ?? (() => actions.createSession(workspace.id))}\n >\n <PlusIcon size={18} color=\"dim\" />\n </IconButton>\n ) : null}\n {!stale || merged ? (\n <IconButton label={`${workspace.name} actions`} onPress={() => onWorkspaceMenu(workspace)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </>\n )}\n </View>\n </View>\n );\n}\n\n/** Display grouping never rewrites workspace or session identity. */\nexport function sessionSections(\n workspaces: readonly WebTemplateRailWorkspace[],\n presentation?: NativeTemplateSessionsProps['hostPresentation'],\n selectedHost: string | null = null,\n) {\n const filter = presentation?.hosts.some(({ id }) => id === selectedHost) ? selectedHost : null;\n const visible = workspaces.filter((workspace) => {\n const owner = presentation?.hostForId[workspace.id];\n if (owner && !presentation?.hosts.some(({ id }) => id === owner)) return false;\n return filter === null || owner === filter;\n });\n const sections: {\n key: string;\n workspace: WebTemplateRailWorkspace;\n members: WebTemplateRailWorkspace[];\n data: readonly WebTemplateRailSession[];\n }[] = [];\n for (const workspace of [\n ...visible.filter((item) => item.kind === 'session'),\n ...visible.filter((item) => item.kind !== 'session'),\n ]) {\n if (workspace.kind === 'session' && workspace.sessions.length === 0) continue;\n const existing =\n workspace.kind === 'session'\n ? sections.find((section) => section.workspace.kind === 'session')\n : presentation && presentation.hosts.length > 1 && !workspace.legacy\n ? sections.find(\n (section) =>\n section.workspace.kind !== 'session' &&\n !section.workspace.legacy &&\n section.workspace.name === workspace.name,\n )\n : undefined;\n if (existing) {\n existing.members.push(workspace);\n existing.data = [...existing.data, ...workspace.sessions];\n existing.workspace = { ...existing.workspace, available: existing.workspace.available || workspace.available };\n } else sections.push({ key: workspace.id, workspace, members: [workspace], data: workspace.sessions });\n }\n return sections.flatMap((section) =>\n section.workspace.kind === 'session'\n ? [{ ...section, showWorkspace: false }]\n : section.members.map((workspace, index) => ({\n key: workspace.id,\n workspace,\n members: section.members,\n data: workspace.sessions,\n showWorkspace: index === 0,\n })),\n );\n}\n\nexport function SessionCreateMenu({\n onCreateWorkspace,\n onCreateSession,\n workspaceDisabled = false,\n sessionDisabled = false,\n defaultOpen = false,\n}: {\n onCreateWorkspace?: () => void;\n onCreateSession?: () => void;\n workspaceDisabled?: boolean;\n sessionDisabled?: boolean;\n defaultOpen?: boolean;\n}) {\n return (\n <DropdownMenu defaultOpen={defaultOpen}>\n <DropdownMenuTrigger variant=\"ghost\" size=\"icon\" accessibilityLabel=\"Create workspace or session\">\n <PlusIcon size={18} color=\"dim\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {onCreateWorkspace ? (\n <DropdownMenuItem disabled={workspaceDisabled} onSelect={onCreateWorkspace}>\n Create workspace\n </DropdownMenuItem>\n ) : null}\n {onCreateSession ? (\n <DropdownMenuItem disabled={sessionDisabled} onSelect={onCreateSession}>\n Create session\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/** The cockpit's workspace groups, with quiet computer subgroups in the All hosts view. */\nexport function AdvancedSessions({\n workspaces,\n openSession,\n openWorkspace,\n actions,\n setHeaderAction,\n hostPresentation,\n}: NativeTemplateSessionsProps) {\n const [selectedHost, setSelectedHost] = useState<string | null>(hostPresentation?.initialHostId ?? null);\n const selected = hostPresentation?.hosts.some(({ id }) => id === selectedHost) ? selectedHost : null;\n if (selectedHost !== selected) setSelectedHost(selected);\n const sections = useMemo(\n () => sessionSections(workspaces, hostPresentation, selected),\n [workspaces, hostPresentation, selected],\n );\n const hosts = hostPresentation?.hosts ?? NO_HOSTS;\n const hostOf = (id: string) => hosts.find((host) => host.id === hostPresentation?.hostForId[id]);\n const stale = (id: string) => hostPresentation !== undefined && hostOf(id)?.status !== 'connected';\n const [choosing, setChoosing] = useState<readonly WebTemplateRailWorkspace[] | 'add' | 'general' | null>(null);\n const [chooseAction, setChooseAction] = useState<'create' | 'menu' | 'open'>('create');\n const [addHost, setAddHost] = useState<string | null>(null);\n const [sessionMenu, setSessionMenu] = useState<string | null>(null);\n const [workspaceMenu, setWorkspaceMenu] = useState<string | null>(null);\n const [groupsFor, setGroupsFor] = useState<string | null>(null);\n const [setupMenu, setSetupMenu] = useState<{ sessionId: string; setup: WebTemplateRailPendingSetup } | null>(null);\n const [adding, setAdding] = useState(false);\n const { addWorkspace, searchDirectories, listDirectory } = actions;\n const addActions =\n hosts.length > 0\n ? hosts.find(({ id }) => id === addHost)?.addWorkspaceActions\n : addWorkspace && searchDirectories && listDirectory\n ? { addWorkspace, searchDirectories, listDirectory }\n : undefined;\n const canAdd =\n hosts.length > 0 ? hosts.some((host) => host.addWorkspaceActions !== undefined) : addActions !== undefined;\n const beginAdd = useCallback(() => {\n if (hosts.length > 1) {\n setChoosing('add');\n return;\n }\n if (hosts.length === 1) {\n if (hosts[0]!.status !== 'connected') return;\n setAddHost(hosts[0]!.id);\n }\n setAdding(true);\n }, [hosts]);\n const generalAction = useRef(actions.createGeneralSession);\n useEffect(() => {\n generalAction.current = actions.createGeneralSession;\n }, [actions.createGeneralSession]);\n const canGeneral =\n hosts.length > 0\n ? hosts.some((host) => host.createGeneralSession !== undefined)\n : actions.createGeneralSession !== undefined;\n const beginGeneral = useCallback(() => {\n const host = hosts.find((host) => host.id === selected) ?? (hosts.length === 1 ? hosts[0] : undefined);\n if (host) {\n if (host.status === 'connected') host.createGeneralSession?.();\n } else if (hosts.length > 1) setChoosing('general');\n else generalAction.current?.();\n }, [hosts, selected]);\n const workspaceDisabled = hosts.length === 1 && hosts[0]!.status !== 'connected';\n const generalHost = hosts.find((host) => host.id === selected) ?? (hosts.length === 1 ? hosts[0] : undefined);\n const sessionDisabled =\n generalHost !== undefined && (generalHost.status !== 'connected' || generalHost.createGeneralSession === undefined);\n const createMenu = useMemo(\n () => (\n <SessionCreateMenu\n onCreateWorkspace={canAdd ? beginAdd : undefined}\n onCreateSession={canGeneral ? beginGeneral : undefined}\n workspaceDisabled={workspaceDisabled}\n sessionDisabled={sessionDisabled}\n />\n ),\n [canAdd, canGeneral, beginAdd, beginGeneral, workspaceDisabled, sessionDisabled],\n );\n // The app owns the title, including when the list is empty.\n const titleAdd = (canGeneral || canAdd) && setHeaderAction !== undefined;\n useEffect(() => {\n if (!titleAdd) return;\n setHeaderAction(createMenu);\n return () => setHeaderAction(null);\n }, [titleAdd, setHeaderAction, createMenu]);\n const sessions = workspaces.flatMap((workspace) => workspace.sessions).filter((session) => !stale(session.id));\n const { setSessionGroups, renameGroup, deleteGroup, removePendingSetup } = actions;\n // Older phone apps lack these, so their entries stay hidden rather than failing on tap.\n const groupActions =\n setSessionGroups && renameGroup && deleteGroup ? { setSessionGroups, renameGroup, deleteGroup } : undefined;\n return (\n <>\n <SectionList\n style={styles.screen}\n contentContainerStyle={styles.listContent}\n contentInsetAdjustmentBehavior=\"automatic\"\n sections={sections}\n keyExtractor={(session) => session.id}\n stickySectionHeadersEnabled={false}\n initialNumToRender={12}\n maxToRenderPerBatch={12}\n windowSize={5}\n renderSectionHeader={({ section }) =>\n section.workspace.kind === 'session' ? null : (\n <>\n {section.showWorkspace ? (\n <WorkspaceHeader\n workspace={{ ...section.workspace, available: section.members.some((member) => member.available) }}\n actions={actions}\n onOpen={\n openWorkspace && !section.workspace.legacy\n ? () => {\n const members = workspaces.filter(\n (entry) => !entry.legacy && entry.name === section.workspace.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('open');\n setChoosing(members);\n } else openWorkspace(section.workspace.id);\n }\n : undefined\n }\n onWorkspaceMenu={(entry) => {\n const members = workspaces.filter(\n (workspace) => !workspace.legacy && workspace.name === entry.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('menu');\n setChoosing(members);\n } else if (!stale(entry.id)) setWorkspaceMenu(entry.id);\n }}\n stale={stale(section.workspace.id)}\n merged={section.members.length > 1}\n onCreate={() => {\n // Always choose for a merged heading, even while viewing a filtered computer.\n const members = workspaces.filter(\n (entry) => !entry.legacy && entry.name === section.workspace.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('create');\n setChoosing(members);\n } else if (!stale(section.workspace.id)) actions.createSession(section.workspace.id);\n }}\n />\n ) : null}\n <View style={[styles.hostGroup, !section.showWorkspace && styles.hostGroupNext]}>\n {hosts.length > 1 && selected === null && hostOf(section.workspace.id) ? (\n <Text style={styles.hostLabel} accessibilityRole=\"header\" numberOfLines={2}>\n {hostOf(section.workspace.id)!.label}\n </Text>\n ) : null}\n <Text style={styles.groupRoot} numberOfLines={1} ellipsizeMode=\"middle\">\n {section.workspace.root}\n </Text>\n {!section.workspace.available ? <Text style={styles.unavailable}>Workspace unavailable</Text> : null}\n {section.data.length === 0 ? (\n <Text style={styles.noSessions}>No sessions yet. Start or resume one.</Text>\n ) : null}\n </View>\n </>\n )\n }\n renderSectionFooter={({ section }) => (\n <View style={section === sections[sections.length - 1] ? undefined : styles.sectionGap} />\n )}\n renderItem={({ item: session, section }) => (\n <View style={styles.sessionRow}>\n <SessionCard\n session={session}\n stale={stale(session.id)}\n hostLabel={\n section.workspace.kind === 'session' && hosts.length > 1 && selected === null\n ? hostOf(session.id)?.label\n : undefined\n }\n onOpen={openSession}\n onMenu={(entry) => setSessionMenu(entry.id)}\n {...(removePendingSetup\n ? {\n onSetupMenu: (setup: WebTemplateRailPendingSetup) => setSetupMenu({ sessionId: session.id, setup }),\n }\n : {})}\n />\n </View>\n )}\n ListEmptyComponent={\n <EmptyState\n title={selected ? 'No sessions on this computer.' : 'No sessions yet.'}\n description={\n canGeneral\n ? 'Start a session to work with Po. No workspace needed.'\n : 'Add a workspace to start working with Po.'\n }\n />\n }\n ListHeaderComponent={\n <View style={styles.listHeader}>\n {/* The phone's host drawer picks the computer; the list only honours its initial choice. */}\n {hosts\n .filter((host) => host.status !== 'connected' && (selected === null || selected === host.id))\n .map((host) => (\n <InfoStrip\n key={host.id}\n message={\n host.status === 'update_required'\n ? `${host.label} needs an app update. Sessions are read-only.`\n : `${host.label} is offline. Showing last known sessions.`\n }\n actionLabel=\"Retry\"\n onAction={host.onRetry}\n />\n ))}\n {(canGeneral || canAdd) && !titleAdd ? createMenu : null}\n </View>\n }\n />\n <SessionMenuSheet\n session={sessions.find((session) => session.id === sessionMenu) ?? null}\n actions={actions}\n {...(groupActions ? { onGroups: (session: WebTemplateRailSession) => setGroupsFor(session.id) } : {})}\n onClose={() => setSessionMenu(null)}\n />\n <WorkspaceMenuSheet\n workspace={workspaces.find((workspace) => workspace.id === workspaceMenu && !stale(workspace.id)) ?? null}\n actions={actions}\n onClose={() => setWorkspaceMenu(null)}\n />\n {groupActions ? (\n <SessionGroupsSheet\n session={sessions.find((session) => session.id === groupsFor) ?? null}\n sessions={sessions}\n actions={groupActions}\n onClose={() => setGroupsFor(null)}\n />\n ) : null}\n {removePendingSetup ? (\n <SetupMenuSheet target={setupMenu} removePendingSetup={removePendingSetup} onClose={() => setSetupMenu(null)} />\n ) : null}\n {addActions && (hosts.length === 0 || hosts.find(({ id }) => id === addHost)?.status === 'connected') ? (\n <AddWorkspaceSheet\n open={adding}\n actions={addActions}\n onClose={() => {\n setAdding(false);\n setAddHost(null);\n }}\n />\n ) : null}\n <Sheet\n open={choosing !== null}\n onOpenChange={(open) => {\n if (!open) setChoosing(null);\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Which computer?</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {choosing === 'general'\n ? hosts.map((host) => (\n <Button\n key={host.id}\n variant=\"ghost\"\n disabled={host.status !== 'connected' || !host.createGeneralSession}\n onPress={() => {\n setChoosing(null);\n host.createGeneralSession?.();\n }}\n >\n {host.label}\n {host.status !== 'connected' ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))\n : choosing === 'add'\n ? hosts.map((host) => (\n <Button\n key={host.id}\n variant=\"ghost\"\n disabled={host.status !== 'connected' || !host.addWorkspaceActions}\n onPress={() => {\n setAddHost(host.id);\n setChoosing(null);\n setAdding(true);\n }}\n >\n {host.label}\n {host.status !== 'connected' ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))\n : choosing?.map((workspace) => (\n <Button\n key={workspace.id}\n variant=\"ghost\"\n disabled={chooseAction !== 'open' && (stale(workspace.id) || !workspace.available)}\n onPress={() => {\n setChoosing(null);\n if (chooseAction === 'open') openWorkspace?.(workspace.id);\n else if (chooseAction === 'menu') setWorkspaceMenu(workspace.id);\n else actions.createSession(workspace.id);\n }}\n >\n {hostOf(workspace.id)?.label ?? workspace.name} · {workspace.root}\n {stale(workspace.id) ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))}\n </SheetBody>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const text = (size: 'xs' | 'sm' | 'base' | 'lg', color: string) => ({\n fontFamily: sans,\n fontSize: theme.fontSize[size],\n lineHeight: theme.lineHeight[size],\n color,\n });\n return {\n // The cockpit's rail surface: this screen is the phone's rail.\n screen: { flex: 1, backgroundColor: theme.colors.rail },\n content: { padding: theme.spacing(4), gap: theme.spacing(6) },\n listContent: { padding: theme.spacing(4) },\n listHeader: { gap: theme.spacing(3), paddingBottom: theme.spacing(4) },\n sectionGap: { height: theme.spacing(6) },\n sessionRow: { gap: theme.spacing(1), paddingTop: theme.spacing(1) },\n group: { gap: theme.spacing(1) },\n // The content gap already spaces the heading from the first group, so it pulls up into it.\n railHead: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: theme.spacing(1),\n marginBottom: -theme.spacing(4),\n },\n listRailHead: { marginBottom: theme.spacing(2) },\n railTitle: { ...text('lg', theme.colors.hi), fontWeight: theme.fontWeight.semibold, flex: 1 },\n groupHead: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n groupText: { flex: 1, minWidth: 0 },\n workspaceLink: { minHeight: 44, justifyContent: 'center' },\n groupName: { ...text('lg', theme.colors.hi), fontWeight: theme.fontWeight.semibold },\n groupRoot: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono) },\n hostGroup: { gap: theme.spacing(1), paddingHorizontal: theme.spacing(1), paddingBottom: theme.spacing(2) },\n hostGroupNext: { borderTopWidth: 1, borderColor: theme.colors['border-soft'], paddingTop: theme.spacing(3) },\n hostLabel: text('sm', theme.colors.dim),\n noSessions: {\n ...text('sm', theme.colors.dim),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n unavailable: { ...text('sm', theme.colors.red), paddingHorizontal: theme.spacing(1) },\n // The cockpit's dashed empty card.\n empty: {\n gap: theme.spacing(3),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(5),\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: theme.colors.border,\n },\n emptyText: text('sm', theme.colors.dim),\n emptyButton: { justifyContent: 'flex-start', backgroundColor: theme.colors.panel },\n card: {\n gap: theme.spacing(2),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n // Flat like the cockpit card: no fill or edge until pressed or active.\n borderColor: 'transparent',\n },\n cardPressed: { backgroundColor: theme.colors.panel },\n cardActive: { backgroundColor: theme.colors['tint-green'], borderColor: theme.colors['edge-green'] },\n nested: { marginLeft: theme.spacing(5) },\n iconButton: {\n width: 44,\n height: 44,\n borderRadius: theme.borderRadius.lg,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconPressed: { backgroundColor: theme.colors.panel },\n cardHead: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(2.5) },\n avatar: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors['tint-green'],\n },\n initials: { ...text('xs', theme.colors.green), fontWeight: theme.fontWeight.semibold },\n avatarBadge: { position: 'absolute', top: -4, right: -6, borderColor: theme.colors.bg },\n nameBadge: { borderColor: theme.colors.bg },\n cardText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n nameRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n name: { ...text('base', theme.colors.hi), fontWeight: theme.fontWeight.semibold, flexShrink: 1 },\n statusRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n status: (tone: StatusTone) => ({\n ...text('sm', tone === 'failed' ? theme.colors.red : tone === 'running' ? theme.colors.yellow : theme.colors.dim),\n flexShrink: 1,\n }),\n underAvatar: { paddingLeft: 32 + theme.spacing(2.5) },\n branchRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n branch: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1 },\n modified: text('sm', theme.colors.yellow),\n groupsRow: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(1.5) },\n groups: { flex: 1, flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(1) },\n // The cockpit's pending setup panel: indented, soft edge, panel fill.\n setup: {\n gap: theme.spacing(1),\n marginLeft: theme.spacing(4),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n backgroundColor: theme.colors.panel,\n },\n setupStatus: (failed: boolean) => text('sm', failed ? theme.colors.red : theme.colors.dim),\n // The kebab's 44 point target sits inside the panel's padding rather than growing the row.\n setupHead: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), marginVertical: -theme.spacing(2) },\n setupName: { flex: 1 },\n recovery: text('sm', theme.colors.dim),\n error: text('sm', theme.colors.red),\n };\n});\n","import type { NativeTemplateFile } from '@agimon-ai/po-core/native';\n\nimport { AdvancedSessions } from '../_components/AdvancedSessions.native';\n\n/** The phone half of Advanced. Screens it leaves out stay the app's own. */\nexport const advancedNativeTemplate = {\n label: 'Advanced',\n description: 'Workspace-grouped session cards, matching the cockpit rail.',\n contractVersion: 1,\n screens: { sessions: AdvancedSessions },\n} satisfies NativeTemplateFile;\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport templatePoTemplateAdvanced from '../src/extensions/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced2 from '../src/extensions/workspaces/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced3 from '../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'template-advanced',\n global: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced)]; },\n },\n workspace: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced2)]; },\n },\n session: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced3)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"native.mjs","names":["NativeTemplateSessionsActions","WebTemplateRailDirectoryListing","WebTemplateRailPendingSetup","WebTemplateRailSession","WebTemplateRailWorkspace","Button","CheckIcon","EditIcon","FolderIcon","fontOf","Input","Label","ListRow","PlusIcon","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","TrashIcon","Spinner","Textarea","ReactNode","useEffect","useState","StyleSheet","createProblem","MAX_GROUPS","sessionGroupOptions","Item","label","hint","danger","disabled","onPress","Items","items","styles","list","map","item","index","pressed","divider","itemLabel","meta","SessionStep","SessionMenuSheet","session","actions","onGroups","onClose","step","setStep","draft","setDraft","busy","setBusy","error","setError","close","name","remove","result","removeSession","id","undefined","open","body","trim","renameSession","text","strong","resumeSession","restartBlocked","restarting","restartSession","WorkspaceMenuSheet","workspace","confirming","setConfirming","deleteWorkspace","mono","root","available","resumeInWorkspace","SessionGroupsActions","Required","Pick","SessionGroupsSheet","sessions","forId","setForId","value","setValue","query","setQuery","renaming","setRenaming","group","deleting","setDeleting","groups","rowCancel","run","work","Promise","done","typed","options","shown","filter","includes","canCreate","some","problem","length","toggle","create","renameConfirm","to","renameGroup","current","Set","deleteConfirm","deleteGroup","on","total","members","reach","String","edge","rowEdit","rowActions","join","check","setSessionGroups","SetupMenuSheet","target","removePendingSetup","sessionId","setup","NonNullable","SUGGESTION_DEBOUNCE_MS","TRAILING_SEPARATORS","folderName","path","trimmed","replace","slice","lastIndexOf","AddWorkspaceActions","FolderBrowser","start","listDirectory","onSelect","setTarget","listing","setListing","stale","then","parent","browserHead","inset","directories","directory","AdmissionRow","instructions","workspaceId","checked","AddWorkspaceView","rows","discovering","manual","canSubmit","onPathChange","onNameChange","onInstructionsChange","onBrowse","onToggle","onSubmit","folderContent","count","row","retry","next","field","pathRow","admissionPathInput","entry","added","unchecked","admissionRow","AddWorkspaceSheet","setName","nameEdited","setNameEdited","setPath","setInstructions","discoveryRevision","setDiscoveryRevision","browsing","setBrowsing","suggestions","setSuggestions","discovery","setDiscovery","searchDirectories","discoverWorkspaces","addDeclaredWorkspaces","supportsDiscovery","shownName","trimmedPath","timer","setTimeout","declarations","clearTimeout","found","changePath","revision","finish","submit","selected","results","names","updated","find","addWorkspace","startsWith","theme","sans","fontFamily","size","color","fontSize","lineHeight","gap","spacing","uni__dependencies","borderRadius","lg","borderWidth","borderColor","colors","overflow","minHeight","justifyContent","paddingHorizontal","paddingVertical","borderTopWidth","hairlineWidth","borderTopColor","flexDirection","alignItems","pathInput","flex","minWidth","borderBottomWidth","borderBottomColor","width","height","dim","flexShrink","flexGrow","paddingBottom","enabled","magenta","faint","backgroundColor","red","hi","fontWeight","medium","lineHeightRelaxed","base","semibold","sm","styles","NativeTemplateSessionsActions","NativeTemplateSessionsProps","WebTemplateRailPendingSetup","WebTemplateRailSession","WebTemplateRailWorkspace","ActivityIcon","AlertIcon","Badge","BranchIcon","Button","CountBadge","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","FolderIcon","fontOf","ForkIcon","KebabIcon","HostTag","InfoStrip","Sheet","SheetContent","SheetHeader","SheetTitle","SheetBody","LiveDuration","MonitorIcon","PlusIcon","Spinner","UsersIcon","ReactNode","useCallback","useEffect","useMemo","useRef","useState","StyleSheet","AddWorkspaceSheet","SessionGroupsSheet","SessionMenuSheet","SetupMenuSheet","WorkspaceMenuSheet","NO_HOSTS","NonNullable","UNAVAILABLE_LABEL","StatusTone","statusTone","status","startsWith","includes","IconButton","label","onPress","children","disabled","pressed","styles","iconButton","iconPressed","SessionCard","session","onOpen","onMenu","onSetupMenu","hostLabel","stale","id","setup","tone","name","markColor","active","waiting","waitingCount","awaitingInput","String","card","nested","cardPressed","cardActive","cardHead","profile","avatar","initials","avatarBadge","cardText","nameRow","provenance","nameBadge","statusRow","restarting","clock","since","git","branchRow","branch","dirty","modified","groups","undefined","length","groupsRow","underAvatar","map","group","error","pendingSetups","setupHead","setupName","setupStatus","failed","recovery","WorkspaceHeader","workspace","actions","onWorkspaceMenu","onCreate","merged","groupHead","groupText","workspaceLink","groupName","legacy","available","createSession","sessionSections","workspaces","presentation","selectedHost","filter","hosts","some","visible","owner","hostForId","sections","key","members","data","item","kind","sessions","existing","find","section","push","flatMap","showWorkspace","index","SessionCreateMenu","onCreateWorkspace","onCreateSession","workspaceDisabled","sessionDisabled","defaultOpen","AdvancedSessions","openSession","openWorkspace","setHeaderAction","hostPresentation","setSelectedHost","initialHostId","selected","hostOf","host","choosing","setChoosing","chooseAction","setChooseAction","addHost","setAddHost","sessionMenu","setSessionMenu","workspaceMenu","setWorkspaceMenu","groupsFor","setGroupsFor","setupMenu","setSetupMenu","sessionId","adding","setAdding","addWorkspace","searchDirectories","listDirectory","addActions","addWorkspaceActions","canAdd","beginAdd","generalAction","createGeneralSession","current","canGeneral","beginGeneral","generalHost","createMenu","titleAdd","setSessionGroups","renameGroup","deleteGroup","removePendingSetup","groupActions","screen","listContent","member","entry","hostGroup","hostRow","groupRoot","root","unavailable","noSessions","next","indexOf","sectionGap","hostGap","sessionRow","listHeader","onRetry","onGroups","open","create","theme","sans","fontFamily","text","size","color","fontSize","lineHeight","flex","backgroundColor","colors","rail","uni__dependencies","content","padding","spacing","gap","paddingBottom","height","paddingTop","railHead","flexDirection","alignItems","paddingHorizontal","marginBottom","listRailHead","railTitle","hi","fontWeight","semibold","minWidth","minHeight","justifyContent","dim","mono","flexShrink","borderBottomWidth","borderColor","maxWidth","red","empty","paddingVertical","borderRadius","lg","borderWidth","borderStyle","border","emptyText","emptyButton","panel","marginLeft","width","green","position","top","right","bg","flexWrap","columnGap","rowGap","yellow","paddingLeft","md","marginVertical","templatePoTemplateAdvanced","templatePoTemplateAdvanced2","templatePoTemplateAdvanced3"],"sources":["../../src/extensions/(frontend)/template/_lib/sessionGroups.ts","../../src/extensions/(frontend)/template/_components/AdvancedSessionMenus.native.tsx","../../src/extensions/(frontend)/template/_components/AdvancedSessions.native.tsx","../../src/extensions/(frontend)/template/_lib/nativeDefinition.native.ts","../../src/extensions/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native.ts","../../generated/native.ts"],"sourcesContent":["import type { WebTemplateRailSession } from '@agimon-ai/po-core/web';\n\n/** Mirrors the server's limits so the groups editor can say no before a round trip. */\nexport const MAX_GROUPS = 8;\nexport const MAX_GROUP_LENGTH = 32;\n\nexport interface SessionGroupOption {\n name: string;\n /** Other sessions in the group; the edited session is left out, since its check says it. */\n members: readonly string[];\n}\n\n/** Every group some session uses, in rail order, with the other sessions in it. */\nexport function sessionGroupOptions(\n sessions: readonly WebTemplateRailSession[],\n editedId: string,\n extra: readonly string[] = [],\n): SessionGroupOption[] {\n const names = [...new Set([...sessions.flatMap((session) => session.groups ?? []), ...extra])];\n return names.map((name) => ({\n name,\n members: sessions\n .filter((session) => session.id !== editedId && session.groups?.includes(name) === true)\n .map((session) => session.name || 'Untitled'),\n }));\n}\n\n/** Why a typed name cannot become a group, or undefined when it can. */\nexport function createProblem(name: string, count: number): string | undefined {\n if (name.length > MAX_GROUP_LENGTH) return `group names are at most ${String(MAX_GROUP_LENGTH)} characters.`;\n if (count >= MAX_GROUPS) return `a session can belong to at most ${String(MAX_GROUPS)} groups.`;\n return undefined;\n}\n","import type {\n NativeTemplateSessionsActions,\n WebTemplateRailDirectoryListing,\n WebTemplateRailPendingSetup,\n WebTemplateRailSession,\n WebTemplateRailWorkspace,\n} from '@agimon-ai/po-core/native';\nimport {\n Button,\n CheckIcon,\n EditIcon,\n FolderIcon,\n fontOf,\n Input,\n Label,\n ListRow,\n PlusIcon,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n TrashIcon,\n Spinner,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { createProblem, MAX_GROUPS, sessionGroupOptions } from '../_lib/sessionGroups';\n\ninterface Item {\n label: string;\n hint?: string;\n danger?: boolean;\n disabled?: boolean;\n onPress: () => void;\n}\n\nfunction Items({ items }: { items: readonly Item[] }) {\n return (\n <View style={styles.list}>\n {items.map((item, index) => (\n <Pressable\n key={item.label}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: item.disabled === true }}\n disabled={item.disabled}\n onPress={item.onPress}\n style={({ pressed }) => [styles.item, index > 0 && styles.divider, pressed && styles.pressed]}\n >\n <Text style={styles.itemLabel(item.danger === true, item.disabled === true)}>{item.label}</Text>\n {item.hint ? <Text style={styles.meta}>{item.hint}</Text> : null}\n </Pressable>\n ))}\n </View>\n );\n}\n\ntype SessionStep = 'menu' | 'rename' | 'confirm';\n\n/** A session card's ⋮: the cockpit's rename, groups, resume, restart and remove, with remove confirmed first. */\nexport function SessionMenuSheet({\n session,\n actions,\n onGroups,\n onClose,\n}: {\n session: WebTemplateRailSession | null;\n actions: NativeTemplateSessionsActions;\n /** Opens the groups sheet; absent when the phone app cannot change groups. */\n onGroups?: (session: WebTemplateRailSession) => void;\n onClose: () => void;\n}) {\n const [step, setStep] = useState<SessionStep>('menu');\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setStep('menu');\n setError('');\n onClose();\n };\n const name = session?.name || 'Untitled';\n const remove = async () => {\n if (session === null) return;\n setBusy(true);\n setError('');\n const result = await actions.removeSession(session.id);\n setBusy(false);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n setStep('menu');\n onClose();\n };\n return (\n <Sheet open={session !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {session === null ? null : step === 'rename' ? (\n <>\n <SheetHeader>\n <SheetTitle>Rename session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Input value={draft} onChangeText={setDraft} autoFocus accessibilityLabel=\"Session name\" />\n <Button\n variant=\"primary\"\n size=\"lg\"\n disabled={draft.trim() === ''}\n onPress={() => {\n actions.renameSession(session.id, draft);\n close();\n }}\n >\n Rename\n </Button>\n </SheetBody>\n </>\n ) : step === 'confirm' ? (\n <>\n <SheetHeader>\n <SheetTitle>Remove session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.text}>\n This stops <Text style={styles.strong}>{name}</Text> and removes it from the list. Anything it is\n running ends now. You can restore it for 7 days.\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button variant=\"danger\" size=\"lg\" loading={busy} loadingLabel=\"Removing\" onPress={() => void remove()}>\n Remove\n </Button>\n <Button variant=\"ghost\" size=\"lg\" disabled={busy} onPress={() => setStep('menu')}>\n Cancel\n </Button>\n </SheetBody>\n </>\n ) : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: 'Rename',\n onPress: () => {\n setDraft(session.name);\n setStep('rename');\n },\n },\n ...(onGroups\n ? [\n {\n label: 'Groups',\n hint: 'Sessions in a group can message each other',\n onPress: () => {\n close();\n onGroups(session);\n },\n },\n ]\n : []),\n {\n label: 'Resume',\n hint: 'Open an earlier conversation in this session',\n onPress: () => {\n close();\n actions.resumeSession(session.id);\n },\n },\n {\n label: 'Restart',\n hint: session.restartBlocked ? 'Not while a turn runs' : 'Reloads extensions',\n disabled: session.restarting || session.restartBlocked === true,\n onPress: () => {\n close();\n actions.restartSession(session.id);\n },\n },\n { label: 'Remove', danger: true, onPress: () => setStep('confirm') },\n ]}\n />\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\n/** A workspace's ⋮: resume a saved conversation here, or remove the workspace after confirming. */\nexport function WorkspaceMenuSheet({\n workspace,\n actions,\n onClose,\n}: {\n workspace: WebTemplateRailWorkspace | null;\n actions: NativeTemplateSessionsActions;\n onClose: () => void;\n}) {\n const [confirming, setConfirming] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setConfirming(false);\n setError('');\n onClose();\n };\n const remove = async () => {\n if (workspace === null) return;\n setBusy(true);\n setError('');\n const result = await actions.deleteWorkspace(workspace.id);\n setBusy(false);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n setConfirming(false);\n onClose();\n };\n return (\n <Sheet open={workspace !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {workspace === null ? null : confirming ? (\n <>\n <SheetHeader>\n <SheetTitle>Remove workspace</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.text}>\n This unregisters <Text style={styles.strong}>{workspace.name}</Text> from Po only. Files at{' '}\n <Text style={styles.mono}>{workspace.root}</Text> stay on disk. Its sessions must be removed first.\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button variant=\"danger\" size=\"lg\" loading={busy} loadingLabel=\"Removing\" onPress={() => void remove()}>\n Remove\n </Button>\n <Button variant=\"ghost\" size=\"lg\" disabled={busy} onPress={() => setConfirming(false)}>\n Cancel\n </Button>\n </SheetBody>\n </>\n ) : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{workspace.name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: 'Resume session',\n disabled: !workspace.available,\n onPress: () => {\n close();\n actions.resumeInWorkspace(workspace.id);\n },\n },\n { label: 'Remove workspace', danger: true, onPress: () => setConfirming(true) },\n ]}\n />\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\nexport type SessionGroupsActions = Required<\n Pick<NativeTemplateSessionsActions, 'setSessionGroups' | 'renameGroup' | 'deleteGroup'>\n>;\n\n/**\n * The cockpit's groups dialog as a sheet. Rows check groups on and off and the typed name can\n * become a new one; rename and delete act on every session in the group at once, the checks wait for Save.\n */\nexport function SessionGroupsSheet({\n session,\n sessions,\n actions,\n onClose,\n}: {\n session: WebTemplateRailSession | null;\n /** Every listed session, which is where the known groups and their members come from. */\n sessions: readonly WebTemplateRailSession[];\n actions: SessionGroupsActions;\n onClose: () => void;\n}) {\n const [forId, setForId] = useState<string | null>(null);\n const [value, setValue] = useState<string[]>([]);\n const [query, setQuery] = useState('');\n const [renaming, setRenaming] = useState<{ group: string; draft: string }>();\n const [deleting, setDeleting] = useState<string>();\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n // A new session starts from its own groups and a clean editor.\n if ((session?.id ?? null) !== forId) {\n setForId(session?.id ?? null);\n setValue([...(session?.groups ?? [])]);\n setQuery('');\n setRenaming(undefined);\n setDeleting(undefined);\n setError('');\n }\n const close = () => {\n if (!busy) onClose();\n };\n const rowCancel = () => {\n setRenaming(undefined);\n setDeleting(undefined);\n };\n const run = async (work: () => Promise<{ error: string } | undefined>, done: () => void) => {\n setBusy(true);\n setError('');\n const result = await work();\n setBusy(false);\n if (result === undefined) done();\n else setError(result.error);\n };\n const typed = query.trim();\n const options = session === null ? [] : sessionGroupOptions(sessions, session.id, value);\n const shown = options.filter((group) => group.name.includes(typed));\n const canCreate = typed !== '' && !options.some((group) => group.name === typed);\n const problem = canCreate ? createProblem(typed, value.length) : undefined;\n const toggle = (group: string) => {\n setError('');\n if (value.includes(group)) setValue(value.filter((name) => name !== group));\n else if (value.length >= MAX_GROUPS) setError(createProblem('', value.length) ?? '');\n else setValue([...value, group]);\n };\n const create = () => {\n if (!canCreate || problem !== undefined) return;\n setValue([...value, typed]);\n setQuery('');\n };\n const renameConfirm = () => {\n if (renaming === undefined) return;\n const to = renaming.draft.trim();\n if (to === '' || to === renaming.group) return rowCancel();\n void run(\n () => actions.renameGroup(renaming.group, to),\n () => {\n setValue((current) => [...new Set(current.map((name) => (name === renaming.group ? to : name)))]);\n rowCancel();\n },\n );\n };\n const deleteConfirm = () => {\n if (deleting === undefined) return;\n void run(\n () => actions.deleteGroup(deleting),\n () => {\n setValue((current) => current.filter((name) => name !== deleting));\n rowCancel();\n },\n );\n };\n\n return (\n <Sheet open={session !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {session === null ? null : (\n <>\n <SheetHeader>\n <SheetTitle>Session groups</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.meta}>Sessions that share a group can message each other.</Text>\n <Input\n value={query}\n onChangeText={setQuery}\n placeholder={value.length === 0 ? 'Find or create a group' : 'Add another'}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"done\"\n onSubmitEditing={() => {\n if (canCreate) create();\n else if (shown[0] !== undefined) {\n toggle(shown[0].name);\n setQuery('');\n }\n }}\n accessibilityLabel=\"Find or create a group\"\n />\n {shown.length > 0 || canCreate ? (\n <View style={styles.list}>\n {shown.map((group, index) => {\n const on = value.includes(group.name);\n const total = group.members.length + (on ? 1 : 0);\n const reach = total === 1 ? 'its one session' : `all ${String(total)} sessions`;\n const edge = index > 0 && styles.divider;\n if (renaming?.group === group.name)\n return (\n <View key={group.name} style={[styles.rowEdit, edge]}>\n <Input\n value={renaming.draft}\n onChangeText={(draft) => setRenaming({ ...renaming, draft })}\n autoFocus\n autoCapitalize=\"none\"\n autoCorrect={false}\n onSubmitEditing={renameConfirm}\n accessibilityLabel={`Rename ${group.name}`}\n />\n <Text style={styles.meta}>Renames it on {reach}.</Text>\n <View style={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onPress={rowCancel}>\n Cancel\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={renaming.draft.trim() === ''}\n loading={busy}\n loadingLabel=\"Renaming\"\n onPress={renameConfirm}\n >\n Rename\n </Button>\n </View>\n </View>\n );\n if (deleting === group.name)\n return (\n <View key={group.name} style={[styles.rowEdit, edge]}>\n <Text style={styles.text}>\n Remove <Text style={styles.strong}>{group.name}</Text> from {reach}? They can no longer\n message through it.\n </Text>\n <View style={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onPress={rowCancel}>\n Cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"sm\"\n loading={busy}\n loadingLabel=\"Deleting\"\n onPress={deleteConfirm}\n >\n Delete\n </Button>\n </View>\n </View>\n );\n return (\n <ListRow\n key={group.name}\n title={group.name}\n description={group.members.length === 0 ? 'No other sessions yet' : group.members.join(', ')}\n selected={on}\n leading={<View style={styles.check}>{on ? <CheckIcon size={16} color=\"green\" /> : null}</View>}\n trailing={\n <View style={styles.rowActions}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n accessibilityLabel={`Rename ${group.name}`}\n onPress={() => {\n setDeleting(undefined);\n setRenaming({ group: group.name, draft: group.name });\n }}\n >\n <EditIcon size={16} color=\"dim\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n accessibilityLabel={`Delete ${group.name}`}\n onPress={() => {\n setRenaming(undefined);\n setDeleting(group.name);\n }}\n >\n <TrashIcon size={16} color=\"dim\" />\n </Button>\n </View>\n }\n disclosure={false}\n onPress={() => toggle(group.name)}\n style={edge}\n />\n );\n })}\n {canCreate ? (\n <ListRow\n title={\n <Text style={styles.create(problem === undefined)} numberOfLines={1}>\n Create group “{typed}”\n </Text>\n }\n description={problem === undefined ? undefined : <Text style={styles.error}>{problem}</Text>}\n leading={<PlusIcon size={16} color={problem === undefined ? 'magenta' : 'faint'} />}\n disabled={problem !== undefined}\n disclosure={false}\n onPress={create}\n style={shown.length > 0 && styles.divider}\n />\n ) : null}\n </View>\n ) : null}\n <Text style={styles.meta}>\n {value.length} of {MAX_GROUPS} groups\n </Text>\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={busy && renaming === undefined && deleting === undefined}\n loadingLabel=\"Saving\"\n disabled={busy}\n onPress={() => void run(() => actions.setSessionGroups(session.id, value), onClose)}\n >\n Save\n </Button>\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\n/** A pending setup's ⋮: it has no runtime, so removing it is the only action, as in the cockpit. */\nexport function SetupMenuSheet({\n target,\n removePendingSetup,\n onClose,\n}: {\n target: { sessionId: string; setup: WebTemplateRailPendingSetup } | null;\n removePendingSetup: NonNullable<NativeTemplateSessionsActions['removePendingSetup']>;\n onClose: () => void;\n}) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const close = () => {\n if (busy) return;\n setError('');\n onClose();\n };\n const remove = async () => {\n if (target === null) return;\n setBusy(true);\n setError('');\n const result = await removePendingSetup(target.sessionId, target.setup.id);\n setBusy(false);\n if (result === undefined) onClose();\n else setError(result.error);\n };\n return (\n <Sheet open={target !== null} onOpenChange={(open) => !open && close()}>\n <SheetContent>\n {target === null ? null : (\n <>\n <SheetHeader>\n <SheetTitle numberOfLines={1}>{target.setup.name}</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Items\n items={[\n {\n label: busy ? 'Removing…' : 'Remove setup',\n danger: true,\n disabled: busy,\n onPress: () => void remove(),\n },\n ]}\n />\n {error ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n </SheetBody>\n </>\n )}\n </SheetContent>\n </Sheet>\n );\n}\nconst SUGGESTION_DEBOUNCE_MS = 120;\nconst TRAILING_SEPARATORS = /\\/+$/u;\n\nfunction folderName(path: string): string {\n const trimmed = path.trim().replace(TRAILING_SEPARATORS, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1) || trimmed;\n}\n\nexport type AddWorkspaceActions = Required<\n Pick<NativeTemplateSessionsActions, 'addWorkspace' | 'searchDirectories' | 'listDirectory'>\n> &\n Pick<NativeTemplateSessionsActions, 'discoverWorkspaces' | 'addDeclaredWorkspaces'>;\n\n/** The cockpit's folder browser, in place: up, into a child, or use the current folder. */\nfunction FolderBrowser({\n start,\n listDirectory,\n onSelect,\n}: {\n start?: string;\n listDirectory: AddWorkspaceActions['listDirectory'];\n onSelect: (path: string) => void;\n}) {\n const [target, setTarget] = useState(start);\n const [listing, setListing] = useState<WebTemplateRailDirectoryListing | null>(null);\n const [error, setError] = useState('');\n useEffect(() => {\n let stale = false;\n void listDirectory(target).then((result) => {\n if (stale) return;\n if ('error' in result) setError(result.error);\n else {\n setError('');\n setListing(result);\n }\n });\n return () => {\n stale = true;\n };\n }, [target, listDirectory]);\n const parent = listing?.parent;\n return (\n <View style={styles.list}>\n <View style={styles.browserHead}>\n <Text style={styles.path} numberOfLines={1} ellipsizeMode=\"head\">\n {listing?.path ?? 'Loading…'}\n </Text>\n <Button size=\"sm\" disabled={listing === null} onPress={() => listing !== null && onSelect(listing.path)}>\n Use this folder\n </Button>\n </View>\n {error ? (\n <Text style={[styles.error, styles.inset]} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n {parent === undefined ? null : (\n <ListRow title=\"Parent folder\" disclosure={false} onPress={() => setTarget(parent)} style={styles.divider} />\n )}\n {listing?.directories.length === 0 ? <Text style={[styles.meta, styles.inset]}>No folders here</Text> : null}\n {listing?.directories.map((directory) => (\n <ListRow\n key={directory}\n title={folderName(directory)}\n leading={<FolderIcon size={16} color=\"dim\" />}\n onPress={() => setTarget(directory)}\n style={styles.divider}\n />\n ))}\n </View>\n );\n}\n\nexport interface AdmissionRow {\n name: string;\n instructions?: string;\n workspaceId?: string;\n checked: boolean;\n error?: string;\n}\n\n/** The approved native composition, shared by the real sheet and deterministic stories. */\nexport function AddWorkspaceView({\n open,\n path,\n name,\n instructions,\n rows,\n discovering,\n error,\n busy,\n manual,\n canSubmit,\n onPathChange,\n onNameChange,\n onInstructionsChange,\n onBrowse,\n onToggle,\n onSubmit,\n onClose,\n folderContent,\n}: {\n open: boolean;\n path: string;\n name: string;\n instructions: string;\n rows: readonly AdmissionRow[];\n discovering: boolean;\n error: string;\n busy: boolean;\n manual: boolean;\n canSubmit: boolean;\n onPathChange: (path: string) => void;\n onNameChange: (name: string) => void;\n onInstructionsChange: (instructions: string) => void;\n onBrowse: () => void;\n onToggle: (name: string) => void;\n onSubmit: () => void;\n onClose: () => void;\n folderContent?: ReactNode;\n}) {\n const count = rows.filter((row) => row.checked && !row.workspaceId).length;\n const retry = rows.some((row) => row.error);\n return (\n <Sheet open={open} onOpenChange={(next) => !next && !busy && onClose()}>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Add workspace</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <View style={styles.field}>\n <Label>Folder</Label>\n <View style={styles.pathRow}>\n <Input\n value={path}\n onChangeText={onPathChange}\n disabled={busy}\n placeholder=\"~/workspace/my-project\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n accessibilityLabel=\"Workspace folder\"\n style={styles.admissionPathInput}\n />\n <Button variant=\"outline\" disabled={busy} onPress={onBrowse}>\n Browse\n </Button>\n </View>\n </View>\n {folderContent}\n {discovering ? (\n <View style={styles.pathRow}>\n <Spinner label=\"Reading workspace declarations\" />\n <Text style={styles.meta}>Reading workspace declarations…</Text>\n </View>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n {rows.length > 0 ? (\n <View style={styles.field}>\n <Label>Workspaces</Label>\n <Text style={styles.meta}>Declared in .po/config.yaml. Choose which to add.</Text>\n {rows.map((entry) => {\n const added = entry.workspaceId !== undefined;\n return (\n <View key={entry.name}>\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityLabel={`${entry.name}${added ? ', Added' : ''}`}\n accessibilityHint={entry.instructions}\n accessibilityState={{ checked: entry.checked, disabled: added || busy }}\n disabled={added || busy}\n onPress={() => onToggle(entry.name)}\n >\n <ListRow\n title={entry.name}\n disclosure={false}\n description={\n <Text numberOfLines={1} style={styles.meta}>\n {entry.instructions}\n </Text>\n }\n leading={\n entry.checked ? <CheckIcon size={18} color=\"green\" /> : <View style={styles.unchecked} />\n }\n trailing={added ? <Text style={styles.meta}>Added</Text> : undefined}\n style={styles.admissionRow}\n />\n </Pressable>\n {entry.error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {entry.error}\n </Text>\n ) : null}\n </View>\n );\n })}\n </View>\n ) : null}\n {manual ? (\n <>\n <View style={styles.field}>\n <Label>Name</Label>\n <Input\n value={name}\n onChangeText={onNameChange}\n disabled={busy}\n placeholder=\"my-project\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n accessibilityLabel=\"Workspace name\"\n />\n </View>\n <View style={styles.field}>\n <Label>Instructions (optional)</Label>\n <Textarea\n rows={3}\n value={instructions}\n onChangeText={onInstructionsChange}\n disabled={busy}\n accessibilityLabel=\"Workspace instructions\"\n />\n <Text style={styles.meta}>For main sessions in this workspace.</Text>\n </View>\n {path.trim() === '' && name.trim() !== '' ? (\n <Text style={styles.meta}>\n Creates <Text style={styles.mono}>~/.po/workspace/{name.trim()}</Text>\n </Text>\n ) : null}\n </>\n ) : null}\n <Button\n variant=\"primary\"\n size=\"lg\"\n disabled={!canSubmit}\n loading={busy}\n loadingLabel=\"Adding\"\n onPress={onSubmit}\n >\n {rows.length > 0\n ? `${retry ? 'Retry' : 'Add'} ${count} workspace${count === 1 ? '' : 's'}`\n : 'Add workspace'}\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\n/** Discovery is optional so fetched templates still work with older phone providers. */\nexport function AddWorkspaceSheet({\n open,\n actions,\n onClose,\n}: {\n open: boolean;\n actions: AddWorkspaceActions;\n onClose: () => void;\n}) {\n const [name, setName] = useState('');\n const [nameEdited, setNameEdited] = useState(false);\n const [path, setPath] = useState('');\n const [instructions, setInstructions] = useState('');\n const [discoveryRevision, setDiscoveryRevision] = useState(0);\n const [browsing, setBrowsing] = useState(false);\n const [suggestions, setSuggestions] = useState<readonly string[]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n const [discovery, setDiscovery] = useState<{ path: string; root: string; rows: AdmissionRow[]; error: string }>();\n const { searchDirectories, discoverWorkspaces, addDeclaredWorkspaces } = actions;\n const supportsDiscovery = discoverWorkspaces !== undefined && addDeclaredWorkspaces !== undefined;\n const shownName = nameEdited ? name : folderName(path);\n const trimmedPath = path.trim().replace(TRAILING_SEPARATORS, '') || (path.trim() === '' ? '' : '/');\n const current = discovery?.path === trimmedPath ? discovery : undefined;\n const discovering = supportsDiscovery && trimmedPath !== '' && current === undefined;\n const rows = current?.rows ?? [];\n const manual = !discovering && !current?.error && rows.length === 0;\n const canSubmit =\n !busy &&\n !discovering &&\n !current?.error &&\n (rows.length > 0\n ? rows.some((row) => row.checked && !row.workspaceId)\n : trimmedPath !== '' || shownName.trim() !== '');\n\n useEffect(() => {\n if (!open || !supportsDiscovery || trimmedPath === '' || discoverWorkspaces === undefined) return;\n let stale = false;\n const timer = setTimeout(() => {\n void discoverWorkspaces(trimmedPath).then(\n (result) => {\n if (stale) return;\n setDiscovery({\n path: trimmedPath,\n root: 'root' in result ? result.root : trimmedPath,\n rows: 'declarations' in result ? result.declarations.map((row) => ({ ...row, checked: true })) : [],\n error: 'error' in result ? result.error : '',\n });\n },\n () => {\n if (!stale)\n setDiscovery({\n path: trimmedPath,\n root: trimmedPath,\n rows: [],\n error: 'Could not read workspace declarations. Choose the folder again to retry.',\n });\n },\n );\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [open, trimmedPath, supportsDiscovery, discoverWorkspaces, discoveryRevision]);\n\n useEffect(() => {\n if (!open || path.trim() === '') return;\n let stale = false;\n const timer = setTimeout(async () => {\n const found = await searchDirectories(path.trim());\n if (!stale) setSuggestions(found.filter((directory) => directory !== path.trim()));\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [open, path, searchDirectories]);\n\n const changePath = (next: string) => {\n setPath(next);\n setDiscovery(undefined);\n setSuggestions([]);\n setError('');\n setDiscoveryRevision((revision) => revision + 1);\n };\n const finish = () => {\n setName('');\n setNameEdited(false);\n setPath('');\n setInstructions('');\n setBrowsing(false);\n setSuggestions([]);\n setError('');\n setDiscovery(undefined);\n onClose();\n };\n const submit = async () => {\n if (!canSubmit) return;\n setBusy(true);\n setError('');\n try {\n if (rows.length > 0 && addDeclaredWorkspaces !== undefined && current !== undefined) {\n const selected = rows.filter((row) => row.checked && !row.workspaceId);\n const { results } = await addDeclaredWorkspaces({ path: current.root, names: selected.map((row) => row.name) });\n const updated = rows.map((row) => {\n if (!selected.includes(row)) return row;\n const result = results.find((entry) => entry.name === row.name);\n return {\n ...row,\n workspaceId: result?.workspaceId,\n error: result?.error ?? (result?.workspaceId ? undefined : 'Could not add this workspace. Try again.'),\n };\n });\n setDiscovery({ ...current, rows: updated });\n if (updated.some((row) => row.checked && !row.workspaceId)) return;\n } else {\n const result = await actions.addWorkspace({\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n ...(instructions === '' ? {} : { instructions }),\n });\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n }\n finish();\n } catch {\n setError('Could not add the workspace. Try again.');\n } finally {\n setBusy(false);\n }\n };\n return (\n <AddWorkspaceView\n open={open}\n path={path}\n name={shownName}\n instructions={instructions}\n rows={rows}\n discovering={discovering}\n error={current?.error || error}\n busy={busy}\n manual={manual}\n canSubmit={canSubmit}\n onPathChange={changePath}\n onNameChange={(next) => {\n setNameEdited(true);\n setName(next);\n }}\n onInstructionsChange={setInstructions}\n onBrowse={() => setBrowsing((value) => !value)}\n onToggle={(name) =>\n current &&\n setDiscovery({\n ...current,\n rows: rows.map((row) => (row.name === name && !row.workspaceId ? { ...row, checked: !row.checked } : row)),\n })\n }\n onSubmit={() => void submit()}\n onClose={finish}\n folderContent={\n busy ? null : browsing ? (\n <FolderBrowser\n {...(trimmedPath.startsWith('/') ? { start: trimmedPath } : {})}\n listDirectory={actions.listDirectory}\n onSelect={(selected) => {\n changePath(selected);\n setBrowsing(false);\n }}\n />\n ) : suggestions.length > 0 ? (\n <View style={styles.list} accessibilityLabel=\"Matching folders\">\n {suggestions.map((directory, index) => (\n <ListRow\n key={directory}\n title={\n <Text style={styles.path} numberOfLines={1} ellipsizeMode=\"head\">\n {directory}\n </Text>\n }\n disclosure={false}\n onPress={() => changePath(`${directory}/`)}\n style={index > 0 && styles.divider}\n />\n ))}\n </View>\n ) : null\n }\n />\n );\n}\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const text = (size: 'sm' | 'base', color: string) => ({\n fontFamily: sans,\n fontSize: theme.fontSize[size],\n lineHeight: theme.lineHeight[size],\n color,\n });\n return {\n body: { gap: theme.spacing(3) },\n list: {\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n overflow: 'hidden',\n },\n item: {\n minHeight: 48,\n justifyContent: 'center',\n gap: 2,\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2.5),\n },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n field: { gap: theme.spacing(1.5) },\n pathRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n pathInput: { flex: 1, minWidth: 0 },\n admissionPathInput: { flex: 1, minWidth: 0, fontFamily: fontOf(theme.fontFamily.mono) },\n admissionRow: {\n minHeight: 44,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: theme.colors['border-soft'],\n },\n unchecked: { width: 18, height: 18, borderWidth: 1, borderColor: theme.colors.dim },\n browserHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2),\n },\n path: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1, flexGrow: 1 },\n inset: { paddingHorizontal: theme.spacing(4), paddingBottom: theme.spacing(2) },\n rowEdit: { gap: theme.spacing(2), paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(3) },\n rowActions: { flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', gap: theme.spacing(1) },\n check: { width: 16, alignItems: 'center' },\n // Creating a group is the person's own naming, so it reads rose like the group chips.\n create: (enabled: boolean) => text('base', enabled ? theme.colors.magenta : theme.colors.faint),\n pressed: { backgroundColor: theme.colors['tint-green'] },\n itemLabel: (danger: boolean, disabled: boolean) => ({\n ...text('base', disabled ? theme.colors.faint : danger ? theme.colors.red : theme.colors.hi),\n fontWeight: theme.fontWeight.medium,\n }),\n meta: text('sm', theme.colors.dim),\n text: { ...text('base', theme.colors.text), lineHeight: theme.lineHeightRelaxed.base },\n strong: { fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n mono: { fontFamily: fontOf(theme.fontFamily.mono), color: theme.colors.hi },\n error: { ...text('sm', theme.colors.red), lineHeight: theme.lineHeightRelaxed.sm },\n };\n});\n","import type {\n NativeTemplateSessionsActions,\n NativeTemplateSessionsProps,\n WebTemplateRailPendingSetup,\n WebTemplateRailSession,\n WebTemplateRailWorkspace,\n} from '@agimon-ai/po-core/native';\nimport {\n ActivityIcon,\n AlertIcon,\n Badge,\n BranchIcon,\n Button,\n CountBadge,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n EmptyState,\n FolderIcon,\n fontOf,\n ForkIcon,\n KebabIcon,\n HostTag,\n InfoStrip,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n LiveDuration,\n MonitorIcon,\n PlusIcon,\n Spinner,\n UsersIcon,\n} from '@agimon-ai/po-native-components';\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Pressable, SectionList, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n AddWorkspaceSheet,\n SessionGroupsSheet,\n SessionMenuSheet,\n SetupMenuSheet,\n WorkspaceMenuSheet,\n} from './AdvancedSessionMenus.native';\n\nconst NO_HOSTS: NonNullable<NativeTemplateSessionsProps['hostPresentation']>['hosts'] = [];\nconst UNAVAILABLE_LABEL = ' · Unavailable';\n\ntype StatusTone = 'failed' | 'running' | 'quiet';\n\n/** The same reading of the status line as the cockpit card. */\nfunction statusTone(status: string): StatusTone {\n if (status.startsWith('failed') || status.includes(' failed')) return 'failed';\n if (status.startsWith('running')) return 'running';\n return 'quiet';\n}\n\n/** A 44 point icon target, as the cockpit's ghost icon buttons. */\nfunction IconButton({\n label,\n onPress,\n children,\n disabled = false,\n}: {\n label: string;\n onPress: () => void;\n children: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled }}\n disabled={disabled}\n hitSlop={6}\n onPress={onPress}\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconPressed]}\n >\n {children}\n </Pressable>\n );\n}\n\nfunction SessionCard({\n session,\n onOpen,\n onMenu,\n onSetupMenu,\n hostLabel,\n stale = false,\n}: {\n session: WebTemplateRailSession;\n hostLabel?: string;\n stale?: boolean;\n onOpen: (id: string) => void;\n onMenu: (session: WebTemplateRailSession) => void;\n /** Absent when the phone app cannot remove a setup, so the panel shows no menu. */\n onSetupMenu?: (setup: WebTemplateRailPendingSetup) => void;\n}) {\n const tone = stale ? 'quiet' : statusTone(session.status);\n const name = session.name || 'Untitled';\n const markColor = session.active ? 'green' : 'faint';\n // A host without the count still marks a waiting card as one.\n const waiting = stale ? 0 : (session.waitingCount ?? (session.awaitingInput ? 1 : 0));\n return (\n <>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={waiting > 0 ? `Open ${name}, ${String(waiting)} waiting for you` : `Open ${name}`}\n disabled={stale}\n accessibilityState={{ disabled: stale }}\n onPress={() => onOpen(session.id)}\n style={({ pressed }) => [\n styles.card,\n session.nested && styles.nested,\n pressed && styles.cardPressed,\n !stale && session.active && styles.cardActive,\n ]}\n >\n <View style={styles.cardHead}>\n {session.profile ? (\n <View style={styles.avatar} accessibilityLabel={session.profile.label}>\n <Text style={styles.initials}>{session.profile.initials}</Text>\n {/* The rose count of things waiting on the person, on the avatar's top-right. */}\n <CountBadge count={waiting} style={styles.avatarBadge} />\n </View>\n ) : null}\n <View style={styles.cardText}>\n <View style={styles.nameRow}>\n {/* The cockpit card's provenance mark: a workflow pulse, or a fork for any other child. */}\n {session.nested && session.provenance === 'workflow-session' ? (\n <ActivityIcon size={13} color={markColor} accessibilityLabel=\"workflow session\" />\n ) : session.nested && session.provenance ? (\n <ForkIcon\n size={13}\n color={markColor}\n accessibilityLabel={\n session.provenance === 'worktree' ? 'automatic per-conversation worktree' : session.provenance\n }\n />\n ) : null}\n <Text style={styles.name} numberOfLines={2}>\n {name}\n </Text>\n {/* No avatar to sit on, so the count follows the name. */}\n {session.profile ? null : <CountBadge count={waiting} style={styles.nameBadge} />}\n </View>\n <View style={styles.statusRow}>\n {stale ? null : session.restarting ? (\n <Spinner size=\"small\" color=\"dim\" label=\"Restarting\" />\n ) : tone === 'running' ? (\n <Spinner size=\"small\" color=\"yellow\" />\n ) : tone === 'failed' ? (\n <AlertIcon size={12} color=\"red\" />\n ) : null}\n {!stale && session.clock ? (\n <LiveDuration style={styles.status(tone)} label={session.clock.label} since={session.clock.since} />\n ) : (\n <Text style={styles.status(tone)} numberOfLines={1}>\n {stale ? 'Last known' : session.status}\n </Text>\n )}\n {/* The branch closes the status line, so a card stays two lines tall. */}\n {session.git ? (\n <View style={styles.branchRow}>\n <BranchIcon size={13} color=\"dim\" />\n <Text style={styles.branch} numberOfLines={1}>\n {session.git.branch}\n </Text>\n {session.git.dirty ? <Text style={styles.modified}>modified</Text> : null}\n </View>\n ) : null}\n </View>\n </View>\n {!stale ? (\n <IconButton label={`${name} actions`} onPress={() => onMenu(session)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </View>\n {hostLabel ? <HostTag label={hostLabel} /> : null}\n {session.groups !== undefined && session.groups.length > 0 ? (\n <View style={[styles.groupsRow, session.profile && styles.underAvatar]} accessibilityLabel=\"groups\">\n <UsersIcon size={13} color=\"dim\" />\n <View style={styles.groups}>\n {session.groups.map((group) => (\n <Badge key={group} tone=\"magenta\" size=\"xs\">\n {group}\n </Badge>\n ))}\n </View>\n </View>\n ) : null}\n {session.error ? (\n <Text style={styles.error} numberOfLines={3}>\n {session.error}\n </Text>\n ) : null}\n </Pressable>\n {/* A pending reservation has no runtime, so it sits outside the card and never opens the session. */}\n {session.pendingSetups.map((setup) => (\n <View key={setup.id} style={styles.setup}>\n <View style={styles.setupHead}>\n <Text style={[styles.name, styles.setupName]} numberOfLines={1}>\n {setup.name}\n </Text>\n {!stale && onSetupMenu ? (\n <IconButton label={`${setup.name} setup actions`} onPress={() => onSetupMenu(setup)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </View>\n <Text style={styles.setupStatus(setup.failed)}>{setup.status}</Text>\n {setup.recovery ? (\n <Text style={styles.recovery} accessibilityRole={setup.failed ? 'alert' : undefined}>\n {setup.recovery}\n </Text>\n ) : null}\n </View>\n ))}\n </>\n );\n}\n\nfunction WorkspaceHeader({\n workspace,\n actions,\n onWorkspaceMenu,\n onCreate,\n onOpen,\n merged = false,\n stale = false,\n}: {\n workspace: WebTemplateRailWorkspace;\n actions: NativeTemplateSessionsActions;\n onCreate?: () => void;\n onOpen?: () => void;\n merged?: boolean;\n stale?: boolean;\n onWorkspaceMenu: (workspace: WebTemplateRailWorkspace) => void;\n}) {\n return (\n <View style={styles.group}>\n <View style={styles.groupHead} accessibilityRole=\"header\">\n <FolderIcon size={16} color=\"dim\" />\n <Pressable\n style={[styles.groupText, styles.workspaceLink]}\n accessibilityRole={onOpen ? 'button' : 'header'}\n accessibilityLabel={onOpen ? `Open ${workspace.name} workspace` : workspace.name}\n disabled={!onOpen}\n onPress={onOpen}\n >\n <Text style={styles.groupName} numberOfLines={1}>\n {workspace.name}\n </Text>\n </Pressable>\n {workspace.legacy ? null : (\n <>\n {workspace.available && (!stale || merged) ? (\n <IconButton\n label={`New session in ${workspace.name}`}\n onPress={onCreate ?? (() => actions.createSession(workspace.id))}\n >\n <PlusIcon size={18} color=\"dim\" />\n </IconButton>\n ) : null}\n {!stale || merged ? (\n <IconButton label={`${workspace.name} actions`} onPress={() => onWorkspaceMenu(workspace)}>\n <KebabIcon size={16} color=\"dim\" />\n </IconButton>\n ) : null}\n </>\n )}\n </View>\n </View>\n );\n}\n\n/** Display grouping never rewrites workspace or session identity. */\nexport function sessionSections(\n workspaces: readonly WebTemplateRailWorkspace[],\n presentation?: NativeTemplateSessionsProps['hostPresentation'],\n selectedHost: string | null = null,\n) {\n const filter = presentation?.hosts.some(({ id }) => id === selectedHost) ? selectedHost : null;\n const visible = workspaces.filter((workspace) => {\n const owner = presentation?.hostForId[workspace.id];\n if (owner && !presentation?.hosts.some(({ id }) => id === owner)) return false;\n return filter === null || owner === filter;\n });\n const sections: {\n key: string;\n workspace: WebTemplateRailWorkspace;\n members: WebTemplateRailWorkspace[];\n data: readonly WebTemplateRailSession[];\n }[] = [];\n for (const workspace of [\n ...visible.filter((item) => item.kind === 'session'),\n ...visible.filter((item) => item.kind !== 'session'),\n ]) {\n if (workspace.kind === 'session' && workspace.sessions.length === 0) continue;\n const existing =\n workspace.kind === 'session'\n ? sections.find((section) => section.workspace.kind === 'session')\n : presentation && presentation.hosts.length > 1 && !workspace.legacy\n ? sections.find(\n (section) =>\n section.workspace.kind !== 'session' &&\n !section.workspace.legacy &&\n section.workspace.name === workspace.name,\n )\n : undefined;\n if (existing) {\n existing.members.push(workspace);\n existing.data = [...existing.data, ...workspace.sessions];\n existing.workspace = { ...existing.workspace, available: existing.workspace.available || workspace.available };\n } else sections.push({ key: workspace.id, workspace, members: [workspace], data: workspace.sessions });\n }\n return sections.flatMap((section) =>\n section.workspace.kind === 'session'\n ? [{ ...section, showWorkspace: false }]\n : section.members.map((workspace, index) => ({\n key: workspace.id,\n workspace,\n members: section.members,\n data: workspace.sessions,\n showWorkspace: index === 0,\n })),\n );\n}\n\nexport function SessionCreateMenu({\n onCreateWorkspace,\n onCreateSession,\n workspaceDisabled = false,\n sessionDisabled = false,\n defaultOpen = false,\n}: {\n onCreateWorkspace?: () => void;\n onCreateSession?: () => void;\n workspaceDisabled?: boolean;\n sessionDisabled?: boolean;\n defaultOpen?: boolean;\n}) {\n return (\n <DropdownMenu defaultOpen={defaultOpen}>\n <DropdownMenuTrigger variant=\"ghost\" size=\"icon\" accessibilityLabel=\"Create workspace or session\">\n <PlusIcon size={18} color=\"dim\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {onCreateWorkspace ? (\n <DropdownMenuItem disabled={workspaceDisabled} onSelect={onCreateWorkspace}>\n Create workspace\n </DropdownMenuItem>\n ) : null}\n {onCreateSession ? (\n <DropdownMenuItem disabled={sessionDisabled} onSelect={onCreateSession}>\n Create session\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/** The cockpit's workspace groups, with quiet computer subgroups in the All hosts view. */\nexport function AdvancedSessions({\n workspaces,\n openSession,\n openWorkspace,\n actions,\n setHeaderAction,\n hostPresentation,\n}: NativeTemplateSessionsProps) {\n const [selectedHost, setSelectedHost] = useState<string | null>(hostPresentation?.initialHostId ?? null);\n const selected = hostPresentation?.hosts.some(({ id }) => id === selectedHost) ? selectedHost : null;\n if (selectedHost !== selected) setSelectedHost(selected);\n const sections = useMemo(\n () => sessionSections(workspaces, hostPresentation, selected),\n [workspaces, hostPresentation, selected],\n );\n const hosts = hostPresentation?.hosts ?? NO_HOSTS;\n const hostOf = (id: string) => hosts.find((host) => host.id === hostPresentation?.hostForId[id]);\n const stale = (id: string) => hostPresentation !== undefined && hostOf(id)?.status !== 'connected';\n const [choosing, setChoosing] = useState<readonly WebTemplateRailWorkspace[] | 'add' | 'general' | null>(null);\n const [chooseAction, setChooseAction] = useState<'create' | 'menu' | 'open'>('create');\n const [addHost, setAddHost] = useState<string | null>(null);\n const [sessionMenu, setSessionMenu] = useState<string | null>(null);\n const [workspaceMenu, setWorkspaceMenu] = useState<string | null>(null);\n const [groupsFor, setGroupsFor] = useState<string | null>(null);\n const [setupMenu, setSetupMenu] = useState<{ sessionId: string; setup: WebTemplateRailPendingSetup } | null>(null);\n const [adding, setAdding] = useState(false);\n const { addWorkspace, searchDirectories, listDirectory } = actions;\n const addActions =\n hosts.length > 0\n ? hosts.find(({ id }) => id === addHost)?.addWorkspaceActions\n : addWorkspace && searchDirectories && listDirectory\n ? { addWorkspace, searchDirectories, listDirectory }\n : undefined;\n const canAdd =\n hosts.length > 0 ? hosts.some((host) => host.addWorkspaceActions !== undefined) : addActions !== undefined;\n const beginAdd = useCallback(() => {\n if (hosts.length > 1) {\n setChoosing('add');\n return;\n }\n if (hosts.length === 1) {\n if (hosts[0]!.status !== 'connected') return;\n setAddHost(hosts[0]!.id);\n }\n setAdding(true);\n }, [hosts]);\n const generalAction = useRef(actions.createGeneralSession);\n useEffect(() => {\n generalAction.current = actions.createGeneralSession;\n }, [actions.createGeneralSession]);\n const canGeneral =\n hosts.length > 0\n ? hosts.some((host) => host.createGeneralSession !== undefined)\n : actions.createGeneralSession !== undefined;\n const beginGeneral = useCallback(() => {\n const host = hosts.find((host) => host.id === selected) ?? (hosts.length === 1 ? hosts[0] : undefined);\n if (host) {\n if (host.status === 'connected') host.createGeneralSession?.();\n } else if (hosts.length > 1) setChoosing('general');\n else generalAction.current?.();\n }, [hosts, selected]);\n const workspaceDisabled = hosts.length === 1 && hosts[0]!.status !== 'connected';\n const generalHost = hosts.find((host) => host.id === selected) ?? (hosts.length === 1 ? hosts[0] : undefined);\n const sessionDisabled =\n generalHost !== undefined && (generalHost.status !== 'connected' || generalHost.createGeneralSession === undefined);\n const createMenu = useMemo(\n () => (\n <SessionCreateMenu\n onCreateWorkspace={canAdd ? beginAdd : undefined}\n onCreateSession={canGeneral ? beginGeneral : undefined}\n workspaceDisabled={workspaceDisabled}\n sessionDisabled={sessionDisabled}\n />\n ),\n [canAdd, canGeneral, beginAdd, beginGeneral, workspaceDisabled, sessionDisabled],\n );\n // The app owns the title, including when the list is empty.\n const titleAdd = (canGeneral || canAdd) && setHeaderAction !== undefined;\n useEffect(() => {\n if (!titleAdd) return;\n setHeaderAction(createMenu);\n return () => setHeaderAction(null);\n }, [titleAdd, setHeaderAction, createMenu]);\n const sessions = workspaces.flatMap((workspace) => workspace.sessions).filter((session) => !stale(session.id));\n const { setSessionGroups, renameGroup, deleteGroup, removePendingSetup } = actions;\n // Older phone apps lack these, so their entries stay hidden rather than failing on tap.\n const groupActions =\n setSessionGroups && renameGroup && deleteGroup ? { setSessionGroups, renameGroup, deleteGroup } : undefined;\n return (\n <>\n <SectionList\n style={styles.screen}\n contentContainerStyle={styles.listContent}\n contentInsetAdjustmentBehavior=\"automatic\"\n sections={sections}\n keyExtractor={(session) => session.id}\n stickySectionHeadersEnabled={false}\n initialNumToRender={12}\n maxToRenderPerBatch={12}\n windowSize={5}\n renderSectionHeader={({ section }) =>\n section.workspace.kind === 'session' ? null : (\n <>\n {section.showWorkspace ? (\n <WorkspaceHeader\n workspace={{ ...section.workspace, available: section.members.some((member) => member.available) }}\n actions={actions}\n onOpen={\n openWorkspace && !section.workspace.legacy\n ? () => {\n const members = workspaces.filter(\n (entry) => !entry.legacy && entry.name === section.workspace.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('open');\n setChoosing(members);\n } else openWorkspace(section.workspace.id);\n }\n : undefined\n }\n onWorkspaceMenu={(entry) => {\n const members = workspaces.filter(\n (workspace) => !workspace.legacy && workspace.name === entry.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('menu');\n setChoosing(members);\n } else if (!stale(entry.id)) setWorkspaceMenu(entry.id);\n }}\n stale={stale(section.workspace.id)}\n merged={section.members.length > 1}\n onCreate={() => {\n // Always choose for a merged heading, even while viewing a filtered computer.\n const members = workspaces.filter(\n (entry) => !entry.legacy && entry.name === section.workspace.name,\n );\n if (hosts.length > 1 && members.length > 1) {\n setChooseAction('create');\n setChoosing(members);\n } else if (!stale(section.workspace.id)) actions.createSession(section.workspace.id);\n }}\n />\n ) : null}\n <View style={styles.hostGroup}>\n {/* One quiet row names the computer and path once, above its sessions. */}\n <View style={styles.hostRow} accessibilityRole=\"header\">\n {hosts.length > 1 && selected === null && hostOf(section.workspace.id) ? (\n <>\n <MonitorIcon size={14} color=\"dim\" />\n <Text style={styles.hostLabel} numberOfLines={1}>\n {hostOf(section.workspace.id)!.label} ·\n </Text>\n </>\n ) : null}\n <Text style={styles.groupRoot} numberOfLines={1} ellipsizeMode=\"middle\">\n {section.workspace.root}\n </Text>\n </View>\n {!section.workspace.available ? <Text style={styles.unavailable}>Workspace unavailable</Text> : null}\n {section.data.length === 0 ? (\n <Text style={styles.noSessions}>No sessions yet. Start or resume one.</Text>\n ) : null}\n </View>\n </>\n )\n }\n renderSectionFooter={({ section }) => {\n const next = sections[sections.indexOf(section) + 1];\n // A computer subgroup sits closer to its siblings than the next workspace does.\n return (\n <View style={next === undefined ? undefined : next.showWorkspace ? styles.sectionGap : styles.hostGap} />\n );\n }}\n renderItem={({ item: session, section }) => (\n <View style={styles.sessionRow}>\n <SessionCard\n session={session}\n stale={stale(session.id)}\n hostLabel={\n section.workspace.kind === 'session' && hosts.length > 1 && selected === null\n ? hostOf(session.id)?.label\n : undefined\n }\n onOpen={openSession}\n onMenu={(entry) => setSessionMenu(entry.id)}\n {...(removePendingSetup\n ? {\n onSetupMenu: (setup: WebTemplateRailPendingSetup) => setSetupMenu({ sessionId: session.id, setup }),\n }\n : {})}\n />\n </View>\n )}\n ListEmptyComponent={\n <EmptyState\n title={selected ? 'No sessions on this computer.' : 'No sessions yet.'}\n description={\n canGeneral\n ? 'Start a session to work with Po. No workspace needed.'\n : 'Add a workspace to start working with Po.'\n }\n />\n }\n ListHeaderComponent={\n <View style={styles.listHeader}>\n {/* The phone's host drawer picks the computer; the list only honours its initial choice. */}\n {hosts\n .filter((host) => host.status !== 'connected' && (selected === null || selected === host.id))\n .map((host) => (\n <InfoStrip\n key={host.id}\n message={\n host.status === 'update_required'\n ? `${host.label} needs an app update. Sessions are read-only.`\n : `${host.label} is offline. Showing last known sessions.`\n }\n actionLabel=\"Retry\"\n onAction={host.onRetry}\n />\n ))}\n {(canGeneral || canAdd) && !titleAdd ? createMenu : null}\n </View>\n }\n />\n <SessionMenuSheet\n session={sessions.find((session) => session.id === sessionMenu) ?? null}\n actions={actions}\n {...(groupActions ? { onGroups: (session: WebTemplateRailSession) => setGroupsFor(session.id) } : {})}\n onClose={() => setSessionMenu(null)}\n />\n <WorkspaceMenuSheet\n workspace={workspaces.find((workspace) => workspace.id === workspaceMenu && !stale(workspace.id)) ?? null}\n actions={actions}\n onClose={() => setWorkspaceMenu(null)}\n />\n {groupActions ? (\n <SessionGroupsSheet\n session={sessions.find((session) => session.id === groupsFor) ?? null}\n sessions={sessions}\n actions={groupActions}\n onClose={() => setGroupsFor(null)}\n />\n ) : null}\n {removePendingSetup ? (\n <SetupMenuSheet target={setupMenu} removePendingSetup={removePendingSetup} onClose={() => setSetupMenu(null)} />\n ) : null}\n {addActions && (hosts.length === 0 || hosts.find(({ id }) => id === addHost)?.status === 'connected') ? (\n <AddWorkspaceSheet\n open={adding}\n actions={addActions}\n onClose={() => {\n setAdding(false);\n setAddHost(null);\n }}\n />\n ) : null}\n <Sheet\n open={choosing !== null}\n onOpenChange={(open) => {\n if (!open) setChoosing(null);\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Which computer?</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {choosing === 'general'\n ? hosts.map((host) => (\n <Button\n key={host.id}\n variant=\"ghost\"\n disabled={host.status !== 'connected' || !host.createGeneralSession}\n onPress={() => {\n setChoosing(null);\n host.createGeneralSession?.();\n }}\n >\n {host.label}\n {host.status !== 'connected' ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))\n : choosing === 'add'\n ? hosts.map((host) => (\n <Button\n key={host.id}\n variant=\"ghost\"\n disabled={host.status !== 'connected' || !host.addWorkspaceActions}\n onPress={() => {\n setAddHost(host.id);\n setChoosing(null);\n setAdding(true);\n }}\n >\n {host.label}\n {host.status !== 'connected' ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))\n : choosing?.map((workspace) => (\n <Button\n key={workspace.id}\n variant=\"ghost\"\n disabled={chooseAction !== 'open' && (stale(workspace.id) || !workspace.available)}\n onPress={() => {\n setChoosing(null);\n if (chooseAction === 'open') openWorkspace?.(workspace.id);\n else if (chooseAction === 'menu') setWorkspaceMenu(workspace.id);\n else actions.createSession(workspace.id);\n }}\n >\n {hostOf(workspace.id)?.label ?? workspace.name} · {workspace.root}\n {stale(workspace.id) ? UNAVAILABLE_LABEL : ''}\n </Button>\n ))}\n </SheetBody>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const text = (size: 'xs' | 'sm' | 'base' | 'lg', color: string) => ({\n fontFamily: sans,\n fontSize: theme.fontSize[size],\n lineHeight: theme.lineHeight[size],\n color,\n });\n return {\n // The cockpit's rail surface: this screen is the phone's rail.\n screen: { flex: 1, backgroundColor: theme.colors.rail },\n content: { padding: theme.spacing(4), gap: theme.spacing(6) },\n listContent: { padding: theme.spacing(4) },\n listHeader: { gap: theme.spacing(3), paddingBottom: theme.spacing(4) },\n sectionGap: { height: theme.spacing(6) },\n sessionRow: { gap: theme.spacing(1), paddingTop: theme.spacing(1) },\n group: { gap: theme.spacing(1) },\n // The content gap already spaces the heading from the first group, so it pulls up into it.\n railHead: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: theme.spacing(1),\n marginBottom: -theme.spacing(4),\n },\n listRailHead: { marginBottom: theme.spacing(2) },\n railTitle: { ...text('lg', theme.colors.hi), fontWeight: theme.fontWeight.semibold, flex: 1 },\n groupHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n groupText: { flex: 1, minWidth: 0 },\n workspaceLink: { minHeight: 44, justifyContent: 'center' },\n groupName: { ...text('lg', theme.colors.hi), fontWeight: theme.fontWeight.semibold },\n groupRoot: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1 },\n hostGroup: { gap: theme.spacing(1), paddingHorizontal: theme.spacing(1), paddingBottom: theme.spacing(1) },\n hostGap: { height: theme.spacing(3) },\n hostRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n paddingBottom: theme.spacing(2),\n borderBottomWidth: 1,\n borderColor: theme.colors['border-soft'],\n },\n // The host name keeps its room; the path gives way first.\n hostLabel: { ...text('sm', theme.colors.dim), flexShrink: 0, maxWidth: '60%' },\n noSessions: {\n ...text('sm', theme.colors.dim),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n unavailable: { ...text('sm', theme.colors.red), paddingHorizontal: theme.spacing(1) },\n // The cockpit's dashed empty card.\n empty: {\n gap: theme.spacing(3),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(5),\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: theme.colors.border,\n },\n emptyText: text('sm', theme.colors.dim),\n emptyButton: { justifyContent: 'flex-start', backgroundColor: theme.colors.panel },\n card: {\n gap: theme.spacing(2),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n // Flat like the cockpit card: no fill or edge until pressed or active.\n borderColor: 'transparent',\n },\n cardPressed: { backgroundColor: theme.colors.panel },\n cardActive: { backgroundColor: theme.colors['tint-green'], borderColor: theme.colors['edge-green'] },\n nested: { marginLeft: theme.spacing(5) },\n iconButton: {\n width: 44,\n height: 44,\n borderRadius: theme.borderRadius.lg,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconPressed: { backgroundColor: theme.colors.panel },\n cardHead: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(2.5) },\n avatar: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors['tint-green'],\n },\n initials: { ...text('xs', theme.colors.green), fontWeight: theme.fontWeight.semibold },\n avatarBadge: { position: 'absolute', top: -4, right: -6, borderColor: theme.colors.bg },\n nameBadge: { borderColor: theme.colors.bg },\n cardText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n nameRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n name: { ...text('base', theme.colors.hi), fontWeight: theme.fontWeight.semibold, flexShrink: 1 },\n // On a narrow phone the branch wraps under the status rather than being cut.\n statusRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: theme.spacing(1.5),\n rowGap: 2,\n },\n status: (tone: StatusTone) => ({\n ...text('sm', tone === 'failed' ? theme.colors.red : tone === 'running' ? theme.colors.yellow : theme.colors.dim),\n flexShrink: 1,\n }),\n underAvatar: { paddingLeft: 32 + theme.spacing(2.5) },\n branchRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1) },\n branch: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1 },\n modified: text('sm', theme.colors.yellow),\n groupsRow: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(1.5) },\n groups: { flex: 1, flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(1) },\n // The cockpit's pending setup panel: indented, soft edge, panel fill.\n setup: {\n gap: theme.spacing(1),\n marginLeft: theme.spacing(4),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n backgroundColor: theme.colors.panel,\n },\n setupStatus: (failed: boolean) => text('sm', failed ? theme.colors.red : theme.colors.dim),\n // The kebab's 44 point target sits inside the panel's padding rather than growing the row.\n setupHead: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), marginVertical: -theme.spacing(2) },\n setupName: { flex: 1 },\n recovery: text('sm', theme.colors.dim),\n error: text('sm', theme.colors.red),\n };\n});\n","import type { NativeTemplateFile } from '@agimon-ai/po-core/native';\n\nimport { AdvancedSessions } from '../_components/AdvancedSessions.native';\n\n/** The phone half of Advanced. Screens it leaves out stay the app's own. */\nexport const advancedNativeTemplate = {\n label: 'Advanced',\n description: 'Workspace-grouped session cards, matching the cockpit rail.',\n contractVersion: 1,\n screens: { sessions: AdvancedSessions },\n} satisfies NativeTemplateFile;\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport templatePoTemplateAdvanced from '../src/extensions/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced2 from '../src/extensions/workspaces/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced3 from '../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'template-advanced',\n global: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced)]; },\n },\n workspace: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced2)]; },\n },\n session: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced3)]; },\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-template-advanced",
3
- "version": "0.0.0-alpha.85",
3
+ "version": "0.0.0-alpha.87",
4
4
  "description": "Advanced multi-panel template for the Po web client.",
5
5
  "keywords": [
6
6
  "ai",
@@ -54,16 +54,16 @@
54
54
  "access": "public"
55
55
  },
56
56
  "dependencies": {
57
- "@agimon-ai/po-core": "0.0.0-alpha.85",
58
- "@agimon-ai/po-web-components": "0.0.0-alpha.85",
59
- "@agimon-ai/po-web-dashboard": "0.0.0-alpha.85",
57
+ "@agimon-ai/po-core": "0.0.0-alpha.87",
58
+ "@agimon-ai/po-web-components": "0.0.0-alpha.87",
59
+ "@agimon-ai/po-web-dashboard": "0.0.0-alpha.87",
60
60
  "@tanstack/react-router": "1.170.45",
61
61
  "@tanstack/react-store": "0.11.2"
62
62
  },
63
63
  "devDependencies": {
64
- "@agimon-ai/po-build": "0.0.0-alpha.85",
65
- "@agimon-ai/po-native-components": "0.0.0-alpha.85",
66
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.85",
64
+ "@agimon-ai/po-build": "0.0.0-alpha.87",
65
+ "@agimon-ai/po-native-components": "0.0.0-alpha.87",
66
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.87",
67
67
  "@babel/core": "7.29.7",
68
68
  "@earendil-works/pi-coding-agent": "1.4.0",
69
69
  "@types/node": "26.6.5",