@cerbur/clutch-dsh-worktree 0.1.10 → 0.1.13

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 (298) hide show
  1. package/README.md +278 -498
  2. package/README.zh.md +231 -432
  3. package/assets/screenshots/screenshots-dashboard.png +0 -0
  4. package/assets/screenshots/screenshots-en.png +0 -0
  5. package/assets/screenshots/screenshots-git-reviewer.png +0 -0
  6. package/assets/screenshots/screenshots-import.png +0 -0
  7. package/assets/screenshots/screenshots-zh.png +0 -0
  8. package/lib/client/WorktreeSurface.d.ts +1 -1
  9. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  10. package/lib/client/WorktreeSurface.js +268 -10
  11. package/lib/client/WorktreeSurface.js.map +1 -1
  12. package/lib/client/context/WorktreeHeroContext.d.ts +4 -3
  13. package/lib/client/context/WorktreeHeroContext.d.ts.map +1 -1
  14. package/lib/client/context/WorktreeHeroContext.js +29 -11
  15. package/lib/client/context/WorktreeHeroContext.js.map +1 -1
  16. package/lib/client/dashboard/DashboardHeaderAction.d.ts +20 -0
  17. package/lib/client/dashboard/DashboardHeaderAction.d.ts.map +1 -0
  18. package/lib/client/dashboard/DashboardHeaderAction.js +19 -0
  19. package/lib/client/dashboard/DashboardHeaderAction.js.map +1 -0
  20. package/lib/client/dashboard/OpenInAppButton.d.ts +9 -0
  21. package/lib/client/dashboard/OpenInAppButton.d.ts.map +1 -0
  22. package/lib/client/dashboard/OpenInAppButton.js +123 -0
  23. package/lib/client/dashboard/OpenInAppButton.js.map +1 -0
  24. package/lib/client/dashboard/WorktreeDashboard.d.ts +28 -0
  25. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -0
  26. package/lib/client/dashboard/WorktreeDashboard.js +362 -0
  27. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -0
  28. package/lib/client/dashboard/WorktreeInstructions.d.ts +8 -0
  29. package/lib/client/dashboard/WorktreeInstructions.d.ts.map +1 -0
  30. package/lib/client/dashboard/WorktreeInstructions.js +53 -0
  31. package/lib/client/dashboard/WorktreeInstructions.js.map +1 -0
  32. package/lib/client/dashboard/dashboard-icon.d.ts +7 -0
  33. package/lib/client/dashboard/dashboard-icon.d.ts.map +1 -0
  34. package/lib/client/dashboard/dashboard-icon.js +6 -0
  35. package/lib/client/dashboard/dashboard-icon.js.map +1 -0
  36. package/lib/client/dashboard/dashboard-navigation.d.ts +35 -0
  37. package/lib/client/dashboard/dashboard-navigation.d.ts.map +1 -0
  38. package/lib/client/dashboard/dashboard-navigation.js +48 -0
  39. package/lib/client/dashboard/dashboard-navigation.js.map +1 -0
  40. package/lib/client/dashboard/dashboard-overlay.d.ts +16 -0
  41. package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -0
  42. package/lib/client/dashboard/dashboard-overlay.js +185 -0
  43. package/lib/client/dashboard/dashboard-overlay.js.map +1 -0
  44. package/lib/client/dashboard/dashboard-selection.d.ts +33 -0
  45. package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -0
  46. package/lib/client/dashboard/dashboard-selection.js +31 -0
  47. package/lib/client/dashboard/dashboard-selection.js.map +1 -0
  48. package/lib/client/dashboard/dashboard-sessions.d.ts +6 -0
  49. package/lib/client/dashboard/dashboard-sessions.d.ts.map +1 -0
  50. package/lib/client/dashboard/dashboard-sessions.js +21 -0
  51. package/lib/client/dashboard/dashboard-sessions.js.map +1 -0
  52. package/lib/client/dashboard/git/GitChangedFiles.d.ts +11 -0
  53. package/lib/client/dashboard/git/GitChangedFiles.d.ts.map +1 -0
  54. package/lib/client/dashboard/git/GitChangedFiles.js +101 -0
  55. package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -0
  56. package/lib/client/dashboard/git/GitCommitList.d.ts +15 -0
  57. package/lib/client/dashboard/git/GitCommitList.d.ts.map +1 -0
  58. package/lib/client/dashboard/git/GitCommitList.js +55 -0
  59. package/lib/client/dashboard/git/GitCommitList.js.map +1 -0
  60. package/lib/client/dashboard/git/GitDiffView.d.ts +10 -0
  61. package/lib/client/dashboard/git/GitDiffView.d.ts.map +1 -0
  62. package/lib/client/dashboard/git/GitDiffView.js +65 -0
  63. package/lib/client/dashboard/git/GitDiffView.js.map +1 -0
  64. package/lib/client/dashboard/git/GitFileTypeIcon.d.ts +8 -0
  65. package/lib/client/dashboard/git/GitFileTypeIcon.d.ts.map +1 -0
  66. package/lib/client/dashboard/git/GitFileTypeIcon.js +24 -0
  67. package/lib/client/dashboard/git/GitFileTypeIcon.js.map +1 -0
  68. package/lib/client/dashboard/git/GitLineStats.d.ts +10 -0
  69. package/lib/client/dashboard/git/GitLineStats.d.ts.map +1 -0
  70. package/lib/client/dashboard/git/GitLineStats.js +9 -0
  71. package/lib/client/dashboard/git/GitLineStats.js.map +1 -0
  72. package/lib/client/dashboard/git/WorktreeGitOverview.d.ts +31 -0
  73. package/lib/client/dashboard/git/WorktreeGitOverview.d.ts.map +1 -0
  74. package/lib/client/dashboard/git/WorktreeGitOverview.js +89 -0
  75. package/lib/client/dashboard/git/WorktreeGitOverview.js.map +1 -0
  76. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +16 -0
  77. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -0
  78. package/lib/client/dashboard/git/WorktreeGitPanel.js +126 -0
  79. package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -0
  80. package/lib/client/dashboard/git/file-address.d.ts +2 -0
  81. package/lib/client/dashboard/git/file-address.d.ts.map +1 -0
  82. package/lib/client/dashboard/git/file-address.js +16 -0
  83. package/lib/client/dashboard/git/file-address.js.map +1 -0
  84. package/lib/client/dashboard/git/git-column-split.d.ts +34 -0
  85. package/lib/client/dashboard/git/git-column-split.d.ts.map +1 -0
  86. package/lib/client/dashboard/git/git-column-split.js +41 -0
  87. package/lib/client/dashboard/git/git-column-split.js.map +1 -0
  88. package/lib/client/dashboard/git/git-diff-parser.d.ts +24 -0
  89. package/lib/client/dashboard/git/git-diff-parser.d.ts.map +1 -0
  90. package/lib/client/dashboard/git/git-diff-parser.js +56 -0
  91. package/lib/client/dashboard/git/git-diff-parser.js.map +1 -0
  92. package/lib/client/dashboard/git/git-facts.d.ts +18 -0
  93. package/lib/client/dashboard/git/git-facts.d.ts.map +1 -0
  94. package/lib/client/dashboard/git/git-facts.js +31 -0
  95. package/lib/client/dashboard/git/git-facts.js.map +1 -0
  96. package/lib/client/dashboard/git/git-file-tree.d.ts +16 -0
  97. package/lib/client/dashboard/git/git-file-tree.d.ts.map +1 -0
  98. package/lib/client/dashboard/git/git-file-tree.js +52 -0
  99. package/lib/client/dashboard/git/git-file-tree.js.map +1 -0
  100. package/lib/client/dashboard/git/git-state-cache.d.ts +49 -0
  101. package/lib/client/dashboard/git/git-state-cache.d.ts.map +1 -0
  102. package/lib/client/dashboard/git/git-state-cache.js +80 -0
  103. package/lib/client/dashboard/git/git-state-cache.js.map +1 -0
  104. package/lib/client/dashboard/git/useGitPaneSplit.d.ts +33 -0
  105. package/lib/client/dashboard/git/useGitPaneSplit.d.ts.map +1 -0
  106. package/lib/client/dashboard/git/useGitPaneSplit.js +119 -0
  107. package/lib/client/dashboard/git/useGitPaneSplit.js.map +1 -0
  108. package/lib/client/dashboard/git/useWorktreeGitState.d.ts +60 -0
  109. package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -0
  110. package/lib/client/dashboard/git/useWorktreeGitState.js +654 -0
  111. package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -0
  112. package/lib/client/dashboard/open-in-app-controller.d.ts +30 -0
  113. package/lib/client/dashboard/open-in-app-controller.d.ts.map +1 -0
  114. package/lib/client/dashboard/open-in-app-controller.js +94 -0
  115. package/lib/client/dashboard/open-in-app-controller.js.map +1 -0
  116. package/lib/client/dashboard/vscode-url.d.ts +3 -0
  117. package/lib/client/dashboard/vscode-url.d.ts.map +1 -0
  118. package/lib/client/dashboard/vscode-url.js +9 -0
  119. package/lib/client/dashboard/vscode-url.js.map +1 -0
  120. package/lib/client/dashboard/worktree-acquisition-facts.d.ts +16 -0
  121. package/lib/client/dashboard/worktree-acquisition-facts.d.ts.map +1 -0
  122. package/lib/client/dashboard/worktree-acquisition-facts.js +14 -0
  123. package/lib/client/dashboard/worktree-acquisition-facts.js.map +1 -0
  124. package/lib/client/dsh-slot-contract.d.ts +5 -0
  125. package/lib/client/dsh-slot-contract.d.ts.map +1 -1
  126. package/lib/client/entry.d.ts.map +1 -1
  127. package/lib/client/entry.js +93 -0
  128. package/lib/client/entry.js.map +1 -1
  129. package/lib/client/locales.d.ts +296 -0
  130. package/lib/client/locales.d.ts.map +1 -1
  131. package/lib/client/locales.js +296 -0
  132. package/lib/client/locales.js.map +1 -1
  133. package/lib/client/session/session-labels.d.ts +9 -0
  134. package/lib/client/session/session-labels.d.ts.map +1 -0
  135. package/lib/client/session/session-labels.js +44 -0
  136. package/lib/client/session/session-labels.js.map +1 -0
  137. package/lib/client/session/session-view.d.ts +10 -0
  138. package/lib/client/session/session-view.d.ts.map +1 -1
  139. package/lib/client/session/session-view.js +57 -0
  140. package/lib/client/session/session-view.js.map +1 -1
  141. package/lib/client/session/worktree-session-order.d.ts +2 -5
  142. package/lib/client/session/worktree-session-order.d.ts.map +1 -1
  143. package/lib/client/session/worktree-session-order.js +35 -10
  144. package/lib/client/session/worktree-session-order.js.map +1 -1
  145. package/lib/client/session/worktree-session-position.d.ts +2 -1
  146. package/lib/client/session/worktree-session-position.d.ts.map +1 -1
  147. package/lib/client/session/worktree-session-position.js +10 -3
  148. package/lib/client/session/worktree-session-position.js.map +1 -1
  149. package/lib/client/surface/actions/useDragActions.d.ts +33 -2
  150. package/lib/client/surface/actions/useDragActions.d.ts.map +1 -1
  151. package/lib/client/surface/actions/useDragActions.js +66 -18
  152. package/lib/client/surface/actions/useDragActions.js.map +1 -1
  153. package/lib/client/surface/components/ActiveWorktree.d.ts +1 -1
  154. package/lib/client/surface/components/ActiveWorktree.d.ts.map +1 -1
  155. package/lib/client/surface/components/ActiveWorktree.js +4 -3
  156. package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
  157. package/lib/client/surface/components/ArchivedWorktree.d.ts +1 -1
  158. package/lib/client/surface/components/ArchivedWorktree.d.ts.map +1 -1
  159. package/lib/client/surface/components/ArchivedWorktree.js +4 -3
  160. package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
  161. package/lib/client/surface/components/ArchivedWorktrees.d.ts +1 -1
  162. package/lib/client/surface/components/ArchivedWorktrees.d.ts.map +1 -1
  163. package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
  164. package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
  165. package/lib/client/surface/components/SurfaceContent.d.ts +2 -2
  166. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  167. package/lib/client/surface/components/SurfaceContent.js +1 -1
  168. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  169. package/lib/client/surface/components/SurfaceHeader.d.ts +1 -1
  170. package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
  171. package/lib/client/surface/components/SurfaceHeader.js +12 -3
  172. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  173. package/lib/client/surface/components/WorkspaceTree.d.ts +1 -1
  174. package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
  175. package/lib/client/surface/components/WorkspaceTree.js +9 -5
  176. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  177. package/lib/client/surface/components/rows.d.ts +2 -2
  178. package/lib/client/surface/components/rows.d.ts.map +1 -1
  179. package/lib/client/surface/components/rows.js +111 -8
  180. package/lib/client/surface/components/rows.js.map +1 -1
  181. package/lib/client/surface/selectors.d.ts +10 -0
  182. package/lib/client/surface/selectors.d.ts.map +1 -1
  183. package/lib/client/surface/selectors.js +14 -0
  184. package/lib/client/surface/selectors.js.map +1 -1
  185. package/lib/client/surface/state/useSessionExpansion.d.ts +2 -1
  186. package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
  187. package/lib/client/surface/state/useSessionExpansion.js +26 -13
  188. package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
  189. package/lib/client/surface/state/useSessionOrdering.d.ts +1 -1
  190. package/lib/client/surface/state/useSessionOrdering.d.ts.map +1 -1
  191. package/lib/client/surface/state/useSessionOrdering.js +23 -8
  192. package/lib/client/surface/state/useSessionOrdering.js.map +1 -1
  193. package/lib/client/surface/types.d.ts +23 -3
  194. package/lib/client/surface/types.d.ts.map +1 -1
  195. package/lib/client/view/WorktreeModeAction.d.ts.map +1 -1
  196. package/lib/client/view/WorktreeModeAction.js +8 -0
  197. package/lib/client/view/WorktreeModeAction.js.map +1 -1
  198. package/lib/client/view/view-mode-dispatch.d.ts +7 -0
  199. package/lib/client/view/view-mode-dispatch.d.ts.map +1 -0
  200. package/lib/client/view/view-mode-dispatch.js +11 -0
  201. package/lib/client/view/view-mode-dispatch.js.map +1 -0
  202. package/lib/client/view/worktree-expand-state.d.ts +1 -1
  203. package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
  204. package/lib/client/view/worktree-expand-state.js +8 -1
  205. package/lib/client/view/worktree-expand-state.js.map +1 -1
  206. package/lib/client/worktree-connection.d.ts +5 -0
  207. package/lib/client/worktree-connection.d.ts.map +1 -1
  208. package/lib/client/worktree-connection.js +14 -0
  209. package/lib/client/worktree-connection.js.map +1 -1
  210. package/lib/client.js +4865 -158
  211. package/lib/client.js.map +1 -1
  212. package/lib/contract/index.contract.js +10 -0
  213. package/lib/contract/index.contract.js.map +1 -1
  214. package/lib/contract/index.d.ts +163 -1
  215. package/lib/contract/index.d.ts.map +1 -1
  216. package/lib/contract/index.js +19 -0
  217. package/lib/contract/index.js.map +1 -1
  218. package/lib/host/dsh-read-adapter.d.ts +3 -1
  219. package/lib/host/dsh-read-adapter.d.ts.map +1 -1
  220. package/lib/host/dsh-read-adapter.js +5 -2
  221. package/lib/host/dsh-read-adapter.js.map +1 -1
  222. package/lib/host/remote.d.ts.map +1 -1
  223. package/lib/host/remote.js +5 -0
  224. package/lib/host/remote.js.map +1 -1
  225. package/lib/host/service.d.ts +20 -1
  226. package/lib/host/service.d.ts.map +1 -1
  227. package/lib/host/service.js +32 -0
  228. package/lib/host/service.js.map +1 -1
  229. package/lib/host/worktree-instructions.d.ts +41 -0
  230. package/lib/host/worktree-instructions.d.ts.map +1 -0
  231. package/lib/host/worktree-instructions.js +65 -0
  232. package/lib/host/worktree-instructions.js.map +1 -0
  233. package/lib/index.d.ts +4 -4
  234. package/lib/index.d.ts.map +1 -1
  235. package/lib/index.js +3 -3
  236. package/lib/index.js.map +1 -1
  237. package/lib/manage/manager-git-history.d.ts +17 -0
  238. package/lib/manage/manager-git-history.d.ts.map +1 -0
  239. package/lib/manage/manager-git-history.js +717 -0
  240. package/lib/manage/manager-git-history.js.map +1 -0
  241. package/lib/manage/manager-worktrees.d.ts.map +1 -1
  242. package/lib/manage/manager-worktrees.js +27 -0
  243. package/lib/manage/manager-worktrees.js.map +1 -1
  244. package/lib/manage/manager.d.ts +21 -1
  245. package/lib/manage/manager.d.ts.map +1 -1
  246. package/lib/manage/manager.js +60 -0
  247. package/lib/manage/manager.js.map +1 -1
  248. package/lib/manage/types.d.ts +1 -0
  249. package/lib/manage/types.d.ts.map +1 -1
  250. package/lib/provider/git/adapter.d.ts +54 -1
  251. package/lib/provider/git/adapter.d.ts.map +1 -1
  252. package/lib/provider/git/adapter.js +820 -1
  253. package/lib/provider/git/adapter.js.map +1 -1
  254. package/lib/provider/index.d.ts +2 -2
  255. package/lib/provider/index.d.ts.map +1 -1
  256. package/lib/provider/index.js +1 -1
  257. package/lib/provider/index.js.map +1 -1
  258. package/lib/provider/mutation-token.d.ts +1 -1
  259. package/lib/provider/mutation-token.d.ts.map +1 -1
  260. package/lib/provider/mutation-token.js +1 -0
  261. package/lib/provider/mutation-token.js.map +1 -1
  262. package/lib/provider/sidecar/repository.d.ts +1 -1
  263. package/lib/provider/sidecar/repository.d.ts.map +1 -1
  264. package/lib/provider/sidecar/repository.js +7 -2
  265. package/lib/provider/sidecar/repository.js.map +1 -1
  266. package/lib/provider/sidecar/sidecar-schema.d.ts +16 -3
  267. package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
  268. package/lib/provider/sidecar/sidecar-schema.js +117 -28
  269. package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
  270. package/lib/provider/transaction/operations/create.d.ts.map +1 -1
  271. package/lib/provider/transaction/operations/create.js +21 -6
  272. package/lib/provider/transaction/operations/create.js.map +1 -1
  273. package/lib/provider/transaction/operations/import.d.ts.map +1 -1
  274. package/lib/provider/transaction/operations/import.js +1 -0
  275. package/lib/provider/transaction/operations/import.js.map +1 -1
  276. package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
  277. package/lib/provider/transaction/recovery/failure-recovery.js +11 -4
  278. package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
  279. package/lib/provider/transaction/recovery/recover.js +11 -11
  280. package/lib/provider/transaction/recovery/recover.js.map +1 -1
  281. package/lib/provider/transaction/support/inspection.d.ts +0 -2
  282. package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
  283. package/lib/provider/transaction/support/inspection.js +0 -4
  284. package/lib/provider/transaction/support/inspection.js.map +1 -1
  285. package/lib/provider/transaction/support/journal.d.ts.map +1 -1
  286. package/lib/provider/transaction/support/journal.js +4 -0
  287. package/lib/provider/transaction/support/journal.js.map +1 -1
  288. package/lib/provider/transaction/types.d.ts +1 -0
  289. package/lib/provider/transaction/types.d.ts.map +1 -1
  290. package/lib/provider/types.d.ts +53 -5
  291. package/lib/provider/types.d.ts.map +1 -1
  292. package/lib/provider/types.js +1 -1
  293. package/lib/provider/types.js.map +1 -1
  294. package/lib/typert.host.js +349 -33
  295. package/lib/typert.remote-client.d.ts +11 -1
  296. package/lib/typert.remote-client.d.ts.map +1 -1
  297. package/lib/typert.remote-client.js +349 -33
  298. package/package.json +23 -20
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import styles from './dashboard.css';
4
+ export function WorktreeInstructions({ value, onSave, t, disabled, }) {
5
+ const [saved, setSaved] = useState(value);
6
+ const [draft, setDraft] = useState();
7
+ const [error, setError] = useState(false);
8
+ const [pending, setPending] = useState(false);
9
+ const busy = useRef(false);
10
+ const alive = useRef(true);
11
+ useEffect(() => {
12
+ alive.current = true;
13
+ return () => {
14
+ alive.current = false;
15
+ };
16
+ }, []);
17
+ useEffect(() => {
18
+ setSaved(value);
19
+ }, [value]);
20
+ const expected = useRef(value);
21
+ const save = async () => {
22
+ if (busy.current || draft === undefined || !onSave)
23
+ return;
24
+ busy.current = true;
25
+ setPending(true);
26
+ setError(false);
27
+ try {
28
+ const result = await onSave(draft, expected.current);
29
+ if (alive.current) {
30
+ setSaved(result);
31
+ setDraft(undefined);
32
+ }
33
+ }
34
+ catch {
35
+ if (alive.current)
36
+ setError(true);
37
+ }
38
+ finally {
39
+ busy.current = false;
40
+ if (alive.current)
41
+ setPending(false);
42
+ }
43
+ };
44
+ return (_jsxs("div", { children: [_jsx("p", { children: t('dashboard.instructionsHint') }), draft === undefined ? (_jsxs(_Fragment, { children: [_jsx("p", { className: styles.dashboardInstructionsText, children: saved || t('dashboard.noInstructions') }), _jsx("button", { type: "button", className: styles.dashboardButton, disabled: disabled || !onSave, onClick: () => {
45
+ expected.current = saved;
46
+ setDraft(saved);
47
+ setError(false);
48
+ }, children: t('dashboard.edit') })] })) : (_jsxs(_Fragment, { children: [_jsx("textarea", { className: styles.dashboardInstructionsInput, "aria-label": t('dashboard.instructions'), value: draft, maxLength: 32000, rows: 8, disabled: pending, onChange: (event) => setDraft(event.target.value) }), _jsxs("div", { className: styles.dashboardInstructionActions, children: [_jsx("button", { type: "button", className: styles.dashboardButton, disabled: pending || disabled, onClick: () => void save(), children: t(pending ? 'dashboard.savingInstructions' : 'dashboard.saveInstructions') }), _jsx("button", { type: "button", className: styles.dashboardButton, disabled: pending, onClick: () => {
49
+ setDraft(undefined);
50
+ setError(false);
51
+ }, children: t('dashboard.cancelInstructions') })] }), error && _jsx("p", { role: "alert", children: t('dashboard.instructionsSaveFailed') })] }))] }));
52
+ }
53
+ //# sourceMappingURL=WorktreeInstructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeInstructions.js","sourceRoot":"","sources":["../../../src/client/dashboard/WorktreeInstructions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,MAAM,EACN,CAAC,EACD,QAAQ,GAMT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM;YAAE,OAAO;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,KAAK,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,CAAC,OAAO;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CACL,0BACE,sBAAI,CAAC,CAAC,4BAA4B,CAAC,GAAK,EACvC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,8BACE,YAAG,SAAS,EAAE,MAAM,CAAC,yBAAyB,YAC3C,KAAK,IAAI,CAAC,CAAC,0BAA0B,CAAC,GACrC,EACJ,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,EAC7B,OAAO,EAAE,GAAG,EAAE;4BACZ,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;4BACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;4BAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAClB,CAAC,YAEA,CAAC,CAAC,gBAAgB,CAAC,GACb,IACR,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,mBACE,SAAS,EAAE,MAAM,CAAC,0BAA0B,gBAChC,CAAC,CAAC,wBAAwB,CAAC,EACvC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,KAAK,EAChB,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GACjD,EACF,eAAK,SAAS,EAAE,MAAM,CAAC,2BAA2B,aAChD,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,YAEzB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,4BAA4B,CAAC,GACpE,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,GAAG,EAAE;oCACZ,QAAQ,CAAC,SAAS,CAAC,CAAC;oCACpB,QAAQ,CAAC,KAAK,CAAC,CAAC;gCAClB,CAAC,YAEA,CAAC,CAAC,8BAA8B,CAAC,GAC3B,IACL,EACL,KAAK,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,CAAC,CAAC,kCAAkC,CAAC,GAAK,IACpE,CACJ,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from 'react';
2
+ /** 4-quadrant layout glyph representing dashboard / overview. */
3
+ export declare function IconDashboard({ size, className, }: {
4
+ readonly size?: number;
5
+ readonly className?: string;
6
+ }): ReactNode;
7
+ //# sourceMappingURL=dashboard-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-icon.d.ts","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,EAC5B,IAAS,EACT,SAAS,GACV,EAAE;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,SAAS,CAkBZ"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** 4-quadrant layout glyph representing dashboard / overview. */
3
+ export function IconDashboard({ size = 16, className, }) {
4
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", className: className, "aria-hidden": "true", children: [_jsx("rect", { x: "2", y: "2", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "9", y: "2", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "2", y: "9", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "9", y: "9", width: "5", height: "5", rx: "1" })] }));
5
+ }
6
+ //# sourceMappingURL=dashboard-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-icon.js","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-icon.tsx"],"names":[],"mappings":";AAEA,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,GAAG,EAAE,EACT,SAAS,GAIV;IACC,OAAO,CACL,eACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,SAAS,EAAE,SAAS,iBACR,MAAM,aAElB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAChD,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAChD,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAChD,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,IAC5C,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { DashboardRecord, DashboardSelection } from './dashboard-selection.js';
2
+ export interface DashboardNavigation {
3
+ readonly selection: DashboardSelection;
4
+ /** Existing Session to open before rendering a dashboard for another Worktree. */
5
+ readonly sessionIdToOpen?: string;
6
+ /** Delay the decision until the native Session list has arrived. */
7
+ readonly waitForSessionList?: boolean;
8
+ }
9
+ export type DashboardSessionListPhase = 'pending' | 'ready';
10
+ export interface PendingDashboardNavigation {
11
+ readonly selection: DashboardSelection;
12
+ readonly originSessionId: string | undefined;
13
+ }
14
+ export type PendingDashboardSettlement = {
15
+ readonly kind: 'wait';
16
+ } | {
17
+ readonly kind: 'open';
18
+ readonly selection: DashboardSelection;
19
+ } | {
20
+ readonly kind: 'clear';
21
+ };
22
+ /**
23
+ * Keep Dashboard and the native Session sidebars on one Session identity.
24
+ *
25
+ * Keep the current Session when it belongs to the target; otherwise use the
26
+ * first visible id in the Worktree's retained head order. An empty list is
27
+ * still a valid page-level dashboard target: it carries no native Session identity
28
+ * and leaves Session creation to the explicit Dashboard action.
29
+ */
30
+ export declare function prepareDashboardNavigation(record: Pick<DashboardRecord, 'workspaceId' | 'worktreeId'>, sessionIds: readonly string[], currentSessionId: string | undefined, phase?: DashboardSessionListPhase): DashboardNavigation;
31
+ /**
32
+ * Settle a pending Session switch without resurrecting it after an unrelated switch.
33
+ */
34
+ export declare function settlePendingDashboardNavigation(pending: PendingDashboardNavigation | undefined, currentSessionId: string | undefined): PendingDashboardSettlement;
35
+ //# sourceMappingURL=dashboard-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-navigation.d.ts","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,kFAAkF;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,YAAY,CAAC,EAC3D,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,GAAE,yBAAmC,GACzC,mBAAmB,CA0BrB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAC/C,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,0BAA0B,CAO5B"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Keep Dashboard and the native Session sidebars on one Session identity.
3
+ *
4
+ * Keep the current Session when it belongs to the target; otherwise use the
5
+ * first visible id in the Worktree's retained head order. An empty list is
6
+ * still a valid page-level dashboard target: it carries no native Session identity
7
+ * and leaves Session creation to the explicit Dashboard action.
8
+ */
9
+ export function prepareDashboardNavigation(record, sessionIds, currentSessionId, phase = 'ready') {
10
+ if (phase === 'pending') {
11
+ return {
12
+ selection: {
13
+ workspaceId: record.workspaceId,
14
+ worktreeId: record.worktreeId,
15
+ sessionId: undefined,
16
+ },
17
+ sessionIdToOpen: undefined,
18
+ waitForSessionList: true,
19
+ };
20
+ }
21
+ const sessionIdToOpen = currentSessionId !== undefined && sessionIds.includes(currentSessionId)
22
+ ? currentSessionId
23
+ : sessionIds[0];
24
+ return {
25
+ selection: {
26
+ workspaceId: record.workspaceId,
27
+ worktreeId: record.worktreeId,
28
+ sessionId: sessionIdToOpen,
29
+ },
30
+ sessionIdToOpen: sessionIdToOpen === undefined || sessionIdToOpen === currentSessionId
31
+ ? undefined
32
+ : sessionIdToOpen,
33
+ };
34
+ }
35
+ /**
36
+ * Settle a pending Session switch without resurrecting it after an unrelated switch.
37
+ */
38
+ export function settlePendingDashboardNavigation(pending, currentSessionId) {
39
+ if (pending === undefined)
40
+ return { kind: 'wait' };
41
+ if (currentSessionId === pending.selection.sessionId) {
42
+ return { kind: 'open', selection: pending.selection };
43
+ }
44
+ if (currentSessionId !== pending.originSessionId)
45
+ return { kind: 'clear' };
46
+ return { kind: 'wait' };
47
+ }
48
+ //# sourceMappingURL=dashboard-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-navigation.js","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-navigation.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAA2D,EAC3D,UAA6B,EAC7B,gBAAoC,EACpC,QAAmC,OAAO;IAE1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,SAAS,EAAE;gBACT,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,SAAS;aACrB;YACD,eAAe,EAAE,SAAS;YAC1B,kBAAkB,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,gBAAgB,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC7F,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO;QACL,SAAS,EAAE;YACT,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,eAAe;SAC3B;QACD,eAAe,EACb,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,gBAAgB;YACnE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,eAAe;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAA+C,EAC/C,gBAAoC;IAEpC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnD,IAAI,gBAAgB,KAAK,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,gBAAgB,KAAK,OAAO,CAAC,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface DashboardPlacement {
2
+ readonly left: number;
3
+ readonly top: number;
4
+ readonly width: number;
5
+ readonly height: number;
6
+ }
7
+ /** Reversible presentation only: leave the native React tree and Session alive. */
8
+ export declare function concealDashboardBackground(element: HTMLElement): () => void;
9
+ export interface MountDashboardOverlayOptions {
10
+ readonly onRightSidebarChange?: (open: boolean) => void;
11
+ readonly isRightSidebarExpanded?: () => boolean;
12
+ }
13
+ export declare function isRightSidebarOpenFromDom(frame: HTMLElement, rightbar: HTMLElement | undefined): boolean;
14
+ /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
15
+ export declare function mountDashboardOverlay(surface: HTMLElement, onPlacement: (placement: DashboardPlacement | undefined) => void, options?: MountDashboardOverlayOptions): () => void;
16
+ //# sourceMappingURL=dashboard-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-overlay.d.ts","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-overlay.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAMD,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI,CAqB3E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC;CACjD;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,WAAW,GAAG,SAAS,GAChC,OAAO,CAkBT;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,KAAK,IAAI,EAChE,OAAO,CAAC,EAAE,4BAA4B,GACrC,MAAM,IAAI,CA+HZ"}
@@ -0,0 +1,185 @@
1
+ // Upstream AppFrame's 8px Sidebar handle is centered on the track boundary.
2
+ // Keep its 4px right half outside this higher stacking-context overlay.
3
+ const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
4
+ /** Reversible presentation only: leave the native React tree and Session alive. */
5
+ export function concealDashboardBackground(element) {
6
+ const visibility = element.style.getPropertyValue('visibility');
7
+ const priority = element.style.getPropertyPriority('visibility');
8
+ const inert = element.getAttribute('inert');
9
+ const hidden = element.getAttribute('aria-hidden');
10
+ element.style.setProperty('visibility', 'hidden');
11
+ element.setAttribute('inert', '');
12
+ element.setAttribute('aria-hidden', 'true');
13
+ return () => {
14
+ if (element.style.getPropertyValue('visibility') === 'hidden') {
15
+ if (visibility)
16
+ element.style.setProperty('visibility', visibility, priority);
17
+ else
18
+ element.style.removeProperty('visibility');
19
+ }
20
+ for (const [name, value] of [
21
+ ['inert', inert],
22
+ ['aria-hidden', hidden],
23
+ ]) {
24
+ if (value === null)
25
+ element.removeAttribute(name);
26
+ else
27
+ element.setAttribute(name, value);
28
+ }
29
+ };
30
+ }
31
+ export function isRightSidebarOpenFromDom(frame, rightbar) {
32
+ if (typeof frame.querySelector === 'function') {
33
+ if (frame.querySelector('[data-sidebar-right-open]') !== null) {
34
+ return true;
35
+ }
36
+ if (frame.hasAttribute('data-rightbar-collapsed')) {
37
+ return false;
38
+ }
39
+ }
40
+ if (frame.getAttribute?.('data-rightbar-collapsed') !== null) {
41
+ return false;
42
+ }
43
+ if (rightbar instanceof HTMLElement) {
44
+ if (rightbar.getAttribute?.('data-sidebar-right-open') !== null) {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+ /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
51
+ export function mountDashboardOverlay(surface, onPlacement, options) {
52
+ const overlay = surface.closest('[data-shell-overlay]');
53
+ const frame = overlay?.parentElement;
54
+ if (!overlay || !frame) {
55
+ onPlacement(undefined);
56
+ options?.onRightSidebarChange?.(false);
57
+ return () => { };
58
+ }
59
+ const hidden = new Map();
60
+ let observed = [];
61
+ let scheduled;
62
+ let disposed = false;
63
+ let lastRightSidebarOpen;
64
+ const restore = () => {
65
+ for (const cleanup of hidden.values())
66
+ cleanup();
67
+ hidden.clear();
68
+ };
69
+ const schedule = () => {
70
+ if (disposed || scheduled !== undefined)
71
+ return;
72
+ scheduled = requestAnimationFrame(() => {
73
+ scheduled = undefined;
74
+ update();
75
+ });
76
+ };
77
+ const resize = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule);
78
+ const update = () => {
79
+ if (disposed)
80
+ return;
81
+ // AppFrame owns Sidebar | CenterColumn | [RightbarColumn] | shell.overlay.
82
+ // The native rightbar is absent on a page with no current Session, but the
83
+ // Dashboard still needs the same center-to-frame placement in that layout.
84
+ // Do not depend on generated CSS class names or mutate slot registrations.
85
+ const sidebar = frame.firstElementChild;
86
+ const center = sidebar?.nextElementSibling;
87
+ const rightbar = center?.nextElementSibling;
88
+ const hasRightbar = rightbar instanceof HTMLElement &&
89
+ rightbar !== overlay &&
90
+ rightbar.nextElementSibling === overlay;
91
+ const hasNoRightbar = rightbar === overlay;
92
+ const valid = overlay.isConnected &&
93
+ overlay.parentElement === frame &&
94
+ sidebar instanceof HTMLElement &&
95
+ center instanceof HTMLElement &&
96
+ (hasRightbar || hasNoRightbar);
97
+ const nextObserved = valid
98
+ ? hasRightbar
99
+ ? [overlay, sidebar, center, rightbar]
100
+ : [overlay, sidebar, center]
101
+ : [frame];
102
+ for (const old of observed)
103
+ if (!nextObserved.includes(old))
104
+ resize?.unobserve(old);
105
+ for (const next of nextObserved)
106
+ if (!observed.includes(next))
107
+ resize?.observe(next);
108
+ observed = nextObserved;
109
+ if (!valid) {
110
+ restore();
111
+ onPlacement(undefined);
112
+ if (lastRightSidebarOpen) {
113
+ lastRightSidebarOpen = false;
114
+ options?.onRightSidebarChange?.(false);
115
+ }
116
+ return;
117
+ }
118
+ const box = overlay.getBoundingClientRect();
119
+ const boundary = sidebar.getBoundingClientRect();
120
+ const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
121
+ const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
122
+ const rightEdge = Math.min(box.right, rightBoundary);
123
+ const width = rightEdge - box.left - left;
124
+ if (width <= 0 || box.height <= 0) {
125
+ restore();
126
+ onPlacement(undefined);
127
+ return;
128
+ }
129
+ for (const [element, cleanup] of hidden) {
130
+ if (element !== center) {
131
+ cleanup();
132
+ hidden.delete(element);
133
+ }
134
+ }
135
+ if (!hidden.has(center))
136
+ hidden.set(center, concealDashboardBackground(center));
137
+ onPlacement({ left, top: 0, width, height: box.height });
138
+ const isRightSidebarOpen = options?.isRightSidebarExpanded !== undefined
139
+ ? options.isRightSidebarExpanded()
140
+ : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : undefined);
141
+ if (lastRightSidebarOpen !== isRightSidebarOpen) {
142
+ lastRightSidebarOpen = isRightSidebarOpen;
143
+ options?.onRightSidebarChange?.(isRightSidebarOpen);
144
+ }
145
+ };
146
+ const mutation = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(schedule);
147
+ try {
148
+ mutation?.observe(frame, {
149
+ childList: true,
150
+ attributes: true,
151
+ subtree: true,
152
+ attributeFilter: [
153
+ 'data-rightbar-collapsed',
154
+ 'data-sidebar-right-open',
155
+ 'data-sidebar-right-panel',
156
+ ],
157
+ });
158
+ }
159
+ catch {
160
+ mutation?.observe(frame, { childList: true });
161
+ }
162
+ // Frame replacement may detach all original anchors at once.
163
+ if (frame.parentElement) {
164
+ try {
165
+ mutation?.observe(frame.parentElement, { childList: true });
166
+ }
167
+ catch {
168
+ // ignore
169
+ }
170
+ }
171
+ update();
172
+ return () => {
173
+ disposed = true;
174
+ resize?.disconnect();
175
+ mutation?.disconnect();
176
+ if (scheduled !== undefined)
177
+ cancelAnimationFrame(scheduled);
178
+ restore();
179
+ if (lastRightSidebarOpen) {
180
+ lastRightSidebarOpen = false;
181
+ options?.onRightSidebarChange?.(false);
182
+ }
183
+ };
184
+ }
185
+ //# sourceMappingURL=dashboard-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-overlay.js","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { WorktreeRecord } from '../../contract/index.js';
2
+ /** Navigation identity only; an undefined Session id denotes a page-level Dashboard. */
3
+ export interface DashboardSelection {
4
+ readonly workspaceId: string;
5
+ readonly worktreeId: string;
6
+ readonly sessionId: string | undefined;
7
+ }
8
+ /** Browser-only Main projection; it is not a persisted WorktreeRecord. */
9
+ export interface MainDashboardRecord {
10
+ readonly worktreeId: string;
11
+ readonly workspaceId: string;
12
+ readonly branch: string;
13
+ readonly currentBranch?: string | null;
14
+ readonly absolutePath: string;
15
+ readonly status: 'active';
16
+ readonly source?: never;
17
+ readonly health?: never;
18
+ readonly diskCleanup?: never;
19
+ readonly instructions?: never;
20
+ readonly createdAt?: never;
21
+ readonly importedAt?: never;
22
+ readonly baseBranch?: never;
23
+ readonly baseCommit?: never;
24
+ }
25
+ export type DashboardRecord = WorktreeRecord | MainDashboardRecord;
26
+ export declare function isMainWorktreeId(worktreeId: string): boolean;
27
+ export declare function isManagedDashboardRecord(record: DashboardRecord): record is WorktreeRecord;
28
+ export declare function createMainWorktreeRecord(workspace: {
29
+ readonly workspaceId: string;
30
+ readonly path: string;
31
+ }, currentBranch?: string | null): MainDashboardRecord;
32
+ export declare function resolveDashboardRecord(selection: DashboardSelection | undefined, mode: string, currentSessionId: string | undefined, workspaceIds: readonly string[], records: readonly WorktreeRecord[] | undefined, mainRecord?: MainDashboardRecord): DashboardRecord | undefined;
33
+ //# sourceMappingURL=dashboard-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-selection.d.ts","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEnE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI,cAAc,CAE1F;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAClE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,mBAAmB,CAWrB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,kBAAkB,GAAG,SAAS,EACzC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAC9C,UAAU,CAAC,EAAE,mBAAmB,GAC/B,eAAe,GAAG,SAAS,CAkB7B"}
@@ -0,0 +1,31 @@
1
+ export function isMainWorktreeId(worktreeId) {
2
+ return worktreeId === 'main' || worktreeId.startsWith('main:');
3
+ }
4
+ export function isManagedDashboardRecord(record) {
5
+ return !isMainWorktreeId(record.worktreeId);
6
+ }
7
+ export function createMainWorktreeRecord(workspace, currentBranch) {
8
+ return {
9
+ worktreeId: `main:${workspace.workspaceId}`,
10
+ workspaceId: workspace.workspaceId,
11
+ // Main is a browser-local projection, not a plugin-managed Worktree. Keep
12
+ // unavailable branch and health facts empty instead of inventing values.
13
+ branch: currentBranch ?? '',
14
+ currentBranch,
15
+ absolutePath: workspace.path,
16
+ status: 'active',
17
+ };
18
+ }
19
+ export function resolveDashboardRecord(selection, mode, currentSessionId, workspaceIds, records, mainRecord) {
20
+ if (selection === undefined ||
21
+ mode !== 'worktree' ||
22
+ (selection.sessionId !== undefined && selection.sessionId !== currentSessionId) ||
23
+ !workspaceIds.includes(selection.workspaceId))
24
+ return undefined;
25
+ if (mainRecord !== undefined &&
26
+ (isMainWorktreeId(selection.worktreeId) || selection.worktreeId === mainRecord.worktreeId)) {
27
+ return mainRecord;
28
+ }
29
+ return records?.find((record) => record.workspaceId === selection.workspaceId && record.worktreeId === selection.worktreeId);
30
+ }
31
+ //# sourceMappingURL=dashboard-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-selection.js","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-selection.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAuB;IAC9D,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,SAAkE,EAClE,aAA6B;IAE7B,OAAO;QACL,UAAU,EAAE,QAAQ,SAAS,CAAC,WAAW,EAAE;QAC3C,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,EAAE,aAAa,IAAI,EAAE;QAC3B,aAAa;QACb,YAAY,EAAE,SAAS,CAAC,IAAI;QAC5B,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAyC,EACzC,IAAY,EACZ,gBAAoC,EACpC,YAA+B,EAC/B,OAA8C,EAC9C,UAAgC;IAEhC,IACE,SAAS,KAAK,SAAS;QACvB,IAAI,KAAK,UAAU;QACnB,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,gBAAgB,CAAC;QAC/E,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;QAE7C,OAAO,SAAS,CAAC;IACnB,IACE,UAAU,KAAK,SAAS;QACxB,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,CAAC,EAC1F,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,EAAE,IAAI,CAClB,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAC7F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SessionBinding } from '../../contract/index.js';
2
+ import type { DashboardRecord } from './dashboard-selection.js';
3
+ import { type SessionListLike } from '../session/session-view.js';
4
+ /** Join retained snapshots without reading, mutating, or applying Sidebar search. */
5
+ export declare function dashboardSessionIds(record: Pick<DashboardRecord, 'workspaceId' | 'worktreeId'>, sessions: SessionListLike, bindings: readonly SessionBinding[], archivedSessionIds: readonly string[], orderedIds?: readonly string[], workspaceSessionIds?: readonly string[]): readonly string[];
6
+ //# sourceMappingURL=dashboard-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-sessions.d.ts","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAI3F,qFAAqF;AACrF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,YAAY,CAAC,EAC3D,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,kBAAkB,EAAE,SAAS,MAAM,EAAE,EACrC,UAAU,GAAE,SAAS,MAAM,EAAO,EAClC,mBAAmB,GAAE,SAAS,MAAM,EAAO,GAC1C,SAAS,MAAM,EAAE,CAsCnB"}
@@ -0,0 +1,21 @@
1
+ import { filterVisibleSessionIds } from '../session/session-view.js';
2
+ import { filterArchivedSessionIds } from '../view/worktree-view.js';
3
+ import { isMainWorktreeId } from './dashboard-selection.js';
4
+ /** Join retained snapshots without reading, mutating, or applying Sidebar search. */
5
+ export function dashboardSessionIds(record, sessions, bindings, archivedSessionIds, orderedIds = [], workspaceSessionIds = []) {
6
+ if (isMainWorktreeId(record.worktreeId)) {
7
+ const boundSessionIds = new Set(bindings
8
+ .filter((binding) => binding.workspaceId === record.workspaceId && binding.status !== 'detached')
9
+ .map((binding) => binding.sessionId));
10
+ const visible = filterVisibleSessionIds(filterArchivedSessionIds(workspaceSessionIds.filter((sessionId) => !boundSessionIds.has(sessionId)), archivedSessionIds), sessions);
11
+ const visibleIds = new Set(visible);
12
+ return [...new Set([...orderedIds, ...visible])].filter((id) => visibleIds.has(id));
13
+ }
14
+ const members = new Set(bindings
15
+ .filter((binding) => binding.workspaceId === record.workspaceId && binding.worktreeId === record.worktreeId)
16
+ .map((binding) => binding.sessionId));
17
+ const visible = filterVisibleSessionIds(filterArchivedSessionIds(sessions.ids.filter((sessionId) => members.has(sessionId)), archivedSessionIds), sessions);
18
+ const visibleIds = new Set(visible);
19
+ return [...new Set([...orderedIds, ...visible])].filter((id) => visibleIds.has(id));
20
+ }
21
+ //# sourceMappingURL=dashboard-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-sessions.js","sourceRoot":"","sources":["../../../src/client/dashboard/dashboard-sessions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAwB,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CACjC,MAA2D,EAC3D,QAAyB,EACzB,QAAmC,EACnC,kBAAqC,EACrC,aAAgC,EAAE,EAClC,sBAAyC,EAAE;IAE3C,IAAI,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,QAAQ;aACL,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,CAC9E;aACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACvC,CAAC;QACF,MAAM,OAAO,GAAG,uBAAuB,CACrC,wBAAwB,CACtB,mBAAmB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAC1E,kBAAkB,CACnB,EACD,QAAQ,CACT,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,QAAQ;SACL,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CACzF;SACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACvC,CAAC;IACF,MAAM,OAAO,GAAG,uBAAuB,CACrC,wBAAwB,CACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAC1D,kBAAkB,CACnB,EACD,QAAQ,CACT,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { WorktreeGitChangedFile } from '../../../contract/index.js';
2
+ import type { WorktreeTranslate } from '../../surface/types.js';
3
+ export interface GitChangedFilesProps {
4
+ readonly files: readonly WorktreeGitChangedFile[];
5
+ readonly selectedPath?: string;
6
+ readonly onSelect: (path: string) => void;
7
+ readonly t: WorktreeTranslate;
8
+ }
9
+ /** Changed-file tree; only paths returned by Host are selectable. */
10
+ export declare function GitChangedFiles({ files, selectedPath, onSelect, t }: GitChangedFilesProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=GitChangedFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitChangedFiles.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/GitChangedFiles.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAyB,MAAM,4BAA4B,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAuKD,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,oBAAoB,+BAoCzF"}