@agimon-ai/po-template-elegant 0.0.0-alpha.75 → 0.0.0-alpha.76

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.
@@ -1007,40 +1007,58 @@ function ElegantRail({ rail, onClose }) {
1007
1007
  function ElegantSessionList({ rail }) {
1008
1008
  const { actions } = rail;
1009
1009
  const empty = rail.workspaces.every((workspace) => workspace.kind === "session" && workspace.sessions.length === 0);
1010
+ const list = useRef(null);
1011
+ const [revealed, setRevealed] = useDashboardState("rail/initial-selection-revealed", false);
1012
+ useEffect(() => {
1013
+ if (revealed) return;
1014
+ const selected = list.current?.querySelector("[data-active=\"true\"]");
1015
+ if (!selected) return;
1016
+ selected.scrollIntoView({
1017
+ block: "center",
1018
+ inline: "nearest",
1019
+ behavior: "instant"
1020
+ });
1021
+ setRevealed(true);
1022
+ }, [
1023
+ rail.workspaces,
1024
+ revealed,
1025
+ setRevealed
1026
+ ]);
1010
1027
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1011
1028
  className: "flex items-center justify-between px-5 pt-3 pb-2",
1012
1029
  children: [/* @__PURE__ */ jsx("h2", {
1013
1030
  className: "text-lg font-semibold text-po-hi",
1014
1031
  children: "Sessions"
1015
- }), /* @__PURE__ */ jsx(Button, {
1016
- variant: "ghost",
1017
- size: "icon",
1018
- "data-testid": actions.createGeneralSession ? "new-session-open" : "add-workspace-shortcut",
1019
- title: actions.createGeneralSession ? "New session" : "Add workspace",
1020
- "aria-label": actions.createGeneralSession ? "New session" : "Add workspace",
1021
- onClick: actions.createGeneralSession ?? actions.openAddWorkspace,
1022
- className: "text-po-dim hover:text-po-hi",
1023
- children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-3.5" })
1024
- })]
1032
+ }), /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1033
+ asChild: true,
1034
+ children: /* @__PURE__ */ jsx(Button, {
1035
+ variant: "ghost",
1036
+ size: "icon",
1037
+ "data-testid": "session-create-menu",
1038
+ title: "Create workspace or session",
1039
+ "aria-label": "Create workspace or session",
1040
+ className: "text-po-dim hover:text-po-hi",
1041
+ children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-3.5" })
1042
+ })
1043
+ }), /* @__PURE__ */ jsxs(DropdownMenuContent, { children: [/* @__PURE__ */ jsx(DropdownMenuItem, {
1044
+ "data-testid": "add-workspace-open",
1045
+ onSelect: actions.openAddWorkspace,
1046
+ children: "Create workspace"
1047
+ }), actions.createGeneralSession ? /* @__PURE__ */ jsx(DropdownMenuItem, {
1048
+ "data-testid": "new-session-open",
1049
+ onSelect: actions.createGeneralSession,
1050
+ children: "Create session"
1051
+ }) : null] })] })]
1025
1052
  }), /* @__PURE__ */ jsxs("div", {
1053
+ ref: list,
1026
1054
  className: "flex flex-col gap-4 px-3 pb-3",
1027
- children: [
1028
- /* @__PURE__ */ jsx(Button, {
1029
- variant: "ghost",
1030
- "data-testid": "add-workspace-open",
1031
- className: "justify-start text-po-dim",
1032
- onClick: actions.openAddWorkspace,
1033
- children: "Add workspace"
1034
- }),
1035
- rail.workspaces.map((workspace) => /* @__PURE__ */ jsx(ElegantWorkspaceGroup, {
1036
- workspace,
1037
- actions
1038
- }, workspace.id)),
1039
- empty ? /* @__PURE__ */ jsx("p", {
1040
- className: "px-2 text-sm text-po-dim",
1041
- children: "Start a session to work with Po. No workspace needed."
1042
- }) : null
1043
- ]
1055
+ children: [rail.workspaces.map((workspace) => /* @__PURE__ */ jsx(ElegantWorkspaceGroup, {
1056
+ workspace,
1057
+ actions
1058
+ }, workspace.id)), empty ? /* @__PURE__ */ jsx("p", {
1059
+ className: "px-2 text-sm text-po-dim",
1060
+ children: "Start a session to work with Po. No workspace needed."
1061
+ }) : null]
1044
1062
  })] });
1045
1063
  }
