@cerbur/clutch-dsh-worktree 0.1.24 → 0.1.25
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/README.md +54 -12
- package/README.zh.md +45 -12
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +2 -1
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/dsh-icons.d.ts +1 -0
- package/lib/client/dsh-icons.d.ts.map +1 -1
- package/lib/client/dsh-icons.js +1 -0
- package/lib/client/dsh-icons.js.map +1 -1
- package/lib/client/locales.d.ts +28 -2
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +28 -2
- package/lib/client/locales.js.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.js +8 -2
- package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
- package/lib/client/surface/components/ActivityFilterBar.d.ts +16 -0
- package/lib/client/surface/components/ActivityFilterBar.d.ts.map +1 -0
- package/lib/client/surface/components/ActivityFilterBar.js +48 -0
- package/lib/client/surface/components/ActivityFilterBar.js.map +1 -0
- package/lib/client/surface/components/AnimatedTree.js +2 -2
- package/lib/client/surface/components/AnimatedTree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.js +7 -2
- package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
- package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
- package/lib/client/surface/components/SurfaceContent.d.ts +2 -2
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts +2 -2
- package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +34 -11
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +1 -1
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/state/useActivityFilter.d.ts +25 -0
- package/lib/client/surface/state/useActivityFilter.d.ts.map +1 -0
- package/lib/client/surface/state/useActivityFilter.js +79 -0
- package/lib/client/surface/state/useActivityFilter.js.map +1 -0
- package/lib/client/surface/state/useSessionExpansion.d.ts +2 -0
- package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.js +75 -17
- package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts +2 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +12 -0
- package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
- package/lib/client/view/activity-filter.d.ts +86 -0
- package/lib/client/view/activity-filter.d.ts.map +1 -0
- package/lib/client/view/activity-filter.js +121 -0
- package/lib/client/view/activity-filter.js.map +1 -0
- package/lib/client/view/view-mode-store.d.ts.map +1 -1
- package/lib/client/view/view-mode-store.js +26 -1
- package/lib/client/view/view-mode-store.js.map +1 -1
- package/lib/client/view/view-mode.d.ts +18 -1
- package/lib/client/view/view-mode.d.ts.map +1 -1
- package/lib/client/view/view-mode.js.map +1 -1
- package/lib/client/view/worktree-expand-state.d.ts +12 -1
- package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
- package/lib/client/view/worktree-expand-state.js +26 -0
- package/lib/client/view/worktree-expand-state.js.map +1 -1
- package/lib/client.js +576 -76
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type SessionListLike } from '../../session/session-view.js';
|
|
2
2
|
import type { WorkspaceListLike, WorktreeSurfaceProps } from '../types.js';
|
|
3
3
|
type Input = {
|
|
4
|
-
props: Pick<WorktreeSurfaceProps, 'useStore' | 'available' | 'manager' | 'useSessions' | 'useSessionStatus' | 'useWorkspaces' | 'forkRecovery' | 'expandState' | 'sessionOrder' | 'sidebarSeat'>;
|
|
4
|
+
props: Pick<WorktreeSurfaceProps, 'useStore' | 'actions' | 'available' | 'manager' | 'useSessions' | 'useSessionStatus' | 'useWorkspaces' | 'forkRecovery' | 'expandState' | 'sessionOrder' | 'sidebarSeat'>;
|
|
5
5
|
};
|
|
6
6
|
export declare function useSurfaceSources({ props }: Input): {
|
|
7
7
|
preferredMode: import("../../view/view-mode.js").WorktreeViewMode;
|
|
@@ -16,6 +16,7 @@ export declare function useSurfaceSources({ props }: Input): {
|
|
|
16
16
|
expandSnapshot: import("../../view/worktree-expand-state.js").WorktreeExpandState;
|
|
17
17
|
sessionOrderSnapshot: import("../../session/worktree-session-order.js").WorktreeSessionOrderState;
|
|
18
18
|
sessionPresentations: Readonly<Record<string, import("../../session/session-view.js").SessionPresentation>>;
|
|
19
|
+
activity: import("../../view/activity-filter.js").ActivityFilterView;
|
|
19
20
|
bounds: {
|
|
20
21
|
ready: boolean;
|
|
21
22
|
top: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSurfaceSources.d.ts","sourceRoot":"","sources":["../../../../src/client/surface/state/useSurfaceSources.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"useSurfaceSources.d.ts","sourceRoot":"","sources":["../../../../src/client/surface/state/useSurfaceSources.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AASvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG3E,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,IAAI,CACT,oBAAoB,EAClB,UAAU,GACV,SAAS,GACT,WAAW,GACX,SAAS,GACT,aAAa,GACb,kBAAkB,GAClB,eAAe,GACf,cAAc,GACd,aAAa,GACb,cAAc,GACd,aAAa,CAChB,CAAC;CACH,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;EA8EjD"}
|
|
@@ -4,6 +4,7 @@ import { useWorkspaceRegionGeometry } from '../../view/workspace-region-geometry
|
|
|
4
4
|
import { effectiveViewMode } from '../../view/view-mode.js';
|
|
5
5
|
import { currentSessionIdFromList } from '../../session/session-selection.js';
|
|
6
6
|
import { EMPTY_FORK_RECOVERY_STORE, useStableWorkspaceIds, } from '../shared.js';
|
|
7
|
+
import { useActivityFilter } from './useActivityFilter.js';
|
|
7
8
|
import { retainPendingWorkspaces } from '../selectors.js';
|
|
8
9
|
export function useSurfaceSources({ props }) {
|
|
9
10
|
const { useStore, available, manager, useSessions, useSessionStatus, useWorkspaces, forkRecovery, expandState, sessionOrder, } = props;
|
|
@@ -30,6 +31,16 @@ export function useSurfaceSources({ props }) {
|
|
|
30
31
|
const sessionPresentations = useMemo(() => deriveSessionPresentationIndex(sessions, sessionStatuses), [sessions.byId, sessionStatuses]);
|
|
31
32
|
const { bounds, collapsed } = useWorkspaceRegionGeometry(props.sidebarSeat);
|
|
32
33
|
const archivedSessionIds = workspaces.archivedSessionIds ?? [];
|
|
34
|
+
const activity = useActivityFilter({
|
|
35
|
+
props,
|
|
36
|
+
enabled: mode === 'worktree',
|
|
37
|
+
source: {
|
|
38
|
+
sessions,
|
|
39
|
+
sessionPresentations,
|
|
40
|
+
currentSessionId,
|
|
41
|
+
archivedSessionIds,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
33
44
|
return {
|
|
34
45
|
preferredMode,
|
|
35
46
|
mode,
|
|
@@ -43,6 +54,7 @@ export function useSurfaceSources({ props }) {
|
|
|
43
54
|
expandSnapshot,
|
|
44
55
|
sessionOrderSnapshot,
|
|
45
56
|
sessionPresentations,
|
|
57
|
+
activity,
|
|
46
58
|
bounds,
|
|
47
59
|
collapsed,
|
|
48
60
|
archivedSessionIds,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSurfaceSources.js","sourceRoot":"","sources":["../../../../src/client/surface/state/useSurfaceSources.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EACL,8BAA8B,GAE/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useSurfaceSources.js","sourceRoot":"","sources":["../../../../src/client/surface/state/useSurfaceSources.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { SessionListLike, SessionPresentation } from '../session/session-view.js';
|
|
2
|
+
/**
|
|
3
|
+
* Browser-only activity window that scopes the Worktree tree.
|
|
4
|
+
*
|
|
5
|
+
* The filter is a presentation projection over native Session facts
|
|
6
|
+
* (`updatedAt`, running state and pending interaction). It never adds an RPC,
|
|
7
|
+
* never reads Git, and never writes a Sidecar field: hiding a row must not
|
|
8
|
+
* change what the Host or DSH considers to exist.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ACTIVITY_WINDOWS: readonly ["today", "last24h", "last7d", "all"];
|
|
11
|
+
export type ActivityWindowId = (typeof ACTIVITY_WINDOWS)[number];
|
|
12
|
+
/** Preserve the pre-filter tree for existing users and for a fresh profile. */
|
|
13
|
+
export declare const DEFAULT_ACTIVITY_WINDOW: ActivityWindowId;
|
|
14
|
+
export declare function isActivityWindowId(value: unknown): value is ActivityWindowId;
|
|
15
|
+
/** Guard persisted values before they scope a visible tree. */
|
|
16
|
+
export declare function effectiveActivityWindow(value: unknown): ActivityWindowId;
|
|
17
|
+
/** The selector shows every range until the user narrows it. */
|
|
18
|
+
export declare const DEFAULT_ACTIVITY_WINDOWS: readonly ActivityWindowId[];
|
|
19
|
+
/**
|
|
20
|
+
* Guard the persisted visible-range list: unknown and duplicate entries are
|
|
21
|
+
* dropped, the canonical selector order is restored, and an empty result falls
|
|
22
|
+
* back to every range so the selector can never become unreachable.
|
|
23
|
+
*/
|
|
24
|
+
export declare function effectiveActivityWindows(value: unknown): readonly ActivityWindowId[];
|
|
25
|
+
/**
|
|
26
|
+
* Apply one visibility checkbox without producing an empty selector.
|
|
27
|
+
* Re-showing a range inserts it back into the canonical order.
|
|
28
|
+
*/
|
|
29
|
+
export declare function toggleActivityWindow(current: readonly ActivityWindowId[], window: ActivityWindowId, visible: boolean): readonly ActivityWindowId[];
|
|
30
|
+
/**
|
|
31
|
+
* Pick the tab that takes over when the selected range is hidden: the next
|
|
32
|
+
* visible range in selector order, wrapping to the first one at the end.
|
|
33
|
+
*/
|
|
34
|
+
export declare function nextActivityWindow(hidden: ActivityWindowId, visible: readonly ActivityWindowId[]): ActivityWindowId;
|
|
35
|
+
/** Local calendar-day start: DSH presents Session times in the local time zone. */
|
|
36
|
+
export declare function startOfLocalDay(now: number): number;
|
|
37
|
+
/** Inclusive lower bound in epoch milliseconds; `undefined` disables filtering. */
|
|
38
|
+
export declare function activityWindowSince(window: ActivityWindowId, now: number): number | undefined;
|
|
39
|
+
/** Native facts one activity decision needs. */
|
|
40
|
+
export interface ActivitySessionScope {
|
|
41
|
+
readonly sessions: Pick<SessionListLike, 'byId'>;
|
|
42
|
+
readonly sessionPresentations: Readonly<Record<string, SessionPresentation | undefined>>;
|
|
43
|
+
/** The selected Session stays visible in every window; navigation must not hide it. */
|
|
44
|
+
readonly currentSessionId?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A Session is active in a window when it runs now, waits for interaction, or
|
|
48
|
+
* was updated inside the window. Running and pending Sessions count even with
|
|
49
|
+
* an old `updatedAt`, because they are active now.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isSessionActiveInWindow(sessionId: string, window: ActivityWindowId, now: number, scope: ActivitySessionScope): boolean;
|
|
52
|
+
/** Filter a group without mutating its source order. */
|
|
53
|
+
export declare function filterSessionIdsByActivity(sessionIds: readonly string[], window: ActivityWindowId, now: number, scope: ActivitySessionScope): readonly string[];
|
|
54
|
+
/** Session scope the tree and the range selector both count. */
|
|
55
|
+
export declare function activityCandidateSessionIds(source: Pick<SessionListLike, 'ids' | 'byId'>, archivedSessionIds: readonly string[]): readonly string[];
|
|
56
|
+
/** Count the Sessions a window would show; used for the range selector labels. */
|
|
57
|
+
export declare function countSessionsInWindow(candidateSessionIds: readonly string[], window: ActivityWindowId, now: number, scope: ActivitySessionScope): number;
|
|
58
|
+
/** Read face the tree components consume; produced by `useActivityFilter`. */
|
|
59
|
+
export interface ActivityFilterView {
|
|
60
|
+
readonly window: ActivityWindowId;
|
|
61
|
+
/** Whether a bounded window is active, i.e. rows may be hidden. */
|
|
62
|
+
readonly active: boolean;
|
|
63
|
+
readonly now: number;
|
|
64
|
+
readonly setWindow: (window: ActivityWindowId) => void;
|
|
65
|
+
/** Ranges the selector shows, in canonical order; never empty. */
|
|
66
|
+
readonly visibleWindows: readonly ActivityWindowId[];
|
|
67
|
+
readonly isWindowVisible: (window: ActivityWindowId) => boolean;
|
|
68
|
+
/** Show or hide one selector tab; hiding the last tab is ignored. */
|
|
69
|
+
readonly setWindowVisible: (window: ActivityWindowId, visible: boolean) => void;
|
|
70
|
+
/**
|
|
71
|
+
* Keep Workspaces/Worktrees with no Session in the range. Defaults to true;
|
|
72
|
+
* users can turn it off to scope structure to the activity range.
|
|
73
|
+
*/
|
|
74
|
+
readonly showInactiveStructure: boolean;
|
|
75
|
+
readonly setShowInactiveStructure: (show: boolean) => void;
|
|
76
|
+
/** Ephemeral dropdown state for the visible-range checkboxes. */
|
|
77
|
+
readonly menuOpen: boolean;
|
|
78
|
+
readonly setMenuOpen: (open: boolean) => void;
|
|
79
|
+
readonly isActive: (sessionId: string) => boolean;
|
|
80
|
+
/** Narrow a list to the range; `all` returns the input unchanged. */
|
|
81
|
+
readonly scopeSessionIds: (sessionIds: readonly string[]) => readonly string[];
|
|
82
|
+
/** Whether any candidate Session survives this window. */
|
|
83
|
+
readonly hasActiveSession: (sessionIds: readonly string[]) => boolean;
|
|
84
|
+
readonly count: (window: ActivityWindowId) => number;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=activity-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-filter.d.ts","sourceRoot":"","sources":["../../../src/client/view/activity-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-only activity window that scopes the Worktree tree.
|
|
3
|
+
*
|
|
4
|
+
* The filter is a presentation projection over native Session facts
|
|
5
|
+
* (`updatedAt`, running state and pending interaction). It never adds an RPC,
|
|
6
|
+
* never reads Git, and never writes a Sidecar field: hiding a row must not
|
|
7
|
+
* change what the Host or DSH considers to exist.
|
|
8
|
+
*/
|
|
9
|
+
export const ACTIVITY_WINDOWS = ['today', 'last24h', 'last7d', 'all'];
|
|
10
|
+
/** Preserve the pre-filter tree for existing users and for a fresh profile. */
|
|
11
|
+
export const DEFAULT_ACTIVITY_WINDOW = 'all';
|
|
12
|
+
const DAY_MS = 86_400_000;
|
|
13
|
+
export function isActivityWindowId(value) {
|
|
14
|
+
return typeof value === 'string' && ACTIVITY_WINDOWS.includes(value);
|
|
15
|
+
}
|
|
16
|
+
/** Guard persisted values before they scope a visible tree. */
|
|
17
|
+
export function effectiveActivityWindow(value) {
|
|
18
|
+
return isActivityWindowId(value) ? value : DEFAULT_ACTIVITY_WINDOW;
|
|
19
|
+
}
|
|
20
|
+
/** The selector shows every range until the user narrows it. */
|
|
21
|
+
export const DEFAULT_ACTIVITY_WINDOWS = ACTIVITY_WINDOWS;
|
|
22
|
+
/**
|
|
23
|
+
* Guard the persisted visible-range list: unknown and duplicate entries are
|
|
24
|
+
* dropped, the canonical selector order is restored, and an empty result falls
|
|
25
|
+
* back to every range so the selector can never become unreachable.
|
|
26
|
+
*/
|
|
27
|
+
export function effectiveActivityWindows(value) {
|
|
28
|
+
const values = Array.isArray(value) ? value.filter(isActivityWindowId) : [];
|
|
29
|
+
const selected = new Set(values);
|
|
30
|
+
const visible = ACTIVITY_WINDOWS.filter((window) => selected.has(window));
|
|
31
|
+
return visible.length > 0 ? visible : DEFAULT_ACTIVITY_WINDOWS;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Apply one visibility checkbox without producing an empty selector.
|
|
35
|
+
* Re-showing a range inserts it back into the canonical order.
|
|
36
|
+
*/
|
|
37
|
+
export function toggleActivityWindow(current, window, visible) {
|
|
38
|
+
const enabled = new Set(current);
|
|
39
|
+
const wasVisible = enabled.has(window);
|
|
40
|
+
if (visible === wasVisible)
|
|
41
|
+
return current;
|
|
42
|
+
if (visible)
|
|
43
|
+
enabled.add(window);
|
|
44
|
+
else
|
|
45
|
+
enabled.delete(window);
|
|
46
|
+
if (enabled.size === 0)
|
|
47
|
+
return current;
|
|
48
|
+
return ACTIVITY_WINDOWS.filter((candidate) => enabled.has(candidate));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Pick the tab that takes over when the selected range is hidden: the next
|
|
52
|
+
* visible range in selector order, wrapping to the first one at the end.
|
|
53
|
+
*/
|
|
54
|
+
export function nextActivityWindow(hidden, visible) {
|
|
55
|
+
const start = ACTIVITY_WINDOWS.indexOf(hidden);
|
|
56
|
+
for (let step = 1; step <= ACTIVITY_WINDOWS.length; step += 1) {
|
|
57
|
+
const candidate = ACTIVITY_WINDOWS[(start + step) % ACTIVITY_WINDOWS.length];
|
|
58
|
+
if (candidate !== undefined && visible.includes(candidate))
|
|
59
|
+
return candidate;
|
|
60
|
+
}
|
|
61
|
+
return visible[0] ?? DEFAULT_ACTIVITY_WINDOW;
|
|
62
|
+
}
|
|
63
|
+
/** Local calendar-day start: DSH presents Session times in the local time zone. */
|
|
64
|
+
export function startOfLocalDay(now) {
|
|
65
|
+
const date = new Date(now);
|
|
66
|
+
date.setHours(0, 0, 0, 0);
|
|
67
|
+
return date.getTime();
|
|
68
|
+
}
|
|
69
|
+
/** Inclusive lower bound in epoch milliseconds; `undefined` disables filtering. */
|
|
70
|
+
export function activityWindowSince(window, now) {
|
|
71
|
+
if (!Number.isFinite(now))
|
|
72
|
+
return undefined;
|
|
73
|
+
switch (window) {
|
|
74
|
+
case 'today':
|
|
75
|
+
return startOfLocalDay(now);
|
|
76
|
+
case 'last24h':
|
|
77
|
+
return now - DAY_MS;
|
|
78
|
+
case 'last7d':
|
|
79
|
+
return now - 7 * DAY_MS;
|
|
80
|
+
case 'all':
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function lastActivityAt(sessionId, scope) {
|
|
85
|
+
const updatedAt = scope.sessionPresentations[sessionId]?.updatedAt ?? scope.sessions.byId[sessionId]?.updatedAt;
|
|
86
|
+
return updatedAt !== undefined && Number.isFinite(updatedAt) ? updatedAt : undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A Session is active in a window when it runs now, waits for interaction, or
|
|
90
|
+
* was updated inside the window. Running and pending Sessions count even with
|
|
91
|
+
* an old `updatedAt`, because they are active now.
|
|
92
|
+
*/
|
|
93
|
+
export function isSessionActiveInWindow(sessionId, window, now, scope) {
|
|
94
|
+
const since = activityWindowSince(window, now);
|
|
95
|
+
if (since === undefined)
|
|
96
|
+
return true;
|
|
97
|
+
if (scope.currentSessionId === sessionId)
|
|
98
|
+
return true;
|
|
99
|
+
const presentation = scope.sessionPresentations[sessionId];
|
|
100
|
+
if (presentation !== undefined && (presentation.ongoing || presentation.status.state === 'warning')) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
const at = lastActivityAt(sessionId, scope);
|
|
104
|
+
return at !== undefined && at >= since;
|
|
105
|
+
}
|
|
106
|
+
/** Filter a group without mutating its source order. */
|
|
107
|
+
export function filterSessionIdsByActivity(sessionIds, window, now, scope) {
|
|
108
|
+
if (window === 'all')
|
|
109
|
+
return sessionIds;
|
|
110
|
+
return sessionIds.filter((sessionId) => isSessionActiveInWindow(sessionId, window, now, scope));
|
|
111
|
+
}
|
|
112
|
+
/** Session scope the tree and the range selector both count. */
|
|
113
|
+
export function activityCandidateSessionIds(source, archivedSessionIds) {
|
|
114
|
+
const excluded = new Set(archivedSessionIds);
|
|
115
|
+
return source.ids.filter((sessionId) => !excluded.has(sessionId) && source.byId[sessionId]?.blank !== true);
|
|
116
|
+
}
|
|
117
|
+
/** Count the Sessions a window would show; used for the range selector labels. */
|
|
118
|
+
export function countSessionsInWindow(candidateSessionIds, window, now, scope) {
|
|
119
|
+
return filterSessionIdsByActivity(candidateSessionIds, window, now, scope).length;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=activity-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-filter.js","sourceRoot":"","sources":["../../../src/client/view/activity-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-mode-store.d.ts","sourceRoot":"","sources":["../../../src/client/view/view-mode-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"view-mode-store.d.ts","sourceRoot":"","sources":["../../../src/client/view/view-mode-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAUpF,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,sFAAsF;AACtF,wBAAgB,uBAAuB,IAAI,iBAAiB,CAC1D,iBAAiB,EACjB,mBAAmB,CACpB,CAoCA"}
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
import { defineStore } from '@deepseek-ai/dsh-client-store';
|
|
2
|
+
import { DEFAULT_ACTIVITY_WINDOW, DEFAULT_ACTIVITY_WINDOWS, effectiveActivityWindow, effectiveActivityWindows, nextActivityWindow, toggleActivityWindow, } from './activity-filter.js';
|
|
2
3
|
import { WORKTREE_VIEW_MODE_STORAGE_KEY, } from './view-mode.js';
|
|
3
4
|
/** Create one root-scoped, browser-local view-mode store for the two slot entries. */
|
|
4
5
|
export function createWorktreeViewStore() {
|
|
5
6
|
return defineStore({
|
|
6
|
-
init: () => ({
|
|
7
|
+
init: () => ({
|
|
8
|
+
viewMode: 'workspace-session',
|
|
9
|
+
activityWindow: DEFAULT_ACTIVITY_WINDOW,
|
|
10
|
+
activityWindows: [...DEFAULT_ACTIVITY_WINDOWS],
|
|
11
|
+
showInactiveStructure: true,
|
|
12
|
+
}),
|
|
7
13
|
persist: WORKTREE_VIEW_MODE_STORAGE_KEY,
|
|
8
14
|
actions: {
|
|
9
15
|
setViewMode: (draft, mode) => {
|
|
10
16
|
draft.viewMode = mode;
|
|
11
17
|
},
|
|
18
|
+
setActivityWindow: (draft, window) => {
|
|
19
|
+
// Normalize an older persisted payload that predates the visible set.
|
|
20
|
+
draft.activityWindows = effectiveActivityWindows(draft.activityWindows);
|
|
21
|
+
draft.activityWindow = window;
|
|
22
|
+
},
|
|
23
|
+
setShowInactiveStructure: (draft, show) => {
|
|
24
|
+
draft.showInactiveStructure = show === true;
|
|
25
|
+
},
|
|
26
|
+
setActivityWindowVisible: (draft, window, visible) => {
|
|
27
|
+
const current = effectiveActivityWindows(draft.activityWindows);
|
|
28
|
+
const next = toggleActivityWindow(current, window, visible);
|
|
29
|
+
if (next === current)
|
|
30
|
+
return;
|
|
31
|
+
draft.activityWindows = next;
|
|
32
|
+
// Hiding the selected tab hands the selection to the next visible tab.
|
|
33
|
+
const selected = effectiveActivityWindow(draft.activityWindow);
|
|
34
|
+
if (!next.includes(selected))
|
|
35
|
+
draft.activityWindow = nextActivityWindow(selected, next);
|
|
36
|
+
},
|
|
12
37
|
},
|
|
13
38
|
});
|
|
14
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-mode-store.js","sourceRoot":"","sources":["../../../src/client/view/view-mode-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,+BAA+B,CAAC;AACpF,OAAO,EACL,8BAA8B,GAG/B,MAAM,gBAAgB,CAAC;AAExB,sFAAsF;AACtF,MAAM,UAAU,uBAAuB;IAIrC,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,GAAsB,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"view-mode-store.js","sourceRoot":"","sources":["../../../src/client/view/view-mode-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,+BAA+B,CAAC;AACpF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,8BAA8B,GAG/B,MAAM,gBAAgB,CAAC;AAExB,sFAAsF;AACtF,MAAM,UAAU,uBAAuB;IAIrC,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,GAAsB,EAAE,CAAC,CAAC;YAC9B,QAAQ,EAAE,mBAAmB;YAC7B,cAAc,EAAE,uBAAuB;YACvC,eAAe,EAAE,CAAC,GAAG,wBAAwB,CAAC;YAC9C,qBAAqB,EAAE,IAAI;SAC5B,CAAC;QACF,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE;YACP,WAAW,EAAE,CAAC,KAAK,EAAE,IAAmC,EAAE,EAAE;gBAC1D,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAwB,EAAE,EAAE;gBACrD,sEAAsE;gBACtE,KAAK,CAAC,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACxE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC;YAChC,CAAC;YACD,wBAAwB,EAAE,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;gBACjD,KAAK,CAAC,qBAAqB,GAAG,IAAI,KAAK,IAAI,CAAC;YAC9C,CAAC;YACD,wBAAwB,EAAE,CACxB,KAAK,EACL,MAAwB,EACxB,OAAgB,EAChB,EAAE;gBACF,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAChE,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5D,IAAI,IAAI,KAAK,OAAO;oBAAE,OAAO;gBAC7B,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC7B,uEAAuE;gBACvE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,KAAK,CAAC,cAAc,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1F,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import type { ActionsDecl } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
|
+
import type { ActivityWindowId } from './activity-filter.js';
|
|
2
3
|
/** Peer navigation modes owned by this browser Consumer. */
|
|
3
4
|
export type WorktreeViewMode = 'workspace-session' | 'worktree';
|
|
4
5
|
/** Browser-local storage key; it is never sent to DSH or the sidecar. */
|
|
5
6
|
export declare const WORKTREE_VIEW_MODE_STORAGE_KEY = "clutch-dsh-worktree.view-mode";
|
|
6
|
-
/**
|
|
7
|
+
/** Durable Client preferences: the peer mode plus its activity range. */
|
|
7
8
|
export interface WorktreeViewState {
|
|
8
9
|
viewMode: WorktreeViewMode;
|
|
10
|
+
/** Bounded activity window; guard persisted values with `effectiveActivityWindow`. */
|
|
11
|
+
activityWindow: ActivityWindowId;
|
|
12
|
+
/**
|
|
13
|
+
* Ranges the selector shows, in canonical order; guard persisted values with
|
|
14
|
+
* `effectiveActivityWindows`. The list is never empty.
|
|
15
|
+
*/
|
|
16
|
+
activityWindows: readonly ActivityWindowId[];
|
|
17
|
+
/**
|
|
18
|
+
* Keep Workspaces and Worktrees whose Sessions are all outside the selected
|
|
19
|
+
* range. Defaults to true so structure and management actions stay visible;
|
|
20
|
+
* an explicit false scopes the structure to the activity range.
|
|
21
|
+
*/
|
|
22
|
+
showInactiveStructure: boolean;
|
|
9
23
|
}
|
|
10
24
|
/** A browser-local Worktree → DSH Workspace membership projection. */
|
|
11
25
|
export interface VirtualWorkspaceBinding {
|
|
@@ -15,6 +29,9 @@ export interface VirtualWorkspaceBinding {
|
|
|
15
29
|
/** The complete mutation face for the view-mode store. */
|
|
16
30
|
export type WorktreeViewActions = ActionsDecl<WorktreeViewState> & {
|
|
17
31
|
setViewMode: (draft: WorktreeViewState, mode: WorktreeViewMode) => void;
|
|
32
|
+
setActivityWindow: (draft: WorktreeViewState, window: ActivityWindowId) => void;
|
|
33
|
+
setShowInactiveStructure: (draft: WorktreeViewState, show: boolean) => void;
|
|
34
|
+
setActivityWindowVisible: (draft: WorktreeViewState, window: ActivityWindowId, visible: boolean) => void;
|
|
18
35
|
};
|
|
19
36
|
/** Guard persisted values before they become a visible mode. */
|
|
20
37
|
export declare function isWorktreeViewMode(value: unknown): value is WorktreeViewMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-mode.d.ts","sourceRoot":"","sources":["../../../src/client/view/view-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"view-mode.d.ts","sourceRoot":"","sources":["../../../src/client/view/view-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-mode.js","sourceRoot":"","sources":["../../../src/client/view/view-mode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"view-mode.js","sourceRoot":"","sources":["../../../src/client/view/view-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { createSnapshotStore as dshCreateSnapshotStore, SnapshotStore } from '@deepseek-ai/dsh-client-store';
|
|
2
2
|
/** Browser-local storage identity; never sent to DSH or the plugin sidecar. */
|
|
3
3
|
export declare const WORKTREE_EXPAND_STATE_STORAGE_KEY = "clutch-dsh-worktree.expand-state";
|
|
4
|
-
/** Persisted structural exceptions; absent IDs are expanded. */
|
|
4
|
+
/** Persisted structural exceptions; absent IDs are expanded, with at most one Workspace open. */
|
|
5
5
|
export interface WorktreeExpandState {
|
|
6
6
|
collapsedWorkspaceIds: Record<string, true>;
|
|
7
7
|
collapsedMainWorkspaceIds: Record<string, true>;
|
|
@@ -10,6 +10,8 @@ export interface WorktreeExpandState {
|
|
|
10
10
|
/** The browser-facing mutation set for the expand-state store. */
|
|
11
11
|
export interface WorktreeExpandStateActions {
|
|
12
12
|
toggleWorkspace: (workspaceId: string) => void;
|
|
13
|
+
/** Open one Workspace and collapse every other known Workspace. */
|
|
14
|
+
openWorkspaceExclusive: (workspaceId: string, workspaceIds: readonly string[]) => void;
|
|
13
15
|
toggleMain: (workspaceId: string) => void;
|
|
14
16
|
toggleWorktree: (worktreeId: string) => void;
|
|
15
17
|
collapseAll: (workspaceIds: readonly string[], worktreeIds?: readonly string[], mainWorkspaceIds?: readonly string[]) => void;
|
|
@@ -28,6 +30,15 @@ export type SnapshotStoreFactory = typeof dshCreateSnapshotStore;
|
|
|
28
30
|
/** Turn any persisted JSON value into the current state shape. */
|
|
29
31
|
export declare function normalizeWorktreeExpandState(value: unknown): WorktreeExpandState;
|
|
30
32
|
export declare function isWorkspaceExpanded(state: WorktreeExpandState, workspaceId: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* The one open Workspace that owns the tree body.
|
|
35
|
+
*
|
|
36
|
+
* A temporary current-Session reveal wins over the persisted choice so navigation
|
|
37
|
+
* never waits for the store write. Otherwise the first uncollapsed Workspace is the
|
|
38
|
+
* open one; legacy records with several uncollapsed IDs render one Workspace and are
|
|
39
|
+
* normalized by the caller.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveOpenWorkspaceId(state: WorktreeExpandState, workspaceIds: readonly string[], revealedWorkspaceId?: string): string | undefined;
|
|
31
42
|
export declare function isMainExpanded(state: WorktreeExpandState, workspaceId: string): boolean;
|
|
32
43
|
export declare function isWorktreeExpanded(state: WorktreeExpandState, worktreeId: string): boolean;
|
|
33
44
|
/** Create one apply-scoped store; component remounts share this instance. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-expand-state.d.ts","sourceRoot":"","sources":["../../../src/client/view/worktree-expand-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,IAAI,sBAAsB,EAC7C,aAAa,EACd,MAAM,+BAA+B,CAAC;AAEvC,+EAA+E;AAC/E,eAAO,MAAM,iCAAiC,qCAAqC,CAAC;AAEpF,
|
|
1
|
+
{"version":3,"file":"worktree-expand-state.d.ts","sourceRoot":"","sources":["../../../src/client/view/worktree-expand-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,IAAI,sBAAsB,EAC7C,aAAa,EACd,MAAM,+BAA+B,CAAC;AAEvC,+EAA+E;AAC/E,eAAO,MAAM,iCAAiC,qCAAqC,CAAC;AAEpF,iGAAiG;AACjG,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CAC5C;AAED,kEAAkE;AAClE,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,mEAAmE;IACnE,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IACvF,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CACX,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,EAC/B,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,KACjC,IAAI,CAAC;IACV,MAAM,EAAE,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;CACnF;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAyB,SAAQ,aAAa,CAAC,mBAAmB,CAAC;IAClF,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,sBAAsB,CAAC;AAqBjE,kEAAkE;AAClE,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAOhF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE5F;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAEvF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1F;AAcD,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAC5C,oBAAoB,EAAE,oBAAoB,GACzC,wBAAwB,CA4D1B"}
|
|
@@ -27,6 +27,20 @@ export function normalizeWorktreeExpandState(value) {
|
|
|
27
27
|
export function isWorkspaceExpanded(state, workspaceId) {
|
|
28
28
|
return state.collapsedWorkspaceIds[workspaceId] !== true;
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* The one open Workspace that owns the tree body.
|
|
32
|
+
*
|
|
33
|
+
* A temporary current-Session reveal wins over the persisted choice so navigation
|
|
34
|
+
* never waits for the store write. Otherwise the first uncollapsed Workspace is the
|
|
35
|
+
* open one; legacy records with several uncollapsed IDs render one Workspace and are
|
|
36
|
+
* normalized by the caller.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveOpenWorkspaceId(state, workspaceIds, revealedWorkspaceId) {
|
|
39
|
+
if (revealedWorkspaceId !== undefined && workspaceIds.includes(revealedWorkspaceId)) {
|
|
40
|
+
return revealedWorkspaceId;
|
|
41
|
+
}
|
|
42
|
+
return workspaceIds.find((workspaceId) => isWorkspaceExpanded(state, workspaceId));
|
|
43
|
+
}
|
|
30
44
|
export function isMainExpanded(state, workspaceId) {
|
|
31
45
|
return state.collapsedMainWorkspaceIds[workspaceId] !== true;
|
|
32
46
|
}
|
|
@@ -64,6 +78,18 @@ export function createWorktreeExpandStateStore(snapshotStoreFactory) {
|
|
|
64
78
|
toggleWorkspace: (workspaceId) => {
|
|
65
79
|
store.update((draft) => { toggle(draft.collapsedWorkspaceIds, workspaceId); });
|
|
66
80
|
},
|
|
81
|
+
openWorkspaceExclusive: (workspaceId, workspaceIds) => {
|
|
82
|
+
if (!workspaceIds.includes(workspaceId))
|
|
83
|
+
return;
|
|
84
|
+
store.update((draft) => {
|
|
85
|
+
for (const id of workspaceIds) {
|
|
86
|
+
if (id === workspaceId)
|
|
87
|
+
delete draft.collapsedWorkspaceIds[id];
|
|
88
|
+
else
|
|
89
|
+
draft.collapsedWorkspaceIds[id] = true;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
},
|
|
67
93
|
toggleMain: (workspaceId) => {
|
|
68
94
|
store.update((draft) => { toggle(draft.collapsedMainWorkspaceIds, workspaceId); });
|
|
69
95
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-expand-state.js","sourceRoot":"","sources":["../../../src/client/view/worktree-expand-state.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iCAAiC,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-expand-state.js","sourceRoot":"","sources":["../../../src/client/view/worktree-expand-state.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iCAAiC,GAAG,kCAAkC,CAAC;AAoCpF,SAAS,UAAU;IACjB,OAAO;QACL,qBAAqB,EAAE,EAAE;QACzB,yBAAyB,EAAE,EAAE;QAC7B,oBAAoB,EAAE,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,CAC/D,CAAC;AAC5B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO;QACL,qBAAqB,EAAE,YAAY,CAAC,MAAM,CAAC,qBAAqB,CAAC;QACjE,yBAAyB,EAAE,YAAY,CAAC,MAAM,CAAC,yBAAyB,CAAC;QACzE,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,oBAAoB,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA0B,EAAE,WAAmB;IACjF,OAAO,KAAK,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA0B,EAC1B,YAA+B,EAC/B,mBAA4B;IAE5B,IAAI,mBAAmB,KAAK,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpF,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA0B,EAAE,WAAmB;IAC5E,OAAO,KAAK,CAAC,yBAAyB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA0B,EAAE,UAAkB;IAC/E,OAAO,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,MAAM,CAAC,MAA4B,EAAE,EAAU;IACtD,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;;QACtC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,MAAM,CAAC,MAA4B,EAAE,GAAsB;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,8BAA8B,CAC5C,oBAA0C;IAE1C,IAAI,KAAyC,CAAC;IAC9C,IAAI,CAAC;QACH,KAAK,GAAG,oBAAoB,CAAsB,UAAU,EAAE,EAAE;YAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;SACrD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qFAAqF;QACrF,KAAK,GAAG,oBAAoB,CAAsB,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,OAAO,GAA+B;QAC1C,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE;YAC/B,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,sBAAsB,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE;YACpD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO;YAChD,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;oBAC9B,IAAI,EAAE,KAAK,WAAW;wBAAE,OAAO,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;;wBAC1D,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE;YAC1B,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,cAAc,EAAE,CAAC,UAAU,EAAE,EAAE;YAC7B,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,WAAW,EAAE,CAAC,YAAY,EAAE,WAAW,GAAG,EAAE,EAAE,gBAAgB,GAAG,YAAY,EAAE,EAAE;YAC/E,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;oBAC9B,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBACzC,CAAC;gBACD,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;oBAClC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC7C,CAAC;gBACD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;oBAC7B,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;gBACxC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;YACpC,mFAAmF;YACnF,kFAAkF;YAClF,oDAAoD;YACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACtC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;gBAClD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBACtD,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|