@parhelia/core 0.1.12798 → 0.1.12800

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/config/config.js +9 -2
  2. package/dist/config/config.js.map +1 -1
  3. package/dist/editor/ai/AgentPanesGrid.js +8 -7
  4. package/dist/editor/ai/AgentPanesGrid.js.map +1 -1
  5. package/dist/editor/menubar/ActiveUsers.js +1 -1
  6. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  7. package/dist/editor/notifications/WatchButton.d.ts +1 -2
  8. package/dist/editor/notifications/WatchButton.js +24 -40
  9. package/dist/editor/notifications/WatchButton.js.map +1 -1
  10. package/dist/editor/notifications/useNotificationSubscriptions.d.ts +8 -0
  11. package/dist/editor/notifications/useNotificationSubscriptions.js +25 -1
  12. package/dist/editor/notifications/useNotificationSubscriptions.js.map +1 -1
  13. package/dist/editor/notifications/watchEventOptions.d.ts +13 -0
  14. package/dist/editor/notifications/watchEventOptions.js +108 -0
  15. package/dist/editor/notifications/watchEventOptions.js.map +1 -0
  16. package/dist/editor/services/notificationService.d.ts +3 -0
  17. package/dist/editor/services/notificationService.js.map +1 -1
  18. package/dist/editor/services/reviewsService.d.ts +3 -0
  19. package/dist/editor/services/reviewsService.js +4 -0
  20. package/dist/editor/services/reviewsService.js.map +1 -1
  21. package/dist/editor/settings/SettingsView.js +2 -2
  22. package/dist/editor/settings/panels/NotificationSubscriptionsPanel.d.ts +2 -0
  23. package/dist/editor/settings/panels/NotificationSubscriptionsPanel.js +137 -0
  24. package/dist/editor/settings/panels/NotificationSubscriptionsPanel.js.map +1 -0
  25. package/dist/editor/settings/panels/index.d.ts +1 -0
  26. package/dist/editor/settings/panels/index.js +1 -0
  27. package/dist/editor/settings/panels/index.js.map +1 -1
  28. package/dist/revision.d.ts +2 -2
  29. package/dist/revision.js +2 -2
  30. package/dist/splash-screen/ModernSplashScreen.js +135 -4
  31. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  32. package/dist/splash-screen/OpenPage.js +9 -16
  33. package/dist/splash-screen/OpenPage.js.map +1 -1
  34. package/dist/task-board/components/TaskBoardMyTasksSidebar.js +20 -23
  35. package/dist/task-board/components/TaskBoardMyTasksSidebar.js.map +1 -1
  36. package/dist/task-board/services/taskService.d.ts +7 -0
  37. package/dist/task-board/services/taskService.js +4 -0
  38. package/dist/task-board/services/taskService.js.map +1 -1
  39. package/dist/tour/Tour.js +3 -3
  40. package/dist/tour/Tour.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,108 @@
