@agimon-ai/po-template-elegant 0.0.0-alpha.2 → 0.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/web.mjs +66 -66
- package/dist/extensions/web.mjs.map +1 -1
- package/package.json +10 -10
package/dist/extensions/web.mjs
CHANGED
|
@@ -31,7 +31,7 @@ function ElegantFolderBrowser({ start, listDirectory, onSelect }) {
|
|
|
31
31
|
}, [target, listDirectory]);
|
|
32
32
|
return /* @__PURE__ */ jsxs("div", {
|
|
33
33
|
"data-testid": "folder-browser",
|
|
34
|
-
className: "flex flex-col gap-1 rounded-lg border border-
|
|
34
|
+
className: "flex flex-col gap-1 rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5",
|
|
35
35
|
children: [
|
|
36
36
|
/* @__PURE__ */ jsxs("div", {
|
|
37
37
|
className: "flex items-center gap-1 px-1",
|
|
@@ -47,7 +47,7 @@ function ElegantFolderBrowser({ start, listDirectory, onSelect }) {
|
|
|
47
47
|
children: /* @__PURE__ */ jsx(ChevronUpIcon, { className: "h-3 w-3" })
|
|
48
48
|
}),
|
|
49
49
|
/* @__PURE__ */ jsx("span", {
|
|
50
|
-
className: "min-w-0 flex-1 truncate text-sm text-
|
|
50
|
+
className: "min-w-0 flex-1 truncate text-sm text-po-dim",
|
|
51
51
|
title: listing?.path,
|
|
52
52
|
children: listing?.path ?? "loading…"
|
|
53
53
|
}),
|
|
@@ -62,7 +62,7 @@ function ElegantFolderBrowser({ start, listDirectory, onSelect }) {
|
|
|
62
62
|
]
|
|
63
63
|
}),
|
|
64
64
|
error ? /* @__PURE__ */ jsx("p", {
|
|
65
|
-
className: "px-2 py-1 text-sm text-
|
|
65
|
+
className: "px-2 py-1 text-sm text-po-red",
|
|
66
66
|
children: error
|
|
67
67
|
}) : null,
|
|
68
68
|
/* @__PURE__ */ jsxs("div", {
|
|
@@ -70,7 +70,7 @@ function ElegantFolderBrowser({ start, listDirectory, onSelect }) {
|
|
|
70
70
|
"aria-label": "folders",
|
|
71
71
|
className: "max-h-40 overflow-y-auto",
|
|
72
72
|
children: [listing !== null && listing.directories.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
73
|
-
className: "px-2 py-1 text-sm text-
|
|
73
|
+
className: "px-2 py-1 text-sm text-po-dim",
|
|
74
74
|
children: "no folders here"
|
|
75
75
|
}) : null, listing?.directories.map((directory) => /* @__PURE__ */ jsx(OptionRow, {
|
|
76
76
|
density: "compact",
|
|
@@ -149,7 +149,7 @@ function ElegantAddWorkspaceDialog({ suggestedPaths, actions }) {
|
|
|
149
149
|
htmlFor: "add-workspace-name",
|
|
150
150
|
className: "flex flex-col gap-1",
|
|
151
151
|
children: [/* @__PURE__ */ jsx("span", {
|
|
152
|
-
className: "text-base font-medium text-
|
|
152
|
+
className: "text-base font-medium text-po-dim",
|
|
153
153
|
children: "name"
|
|
154
154
|
}), /* @__PURE__ */ jsx(Input, {
|
|
155
155
|
id: "add-workspace-name",
|
|
@@ -170,9 +170,9 @@ function ElegantAddWorkspaceDialog({ suggestedPaths, actions }) {
|
|
|
170
170
|
htmlFor: "add-workspace-root",
|
|
171
171
|
className: "flex flex-col gap-1",
|
|
172
172
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
173
|
-
className: "text-base font-medium text-
|
|
173
|
+
className: "text-base font-medium text-po-dim",
|
|
174
174
|
children: ["folder ", /* @__PURE__ */ jsx("span", {
|
|
175
|
-
className: "text-
|
|
175
|
+
className: "text-po-dim",
|
|
176
176
|
children: "(optional; type a path or browse)"
|
|
177
177
|
})]
|
|
178
178
|
}), /* @__PURE__ */ jsxs("span", {
|
|
@@ -219,7 +219,7 @@ function ElegantAddWorkspaceDialog({ suggestedPaths, actions }) {
|
|
|
219
219
|
role: "listbox",
|
|
220
220
|
"aria-label": "matching directories",
|
|
221
221
|
"data-testid": "add-workspace-suggestions",
|
|
222
|
-
className: "max-h-40 overflow-y-auto rounded-lg border border-
|
|
222
|
+
className: "max-h-40 overflow-y-auto rounded-lg border border-po-border-soft bg-po-panel/40 p-1.5",
|
|
223
223
|
children: suggestions.map((directory, index) => /* @__PURE__ */ jsx(OptionRow, {
|
|
224
224
|
density: "compact",
|
|
225
225
|
active: index === highlight,
|
|
@@ -242,11 +242,11 @@ function ElegantAddWorkspaceDialog({ suggestedPaths, actions }) {
|
|
|
242
242
|
}) : null,
|
|
243
243
|
trimmedPath === "" && shownName.trim() !== "" ? /* @__PURE__ */ jsxs("p", {
|
|
244
244
|
"data-testid": "add-workspace-default-hint",
|
|
245
|
-
className: "text-sm text-
|
|
245
|
+
className: "text-sm text-po-dim",
|
|
246
246
|
children: ["creates ~/.po/workspace/", shownName.trim()]
|
|
247
247
|
}) : null,
|
|
248
248
|
error ? /* @__PURE__ */ jsx("pre", {
|
|
249
|
-
className: "max-h-28 overflow-y-auto rounded border border-
|
|
249
|
+
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",
|
|
250
250
|
children: error
|
|
251
251
|
}) : null,
|
|
252
252
|
/* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
|
|
@@ -286,12 +286,12 @@ function ElegantPendingSetup({ sessionId, setup, actions }) {
|
|
|
286
286
|
};
|
|
287
287
|
return /* @__PURE__ */ jsxs("div", {
|
|
288
288
|
"data-testid": `pending-session-${setup.id}`,
|
|
289
|
-
className: "ml-9 flex flex-col gap-0.5 rounded-lg border border-dashed border-
|
|
289
|
+
className: "ml-9 flex flex-col gap-0.5 rounded-lg border border-dashed border-po-border-soft px-3 py-2",
|
|
290
290
|
children: [
|
|
291
291
|
/* @__PURE__ */ jsxs("div", {
|
|
292
292
|
className: "flex items-center justify-between gap-2",
|
|
293
293
|
children: [/* @__PURE__ */ jsx("span", {
|
|
294
|
-
className: "truncate text-base font-semibold text-
|
|
294
|
+
className: "truncate text-base font-semibold text-po-hi",
|
|
295
295
|
children: setup.name
|
|
296
296
|
}), /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
297
297
|
asChild: true,
|
|
@@ -310,17 +310,17 @@ function ElegantPendingSetup({ sessionId, setup, actions }) {
|
|
|
310
310
|
}) })] })]
|
|
311
311
|
}),
|
|
312
312
|
/* @__PURE__ */ jsx("p", {
|
|
313
|
-
className: setup.failed ? "text-sm text-
|
|
313
|
+
className: setup.failed ? "text-sm text-po-red" : "text-sm text-po-dim",
|
|
314
314
|
children: setup.status
|
|
315
315
|
}),
|
|
316
316
|
setup.recovery ? /* @__PURE__ */ jsx("p", {
|
|
317
317
|
role: setup.failed ? "alert" : void 0,
|
|
318
|
-
className: "text-sm text-
|
|
318
|
+
className: "text-sm text-po-dim",
|
|
319
319
|
children: setup.recovery
|
|
320
320
|
}) : null,
|
|
321
321
|
error ? /* @__PURE__ */ jsx("p", {
|
|
322
322
|
role: "alert",
|
|
323
|
-
className: "text-sm text-
|
|
323
|
+
className: "text-sm text-po-red",
|
|
324
324
|
children: error
|
|
325
325
|
}) : null
|
|
326
326
|
]
|
|
@@ -342,7 +342,7 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
342
342
|
};
|
|
343
343
|
const { active } = session;
|
|
344
344
|
const error = removeError || session.error;
|
|
345
|
-
const tileClass = active ? "rounded-lg border border-
|
|
345
|
+
const tileClass = active ? "rounded-lg border border-po-edge-green bg-po-tint-green px-3 hover:bg-po-tint-green" : "rounded-lg border border-transparent px-3 hover:bg-po-panel";
|
|
346
346
|
const failed = session.status.startsWith("failed") || session.status.includes(" failed");
|
|
347
347
|
const running = session.status.startsWith("running");
|
|
348
348
|
const commitRename = () => {
|
|
@@ -370,7 +370,7 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
370
370
|
src: session.profile.avatarUrl,
|
|
371
371
|
alt: ""
|
|
372
372
|
}) : null, /* @__PURE__ */ jsx(AvatarFallback, {
|
|
373
|
-
className: "bg-
|
|
373
|
+
className: "bg-po-tint-green text-xs font-semibold text-po-green",
|
|
374
374
|
children: session.profile?.initials ?? "PO"
|
|
375
375
|
})]
|
|
376
376
|
}), /* @__PURE__ */ jsxs("span", {
|
|
@@ -380,27 +380,27 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
380
380
|
children: [
|
|
381
381
|
session.nested && session.provenance === "workflow-session" ? /* @__PURE__ */ jsx(ActivityIcon, {
|
|
382
382
|
"aria-label": "workflow session",
|
|
383
|
-
className: `mt-1 size-3 shrink-0 ${active ? "text-
|
|
383
|
+
className: `mt-1 size-3 shrink-0 ${active ? "text-po-green" : "text-po-faint"}`
|
|
384
384
|
}) : session.nested && session.provenance ? /* @__PURE__ */ jsx(ForkIcon, {
|
|
385
385
|
"aria-label": session.provenance === "worktree" ? "automatic per-conversation worktree" : session.provenance,
|
|
386
|
-
className: `mt-1 size-3 shrink-0 ${active ? "text-
|
|
386
|
+
className: `mt-1 size-3 shrink-0 ${active ? "text-po-green" : "text-po-faint"}`
|
|
387
387
|
}) : null,
|
|
388
388
|
/* @__PURE__ */ jsx("span", {
|
|
389
|
-
className: "min-w-0 flex-1 text-base font-semibold break-words text-
|
|
389
|
+
className: "min-w-0 flex-1 text-base font-semibold break-words text-po-hi",
|
|
390
390
|
children: session.name || "Untitled"
|
|
391
391
|
}),
|
|
392
392
|
session.ordinal <= 9 ? /* @__PURE__ */ jsx("span", {
|
|
393
393
|
title: `press ${String(session.ordinal)} to focus`,
|
|
394
|
-
className: "grid size-5 shrink-0 place-items-center rounded-full bg-
|
|
394
|
+
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",
|
|
395
395
|
children: session.ordinal
|
|
396
396
|
}) : null
|
|
397
397
|
]
|
|
398
398
|
}), /* @__PURE__ */ jsxs("span", {
|
|
399
|
-
className: `flex min-w-0 items-start gap-1.5 text-sm leading-snug ${failed ? "text-
|
|
399
|
+
className: `flex min-w-0 items-start gap-1.5 text-sm leading-snug ${failed ? "text-po-red" : running ? "text-po-yellow" : active ? "text-po-text" : "text-po-dim"}`,
|
|
400
400
|
children: [session.awaitingInput ? /* @__PURE__ */ jsx(AlertIcon, {
|
|
401
401
|
"data-testid": "session-awaiting-input",
|
|
402
402
|
"aria-label": "Waiting for your input",
|
|
403
|
-
className: "mt-0.5 size-3 shrink-0 text-
|
|
403
|
+
className: "mt-0.5 size-3 shrink-0 text-po-magenta"
|
|
404
404
|
}) : running ? /* @__PURE__ */ jsx(LoaderIcon, {
|
|
405
405
|
"aria-hidden": true,
|
|
406
406
|
className: "mt-0.5 size-3 shrink-0 animate-spin"
|
|
@@ -417,22 +417,22 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
417
417
|
}),
|
|
418
418
|
session.git ? /* @__PURE__ */ jsxs("span", {
|
|
419
419
|
"data-testid": "session-branch",
|
|
420
|
-
className: "flex min-w-0 items-center gap-1.5 pl-10.5 text-sm text-
|
|
420
|
+
className: "flex min-w-0 items-center gap-1.5 pl-10.5 text-sm text-po-dim",
|
|
421
421
|
children: [
|
|
422
|
-
/* @__PURE__ */ jsx(BranchIcon, { className: `size-3 shrink-0 ${active ? "text-
|
|
422
|
+
/* @__PURE__ */ jsx(BranchIcon, { className: `size-3 shrink-0 ${active ? "text-po-green" : ""}` }),
|
|
423
423
|
/* @__PURE__ */ jsx("span", {
|
|
424
424
|
className: "truncate font-mono",
|
|
425
425
|
children: session.git.branch
|
|
426
426
|
}),
|
|
427
427
|
session.git.dirty ? /* @__PURE__ */ jsx("span", {
|
|
428
|
-
className: "shrink-0 text-
|
|
428
|
+
className: "shrink-0 text-po-yellow",
|
|
429
429
|
children: "modified"
|
|
430
430
|
}) : null
|
|
431
431
|
]
|
|
432
432
|
}) : null,
|
|
433
433
|
error ? /* @__PURE__ */ jsx("span", {
|
|
434
434
|
"data-testid": "session-error",
|
|
435
|
-
className: "line-clamp-3 text-sm break-words text-
|
|
435
|
+
className: "line-clamp-3 text-sm break-words text-po-red",
|
|
436
436
|
children: error
|
|
437
437
|
}) : null
|
|
438
438
|
] });
|
|
@@ -466,7 +466,7 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
466
466
|
size: "icon",
|
|
467
467
|
"data-testid": `session-menu-${session.id}`,
|
|
468
468
|
title: "session actions",
|
|
469
|
-
className: "text-
|
|
469
|
+
className: "text-po-dim hover:text-po-hi",
|
|
470
470
|
children: /* @__PURE__ */ jsx(KebabIcon, { className: "h-3 w-3" })
|
|
471
471
|
})
|
|
472
472
|
}), /* @__PURE__ */ jsxs(DropdownMenuContent, {
|
|
@@ -552,7 +552,7 @@ function ElegantSessionCard({ session, actions }) {
|
|
|
552
552
|
children: [/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: "remove session" }) }), /* @__PURE__ */ jsxs(DialogBody, { children: [/* @__PURE__ */ jsxs(DialogDescription, { children: [
|
|
553
553
|
"this stops ",
|
|
554
554
|
/* @__PURE__ */ jsx("span", {
|
|
555
|
-
className: "font-semibold text-
|
|
555
|
+
className: "font-semibold text-po-hi",
|
|
556
556
|
children: session.name || "untitled"
|
|
557
557
|
}),
|
|
558
558
|
" and removes it from the list. anything it is running ends now, but its saved history remains available to resume."
|
|
@@ -603,19 +603,19 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
603
603
|
className: "flex flex-col gap-1.5",
|
|
604
604
|
children: [
|
|
605
605
|
/* @__PURE__ */ jsxs("div", {
|
|
606
|
-
className: "flex min-w-0 items-start gap-2.5 rounded-md px-2 py-1 transition-colors hover:bg-
|
|
606
|
+
className: "flex min-w-0 items-start gap-2.5 rounded-md px-2 py-1 transition-colors hover:bg-po-panel/60",
|
|
607
607
|
children: [
|
|
608
608
|
/* @__PURE__ */ jsx(FolderIcon, {
|
|
609
609
|
"aria-hidden": true,
|
|
610
|
-
className: "mt-0.5 size-4 shrink-0 text-
|
|
610
|
+
className: "mt-0.5 size-4 shrink-0 text-po-dim"
|
|
611
611
|
}),
|
|
612
612
|
/* @__PURE__ */ jsxs("div", {
|
|
613
613
|
className: "flex min-w-0 flex-1 flex-col",
|
|
614
614
|
children: [/* @__PURE__ */ jsx("p", {
|
|
615
|
-
className: "truncate text-base font-semibold text-
|
|
615
|
+
className: "truncate text-base font-semibold text-po-hi",
|
|
616
616
|
children: name
|
|
617
617
|
}), /* @__PURE__ */ jsx("p", {
|
|
618
|
-
className: "truncate font-mono text-sm text-
|
|
618
|
+
className: "truncate font-mono text-sm text-po-dim",
|
|
619
619
|
title: root,
|
|
620
620
|
children: root
|
|
621
621
|
})]
|
|
@@ -630,7 +630,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
630
630
|
"aria-label": `New session in ${name}`,
|
|
631
631
|
disabled: !available,
|
|
632
632
|
onClick: () => actions.createSession(id),
|
|
633
|
-
className: "text-
|
|
633
|
+
className: "text-po-faint hover:text-po-hi",
|
|
634
634
|
children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-3.5" })
|
|
635
635
|
}), /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
636
636
|
asChild: true,
|
|
@@ -640,7 +640,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
640
640
|
"data-testid": `workspace-menu-${id}`,
|
|
641
641
|
title: "Workspace actions",
|
|
642
642
|
"aria-label": `${name} actions`,
|
|
643
|
-
className: "text-
|
|
643
|
+
className: "text-po-faint hover:text-po-hi",
|
|
644
644
|
children: /* @__PURE__ */ jsx(KebabIcon, { className: "size-3.5" })
|
|
645
645
|
})
|
|
646
646
|
}), /* @__PURE__ */ jsxs(DropdownMenuContent, { children: [
|
|
@@ -668,7 +668,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
668
668
|
]
|
|
669
669
|
}),
|
|
670
670
|
!available ? /* @__PURE__ */ jsx("p", {
|
|
671
|
-
className: "px-9 text-sm text-
|
|
671
|
+
className: "px-9 text-sm text-po-red",
|
|
672
672
|
children: "Workspace unavailable"
|
|
673
673
|
}) : null,
|
|
674
674
|
workspace.sessions.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
@@ -678,7 +678,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
678
678
|
actions
|
|
679
679
|
}, session.id))
|
|
680
680
|
}) : available ? /* @__PURE__ */ jsx("p", {
|
|
681
|
-
className: "px-9 pb-1 text-sm text-
|
|
681
|
+
className: "px-9 pb-1 text-sm text-po-dim",
|
|
682
682
|
children: "No sessions yet. Start or resume one."
|
|
683
683
|
}) : null,
|
|
684
684
|
/* @__PURE__ */ jsx(Dialog, {
|
|
@@ -692,7 +692,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
692
692
|
/* @__PURE__ */ jsxs(DialogDescription, { children: [
|
|
693
693
|
"this unregisters ",
|
|
694
694
|
/* @__PURE__ */ jsx("span", {
|
|
695
|
-
className: "font-semibold text-
|
|
695
|
+
className: "font-semibold text-po-hi",
|
|
696
696
|
children: name
|
|
697
697
|
}),
|
|
698
698
|
" from Po only. files at",
|
|
@@ -702,7 +702,7 @@ function ElegantWorkspaceGroup({ workspace, actions }) {
|
|
|
702
702
|
] }),
|
|
703
703
|
removeError ? /* @__PURE__ */ jsx("p", {
|
|
704
704
|
"data-testid": `workspace-delete-error-${id}`,
|
|
705
|
-
className: "text-sm text-
|
|
705
|
+
className: "text-sm text-po-red",
|
|
706
706
|
children: removeError
|
|
707
707
|
}) : null,
|
|
708
708
|
/* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
|
|
@@ -748,7 +748,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
748
748
|
className: "size-9 rounded-lg"
|
|
749
749
|
}), /* @__PURE__ */ jsx("span", {
|
|
750
750
|
"aria-hidden": "true",
|
|
751
|
-
className: "text-2xl font-semibold text-
|
|
751
|
+
className: "text-2xl font-semibold text-po-hi",
|
|
752
752
|
children: "Po"
|
|
753
753
|
})]
|
|
754
754
|
}), /* @__PURE__ */ jsxs("span", {
|
|
@@ -759,7 +759,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
759
759
|
"data-testid": "remote-access-open",
|
|
760
760
|
"aria-label": `Remote access is ${remote.status}`,
|
|
761
761
|
onClick: actions.openRemoteAccess,
|
|
762
|
-
className: `gap-1.5 rounded-md ${remote.status === "failed" ? "" : "bg-
|
|
762
|
+
className: `gap-1.5 rounded-md ${remote.status === "failed" ? "" : "bg-po-panel"}`,
|
|
763
763
|
children: [live ? /* @__PURE__ */ jsx(Dot, {
|
|
764
764
|
tone: "yellow",
|
|
765
765
|
pulse: true,
|
|
@@ -772,7 +772,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
772
772
|
title: "Hide sessions",
|
|
773
773
|
"aria-label": "Hide sessions",
|
|
774
774
|
onClick: onClose,
|
|
775
|
-
className: "text-
|
|
775
|
+
className: "text-po-dim",
|
|
776
776
|
children: /* @__PURE__ */ jsx(CloseIcon, { className: "size-3.5" })
|
|
777
777
|
})]
|
|
778
778
|
})]
|
|
@@ -780,7 +780,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
780
780
|
/* @__PURE__ */ jsxs("div", {
|
|
781
781
|
className: "flex items-center justify-between px-5 pt-3 pb-2",
|
|
782
782
|
children: [/* @__PURE__ */ jsx("h2", {
|
|
783
|
-
className: "text-lg font-semibold text-
|
|
783
|
+
className: "text-lg font-semibold text-po-hi",
|
|
784
784
|
children: "Workspaces"
|
|
785
785
|
}), /* @__PURE__ */ jsx(Button, {
|
|
786
786
|
variant: "ghost",
|
|
@@ -789,7 +789,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
789
789
|
title: "Add workspace",
|
|
790
790
|
"aria-label": "Add workspace",
|
|
791
791
|
onClick: actions.openAddWorkspace,
|
|
792
|
-
className: "text-
|
|
792
|
+
className: "text-po-faint hover:text-po-hi",
|
|
793
793
|
children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-3.5" })
|
|
794
794
|
})]
|
|
795
795
|
}),
|
|
@@ -799,16 +799,16 @@ function ElegantRail({ rail, onClose }) {
|
|
|
799
799
|
workspace,
|
|
800
800
|
actions
|
|
801
801
|
}, workspace.id)), rail.workspaces.length === 0 ? /* @__PURE__ */ jsxs("div", {
|
|
802
|
-
className: "flex flex-col gap-3 rounded-lg border border-dashed border-
|
|
802
|
+
className: "flex flex-col gap-3 rounded-lg border border-dashed border-po-border px-4 py-5",
|
|
803
803
|
children: [/* @__PURE__ */ jsx("p", {
|
|
804
|
-
className: "text-sm text-
|
|
804
|
+
className: "text-sm text-po-dim",
|
|
805
805
|
children: "Add a folder to start working with Po."
|
|
806
806
|
}), /* @__PURE__ */ jsxs(Button, {
|
|
807
807
|
variant: "outline",
|
|
808
808
|
size: "md",
|
|
809
809
|
"data-testid": "add-workspace-empty",
|
|
810
810
|
onClick: actions.openAddWorkspace,
|
|
811
|
-
className: "justify-start gap-2 bg-
|
|
811
|
+
className: "justify-start gap-2 bg-po-panel",
|
|
812
812
|
children: [/* @__PURE__ */ jsx(PlusIcon, { className: "size-3.5" }), "Add workspace"]
|
|
813
813
|
})]
|
|
814
814
|
}) : null]
|
|
@@ -816,10 +816,10 @@ function ElegantRail({ rail, onClose }) {
|
|
|
816
816
|
rail.pluginContent,
|
|
817
817
|
/* @__PURE__ */ jsx("div", { className: "flex-1" }),
|
|
818
818
|
/* @__PURE__ */ jsxs("div", {
|
|
819
|
-
className: "sticky bottom-0 mt-auto shrink-0 bg-
|
|
819
|
+
className: "sticky bottom-0 mt-auto shrink-0 bg-po-rail",
|
|
820
820
|
children: [remote.status === "off" ? null : /* @__PURE__ */ jsxs("div", {
|
|
821
821
|
"data-testid": "remote-banner",
|
|
822
|
-
className: `flex items-center gap-2 border-t border-
|
|
822
|
+
className: `flex items-center gap-2 border-t border-po-border-soft px-4 py-2 text-sm ${remote.status === "failed" ? "bg-po-tint-red text-po-red" : "bg-po-tint-yellow text-po-yellow"}`,
|
|
823
823
|
children: [
|
|
824
824
|
/* @__PURE__ */ jsx(Dot, { tone: remote.status === "failed" ? "red" : "yellow" }),
|
|
825
825
|
/* @__PURE__ */ jsx("span", {
|
|
@@ -842,24 +842,24 @@ function ElegantRail({ rail, onClose }) {
|
|
|
842
842
|
})
|
|
843
843
|
]
|
|
844
844
|
}), /* @__PURE__ */ jsxs("div", {
|
|
845
|
-
className: "flex flex-col gap-1 border-t border-
|
|
845
|
+
className: "flex flex-col gap-1 border-t border-po-border-soft px-3 py-3",
|
|
846
846
|
children: [/* @__PURE__ */ jsxs(Button, {
|
|
847
847
|
variant: "ghost",
|
|
848
848
|
size: "md",
|
|
849
849
|
"data-testid": "settings-open",
|
|
850
850
|
onClick: actions.openSettings,
|
|
851
|
-
className: "justify-start gap-2.5 px-2 text-
|
|
852
|
-
children: [/* @__PURE__ */ jsx(GearIcon, { className: "size-4 text-
|
|
851
|
+
className: "justify-start gap-2.5 px-2 text-po-text",
|
|
852
|
+
children: [/* @__PURE__ */ jsx(GearIcon, { className: "size-4 text-po-dim" }), "Settings"]
|
|
853
853
|
}), /* @__PURE__ */ jsxs("span", {
|
|
854
|
-
className: "px-2 text-sm text-
|
|
854
|
+
className: "px-2 text-sm text-po-dim max-sm:hidden",
|
|
855
855
|
children: [
|
|
856
856
|
/* @__PURE__ */ jsx(Kbd, {
|
|
857
|
-
className: "bg-
|
|
857
|
+
className: "bg-po-panel",
|
|
858
858
|
children: "ctrl+k"
|
|
859
859
|
}),
|
|
860
860
|
" commands · ",
|
|
861
861
|
/* @__PURE__ */ jsx(Kbd, {
|
|
862
|
-
className: "bg-
|
|
862
|
+
className: "bg-po-panel",
|
|
863
863
|
children: "ctrl+t"
|
|
864
864
|
}),
|
|
865
865
|
" new session"
|
|
@@ -876,7 +876,7 @@ function ElegantRail({ rail, onClose }) {
|
|
|
876
876
|
function ElegantLayout({ view, slots, rail, navigationOpen, mobileActivityOpen, onNavigationOpenChange, onMobileActivityOpenChange }) {
|
|
877
877
|
const conversation = view === "conversation" || view === "welcome";
|
|
878
878
|
return /* @__PURE__ */ jsxs("div", {
|
|
879
|
-
className: "relative flex h-full min-w-0 flex-col overflow-hidden bg-
|
|
879
|
+
className: "relative flex h-full min-w-0 flex-col overflow-hidden bg-po-bg",
|
|
880
880
|
children: [
|
|
881
881
|
/* @__PURE__ */ jsx(Drawer, {
|
|
882
882
|
open: navigationOpen,
|
|
@@ -886,7 +886,7 @@ function ElegantLayout({ view, slots, rail, navigationOpen, mobileActivityOpen,
|
|
|
886
886
|
showHeader: false,
|
|
887
887
|
"data-testid": "session-rail-panel",
|
|
888
888
|
backdropTestId: "mobile-drawer-backdrop",
|
|
889
|
-
className: "w-[min(340px,calc(100vw-48px))] border-
|
|
889
|
+
className: "w-[min(340px,calc(100vw-48px))] border-po-border-soft",
|
|
890
890
|
children: /* @__PURE__ */ jsx(ElegantRail, {
|
|
891
891
|
rail,
|
|
892
892
|
onClose: () => onNavigationOpenChange(false)
|
|
@@ -909,10 +909,10 @@ function ElegantLayout({ view, slots, rail, navigationOpen, mobileActivityOpen,
|
|
|
909
909
|
children: slots.composer
|
|
910
910
|
}),
|
|
911
911
|
slots.controls == null ? null : /* @__PURE__ */ jsxs("details", {
|
|
912
|
-
className: "shrink-0 px-3 pb-3 text-sm text-
|
|
912
|
+
className: "shrink-0 px-3 pb-3 text-sm text-po-dim",
|
|
913
913
|
children: [/* @__PURE__ */ jsx("summary", {
|
|
914
914
|
"data-testid": "template-controls-toggle",
|
|
915
|
-
className: "cursor-pointer rounded-sm px-1 py-1 focus-visible:outline focus-visible:outline-
|
|
915
|
+
className: "cursor-pointer rounded-sm px-1 py-1 focus-visible:outline focus-visible:outline-po-blue",
|
|
916
916
|
children: "Session controls"
|
|
917
917
|
}), slots.controls]
|
|
918
918
|
})
|
|
@@ -1010,7 +1010,7 @@ function ElegantConversation() {
|
|
|
1010
1010
|
}),
|
|
1011
1011
|
notices: transferLabel === null ? null : /* @__PURE__ */ jsxs("output", {
|
|
1012
1012
|
"data-testid": "voice-transfer-transition",
|
|
1013
|
-
className: "border-b border-
|
|
1013
|
+
className: "border-b border-po-cyan/30 bg-po-cyan/10 px-4 py-2 text-center text-base font-medium text-po-cyan",
|
|
1014
1014
|
children: [
|
|
1015
1015
|
"Transferring voice to ",
|
|
1016
1016
|
transferLabel,
|
|
@@ -1070,21 +1070,21 @@ function ElegantSettings() {
|
|
|
1070
1070
|
]);
|
|
1071
1071
|
return /* @__PURE__ */ jsxs("div", {
|
|
1072
1072
|
"data-testid": "settings",
|
|
1073
|
-
className: "flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-
|
|
1073
|
+
className: "flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-po-bg",
|
|
1074
1074
|
children: [/* @__PURE__ */ jsxs("header", {
|
|
1075
|
-
className: "grid shrink-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-2 gap-y-2 border-b border-
|
|
1075
|
+
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",
|
|
1076
1076
|
children: [
|
|
1077
1077
|
/* @__PURE__ */ jsx("h1", {
|
|
1078
|
-
className: "order-1 min-w-0 truncate text-xl font-semibold text-
|
|
1078
|
+
className: "order-1 min-w-0 truncate text-xl font-semibold text-po-hi sm:order-none",
|
|
1079
1079
|
children: "Settings"
|
|
1080
1080
|
}),
|
|
1081
1081
|
/* @__PURE__ */ jsxs("nav", {
|
|
1082
|
-
className: "order-3 col-span-2 flex w-full items-center gap-1 rounded-lg bg-
|
|
1082
|
+
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",
|
|
1083
1083
|
"aria-label": "settings workspace",
|
|
1084
1084
|
children: [/* @__PURE__ */ jsx(NavTab, {
|
|
1085
1085
|
asChild: true,
|
|
1086
1086
|
active: workspace === "general",
|
|
1087
|
-
className: "min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-
|
|
1087
|
+
className: "min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none",
|
|
1088
1088
|
"aria-current": workspace === "general" ? "true" : void 0,
|
|
1089
1089
|
children: /* @__PURE__ */ jsx(Link, {
|
|
1090
1090
|
to: "/settings/$section",
|
|
@@ -1096,7 +1096,7 @@ function ElegantSettings() {
|
|
|
1096
1096
|
}), /* @__PURE__ */ jsx(NavTab, {
|
|
1097
1097
|
asChild: true,
|
|
1098
1098
|
active: workspace === "repository",
|
|
1099
|
-
className: "min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-
|
|
1099
|
+
className: "min-h-8 flex-1 justify-center rounded-md px-4 focus-visible:ring-2 focus-visible:ring-po-green sm:flex-none",
|
|
1100
1100
|
"aria-current": workspace === "repository" ? "true" : void 0,
|
|
1101
1101
|
children: /* @__PURE__ */ jsx(Link, {
|
|
1102
1102
|
to: "/settings/$section",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.mjs","names":["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/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-doom-border-soft bg-doom-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-doom-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-doom-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-doom-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 Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n OptionRow,\n} from '@agimon-ai/po-web-components';\nimport { workspaceAdmissionStore, updateWorkspaceAdmission } from '@agimon-ai/po-web-dashboard';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState } 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/** Adds a workspace by name, by folder, or both; a name alone gets a new default folder. */\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 { name, nameEdited, pending: busy, error } = draft;\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const setName = (name: string): void => updateWorkspaceAdmission({ name });\n const setNameEdited = (nameEdited: boolean): void => updateWorkspaceAdmission({ nameEdited });\n const setPath = (path: string): void => updateWorkspaceAdmission({ path });\n const [browsing, setBrowsing] = useState(false);\n const [suggestions, setSuggestions] = useState<readonly string[]>([]);\n const [highlight, setHighlight] = useState(NO_HIGHLIGHT);\n const pathInput = useRef<HTMLInputElement>(null);\n const shownName = nameEdited ? name : folderName(path);\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(found.filter((directory) => directory !== typed));\n setHighlight(NO_HIGHLIGHT);\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [path, actions]);\n\n const changePath = (next: string): void => {\n setPath(next);\n if (next.trim() === '') setSuggestions([]);\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 canSubmit = !busy && (trimmedPath !== '' || shownName.trim() !== '');\n const submit = async (): Promise<void> => {\n if (!canSubmit) return;\n await actions.addWorkspace({\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n });\n };\n\n return (\n <Dialog open onOpenChange={(next) => !next && !busy && actions.closeAddWorkspace()}>\n <DialogContent 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-name\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-doom-dim\">name</span>\n <Input\n id=\"add-workspace-name\"\n data-testid=\"add-workspace-name\"\n value={shownName}\n autoFocus\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-root\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-doom-dim\">\n folder <span className=\"text-doom-dim\">(optional; type a path or browse)</span>\n </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 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\"\n />\n <Button\n variant={browsing ? 'subtle' : 'outline'}\n size=\"md\"\n data-testid=\"add-workspace-browse\"\n aria-pressed={browsing}\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-doom-border-soft bg-doom-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 key={suggested} variant=\"outline\" size=\"xs\" onClick={() => changePath(suggested)}>\n {suggested}\n </Button>\n ))}\n </div>\n ) : null}\n {trimmedPath === '' && shownName.trim() !== '' ? (\n <p data-testid=\"add-workspace-default-hint\" className=\"text-sm text-doom-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-doom-edge-red bg-doom-tint-red/40 px-2.5 py-2 text-sm whitespace-pre-wrap text-doom-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 ? 'adding…' : '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-doom-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-doom-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-doom-red' : 'text-sm text-doom-dim'}>{setup.status}</p>\n {setup.recovery ? (\n <p role={setup.failed ? 'alert' : undefined} className=\"text-sm text-doom-dim\">\n {setup.recovery}\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-sm text-doom-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 LoaderIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { useRef } from 'react';\n\nimport { ElegantPendingSetup } from './ElegantPendingSetup';\n\ntype CardMode = 'view' | 'menu' | 'rename' | 'confirm';\n\n/** A soft tile led by the persona avatar, with the branch as a quiet caption. */\nexport 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-doom-edge-green bg-doom-tint-green px-3 hover:bg-doom-tint-green'\n : 'rounded-lg border border-transparent px-3 hover:bg-doom-panel';\n const failed = session.status.startsWith('failed') || session.status.includes(' failed');\n const running = session.status.startsWith('running');\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 <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 shrink-0 rounded-full\"\n >\n {session.profile?.avatarUrl ? <AvatarImage src={session.profile.avatarUrl} alt=\"\" /> : null}\n <AvatarFallback className=\"bg-doom-tint-green text-xs font-semibold text-doom-green\">\n {session.profile?.initials ?? 'PO'}\n </AvatarFallback>\n </Avatar>\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-doom-green' : 'text-doom-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-doom-green' : 'text-doom-faint'}`}\n />\n ) : null}\n <span className=\"min-w-0 flex-1 text-base font-semibold break-words text-doom-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-doom-panel text-2xs text-doom-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-doom-red' : running ? 'text-doom-yellow' : active ? 'text-doom-text' : 'text-doom-dim'\n }`}\n >\n {session.awaitingInput ? (\n <AlertIcon\n data-testid=\"session-awaiting-input\"\n aria-label=\"Waiting for your input\"\n className=\"mt-0.5 size-3 shrink-0 text-doom-magenta\"\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 <span data-testid=\"session-status\" className={active ? 'line-clamp-2' : 'truncate'}>\n {session.status}\n </span>\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-doom-dim\">\n <BranchIcon className={`size-3 shrink-0 ${active ? 'text-doom-green' : ''}`} />\n <span className=\"truncate font-mono\">{session.git.branch}</span>\n {session.git.dirty ? <span className=\"shrink-0 text-doom-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-doom-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-doom-dim hover:text-doom-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-doom-hi\">{session.name || 'untitled'}</span> and removes\n it from the list. anything it is running ends now, but its saved history remains available to resume.\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 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-doom-panel/60\">\n <FolderIcon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-doom-dim\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <p className=\"truncate text-base font-semibold text-doom-hi\">{name}</p>\n <p className=\"truncate font-mono text-sm text-doom-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-doom-faint hover:text-doom-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-doom-faint hover:text-doom-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-doom-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-doom-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-doom-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-doom-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, 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-doom-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-doom-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-doom-dim\"\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n </span>\n </div>\n\n <div className=\"flex items-center justify-between px-5 pt-3 pb-2\">\n <h2 className=\"text-lg font-semibold text-doom-hi\">Workspaces</h2>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"add-workspace-open\"\n title=\"Add workspace\"\n aria-label=\"Add workspace\"\n onClick={actions.openAddWorkspace}\n className=\"text-doom-faint hover:text-doom-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 {rail.workspaces.map((workspace) => (\n <ElegantWorkspaceGroup key={workspace.id} workspace={workspace} actions={actions} />\n ))}\n {rail.workspaces.length === 0 ? (\n <div className=\"flex flex-col gap-3 rounded-lg border border-dashed border-doom-border px-4 py-5\">\n <p className=\"text-sm text-doom-dim\">Add a folder to start working with Po.</p>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid=\"add-workspace-empty\"\n onClick={actions.openAddWorkspace}\n className=\"justify-start gap-2 bg-doom-panel\"\n >\n <PlusIcon className=\"size-3.5\" />\n Add workspace\n </Button>\n </div>\n ) : null}\n </div>\n {rail.pluginContent}\n <div className=\"flex-1\" />\n\n <div className=\"sticky bottom-0 mt-auto shrink-0 bg-doom-rail\">\n {remote.status === 'off' ? null : (\n <div\n data-testid=\"remote-banner\"\n className={`flex items-center gap-2 border-t border-doom-border-soft px-4 py-2 text-sm ${\n remote.status === 'failed' ? 'bg-doom-tint-red text-doom-red' : 'bg-doom-tint-yellow text-doom-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-doom-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-doom-text\"\n >\n <GearIcon className=\"size-4 text-doom-dim\" />\n Settings\n </Button>\n <span className=\"px-2 text-sm text-doom-dim max-sm:hidden\">\n <Kbd className=\"bg-doom-panel\">ctrl+k</Kbd> commands · <Kbd className=\"bg-doom-panel\">ctrl+t</Kbd> new\n session\n </span>\n </div>\n </div>\n </div>\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-doom-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-doom-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-doom-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-doom-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 { 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 { SessionRailDialogs } from '@agimon-ai/po-web-dashboard/views';\nimport { useSessionRail } from '@agimon-ai/po-web-dashboard/views';\nimport { WelcomePanel } 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 { ElegantLayout } from './ElegantLayout';\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 { sessionId, tabId } = 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 mcp = useSessionMcp(workspaceId, sessionId);\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()\n .map((group) => group.transientTab?.())\n .find((candidate) => candidate?.id === storedTransientTab.id) ?? storedTransientTab);\n const tab = (tabId === undefined ? undefined : webTabs().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 = `${sessionId ?? ''}\\u0000${tabId ?? ''}`;\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 rail = useSessionRail({ onDismiss: () => setRailOpen(false) });\n\n const closeActivity = (): void => {\n if (mobileActivityOpen) setMobileActivityOpen(false);\n else setDockOpen(false);\n };\n return (\n <div data-testid=\"cockpit\" className=\"h-full min-w-0 overflow-hidden\">\n <ElegantLayout\n view={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 rail={rail}\n slots={{\n header: (options) => (\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-doom-cyan/30 bg-doom-cyan/10 px-4 py-2 text-center text-base font-medium text-doom-cyan\"\n >\n Transferring voice to {transferLabel}...\n </output>\n ),\n content: mcpView ? (\n <SessionMcp key={sessionId} state={mcp} />\n ) : tab ? (\n <tab.panel {...slotProps} />\n ) : noSessions ? (\n <WelcomePanel />\n ) : (\n <Timeline />\n ),\n // MCP history is a read-only surface, not an alternative prompt composer.\n composer: mcpView ? null : tab ? (\n tab.retainComposer === true ? (\n <Composer composerContext={composerContext} />\n ) : null\n ) : noSessions ? null : (\n <Composer />\n ),\n controls: !mcpView && !tab && !noSessions && dormantMeta === null ? <SelectionBar /> : null,\n activity: (\n <ActivityDock mcp={mcp} onClose={closeActivity} onOpenContent={() => setMobileActivityOpen(false)} />\n ),\n }}\n />\n <SessionRailDialogs />\n </div>\n );\n}\n","import { 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-doom-bg\">\n <header className=\"grid shrink-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-2 gap-y-2 border-b border-doom-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-doom-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-doom-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-doom-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-doom-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=\"ghost\" size=\"sm\" className=\"order-2 sm:order-none sm:justify-self-end\">\n {activeId !== null ? (\n <Link to=\"/session/$sessionId\" params={{ sessionId: activeId }} data-testid=\"settings-close\">\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 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-[720px] 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","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/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 Dialog,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n OptionRow,\n} from '@agimon-ai/po-web-components';\nimport { workspaceAdmissionStore, updateWorkspaceAdmission } from '@agimon-ai/po-web-dashboard';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState } 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/** Adds a workspace by name, by folder, or both; a name alone gets a new default folder. */\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 { name, nameEdited, pending: busy, error } = draft;\n const path = draft.path ?? suggestedPaths[0] ?? '';\n const setName = (name: string): void => updateWorkspaceAdmission({ name });\n const setNameEdited = (nameEdited: boolean): void => updateWorkspaceAdmission({ nameEdited });\n const setPath = (path: string): void => updateWorkspaceAdmission({ path });\n const [browsing, setBrowsing] = useState(false);\n const [suggestions, setSuggestions] = useState<readonly string[]>([]);\n const [highlight, setHighlight] = useState(NO_HIGHLIGHT);\n const pathInput = useRef<HTMLInputElement>(null);\n const shownName = nameEdited ? name : folderName(path);\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(found.filter((directory) => directory !== typed));\n setHighlight(NO_HIGHLIGHT);\n }, SUGGESTION_DEBOUNCE_MS);\n return () => {\n stale = true;\n clearTimeout(timer);\n };\n }, [path, actions]);\n\n const changePath = (next: string): void => {\n setPath(next);\n if (next.trim() === '') setSuggestions([]);\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 canSubmit = !busy && (trimmedPath !== '' || shownName.trim() !== '');\n const submit = async (): Promise<void> => {\n if (!canSubmit) return;\n await actions.addWorkspace({\n name: shownName.trim(),\n ...(trimmedPath === '' ? {} : { path: trimmedPath }),\n });\n };\n\n return (\n <Dialog open onOpenChange={(next) => !next && !busy && actions.closeAddWorkspace()}>\n <DialogContent 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-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 autoFocus\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-root\" className=\"flex flex-col gap-1\">\n <span className=\"text-base font-medium text-po-dim\">\n folder <span className=\"text-po-dim\">(optional; type a path or browse)</span>\n </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 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\"\n />\n <Button\n variant={browsing ? 'subtle' : 'outline'}\n size=\"md\"\n data-testid=\"add-workspace-browse\"\n aria-pressed={browsing}\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 key={suggested} variant=\"outline\" size=\"xs\" onClick={() => changePath(suggested)}>\n {suggested}\n </Button>\n ))}\n </div>\n ) : null}\n {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 ? 'adding…' : '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 LoaderIcon,\n} from '@agimon-ai/po-web-components';\nimport { useDashboardState } from '@agimon-ai/po-web-dashboard';\nimport { useRef } from 'react';\n\nimport { ElegantPendingSetup } from './ElegantPendingSetup';\n\ntype CardMode = 'view' | 'menu' | 'rename' | 'confirm';\n\n/** A soft tile led by the persona avatar, with the branch as a quiet caption. */\nexport 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 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 <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 shrink-0 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 <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 {session.awaitingInput ? (\n <AlertIcon\n data-testid=\"session-awaiting-input\"\n aria-label=\"Waiting for your input\"\n className=\"mt-0.5 size-3 shrink-0 text-po-magenta\"\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 <span data-testid=\"session-status\" className={active ? 'line-clamp-2' : 'truncate'}>\n {session.status}\n </span>\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, but its saved history remains available to resume.\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 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, 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\n <div className=\"flex items-center justify-between px-5 pt-3 pb-2\">\n <h2 className=\"text-lg font-semibold text-po-hi\">Workspaces</h2>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-testid=\"add-workspace-open\"\n title=\"Add workspace\"\n aria-label=\"Add workspace\"\n onClick={actions.openAddWorkspace}\n className=\"text-po-faint 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 {rail.workspaces.map((workspace) => (\n <ElegantWorkspaceGroup key={workspace.id} workspace={workspace} actions={actions} />\n ))}\n {rail.workspaces.length === 0 ? (\n <div className=\"flex flex-col gap-3 rounded-lg border border-dashed border-po-border px-4 py-5\">\n <p className=\"text-sm text-po-dim\">Add a folder to start working with Po.</p>\n <Button\n variant=\"outline\"\n size=\"md\"\n data-testid=\"add-workspace-empty\"\n onClick={actions.openAddWorkspace}\n className=\"justify-start gap-2 bg-po-panel\"\n >\n <PlusIcon className=\"size-3.5\" />\n Add workspace\n </Button>\n </div>\n ) : null}\n </div>\n {rail.pluginContent}\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","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 { 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 { SessionRailDialogs } from '@agimon-ai/po-web-dashboard/views';\nimport { useSessionRail } from '@agimon-ai/po-web-dashboard/views';\nimport { WelcomePanel } 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 { ElegantLayout } from './ElegantLayout';\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 { sessionId, tabId } = 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 mcp = useSessionMcp(workspaceId, sessionId);\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()\n .map((group) => group.transientTab?.())\n .find((candidate) => candidate?.id === storedTransientTab.id) ?? storedTransientTab);\n const tab = (tabId === undefined ? undefined : webTabs().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 = `${sessionId ?? ''}\\u0000${tabId ?? ''}`;\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 rail = useSessionRail({ onDismiss: () => setRailOpen(false) });\n\n const closeActivity = (): void => {\n if (mobileActivityOpen) setMobileActivityOpen(false);\n else setDockOpen(false);\n };\n return (\n <div data-testid=\"cockpit\" className=\"h-full min-w-0 overflow-hidden\">\n <ElegantLayout\n view={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 rail={rail}\n slots={{\n header: (options) => (\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: mcpView ? (\n <SessionMcp key={sessionId} state={mcp} />\n ) : tab ? (\n <tab.panel {...slotProps} />\n ) : noSessions ? (\n <WelcomePanel />\n ) : (\n <Timeline />\n ),\n // MCP history is a read-only surface, not an alternative prompt composer.\n composer: mcpView ? null : tab ? (\n tab.retainComposer === true ? (\n <Composer composerContext={composerContext} />\n ) : null\n ) : noSessions ? null : (\n <Composer />\n ),\n controls: !mcpView && !tab && !noSessions && dormantMeta === null ? <SelectionBar /> : null,\n activity: (\n <ActivityDock mcp={mcp} onClose={closeActivity} onOpenContent={() => setMobileActivityOpen(false)} />\n ),\n }}\n />\n <SessionRailDialogs />\n </div>\n );\n}\n","import { 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=\"ghost\" size=\"sm\" className=\"order-2 sm:order-none sm:justify-self-end\">\n {activeId !== null ? (\n <Link to=\"/session/$sessionId\" params={{ sessionId: activeId }} data-testid=\"settings-close\">\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 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-[720px] 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.
|
|
3
|
+
"version": "0.0.0-alpha.4",
|
|
4
4
|
"description": "Elegant chat-first template for the Po web client.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -38,24 +38,24 @@
|
|
|
38
38
|
"access": "public"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
42
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
43
|
-
"@agimon-ai/po-web-dashboard": "0.0.0-alpha.
|
|
44
|
-
"@tanstack/react-router": "1.170.
|
|
41
|
+
"@agimon-ai/po-core": "0.0.0-alpha.4",
|
|
42
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.4",
|
|
43
|
+
"@agimon-ai/po-web-dashboard": "0.0.0-alpha.4",
|
|
44
|
+
"@tanstack/react-router": "1.170.44",
|
|
45
45
|
"@tanstack/react-store": "0.11.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
49
|
-
"@agimon-ai/vibe-lint-plugin-
|
|
48
|
+
"@agimon-ai/po-build": "0.0.0-alpha.4",
|
|
49
|
+
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.4",
|
|
50
50
|
"@earendil-works/pi-coding-agent": "1.2.0",
|
|
51
|
-
"@types/node": "26.6.
|
|
51
|
+
"@types/node": "26.6.5",
|
|
52
52
|
"@types/react": "19.3.0",
|
|
53
53
|
"@types/react-dom": "19.3.0",
|
|
54
54
|
"react": "19.3.0",
|
|
55
55
|
"react-dom": "19.3.0",
|
|
56
|
-
"tsdown": "0.23.
|
|
56
|
+
"tsdown": "0.23.1",
|
|
57
57
|
"typescript": "7.0.2",
|
|
58
|
-
"vitest": "5.0.
|
|
58
|
+
"vitest": "5.0.4"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"@earendil-works/pi-coding-agent": "1.2.0",
|