1046
1064
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","names":["folderName","TRAILING_SEPARATORS","folderName","templatePoTemplateElegant","templatePoTemplateElegant2","templatePoTemplateElegant3"],"sources":["../../src/extensions/(frontend)/template/_components/ElegantFolderBrowser.tsx","../../src/extensions/(frontend)/template/_components/ElegantAddWorkspaceDialog.tsx","../../src/extensions/(frontend)/template/_components/ElegantPendingSetup.tsx","../../src/extensions/(frontend)/template/_components/ElegantSessionCard.tsx","../../src/extensions/(frontend)/template/_components/ElegantWorkspaceGroup.tsx","../../src/extensions/(frontend)/template/_components/ElegantRail.tsx","../../src/extensions/(frontend)/template/_components/ElegantLayout.tsx","../../src/extensions/(frontend)/template/_components/ElegantOnboarding.tsx","../../src/extensions/(frontend)/template/_components/ElegantOnboardingFlow.tsx","../../src/extensions/(frontend)/template/_components/ElegantConversation.tsx","../../src/extensions/(frontend)/template/_components/ElegantSettings.tsx","../../src/extensions/(frontend)/template/_components/ElegantDashboard.tsx","../../src/extensions/(frontend)/template/_lib/definition.ts","../../src/extensions/(frontend)/template/po-template-elegant.web.ts","../../src/extensions/workspaces/(frontend)/template/po-template-elegant.web.ts","../../src/extensions/workspaces/sessions/(frontend)/template/po-template-elegant.web.ts","../../generated/web.ts"],"sourcesContent":["import type { WebTemplateRailActions, WebTemplateRailDirectoryListing } from '@agimon-ai/po-core/web';\nimport { Button, ChevronUpIcon, OptionRow } from '@agimon-ai/po-web-components';\nimport { useEffect, useState } from 'react';\n\nfunction folderName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1) || path;\n}\n\n/** Walks the server's folders inline: up, into a child, or pick the current folder. */\nexport function ElegantFolderBrowser({\n start,\n listDirectory,\n onSelect,\n}: {\n /** Folder to open first; home when absent. */\n start?: string;\n listDirectory: WebTemplateRailActions['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\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\n return (\n <div\n data-testid=\"folder-browser\"\n className=\"flex flex-col gap-1 rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5\"\n >\n <div className=\"flex items-center gap-1 px-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"folder-browser-up\"\n title=\"parent folder\"\n aria-label=\"parent folder\"\n disabled={listing?.parent === undefined}\n onClick={() => listing?.parent !== undefined && setTarget(listing.parent)}\n >\n <ChevronUpIcon className=\"h-3 w-3\" />\n </Button>\n <span className=\"min-w-0 flex-1 truncate text-sm text-po-dim\" title={listing?.path}>\n {listing?.path ?? 'loading…'}\n </span>\n <Button\n variant=\"outline\"\n size=\"xs\"\n data-testid=\"folder-browser-select\"\n disabled={listing === null}\n onClick={() => listing !== null && onSelect(listing.path)}\n >\n use this folder\n </Button>\n </div>\n {error ? <p className=\"px-2 py-1 text-sm text-po-red\">{error}</p> : null}\n <div role=\"listbox\" aria-label=\"folders\" className=\"max-h-40 overflow-y-auto\">\n {listing !== null && listing.directories.length === 0 ? (\n <p className=\"px-2 py-1 text-sm text-po-dim\">no folders here</p>\n ) : null}\n {listing?.directories.map((directory) => (\n <OptionRow\n key={directory}\n density=\"compact\"\n data-testid=\"folder-browser-entry\"\n onClick={() => setTarget(directory)}\n className=\"w-full px-2.5 py-1 \"\n >\n {folderName(directory)}\n </OptionRow>\n ))}\n </div>\n </div>\n );\n}\n","import type { WebTemplateRailActions } from '@agimon-ai/po-core/web';\nimport {\n Button,\n Checkbox,\n Textarea,\n Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n OptionRow,\n} from '@agimon-ai/po-web-components';\nimport {\n workspaceAdmissionStore,\n updateWorkspaceAdmission,\n discoverWorkspaceAdmission,\n type WorkspaceAdmissionDraft,\n} from '@agimon-ai/po-web-dashboard';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\n\nimport { ElegantFolderBrowser } from './ElegantFolderBrowser';\n\nconst SUGGESTION_DEBOUNCE_MS = 120;\nconst NO_HIGHLIGHT = -1;\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);\n}\n\n/** Connects the durable draft and fenced discovery to the production presentation. */\nexport function ElegantAddWorkspaceDialog({\n suggestedPaths,\n actions,\n}: {\n suggestedPaths: readonly string[];\n actions: WebTemplateRailActions;\n}) {\n const draft = useStore(workspaceAdmissionStore, (state) => state);\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const [suggestions, setSuggestions] = useState<{ path: string; directories: readonly string[] }>({\n path: '',\n directories: [],\n });\n useEffect(() => {\n const typed = path.trim();\n if (typed === '') return;\n let stale = false;\n const timer = setTimeout(async () => {\n const found = await actions.searchDirectories(typed);\n if (stale) return;\n setSuggestions({ path, directories: found.filter((directory) => directory !== typed) });\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [path, actions]);\n\n useEffect(() => discoverWorkspaceAdmission(path, actions.discoverWorkspaces), [path, actions.discoverWorkspaces]);\n return (\n <ElegantAddWorkspaceDialogView\n suggestions={path.trim() !== '' && suggestions.path === path ? suggestions.directories : []}\n suggestedPaths={suggestedPaths}\n actions={actions}\n draft={draft}\n updateDraft={updateWorkspaceAdmission}\n />\n );\n}\n\n/** Shared by runtime and deterministic approved-state stories. */\nexport function ElegantAddWorkspaceDialogView({\n suggestedPaths,\n actions,\n draft,\n updateDraft,\n style,\n suggestions = [],\n}: {\n suggestedPaths: readonly string[];\n actions: WebTemplateRailActions;\n draft: WorkspaceAdmissionDraft;\n updateDraft: typeof updateWorkspaceAdmission;\n style?: CSSProperties;\n suggestions?: readonly string[];\n}) {\n const { name, nameEdited, instructions, pending: busy, error, discovery } = draft;\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const setName = (name: string): void => updateDraft({ name });\n const setNameEdited = (nameEdited: boolean): void => updateDraft({ nameEdited });\n const setPath = (path: string): void => updateDraft({ path });\n const [browsing, setBrowsing] = useState(false);\n const [highlight, setHighlight] = useState(NO_HIGHLIGHT);\n const pathInput = useRef<HTMLInputElement>(null);\n const shownName = nameEdited ? name : folderName(path);\n\n const changePath = (next: string): void => {\n if (busy) return;\n setPath(next);\n setHighlight(NO_HIGHLIGHT);\n };\n const pick = (directory: string): void => {\n changePath(`${directory}/`);\n pathInput.current?.focus();\n };\n const trimmedPath = path.trim().replace(TRAILING_SEPARATORS, '') || (path.trim() === '' ? '' : '/');\n const discovering =\n draft.discovering || (!!path.trim() && actions.discoverWorkspaces !== undefined && draft.discoveryPath !== path);\n const discoveryError = discovery && 'error' in discovery ? discovery.error : '';\n const declarations =\n discovery && 'declarations' in discovery && discovery.declarations.length > 0 ? discovery.declarations : undefined;\n const addedId = (name: string): string | undefined =>\n declarations?.find((entry) => entry.name === name)?.workspaceId ??\n draft.results.find((entry) => entry.name === name)?.workspaceId;\n const selected =\n declarations\n ?.filter((entry) => draft.checked.includes(entry.name) && !addedId(entry.name))\n .map((entry) => entry.name) ?? [];\n const manual = !declarations && !discovering && !discoveryError;\n const canSubmit =\n !busy &&\n !discovering &&\n !discoveryError &&\n (declarations\n ? selected.length > 0 && actions.addDeclaredWorkspaces !== undefined\n : trimmedPath !== '' || shownName.trim() !== '');\n const submit = async (): Promise<void> => {\n if (!canSubmit) return;\n if (declarations) {\n await actions.addDeclaredWorkspaces?.({\n path: discovery && 'root' in discovery ? discovery.root : trimmedPath,\n names: selected,\n });\n return;\n }\n await actions.addWorkspace({\n ...(instructions === '' ? {} : { instructions }),\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n });\n };\n\n return (\n <Dialog open onOpenChange={(next) => !next && !busy && actions.closeAddWorkspace()}>\n <DialogContent style={style} width=\"md\" data-testid=\"add-workspace-dialog\" aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>Add workspace</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <label htmlFor=\"add-workspace-root\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">Folder</span>\n <span className=\"flex items-center gap-1.5\">\n <Input\n id=\"add-workspace-root\"\n ref={pathInput}\n data-testid=\"add-workspace-root\"\n value={path}\n autoFocus\n disabled={busy}\n onChange={(event) => changePath(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' && suggestions.length > 0) {\n event.preventDefault();\n setHighlight((current) => (current + 1) % suggestions.length);\n } else if (event.key === 'ArrowUp' && suggestions.length > 0) {\n event.preventDefault();\n setHighlight((current) => (current <= 0 ? suggestions.length - 1 : current - 1));\n } else if (event.key === 'Enter') {\n const chosen = highlight === NO_HIGHLIGHT ? undefined : suggestions[highlight];\n if (chosen === undefined) void submit();\n else pick(chosen);\n }\n }}\n placeholder=\"~/workspace/my-project\"\n className=\"min-w-0 flex-1 font-mono\"\n />\n <Button\n variant={browsing ? 'subtle' : 'outline'}\n size=\"md\"\n data-testid=\"add-workspace-browse\"\n aria-pressed={browsing}\n disabled={busy}\n onClick={() => setBrowsing((open) => !open)}\n >\n Browse\n </Button>\n </span>\n </label>\n {browsing ? (\n <ElegantFolderBrowser\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 <div\n role=\"listbox\"\n aria-label=\"matching directories\"\n data-testid=\"add-workspace-suggestions\"\n className=\"max-h-40 overflow-y-auto rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5\"\n >\n {suggestions.map((directory, index) => (\n <OptionRow\n key={directory}\n density=\"compact\"\n active={index === highlight}\n data-testid=\"add-workspace-suggestion\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => setHighlight(index)}\n onClick={() => pick(directory)}\n className=\"w-full px-2.5 py-1 \"\n >\n {directory}\n </OptionRow>\n ))}\n </div>\n ) : null}\n {suggestedPaths.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {suggestedPaths.slice(0, 4).map((suggested) => (\n <Button\n key={suggested}\n variant=\"outline\"\n size=\"xs\"\n disabled={busy}\n onClick={() => changePath(suggested)}\n >\n {suggested}\n </Button>\n ))}\n </div>\n ) : null}\n {discovering ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Reading workspace declarations…\n </p>\n ) : null}\n {discoveryError ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {discoveryError}\n </p>\n ) : null}\n {declarations ? (\n <fieldset className=\"flex min-w-0 flex-col gap-1\">\n <legend className=\"mb-1 text-base font-medium text-po-hi\">Workspaces</legend>\n <p className=\"mb-1 text-sm text-po-dim\">Declared in .po/config.yaml. Choose which to add.</p>\n {declarations.map((entry, index) => {\n const isAdded = addedId(entry.name) !== undefined;\n const on = isAdded || draft.checked.includes(entry.name);\n const rowError = draft.results.find((result) => result.name === entry.name)?.error;\n return (\n <div\n key={entry.name}\n data-checked={on}\n className=\"rounded-sm px-2 py-1.5 data-[checked=true]:bg-po-tint-green\"\n >\n <label\n htmlFor={`add-workspace-declaration-${index}`}\n className=\"flex min-w-0 cursor-pointer items-start gap-2.5\"\n >\n <Checkbox\n id={`add-workspace-declaration-${index}`}\n checked={on}\n disabled={isAdded || busy}\n onCheckedChange={() =>\n updateDraft({\n checked: on\n ? draft.checked.filter((name) => name !== entry.name)\n : [...draft.checked, entry.name],\n })\n }\n className=\"mt-1\"\n />\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-base font-semibold text-po-hi\">{entry.name}</span>\n <span className=\"truncate text-sm text-po-dim\" title={entry.instructions}>\n {entry.instructions}\n </span>\n {rowError ? (\n <span role=\"alert\" className=\"text-sm text-po-red\">\n {rowError}\n </span>\n ) : null}\n </span>\n {isAdded ? <span className=\"text-sm text-po-dim\">Added</span> : null}\n </label>\n </div>\n );\n })}\n </fieldset>\n ) : manual ? (\n <>\n <label htmlFor=\"add-workspace-name\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">Name</span>\n <Input\n id=\"add-workspace-name\"\n data-testid=\"add-workspace-name\"\n value={shownName}\n disabled={busy}\n onChange={(event) => {\n setNameEdited(true);\n setName(event.target.value);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter') void submit();\n }}\n placeholder=\"my-project\"\n />\n </label>\n <label htmlFor=\"add-workspace-instructions\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">\n Instructions <span className=\"font-normal\">(optional)</span>\n </span>\n <Textarea\n id=\"add-workspace-instructions\"\n rows={3}\n value={instructions}\n disabled={busy}\n onChange={(event) => updateDraft({ instructions: event.target.value })}\n />\n <span className=\"text-sm text-po-dim\">For main sessions in this workspace.</span>\n </label>\n </>\n ) : null}\n {manual && trimmedPath === '' && shownName.trim() !== '' ? (\n <p data-testid=\"add-workspace-default-hint\" className=\"text-sm text-po-dim\">\n creates ~/.po/workspace/{shownName.trim()}\n </p>\n ) : null}\n {error ? (\n <pre className=\"max-h-28 overflow-y-auto rounded border border-po-edge-red bg-po-tint-red/40 px-2.5 py-2 text-sm whitespace-pre-wrap text-po-red\">\n {error}\n </pre>\n ) : null}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => actions.closeAddWorkspace()} disabled={busy}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n data-testid=\"add-workspace-confirm\"\n onClick={() => void submit()}\n disabled={!canSubmit}\n >\n {busy\n ? 'Adding…'\n : declarations\n ? `Add ${selected.length} ${selected.length === 1 ? 'workspace' : 'workspaces'}`\n : 'Add workspace'}\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { WebTemplateRailActions, WebTemplateRailPendingSetup } from '@agimon-ai/po-core/web';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n KebabIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\n\n/** A setup-only reservation: no runtime, so it offers removal and nothing else. */\nexport function ElegantPendingSetup({\n sessionId,\n setup,\n actions,\n}: {\n sessionId: string;\n setup: WebTemplateRailPendingSetup;\n actions: WebTemplateRailActions;\n}) {\n const key = JSON.stringify(['rail/setup', sessionId, setup.id]);\n const [busy, setBusy, busyState] = useDashboardState(`${key}/busy`, false);\n const [error, setError] = useDashboardState(`${key}/error`, '');\n const remove = async (): Promise<void> => {\n if (busyState.state) return;\n setBusy(true);\n setError('');\n const result = await actions.removePendingSetup(sessionId, setup.id);\n setBusy(false);\n if (result !== undefined) setError(result.error);\n };\n return (\n <div\n data-testid={`pending-session-${setup.id}`}\n className=\"ml-9 flex flex-col gap-0.5 rounded-lg border border-dashed border-po-border-soft px-3 py-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate text-base font-semibold text-po-hi\">{setup.name}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"session setup actions\"\n disabled={busy}\n data-testid={`pending-session-menu-${setup.id}`}\n >\n <KebabIcon className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem variant=\"destructive\" onSelect={() => void remove()}>\n remove setup\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <p className={setup.failed ? 'text-sm text-po-red' : 'text-sm text-po-dim'}>{setup.status}</p>\n {setup.recovery ? (\n <p role={setup.failed ? 'alert' : undefined} className=\"text-sm text-po-dim\">\n {setup.recovery}\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import type { WebTemplateRailActions, WebTemplateRailSession } from '@agimon-ai/po-core/web';\nimport {\n AlertIcon,\n Avatar,\n AvatarFallback,\n AvatarImage,\n BranchIcon,\n Button,\n cn,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n ForkIcon,\n ActivityIcon,\n Input,\n KebabIcon,\n LiveDuration,\n LoaderIcon,\n NavTabBadge,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { memo, useRef } from 'react';\n\nimport { ElegantPendingSetup } from './ElegantPendingSetup';\n\ntype CardMode = 'view' | 'menu' | 'rename' | 'confirm';\n\n/**\n * A soft tile led by the persona avatar, with the branch as a quiet caption.\n * Memoized: the rail keeps an unchanged session's object, so another session's push skips this card.\n */\nexport const ElegantSessionCard = memo(function ElegantSessionCard({\n session,\n actions,\n}: {\n session: WebTemplateRailSession;\n actions: WebTemplateRailActions;\n}) {\n const key = `rail/session/${session.id}`;\n const [mode, setMode] = useDashboardState<CardMode>(`${key}/mode`, 'view');\n const [draft, setDraft] = useDashboardState(`${key}/draft`, '');\n const [removeError, setRemoveError] = useDashboardState(`${key}/error`, '');\n const [, setRemoving, removingState] = useDashboardState(`${key}/removing`, false);\n // Written by the event that changes the mode, so the menu's close-focus handler\n // sees the new mode before React re-renders the card.\n const modeRef = useRef(mode);\n const enterMode = (next: CardMode): void => {\n modeRef.current = next;\n setMode(next);\n };\n const { active } = session;\n const error = removeError || session.error;\n const tileClass = active\n ? 'rounded-lg border border-po-edge-green bg-po-tint-green px-3 hover:bg-po-tint-green'\n : 'rounded-lg border border-transparent px-3 hover:bg-po-panel';\n const failed = session.status.startsWith('failed') || session.status.includes(' failed');\n const running = session.status.startsWith('running');\n // A host without the count still marks a waiting card as one.\n const waiting = session.waitingCount ?? (session.awaitingInput ? 1 : 0);\n const commitRename = (): void => {\n actions.renameSession(session.id, draft);\n enterMode('view');\n };\n const remove = async (): Promise<void> => {\n if (removingState.state) return;\n setRemoving(true);\n enterMode('view');\n setRemoveError('');\n const result = await actions.removeSession(session.id);\n setRemoving(false);\n if (result !== undefined) setRemoveError(result.error);\n };\n\n const body = (\n <>\n <span className=\"flex w-full min-w-0 items-start gap-2.5\">\n <span className=\"relative shrink-0\">\n <Avatar\n data-testid={session.profile ? 'session-avatar' : undefined}\n aria-label={session.profile?.label ?? 'Po'}\n title={session.profile?.label}\n className=\"size-8 rounded-full\"\n >\n {session.profile?.avatarUrl ? <AvatarImage src={session.profile.avatarUrl} alt=\"\" /> : null}\n <AvatarFallback className=\"bg-po-tint-green text-xs font-semibold text-po-green\">\n {session.profile?.initials ?? 'PO'}\n </AvatarFallback>\n </Avatar>\n {waiting > 0 ? (\n <>\n {/* The rose count of things waiting on the person, on the avatar's top-right. */}\n <NavTabBadge\n ask\n aria-hidden\n data-testid=\"session-awaiting-input\"\n className=\"absolute -top-1 -right-1.5 ring-2 ring-po-rail\"\n >\n {waiting}\n </NavTabBadge>\n <span className=\"sr-only\">, {waiting} waiting for you</span>\n </>\n ) : null}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"flex min-w-0 items-start gap-2\">\n {session.nested && session.provenance === 'workflow-session' ? (\n <ActivityIcon\n aria-label=\"workflow session\"\n className={`mt-1 size-3 shrink-0 ${active ? 'text-po-green' : 'text-po-faint'}`}\n />\n ) : session.nested && session.provenance ? (\n <ForkIcon\n aria-label={\n session.provenance === 'worktree' ? 'automatic per-conversation worktree' : session.provenance\n }\n className={`mt-1 size-3 shrink-0 ${active ? 'text-po-green' : 'text-po-faint'}`}\n />\n ) : null}\n <span className=\"min-w-0 flex-1 text-base font-semibold break-words text-po-hi\">\n {session.name || 'Untitled'}\n </span>\n {session.ordinal <= 9 ? (\n <span\n title={`press ${String(session.ordinal)} to focus`}\n className=\"grid size-5 shrink-0 place-items-center rounded-full bg-po-panel text-2xs text-po-dim transition-opacity group-focus-within:opacity-0 group-hover:opacity-0\"\n >\n {session.ordinal}\n </span>\n ) : null}\n </span>\n <span\n className={`flex min-w-0 items-start gap-1.5 text-sm leading-snug ${\n failed ? 'text-po-red' : running ? 'text-po-yellow' : active ? 'text-po-text' : 'text-po-dim'\n }`}\n >\n {running ? (\n <LoaderIcon aria-hidden className=\"mt-0.5 size-3 shrink-0 animate-spin\" />\n ) : failed ? (\n <AlertIcon aria-hidden className=\"mt-0.5 size-3 shrink-0\" />\n ) : null}\n {session.clock ? (\n <LiveDuration\n data-testid=\"session-status\"\n className={active ? 'line-clamp-2' : 'truncate'}\n label={session.clock.label}\n since={session.clock.since}\n />\n ) : (\n <span data-testid=\"session-status\" className={active ? 'line-clamp-2' : 'truncate'}>\n {session.status}\n </span>\n )}\n </span>\n </span>\n </span>\n {session.git ? (\n <span data-testid=\"session-branch\" className=\"flex min-w-0 items-center gap-1.5 pl-10.5 text-sm text-po-dim\">\n <BranchIcon className={`size-3 shrink-0 ${active ? 'text-po-green' : ''}`} />\n <span className=\"truncate font-mono\">{session.git.branch}</span>\n {session.git.dirty ? <span className=\"shrink-0 text-po-yellow\">modified</span> : null}\n </span>\n ) : null}\n {error ? (\n <span data-testid=\"session-error\" className=\"line-clamp-3 text-sm break-words text-po-red\">\n {error}\n </span>\n ) : null}\n </>\n );\n\n const menuOpen = mode === 'menu';\n return (\n <>\n <div\n className={cn('group relative', session.nested && 'pl-5')}\n data-testid={`session-card-${session.id}`}\n data-active={active}\n data-nested={session.nested}\n >\n <Button\n variant=\"ghost\"\n size=\"card\"\n data-testid={`session-open-${session.id}`}\n onClick={() => actions.openSession(session.id)}\n className={tileClass}\n >\n {body}\n </Button>\n {mode === 'view' || menuOpen ? (\n <div\n className={`absolute top-2 right-2 transition-opacity ${\n menuOpen ? 'opacity-100' : 'opacity-0 group-focus-within:opacity-100 group-hover:opacity-100'\n }`}\n >\n <DropdownMenu\n open={menuOpen}\n onOpenChange={(next) => {\n const current = modeRef.current;\n enterMode(next ? 'menu' : current === 'menu' ? 'view' : current);\n }}\n >\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`session-menu-${session.id}`}\n title=\"session actions\"\n className=\"text-po-dim hover:text-po-hi\"\n >\n <KebabIcon className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n data-testid={`session-menu-list-${session.id}`}\n onCloseAutoFocus={(event) => {\n if (modeRef.current !== 'view') event.preventDefault();\n }}\n >\n {actions.renderSessionMenuItems(session.id)}\n <DropdownMenuItem\n data-testid={`session-rename-${session.id}`}\n onSelect={() => {\n setDraft(session.name);\n enterMode('rename');\n }}\n >\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n data-testid={`session-resume-${session.id}`}\n onSelect={() => actions.resumeSession(session.id)}\n >\n Resume\n </DropdownMenuItem>\n <DropdownMenuItem\n data-testid={`session-restart-${session.id}`}\n disabled={session.restarting || session.restartBlocked === true}\n onSelect={() => actions.restartSession(session.id)}\n >\n Restart\n </DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n data-testid={`session-stop-${session.id}`}\n onSelect={() => enterMode('confirm')}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <Dialog open={mode === 'rename'} onOpenChange={(next) => !next && enterMode('view')}>\n <DialogContent width=\"sm\" data-testid={`session-rename-dialog-${session.id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>rename session</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(event) => {\n event.preventDefault();\n commitRename();\n }}\n >\n <Input\n data-testid={`session-name-input-${session.id}`}\n aria-label=\"session name\"\n value={draft}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"md\"\n data-testid={`session-rename-cancel-${session.id}`}\n onClick={() => enterMode('view')}\n >\n cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"md\"\n data-testid={`session-rename-confirm-${session.id}`}\n disabled={draft.trim() === ''}\n >\n rename\n </Button>\n </DialogFooter>\n </form>\n </DialogBody>\n </DialogContent>\n </Dialog>\n <Dialog open={mode === 'confirm'} onOpenChange={(next) => !next && enterMode('view')}>\n <DialogContent width=\"sm\" data-testid={`session-stop-dialog-${session.id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>remove session</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n this stops <span className=\"font-semibold text-po-hi\">{session.name || 'untitled'}</span> and removes it\n from the list. anything it is running ends now. you can restore it for 7 days.\n </DialogDescription>\n <DialogFooter>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid={`session-stop-cancel-${session.id}`}\n autoFocus\n onClick={() => enterMode('view')}\n >\n cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"md\"\n data-testid={`session-stop-confirm-${session.id}`}\n onClick={() => void remove()}\n >\n remove\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n </div>\n {session.pendingSetups.map((setup) => (\n <ElegantPendingSetup key={`setup:${setup.id}`} sessionId={session.id} setup={setup} actions={actions} />\n ))}\n </>\n );\n});\n","import type { WebTemplateRailActions, WebTemplateRailWorkspace } from '@agimon-ai/po-core/web';\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n KebabIcon,\n PlusIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\n\nimport { ElegantSessionCard } from './ElegantSessionCard';\n\n/** A folder heading over its sessions; only a hover tint marks the row. */\nexport function ElegantWorkspaceGroup({\n workspace,\n actions,\n}: {\n workspace: WebTemplateRailWorkspace;\n actions: WebTemplateRailActions;\n}) {\n const key = `rail/workspace/${workspace.id}`;\n const [removeOpen, setRemoveOpen] = useDashboardState(`${key}/open`, false);\n const [removeError, setRemoveError] = useDashboardState(`${key}/error`, '');\n const [removing, setRemoving, removingState] = useDashboardState(`${key}/removing`, false);\n const { id, name, root, available, legacy } = workspace;\n if (workspace.kind === 'session')\n return workspace.sessions.length === 0 ? null : (\n <div data-testid={`session-group-${id}`} className=\"flex flex-col gap-1\">\n {workspace.sessions.map((session) => (\n <ElegantSessionCard key={session.id} session={session} actions={actions} />\n ))}\n </div>\n );\n const unregister = async (): Promise<void> => {\n if (removingState.state) return;\n setRemoving(true);\n setRemoveError('');\n const result = await actions.deleteWorkspace(id);\n setRemoving(false);\n if (result !== undefined) setRemoveError(result.error);\n else setRemoveOpen(false);\n };\n return (\n <section data-testid={`workspace-group-${id}`} data-available={available} className=\"flex flex-col gap-1.5\">\n <div className=\"flex min-w-0 items-start gap-2.5 rounded-md px-2 py-1 transition-colors hover:bg-po-panel/60\">\n <FolderIcon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-po-dim\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <p className=\"truncate text-base font-semibold text-po-hi\">{name}</p>\n <p className=\"truncate font-mono text-sm text-po-dim\" title={root}>\n {root}\n </p>\n </div>\n {legacy ? null : (\n <span className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`workspace-new-session-${id}`}\n title=\"New session\"\n aria-label={`New session in ${name}`}\n disabled={!available}\n onClick={() => actions.createSession(id)}\n className=\"text-po-faint hover:text-po-hi\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`workspace-menu-${id}`}\n title=\"Workspace actions\"\n aria-label={`${name} actions`}\n className=\"text-po-faint hover:text-po-hi\"\n >\n <KebabIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem disabled={!available} onSelect={() => actions.resumeInWorkspace(id)}>\n Resume Session\n </DropdownMenuItem>\n <DropdownMenuItem disabled={!available} onSelect={() => actions.openWorkspaceSettings(id)}>\n Workspace Settings\n </DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n data-testid={`workspace-delete-${id}`}\n onSelect={() => {\n setRemoveError('');\n setRemoveOpen(true);\n }}\n >\n Delete Workspace\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </span>\n )}\n </div>\n {!available ? <p className=\"px-9 text-sm text-po-red\">Workspace unavailable</p> : null}\n {workspace.sessions.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {workspace.sessions.map((session) => (\n <ElegantSessionCard key={session.id} session={session} actions={actions} />\n ))}\n </div>\n ) : available ? (\n <p className=\"px-9 pb-1 text-sm text-po-dim\">No sessions yet. Start or resume one.</p>\n ) : null}\n <Dialog open={removeOpen} onOpenChange={(next) => !next && !removing && setRemoveOpen(false)}>\n <DialogContent width=\"sm\" data-testid={`workspace-delete-dialog-${id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>delete workspace</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n this unregisters <span className=\"font-semibold text-po-hi\">{name}</span> from Po only. files at{' '}\n <code>{root}</code> stay on disk. its sessions must be removed first.\n </DialogDescription>\n {removeError ? (\n <p data-testid={`workspace-delete-error-${id}`} className=\"text-sm text-po-red\">\n {removeError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid={`workspace-delete-cancel-${id}`}\n disabled={removing}\n autoFocus\n onClick={() => setRemoveOpen(false)}\n >\n cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"md\"\n data-testid={`workspace-delete-confirm-${id}`}\n disabled={removing}\n onClick={() => void unregister()}\n >\n {removing ? 'deleting…' : 'delete'}\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n </section>\n );\n}\n","import type { WebTemplateRail } from '@agimon-ai/po-core/web';\nimport { Button, CloseIcon, Dot, GearIcon, HomeIcon, Kbd, PlusIcon, ShieldIcon } from '@agimon-ai/po-web-components';\n\nimport { ElegantWorkspaceGroup } from './ElegantWorkspaceGroup';\n\n/** The drawer's session list: brand, workspaces with their sessions, remote access, and settings. */\nexport function ElegantRail({ rail, onClose }: { rail: WebTemplateRail; onClose: () => void }) {\n const { remote, actions } = rail;\n const live = remote.status === 'on' || remote.status === 'starting';\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex items-center justify-between gap-2 px-5 pt-4 pb-3\">\n <span className=\"flex items-center gap-2.5\" aria-label=\"Po\">\n <img src=\"/favicon.svg\" alt=\"\" aria-hidden=\"true\" className=\"size-9 rounded-lg\" />\n <span aria-hidden=\"true\" className=\"text-2xl font-semibold text-po-hi\">\n Po\n </span>\n </span>\n <span className=\"flex items-center gap-1\">\n <Button\n variant={remote.status === 'failed' ? 'danger-outline' : 'outline'}\n size=\"sm\"\n data-testid=\"remote-access-open\"\n aria-label={`Remote access is ${remote.status}`}\n onClick={actions.openRemoteAccess}\n className={`gap-1.5 rounded-md ${remote.status === 'failed' ? '' : 'bg-po-panel'}`}\n >\n {live ? <Dot tone=\"yellow\" pulse data-testid=\"remote-access-live\" /> : <ShieldIcon className=\"size-3.5\" />}\n Remote access\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"mobile-sessions-close\"\n title=\"Hide sessions\"\n aria-label=\"Hide sessions\"\n onClick={onClose}\n className=\"text-po-dim\"\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n </span>\n </div>\n <div className=\"px-3 pt-2\">\n <Button\n variant=\"ghost\"\n size=\"lg\"\n data-testid=\"home-open\"\n aria-current={rail.homeActive ? 'page' : undefined}\n onClick={actions.openHome}\n className={\n rail.homeActive\n ? 'w-full justify-start gap-2.5 border border-po-edge-green bg-po-tint-green px-2 text-po-hi'\n : 'w-full justify-start gap-2.5 border border-transparent px-2 text-po-text'\n }\n >\n <HomeIcon aria-hidden=\"true\" className={rail.homeActive ? 'size-5 text-po-green' : 'size-5 text-po-dim'} />\n Home\n </Button>\n </div>\n {rail.pluginContent}\n <ElegantSessionList rail={rail} />\n <div className=\"flex-1\" />\n\n <div className=\"sticky bottom-0 mt-auto shrink-0 bg-po-rail\">\n {remote.status === 'off' ? null : (\n <div\n data-testid=\"remote-banner\"\n className={`flex items-center gap-2 border-t border-po-border-soft px-4 py-2 text-sm ${\n remote.status === 'failed' ? 'bg-po-tint-red text-po-red' : 'bg-po-tint-yellow text-po-yellow'\n }`}\n >\n <Dot tone={remote.status === 'failed' ? 'red' : 'yellow'} />\n <span className=\"min-w-0 flex-1 truncate\">\n {remote.status === 'failed'\n ? `Remote access failed: ${remote.error ?? 'the tunnel stopped'}`\n : `Remote access ${remote.status === 'starting' ? 'starting' : 'on'}${\n remote.host === undefined ? '' : ` · ${remote.host}`\n } · ${String(remote.deviceCount)} device${remote.deviceCount === 1 ? '' : 's'}`}\n </span>\n <Button variant=\"ghost\" size=\"xs\" data-testid=\"remote-banner-open\" onClick={actions.openRemoteAccess}>\n Manage\n </Button>\n <Button variant=\"ghost\" size=\"xs\" data-testid=\"remote-banner-off\" onClick={actions.turnRemoteAccessOff}>\n Turn off\n </Button>\n </div>\n )}\n <div className=\"flex flex-col gap-1 border-t border-po-border-soft px-3 py-3\">\n <Button\n variant=\"ghost\"\n size=\"md\"\n data-testid=\"settings-open\"\n onClick={actions.openSettings}\n className=\"justify-start gap-2.5 px-2 text-po-text\"\n >\n <GearIcon className=\"size-4 text-po-dim\" />\n Settings\n </Button>\n <span className=\"px-2 text-sm text-po-dim max-sm:hidden\">\n <Kbd className=\"bg-po-panel\">ctrl+k</Kbd> commands · <Kbd className=\"bg-po-panel\">ctrl+t</Kbd> new session\n </span>\n </div>\n </div>\n </div>\n );\n}\n\n/** The production Sessions section, also rendered by its approved stories. */\nexport function ElegantSessionList({ rail }: { rail: WebTemplateRail }) {\n const { actions } = rail;\n const empty = rail.workspaces.every((workspace) => workspace.kind === 'session' && workspace.sessions.length === 0);\n return (\n <>\n <div className=\"flex items-center justify-between px-5 pt-3 pb-2\">\n <h2 className=\"text-lg font-semibold text-po-hi\">Sessions</h2>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={actions.createGeneralSession ? 'new-session-open' : 'add-workspace-shortcut'}\n title={actions.createGeneralSession ? 'New session' : 'Add workspace'}\n aria-label={actions.createGeneralSession ? 'New session' : 'Add workspace'}\n onClick={actions.createGeneralSession ?? actions.openAddWorkspace}\n className=\"text-po-dim hover:text-po-hi\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n </div>\n <div className=\"flex flex-col gap-4 px-3 pb-3\">\n <Button\n variant=\"ghost\"\n data-testid=\"add-workspace-open\"\n className=\"justify-start text-po-dim\"\n onClick={actions.openAddWorkspace}\n >\n Add workspace\n </Button>\n {rail.workspaces.map((workspace) => (\n <ElegantWorkspaceGroup key={workspace.id} workspace={workspace} actions={actions} />\n ))}\n {empty ? (\n <p className=\"px-2 text-sm text-po-dim\">Start a session to work with Po. No workspace needed.</p>\n ) : null}\n </div>\n </>\n );\n}\n","import { Drawer } from '@agimon-ai/po-web-components';\n\nimport type { LayoutProps } from '../_types/layout';\nimport { ElegantAddWorkspaceDialog } from './ElegantAddWorkspaceDialog';\nimport { ElegantRail } from './ElegantRail';\n\n/** A conversation-first frame, with the same host capabilities available on demand. */\nexport function ElegantLayout({\n view,\n slots,\n rail,\n navigationOpen,\n mobileActivityOpen,\n onNavigationOpenChange,\n onMobileActivityOpenChange,\n}: LayoutProps) {\n const conversation = view === 'conversation' || view === 'welcome';\n return (\n <div className=\"relative flex h-full min-w-0 flex-col overflow-hidden bg-po-bg\">\n <Drawer\n open={navigationOpen}\n onOpenChange={onNavigationOpenChange}\n side=\"left\"\n title=\"Sessions\"\n showHeader={false}\n data-testid=\"session-rail-panel\"\n backdropTestId=\"mobile-drawer-backdrop\"\n className=\"w-[min(340px,calc(100vw-48px))] border-po-border-soft\"\n >\n <ElegantRail rail={rail} onClose={() => onNavigationOpenChange(false)} />\n </Drawer>\n {slots.notices}\n {slots.header({ navigationToggle: 'always', activityToggle: 'always' })}\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <div\n data-testid=\"template-content\"\n className={\n conversation\n ? 'mx-auto flex min-h-0 w-full max-w-[960px] flex-1 flex-col overflow-hidden px-2 sm:px-6'\n : 'flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden'\n }\n >\n {slots.content}\n {slots.composer == null ? null : <div className=\"mb-2 shrink-0 sm:mb-4\">{slots.composer}</div>}\n {slots.controls == null ? null : (\n <details className=\"shrink-0 px-3 pb-3 text-sm text-po-dim\">\n <summary\n data-testid=\"template-controls-toggle\"\n className=\"cursor-pointer rounded-sm px-1 py-1 focus-visible:outline focus-visible:outline-po-blue\"\n >\n Session controls\n </summary>\n {slots.controls}\n </details>\n )}\n </div>\n </main>\n {slots.activity == null ? null : (\n <Drawer\n open={mobileActivityOpen}\n onOpenChange={onMobileActivityOpenChange}\n side=\"right\"\n title=\"Activity\"\n showHeader={false}\n backdropTestId=\"mobile-activity-backdrop\"\n className=\"w-auto max-w-[calc(100vw-48px)]\"\n >\n {slots.activity}\n </Drawer>\n )}\n {rail.addWorkspace ? (\n <ElegantAddWorkspaceDialog suggestedPaths={rail.addWorkspace.suggestedPaths} actions={rail.actions} />\n ) : null}\n </div>\n );\n}\n","import {\n ArrowRightIcon,\n Button,\n Checkbox,\n Input,\n Kbd,\n LockIcon,\n RadioGroup,\n RadioGroupItem,\n SendIcon,\n Skeleton,\n Textarea,\n} from '@agimon-ai/po-web-components';\nimport type { ReactNode } from 'react';\n\n/** The setup steps a person can still be missing; finished steps are never shown again. */\nexport type OnboardingSetupStep = 'model' | 'workspace';\n\nexport interface OnboardingProvider {\n id: string;\n name: string;\n /** One plain fact about how it connects, such as \"Use an OpenAI API key\". */\n note: string;\n}\n\nexport interface OnboardingFolder {\n path: string;\n checked: boolean;\n}\n\nfunction StepFrame({\n step,\n pending,\n children,\n testId,\n}: {\n step?: OnboardingSetupStep;\n pending: readonly OnboardingSetupStep[];\n children: ReactNode;\n testId: string;\n}) {\n return (\n <div data-testid={testId} className=\"flex min-h-0 flex-1 items-center justify-center overflow-y-auto px-4 py-10\">\n <section className=\"flex w-full max-w-xl flex-col gap-6\">\n {children}\n {pending.length > 1 ? (\n <ol aria-label=\"Setup steps\" className=\"flex justify-center gap-2\">\n {pending.map((entry) => (\n <li\n key={entry}\n aria-current={entry === step ? 'step' : undefined}\n className={`size-1.5 rounded-full ${entry === step ? 'bg-po-selected' : 'bg-po-border-soft'}`}\n />\n ))}\n </ol>\n ) : null}\n </section>\n </div>\n );\n}\n\nfunction Heading({ title, description }: { title: string; description: ReactNode }) {\n return (\n <header className=\"flex flex-col gap-1.5 text-center\">\n <h1 className=\"text-xl font-semibold text-po-hi\">{title}</h1>\n <p className=\"text-base text-po-dim\">{description}</p>\n </header>\n );\n}\n\nfunction ErrorLine({ error }: { error?: string }) {\n return error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null;\n}\n\nconst STEP_COUNT_WORDS = ['', 'One quick step', 'Two quick steps'];\n\n/** The first thing a new person sees, only while a setup step is still missing. */\nexport function ElegantOnboardingWelcome({\n pending,\n onBegin,\n}: {\n pending: readonly OnboardingSetupStep[];\n onBegin: () => void;\n}) {\n return (\n <StepFrame pending={[]} testId=\"onboarding-welcome\">\n <div className=\"flex flex-col items-center gap-5 py-4 text-center\">\n <span className=\"flex items-center gap-2.5\" aria-label=\"Po\">\n <img src=\"/favicon.svg\" alt=\"\" aria-hidden=\"true\" className=\"size-10 rounded-lg\" />\n <span aria-hidden=\"true\" className=\"text-2xl font-semibold text-po-hi\">\n Po\n </span>\n </span>\n <div className=\"flex flex-col gap-1.5\">\n <h1 className=\"text-2xl font-semibold text-po-hi\">Hi, I&apos;m Po. I&apos;ll handle the busywork.</h1>\n <p className=\"text-base text-po-dim\">\n {STEP_COUNT_WORDS[pending.length] ?? `${pending.length} quick steps`} and you can hand me your first task.\n </p>\n </div>\n <Button variant=\"primary\" size=\"lg\" data-testid=\"onboarding-begin\" onClick={onBegin} className=\"px-6\">\n Let&apos;s begin\n <ArrowRightIcon className=\"size-3.5\" />\n </Button>\n </div>\n </StepFrame>\n );\n}\n\n/** Choose and sign in to the provider that runs the models. */\nexport function ElegantOnboardingModel({\n pending,\n providers,\n selectedId,\n busy,\n error,\n onSelect,\n onConnect,\n onShowAll,\n}: {\n pending: readonly OnboardingSetupStep[];\n providers: readonly OnboardingProvider[];\n selectedId: string | null;\n busy: boolean;\n error?: string;\n onSelect: (providerId: string) => void;\n onConnect: () => void;\n onShowAll: () => void;\n}) {\n return (\n <StepFrame step=\"model\" pending={pending} testId=\"onboarding-model\">\n <Heading title=\"Choose who does the thinking\" description=\"You can connect more providers later in settings.\" />\n <RadioGroup\n aria-label=\"Model provider\"\n value={selectedId ?? ''}\n onValueChange={onSelect}\n className=\"flex flex-col gap-2\"\n >\n {providers.map((provider) => (\n <label\n key={provider.id}\n htmlFor={`onboarding-provider-${provider.id}`}\n data-testid={`onboarding-provider-${provider.id}`}\n className={`flex cursor-pointer items-center gap-3 rounded-lg border px-4 py-3 transition-colors ${\n provider.id === selectedId\n ? 'border-po-selected bg-po-selected/5'\n : 'border-po-border-soft hover:border-po-green/50'\n }`}\n >\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-base font-semibold text-po-hi\">{provider.name}</span>\n <span className=\"text-sm text-po-dim\">{provider.note}</span>\n </span>\n <RadioGroupItem id={`onboarding-provider-${provider.id}`} value={provider.id} />\n </label>\n ))}\n </RadioGroup>\n <Button variant=\"ghost\" size=\"sm\" onClick={onShowAll} className=\"self-start\">\n Show every provider\n </Button>\n <ErrorLine error={error} />\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex items-center gap-1.5 text-sm text-po-dim\">\n <LockIcon className=\"size-3.5\" />\n Your keys stay on this machine.\n </span>\n <Button\n variant=\"primary\"\n size=\"lg\"\n data-testid=\"onboarding-connect\"\n disabled={selectedId === null || busy}\n onClick={onConnect}\n >\n {busy ? 'Connecting…' : 'Connect'}\n </Button>\n </div>\n </StepFrame>\n );\n}\n\nfunction addLabel(count: number): string {\n if (count === 0) return 'Add workspace';\n return count === 1 ? 'Add 1 workspace' : `Add ${count} workspaces`;\n}\n\n/** Admit folders Po found, a new named workspace, or a browsed folder. */\nexport function ElegantOnboardingWorkspace({\n pending,\n scanning,\n found,\n name,\n busy,\n error,\n browser,\n onToggle,\n onNameChange,\n onBrowse,\n onAdd,\n}: {\n pending: readonly OnboardingSetupStep[];\n scanning: boolean;\n found: readonly OnboardingFolder[];\n name: string;\n busy: boolean;\n error?: string;\n /** The folder browser, rendered in place while open. */\n browser?: ReactNode;\n onToggle: (path: string, checked: boolean) => void;\n onNameChange: (name: string) => void;\n onBrowse: () => void;\n onAdd: () => void;\n}) {\n const count = found.filter((folder) => folder.checked).length + (name.trim() === '' ? 0 : 1);\n const showFound = scanning || found.length > 0;\n return (\n <StepFrame step=\"workspace\" pending={pending} testId=\"onboarding-workspace\">\n <Heading\n title=\"Where should I work?\"\n description={\n found.length > 0\n ? 'I found these folders with Po settings on this machine.'\n : 'Name a new workspace, or pick a folder you already have.'\n }\n />\n {showFound ? (\n <div className=\"flex flex-col rounded-lg border border-po-border-soft\">\n <span className=\"border-b border-po-border-soft px-4 py-2 text-sm text-po-dim\">\n {scanning ? 'Looking for folders with Po settings…' : 'Found on this machine'}\n </span>\n {scanning ? (\n <output aria-busy className=\"flex flex-col gap-3 px-4 py-3\">\n <Skeleton className=\"h-4 w-56\" />\n <Skeleton className=\"h-4 w-44\" />\n </output>\n ) : (\n <ul data-testid=\"onboarding-found\">\n {found.map((folder) => (\n <li key={folder.path} className=\"border-b border-po-border-soft last:border-b-0\">\n <label className=\"flex cursor-pointer items-center gap-3 px-4 py-2.5\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-po-text\">{folder.path}</span>\n <Checkbox\n aria-label={`Add ${folder.path}`}\n checked={folder.checked}\n onCheckedChange={(checked) => onToggle(folder.path, checked === true)}\n />\n </label>\n </li>\n ))}\n </ul>\n )}\n </div>\n ) : null}\n {showFound ? (\n <div className=\"flex items-center gap-3 text-sm text-po-dim\">\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n or\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n </div>\n ) : null}\n <label htmlFor=\"onboarding-workspace-name\" className=\"flex flex-col gap-1.5\">\n <span className=\"text-base font-medium text-po-text\">Name a new workspace</span>\n <span className=\"flex items-center gap-2\">\n <Input\n id=\"onboarding-workspace-name\"\n data-testid=\"onboarding-workspace-name\"\n value={name}\n placeholder=\"Notes\"\n onChange={(event) => onNameChange(event.target.value)}\n className=\"min-w-0 flex-1\"\n />\n <Button variant=\"outline\" size=\"md\" data-testid=\"onboarding-browse\" onClick={onBrowse}>\n Browse folders\n </Button>\n </span>\n <span className=\"font-mono text-sm text-po-dim\">~/.po/workspace/{name.trim() || 'Notes'}</span>\n </label>\n {browser}\n <ErrorLine error={error} />\n <Button\n variant=\"primary\"\n size=\"lg\"\n data-testid=\"onboarding-add-workspaces\"\n disabled={count === 0 || busy}\n onClick={onAdd}\n className=\"self-end\"\n >\n {busy ? 'Adding…' : addLabel(count)}\n </Button>\n </StepFrame>\n );\n}\n\n/** Setup is done and nothing has started yet: the first task goes straight into a new session. */\nexport function ElegantOnboardingReady({\n model,\n root,\n draft,\n busy,\n error,\n suggestions,\n onDraftChange,\n onSend,\n}: {\n model: string;\n root: string;\n draft: string;\n busy: boolean;\n error?: string;\n suggestions: readonly string[];\n onDraftChange: (draft: string) => void;\n onSend: () => void;\n}) {\n return (\n <StepFrame pending={[]} testId=\"welcome\">\n <header className=\"flex flex-col gap-1.5\">\n <h1 className=\"text-2xl font-semibold text-po-hi\">Ready when you are.</h1>\n <p className=\"text-base text-po-dim\">\n Po is connected to {model} and working in <span className=\"font-mono text-po-text\">{root}</span>.\n </p>\n </header>\n <div className=\"flex flex-col gap-2 rounded-lg border border-po-border bg-po-bg p-3 focus-within:border-po-green/60\">\n <Textarea\n data-testid=\"onboarding-first-task\"\n aria-label=\"Your first task\"\n value={draft}\n placeholder=\"Tell Po what you'd like done…\"\n onChange={(event) => onDraftChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.shiftKey && draft.trim() !== '') {\n event.preventDefault();\n onSend();\n }\n }}\n className=\"min-h-20 resize-none border-0 bg-transparent p-1 text-lg focus-visible:ring-0\"\n />\n <Button\n variant=\"primary\"\n size=\"icon-md\"\n aria-label=\"Start this task\"\n data-testid=\"onboarding-send\"\n disabled={draft.trim() === '' || busy}\n onClick={onSend}\n className=\"self-end\"\n >\n <SendIcon className=\"size-4\" />\n </Button>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {suggestions.map((suggestion) => (\n <Button key={suggestion} variant=\"outline\" size=\"card\" onClick={() => onDraftChange(suggestion)}>\n <span className=\"text-base text-po-text\">{suggestion}</span>\n </Button>\n ))}\n </div>\n <ErrorLine error={error} />\n <span className=\"flex flex-wrap items-center justify-end gap-1.5 border-t border-po-border-soft pt-4 text-sm text-po-dim\">\n <Kbd>ctrl+t</Kbd> new session · <Kbd>ctrl+k</Kbd> commands\n </span>\n </StepFrame>\n );\n}\n","import { globalRevisionTopic, hubRevision, subscribeHubRevision } from '@agimon-ai/po-core/web';\nimport {\n admitDashboardWorkspace,\n createPlainSession,\n listDirectory,\n listPoFolders,\n hasSessionProtocol,\n listProviders,\n answerLogin,\n cancelLogin,\n readLogin,\n sessionsStore,\n startLogin,\n submitComposerDraft,\n updateComposerState,\n workspaceAdmissionStore,\n workspacesStore,\n} from '@agimon-ai/po-web-dashboard';\nimport { LoginFlowDialog, WelcomePanel } from '@agimon-ai/po-web-dashboard/views';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useStore } from '@tanstack/react-store';\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react';\n\nimport { ElegantFolderBrowser } from './ElegantFolderBrowser';\nimport {\n ElegantOnboardingModel,\n ElegantOnboardingReady,\n ElegantOnboardingWelcome,\n ElegantOnboardingWorkspace,\n type OnboardingFolder,\n type OnboardingSetupStep,\n} from './ElegantOnboarding';\n\n/** Shown first, in this order; every other provider waits behind \"Show every provider\". */\nconst FEATURED_PROVIDERS = ['anthropic', 'openai-codex', 'github-copilot', 'google', 'openrouter'];\nconst SUGGESTIONS = ['Tour this codebase for me', 'Find and fix failing tests', 'Draft a README update'];\nconst ATTACH_CHECK_MS = 500;\nconst ATTACH_TIMEOUT_MS = 30_000;\nconst TRAILING_SEPARATORS = /\\/+$/u;\n\n// Template code may not import dashboard /types, so derive them from the public API.\ntype ProviderAuthSummary = Extract<\n Awaited<ReturnType<typeof listProviders>>,\n { providers: unknown }\n>['providers'][number];\ntype LoginFlowSnapshot = Extract<Awaited<ReturnType<typeof readLogin>>, { flow: unknown }>['flow'];\n\nfunction folderName(path: string): string {\n const trimmed = path.trim().replace(TRAILING_SEPARATORS, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1);\n}\n\n/**\n * Sends the session's composer draft once the session is attached and its protocol is bound,\n * which only happens after the session page takes focus. Sends once, never retries, so an\n * unacknowledged send cannot repeat. A session that never gets ready keeps the text in its\n * composer for the person to send.\n */\nfunction submitWhenReady(sessionId: string): void {\n const started = Date.now();\n const timer = setInterval(() => {\n const ready = sessionsStore.state.byId[sessionId]?.attach === 'attached' && hasSessionProtocol(sessionId);\n if (!ready && Date.now() - started < ATTACH_TIMEOUT_MS) return;\n clearInterval(timer);\n if (ready) void submitComposerDraft(sessionId, 'submit');\n }, ATTACH_CHECK_MS);\n}\n\nfunction ModelStep({\n pending,\n models,\n onConnected,\n}: {\n pending: readonly OnboardingSetupStep[];\n models: readonly ProviderAuthSummary[];\n onConnected: () => void;\n}) {\n const revisionTopic = globalRevisionTopic('providers');\n const revision = useSyncExternalStore(\n (listener) => subscribeHubRevision(revisionTopic, listener),\n () => hubRevision(revisionTopic),\n );\n const [showAll, setShowAll] = useState(false);\n const signable = models.filter((provider) => provider.methods.length > 0);\n const featured = FEATURED_PROVIDERS.flatMap((id) => signable.filter((provider) => provider.id === id));\n const shown = showAll || featured.length === 0 ? signable : featured;\n const [selectedId, setSelectedId] = useState<string | null>(shown[0]?.id ?? null);\n const [flow, setFlow] = useState<LoginFlowSnapshot | null>(null);\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState('');\n\n // Read the running sign-in on open and on pushed provider changes.\n const flowId = flow?.id;\n const running = flow?.status === 'running';\n useEffect(() => {\n if (flowId === undefined || !running) return;\n let stopped = false;\n const fetchFlow = async (): Promise<void> => {\n const result = await readLogin(flowId);\n if (stopped) return;\n if ('error' in result) {\n setFlow((current) =>\n current?.id === flowId ? { ...current, status: 'failed', error: result.error } : current,\n );\n return;\n }\n setFlow(result.flow);\n if (result.flow.status === 'succeeded') onConnected();\n };\n void fetchFlow();\n return () => {\n stopped = true;\n };\n }, [flowId, running, onConnected, revision]);\n\n const connect = async (): Promise<void> => {\n const provider = signable.find((candidate) => candidate.id === selectedId);\n const method = provider?.methods.find((candidate) => candidate.type === 'oauth') ?? provider?.methods[0];\n if (provider === undefined || method === undefined || starting || running) return;\n setError('');\n setStarting(true);\n const result = await startLogin(provider.id, method.type);\n setStarting(false);\n if ('flow' in result) setFlow(result.flow);\n else setError(result.error);\n };\n\n return (\n <>\n <ElegantOnboardingModel\n pending={pending}\n providers={shown.map((provider) => ({\n id: provider.id,\n name: provider.name,\n note: provider.methods.map((method) => method.label).join(' or '),\n }))}\n selectedId={selectedId}\n busy={starting || running}\n {...(error === '' ? {} : { error })}\n onSelect={setSelectedId}\n onConnect={() => void connect()}\n onShowAll={() => setShowAll(true)}\n />\n {flow ? (\n <LoginFlowDialog\n flow={flow}\n onAnswer={(promptId, value) =>\n void answerLogin(flow.id, promptId, value).then(async (result) => {\n if ('flow' in result) {\n const latest = await readLogin(flow.id);\n const next = 'flow' in latest ? latest.flow : result.flow;\n setFlow(next);\n if (next.status === 'succeeded') onConnected();\n } else setError(result.error);\n })\n }\n onCancel={() => void cancelLogin(flow.id).then((result) => setFlow('flow' in result ? result.flow : null))}\n onClose={() => {\n if (flow.status === 'failed')\n setError(flow.error ?? 'The sign-in did not finish. Try again whenever you like.');\n setFlow(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceStep({ pending }: { pending: readonly OnboardingSetupStep[] }) {\n const [scanning, setScanning] = useState(true);\n const [found, setFound] = useState<readonly OnboardingFolder[]>([]);\n const [name, setName] = useState('');\n const [browsing, setBrowsing] = useState(false);\n const [error, setError] = useState('');\n const busy = useStore(workspaceAdmissionStore, (state) => state.pending);\n\n useEffect(() => {\n let stale = false;\n void listPoFolders().then((paths) => {\n if (stale) return;\n // Only the first is ticked, so a busy home folder never admits a pile of workspaces by surprise.\n setFound(paths.map((path, index) => ({ path, checked: index === 0 })));\n setScanning(false);\n });\n return () => {\n stale = true;\n };\n }, []);\n\n const pick = (path: string): void => {\n setFound((current) =>\n current.some((folder) => folder.path === path)\n ? current.map((folder) => (folder.path === path ? { ...folder, checked: true } : folder))\n : [...current, { path, checked: true }],\n );\n setBrowsing(false);\n };\n\n // The first admission ends this step, so the rest finish in the background.\n const add = async (): Promise<void> => {\n setError('');\n const admissions = [\n ...found\n .filter((folder) => folder.checked)\n .map((folder) => ({ name: folderName(folder.path), path: folder.path })),\n ...(name.trim() === '' ? [] : [{ name: name.trim() }]),\n ];\n for (const admission of admissions) {\n const result = await admitDashboardWorkspace(admission);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n }\n };\n\n return (\n <ElegantOnboardingWorkspace\n pending={pending}\n scanning={scanning}\n found={found}\n name={name}\n busy={busy}\n {...(error === '' ? {} : { error })}\n {...(browsing ? { browser: <ElegantFolderBrowser listDirectory={listDirectory} onSelect={pick} /> } : {})}\n onToggle={(path, checked) =>\n setFound((current) => current.map((folder) => (folder.path === path ? { ...folder, checked } : folder)))\n }\n onNameChange={setName}\n onBrowse={() => setBrowsing((open) => !open)}\n onAdd={() => void add()}\n />\n );\n}\n\nfunction ReadyStep({ model }: { model: string }) {\n const navigate = useNavigate();\n const workspace = useStore(workspacesStore, (state) => state.byId[state.selectedId ?? state.order[0] ?? '']);\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n if (workspace === undefined) return null;\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (text === '' || busy) return;\n setError('');\n setBusy(true);\n const outcome = await createPlainSession(workspace.id);\n if (!('sessionId' in outcome)) {\n setBusy(false);\n setError(outcome.error);\n return;\n }\n updateComposerState(outcome.sessionId, (state) => ({ ...state, draft: text, caret: text.length }));\n submitWhenReady(outcome.sessionId);\n await navigate({ to: '/session/$sessionId', params: { sessionId: outcome.sessionId } });\n };\n\n return (\n <ElegantOnboardingReady\n model={model}\n root={workspace.root}\n draft={draft}\n busy={busy}\n {...(error === '' ? {} : { error })}\n suggestions={SUGGESTIONS}\n onDraftChange={setDraft}\n onSend={() => void send()}\n />\n );\n}\n\n/**\n * First run in place of the empty welcome: only the setup steps still missing, then the\n * first task. Finished steps are read from the hub, so nothing new is persisted.\n */\nexport function ElegantOnboardingFlow() {\n const updateRequired = useStore(sessionsStore, (state) => state.updateRequired);\n const hydrated = useStore(workspacesStore, (state) => state.hydrated);\n const hasWorkspace = useStore(workspacesStore, (state) => state.order.length > 0);\n const [providers, setProviders] = useState<readonly ProviderAuthSummary[] | 'unavailable' | null>(null);\n const [steps, setSteps] = useState<readonly OnboardingSetupStep[] | null>(null);\n\n const reload = useCallback((): void => {\n void listProviders().then((result) => setProviders('providers' in result ? result.providers : 'unavailable'));\n }, []);\n useEffect(reload, [reload]);\n\n // An outdated app cannot start sessions at all; the plain welcome says why.\n if (updateRequired) return <WelcomePanel />;\n if (providers === null || !hydrated) return null;\n\n const models = providers === 'unavailable' ? [] : providers.filter((provider) => provider.kind !== 'po-feature');\n const connected = models.find((provider) => provider.authenticated !== undefined);\n // An unreadable provider list must not trap anyone in setup, so it counts as done.\n const pending: OnboardingSetupStep[] = [\n ...(providers === 'unavailable' || connected !== undefined ? [] : ['model' as const]),\n ...(hasWorkspace ? [] : ['workspace' as const]),\n ];\n\n if (steps === null && pending.length > 0) {\n return <ElegantOnboardingWelcome pending={pending} onBegin={() => setSteps(pending)} />;\n }\n if (pending[0] === 'model') return <ModelStep pending={steps ?? pending} models={models} onConnected={reload} />;\n if (pending[0] === 'workspace') return <WorkspaceStep pending={steps ?? pending} />;\n return <ReadyStep model={connected?.name ?? 'your model'} />;\n}\n","import { useDashboardRoute } from '@agimon-ai/po-web-dashboard';\nimport { pluginActivityGroups, webTabs } from '@agimon-ai/po-web-dashboard';\nimport { useSessionMcp } from '@agimon-ai/po-web-dashboard';\nimport { sessionsStore, useActiveSessionMeta, useNoSessions } from '@agimon-ai/po-web-dashboard';\nimport { useActiveSession } from '@agimon-ai/po-web-dashboard';\nimport { findTransientTab, transientTabsStore } from '@agimon-ai/po-web-dashboard';\nimport { setDockOpen, uiStore } from '@agimon-ai/po-web-dashboard';\nimport { usePluginSlotProps } from '@agimon-ai/po-web-dashboard';\nimport { useWebPluginRegistry } from '@agimon-ai/po-web-dashboard';\nimport { workspacesStore } from '@agimon-ai/po-web-dashboard';\nimport { SessionMcp } from '@agimon-ai/po-web-dashboard/views';\nimport { ActivityDock } from '@agimon-ai/po-web-dashboard/views';\nimport { SelectionBar } from '@agimon-ai/po-web-dashboard/views';\nimport { Composer } from '@agimon-ai/po-web-dashboard/views';\nimport { Timeline } from '@agimon-ai/po-web-dashboard/views';\nimport { HomePage, PluginPage } from '@agimon-ai/po-web-dashboard/views';\nimport { SessionRailDialogs } from '@agimon-ai/po-web-dashboard/views';\nimport { useSessionRail } from '@agimon-ai/po-web-dashboard/views';\nimport { TopBar } from '@agimon-ai/po-web-dashboard/views';\nimport { useStore } from '@tanstack/react-store';\nimport { useState } from 'react';\n\nimport type { LayoutProps } from '../_types/layout';\nimport { ElegantLayout } from './ElegantLayout';\nimport { ElegantOnboardingFlow } from './ElegantOnboardingFlow';\n\n/**\n * Only this frame follows the rail, which changes with every session's summary. The conversation\n * slots keep their element identity, so another session's push skips the focused session's views.\n */\nexport function ElegantRailedLayout({ onDismiss, ...props }: Omit<LayoutProps, 'rail'> & { onDismiss: () => void }) {\n return <ElegantLayout {...props} rail={useSessionRail({ onDismiss })} />;\n}\n\nexport function ElegantConversation() {\n useWebPluginRegistry();\n const dockOpen = useStore(uiStore, (state) => state.dockOpen);\n const [railOpen, setRailOpen] = useState(false);\n const [mobileActivityOpen, setMobileActivityOpen] = useState(false);\n const { kind, sessionId, tabId, pageId } = useDashboardRoute();\n const slotProps = usePluginSlotProps(sessionId ?? null);\n const sessionWorkspaceId = useStore(sessionsStore, (state) =>\n sessionId === undefined ? undefined : state.byId[sessionId]?.summary.workspaceId,\n );\n const selectedWorkspaceId = useStore(workspacesStore, (state) => state.selectedId);\n const workspaceId = sessionId === undefined ? (selectedWorkspaceId ?? undefined) : sessionWorkspaceId;\n const focusedId = useStore(sessionsStore, (state) => state.activeId);\n const mcp = useSessionMcp(workspaceId, focusedId ?? undefined);\n const mcpView = tabId === 'mcp';\n const mcpEnabled = mcp.snapshot?.enabled === true || mcpView;\n const transferLabel = useStore(sessionsStore, (state) => {\n if (state.transferringToId === null) return null;\n return state.byId[state.transferringToId]?.summary.name ?? 'destination session';\n });\n const noSessions = useNoSessions();\n const activeMeta = useActiveSessionMeta();\n const dormantMeta = activeMeta?.summary.dormant === true ? activeMeta : null;\n const dialogId = useActiveSession((state) => state.dialog?.id ?? null);\n // A declared tab first, then one a plugin opened at runtime for this session.\n // Session plugin compositions replace the builtin plugin module after verification.\n // Refresh activity-owned tabs from the active registry so a tab opened during that\n // handoff does not keep rendering the retired module's disconnected stores.\n const storedTransientTab = useStore(transientTabsStore, (state) => findTransientTab(state, sessionId, tabId));\n const transientTab =\n storedTransientTab === undefined\n ? undefined\n : (pluginActivityGroups(sessionId ?? null)\n .map((group) => group.transientTab?.())\n .find((candidate) => candidate?.id === storedTransientTab.id) ?? storedTransientTab);\n const tab =\n (tabId === undefined ? undefined : webTabs(sessionId ?? null).find((entry) => entry.id === tabId)) ?? transientTab;\n // Only a runtime tab carries composer context; a declared tab with the same id wins and carries none.\n const composerContext = tab === transientTab ? transientTab?.composerContext : undefined;\n\n // Both side panels are temporary drawers on mobile. Route changes can also\n // come from plugin navigation, so they dismiss the drawers even when no\n // drawer item produced the navigation event directly. A modal must not\n // compete with the mobile activity drawer for the viewport either, so an\n // opening dialog closes it. Both are adjustments made while rendering the\n // change rather than in an effect, so no extra pass paints the open drawer.\n const routeKey = `${kind}\\u0000${sessionId ?? ''}\\u0000${tabId ?? ''}\\u0000${pageId ?? ''}`;\n const [lastRouteKey, setLastRouteKey] = useState(routeKey);\n if (lastRouteKey !== routeKey) {\n setLastRouteKey(routeKey);\n setRailOpen(false);\n setMobileActivityOpen(false);\n }\n\n const [lastDialogId, setLastDialogId] = useState(dialogId);\n if (lastDialogId !== dialogId) {\n setLastDialogId(dialogId);\n if (dialogId !== null) {\n setMobileActivityOpen(false);\n setRailOpen(false);\n }\n }\n\n const closeActivity = (): void => {\n if (mobileActivityOpen) setMobileActivityOpen(false);\n else setDockOpen(false);\n };\n // A plugin page or Home keeps the rail and fills the main area; it draws its own header.\n const page =\n pageId !== undefined ? (\n <PluginPage pageId={pageId} sessionId={null} navigationToggle=\"always\" onShowSessions={() => setRailOpen(true)} />\n ) : kind === 'home' && !noSessions ? (\n <HomePage navigationToggle=\"always\" onShowSessions={() => setRailOpen(true)} />\n ) : null;\n return (\n <div data-testid=\"cockpit\" className=\"h-full min-w-0 overflow-hidden\">\n <ElegantRailedLayout\n view={page || mcpView || tab ? 'panel' : noSessions ? 'welcome' : 'conversation'}\n navigationOpen={railOpen}\n desktopActivityOpen={dockOpen}\n mobileActivityOpen={mobileActivityOpen}\n onNavigationOpenChange={setRailOpen}\n onDesktopActivityOpenChange={setDockOpen}\n onMobileActivityOpenChange={setMobileActivityOpen}\n onDismiss={() => setRailOpen(false)}\n slots={{\n header: (options) =>\n page ? null : (\n <TopBar\n {...options}\n view={mcpView ? 'mcp' : (tab?.id ?? 'conversation')}\n mcpEnabled={mcpEnabled}\n onShowSessions={() => {\n setMobileActivityOpen(false);\n setRailOpen(true);\n }}\n onShowActivity={() => {\n setRailOpen(false);\n setMobileActivityOpen(true);\n }}\n />\n ),\n notices:\n transferLabel === null ? null : (\n <output\n data-testid=\"voice-transfer-transition\"\n className=\"border-b border-po-cyan/30 bg-po-cyan/10 px-4 py-2 text-center text-base font-medium text-po-cyan\"\n >\n Transferring voice to {transferLabel}...\n </output>\n ),\n content: page ? (\n page\n ) : mcpView ? (\n <SessionMcp key={sessionId} state={mcp} />\n ) : tab ? (\n <tab.panel {...slotProps} />\n ) : noSessions ? (\n <ElegantOnboardingFlow />\n ) : (\n <Timeline />\n ),\n // MCP history is a read-only surface, not an alternative prompt composer.\n composer:\n page || mcpView ? null : tab ? (\n tab.retainComposer === true ? (\n <Composer composerContext={composerContext} />\n ) : null\n ) : noSessions ? null : (\n <Composer />\n ),\n controls:\n !page && !mcpView && (!tab || tab.targetSessionId !== undefined) && !noSessions && dormantMeta === null ? (\n <SelectionBar />\n ) : null,\n activity: page ? null : (\n <ActivityDock\n mcp={mcp}\n scope={\n tab === transientTab && transientTab?.targetSessionId !== undefined\n ? transientTab.activityScope\n : undefined\n }\n onClose={closeActivity}\n onOpenContent={() => setMobileActivityOpen(false)}\n />\n ),\n }}\n />\n <SessionRailDialogs />\n </div>\n );\n}\n","import { ArrowLeftIcon, Button, NavTab } from '@agimon-ai/po-web-components';\nimport { useDashboardRoute, useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { refreshWebPluginCompositions } from '@agimon-ai/po-web-dashboard';\nimport {\n DEFAULT_REPOSITORY_SETTINGS_SECTION,\n DEFAULT_SETTINGS_SECTION,\n settingsSection,\n} from '@agimon-ai/po-web-dashboard';\nimport { sessionsStore } from '@agimon-ai/po-web-dashboard';\nimport { useWebPluginRegistry } from '@agimon-ai/po-web-dashboard';\nimport { AppearanceSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ContributedSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ImageSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { NotificationSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { PluginSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ProviderSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { RemoteControlSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { RepositoryWorkspace } from '@agimon-ai/po-web-dashboard/views';\nimport { SettingsMenu } from '@agimon-ai/po-web-dashboard/views';\nimport { SettingsPanelHost } from '@agimon-ai/po-web-dashboard/views';\nimport { Link, useNavigate } from '@tanstack/react-router';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\n/** Settings have their own page frame, independent of session navigation. */\nexport function ElegantSettings() {\n useWebPluginRegistry();\n const { section, workspaceId } = useDashboardRoute();\n const navigate = useNavigate();\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const [loadError, setLoadError] = useState<string>();\n const [repositoryReady, setRepositoryReady] = useState(false);\n const [templateTarget, setTemplateTarget] = useDashboardState('settings/template-target', 'global');\n const current = settingsSection(section);\n const workspace = current?.workspace ?? (section?.startsWith('repository-') ? 'repository' : 'general');\n\n useEffect(() => {\n if (current) return;\n if (workspace === 'repository' && !repositoryReady) return;\n let cancelled = false;\n void refreshWebPluginCompositions()\n .then(() => {\n if (cancelled || settingsSection(section)) return;\n void navigate({\n to: '/settings/$section',\n params: { section: DEFAULT_SETTINGS_SECTION },\n search: { workspace: workspaceId },\n replace: true,\n });\n })\n .catch((error: unknown) => {\n if (!cancelled) setLoadError(error instanceof Error ? error.message : String(error));\n });\n return () => {\n cancelled = true;\n };\n }, [current, section, navigate, workspace, workspaceId, repositoryReady]);\n\n return (\n <div data-testid=\"settings\" className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-po-bg\">\n <header className=\"grid shrink-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-2 gap-y-2 border-b border-po-border px-3 py-2 sm:h-14 sm:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] sm:px-6 sm:py-0\">\n <h1 className=\"order-1 min-w-0 truncate text-xl font-semibold text-po-hi sm:order-none\">Settings</h1>\n <nav\n className=\"order-3 col-span-2 flex w-full items-center gap-1 rounded-lg bg-po-panel p-1 sm:order-none sm:col-span-1 sm:w-auto\"\n aria-label=\"settings workspace\"\n >\n <NavTab\n asChild\n active={workspace === 'general'}\n className=\"min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none\"\n aria-current={workspace === 'general' ? 'true' : undefined}\n >\n <Link\n to=\"/settings/$section\"\n params={{ section: DEFAULT_SETTINGS_SECTION }}\n search={{ workspace: workspaceId }}\n data-testid=\"settings-workspace-general\"\n >\n General\n </Link>\n </NavTab>\n <NavTab\n asChild\n active={workspace === 'repository'}\n className=\"min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none\"\n aria-current={workspace === 'repository' ? 'true' : undefined}\n >\n <Link\n to=\"/settings/$section\"\n params={{ section: DEFAULT_REPOSITORY_SETTINGS_SECTION }}\n search={{ workspace: workspaceId }}\n data-testid=\"settings-workspace-repository\"\n >\n Workspaces\n </Link>\n </NavTab>\n </nav>\n <Button asChild variant=\"outline\" size=\"sm\" className=\"order-2 gap-1.5 sm:order-none sm:justify-self-end\">\n {activeId !== null ? (\n <Link to=\"/session/$sessionId\" params={{ sessionId: activeId }} data-testid=\"settings-close\">\n <ArrowLeftIcon aria-hidden className=\"size-3.5\" />\n <span className=\"sm:hidden\">Back</span>\n <span className=\"hidden sm:inline\">Back to session</span>\n </Link>\n ) : (\n <Link to=\"/\" data-testid=\"settings-close\">\n <ArrowLeftIcon aria-hidden className=\"size-3.5\" />\n Back\n </Link>\n )}\n </Button>\n </header>\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {workspace === 'repository' ? (\n <RepositoryWorkspace\n key={workspaceId ?? 'remembered-workspace'}\n current={current ?? { id: section ?? '', label: '', detail: '', workspace: 'repository' }}\n initialRepositoryId={workspaceId}\n onRepositoryChange={(nextWorkspaceId) => {\n void navigate({\n to: '/settings/$section',\n params: { section: current?.id ?? section ?? DEFAULT_REPOSITORY_SETTINGS_SECTION },\n search: { workspace: nextWorkspaceId },\n replace: true,\n });\n }}\n onReady={setRepositoryReady}\n />\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col lg:flex-row\">\n <SettingsMenu active={current?.id} workspace=\"general\" repositoryId={workspaceId} />\n <section\n data-testid=\"settings-content\"\n className=\"min-w-0 flex-1 overflow-y-auto px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10\"\n >\n {/* One column width for every page, so moving between sections does\n not re-flow the reading line. */}\n <div className=\"mx-auto flex w-full max-w-5xl flex-col gap-8\">\n {!current && loadError ? <p role=\"alert\">{loadError}</p> : null}\n {current?.id === 'providers' ? <ProviderSettings /> : null}\n {current?.id === 'appearance' ? (\n <AppearanceSettings templateTarget={templateTarget} onTemplateTargetChange={setTemplateTarget} />\n ) : null}\n {current?.id === 'notifications' ? <NotificationSettings /> : null}\n {current?.id === 'images' ? <ImageSettings /> : null}\n {current?.id === 'remote' ? <RemoteControlSettings /> : null}\n {current?.id === 'plugins' ? <PluginSettings /> : null}\n {current?.contribution === undefined ? null : (\n <ContributedSettings section={current.contribution} scope=\"global\" />\n )}\n {current?.panel === undefined ? null : <SettingsPanelHost panel={current.panel} />}\n </div>\n </section>\n </div>\n )}\n </main>\n </div>\n );\n}\n","import {\n useDashboardRoute,\n sessionsStore,\n HOST_SLOTS,\n DashboardRendererProvider,\n type DashboardRenderers,\n watchDashboardTranscript,\n} from '@agimon-ai/po-web-dashboard';\nimport {\n DialogOverlay,\n RefusedCard,\n CommandPalette,\n PluginSurface,\n RemoteAccessDialog,\n PairingApprovalDialog,\n ThreadView,\n SessionActivity,\n SessionTranscriptView,\n} from '@agimon-ai/po-web-dashboard/views';\nimport { useStore } from '@tanstack/react-store';\n\nimport { ElegantConversation } from './ElegantConversation';\nimport { ElegantSettings } from './ElegantSettings';\n\nconst renderers: DashboardRenderers = {\n thread: (id, threadId, options) => <ThreadView sessionId={id} threadId={threadId} options={options} />,\n activity: (id, open) => <SessionActivity sessionId={id} onOpenConversation={open} />,\n transcript: (id, options) => (\n <SessionTranscriptView sessionId={id} options={options} watch={watchDashboardTranscript} />\n ),\n};\n\nexport function ElegantDashboard() {\n const route = useDashboardRoute();\n const sessionId = useStore(sessionsStore, (state) => state.activeId);\n return (\n <DashboardRendererProvider value={renderers}>\n {route.kind === 'settings' ? <ElegantSettings /> : <ElegantConversation />}\n <DialogOverlay />\n <RefusedCard />\n <CommandPalette />\n <PluginSurface slot={HOST_SLOTS.overlay} sessionId={sessionId} />\n <RemoteAccessDialog />\n <PairingApprovalDialog />\n </DashboardRendererProvider>\n );\n}\n","import type { WebTemplateFile } from '@agimon-ai/po-core/web';\n\nimport { ElegantDashboard } from '../_components/ElegantDashboard';\n\nexport const elegantTemplate = {\n label: 'Elegant',\n description: 'A focused conversation with collapsible navigation, session controls, and activity.',\n contractVersion: 2,\n app: ElegantDashboard,\n} satisfies WebTemplateFile;\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from './_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from '../../../(frontend)/template/_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from '../../../../(frontend)/template/_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport templatePoTemplateElegant from '../src/extensions/(frontend)/template/po-template-elegant.web';\nimport templatePoTemplateElegant2 from '../src/extensions/workspaces/(frontend)/template/po-template-elegant.web';\nimport templatePoTemplateElegant3 from '../src/extensions/workspaces/sessions/(frontend)/template/po-template-elegant.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'template-elegant',\n global: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant)]; },\n },\n workspace: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant2)]; },\n },\n session: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant3)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.mjs","names":["folderName","TRAILING_SEPARATORS","folderName","templatePoTemplateElegant","templatePoTemplateElegant2","templatePoTemplateElegant3"],"sources":["../../src/extensions/(frontend)/template/_components/ElegantFolderBrowser.tsx","../../src/extensions/(frontend)/template/_components/ElegantAddWorkspaceDialog.tsx","../../src/extensions/(frontend)/template/_components/ElegantPendingSetup.tsx","../../src/extensions/(frontend)/template/_components/ElegantSessionCard.tsx","../../src/extensions/(frontend)/template/_components/ElegantWorkspaceGroup.tsx","../../src/extensions/(frontend)/template/_components/ElegantRail.tsx","../../src/extensions/(frontend)/template/_components/ElegantLayout.tsx","../../src/extensions/(frontend)/template/_components/ElegantOnboarding.tsx","../../src/extensions/(frontend)/template/_components/ElegantOnboardingFlow.tsx","../../src/extensions/(frontend)/template/_components/ElegantConversation.tsx","../../src/extensions/(frontend)/template/_components/ElegantSettings.tsx","../../src/extensions/(frontend)/template/_components/ElegantDashboard.tsx","../../src/extensions/(frontend)/template/_lib/definition.ts","../../src/extensions/(frontend)/template/po-template-elegant.web.ts","../../src/extensions/workspaces/(frontend)/template/po-template-elegant.web.ts","../../src/extensions/workspaces/sessions/(frontend)/template/po-template-elegant.web.ts","../../generated/web.ts"],"sourcesContent":["import type { WebTemplateRailActions, WebTemplateRailDirectoryListing } from '@agimon-ai/po-core/web';\nimport { Button, ChevronUpIcon, OptionRow } from '@agimon-ai/po-web-components';\nimport { useEffect, useState } from 'react';\n\nfunction folderName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1) || path;\n}\n\n/** Walks the server's folders inline: up, into a child, or pick the current folder. */\nexport function ElegantFolderBrowser({\n start,\n listDirectory,\n onSelect,\n}: {\n /** Folder to open first; home when absent. */\n start?: string;\n listDirectory: WebTemplateRailActions['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\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\n return (\n <div\n data-testid=\"folder-browser\"\n className=\"flex flex-col gap-1 rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5\"\n >\n <div className=\"flex items-center gap-1 px-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"folder-browser-up\"\n title=\"parent folder\"\n aria-label=\"parent folder\"\n disabled={listing?.parent === undefined}\n onClick={() => listing?.parent !== undefined && setTarget(listing.parent)}\n >\n <ChevronUpIcon className=\"h-3 w-3\" />\n </Button>\n <span className=\"min-w-0 flex-1 truncate text-sm text-po-dim\" title={listing?.path}>\n {listing?.path ?? 'loading…'}\n </span>\n <Button\n variant=\"outline\"\n size=\"xs\"\n data-testid=\"folder-browser-select\"\n disabled={listing === null}\n onClick={() => listing !== null && onSelect(listing.path)}\n >\n use this folder\n </Button>\n </div>\n {error ? <p className=\"px-2 py-1 text-sm text-po-red\">{error}</p> : null}\n <div role=\"listbox\" aria-label=\"folders\" className=\"max-h-40 overflow-y-auto\">\n {listing !== null && listing.directories.length === 0 ? (\n <p className=\"px-2 py-1 text-sm text-po-dim\">no folders here</p>\n ) : null}\n {listing?.directories.map((directory) => (\n <OptionRow\n key={directory}\n density=\"compact\"\n data-testid=\"folder-browser-entry\"\n onClick={() => setTarget(directory)}\n className=\"w-full px-2.5 py-1 \"\n >\n {folderName(directory)}\n </OptionRow>\n ))}\n </div>\n </div>\n );\n}\n","import type { WebTemplateRailActions } from '@agimon-ai/po-core/web';\nimport {\n Button,\n Checkbox,\n Textarea,\n Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n OptionRow,\n} from '@agimon-ai/po-web-components';\nimport {\n workspaceAdmissionStore,\n updateWorkspaceAdmission,\n discoverWorkspaceAdmission,\n type WorkspaceAdmissionDraft,\n} from '@agimon-ai/po-web-dashboard';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\n\nimport { ElegantFolderBrowser } from './ElegantFolderBrowser';\n\nconst SUGGESTION_DEBOUNCE_MS = 120;\nconst NO_HIGHLIGHT = -1;\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);\n}\n\n/** Connects the durable draft and fenced discovery to the production presentation. */\nexport function ElegantAddWorkspaceDialog({\n suggestedPaths,\n actions,\n}: {\n suggestedPaths: readonly string[];\n actions: WebTemplateRailActions;\n}) {\n const draft = useStore(workspaceAdmissionStore, (state) => state);\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const [suggestions, setSuggestions] = useState<{ path: string; directories: readonly string[] }>({\n path: '',\n directories: [],\n });\n useEffect(() => {\n const typed = path.trim();\n if (typed === '') return;\n let stale = false;\n const timer = setTimeout(async () => {\n const found = await actions.searchDirectories(typed);\n if (stale) return;\n setSuggestions({ path, directories: found.filter((directory) => directory !== typed) });\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [path, actions]);\n\n useEffect(() => discoverWorkspaceAdmission(path, actions.discoverWorkspaces), [path, actions.discoverWorkspaces]);\n return (\n <ElegantAddWorkspaceDialogView\n suggestions={path.trim() !== '' && suggestions.path === path ? suggestions.directories : []}\n suggestedPaths={suggestedPaths}\n actions={actions}\n draft={draft}\n updateDraft={updateWorkspaceAdmission}\n />\n );\n}\n\n/** Shared by runtime and deterministic approved-state stories. */\nexport function ElegantAddWorkspaceDialogView({\n suggestedPaths,\n actions,\n draft,\n updateDraft,\n style,\n suggestions = [],\n}: {\n suggestedPaths: readonly string[];\n actions: WebTemplateRailActions;\n draft: WorkspaceAdmissionDraft;\n updateDraft: typeof updateWorkspaceAdmission;\n style?: CSSProperties;\n suggestions?: readonly string[];\n}) {\n const { name, nameEdited, instructions, pending: busy, error, discovery } = draft;\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const setName = (name: string): void => updateDraft({ name });\n const setNameEdited = (nameEdited: boolean): void => updateDraft({ nameEdited });\n const setPath = (path: string): void => updateDraft({ path });\n const [browsing, setBrowsing] = useState(false);\n const [highlight, setHighlight] = useState(NO_HIGHLIGHT);\n const pathInput = useRef<HTMLInputElement>(null);\n const shownName = nameEdited ? name : folderName(path);\n\n const changePath = (next: string): void => {\n if (busy) return;\n setPath(next);\n setHighlight(NO_HIGHLIGHT);\n };\n const pick = (directory: string): void => {\n changePath(`${directory}/`);\n pathInput.current?.focus();\n };\n const trimmedPath = path.trim().replace(TRAILING_SEPARATORS, '') || (path.trim() === '' ? '' : '/');\n const discovering =\n draft.discovering || (!!path.trim() && actions.discoverWorkspaces !== undefined && draft.discoveryPath !== path);\n const discoveryError = discovery && 'error' in discovery ? discovery.error : '';\n const declarations =\n discovery && 'declarations' in discovery && discovery.declarations.length > 0 ? discovery.declarations : undefined;\n const addedId = (name: string): string | undefined =>\n declarations?.find((entry) => entry.name === name)?.workspaceId ??\n draft.results.find((entry) => entry.name === name)?.workspaceId;\n const selected =\n declarations\n ?.filter((entry) => draft.checked.includes(entry.name) && !addedId(entry.name))\n .map((entry) => entry.name) ?? [];\n const manual = !declarations && !discovering && !discoveryError;\n const canSubmit =\n !busy &&\n !discovering &&\n !discoveryError &&\n (declarations\n ? selected.length > 0 && actions.addDeclaredWorkspaces !== undefined\n : trimmedPath !== '' || shownName.trim() !== '');\n const submit = async (): Promise<void> => {\n if (!canSubmit) return;\n if (declarations) {\n await actions.addDeclaredWorkspaces?.({\n path: discovery && 'root' in discovery ? discovery.root : trimmedPath,\n names: selected,\n });\n return;\n }\n await actions.addWorkspace({\n ...(instructions === '' ? {} : { instructions }),\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n });\n };\n\n return (\n <Dialog open onOpenChange={(next) => !next && !busy && actions.closeAddWorkspace()}>\n <DialogContent style={style} width=\"md\" data-testid=\"add-workspace-dialog\" aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>Add workspace</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <label htmlFor=\"add-workspace-root\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">Folder</span>\n <span className=\"flex items-center gap-1.5\">\n <Input\n id=\"add-workspace-root\"\n ref={pathInput}\n data-testid=\"add-workspace-root\"\n value={path}\n autoFocus\n disabled={busy}\n onChange={(event) => changePath(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' && suggestions.length > 0) {\n event.preventDefault();\n setHighlight((current) => (current + 1) % suggestions.length);\n } else if (event.key === 'ArrowUp' && suggestions.length > 0) {\n event.preventDefault();\n setHighlight((current) => (current <= 0 ? suggestions.length - 1 : current - 1));\n } else if (event.key === 'Enter') {\n const chosen = highlight === NO_HIGHLIGHT ? undefined : suggestions[highlight];\n if (chosen === undefined) void submit();\n else pick(chosen);\n }\n }}\n placeholder=\"~/workspace/my-project\"\n className=\"min-w-0 flex-1 font-mono\"\n />\n <Button\n variant={browsing ? 'subtle' : 'outline'}\n size=\"md\"\n data-testid=\"add-workspace-browse\"\n aria-pressed={browsing}\n disabled={busy}\n onClick={() => setBrowsing((open) => !open)}\n >\n Browse\n </Button>\n </span>\n </label>\n {browsing ? (\n <ElegantFolderBrowser\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 <div\n role=\"listbox\"\n aria-label=\"matching directories\"\n data-testid=\"add-workspace-suggestions\"\n className=\"max-h-40 overflow-y-auto rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5\"\n >\n {suggestions.map((directory, index) => (\n <OptionRow\n key={directory}\n density=\"compact\"\n active={index === highlight}\n data-testid=\"add-workspace-suggestion\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => setHighlight(index)}\n onClick={() => pick(directory)}\n className=\"w-full px-2.5 py-1 \"\n >\n {directory}\n </OptionRow>\n ))}\n </div>\n ) : null}\n {suggestedPaths.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {suggestedPaths.slice(0, 4).map((suggested) => (\n <Button\n key={suggested}\n variant=\"outline\"\n size=\"xs\"\n disabled={busy}\n onClick={() => changePath(suggested)}\n >\n {suggested}\n </Button>\n ))}\n </div>\n ) : null}\n {discovering ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Reading workspace declarations…\n </p>\n ) : null}\n {discoveryError ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {discoveryError}\n </p>\n ) : null}\n {declarations ? (\n <fieldset className=\"flex min-w-0 flex-col gap-1\">\n <legend className=\"mb-1 text-base font-medium text-po-hi\">Workspaces</legend>\n <p className=\"mb-1 text-sm text-po-dim\">Declared in .po/config.yaml. Choose which to add.</p>\n {declarations.map((entry, index) => {\n const isAdded = addedId(entry.name) !== undefined;\n const on = isAdded || draft.checked.includes(entry.name);\n const rowError = draft.results.find((result) => result.name === entry.name)?.error;\n return (\n <div\n key={entry.name}\n data-checked={on}\n className=\"rounded-sm px-2 py-1.5 data-[checked=true]:bg-po-tint-green\"\n >\n <label\n htmlFor={`add-workspace-declaration-${index}`}\n className=\"flex min-w-0 cursor-pointer items-start gap-2.5\"\n >\n <Checkbox\n id={`add-workspace-declaration-${index}`}\n checked={on}\n disabled={isAdded || busy}\n onCheckedChange={() =>\n updateDraft({\n checked: on\n ? draft.checked.filter((name) => name !== entry.name)\n : [...draft.checked, entry.name],\n })\n }\n className=\"mt-1\"\n />\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-base font-semibold text-po-hi\">{entry.name}</span>\n <span className=\"truncate text-sm text-po-dim\" title={entry.instructions}>\n {entry.instructions}\n </span>\n {rowError ? (\n <span role=\"alert\" className=\"text-sm text-po-red\">\n {rowError}\n </span>\n ) : null}\n </span>\n {isAdded ? <span className=\"text-sm text-po-dim\">Added</span> : null}\n </label>\n </div>\n );\n })}\n </fieldset>\n ) : manual ? (\n <>\n <label htmlFor=\"add-workspace-name\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">Name</span>\n <Input\n id=\"add-workspace-name\"\n data-testid=\"add-workspace-name\"\n value={shownName}\n disabled={busy}\n onChange={(event) => {\n setNameEdited(true);\n setName(event.target.value);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter') void submit();\n }}\n placeholder=\"my-project\"\n />\n </label>\n <label htmlFor=\"add-workspace-instructions\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">\n Instructions <span className=\"font-normal\">(optional)</span>\n </span>\n <Textarea\n id=\"add-workspace-instructions\"\n rows={3}\n value={instructions}\n disabled={busy}\n onChange={(event) => updateDraft({ instructions: event.target.value })}\n />\n <span className=\"text-sm text-po-dim\">For main sessions in this workspace.</span>\n </label>\n </>\n ) : null}\n {manual && trimmedPath === '' && shownName.trim() !== '' ? (\n <p data-testid=\"add-workspace-default-hint\" className=\"text-sm text-po-dim\">\n creates ~/.po/workspace/{shownName.trim()}\n </p>\n ) : null}\n {error ? (\n <pre className=\"max-h-28 overflow-y-auto rounded border border-po-edge-red bg-po-tint-red/40 px-2.5 py-2 text-sm whitespace-pre-wrap text-po-red\">\n {error}\n </pre>\n ) : null}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => actions.closeAddWorkspace()} disabled={busy}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n data-testid=\"add-workspace-confirm\"\n onClick={() => void submit()}\n disabled={!canSubmit}\n >\n {busy\n ? 'Adding…'\n : declarations\n ? `Add ${selected.length} ${selected.length === 1 ? 'workspace' : 'workspaces'}`\n : 'Add workspace'}\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { WebTemplateRailActions, WebTemplateRailPendingSetup } from '@agimon-ai/po-core/web';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n KebabIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\n\n/** A setup-only reservation: no runtime, so it offers removal and nothing else. */\nexport function ElegantPendingSetup({\n sessionId,\n setup,\n actions,\n}: {\n sessionId: string;\n setup: WebTemplateRailPendingSetup;\n actions: WebTemplateRailActions;\n}) {\n const key = JSON.stringify(['rail/setup', sessionId, setup.id]);\n const [busy, setBusy, busyState] = useDashboardState(`${key}/busy`, false);\n const [error, setError] = useDashboardState(`${key}/error`, '');\n const remove = async (): Promise<void> => {\n if (busyState.state) return;\n setBusy(true);\n setError('');\n const result = await actions.removePendingSetup(sessionId, setup.id);\n setBusy(false);\n if (result !== undefined) setError(result.error);\n };\n return (\n <div\n data-testid={`pending-session-${setup.id}`}\n className=\"ml-9 flex flex-col gap-0.5 rounded-lg border border-dashed border-po-border-soft px-3 py-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate text-base font-semibold text-po-hi\">{setup.name}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"session setup actions\"\n disabled={busy}\n data-testid={`pending-session-menu-${setup.id}`}\n >\n <KebabIcon className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem variant=\"destructive\" onSelect={() => void remove()}>\n remove setup\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <p className={setup.failed ? 'text-sm text-po-red' : 'text-sm text-po-dim'}>{setup.status}</p>\n {setup.recovery ? (\n <p role={setup.failed ? 'alert' : undefined} className=\"text-sm text-po-dim\">\n {setup.recovery}\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import type { WebTemplateRailActions, WebTemplateRailSession } from '@agimon-ai/po-core/web';\nimport {\n AlertIcon,\n Avatar,\n AvatarFallback,\n AvatarImage,\n BranchIcon,\n Button,\n cn,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n ForkIcon,\n ActivityIcon,\n Input,\n KebabIcon,\n LiveDuration,\n LoaderIcon,\n NavTabBadge,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { memo, useRef } from 'react';\n\nimport { ElegantPendingSetup } from './ElegantPendingSetup';\n\ntype CardMode = 'view' | 'menu' | 'rename' | 'confirm';\n\n/**\n * A soft tile led by the persona avatar, with the branch as a quiet caption.\n * Memoized: the rail keeps an unchanged session's object, so another session's push skips this card.\n */\nexport const ElegantSessionCard = memo(function ElegantSessionCard({\n session,\n actions,\n}: {\n session: WebTemplateRailSession;\n actions: WebTemplateRailActions;\n}) {\n const key = `rail/session/${session.id}`;\n const [mode, setMode] = useDashboardState<CardMode>(`${key}/mode`, 'view');\n const [draft, setDraft] = useDashboardState(`${key}/draft`, '');\n const [removeError, setRemoveError] = useDashboardState(`${key}/error`, '');\n const [, setRemoving, removingState] = useDashboardState(`${key}/removing`, false);\n // Written by the event that changes the mode, so the menu's close-focus handler\n // sees the new mode before React re-renders the card.\n const modeRef = useRef(mode);\n const enterMode = (next: CardMode): void => {\n modeRef.current = next;\n setMode(next);\n };\n const { active } = session;\n const error = removeError || session.error;\n const tileClass = active\n ? 'rounded-lg border border-po-edge-green bg-po-tint-green px-3 hover:bg-po-tint-green'\n : 'rounded-lg border border-transparent px-3 hover:bg-po-panel';\n const failed = session.status.startsWith('failed') || session.status.includes(' failed');\n const running = session.status.startsWith('running');\n // A host without the count still marks a waiting card as one.\n const waiting = session.waitingCount ?? (session.awaitingInput ? 1 : 0);\n const commitRename = (): void => {\n actions.renameSession(session.id, draft);\n enterMode('view');\n };\n const remove = async (): Promise<void> => {\n if (removingState.state) return;\n setRemoving(true);\n enterMode('view');\n setRemoveError('');\n const result = await actions.removeSession(session.id);\n setRemoving(false);\n if (result !== undefined) setRemoveError(result.error);\n };\n\n const body = (\n <>\n <span className=\"flex w-full min-w-0 items-start gap-2.5\">\n <span className=\"relative shrink-0\">\n <Avatar\n data-testid={session.profile ? 'session-avatar' : undefined}\n aria-label={session.profile?.label ?? 'Po'}\n title={session.profile?.label}\n className=\"size-8 rounded-full\"\n >\n {session.profile?.avatarUrl ? <AvatarImage src={session.profile.avatarUrl} alt=\"\" /> : null}\n <AvatarFallback className=\"bg-po-tint-green text-xs font-semibold text-po-green\">\n {session.profile?.initials ?? 'PO'}\n </AvatarFallback>\n </Avatar>\n {waiting > 0 ? (\n <>\n {/* The rose count of things waiting on the person, on the avatar's top-right. */}\n <NavTabBadge\n ask\n aria-hidden\n data-testid=\"session-awaiting-input\"\n className=\"absolute -top-1 -right-1.5 ring-2 ring-po-rail\"\n >\n {waiting}\n </NavTabBadge>\n <span className=\"sr-only\">, {waiting} waiting for you</span>\n </>\n ) : null}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"flex min-w-0 items-start gap-2\">\n {session.nested && session.provenance === 'workflow-session' ? (\n <ActivityIcon\n aria-label=\"workflow session\"\n className={`mt-1 size-3 shrink-0 ${active ? 'text-po-green' : 'text-po-faint'}`}\n />\n ) : session.nested && session.provenance ? (\n <ForkIcon\n aria-label={\n session.provenance === 'worktree' ? 'automatic per-conversation worktree' : session.provenance\n }\n className={`mt-1 size-3 shrink-0 ${active ? 'text-po-green' : 'text-po-faint'}`}\n />\n ) : null}\n <span className=\"min-w-0 flex-1 text-base font-semibold break-words text-po-hi\">\n {session.name || 'Untitled'}\n </span>\n {session.ordinal <= 9 ? (\n <span\n title={`press ${String(session.ordinal)} to focus`}\n className=\"grid size-5 shrink-0 place-items-center rounded-full bg-po-panel text-2xs text-po-dim transition-opacity group-focus-within:opacity-0 group-hover:opacity-0\"\n >\n {session.ordinal}\n </span>\n ) : null}\n </span>\n <span\n className={`flex min-w-0 items-start gap-1.5 text-sm leading-snug ${\n failed ? 'text-po-red' : running ? 'text-po-yellow' : active ? 'text-po-text' : 'text-po-dim'\n }`}\n >\n {running ? (\n <LoaderIcon aria-hidden className=\"mt-0.5 size-3 shrink-0 animate-spin\" />\n ) : failed ? (\n <AlertIcon aria-hidden className=\"mt-0.5 size-3 shrink-0\" />\n ) : null}\n {session.clock ? (\n <LiveDuration\n data-testid=\"session-status\"\n className={active ? 'line-clamp-2' : 'truncate'}\n label={session.clock.label}\n since={session.clock.since}\n />\n ) : (\n <span data-testid=\"session-status\" className={active ? 'line-clamp-2' : 'truncate'}>\n {session.status}\n </span>\n )}\n </span>\n </span>\n </span>\n {session.git ? (\n <span data-testid=\"session-branch\" className=\"flex min-w-0 items-center gap-1.5 pl-10.5 text-sm text-po-dim\">\n <BranchIcon className={`size-3 shrink-0 ${active ? 'text-po-green' : ''}`} />\n <span className=\"truncate font-mono\">{session.git.branch}</span>\n {session.git.dirty ? <span className=\"shrink-0 text-po-yellow\">modified</span> : null}\n </span>\n ) : null}\n {error ? (\n <span data-testid=\"session-error\" className=\"line-clamp-3 text-sm break-words text-po-red\">\n {error}\n </span>\n ) : null}\n </>\n );\n\n const menuOpen = mode === 'menu';\n return (\n <>\n <div\n className={cn('group relative', session.nested && 'pl-5')}\n data-testid={`session-card-${session.id}`}\n data-active={active}\n data-nested={session.nested}\n >\n <Button\n variant=\"ghost\"\n size=\"card\"\n data-testid={`session-open-${session.id}`}\n onClick={() => actions.openSession(session.id)}\n className={tileClass}\n >\n {body}\n </Button>\n {mode === 'view' || menuOpen ? (\n <div\n className={`absolute top-2 right-2 transition-opacity ${\n menuOpen ? 'opacity-100' : 'opacity-0 group-focus-within:opacity-100 group-hover:opacity-100'\n }`}\n >\n <DropdownMenu\n open={menuOpen}\n onOpenChange={(next) => {\n const current = modeRef.current;\n enterMode(next ? 'menu' : current === 'menu' ? 'view' : current);\n }}\n >\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`session-menu-${session.id}`}\n title=\"session actions\"\n className=\"text-po-dim hover:text-po-hi\"\n >\n <KebabIcon className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n data-testid={`session-menu-list-${session.id}`}\n onCloseAutoFocus={(event) => {\n if (modeRef.current !== 'view') event.preventDefault();\n }}\n >\n {actions.renderSessionMenuItems(session.id)}\n <DropdownMenuItem\n data-testid={`session-rename-${session.id}`}\n onSelect={() => {\n setDraft(session.name);\n enterMode('rename');\n }}\n >\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n data-testid={`session-resume-${session.id}`}\n onSelect={() => actions.resumeSession(session.id)}\n >\n Resume\n </DropdownMenuItem>\n <DropdownMenuItem\n data-testid={`session-restart-${session.id}`}\n disabled={session.restarting || session.restartBlocked === true}\n onSelect={() => actions.restartSession(session.id)}\n >\n Restart\n </DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n data-testid={`session-stop-${session.id}`}\n onSelect={() => enterMode('confirm')}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <Dialog open={mode === 'rename'} onOpenChange={(next) => !next && enterMode('view')}>\n <DialogContent width=\"sm\" data-testid={`session-rename-dialog-${session.id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>rename session</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(event) => {\n event.preventDefault();\n commitRename();\n }}\n >\n <Input\n data-testid={`session-name-input-${session.id}`}\n aria-label=\"session name\"\n value={draft}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"md\"\n data-testid={`session-rename-cancel-${session.id}`}\n onClick={() => enterMode('view')}\n >\n cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"md\"\n data-testid={`session-rename-confirm-${session.id}`}\n disabled={draft.trim() === ''}\n >\n rename\n </Button>\n </DialogFooter>\n </form>\n </DialogBody>\n </DialogContent>\n </Dialog>\n <Dialog open={mode === 'confirm'} onOpenChange={(next) => !next && enterMode('view')}>\n <DialogContent width=\"sm\" data-testid={`session-stop-dialog-${session.id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>remove session</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n this stops <span className=\"font-semibold text-po-hi\">{session.name || 'untitled'}</span> and removes it\n from the list. anything it is running ends now. you can restore it for 7 days.\n </DialogDescription>\n <DialogFooter>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid={`session-stop-cancel-${session.id}`}\n autoFocus\n onClick={() => enterMode('view')}\n >\n cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"md\"\n data-testid={`session-stop-confirm-${session.id}`}\n onClick={() => void remove()}\n >\n remove\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n </div>\n {session.pendingSetups.map((setup) => (\n <ElegantPendingSetup key={`setup:${setup.id}`} sessionId={session.id} setup={setup} actions={actions} />\n ))}\n </>\n );\n});\n","import type { WebTemplateRailActions, WebTemplateRailWorkspace } from '@agimon-ai/po-core/web';\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n KebabIcon,\n PlusIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\n\nimport { ElegantSessionCard } from './ElegantSessionCard';\n\n/** A folder heading over its sessions; only a hover tint marks the row. */\nexport function ElegantWorkspaceGroup({\n workspace,\n actions,\n}: {\n workspace: WebTemplateRailWorkspace;\n actions: WebTemplateRailActions;\n}) {\n const key = `rail/workspace/${workspace.id}`;\n const [removeOpen, setRemoveOpen] = useDashboardState(`${key}/open`, false);\n const [removeError, setRemoveError] = useDashboardState(`${key}/error`, '');\n const [removing, setRemoving, removingState] = useDashboardState(`${key}/removing`, false);\n const { id, name, root, available, legacy } = workspace;\n if (workspace.kind === 'session')\n return workspace.sessions.length === 0 ? null : (\n <div data-testid={`session-group-${id}`} className=\"flex flex-col gap-1\">\n {workspace.sessions.map((session) => (\n <ElegantSessionCard key={session.id} session={session} actions={actions} />\n ))}\n </div>\n );\n const unregister = async (): Promise<void> => {\n if (removingState.state) return;\n setRemoving(true);\n setRemoveError('');\n const result = await actions.deleteWorkspace(id);\n setRemoving(false);\n if (result !== undefined) setRemoveError(result.error);\n else setRemoveOpen(false);\n };\n return (\n <section data-testid={`workspace-group-${id}`} data-available={available} className=\"flex flex-col gap-1.5\">\n <div className=\"flex min-w-0 items-start gap-2.5 rounded-md px-2 py-1 transition-colors hover:bg-po-panel/60\">\n <FolderIcon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-po-dim\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <p className=\"truncate text-base font-semibold text-po-hi\">{name}</p>\n <p className=\"truncate font-mono text-sm text-po-dim\" title={root}>\n {root}\n </p>\n </div>\n {legacy ? null : (\n <span className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`workspace-new-session-${id}`}\n title=\"New session\"\n aria-label={`New session in ${name}`}\n disabled={!available}\n onClick={() => actions.createSession(id)}\n className=\"text-po-faint hover:text-po-hi\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid={`workspace-menu-${id}`}\n title=\"Workspace actions\"\n aria-label={`${name} actions`}\n className=\"text-po-faint hover:text-po-hi\"\n >\n <KebabIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem disabled={!available} onSelect={() => actions.resumeInWorkspace(id)}>\n Resume Session\n </DropdownMenuItem>\n <DropdownMenuItem disabled={!available} onSelect={() => actions.openWorkspaceSettings(id)}>\n Workspace Settings\n </DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n data-testid={`workspace-delete-${id}`}\n onSelect={() => {\n setRemoveError('');\n setRemoveOpen(true);\n }}\n >\n Delete Workspace\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </span>\n )}\n </div>\n {!available ? <p className=\"px-9 text-sm text-po-red\">Workspace unavailable</p> : null}\n {workspace.sessions.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {workspace.sessions.map((session) => (\n <ElegantSessionCard key={session.id} session={session} actions={actions} />\n ))}\n </div>\n ) : available ? (\n <p className=\"px-9 pb-1 text-sm text-po-dim\">No sessions yet. Start or resume one.</p>\n ) : null}\n <Dialog open={removeOpen} onOpenChange={(next) => !next && !removing && setRemoveOpen(false)}>\n <DialogContent width=\"sm\" data-testid={`workspace-delete-dialog-${id}`} aria-describedby={undefined}>\n <DialogHeader>\n <DialogTitle>delete workspace</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n this unregisters <span className=\"font-semibold text-po-hi\">{name}</span> from Po only. files at{' '}\n <code>{root}</code> stay on disk. its sessions must be removed first.\n </DialogDescription>\n {removeError ? (\n <p data-testid={`workspace-delete-error-${id}`} className=\"text-sm text-po-red\">\n {removeError}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid={`workspace-delete-cancel-${id}`}\n disabled={removing}\n autoFocus\n onClick={() => setRemoveOpen(false)}\n >\n cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"md\"\n data-testid={`workspace-delete-confirm-${id}`}\n disabled={removing}\n onClick={() => void unregister()}\n >\n {removing ? 'deleting…' : 'delete'}\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n </section>\n );\n}\n","import type { WebTemplateRail } from '@agimon-ai/po-core/web';\nimport {\n Button,\n CloseIcon,\n Dot,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n GearIcon,\n HomeIcon,\n Kbd,\n PlusIcon,\n ShieldIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { useEffect, useRef } from 'react';\n\nimport { ElegantWorkspaceGroup } from './ElegantWorkspaceGroup';\n\n/** The drawer's session list: brand, workspaces with their sessions, remote access, and settings. */\nexport function ElegantRail({ rail, onClose }: { rail: WebTemplateRail; onClose: () => void }) {\n const { remote, actions } = rail;\n const live = remote.status === 'on' || remote.status === 'starting';\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex items-center justify-between gap-2 px-5 pt-4 pb-3\">\n <span className=\"flex items-center gap-2.5\" aria-label=\"Po\">\n <img src=\"/favicon.svg\" alt=\"\" aria-hidden=\"true\" className=\"size-9 rounded-lg\" />\n <span aria-hidden=\"true\" className=\"text-2xl font-semibold text-po-hi\">\n Po\n </span>\n </span>\n <span className=\"flex items-center gap-1\">\n <Button\n variant={remote.status === 'failed' ? 'danger-outline' : 'outline'}\n size=\"sm\"\n data-testid=\"remote-access-open\"\n aria-label={`Remote access is ${remote.status}`}\n onClick={actions.openRemoteAccess}\n className={`gap-1.5 rounded-md ${remote.status === 'failed' ? '' : 'bg-po-panel'}`}\n >\n {live ? <Dot tone=\"yellow\" pulse data-testid=\"remote-access-live\" /> : <ShieldIcon className=\"size-3.5\" />}\n Remote access\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"mobile-sessions-close\"\n title=\"Hide sessions\"\n aria-label=\"Hide sessions\"\n onClick={onClose}\n className=\"text-po-dim\"\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n </span>\n </div>\n <div className=\"px-3 pt-2\">\n <Button\n variant=\"ghost\"\n size=\"lg\"\n data-testid=\"home-open\"\n aria-current={rail.homeActive ? 'page' : undefined}\n onClick={actions.openHome}\n className={\n rail.homeActive\n ? 'w-full justify-start gap-2.5 border border-po-edge-green bg-po-tint-green px-2 text-po-hi'\n : 'w-full justify-start gap-2.5 border border-transparent px-2 text-po-text'\n }\n >\n <HomeIcon aria-hidden=\"true\" className={rail.homeActive ? 'size-5 text-po-green' : 'size-5 text-po-dim'} />\n Home\n </Button>\n </div>\n {rail.pluginContent}\n <ElegantSessionList rail={rail} />\n <div className=\"flex-1\" />\n\n <div className=\"sticky bottom-0 mt-auto shrink-0 bg-po-rail\">\n {remote.status === 'off' ? null : (\n <div\n data-testid=\"remote-banner\"\n className={`flex items-center gap-2 border-t border-po-border-soft px-4 py-2 text-sm ${\n remote.status === 'failed' ? 'bg-po-tint-red text-po-red' : 'bg-po-tint-yellow text-po-yellow'\n }`}\n >\n <Dot tone={remote.status === 'failed' ? 'red' : 'yellow'} />\n <span className=\"min-w-0 flex-1 truncate\">\n {remote.status === 'failed'\n ? `Remote access failed: ${remote.error ?? 'the tunnel stopped'}`\n : `Remote access ${remote.status === 'starting' ? 'starting' : 'on'}${\n remote.host === undefined ? '' : ` · ${remote.host}`\n } · ${String(remote.deviceCount)} device${remote.deviceCount === 1 ? '' : 's'}`}\n </span>\n <Button variant=\"ghost\" size=\"xs\" data-testid=\"remote-banner-open\" onClick={actions.openRemoteAccess}>\n Manage\n </Button>\n <Button variant=\"ghost\" size=\"xs\" data-testid=\"remote-banner-off\" onClick={actions.turnRemoteAccessOff}>\n Turn off\n </Button>\n </div>\n )}\n <div className=\"flex flex-col gap-1 border-t border-po-border-soft px-3 py-3\">\n <Button\n variant=\"ghost\"\n size=\"md\"\n data-testid=\"settings-open\"\n onClick={actions.openSettings}\n className=\"justify-start gap-2.5 px-2 text-po-text\"\n >\n <GearIcon className=\"size-4 text-po-dim\" />\n Settings\n </Button>\n <span className=\"px-2 text-sm text-po-dim max-sm:hidden\">\n <Kbd className=\"bg-po-panel\">ctrl+k</Kbd> commands · <Kbd className=\"bg-po-panel\">ctrl+t</Kbd> new session\n </span>\n </div>\n </div>\n </div>\n );\n}\n\n/** The production Sessions section, also rendered by its approved stories. */\nexport function ElegantSessionList({ rail }: { rail: WebTemplateRail }) {\n const { actions } = rail;\n const empty = rail.workspaces.every((workspace) => workspace.kind === 'session' && workspace.sessions.length === 0);\n const list = useRef<HTMLDivElement>(null);\n const [revealed, setRevealed] = useDashboardState('rail/initial-selection-revealed', false);\n useEffect(() => {\n if (revealed) return;\n const selected = list.current?.querySelector<HTMLElement>('[data-active=\"true\"]');\n if (!selected) return;\n selected.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' });\n // Survive scope remounts without overriding the person's subsequent scrolling.\n setRevealed(true);\n }, [rail.workspaces, revealed, setRevealed]);\n return (\n <>\n <div className=\"flex items-center justify-between px-5 pt-3 pb-2\">\n <h2 className=\"text-lg font-semibold text-po-hi\">Sessions</h2>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"session-create-menu\"\n title=\"Create workspace or session\"\n aria-label=\"Create workspace or session\"\n className=\"text-po-dim hover:text-po-hi\"\n >\n <PlusIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem data-testid=\"add-workspace-open\" onSelect={actions.openAddWorkspace}>\n Create workspace\n </DropdownMenuItem>\n {actions.createGeneralSession ? (\n <DropdownMenuItem data-testid=\"new-session-open\" onSelect={actions.createGeneralSession}>\n Create session\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <div ref={list} className=\"flex flex-col gap-4 px-3 pb-3\">\n {rail.workspaces.map((workspace) => (\n <ElegantWorkspaceGroup key={workspace.id} workspace={workspace} actions={actions} />\n ))}\n {empty ? (\n <p className=\"px-2 text-sm text-po-dim\">Start a session to work with Po. No workspace needed.</p>\n ) : null}\n </div>\n </>\n );\n}\n","import { Drawer } from '@agimon-ai/po-web-components';\n\nimport type { LayoutProps } from '../_types/layout';\nimport { ElegantAddWorkspaceDialog } from './ElegantAddWorkspaceDialog';\nimport { ElegantRail } from './ElegantRail';\n\n/** A conversation-first frame, with the same host capabilities available on demand. */\nexport function ElegantLayout({\n view,\n slots,\n rail,\n navigationOpen,\n mobileActivityOpen,\n onNavigationOpenChange,\n onMobileActivityOpenChange,\n}: LayoutProps) {\n const conversation = view === 'conversation' || view === 'welcome';\n return (\n <div className=\"relative flex h-full min-w-0 flex-col overflow-hidden bg-po-bg\">\n <Drawer\n open={navigationOpen}\n onOpenChange={onNavigationOpenChange}\n side=\"left\"\n title=\"Sessions\"\n showHeader={false}\n data-testid=\"session-rail-panel\"\n backdropTestId=\"mobile-drawer-backdrop\"\n className=\"w-[min(340px,calc(100vw-48px))] border-po-border-soft\"\n >\n <ElegantRail rail={rail} onClose={() => onNavigationOpenChange(false)} />\n </Drawer>\n {slots.notices}\n {slots.header({ navigationToggle: 'always', activityToggle: 'always' })}\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <div\n data-testid=\"template-content\"\n className={\n conversation\n ? 'mx-auto flex min-h-0 w-full max-w-[960px] flex-1 flex-col overflow-hidden px-2 sm:px-6'\n : 'flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden'\n }\n >\n {slots.content}\n {slots.composer == null ? null : <div className=\"mb-2 shrink-0 sm:mb-4\">{slots.composer}</div>}\n {slots.controls == null ? null : (\n <details className=\"shrink-0 px-3 pb-3 text-sm text-po-dim\">\n <summary\n data-testid=\"template-controls-toggle\"\n className=\"cursor-pointer rounded-sm px-1 py-1 focus-visible:outline focus-visible:outline-po-blue\"\n >\n Session controls\n </summary>\n {slots.controls}\n </details>\n )}\n </div>\n </main>\n {slots.activity == null ? null : (\n <Drawer\n open={mobileActivityOpen}\n onOpenChange={onMobileActivityOpenChange}\n side=\"right\"\n title=\"Activity\"\n showHeader={false}\n backdropTestId=\"mobile-activity-backdrop\"\n className=\"w-auto max-w-[calc(100vw-48px)]\"\n >\n {slots.activity}\n </Drawer>\n )}\n {rail.addWorkspace ? (\n <ElegantAddWorkspaceDialog suggestedPaths={rail.addWorkspace.suggestedPaths} actions={rail.actions} />\n ) : null}\n </div>\n );\n}\n","import {\n ArrowRightIcon,\n Button,\n Checkbox,\n Input,\n Kbd,\n LockIcon,\n RadioGroup,\n RadioGroupItem,\n SendIcon,\n Skeleton,\n Textarea,\n} from '@agimon-ai/po-web-components';\nimport type { ReactNode } from 'react';\n\n/** The setup steps a person can still be missing; finished steps are never shown again. */\nexport type OnboardingSetupStep = 'model' | 'workspace';\n\nexport interface OnboardingProvider {\n id: string;\n name: string;\n /** One plain fact about how it connects, such as \"Use an OpenAI API key\". */\n note: string;\n}\n\nexport interface OnboardingFolder {\n path: string;\n checked: boolean;\n}\n\nfunction StepFrame({\n step,\n pending,\n children,\n testId,\n}: {\n step?: OnboardingSetupStep;\n pending: readonly OnboardingSetupStep[];\n children: ReactNode;\n testId: string;\n}) {\n return (\n <div data-testid={testId} className=\"flex min-h-0 flex-1 items-center justify-center overflow-y-auto px-4 py-10\">\n <section className=\"flex w-full max-w-xl flex-col gap-6\">\n {children}\n {pending.length > 1 ? (\n <ol aria-label=\"Setup steps\" className=\"flex justify-center gap-2\">\n {pending.map((entry) => (\n <li\n key={entry}\n aria-current={entry === step ? 'step' : undefined}\n className={`size-1.5 rounded-full ${entry === step ? 'bg-po-selected' : 'bg-po-border-soft'}`}\n />\n ))}\n </ol>\n ) : null}\n </section>\n </div>\n );\n}\n\nfunction Heading({ title, description }: { title: string; description: ReactNode }) {\n return (\n <header className=\"flex flex-col gap-1.5 text-center\">\n <h1 className=\"text-xl font-semibold text-po-hi\">{title}</h1>\n <p className=\"text-base text-po-dim\">{description}</p>\n </header>\n );\n}\n\nfunction ErrorLine({ error }: { error?: string }) {\n return error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null;\n}\n\nconst STEP_COUNT_WORDS = ['', 'One quick step', 'Two quick steps'];\n\n/** The first thing a new person sees, only while a setup step is still missing. */\nexport function ElegantOnboardingWelcome({\n pending,\n onBegin,\n}: {\n pending: readonly OnboardingSetupStep[];\n onBegin: () => void;\n}) {\n return (\n <StepFrame pending={[]} testId=\"onboarding-welcome\">\n <div className=\"flex flex-col items-center gap-5 py-4 text-center\">\n <span className=\"flex items-center gap-2.5\" aria-label=\"Po\">\n <img src=\"/favicon.svg\" alt=\"\" aria-hidden=\"true\" className=\"size-10 rounded-lg\" />\n <span aria-hidden=\"true\" className=\"text-2xl font-semibold text-po-hi\">\n Po\n </span>\n </span>\n <div className=\"flex flex-col gap-1.5\">\n <h1 className=\"text-2xl font-semibold text-po-hi\">Hi, I&apos;m Po. I&apos;ll handle the busywork.</h1>\n <p className=\"text-base text-po-dim\">\n {STEP_COUNT_WORDS[pending.length] ?? `${pending.length} quick steps`} and you can hand me your first task.\n </p>\n </div>\n <Button variant=\"primary\" size=\"lg\" data-testid=\"onboarding-begin\" onClick={onBegin} className=\"px-6\">\n Let&apos;s begin\n <ArrowRightIcon className=\"size-3.5\" />\n </Button>\n </div>\n </StepFrame>\n );\n}\n\n/** Choose and sign in to the provider that runs the models. */\nexport function ElegantOnboardingModel({\n pending,\n providers,\n selectedId,\n busy,\n error,\n onSelect,\n onConnect,\n onShowAll,\n}: {\n pending: readonly OnboardingSetupStep[];\n providers: readonly OnboardingProvider[];\n selectedId: string | null;\n busy: boolean;\n error?: string;\n onSelect: (providerId: string) => void;\n onConnect: () => void;\n onShowAll: () => void;\n}) {\n return (\n <StepFrame step=\"model\" pending={pending} testId=\"onboarding-model\">\n <Heading title=\"Choose who does the thinking\" description=\"You can connect more providers later in settings.\" />\n <RadioGroup\n aria-label=\"Model provider\"\n value={selectedId ?? ''}\n onValueChange={onSelect}\n className=\"flex flex-col gap-2\"\n >\n {providers.map((provider) => (\n <label\n key={provider.id}\n htmlFor={`onboarding-provider-${provider.id}`}\n data-testid={`onboarding-provider-${provider.id}`}\n className={`flex cursor-pointer items-center gap-3 rounded-lg border px-4 py-3 transition-colors ${\n provider.id === selectedId\n ? 'border-po-selected bg-po-selected/5'\n : 'border-po-border-soft hover:border-po-green/50'\n }`}\n >\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-base font-semibold text-po-hi\">{provider.name}</span>\n <span className=\"text-sm text-po-dim\">{provider.note}</span>\n </span>\n <RadioGroupItem id={`onboarding-provider-${provider.id}`} value={provider.id} />\n </label>\n ))}\n </RadioGroup>\n <Button variant=\"ghost\" size=\"sm\" onClick={onShowAll} className=\"self-start\">\n Show every provider\n </Button>\n <ErrorLine error={error} />\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex items-center gap-1.5 text-sm text-po-dim\">\n <LockIcon className=\"size-3.5\" />\n Your keys stay on this machine.\n </span>\n <Button\n variant=\"primary\"\n size=\"lg\"\n data-testid=\"onboarding-connect\"\n disabled={selectedId === null || busy}\n onClick={onConnect}\n >\n {busy ? 'Connecting…' : 'Connect'}\n </Button>\n </div>\n </StepFrame>\n );\n}\n\nfunction addLabel(count: number): string {\n if (count === 0) return 'Add workspace';\n return count === 1 ? 'Add 1 workspace' : `Add ${count} workspaces`;\n}\n\n/** Admit folders Po found, a new named workspace, or a browsed folder. */\nexport function ElegantOnboardingWorkspace({\n pending,\n scanning,\n found,\n name,\n busy,\n error,\n browser,\n onToggle,\n onNameChange,\n onBrowse,\n onAdd,\n}: {\n pending: readonly OnboardingSetupStep[];\n scanning: boolean;\n found: readonly OnboardingFolder[];\n name: string;\n busy: boolean;\n error?: string;\n /** The folder browser, rendered in place while open. */\n browser?: ReactNode;\n onToggle: (path: string, checked: boolean) => void;\n onNameChange: (name: string) => void;\n onBrowse: () => void;\n onAdd: () => void;\n}) {\n const count = found.filter((folder) => folder.checked).length + (name.trim() === '' ? 0 : 1);\n const showFound = scanning || found.length > 0;\n return (\n <StepFrame step=\"workspace\" pending={pending} testId=\"onboarding-workspace\">\n <Heading\n title=\"Where should I work?\"\n description={\n found.length > 0\n ? 'I found these folders with Po settings on this machine.'\n : 'Name a new workspace, or pick a folder you already have.'\n }\n />\n {showFound ? (\n <div className=\"flex flex-col rounded-lg border border-po-border-soft\">\n <span className=\"border-b border-po-border-soft px-4 py-2 text-sm text-po-dim\">\n {scanning ? 'Looking for folders with Po settings…' : 'Found on this machine'}\n </span>\n {scanning ? (\n <output aria-busy className=\"flex flex-col gap-3 px-4 py-3\">\n <Skeleton className=\"h-4 w-56\" />\n <Skeleton className=\"h-4 w-44\" />\n </output>\n ) : (\n <ul data-testid=\"onboarding-found\">\n {found.map((folder) => (\n <li key={folder.path} className=\"border-b border-po-border-soft last:border-b-0\">\n <label className=\"flex cursor-pointer items-center gap-3 px-4 py-2.5\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-po-text\">{folder.path}</span>\n <Checkbox\n aria-label={`Add ${folder.path}`}\n checked={folder.checked}\n onCheckedChange={(checked) => onToggle(folder.path, checked === true)}\n />\n </label>\n </li>\n ))}\n </ul>\n )}\n </div>\n ) : null}\n {showFound ? (\n <div className=\"flex items-center gap-3 text-sm text-po-dim\">\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n or\n <span className=\"h-px flex-1 bg-po-border-soft\" />\n </div>\n ) : null}\n <label htmlFor=\"onboarding-workspace-name\" className=\"flex flex-col gap-1.5\">\n <span className=\"text-base font-medium text-po-text\">Name a new workspace</span>\n <span className=\"flex items-center gap-2\">\n <Input\n id=\"onboarding-workspace-name\"\n data-testid=\"onboarding-workspace-name\"\n value={name}\n placeholder=\"Notes\"\n onChange={(event) => onNameChange(event.target.value)}\n className=\"min-w-0 flex-1\"\n />\n <Button variant=\"outline\" size=\"md\" data-testid=\"onboarding-browse\" onClick={onBrowse}>\n Browse folders\n </Button>\n </span>\n <span className=\"font-mono text-sm text-po-dim\">~/.po/workspace/{name.trim() || 'Notes'}</span>\n </label>\n {browser}\n <ErrorLine error={error} />\n <Button\n variant=\"primary\"\n size=\"lg\"\n data-testid=\"onboarding-add-workspaces\"\n disabled={count === 0 || busy}\n onClick={onAdd}\n className=\"self-end\"\n >\n {busy ? 'Adding…' : addLabel(count)}\n </Button>\n </StepFrame>\n );\n}\n\n/** Setup is done and nothing has started yet: the first task goes straight into a new session. */\nexport function ElegantOnboardingReady({\n model,\n root,\n draft,\n busy,\n error,\n suggestions,\n onDraftChange,\n onSend,\n}: {\n model: string;\n root: string;\n draft: string;\n busy: boolean;\n error?: string;\n suggestions: readonly string[];\n onDraftChange: (draft: string) => void;\n onSend: () => void;\n}) {\n return (\n <StepFrame pending={[]} testId=\"welcome\">\n <header className=\"flex flex-col gap-1.5\">\n <h1 className=\"text-2xl font-semibold text-po-hi\">Ready when you are.</h1>\n <p className=\"text-base text-po-dim\">\n Po is connected to {model} and working in <span className=\"font-mono text-po-text\">{root}</span>.\n </p>\n </header>\n <div className=\"flex flex-col gap-2 rounded-lg border border-po-border bg-po-bg p-3 focus-within:border-po-green/60\">\n <Textarea\n data-testid=\"onboarding-first-task\"\n aria-label=\"Your first task\"\n value={draft}\n placeholder=\"Tell Po what you'd like done…\"\n onChange={(event) => onDraftChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.shiftKey && draft.trim() !== '') {\n event.preventDefault();\n onSend();\n }\n }}\n className=\"min-h-20 resize-none border-0 bg-transparent p-1 text-lg focus-visible:ring-0\"\n />\n <Button\n variant=\"primary\"\n size=\"icon-md\"\n aria-label=\"Start this task\"\n data-testid=\"onboarding-send\"\n disabled={draft.trim() === '' || busy}\n onClick={onSend}\n className=\"self-end\"\n >\n <SendIcon className=\"size-4\" />\n </Button>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {suggestions.map((suggestion) => (\n <Button key={suggestion} variant=\"outline\" size=\"card\" onClick={() => onDraftChange(suggestion)}>\n <span className=\"text-base text-po-text\">{suggestion}</span>\n </Button>\n ))}\n </div>\n <ErrorLine error={error} />\n <span className=\"flex flex-wrap items-center justify-end gap-1.5 border-t border-po-border-soft pt-4 text-sm text-po-dim\">\n <Kbd>ctrl+t</Kbd> new session · <Kbd>ctrl+k</Kbd> commands\n </span>\n </StepFrame>\n );\n}\n","import { globalRevisionTopic, hubRevision, subscribeHubRevision } from '@agimon-ai/po-core/web';\nimport {\n admitDashboardWorkspace,\n createPlainSession,\n listDirectory,\n listPoFolders,\n hasSessionProtocol,\n listProviders,\n answerLogin,\n cancelLogin,\n readLogin,\n sessionsStore,\n startLogin,\n submitComposerDraft,\n updateComposerState,\n workspaceAdmissionStore,\n workspacesStore,\n} from '@agimon-ai/po-web-dashboard';\nimport { LoginFlowDialog, WelcomePanel } from '@agimon-ai/po-web-dashboard/views';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useStore } from '@tanstack/react-store';\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react';\n\nimport { ElegantFolderBrowser } from './ElegantFolderBrowser';\nimport {\n ElegantOnboardingModel,\n ElegantOnboardingReady,\n ElegantOnboardingWelcome,\n ElegantOnboardingWorkspace,\n type OnboardingFolder,\n type OnboardingSetupStep,\n} from './ElegantOnboarding';\n\n/** Shown first, in this order; every other provider waits behind \"Show every provider\". */\nconst FEATURED_PROVIDERS = ['anthropic', 'openai-codex', 'github-copilot', 'google', 'openrouter'];\nconst SUGGESTIONS = ['Tour this codebase for me', 'Find and fix failing tests', 'Draft a README update'];\nconst ATTACH_CHECK_MS = 500;\nconst ATTACH_TIMEOUT_MS = 30_000;\nconst TRAILING_SEPARATORS = /\\/+$/u;\n\n// Template code may not import dashboard /types, so derive them from the public API.\ntype ProviderAuthSummary = Extract<\n Awaited<ReturnType<typeof listProviders>>,\n { providers: unknown }\n>['providers'][number];\ntype LoginFlowSnapshot = Extract<Awaited<ReturnType<typeof readLogin>>, { flow: unknown }>['flow'];\n\nfunction folderName(path: string): string {\n const trimmed = path.trim().replace(TRAILING_SEPARATORS, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1);\n}\n\n/**\n * Sends the session's composer draft once the session is attached and its protocol is bound,\n * which only happens after the session page takes focus. Sends once, never retries, so an\n * unacknowledged send cannot repeat. A session that never gets ready keeps the text in its\n * composer for the person to send.\n */\nfunction submitWhenReady(sessionId: string): void {\n const started = Date.now();\n const timer = setInterval(() => {\n const ready = sessionsStore.state.byId[sessionId]?.attach === 'attached' && hasSessionProtocol(sessionId);\n if (!ready && Date.now() - started < ATTACH_TIMEOUT_MS) return;\n clearInterval(timer);\n if (ready) void submitComposerDraft(sessionId, 'submit');\n }, ATTACH_CHECK_MS);\n}\n\nfunction ModelStep({\n pending,\n models,\n onConnected,\n}: {\n pending: readonly OnboardingSetupStep[];\n models: readonly ProviderAuthSummary[];\n onConnected: () => void;\n}) {\n const revisionTopic = globalRevisionTopic('providers');\n const revision = useSyncExternalStore(\n (listener) => subscribeHubRevision(revisionTopic, listener),\n () => hubRevision(revisionTopic),\n );\n const [showAll, setShowAll] = useState(false);\n const signable = models.filter((provider) => provider.methods.length > 0);\n const featured = FEATURED_PROVIDERS.flatMap((id) => signable.filter((provider) => provider.id === id));\n const shown = showAll || featured.length === 0 ? signable : featured;\n const [selectedId, setSelectedId] = useState<string | null>(shown[0]?.id ?? null);\n const [flow, setFlow] = useState<LoginFlowSnapshot | null>(null);\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState('');\n\n // Read the running sign-in on open and on pushed provider changes.\n const flowId = flow?.id;\n const running = flow?.status === 'running';\n useEffect(() => {\n if (flowId === undefined || !running) return;\n let stopped = false;\n const fetchFlow = async (): Promise<void> => {\n const result = await readLogin(flowId);\n if (stopped) return;\n if ('error' in result) {\n setFlow((current) =>\n current?.id === flowId ? { ...current, status: 'failed', error: result.error } : current,\n );\n return;\n }\n setFlow(result.flow);\n if (result.flow.status === 'succeeded') onConnected();\n };\n void fetchFlow();\n return () => {\n stopped = true;\n };\n }, [flowId, running, onConnected, revision]);\n\n const connect = async (): Promise<void> => {\n const provider = signable.find((candidate) => candidate.id === selectedId);\n const method = provider?.methods.find((candidate) => candidate.type === 'oauth') ?? provider?.methods[0];\n if (provider === undefined || method === undefined || starting || running) return;\n setError('');\n setStarting(true);\n const result = await startLogin(provider.id, method.type);\n setStarting(false);\n if ('flow' in result) setFlow(result.flow);\n else setError(result.error);\n };\n\n return (\n <>\n <ElegantOnboardingModel\n pending={pending}\n providers={shown.map((provider) => ({\n id: provider.id,\n name: provider.name,\n note: provider.methods.map((method) => method.label).join(' or '),\n }))}\n selectedId={selectedId}\n busy={starting || running}\n {...(error === '' ? {} : { error })}\n onSelect={setSelectedId}\n onConnect={() => void connect()}\n onShowAll={() => setShowAll(true)}\n />\n {flow ? (\n <LoginFlowDialog\n flow={flow}\n onAnswer={(promptId, value) =>\n void answerLogin(flow.id, promptId, value).then(async (result) => {\n if ('flow' in result) {\n const latest = await readLogin(flow.id);\n const next = 'flow' in latest ? latest.flow : result.flow;\n setFlow(next);\n if (next.status === 'succeeded') onConnected();\n } else setError(result.error);\n })\n }\n onCancel={() => void cancelLogin(flow.id).then((result) => setFlow('flow' in result ? result.flow : null))}\n onClose={() => {\n if (flow.status === 'failed')\n setError(flow.error ?? 'The sign-in did not finish. Try again whenever you like.');\n setFlow(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction WorkspaceStep({ pending }: { pending: readonly OnboardingSetupStep[] }) {\n const [scanning, setScanning] = useState(true);\n const [found, setFound] = useState<readonly OnboardingFolder[]>([]);\n const [name, setName] = useState('');\n const [browsing, setBrowsing] = useState(false);\n const [error, setError] = useState('');\n const busy = useStore(workspaceAdmissionStore, (state) => state.pending);\n\n useEffect(() => {\n let stale = false;\n void listPoFolders().then((paths) => {\n if (stale) return;\n // Only the first is ticked, so a busy home folder never admits a pile of workspaces by surprise.\n setFound(paths.map((path, index) => ({ path, checked: index === 0 })));\n setScanning(false);\n });\n return () => {\n stale = true;\n };\n }, []);\n\n const pick = (path: string): void => {\n setFound((current) =>\n current.some((folder) => folder.path === path)\n ? current.map((folder) => (folder.path === path ? { ...folder, checked: true } : folder))\n : [...current, { path, checked: true }],\n );\n setBrowsing(false);\n };\n\n // The first admission ends this step, so the rest finish in the background.\n const add = async (): Promise<void> => {\n setError('');\n const admissions = [\n ...found\n .filter((folder) => folder.checked)\n .map((folder) => ({ name: folderName(folder.path), path: folder.path })),\n ...(name.trim() === '' ? [] : [{ name: name.trim() }]),\n ];\n for (const admission of admissions) {\n const result = await admitDashboardWorkspace(admission);\n if (result !== undefined) {\n setError(result.error);\n return;\n }\n }\n };\n\n return (\n <ElegantOnboardingWorkspace\n pending={pending}\n scanning={scanning}\n found={found}\n name={name}\n busy={busy}\n {...(error === '' ? {} : { error })}\n {...(browsing ? { browser: <ElegantFolderBrowser listDirectory={listDirectory} onSelect={pick} /> } : {})}\n onToggle={(path, checked) =>\n setFound((current) => current.map((folder) => (folder.path === path ? { ...folder, checked } : folder)))\n }\n onNameChange={setName}\n onBrowse={() => setBrowsing((open) => !open)}\n onAdd={() => void add()}\n />\n );\n}\n\nfunction ReadyStep({ model }: { model: string }) {\n const navigate = useNavigate();\n const workspace = useStore(workspacesStore, (state) => state.byId[state.selectedId ?? state.order[0] ?? '']);\n const [draft, setDraft] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState('');\n if (workspace === undefined) return null;\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (text === '' || busy) return;\n setError('');\n setBusy(true);\n const outcome = await createPlainSession(workspace.id);\n if (!('sessionId' in outcome)) {\n setBusy(false);\n setError(outcome.error);\n return;\n }\n updateComposerState(outcome.sessionId, (state) => ({ ...state, draft: text, caret: text.length }));\n submitWhenReady(outcome.sessionId);\n await navigate({ to: '/session/$sessionId', params: { sessionId: outcome.sessionId } });\n };\n\n return (\n <ElegantOnboardingReady\n model={model}\n root={workspace.root}\n draft={draft}\n busy={busy}\n {...(error === '' ? {} : { error })}\n suggestions={SUGGESTIONS}\n onDraftChange={setDraft}\n onSend={() => void send()}\n />\n );\n}\n\n/**\n * First run in place of the empty welcome: only the setup steps still missing, then the\n * first task. Finished steps are read from the hub, so nothing new is persisted.\n */\nexport function ElegantOnboardingFlow() {\n const updateRequired = useStore(sessionsStore, (state) => state.updateRequired);\n const hydrated = useStore(workspacesStore, (state) => state.hydrated);\n const hasWorkspace = useStore(workspacesStore, (state) => state.order.length > 0);\n const [providers, setProviders] = useState<readonly ProviderAuthSummary[] | 'unavailable' | null>(null);\n const [steps, setSteps] = useState<readonly OnboardingSetupStep[] | null>(null);\n\n const reload = useCallback((): void => {\n void listProviders().then((result) => setProviders('providers' in result ? result.providers : 'unavailable'));\n }, []);\n useEffect(reload, [reload]);\n\n // An outdated app cannot start sessions at all; the plain welcome says why.\n if (updateRequired) return <WelcomePanel />;\n if (providers === null || !hydrated) return null;\n\n const models = providers === 'unavailable' ? [] : providers.filter((provider) => provider.kind !== 'po-feature');\n const connected = models.find((provider) => provider.authenticated !== undefined);\n // An unreadable provider list must not trap anyone in setup, so it counts as done.\n const pending: OnboardingSetupStep[] = [\n ...(providers === 'unavailable' || connected !== undefined ? [] : ['model' as const]),\n ...(hasWorkspace ? [] : ['workspace' as const]),\n ];\n\n if (steps === null && pending.length > 0) {\n return <ElegantOnboardingWelcome pending={pending} onBegin={() => setSteps(pending)} />;\n }\n if (pending[0] === 'model') return <ModelStep pending={steps ?? pending} models={models} onConnected={reload} />;\n if (pending[0] === 'workspace') return <WorkspaceStep pending={steps ?? pending} />;\n return <ReadyStep model={connected?.name ?? 'your model'} />;\n}\n","import { useDashboardRoute } from '@agimon-ai/po-web-dashboard';\nimport { pluginActivityGroups, webTabs } from '@agimon-ai/po-web-dashboard';\nimport { useSessionMcp } from '@agimon-ai/po-web-dashboard';\nimport { sessionsStore, useActiveSessionMeta, useNoSessions } from '@agimon-ai/po-web-dashboard';\nimport { useActiveSession } from '@agimon-ai/po-web-dashboard';\nimport { findTransientTab, transientTabsStore } from '@agimon-ai/po-web-dashboard';\nimport { setDockOpen, uiStore } from '@agimon-ai/po-web-dashboard';\nimport { usePluginSlotProps } from '@agimon-ai/po-web-dashboard';\nimport { useWebPluginRegistry } from '@agimon-ai/po-web-dashboard';\nimport { workspacesStore } from '@agimon-ai/po-web-dashboard';\nimport { SessionMcp } from '@agimon-ai/po-web-dashboard/views';\nimport { ActivityDock } from '@agimon-ai/po-web-dashboard/views';\nimport { SelectionBar } from '@agimon-ai/po-web-dashboard/views';\nimport { Composer } from '@agimon-ai/po-web-dashboard/views';\nimport { Timeline } from '@agimon-ai/po-web-dashboard/views';\nimport { HomePage, PluginPage } from '@agimon-ai/po-web-dashboard/views';\nimport { SessionRailDialogs } from '@agimon-ai/po-web-dashboard/views';\nimport { useSessionRail } from '@agimon-ai/po-web-dashboard/views';\nimport { TopBar } from '@agimon-ai/po-web-dashboard/views';\nimport { useStore } from '@tanstack/react-store';\nimport { useState } from 'react';\n\nimport type { LayoutProps } from '../_types/layout';\nimport { ElegantLayout } from './ElegantLayout';\nimport { ElegantOnboardingFlow } from './ElegantOnboardingFlow';\n\n/**\n * Only this frame follows the rail, which changes with every session's summary. The conversation\n * slots keep their element identity, so another session's push skips the focused session's views.\n */\nexport function ElegantRailedLayout({ onDismiss, ...props }: Omit<LayoutProps, 'rail'> & { onDismiss: () => void }) {\n return <ElegantLayout {...props} rail={useSessionRail({ onDismiss })} />;\n}\n\nexport function ElegantConversation() {\n useWebPluginRegistry();\n const dockOpen = useStore(uiStore, (state) => state.dockOpen);\n const [railOpen, setRailOpen] = useState(false);\n const [mobileActivityOpen, setMobileActivityOpen] = useState(false);\n const { kind, sessionId, tabId, pageId } = useDashboardRoute();\n const slotProps = usePluginSlotProps(sessionId ?? null);\n const sessionWorkspaceId = useStore(sessionsStore, (state) =>\n sessionId === undefined ? undefined : state.byId[sessionId]?.summary.workspaceId,\n );\n const selectedWorkspaceId = useStore(workspacesStore, (state) => state.selectedId);\n const workspaceId = sessionId === undefined ? (selectedWorkspaceId ?? undefined) : sessionWorkspaceId;\n const focusedId = useStore(sessionsStore, (state) => state.activeId);\n const mcp = useSessionMcp(workspaceId, focusedId ?? undefined);\n const mcpView = tabId === 'mcp';\n const mcpEnabled = mcp.snapshot?.enabled === true || mcpView;\n const transferLabel = useStore(sessionsStore, (state) => {\n if (state.transferringToId === null) return null;\n return state.byId[state.transferringToId]?.summary.name ?? 'destination session';\n });\n const noSessions = useNoSessions();\n const activeMeta = useActiveSessionMeta();\n const dormantMeta = activeMeta?.summary.dormant === true ? activeMeta : null;\n const dialogId = useActiveSession((state) => state.dialog?.id ?? null);\n // A declared tab first, then one a plugin opened at runtime for this session.\n // Session plugin compositions replace the builtin plugin module after verification.\n // Refresh activity-owned tabs from the active registry so a tab opened during that\n // handoff does not keep rendering the retired module's disconnected stores.\n const storedTransientTab = useStore(transientTabsStore, (state) => findTransientTab(state, sessionId, tabId));\n const transientTab =\n storedTransientTab === undefined\n ? undefined\n : (pluginActivityGroups(sessionId ?? null)\n .map((group) => group.transientTab?.())\n .find((candidate) => candidate?.id === storedTransientTab.id) ?? storedTransientTab);\n const tab =\n (tabId === undefined ? undefined : webTabs(sessionId ?? null).find((entry) => entry.id === tabId)) ?? transientTab;\n // Only a runtime tab carries composer context; a declared tab with the same id wins and carries none.\n const composerContext = tab === transientTab ? transientTab?.composerContext : undefined;\n\n // Both side panels are temporary drawers on mobile. Route changes can also\n // come from plugin navigation, so they dismiss the drawers even when no\n // drawer item produced the navigation event directly. A modal must not\n // compete with the mobile activity drawer for the viewport either, so an\n // opening dialog closes it. Both are adjustments made while rendering the\n // change rather than in an effect, so no extra pass paints the open drawer.\n const routeKey = `${kind}\\u0000${sessionId ?? ''}\\u0000${tabId ?? ''}\\u0000${pageId ?? ''}`;\n const [lastRouteKey, setLastRouteKey] = useState(routeKey);\n if (lastRouteKey !== routeKey) {\n setLastRouteKey(routeKey);\n setRailOpen(false);\n setMobileActivityOpen(false);\n }\n\n const [lastDialogId, setLastDialogId] = useState(dialogId);\n if (lastDialogId !== dialogId) {\n setLastDialogId(dialogId);\n if (dialogId !== null) {\n setMobileActivityOpen(false);\n setRailOpen(false);\n }\n }\n\n const closeActivity = (): void => {\n if (mobileActivityOpen) setMobileActivityOpen(false);\n else setDockOpen(false);\n };\n // A plugin page or Home keeps the rail and fills the main area; it draws its own header.\n const page =\n pageId !== undefined ? (\n <PluginPage pageId={pageId} sessionId={null} navigationToggle=\"always\" onShowSessions={() => setRailOpen(true)} />\n ) : kind === 'home' && !noSessions ? (\n <HomePage navigationToggle=\"always\" onShowSessions={() => setRailOpen(true)} />\n ) : null;\n return (\n <div data-testid=\"cockpit\" className=\"h-full min-w-0 overflow-hidden\">\n <ElegantRailedLayout\n view={page || mcpView || tab ? 'panel' : noSessions ? 'welcome' : 'conversation'}\n navigationOpen={railOpen}\n desktopActivityOpen={dockOpen}\n mobileActivityOpen={mobileActivityOpen}\n onNavigationOpenChange={setRailOpen}\n onDesktopActivityOpenChange={setDockOpen}\n onMobileActivityOpenChange={setMobileActivityOpen}\n onDismiss={() => setRailOpen(false)}\n slots={{\n header: (options) =>\n page ? null : (\n <TopBar\n {...options}\n view={mcpView ? 'mcp' : (tab?.id ?? 'conversation')}\n mcpEnabled={mcpEnabled}\n onShowSessions={() => {\n setMobileActivityOpen(false);\n setRailOpen(true);\n }}\n onShowActivity={() => {\n setRailOpen(false);\n setMobileActivityOpen(true);\n }}\n />\n ),\n notices:\n transferLabel === null ? null : (\n <output\n data-testid=\"voice-transfer-transition\"\n className=\"border-b border-po-cyan/30 bg-po-cyan/10 px-4 py-2 text-center text-base font-medium text-po-cyan\"\n >\n Transferring voice to {transferLabel}...\n </output>\n ),\n content: page ? (\n page\n ) : mcpView ? (\n <SessionMcp key={sessionId} state={mcp} />\n ) : tab ? (\n <tab.panel {...slotProps} />\n ) : noSessions ? (\n <ElegantOnboardingFlow />\n ) : (\n <Timeline />\n ),\n // MCP history is a read-only surface, not an alternative prompt composer.\n composer:\n page || mcpView ? null : tab ? (\n tab.retainComposer === true ? (\n <Composer composerContext={composerContext} />\n ) : null\n ) : noSessions ? null : (\n <Composer />\n ),\n controls:\n !page && !mcpView && (!tab || tab.targetSessionId !== undefined) && !noSessions && dormantMeta === null ? (\n <SelectionBar />\n ) : null,\n activity: page ? null : (\n <ActivityDock\n mcp={mcp}\n scope={\n tab === transientTab && transientTab?.targetSessionId !== undefined\n ? transientTab.activityScope\n : undefined\n }\n onClose={closeActivity}\n onOpenContent={() => setMobileActivityOpen(false)}\n />\n ),\n }}\n />\n <SessionRailDialogs />\n </div>\n );\n}\n","import { ArrowLeftIcon, Button, NavTab } from '@agimon-ai/po-web-components';\nimport { useDashboardRoute, useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { refreshWebPluginCompositions } from '@agimon-ai/po-web-dashboard';\nimport {\n DEFAULT_REPOSITORY_SETTINGS_SECTION,\n DEFAULT_SETTINGS_SECTION,\n settingsSection,\n} from '@agimon-ai/po-web-dashboard';\nimport { sessionsStore } from '@agimon-ai/po-web-dashboard';\nimport { useWebPluginRegistry } from '@agimon-ai/po-web-dashboard';\nimport { AppearanceSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ContributedSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ImageSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { NotificationSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { PluginSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { ProviderSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { RemoteControlSettings } from '@agimon-ai/po-web-dashboard/views';\nimport { RepositoryWorkspace } from '@agimon-ai/po-web-dashboard/views';\nimport { SettingsMenu } from '@agimon-ai/po-web-dashboard/views';\nimport { SettingsPanelHost } from '@agimon-ai/po-web-dashboard/views';\nimport { Link, useNavigate } from '@tanstack/react-router';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\n/** Settings have their own page frame, independent of session navigation. */\nexport function ElegantSettings() {\n useWebPluginRegistry();\n const { section, workspaceId } = useDashboardRoute();\n const navigate = useNavigate();\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const [loadError, setLoadError] = useState<string>();\n const [repositoryReady, setRepositoryReady] = useState(false);\n const [templateTarget, setTemplateTarget] = useDashboardState('settings/template-target', 'global');\n const current = settingsSection(section);\n const workspace = current?.workspace ?? (section?.startsWith('repository-') ? 'repository' : 'general');\n\n useEffect(() => {\n if (current) return;\n if (workspace === 'repository' && !repositoryReady) return;\n let cancelled = false;\n void refreshWebPluginCompositions()\n .then(() => {\n if (cancelled || settingsSection(section)) return;\n void navigate({\n to: '/settings/$section',\n params: { section: DEFAULT_SETTINGS_SECTION },\n search: { workspace: workspaceId },\n replace: true,\n });\n })\n .catch((error: unknown) => {\n if (!cancelled) setLoadError(error instanceof Error ? error.message : String(error));\n });\n return () => {\n cancelled = true;\n };\n }, [current, section, navigate, workspace, workspaceId, repositoryReady]);\n\n return (\n <div data-testid=\"settings\" className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-po-bg\">\n <header className=\"grid shrink-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-2 gap-y-2 border-b border-po-border px-3 py-2 sm:h-14 sm:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] sm:px-6 sm:py-0\">\n <h1 className=\"order-1 min-w-0 truncate text-xl font-semibold text-po-hi sm:order-none\">Settings</h1>\n <nav\n className=\"order-3 col-span-2 flex w-full items-center gap-1 rounded-lg bg-po-panel p-1 sm:order-none sm:col-span-1 sm:w-auto\"\n aria-label=\"settings workspace\"\n >\n <NavTab\n asChild\n active={workspace === 'general'}\n className=\"min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none\"\n aria-current={workspace === 'general' ? 'true' : undefined}\n >\n <Link\n to=\"/settings/$section\"\n params={{ section: DEFAULT_SETTINGS_SECTION }}\n search={{ workspace: workspaceId }}\n data-testid=\"settings-workspace-general\"\n >\n General\n </Link>\n </NavTab>\n <NavTab\n asChild\n active={workspace === 'repository'}\n className=\"min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none\"\n aria-current={workspace === 'repository' ? 'true' : undefined}\n >\n <Link\n to=\"/settings/$section\"\n params={{ section: DEFAULT_REPOSITORY_SETTINGS_SECTION }}\n search={{ workspace: workspaceId }}\n data-testid=\"settings-workspace-repository\"\n >\n Workspaces\n </Link>\n </NavTab>\n </nav>\n <Button asChild variant=\"outline\" size=\"sm\" className=\"order-2 gap-1.5 sm:order-none sm:justify-self-end\">\n {activeId !== null ? (\n <Link to=\"/session/$sessionId\" params={{ sessionId: activeId }} data-testid=\"settings-close\">\n <ArrowLeftIcon aria-hidden className=\"size-3.5\" />\n <span className=\"sm:hidden\">Back</span>\n <span className=\"hidden sm:inline\">Back to session</span>\n </Link>\n ) : (\n <Link to=\"/\" data-testid=\"settings-close\">\n <ArrowLeftIcon aria-hidden className=\"size-3.5\" />\n Back\n </Link>\n )}\n </Button>\n </header>\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {workspace === 'repository' ? (\n <RepositoryWorkspace\n key={workspaceId ?? 'remembered-workspace'}\n current={current ?? { id: section ?? '', label: '', detail: '', workspace: 'repository' }}\n initialRepositoryId={workspaceId}\n onRepositoryChange={(nextWorkspaceId) => {\n void navigate({\n to: '/settings/$section',\n params: { section: current?.id ?? section ?? DEFAULT_REPOSITORY_SETTINGS_SECTION },\n search: { workspace: nextWorkspaceId },\n replace: true,\n });\n }}\n onReady={setRepositoryReady}\n />\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col lg:flex-row\">\n <SettingsMenu active={current?.id} workspace=\"general\" repositoryId={workspaceId} />\n <section\n data-testid=\"settings-content\"\n className=\"min-w-0 flex-1 overflow-y-auto px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10\"\n >\n {/* One column width for every page, so moving between sections does\n not re-flow the reading line. */}\n <div className=\"mx-auto flex w-full max-w-5xl flex-col gap-8\">\n {!current && loadError ? <p role=\"alert\">{loadError}</p> : null}\n {current?.id === 'providers' ? <ProviderSettings /> : null}\n {current?.id === 'appearance' ? (\n <AppearanceSettings templateTarget={templateTarget} onTemplateTargetChange={setTemplateTarget} />\n ) : null}\n {current?.id === 'notifications' ? <NotificationSettings /> : null}\n {current?.id === 'images' ? <ImageSettings /> : null}\n {current?.id === 'remote' ? <RemoteControlSettings /> : null}\n {current?.id === 'plugins' ? <PluginSettings /> : null}\n {current?.contribution === undefined ? null : (\n <ContributedSettings section={current.contribution} scope=\"global\" />\n )}\n {current?.panel === undefined ? null : <SettingsPanelHost panel={current.panel} />}\n </div>\n </section>\n </div>\n )}\n </main>\n </div>\n );\n}\n","import {\n useDashboardRoute,\n sessionsStore,\n HOST_SLOTS,\n DashboardRendererProvider,\n type DashboardRenderers,\n watchDashboardTranscript,\n} from '@agimon-ai/po-web-dashboard';\nimport {\n DialogOverlay,\n RefusedCard,\n CommandPalette,\n PluginSurface,\n RemoteAccessDialog,\n PairingApprovalDialog,\n ThreadView,\n SessionActivity,\n SessionTranscriptView,\n} from '@agimon-ai/po-web-dashboard/views';\nimport { useStore } from '@tanstack/react-store';\n\nimport { ElegantConversation } from './ElegantConversation';\nimport { ElegantSettings } from './ElegantSettings';\n\nconst renderers: DashboardRenderers = {\n thread: (id, threadId, options) => <ThreadView sessionId={id} threadId={threadId} options={options} />,\n activity: (id, open) => <SessionActivity sessionId={id} onOpenConversation={open} />,\n transcript: (id, options) => (\n <SessionTranscriptView sessionId={id} options={options} watch={watchDashboardTranscript} />\n ),\n};\n\nexport function ElegantDashboard() {\n const route = useDashboardRoute();\n const sessionId = useStore(sessionsStore, (state) => state.activeId);\n return (\n <DashboardRendererProvider value={renderers}>\n {route.kind === 'settings' ? <ElegantSettings /> : <ElegantConversation />}\n <DialogOverlay />\n <RefusedCard />\n <CommandPalette />\n <PluginSurface slot={HOST_SLOTS.overlay} sessionId={sessionId} />\n <RemoteAccessDialog />\n <PairingApprovalDialog />\n </DashboardRendererProvider>\n );\n}\n","import type { WebTemplateFile } from '@agimon-ai/po-core/web';\n\nimport { ElegantDashboard } from '../_components/ElegantDashboard';\n\nexport const elegantTemplate = {\n label: 'Elegant',\n description: 'A focused conversation with collapsible navigation, session controls, and activity.',\n contractVersion: 2,\n app: ElegantDashboard,\n} satisfies WebTemplateFile;\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from './_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from '../../../(frontend)/template/_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","import { defineWebTemplate } from '@agimon-ai/po-core/web';\n\nimport { elegantTemplate } from '../../../../(frontend)/template/_lib/definition';\n\nexport default defineWebTemplate(elegantTemplate);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport templatePoTemplateElegant from '../src/extensions/(frontend)/template/po-template-elegant.web';\nimport templatePoTemplateElegant2 from '../src/extensions/workspaces/(frontend)/template/po-template-elegant.web';\nimport templatePoTemplateElegant3 from '../src/extensions/workspaces/sessions/(frontend)/template/po-template-elegant.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'template-elegant',\n global: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant)]; },\n },\n workspace: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant2)]; },\n },\n session: {\n get templates(): WebPluginContributions['templates'] { return [via({ id: 'po-template-elegant' }, templatePoTemplateElegant3)]; },\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-elegant",
3
- "version": "0.0.0-alpha.75",
3
+ "version": "0.0.0-alpha.76",
4
4
  "description": "Elegant chat-first template for the Po web client.",
5
5
  "keywords": [
6
6
  "ai",
@@ -38,15 +38,15 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@agimon-ai/po-core": "0.0.0-alpha.75",
42
- "@agimon-ai/po-web-components": "0.0.0-alpha.75",
43
- "@agimon-ai/po-web-dashboard": "0.0.0-alpha.75",
41
+ "@agimon-ai/po-core": "0.0.0-alpha.76",
42
+ "@agimon-ai/po-web-components": "0.0.0-alpha.76",
43
+ "@agimon-ai/po-web-dashboard": "0.0.0-alpha.76",
44
44
  "@tanstack/react-router": "1.170.45",
45
45
  "@tanstack/react-store": "0.11.2"
46
46
  },
47
47
  "devDependencies": {
48
- "@agimon-ai/po-build": "0.0.0-alpha.75",
49
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.75",
48
+ "@agimon-ai/po-build": "0.0.0-alpha.76",
49
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.76",
50
50
  "@earendil-works/pi-coding-agent": "1.4.0",
51
51
  "@types/node": "26.6.5",
52
52
  "@types/react": "19.3.0",