1
+ import { AlertTriangle, Bot, Check, Flag, ListChecks, MessageSquare, PenLine, UserCheck, UserPlus, X, } from "lucide-react";
2
+ import { notificationEventTypes } from "../services/notificationService";
3
+ const itemWatchEventOptions = [
4
+ {
5
+ eventType: notificationEventTypes.itemChanged,
6
+ label: "Modifications",
7
+ icon: PenLine,
8
+ },
9
+ {
10
+ eventType: notificationEventTypes.feedback,
11
+ label: "Feedback",
12
+ icon: MessageSquare,
13
+ },
14
+ ];
15
+ const projectWatchEventOptions = [
16
+ {
17
+ eventType: notificationEventTypes.projectAttentionRequired,
18
+ label: "Attention required",
19
+ icon: AlertTriangle,
20
+ },
21
+ {
22
+ eventType: notificationEventTypes.projectTaskCompleted,
23
+ label: "Task completed",
24
+ icon: Check,
25
+ },
26
+ {
27
+ eventType: notificationEventTypes.projectFinished,
28
+ label: "Project finished",
29
+ icon: Flag,
30
+ },
31
+ ];
32
+ const reviewWatchEventOptions = [
33
+ {
34
+ eventType: notificationEventTypes.reviewInvitation,
35
+ label: "Review invitation",
36
+ icon: UserPlus,
37
+ },
38
+ {
39
+ eventType: notificationEventTypes.reviewCompleted,
40
+ label: "Review completed",
41
+ icon: UserCheck,
42
+ },
43
+ {
44
+ eventType: notificationEventTypes.reviewRejected,
45
+ label: "Review rejected",
46
+ icon: X,
47
+ },
48
+ ];
49
+ const agentRunWatchEventOptions = [
50
+ {
51
+ eventType: notificationEventTypes.agentNotification,
52
+ label: "Agent notification",
53
+ icon: Bot,
54
+ },
55
+ ];
56
+ // Additional event types that may appear on subscriptions but are not part of
57
+ // the per-target-type default option lists (e.g. project task assignments).
58
+ // Provided so the settings panel can label any event type emitted by the
59
+ // backend, even when it's not selectable from the WatchButton dropdown.
60
+ const extraEventLabels = {
61
+ [notificationEventTypes.taskAssigned]: { label: "Task assigned", icon: ListChecks },
62
+ [notificationEventTypes.taskStatusChanged]: {
63
+ label: "Task status changed",
64
+ icon: ListChecks,
65
+ },
66
+ };
67
+ export function getWatchEventOptions(targetType) {
68
+ switch (targetType) {
69
+ case "item":
70
+ return itemWatchEventOptions;
71
+ case "project":
72
+ return projectWatchEventOptions;
73
+ case "review":
74
+ return reviewWatchEventOptions;
75
+ case "agent-run":
76
+ return agentRunWatchEventOptions;
77
+ default:
78
+ return [];
79
+ }
80
+ }
81
+ const allOptions = [
82
+ ...itemWatchEventOptions,
83
+ ...projectWatchEventOptions,
84
+ ...reviewWatchEventOptions,
85
+ ...agentRunWatchEventOptions,
86
+ ];
87
+ const optionByEventType = new Map(allOptions.map((option) => [option.eventType, option]));
88
+ export function getEventTypeLabel(eventType) {
89
+ const option = optionByEventType.get(eventType);
90
+ if (option)
91
+ return option.label;
92
+ const extra = extraEventLabels[eventType];
93
+ if (extra)
94
+ return extra.label;
95
+ return eventType;
96
+ }
97
+ export function getEventTypeIcon(eventType) {
98
+ const option = optionByEventType.get(eventType);
99
+ if (option)
100
+ return option.icon;
101
+ const extra = extraEventLabels[eventType];
102
+ if (extra)
103
+ return extra.icon;
104
+ return undefined;
105
+ }
106
+ // Re-export for legacy importers in WatchButton.tsx.
107
+ export { itemWatchEventOptions, projectWatchEventOptions };
108
+ //# sourceMappingURL=watchEventOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchEventOptions.js","sourceRoot":"","sources":["../../../src/editor/notifications/watchEventOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,GAAG,EACH,KAAK,EACL,IAAI,EACJ,UAAU,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,CAAC,GAEF,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAUzE,MAAM,qBAAqB,GAAuB;IAChD;QACE,SAAS,EAAE,sBAAsB,CAAC,WAAW;QAC7C,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,OAAO;KACd;IACD;QACE,SAAS,EAAE,sBAAsB,CAAC,QAAQ;QAC1C,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,aAAa;KACpB;CACF,CAAC;AAEF,MAAM,wBAAwB,GAAuB;IACnD;QACE,SAAS,EAAE,sBAAsB,CAAC,wBAAwB;QAC1D,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,aAAa;KACpB;IACD;QACE,SAAS,EAAE,sBAAsB,CAAC,oBAAoB;QACtD,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,KAAK;KACZ;IACD;QACE,SAAS,EAAE,sBAAsB,CAAC,eAAe;QACjD,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF,MAAM,uBAAuB,GAAuB;IAClD;QACE,SAAS,EAAE,sBAAsB,CAAC,gBAAgB;QAClD,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,QAAQ;KACf;IACD;QACE,SAAS,EAAE,sBAAsB,CAAC,eAAe;QACjD,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,SAAS;KAChB;IACD;QACE,SAAS,EAAE,sBAAsB,CAAC,cAAc;QAChD,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,CAAC;KACR;CACF,CAAC;AAEF,MAAM,yBAAyB,GAAuB;IACpD;QACE,SAAS,EAAE,sBAAsB,CAAC,iBAAiB;QACnD,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,GAAG;KACV;CACF,CAAC;AAEF,8EAA8E;AAC9E,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,MAAM,gBAAgB,GAAwD;IAC5E,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE;IACnF,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE;QAC1C,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,UAAU;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,UAAoC;IAEpC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,qBAAqB,CAAC;QAC/B,KAAK,SAAS;YACZ,OAAO,wBAAwB,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,uBAAuB,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,yBAAyB,CAAC;QACnC;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAuB;IACrC,GAAG,qBAAqB;IACxB,GAAG,wBAAwB;IAC3B,GAAG,uBAAuB;IAC1B,GAAG,yBAAyB;CAC7B,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CACvD,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IAC9B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qDAAqD;AACrD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -35,6 +35,9 @@ export type NotificationSubscription = {
35
35
  isAuto: boolean;
36
36
  isMuted: boolean;
37
37
  createdAt: string;
38
+ displayName?: string | null;
39
+ path?: string | null;
40
+ exists?: boolean;
38
41
  };
39
42
  export type SubscribeNotificationRequest = {
40
43
  targetType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"notificationService.js","sourceRoot":"","sources":["../../../src/editor/services/notificationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notificationService.js","sourceRoot":"","sources":["../../../src/editor/services/notificationService.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,9 @@ export declare function createReview(request: CreateReviewRequest): Promise<impo
13
13
  reviewId: string;
14
14
  }>>;
15
15
  export declare function getAllReviews(language?: string): Promise<import("./serviceHelper").ExecutionResult<ReviewListItem[]>>;
16
+ export declare function getMyReviews(options?: {
17
+ excludeFinished?: boolean;
18
+ }): Promise<import("./serviceHelper").ExecutionResult<ReviewListItem[]>>;
16
19
  export declare function getReviewStatus(reviewId: string): Promise<import("./serviceHelper").ExecutionResult<{
17
20
  review: ReviewWithPages;
18
21
  assignments: ReviewAssignment[];
@@ -49,6 +49,10 @@ export function getAllReviews(language) {
49
49
  // Don't filter by language in the reviews list - show all reviews
50
50
  return get(`/parhelia/reviews/all`);
51
51
  }
52
+ export function getMyReviews(options) {
53
+ const excludeFinished = options?.excludeFinished !== false;
54
+ return get(`/parhelia/reviews/mine?excludeFinished=${excludeFinished ? "true" : "false"}`);
55
+ }
52
56
  export function getReviewStatus(reviewId) {
53
57
  return get(`/parhelia/reviews/status?reviewId=${reviewId}`);
54
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reviewsService.js","sourceRoot":"","sources":["../../../src/editor/services/reviewsService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reviewsService.js","sourceRoot":"","sources":["../../../src/editor/services/reviewsService.ts"],"names":[],"mappings":"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"}
@@ -138,9 +138,9 @@ export function SettingsView() {
138
138
  : "Open settings navigation", title: mobileSidebarOpen
139
139
  ? "Close settings navigation"
140
140
  : "Open settings navigation", children: _jsx(Menu, { className: "h-4 w-4", strokeWidth: 1.75 }) }))] }), _jsx(SettingsMainContentRefContext.Provider, { value: settingsMainContentRef, children: _jsxs("div", { ref: settingsMainContentRef, className: "relative flex min-h-0 flex-1 overflow-hidden", "data-testid": "settings-view-main-content", children: [!isDesktop && mobileSidebarOpen && (_jsx("button", { type: "button", className: "absolute inset-0 z-10 bg-black/20", "aria-label": "Close settings navigation", onClick: () => setMobileSidebarOpen(false) })), _jsxs("div", { className: cn("z-20 flex min-h-0 flex-col border-r border-gray-200 bg-gray-50", "transition-[width,transform,box-shadow] duration-300 ease-out", isDesktop
141
- ? "relative w-64"
141
+ ? "relative w-72"
142
142
  : mobileSidebarOpen
143
- ? "absolute inset-y-0 left-0 w-64 shadow-xl"
143
+ ? "absolute inset-y-0 left-0 w-72 shadow-xl"
144
144
  : "absolute inset-y-0 left-0 w-0 -translate-x-full overflow-hidden border-r-0"), children: [_jsx(StatusSummary, { onNavigate: handleNavigateToStatus, collapsed: !isDesktop && !mobileSidebarOpen }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx(SimpleMenu, { items: items, activeItemKey: activeItemKey, collapsed: !isDesktop && !mobileSidebarOpen, onItemClick: (item) => {
145
145
  setActiveItemKey(item.id);
146
146
  updateUrl(item.id);
@@ -0,0 +1,2 @@
1
+ export declare function NotificationSubscriptionsPanel(): import("react/jsx-runtime").JSX.Element;
2
+ export default NotificationSubscriptionsPanel;
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { Bell, BellOff, FileText, FolderTree, Globe, Loader2, Sparkles, Trash2, Wand2, } from "lucide-react";
4
+ import { Badge } from "../../../components/ui/badge";
5
+ import { Button } from "../../../components/ui/button";
6
+ import { Card } from "../../../components/ui/card";
7
+ import { Tooltip, TooltipContent, TooltipTrigger, } from "../../../components/ui/tooltip";
8
+ import { cn } from "../../../lib/utils";
9
+ import { useNotificationSubscriptions } from "../../notifications/useNotificationSubscriptions";
10
+ import { getEventTypeLabel } from "../../notifications/watchEventOptions";
11
+ import { SecretAgentIcon } from "../../ui/Icons";
12
+ const GROUPS = [
13
+ {
14
+ key: "item",
15
+ title: "Items",
16
+ icon: _jsx(FileText, { strokeWidth: 1, className: "h-5 w-5" }),
17
+ targetTypes: ["item"],
18
+ },
19
+ {
20
+ key: "project",
21
+ title: "Projects",
22
+ icon: _jsx(Sparkles, { strokeWidth: 1, className: "h-5 w-5" }),
23
+ targetTypes: ["project"],
24
+ },
25
+ {
26
+ key: "review",
27
+ title: "Reviews",
28
+ icon: _jsx(Wand2, { strokeWidth: 1, className: "h-5 w-5" }),
29
+ targetTypes: ["review"],
30
+ },
31
+ {
32
+ key: "agent-run",
33
+ title: "Agent runs",
34
+ icon: _jsx(SecretAgentIcon, { size: 20, strokeWidth: 1 }),
35
+ targetTypes: ["agent-run"],
36
+ },
37
+ ];
38
+ function groupSubscriptions(subscriptions) {
39
+ const buckets = new Map();
40
+ const knownTypes = new Set(GROUPS.flatMap((g) => g.targetTypes));
41
+ const others = [];
42
+ for (const subscription of subscriptions) {
43
+ const type = (subscription.targetType ?? "").toLowerCase();
44
+ if (knownTypes.has(type)) {
45
+ const list = buckets.get(type) ?? [];
46
+ list.push(subscription);
47
+ buckets.set(type, list);
48
+ }
49
+ else {
50
+ others.push(subscription);
51
+ }
52
+ }
53
+ const sortedGroups = GROUPS.map((group) => ({
54
+ config: group,
55
+ items: group.targetTypes.flatMap((type) => buckets.get(type) ?? []),
56
+ })).filter((group) => group.items.length > 0);
57
+ if (others.length > 0) {
58
+ sortedGroups.push({
59
+ config: {
60
+ key: "other",
61
+ title: "Other",
62
+ icon: _jsx(Bell, { strokeWidth: 1, className: "h-5 w-5" }),
63
+ targetTypes: [],
64
+ },
65
+ items: others,
66
+ });
67
+ }
68
+ return sortedGroups;
69
+ }
70
+ function formatTargetIdShort(targetId) {
71
+ if (!targetId)
72
+ return "";
73
+ if (targetId.length <= 12)
74
+ return targetId;
75
+ return `${targetId.slice(0, 8)}…`;
76
+ }
77
+ function SubscriptionRow({ subscription, }) {
78
+ const { muteTarget, unmuteTarget, unsubscribeFromTarget } = useNotificationSubscriptions();
79
+ const [pending, setPending] = useState(null);
80
+ const targetType = (subscription.targetType ?? "").toLowerCase();
81
+ const displayName = subscription.displayName && subscription.displayName.trim().length > 0
82
+ ? subscription.displayName
83
+ : `${subscription.targetType} ${formatTargetIdShort(subscription.targetId)}`.trim();
84
+ const subtitle = subscription.path ?? null;
85
+ const deleted = subscription.exists === false;
86
+ const eventTypes = Array.isArray(subscription.eventTypes)
87
+ ? subscription.eventTypes
88
+ : [];
89
+ const handleMuteToggle = async () => {
90
+ if (pending)
91
+ return;
92
+ setPending("mute");
93
+ try {
94
+ if (subscription.isMuted) {
95
+ await unmuteTarget({
96
+ targetType: subscription.targetType,
97
+ targetId: subscription.targetId,
98
+ });
99
+ }
100
+ else {
101
+ await muteTarget({
102
+ targetType: subscription.targetType,
103
+ targetId: subscription.targetId,
104
+ });
105
+ }
106
+ }
107
+ finally {
108
+ setPending(null);
109
+ }
110
+ };
111
+ const handleUnsubscribe = async () => {
112
+ if (pending)
113
+ return;
114
+ setPending("unsubscribe");
115
+ try {
116
+ await unsubscribeFromTarget({
117
+ targetType: subscription.targetType,
118
+ targetId: subscription.targetId,
119
+ });
120
+ }
121
+ finally {
122
+ setPending(null);
123
+ }
124
+ };
125
+ return (_jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-gray-100 py-3 last:border-b-0", "data-testid": `notification-subscription-${targetType}-${subscription.targetId}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: cn("truncate text-sm font-medium", deleted ? "text-gray-400 line-through" : "text-gray-900"), title: displayName, children: displayName }), subscription.isAuto && (_jsx(Badge, { variant: "secondary", className: "shrink-0", children: "Auto" })), subscription.isMuted && (_jsx(Badge, { variant: "outline", className: "shrink-0 border-amber-300 text-amber-700", children: "Muted" })), subscription.includeDescendants && (_jsxs(Badge, { variant: "outline", className: "shrink-0 gap-1", children: [_jsx(FolderTree, { className: "size-3" }), "Subtree"] })), subscription.language && (_jsxs(Badge, { variant: "outline", className: "shrink-0 gap-1", children: [_jsx(Globe, { className: "size-3" }), subscription.language.toUpperCase()] }))] }), subtitle && (_jsx("div", { className: "mt-0.5 truncate text-xs text-gray-500", title: subtitle, children: subtitle })), eventTypes.length > 0 && (_jsx("div", { className: "mt-1.5 flex flex-wrap gap-1", children: eventTypes.map((eventType) => (_jsx(Badge, { variant: "secondary", className: "text-[10px] font-normal", children: getEventTypeLabel(eventType) }, eventType))) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "iconSm", onClick: () => void handleMuteToggle(), disabled: pending !== null, "aria-label": subscription.isMuted ? "Unmute" : "Mute", "data-testid": `notification-subscription-${targetType}-${subscription.targetId}-mute`, children: pending === "mute" ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : subscription.isMuted ? (_jsx(Bell, { className: "size-4" })) : (_jsx(BellOff, { className: "size-4" })) }) }), _jsx(TooltipContent, { children: subscription.isMuted ? "Unmute" : "Mute" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "iconSm", onClick: () => void handleUnsubscribe(), disabled: pending !== null, "aria-label": "Unsubscribe", "data-testid": `notification-subscription-${targetType}-${subscription.targetId}-unsubscribe`, children: pending === "unsubscribe" ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4 text-red-600" })) }) }), _jsx(TooltipContent, { children: "Unsubscribe" })] })] })] }));
126
+ }
127
+ export function NotificationSubscriptionsPanel() {
128
+ const { subscriptions, initialized, refreshing } = useNotificationSubscriptions();
129
+ const groups = useMemo(() => groupSubscriptions(subscriptions), [subscriptions]);
130
+ const isLoading = !initialized && refreshing;
131
+ const isEmpty = initialized && subscriptions.length === 0;
132
+ return (_jsx("div", { className: "h-full overflow-auto p-4", "data-testid": "notification-subscriptions-panel", children: _jsx("div", { className: "mx-auto max-w-3xl", children: isLoading ? (_jsxs("div", { className: "flex items-center justify-center py-12 text-sm text-gray-500", children: [_jsx(Loader2, { className: "mr-2 size-4 animate-spin" }), "Loading subscriptions\u2026"] })) : isEmpty ? (_jsx(Card, { icon: _jsx(Bell, { strokeWidth: 1, className: "h-5 w-5" }), title: "No subscriptions yet", description: "You're not watching anything right now.", children: _jsx("p", { className: "py-2 text-sm text-gray-500", children: "Use the watch button on items, projects, reviews, or agent runs to subscribe to notifications. They'll show up here so you can mute or unsubscribe at any time." }) })) : (_jsx("div", { className: "space-y-4", children: groups.map((group) => {
133
+ return (_jsx(Card, { icon: group.config.icon, title: group.config.title, description: `${group.items.length} subscription${group.items.length === 1 ? "" : "s"}`, children: _jsx("div", { className: "divide-y-0", children: group.items.map((subscription) => (_jsx(SubscriptionRow, { subscription: subscription }, subscription.id))) }) }, group.config.key));
134
+ }) })) }) }));
135
+ }
136
+ export default NotificationSubscriptionsPanel;
137
+ //# sourceMappingURL=NotificationSubscriptionsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationSubscriptionsPanel.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/NotificationSubscriptionsPanel.tsx"],"names":[],"mappings":"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"}
@@ -15,3 +15,4 @@ export { SettingsPanel } from "./SettingsPanel";
15
15
  export { StatusPanel } from "./StatusPanel";
16
16
  export { ClusterInstancesPanel } from "./ClusterInstancesPanel";
17
17
  export { UserPreferencesPanel } from "./UserPreferencesPanel";
18
+ export { NotificationSubscriptionsPanel } from "./NotificationSubscriptionsPanel";
@@ -15,4 +15,5 @@ export { SettingsPanel } from "./SettingsPanel";
15
15
  export { StatusPanel } from "./StatusPanel";
16
16
  export { ClusterInstancesPanel } from "./ClusterInstancesPanel";
17
17
  export { UserPreferencesPanel } from "./UserPreferencesPanel";
18
+ export { NotificationSubscriptionsPanel } from "./NotificationSubscriptionsPanel";
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "0.1.12798";
2
- export declare const buildDate = "2026-05-19 12:35:31";
1
+ export declare const version = "0.1.12800";
2
+ export declare const buildDate = "2026-05-19 14:29:51";
package/dist/revision.js CHANGED
@@ -1,3 +1,3 @@
1
- export const version = "0.1.12798";
2
- export const buildDate = "2026-05-19 12:35:31";
1
+ export const version = "0.1.12800";
2
+ export const buildDate = "2026-05-19 14:29:51";
3
3
  //# sourceMappingURL=revision.js.map
@@ -10,6 +10,11 @@ import { cn } from "../lib/utils";
10
10
  import { executeCustomCommand, isCustomCommandDisabled, renderCustomCommandIcon, } from "../editor/commands/customCommandConverter";
11
11
  import { getHomeQuickActions, getSystemStatus, } from "../editor/services/systemService";
12
12
  import { getAgentsGrouped } from "../editor/services/agentService";
13
+ import { getMyTasks } from "../task-board/services/taskService";
14
+ import { getTaskBoardNavSnapshot, setTaskBoardNavState, } from "../task-board/taskBoardNavStore";
15
+ import { normalizeTaskStatus } from "../task-board/taskStatus";
16
+ import { getMyReviews } from "../editor/services/reviewsService";
17
+ import { ClipboardCheck, ClipboardList } from "lucide-react";
13
18
  import { useNotifications } from "../editor/notifications/useNotifications";
14
19
  import { resolveNotificationAction } from "../editor/notifications/notificationRoutes";
15
20
  import { tourScrollIntoViewMarginClass } from "../tour/Tour";
@@ -48,6 +53,8 @@ export function ModernSplashScreen() {
48
53
  const [statusWarningDismissed, setStatusWarningDismissed] = useState(false);
49
54
  const [homeQuickActions, setHomeQuickActions] = useState([]);
50
55
  const [activeAgents, setActiveAgents] = useState([]);
56
+ const [myTasks, setMyTasks] = useState([]);
57
+ const [myReviews, setMyReviews] = useState([]);
51
58
  const { notifications, unreadCount, markRead } = useNotifications(editContext, { showAll: false });
52
59
  const [activeListTab, setActiveListTab] = useState(0);
53
60
  const greeting = useMemo(() => {
@@ -196,6 +203,92 @@ export function ModernSplashScreen() {
196
203
  mounted = false;
197
204
  };
198
205
  }, [canUseAi]);
206
+ useEffect(() => {
207
+ if (!editContext?.user?.name) {
208
+ setMyTasks([]);
209
+ return;
210
+ }
211
+ let cancelled = false;
212
+ (async () => {
213
+ const res = await getMyTasks({ excludeDone: true });
214
+ if (cancelled)
215
+ return;
216
+ if (res.type !== "success") {
217
+ setMyTasks([]);
218
+ return;
219
+ }
220
+ const list = (res.data ?? [])
221
+ .map((item) => ({
222
+ taskId: item.task.taskId,
223
+ projectId: item.task.projectId,
224
+ title: item.task.title,
225
+ projectTitle: item.projectTitle ?? "",
226
+ status: normalizeTaskStatus(item.task.status, item.task.executionState),
227
+ updatedAt: item.task.updatedAt,
228
+ }))
229
+ .sort((a, b) => {
230
+ const aTime = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
231
+ const bTime = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
232
+ return bTime - aTime;
233
+ });
234
+ setMyTasks(list);
235
+ })().catch(() => {
236
+ if (!cancelled)
237
+ setMyTasks([]);
238
+ });
239
+ return () => {
240
+ cancelled = true;
241
+ };
242
+ }, [editContext?.user?.name]);
243
+ useEffect(() => {
244
+ if (!editContext?.user?.name && !editContext?.user?.email) {
245
+ setMyReviews([]);
246
+ return;
247
+ }
248
+ let cancelled = false;
249
+ (async () => {
250
+ const res = await getMyReviews({ excludeFinished: true });
251
+ if (cancelled)
252
+ return;
253
+ if (res.type !== "success") {
254
+ setMyReviews([]);
255
+ return;
256
+ }
257
+ const list = [...(res.data ?? [])].sort((a, b) => {
258
+ const aTime = a.createdAt ? new Date(a.createdAt).getTime() : 0;
259
+ const bTime = b.createdAt ? new Date(b.createdAt).getTime() : 0;
260
+ return bTime - aTime;
261
+ });
262
+ setMyReviews(list);
263
+ })().catch(() => {
264
+ if (!cancelled)
265
+ setMyReviews([]);
266
+ });
267
+ return () => {
268
+ cancelled = true;
269
+ };
270
+ }, [editContext?.user?.name, editContext?.user?.email]);
271
+ const handleOpenReview = useCallback((review) => {
272
+ editContext?.updateUrl({ reviewId: review.reviewId });
273
+ editContext?.openSidebar?.("reviews");
274
+ editContext?.switchWorkspace("editor");
275
+ }, [editContext]);
276
+ const handleOpenTask = useCallback((task) => {
277
+ editContext?.switchWorkspace("taskboard");
278
+ const snap = getTaskBoardNavSnapshot();
279
+ if (snap.onSelectMyTask) {
280
+ snap.onSelectMyTask({
281
+ projectId: task.projectId,
282
+ taskId: task.taskId,
283
+ });
284
+ }
285
+ else {
286
+ setTaskBoardNavState({
287
+ selectedProjectId: task.projectId,
288
+ selectedTaskId: task.taskId,
289
+ });
290
+ }
291
+ }, [editContext]);
199
292
  const handleOpenAgent = useCallback((agentId) => {
200
293
  editContext?.switchWorkspace("agents");
201
294
  window.dispatchEvent(new CustomEvent("editor:openAgent", { detail: { agentId } }));
@@ -338,7 +431,7 @@ export function ModernSplashScreen() {
338
431
  }, []);
339
432
  return (_jsxs("div", { className: cn(
340
433
  // Keep a scroll container, but make the background move with content (not fixed to viewport).
341
- "relative flex h-dvh w-full flex-col overflow-y-auto bg-local transition-colors duration-1000", isDark ? "bg-black text-stone-200" : "text-stone-900"), style: isDark
434
+ "relative flex h-full min-h-0 w-full flex-col overflow-y-auto bg-local transition-colors duration-1000", isDark ? "bg-black text-stone-200" : "text-stone-900"), style: isDark
342
435
  ? undefined
343
436
  : {
344
437
  backgroundColor: "#f5f5f5",
@@ -368,7 +461,7 @@ export function ModernSplashScreen() {
368
461
  animation: content-fade-in 0.8s cubic-bezier(0.2, 0.8, 0.2, 1) forwards;
369
462
  }
370
463
  `,
371
- } }), _jsxs("div", { className: "relative z-10 flex flex-1 flex-col items-center px-4 py-8 md:py-10", children: [_jsxs("div", { className: "animate-content-entrance mt-6 mb-16 w-full max-w-7xl", style: { animationDelay: "0.6s" }, children: [_jsxs("p", { className: "text-base font-normal text-stone-500", children: [greeting.label, userFirstName ? `, ${userFirstName}` : "", _jsx("span", { className: "text-stone-400", children: "." })] }), _jsx("h1", { className: "mt-3 text-[40px] leading-tight font-semibold tracking-tight text-stone-900", children: greeting.subtitle })] }), _jsx("div", { className: "animate-content-entrance mb-12 w-full max-w-7xl", style: {
464
+ } }), _jsxs("div", { className: "relative z-10 flex flex-1 flex-col items-center px-4 py-8 md:py-10", "data-testid": "modern-splash-screen-main-content", children: [_jsxs("div", { className: "animate-content-entrance mt-6 mb-16 w-full max-w-7xl", style: { animationDelay: "0.6s" }, children: [_jsxs("p", { className: "text-base font-normal text-stone-500", children: [greeting.label, userFirstName ? `, ${userFirstName}` : "", _jsx("span", { className: "text-stone-400", children: "." })] }), _jsx("h1", { className: "mt-3 text-[40px] leading-tight font-semibold tracking-tight text-stone-900", children: greeting.subtitle })] }), _jsx("div", { className: "animate-content-entrance mb-12 w-full max-w-7xl", style: {
372
465
  animationDelay: "0.9s",
373
466
  viewTransitionName: "splash-search",
374
467
  }, children: _jsxs("div", { className: "relative flex flex-col rounded-xl border border-stone-200 bg-white p-3 [&_input]:!border-transparent [&_input]:!bg-transparent [&_input]:!pl-9 [&_input]:!ring-0 [&_input]:focus:!border-transparent [&_input]:focus:!ring-0 [&_.lucide-search:not([data-splash-search])]:!hidden", children: [_jsx(Search, { "data-splash-search": true, className: "pointer-events-none absolute top-[1.25rem] left-6 z-10 h-4 w-4 text-stone-700", strokeWidth: 2 }), _jsx(ItemSearch, { itemSelected: (item) => handleLoadSearchItem(item), resultClassName: "max-h-80", placeholder: "Search content" })] }) }), statusIssues.length > 0 && !statusWarningDismissed && (_jsx("div", { className: "animate-content-entrance mb-6 w-full max-w-7xl md:mb-8", style: {
@@ -405,8 +498,46 @@ export function ModernSplashScreen() {
405
498
  : n.priority === "high"
406
499
  ? "bg-rose-500"
407
500
  : "bg-stone-500") }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-sm font-semibold text-stone-900", children: n.title }), n.message && (_jsx("div", { className: "mt-0.5 line-clamp-2 text-xs text-stone-500", children: n.message }))] })] }, n.id))) })) }));
501
+ const myTasksContent = (_jsx("div", { className: listCardClass, children: myTasks.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center gap-2 p-12 text-center text-sm text-stone-500", children: [_jsx(ClipboardCheck, { className: "h-5 w-5 text-stone-400", strokeWidth: 1.5 }), "No tasks assigned to you"] })) : (_jsx("div", { className: "divide-y divide-stone-200", children: myTasks.slice(0, 12).map((task) => (_jsxs("button", { onClick: () => handleOpenTask(task), className: "group relative flex w-full cursor-pointer items-center gap-3 px-5 py-3 text-left transition-colors duration-200 hover:bg-stone-50", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-sm font-semibold text-stone-900", children: task.title }), _jsx("div", { className: "mt-0.5 truncate text-xs text-stone-500", children: task.projectTitle })] }), _jsx("span", { className: cn("shrink-0 rounded-[4px] px-2 py-1 text-[11px] font-normal capitalize", task.status === "Done"
502
+ ? "bg-[#DDF9ED] text-[#1A8B5D]"
503
+ : task.status === "InProgress"
504
+ ? "bg-emerald-100 text-emerald-700"
505
+ : task.status === "Review"
506
+ ? "bg-yellow-100 text-yellow-800"
507
+ : task.status === "Waiting"
508
+ ? "bg-yellow-100 text-yellow-800"
509
+ : "bg-stone-100 text-stone-700"), children: task.status })] }, `${task.projectId}:${task.taskId}`))) })) }));
510
+ const myReviewsContent = (_jsx("div", { className: listCardClass, children: myReviews.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center gap-2 p-12 text-center text-sm text-stone-500", children: [_jsx(ClipboardList, { className: "h-5 w-5 text-stone-400", strokeWidth: 1.5 }), "No reviews waiting for you"] })) : (_jsx("div", { className: "divide-y divide-stone-200", children: myReviews.slice(0, 12).map((review) => {
511
+ const status = review.finalDecision ??
512
+ review.status ??
513
+ (review.isExpired ? "Expired" : "Pending");
514
+ return (_jsxs("button", { onClick: () => handleOpenReview(review), className: "group relative flex w-full cursor-pointer items-center gap-3 px-5 py-3 text-left transition-colors duration-200 hover:bg-stone-50", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-sm font-semibold text-stone-900", children: review.title || "Untitled review" }), _jsxs("div", { className: "mt-0.5 truncate text-xs text-stone-500", children: [review.pagesCount, " page", review.pagesCount !== 1 ? "s" : "", review.reviewersCount > 0
515
+ ? ` · ${review.reviewersCount} reviewer${review.reviewersCount !== 1 ? "s" : ""}`
516
+ : ""] })] }), _jsx("span", { className: cn("shrink-0 rounded-[4px] px-2 py-1 text-[11px] font-normal capitalize", status === "Approved"
517
+ ? "bg-[#DDF9ED] text-[#1A8B5D]"
518
+ : status === "Rejected"
519
+ ? "bg-[#FAE0DD] text-[#A73E2C]"
520
+ : status === "Expired"
521
+ ? "bg-stone-100 text-stone-700"
522
+ : "bg-yellow-100 text-yellow-800"), children: status })] }, review.reviewId));
523
+ }) })) }));
524
+ const renderCountBadge = (count) => (_jsx("span", { className: "rounded-[2px] bg-stone-200 px-1.5 py-0.5 text-[10px] font-semibold text-stone-700", children: count }));
408
525
  const tabs = [
409
526
  { id: "recent", label: "Recent Items", content: recentContent },
527
+ {
528
+ id: "my-tasks",
529
+ label: "My Tasks",
530
+ content: myTasksContent,
531
+ badge: myTasks.length > 0 ? renderCountBadge(myTasks.length) : undefined,
532
+ },
533
+ {
534
+ id: "my-reviews",
535
+ label: "My Reviews",
536
+ content: myReviewsContent,
537
+ badge: myReviews.length > 0
538
+ ? renderCountBadge(myReviews.length)
539
+ : undefined,
540
+ },
410
541
  ];
411
542
  if (canUseAi) {
412
543
  tabs.push({ id: "agents", label: "Agents", content: agentsContent });
@@ -415,12 +546,12 @@ export function ModernSplashScreen() {
415
546
  id: "notifications",
416
547
  label: "Notifications",
417
548
  content: notificationsContent,
418
- badge: unreadCount > 0 ? (_jsx("span", { className: "rounded-[2px] bg-stone-200 px-1.5 py-0.5 text-[10px] font-semibold text-stone-700", children: unreadCount })) : undefined,
549
+ badge: unreadCount > 0 ? renderCountBadge(unreadCount) : undefined,
419
550
  });
420
551
  return (_jsxs("div", { className: "animate-content-entrance grid w-full max-w-7xl gap-x-8 md:grid-cols-[1fr_3fr]", style: {
421
552
  animationDelay: "1.3s",
422
553
  viewTransitionName: "splash-quick-actions",
423
- }, children: [quickActionCommands.length > 0 ? (_jsxs("section", { children: [_jsx("h2", { className: "mb-6 border-b border-stone-200 px-4 pt-3 pb-3 text-[14px] font-medium tracking-tight text-stone-900", children: "Quick Actions" }), _jsx("div", { className: "flex flex-col gap-3", children: quickActionCommands.map((command) => {
554
+ }, children: [quickActionCommands.length > 0 ? (_jsxs("section", { "data-testid": "modern-splash-screen-quick-actions", children: [_jsx("h2", { className: "mb-6 border-b border-stone-200 px-4 pt-3 pb-3 text-[14px] font-medium tracking-tight text-stone-900", children: "Quick Actions" }), _jsx("div", { className: "flex flex-col gap-3", children: quickActionCommands.map((command) => {
424
555
  const quickActionTestId = getQuickActionTestId(command);
425
556
  return (_jsx(BentoTile, { icon: getQuickActionIcon(command), title: command.label, description: command.description, onClick: () => handleQuickActionClick(command), dataTestId: quickActionTestId, className: quickActionTestId === "create-new-page-button"
426
557
  ? tourScrollIntoViewMarginClass