zidane-ui 9.1.1 → 9.1.3

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 (1071) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/index.js +1 -1
  3. package/dist/adapters/server-transcript-members.d.ts +1 -1
  4. package/dist/adapters/server-transcript-members.js +19 -1
  5. package/dist/app/ModalProvider.d.ts +3 -1
  6. package/dist/app/ModalProvider.js +15 -9
  7. package/dist/approvals/headless/index.js +1 -1
  8. package/dist/chat/HostTranscript.d.ts +3 -1
  9. package/dist/chat/HostTranscript.js +5 -3
  10. package/dist/chat/Transcript.js +1 -1
  11. package/dist/chat/composer/ComposerEditor.js +1 -1
  12. package/dist/chat/composer/index.js +1 -1
  13. package/dist/chat/composer/use-composer-stores.js +1 -1
  14. package/dist/chat/headless/block-runs.d.ts +57 -0
  15. package/dist/chat/headless/block-runs.js +123 -0
  16. package/dist/chat/headless/composer/index.js +2 -2
  17. package/dist/chat/headless/fixture-transcript.d.ts +6 -1
  18. package/dist/chat/headless/fixture-transcript.js +49 -0
  19. package/dist/chat/headless/host.d.ts +3 -0
  20. package/dist/chat/headless/index.d.ts +2 -1
  21. package/dist/chat/headless/index.js +12 -11
  22. package/dist/chat/headless/labels.d.ts +42 -0
  23. package/dist/chat/headless/labels.js +42 -0
  24. package/dist/chat/headless/session-list.d.ts +27 -0
  25. package/dist/chat/headless/sidebar/index.js +1 -1
  26. package/dist/chat/headless/sidebar/labels.d.ts +27 -0
  27. package/dist/chat/headless/streams/index.js +1 -1
  28. package/dist/chat/headless/streams/live-events.js +2 -1
  29. package/dist/chat/headless/streams/session-streams.js +2 -2
  30. package/dist/chat/headless/streams/store.js +2 -2
  31. package/dist/chat/headless/transcript/batch.d.ts +21 -1
  32. package/dist/chat/headless/transcript/batch.js +55 -10
  33. package/dist/chat/headless/transcript/collapse.js +18 -3
  34. package/dist/chat/headless/transcript/fold.js +26 -10
  35. package/dist/chat/headless/transcript/index.js +1 -1
  36. package/dist/chat/headless/transcript/rows.d.ts +7 -1
  37. package/dist/chat/index.d.ts +6 -1
  38. package/dist/chat/index.js +7 -2
  39. package/dist/chat/testing/contract.d.ts +6 -1
  40. package/dist/chat/testing/contract.js +30 -3
  41. package/dist/chat/transcript/AnsiText.d.ts +27 -0
  42. package/dist/chat/transcript/AnsiText.js +73 -0
  43. package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
  44. package/dist/chat/transcript/CodemodeScript.js +212 -0
  45. package/dist/chat/transcript/LiveOutput.d.ts +21 -0
  46. package/dist/chat/transcript/LiveOutput.js +42 -0
  47. package/dist/chat/transcript/TranscriptRow.js +19 -2
  48. package/dist/chat/transcript/actions.d.ts +6 -0
  49. package/dist/chat/transcript/index.d.ts +6 -1
  50. package/dist/chat/transcript/index.js +6 -1
  51. package/dist/chat/transcript/markdown.js +9 -0
  52. package/dist/chat/transcript/renderers.d.ts +7 -0
  53. package/dist/chat/transcript/script-input.d.ts +17 -0
  54. package/dist/chat/transcript/script-input.js +16 -0
  55. package/dist/chat/transcript/shell-block-scope.d.ts +29 -0
  56. package/dist/chat/transcript/shell-block-scope.js +18 -0
  57. package/dist/chat/transcript/shell-block.d.ts +27 -0
  58. package/dist/chat/transcript/shell-block.js +306 -0
  59. package/dist/chat/transcript/tool-parts.d.ts +18 -6
  60. package/dist/chat/transcript/tool-parts.js +15 -5
  61. package/dist/chat/transcript/tool-payload.js +6 -3
  62. package/dist/chat/transcript/tool-row.js +155 -96
  63. package/dist/chat/transcript/user-bash.js +3 -2
  64. package/dist/code/HighlightedCode.js +3 -69
  65. package/dist/code/highlight-lines.d.ts +24 -0
  66. package/dist/code/highlight-lines.js +41 -0
  67. package/dist/code/use-highlighted-html.d.ts +5 -0
  68. package/dist/code/use-highlighted-html.js +75 -0
  69. package/dist/core.css +6 -2
  70. package/dist/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +101 -3
  71. package/dist/extensions/ExtensionSettingsSidebar.js +19 -3
  72. package/dist/extensions/kit.d.ts +1 -1
  73. package/dist/git/BranchMenu.d.ts +1 -7
  74. package/dist/git/BranchMenu.js +17 -40
  75. package/dist/git/headless/labels.d.ts +0 -2
  76. package/dist/git/headless/labels.js +0 -2
  77. package/dist/index.d.ts +4 -3
  78. package/dist/index.js +2 -1
  79. package/dist/onboarding/index.js +1 -1
  80. package/dist/onboarding/steps/ConnectStep.js +1 -1
  81. package/dist/onboarding/steps/ExtensionsStep.js +1 -1
  82. package/dist/onboarding/steps/ReadyStep.js +1 -1
  83. package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
  84. package/dist/session/headless/index.js +2 -2
  85. package/dist/settings/SettingsShell.d.ts +3 -1
  86. package/dist/settings/SettingsShell.js +15 -8
  87. package/dist/settings/headless/catalog.js +5 -0
  88. package/dist/settings/headless/layout.js +2 -1
  89. package/dist/settings/headless/registry.d.ts +2 -0
  90. package/dist/settings/headless/search.d.ts +1 -1
  91. package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
  92. package/dist/settings/sections/extensions/ExtensionsSection.js +2 -2
  93. package/dist/settings/sections/models/ModelRows.js +1 -1
  94. package/dist/settings/sections/models/model-test.js +1 -1
  95. package/dist/styles.css +291 -2
  96. package/dist/terminal/TerminalProvider.d.ts +3 -1
  97. package/dist/terminal/TerminalProvider.js +5 -1
  98. package/dist/terminal/headless/store.d.ts +10 -0
  99. package/dist/terminal/headless/store.js +16 -0
  100. package/dist/terminal/index.d.ts +2 -2
  101. package/dist/terminal/index.js +2 -2
  102. package/dist/theme/runtime-icons.d.ts +50 -0
  103. package/dist/theme/runtime-icons.js +95 -0
  104. package/package.json +3 -6
  105. package/src/styles/primitives.css +5 -2
  106. package/src/styles/transcript.css +281 -0
  107. package/src/adapters/browser-appearance-host.ts +0 -51
  108. package/src/adapters/browser-keybindings-host.ts +0 -48
  109. package/src/adapters/browser-workspace-host.ts +0 -92
  110. package/src/adapters/closable-client.ts +0 -34
  111. package/src/adapters/extension-modules.ts +0 -360
  112. package/src/adapters/index.ts +0 -35
  113. package/src/adapters/live-events.ts +0 -6
  114. package/src/adapters/live.ts +0 -270
  115. package/src/adapters/run-host.ts +0 -238
  116. package/src/adapters/server-approvals-host.ts +0 -102
  117. package/src/adapters/server-client.ts +0 -15
  118. package/src/adapters/server-composer-host.ts +0 -459
  119. package/src/adapters/server-extensions-host.ts +0 -979
  120. package/src/adapters/server-files-host.ts +0 -287
  121. package/src/adapters/server-git-host.ts +0 -289
  122. package/src/adapters/server-host.ts +0 -489
  123. package/src/adapters/server-machines-host.ts +0 -283
  124. package/src/adapters/server-oauth-flow.ts +0 -133
  125. package/src/adapters/server-onboarding-host.ts +0 -363
  126. package/src/adapters/server-palette-host.ts +0 -134
  127. package/src/adapters/server-session-host.ts +0 -241
  128. package/src/adapters/server-settings-accounts.ts +0 -212
  129. package/src/adapters/server-settings-host.ts +0 -120
  130. package/src/adapters/server-settings-models.ts +0 -46
  131. package/src/adapters/server-settings-performance.ts +0 -58
  132. package/src/adapters/server-settings-sections.ts +0 -222
  133. package/src/adapters/server-sidebar-host.ts +0 -59
  134. package/src/adapters/server-terminal-host.ts +0 -124
  135. package/src/adapters/server-transcript-members.ts +0 -131
  136. package/src/adapters/sse-host.ts +0 -264
  137. package/src/adapters/sse-parser.ts +0 -82
  138. package/src/adapters/sse-protocol.ts +0 -118
  139. package/src/adapters/stream-pacer.ts +0 -122
  140. package/src/adapters/worker-host.ts +0 -192
  141. package/src/adapters/worker-protocol.ts +0 -97
  142. package/src/app/AppHostProvider.tsx +0 -135
  143. package/src/app/ModalProvider.tsx +0 -731
  144. package/src/app/headless/app-host.ts +0 -61
  145. package/src/app/headless/index.ts +0 -6
  146. package/src/app/headless/resource.ts +0 -444
  147. package/src/app/index.ts +0 -9
  148. package/src/app/testing/index.ts +0 -90
  149. package/src/app/useConfirm.tsx +0 -65
  150. package/src/app/useResource.ts +0 -30
  151. package/src/appearance/AppearanceProvider.tsx +0 -383
  152. package/src/appearance/apply.ts +0 -69
  153. package/src/appearance/headless/fixture-host.ts +0 -111
  154. package/src/appearance/headless/fonts.ts +0 -224
  155. package/src/appearance/headless/host.ts +0 -65
  156. package/src/appearance/headless/index.ts +0 -12
  157. package/src/appearance/headless/prefs.ts +0 -252
  158. package/src/appearance/headless/storage.ts +0 -127
  159. package/src/appearance/headless/zoom-commands.ts +0 -21
  160. package/src/appearance/index.ts +0 -11
  161. package/src/appearance/testing/contract.ts +0 -210
  162. package/src/appearance/testing/index.ts +0 -6
  163. package/src/approvals/ApprovalBar.tsx +0 -234
  164. package/src/approvals/ApprovalConcern.tsx +0 -33
  165. package/src/approvals/ApprovalShell.tsx +0 -69
  166. package/src/approvals/ApprovalsProvider.tsx +0 -110
  167. package/src/approvals/FileEditApproval.tsx +0 -310
  168. package/src/approvals/HunkPreviews.tsx +0 -225
  169. package/src/approvals/SafelistPanel.tsx +0 -149
  170. package/src/approvals/headless/fixture-host.ts +0 -73
  171. package/src/approvals/headless/fixtures.ts +0 -86
  172. package/src/approvals/headless/heads.ts +0 -81
  173. package/src/approvals/headless/host.ts +0 -80
  174. package/src/approvals/headless/index.ts +0 -12
  175. package/src/approvals/headless/labels.ts +0 -67
  176. package/src/approvals/headless/pending.ts +0 -91
  177. package/src/approvals/headless/preview.ts +0 -94
  178. package/src/approvals/headless/safelist.ts +0 -63
  179. package/src/approvals/index.ts +0 -13
  180. package/src/approvals/key-scope.ts +0 -33
  181. package/src/approvals/testing/contract.ts +0 -230
  182. package/src/approvals/testing/index.ts +0 -7
  183. package/src/brands/marks.ts +0 -298
  184. package/src/chat/ChatProvider.tsx +0 -60
  185. package/src/chat/DaemonOrb.tsx +0 -107
  186. package/src/chat/HostBadge.tsx +0 -71
  187. package/src/chat/HostStatusDot.tsx +0 -53
  188. package/src/chat/HostTranscript.tsx +0 -101
  189. package/src/chat/PdfPreview.tsx +0 -65
  190. package/src/chat/RunEstimateChip.tsx +0 -168
  191. package/src/chat/SessionFilterMenu.tsx +0 -397
  192. package/src/chat/SessionGroupHeader.tsx +0 -177
  193. package/src/chat/SessionHostHeader.tsx +0 -66
  194. package/src/chat/SessionList.tsx +0 -413
  195. package/src/chat/SessionListRow.tsx +0 -296
  196. package/src/chat/SessionStreamsProvider.tsx +0 -253
  197. package/src/chat/StatusDot.tsx +0 -128
  198. package/src/chat/TextPreview.tsx +0 -121
  199. package/src/chat/Throbber.tsx +0 -270
  200. package/src/chat/Transcript.tsx +0 -523
  201. package/src/chat/composer/AgentPicker.tsx +0 -155
  202. package/src/chat/composer/AgentPickerDialog.tsx +0 -99
  203. package/src/chat/composer/ApprovalDock.tsx +0 -64
  204. package/src/chat/composer/ArchivedBanner.tsx +0 -44
  205. package/src/chat/composer/AttachmentTiles.tsx +0 -211
  206. package/src/chat/composer/Composer.tsx +0 -500
  207. package/src/chat/composer/ComposerBadges.tsx +0 -339
  208. package/src/chat/composer/ComposerControls.tsx +0 -243
  209. package/src/chat/composer/ComposerEditor.tsx +0 -101
  210. package/src/chat/composer/ComposerHostProvider.tsx +0 -46
  211. package/src/chat/composer/ComposerShell.tsx +0 -129
  212. package/src/chat/composer/ContextBreakdown.tsx +0 -382
  213. package/src/chat/composer/ContextOrb.tsx +0 -176
  214. package/src/chat/composer/ConversationBadges.tsx +0 -168
  215. package/src/chat/composer/DockCard.tsx +0 -126
  216. package/src/chat/composer/EffortPickerDialog.tsx +0 -184
  217. package/src/chat/composer/HostComposer.tsx +0 -135
  218. package/src/chat/composer/HostContextOrb.tsx +0 -94
  219. package/src/chat/composer/HostModelChainList.tsx +0 -102
  220. package/src/chat/composer/HostPicker.tsx +0 -97
  221. package/src/chat/composer/HostPickers.tsx +0 -320
  222. package/src/chat/composer/ImageModelList.tsx +0 -151
  223. package/src/chat/composer/ModelChainList.tsx +0 -442
  224. package/src/chat/composer/ModelChainParts.tsx +0 -247
  225. package/src/chat/composer/ModelChainRow.tsx +0 -191
  226. package/src/chat/composer/ModelChainRows.tsx +0 -223
  227. package/src/chat/composer/ModelChainTooltip.tsx +0 -121
  228. package/src/chat/composer/ModelFacts.tsx +0 -204
  229. package/src/chat/composer/ModelOptionsPicker.tsx +0 -257
  230. package/src/chat/composer/ModelPicker.tsx +0 -513
  231. package/src/chat/composer/ModelPickerDialog.tsx +0 -99
  232. package/src/chat/composer/ModelProviderPills.tsx +0 -141
  233. package/src/chat/composer/PickerPill.tsx +0 -41
  234. package/src/chat/composer/ProjectMenu.tsx +0 -187
  235. package/src/chat/composer/PromptHistoryProvider.tsx +0 -214
  236. package/src/chat/composer/RetryPill.tsx +0 -47
  237. package/src/chat/composer/RunStatusChip.tsx +0 -150
  238. package/src/chat/composer/ScopeToggle.tsx +0 -94
  239. package/src/chat/composer/SelectTurnHint.tsx +0 -40
  240. package/src/chat/composer/SendButton.tsx +0 -89
  241. package/src/chat/composer/ServerScopeToggle.tsx +0 -188
  242. package/src/chat/composer/attachment-ingest.ts +0 -413
  243. package/src/chat/composer/attachments.tsx +0 -176
  244. package/src/chat/composer/badge-order.ts +0 -65
  245. package/src/chat/composer/composer-bus.ts +0 -317
  246. package/src/chat/composer/index.ts +0 -63
  247. package/src/chat/composer/load-composer-editor.ts +0 -25
  248. package/src/chat/composer/model-catalog.ts +0 -424
  249. package/src/chat/composer/model-list-layout.ts +0 -118
  250. package/src/chat/composer/prompt-history-nav.ts +0 -60
  251. package/src/chat/composer/scope-side.ts +0 -7
  252. package/src/chat/composer/suggestion-extension.ts +0 -113
  253. package/src/chat/composer/suggestions.tsx +0 -115
  254. package/src/chat/composer/use-agent-profiles.ts +0 -97
  255. package/src/chat/composer/use-cache-hints.ts +0 -93
  256. package/src/chat/composer/use-composer-stores.ts +0 -140
  257. package/src/chat/composer/use-draft-target.ts +0 -317
  258. package/src/chat/composer/use-new-session-defaults.ts +0 -201
  259. package/src/chat/composer/use-provider-ready-poll.ts +0 -35
  260. package/src/chat/composer/use-run-meter.ts +0 -140
  261. package/src/chat/composer/use-send-prompt.ts +0 -188
  262. package/src/chat/composer/use-session-meters.ts +0 -109
  263. package/src/chat/composer/use-sustained-work.ts +0 -74
  264. package/src/chat/composer/useAttachmentIngest.ts +0 -116
  265. package/src/chat/composer/useModelListSpy.ts +0 -19
  266. package/src/chat/headless/badge-refs.ts +0 -76
  267. package/src/chat/headless/chip-labels.ts +0 -40
  268. package/src/chat/headless/chip-settle.ts +0 -53
  269. package/src/chat/headless/chip-views.ts +0 -215
  270. package/src/chat/headless/composer/attachment-dedupe.ts +0 -50
  271. package/src/chat/headless/composer/commands.ts +0 -16
  272. package/src/chat/headless/composer/composer-sources.ts +0 -150
  273. package/src/chat/headless/composer/conversation-badges.ts +0 -227
  274. package/src/chat/headless/composer/draft-sync.ts +0 -199
  275. package/src/chat/headless/composer/editor-markdown.ts +0 -137
  276. package/src/chat/headless/composer/ghost-autocomplete.ts +0 -381
  277. package/src/chat/headless/composer/host-chrome.ts +0 -197
  278. package/src/chat/headless/composer/host.ts +0 -250
  279. package/src/chat/headless/composer/index.ts +0 -17
  280. package/src/chat/headless/composer/labels-chrome.ts +0 -83
  281. package/src/chat/headless/composer/labels-editor.ts +0 -44
  282. package/src/chat/headless/composer/labels.ts +0 -18
  283. package/src/chat/headless/composer/live-cost.ts +0 -67
  284. package/src/chat/headless/composer/model-knobs.ts +0 -179
  285. package/src/chat/headless/composer/model-names.ts +0 -145
  286. package/src/chat/headless/composer/model-picker-prefs.ts +0 -90
  287. package/src/chat/headless/composer/models.ts +0 -86
  288. package/src/chat/headless/composer/new-session-defaults.ts +0 -68
  289. package/src/chat/headless/composer/prompt-suggestions.ts +0 -72
  290. package/src/chat/headless/composer/remember-model-pick.ts +0 -132
  291. package/src/chat/headless/composer/run-meter.ts +0 -228
  292. package/src/chat/headless/composer-modes.ts +0 -170
  293. package/src/chat/headless/draft-scope.ts +0 -136
  294. package/src/chat/headless/draft-target.ts +0 -87
  295. package/src/chat/headless/extension-sources.ts +0 -64
  296. package/src/chat/headless/file-chip.ts +0 -175
  297. package/src/chat/headless/fixture-host.ts +0 -294
  298. package/src/chat/headless/fixture-transcript.ts +0 -125
  299. package/src/chat/headless/fixtures/demo-transcript-all-kinds.ts +0 -233
  300. package/src/chat/headless/fixtures/demo-transcript.ts +0 -244
  301. package/src/chat/headless/host.ts +0 -264
  302. package/src/chat/headless/hosts.ts +0 -55
  303. package/src/chat/headless/index.ts +0 -31
  304. package/src/chat/headless/labels.ts +0 -373
  305. package/src/chat/headless/markdown-chunks.ts +0 -134
  306. package/src/chat/headless/path-resolver.ts +0 -178
  307. package/src/chat/headless/prompt-origin.ts +0 -90
  308. package/src/chat/headless/reference-store.ts +0 -285
  309. package/src/chat/headless/send-flow.ts +0 -347
  310. package/src/chat/headless/session-list.ts +0 -400
  311. package/src/chat/headless/sidebar/activity.ts +0 -179
  312. package/src/chat/headless/sidebar/badges.ts +0 -190
  313. package/src/chat/headless/sidebar/compaction.ts +0 -98
  314. package/src/chat/headless/sidebar/directory.ts +0 -1046
  315. package/src/chat/headless/sidebar/dot-state.ts +0 -36
  316. package/src/chat/headless/sidebar/environment.ts +0 -70
  317. package/src/chat/headless/sidebar/estimates.ts +0 -146
  318. package/src/chat/headless/sidebar/host.ts +0 -41
  319. package/src/chat/headless/sidebar/index.ts +0 -18
  320. package/src/chat/headless/sidebar/labels.ts +0 -161
  321. package/src/chat/headless/sidebar/notifications.ts +0 -61
  322. package/src/chat/headless/sidebar/pinned-projects.ts +0 -51
  323. package/src/chat/headless/sidebar/pinned-sessions.ts +0 -27
  324. package/src/chat/headless/sidebar/project-icons.ts +0 -116
  325. package/src/chat/headless/sidebar/query.ts +0 -621
  326. package/src/chat/headless/sidebar/rows.ts +0 -427
  327. package/src/chat/headless/sidebar/types.ts +0 -96
  328. package/src/chat/headless/sidebar/view.ts +0 -367
  329. package/src/chat/headless/site-icons.ts +0 -51
  330. package/src/chat/headless/smooth-stream.ts +0 -76
  331. package/src/chat/headless/store.ts +0 -62
  332. package/src/chat/headless/streams/actions.ts +0 -85
  333. package/src/chat/headless/streams/index.ts +0 -25
  334. package/src/chat/headless/streams/live-events.ts +0 -124
  335. package/src/chat/headless/streams/merge.ts +0 -60
  336. package/src/chat/headless/streams/pacer.ts +0 -189
  337. package/src/chat/headless/streams/prompt-previews.ts +0 -64
  338. package/src/chat/headless/streams/scheduler.ts +0 -36
  339. package/src/chat/headless/streams/selectors.ts +0 -76
  340. package/src/chat/headless/streams/session-streams.ts +0 -407
  341. package/src/chat/headless/streams/store.ts +0 -1107
  342. package/src/chat/headless/streams/transcript.ts +0 -41
  343. package/src/chat/headless/streams/types.ts +0 -84
  344. package/src/chat/headless/transcript/batch.ts +0 -429
  345. package/src/chat/headless/transcript/collapse.ts +0 -789
  346. package/src/chat/headless/transcript/fold-actions.ts +0 -269
  347. package/src/chat/headless/transcript/fold-attachments.ts +0 -78
  348. package/src/chat/headless/transcript/fold.ts +0 -382
  349. package/src/chat/headless/transcript/index.ts +0 -41
  350. package/src/chat/headless/transcript/nesting.ts +0 -73
  351. package/src/chat/headless/transcript/pairing.ts +0 -124
  352. package/src/chat/headless/transcript/rows.ts +0 -377
  353. package/src/chat/headless/transcript/run-failures.ts +0 -72
  354. package/src/chat/headless/transcript/select-stops.ts +0 -151
  355. package/src/chat/headless/transcript/tool-media.ts +0 -42
  356. package/src/chat/headless/transcript-host.ts +0 -180
  357. package/src/chat/headless/transcript-labels.ts +0 -12
  358. package/src/chat/headless/turn-labels.ts +0 -28
  359. package/src/chat/headless/turn-prompt.ts +0 -32
  360. package/src/chat/index.ts +0 -31
  361. package/src/chat/interactions/HostInteractions.tsx +0 -76
  362. package/src/chat/interactions/InboxPanel.tsx +0 -226
  363. package/src/chat/interactions/InteractionCard.tsx +0 -111
  364. package/src/chat/interactions/PlanCard.tsx +0 -186
  365. package/src/chat/interactions/QuestionField.tsx +0 -336
  366. package/src/chat/interactions/QuestionForm.tsx +0 -283
  367. package/src/chat/interactions/card-ui.tsx +0 -86
  368. package/src/chat/interactions/hooks.ts +0 -49
  369. package/src/chat/interactions/index.ts +0 -8
  370. package/src/chat/provider-color.ts +0 -71
  371. package/src/chat/rich-composer/MentionList.tsx +0 -238
  372. package/src/chat/rich-composer/RichComposer.tsx +0 -1071
  373. package/src/chat/rich-composer/badge-decorations.ts +0 -157
  374. package/src/chat/rich-composer/composer-controls.tsx +0 -102
  375. package/src/chat/rich-composer/composer-extensions.ts +0 -388
  376. package/src/chat/rich-composer/composer-keys.ts +0 -416
  377. package/src/chat/rich-composer/ghost-plugin.ts +0 -89
  378. package/src/chat/rich-composer/index.ts +0 -3
  379. package/src/chat/rich-composer/mention-popover.ts +0 -336
  380. package/src/chat/rich-composer/slash-completion.ts +0 -143
  381. package/src/chat/rich-composer/use-composer-bus.ts +0 -57
  382. package/src/chat/rich-composer/use-composer-editor.ts +0 -216
  383. package/src/chat/rich-composer/use-composer-sources.ts +0 -90
  384. package/src/chat/rich-composer/use-draft-mirror.ts +0 -398
  385. package/src/chat/rich-composer/use-editor-handover.ts +0 -45
  386. package/src/chat/rich-composer/use-extension-composer.ts +0 -80
  387. package/src/chat/rich-composer/use-ghost-lifecycle.ts +0 -265
  388. package/src/chat/rich-composer/use-prompt-ghost.ts +0 -90
  389. package/src/chat/rich-composer/use-staged-attachments.ts +0 -65
  390. package/src/chat/sidebar/MainSessionRow.tsx +0 -102
  391. package/src/chat/sidebar/ProjectIcon.tsx +0 -399
  392. package/src/chat/sidebar/RowChips.tsx +0 -98
  393. package/src/chat/sidebar/SessionSidebar.tsx +0 -1039
  394. package/src/chat/sidebar/SidebarDecoration.tsx +0 -93
  395. package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -270
  396. package/src/chat/sidebar/SidebarFooter.tsx +0 -244
  397. package/src/chat/sidebar/SidebarFrame.tsx +0 -154
  398. package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -263
  399. package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
  400. package/src/chat/sidebar/SidebarRowView.tsx +0 -151
  401. package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
  402. package/src/chat/sidebar/SidebarSessionRow.tsx +0 -317
  403. package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
  404. package/src/chat/sidebar/SpaceSwitcher.tsx +0 -341
  405. package/src/chat/sidebar/SpacesSection.tsx +0 -259
  406. package/src/chat/sidebar/collapsed.ts +0 -61
  407. package/src/chat/sidebar/index.ts +0 -109
  408. package/src/chat/sidebar/session-menu.ts +0 -441
  409. package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
  410. package/src/chat/sidebar/sidebar-live.tsx +0 -666
  411. package/src/chat/sidebar/use-main-session.ts +0 -32
  412. package/src/chat/sidebar/useAgentNames.ts +0 -12
  413. package/src/chat/sidebar/useCompactionProgress.ts +0 -24
  414. package/src/chat/sidebar/usePinnedProjects.ts +0 -36
  415. package/src/chat/sidebar/useSaveViewAsSpace.ts +0 -42
  416. package/src/chat/sidebar/useSessionActivity.ts +0 -24
  417. package/src/chat/sidebar/useSessionBadges.ts +0 -26
  418. package/src/chat/sidebar/useSessionDirectoryView.ts +0 -128
  419. package/src/chat/sidebar/useSessionSearch.ts +0 -94
  420. package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -167
  421. package/src/chat/sidebar/useSidebarLabels.ts +0 -10
  422. package/src/chat/testing/composer.contract.ts +0 -508
  423. package/src/chat/testing/contract.ts +0 -634
  424. package/src/chat/testing/fixture-composer-chrome.ts +0 -159
  425. package/src/chat/testing/fixture-composer-host.ts +0 -147
  426. package/src/chat/testing/fixture-sidebar-host.ts +0 -99
  427. package/src/chat/testing/index.ts +0 -12
  428. package/src/chat/testing/sidebar.contract.ts +0 -196
  429. package/src/chat/transcript/BadgeMenu.tsx +0 -241
  430. package/src/chat/transcript/CardMarkdown.tsx +0 -102
  431. package/src/chat/transcript/ChipCard.tsx +0 -187
  432. package/src/chat/transcript/ChipCards.tsx +0 -100
  433. package/src/chat/transcript/DiffLines.tsx +0 -122
  434. package/src/chat/transcript/EarlierHistory.tsx +0 -136
  435. package/src/chat/transcript/EditDiffBlock.tsx +0 -176
  436. package/src/chat/transcript/FileChip.tsx +0 -361
  437. package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
  438. package/src/chat/transcript/InlineChipText.tsx +0 -57
  439. package/src/chat/transcript/InteractionToolBody.tsx +0 -211
  440. package/src/chat/transcript/LazyRow.tsx +0 -311
  441. package/src/chat/transcript/MermaidDiagram.tsx +0 -484
  442. package/src/chat/transcript/PromptEcho.tsx +0 -171
  443. package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
  444. package/src/chat/transcript/ProseMarkdown.tsx +0 -168
  445. package/src/chat/transcript/ReferenceText.tsx +0 -198
  446. package/src/chat/transcript/SelectCursor.tsx +0 -118
  447. package/src/chat/transcript/SelectTurnHint.tsx +0 -81
  448. package/src/chat/transcript/SelectTurnProvider.tsx +0 -150
  449. package/src/chat/transcript/SubagentBlock.tsx +0 -224
  450. package/src/chat/transcript/TranscriptRow.tsx +0 -362
  451. package/src/chat/transcript/TranscriptSearch.tsx +0 -171
  452. package/src/chat/transcript/TurnMenu.tsx +0 -217
  453. package/src/chat/transcript/actions.tsx +0 -77
  454. package/src/chat/transcript/badges.tsx +0 -155
  455. package/src/chat/transcript/chip-details.ts +0 -169
  456. package/src/chat/transcript/chip-resolve.ts +0 -56
  457. package/src/chat/transcript/extension-renderers.tsx +0 -148
  458. package/src/chat/transcript/fold-attachments.tsx +0 -221
  459. package/src/chat/transcript/fold-status.tsx +0 -112
  460. package/src/chat/transcript/fold-worker.tsx +0 -160
  461. package/src/chat/transcript/fold.tsx +0 -522
  462. package/src/chat/transcript/frame.tsx +0 -326
  463. package/src/chat/transcript/index.ts +0 -66
  464. package/src/chat/transcript/markdown-cache.ts +0 -84
  465. package/src/chat/transcript/markdown-context.ts +0 -52
  466. package/src/chat/transcript/markdown.tsx +0 -351
  467. package/src/chat/transcript/messages.tsx +0 -169
  468. package/src/chat/transcript/notices.tsx +0 -508
  469. package/src/chat/transcript/prompt-lines.tsx +0 -55
  470. package/src/chat/transcript/prompt.tsx +0 -258
  471. package/src/chat/transcript/prose.tsx +0 -171
  472. package/src/chat/transcript/recent-map.ts +0 -32
  473. package/src/chat/transcript/references.ts +0 -108
  474. package/src/chat/transcript/remark-references.ts +0 -157
  475. package/src/chat/transcript/remark-refs.ts +0 -176
  476. package/src/chat/transcript/renderer-slots.tsx +0 -35
  477. package/src/chat/transcript/renderers.tsx +0 -251
  478. package/src/chat/transcript/row-estimate.ts +0 -158
  479. package/src/chat/transcript/run-rows.tsx +0 -291
  480. package/src/chat/transcript/site-icons.ts +0 -27
  481. package/src/chat/transcript/thumbnails.ts +0 -146
  482. package/src/chat/transcript/tool-batch.tsx +0 -102
  483. package/src/chat/transcript/tool-details.tsx +0 -31
  484. package/src/chat/transcript/tool-media.tsx +0 -132
  485. package/src/chat/transcript/tool-parts.tsx +0 -358
  486. package/src/chat/transcript/tool-payload.tsx +0 -76
  487. package/src/chat/transcript/tool-row.tsx +0 -496
  488. package/src/chat/transcript/turn-commands.ts +0 -101
  489. package/src/chat/transcript/use-transcript-rows.ts +0 -195
  490. package/src/chat/transcript/useComposerSearch.ts +0 -106
  491. package/src/chat/transcript/useSelectTurnKeys.ts +0 -204
  492. package/src/chat/transcript/useSettledReveal.ts +0 -57
  493. package/src/chat/transcript/useStickToBottom.ts +0 -600
  494. package/src/chat/transcript/useTranscriptFind.ts +0 -70
  495. package/src/chat/transcript/useTranscriptFindKey.ts +0 -52
  496. package/src/chat/transcript/useTranscriptScroll.ts +0 -163
  497. package/src/chat/transcript/useTranscriptSearch.tsx +0 -382
  498. package/src/chat/transcript/useTranscriptSelectionCopy.ts +0 -63
  499. package/src/chat/transcript/useWheelHoverPause.ts +0 -79
  500. package/src/chat/transcript/user-bash.tsx +0 -134
  501. package/src/chat/transcript-options.ts +0 -51
  502. package/src/chat/useChatLabels.ts +0 -14
  503. package/src/code/CodeHighlightProvider.tsx +0 -87
  504. package/src/code/HighlightedCode.tsx +0 -156
  505. package/src/code/code-themes.ts +0 -187
  506. package/src/code/editor/CodeCompletion.tsx +0 -719
  507. package/src/code/editor/CodeEditor.tsx +0 -480
  508. package/src/code/editor/CodeHover.tsx +0 -429
  509. package/src/code/editor/DiagnosticAnnotation.tsx +0 -73
  510. package/src/code/editor/DiagnosticsChip.tsx +0 -85
  511. package/src/code/editor/DiffView.tsx +0 -197
  512. package/src/code/editor/EditorColumn.tsx +0 -256
  513. package/src/code/editor/FileIcon.tsx +0 -89
  514. package/src/code/editor/FileTabPill.tsx +0 -101
  515. package/src/code/editor/FileTree.tsx +0 -414
  516. package/src/code/editor/FileView.tsx +0 -462
  517. package/src/code/editor/HighlightWorkers.tsx +0 -84
  518. package/src/code/editor/LanguageEditor.tsx +0 -210
  519. package/src/code/editor/_vendor/tree-icon-colors.ts +0 -72
  520. package/src/code/editor/diagnostics.ts +0 -140
  521. package/src/code/editor/edit-session.ts +0 -32
  522. package/src/code/editor/environment.tsx +0 -88
  523. package/src/code/editor/find/FindBar.tsx +0 -126
  524. package/src/code/editor/find/find-highlight.ts +0 -138
  525. package/src/code/editor/find/find-model.ts +0 -123
  526. package/src/code/editor/find/settle-scroll.ts +0 -77
  527. package/src/code/editor/find/useFind.ts +0 -203
  528. package/src/code/editor/fs-adapter.ts +0 -37
  529. package/src/code/editor/index.ts +0 -36
  530. package/src/code/editor/language.ts +0 -31
  531. package/src/code/editor/patch-parse.ts +0 -176
  532. package/src/code/editor/patch-parse.worker.ts +0 -12
  533. package/src/code/editor/pierre-theme.ts +0 -155
  534. package/src/code/editor/prime-diff.ts +0 -37
  535. package/src/code/editor/reveal.ts +0 -58
  536. package/src/code/editor/scroll-reach.ts +0 -28
  537. package/src/code/editor/useCodeDocument.ts +0 -226
  538. package/src/code/editor/useDefinition.ts +0 -159
  539. package/src/code/editor/useDetachCleanup.ts +0 -36
  540. package/src/code/editor/useFileDocument.ts +0 -87
  541. package/src/code/editor/useRevealLine.ts +0 -92
  542. package/src/code/editor/word-at.ts +0 -145
  543. package/src/code/highlight.worker.ts +0 -16
  544. package/src/code/highlighter.ts +0 -181
  545. package/src/code/highlights.ts +0 -51
  546. package/src/code/mermaid-lexer.ts +0 -331
  547. package/src/code/shiki-theme.ts +0 -46
  548. package/src/components/BrandMark.tsx +0 -118
  549. package/src/components/Breadcrumb.tsx +0 -105
  550. package/src/components/BrowserChrome.tsx +0 -189
  551. package/src/components/BrowserSignIn.tsx +0 -210
  552. package/src/components/ChoiceCards.tsx +0 -170
  553. package/src/components/CodeFrame.tsx +0 -225
  554. package/src/components/ConfirmDialog.tsx +0 -119
  555. package/src/components/CopyButton.tsx +0 -85
  556. package/src/components/EditableTitle.tsx +0 -199
  557. package/src/components/ErrorBoundary.tsx +0 -208
  558. package/src/components/Form.tsx +0 -593
  559. package/src/components/Highlighted.tsx +0 -68
  560. package/src/components/HowItWorks.tsx +0 -123
  561. package/src/components/IconButton.tsx +0 -101
  562. package/src/components/IconToggle.tsx +0 -71
  563. package/src/components/Keycap.tsx +0 -334
  564. package/src/components/Lightbox.tsx +0 -257
  565. package/src/components/LoadError.tsx +0 -45
  566. package/src/components/MediaNav.tsx +0 -85
  567. package/src/components/Menu.tsx +0 -435
  568. package/src/components/Overlay.tsx +0 -327
  569. package/src/components/PanelEmpty.tsx +0 -80
  570. package/src/components/PanelRows.tsx +0 -107
  571. package/src/components/PreviewWindow.tsx +0 -53
  572. package/src/components/ReorderTabs.tsx +0 -103
  573. package/src/components/RowActionsMenu.tsx +0 -383
  574. package/src/components/SegmentSpinner.tsx +0 -88
  575. package/src/components/Segmented.tsx +0 -126
  576. package/src/components/StepFrame.tsx +0 -151
  577. package/src/components/Stepper.tsx +0 -157
  578. package/src/components/Surface.tsx +0 -191
  579. package/src/components/SwatchPicker.tsx +0 -147
  580. package/src/components/SwitchGlyph.tsx +0 -56
  581. package/src/components/TabPill.tsx +0 -188
  582. package/src/components/ThemeThumb.tsx +0 -52
  583. package/src/components/ToggleCard.tsx +0 -120
  584. package/src/components/Tooltip.tsx +0 -288
  585. package/src/components/ZoomableImage.tsx +0 -322
  586. package/src/components/button.ts +0 -120
  587. package/src/components/floating/FloatingSurface.tsx +0 -158
  588. package/src/components/floating/HoverCard.tsx +0 -143
  589. package/src/components/floating/Popover.tsx +0 -166
  590. package/src/components/floating/useAnchoredPosition.ts +0 -186
  591. package/src/components/floating/usePopover.ts +0 -158
  592. package/src/components/image-clipboard.ts +0 -70
  593. package/src/components/keyboard-layout.ts +0 -115
  594. package/src/components/palette/PaletteList.tsx +0 -432
  595. package/src/components/palette/PalettePanel.tsx +0 -338
  596. package/src/components/palette/palette-layout.ts +0 -86
  597. package/src/components/report-error.ts +0 -142
  598. package/src/components/zoom.ts +0 -133
  599. package/src/extensions/ExtensionComponent.tsx +0 -167
  600. package/src/extensions/ExtensionDialogHost.tsx +0 -445
  601. package/src/extensions/ExtensionRenderer.tsx +0 -100
  602. package/src/extensions/ExtensionScreen.tsx +0 -122
  603. package/src/extensions/ExtensionSettingsPage.tsx +0 -112
  604. package/src/extensions/ExtensionSettingsPages.tsx +0 -44
  605. package/src/extensions/ExtensionSettingsSidebar.tsx +0 -373
  606. package/src/extensions/ExtensionSlot.tsx +0 -213
  607. package/src/extensions/ExtensionWebview.tsx +0 -104
  608. package/src/extensions/ExtensionsProvider.tsx +0 -124
  609. package/src/extensions/SettingsWireForm.tsx +0 -182
  610. package/src/extensions/headless/dialog-queue.ts +0 -92
  611. package/src/extensions/headless/effect-channel.ts +0 -50
  612. package/src/extensions/headless/effect-router.ts +0 -107
  613. package/src/extensions/headless/fixture-host.ts +0 -381
  614. package/src/extensions/headless/host.ts +0 -398
  615. package/src/extensions/headless/index.ts +0 -17
  616. package/src/extensions/headless/labels.ts +0 -64
  617. package/src/extensions/headless/links.ts +0 -56
  618. package/src/extensions/headless/select.ts +0 -249
  619. package/src/extensions/headless/webview-bridge.ts +0 -127
  620. package/src/extensions/headless/wire.ts +0 -175
  621. package/src/extensions/hooks.ts +0 -209
  622. package/src/extensions/index.ts +0 -25
  623. package/src/extensions/kit.ts +0 -79
  624. package/src/extensions/links.tsx +0 -165
  625. package/src/extensions/testing/contract.ts +0 -382
  626. package/src/extensions/testing/index.ts +0 -6
  627. package/src/extensions/useExtensionsLabels.ts +0 -14
  628. package/src/files/CodeViewer.tsx +0 -289
  629. package/src/files/DiffFileViewer.tsx +0 -143
  630. package/src/files/DiffsTab.tsx +0 -581
  631. package/src/files/EditorColumn.tsx +0 -453
  632. package/src/files/EditorEnvironmentRoot.tsx +0 -63
  633. package/src/files/FilesDiagnosticsChip.tsx +0 -32
  634. package/src/files/FilesProvider.tsx +0 -58
  635. package/src/files/FilesTab.tsx +0 -441
  636. package/src/files/MediaDiff.tsx +0 -61
  637. package/src/files/MediaView.tsx +0 -170
  638. package/src/files/ReviewDraft.tsx +0 -88
  639. package/src/files/ReviewableDiff.tsx +0 -72
  640. package/src/files/SearchPanel.tsx +0 -325
  641. package/src/files/TreeColumn.tsx +0 -229
  642. package/src/files/code-excerpt.ts +0 -265
  643. package/src/files/code-menu.ts +0 -53
  644. package/src/files/drafts-store.ts +0 -192
  645. package/src/files/file-actions.ts +0 -152
  646. package/src/files/headless/editor-prefs.ts +0 -230
  647. package/src/files/headless/entries.ts +0 -172
  648. package/src/files/headless/fixture-host.ts +0 -260
  649. package/src/files/headless/host.ts +0 -387
  650. package/src/files/headless/index.ts +0 -14
  651. package/src/files/headless/labels.ts +0 -123
  652. package/src/files/headless/lsp-edits.ts +0 -58
  653. package/src/files/headless/media.ts +0 -57
  654. package/src/files/headless/name-match.ts +0 -38
  655. package/src/files/headless/search.ts +0 -23
  656. package/src/files/headless/view.ts +0 -114
  657. package/src/files/headless/workspace-diff.ts +0 -82
  658. package/src/files/index.ts +0 -25
  659. package/src/files/lazy-tabs.tsx +0 -41
  660. package/src/files/session-patch.ts +0 -45
  661. package/src/files/tab-hooks.ts +0 -37
  662. package/src/files/testing/contract.ts +0 -279
  663. package/src/files/testing/demo.ts +0 -36
  664. package/src/files/testing/index.ts +0 -7
  665. package/src/files/useCodeReview.tsx +0 -177
  666. package/src/files/useDiagnostics.ts +0 -59
  667. package/src/files/useDiagnosticsRun.ts +0 -86
  668. package/src/files/useEntryActions.ts +0 -280
  669. package/src/files/useFilesDiagnostics.ts +0 -51
  670. package/src/files/useFilesLabels.ts +0 -14
  671. package/src/files/useFolderChanges.ts +0 -38
  672. package/src/files/useLsp.ts +0 -181
  673. package/src/files/useOpenFiles.ts +0 -402
  674. package/src/files/useWorkspace.ts +0 -148
  675. package/src/files/working-tree-diff.ts +0 -142
  676. package/src/git/BranchMenu.tsx +0 -988
  677. package/src/git/GitBar.tsx +0 -297
  678. package/src/git/GitProvider.tsx +0 -50
  679. package/src/git/ImportRepoDialog.tsx +0 -390
  680. package/src/git/MoveSessionDialog.tsx +0 -396
  681. package/src/git/RemoteFolderPicker.tsx +0 -475
  682. package/src/git/SyncChip.tsx +0 -275
  683. package/src/git/WherePicker.tsx +0 -358
  684. package/src/git/headless/environment.ts +0 -132
  685. package/src/git/headless/host.ts +0 -353
  686. package/src/git/headless/index.ts +0 -14
  687. package/src/git/headless/labels.ts +0 -230
  688. package/src/git/headless/move.ts +0 -101
  689. package/src/git/headless/remote-clone.ts +0 -44
  690. package/src/git/headless/status-reads.ts +0 -77
  691. package/src/git/headless/switcher.ts +0 -215
  692. package/src/git/headless/sync.ts +0 -71
  693. package/src/git/index.ts +0 -17
  694. package/src/git/testing/contract.ts +0 -551
  695. package/src/git/testing/index.ts +0 -537
  696. package/src/git/useEnvironmentChoices.ts +0 -50
  697. package/src/git/useGitBar.ts +0 -180
  698. package/src/hooks/keyed-store.ts +0 -65
  699. package/src/hooks/useDisplayPath.tsx +0 -93
  700. package/src/hooks/useHydrated.ts +0 -16
  701. package/src/hooks/useMinuteTick.ts +0 -49
  702. package/src/hooks/useNearViewport.ts +0 -111
  703. package/src/hooks/usePersistedState.ts +0 -98
  704. package/src/hooks/useResizeDrag.ts +0 -240
  705. package/src/hooks/useTabDrag.ts +0 -88
  706. package/src/index.ts +0 -119
  707. package/src/keybindings/KeyCommands.tsx +0 -123
  708. package/src/keybindings/KeyHint.tsx +0 -78
  709. package/src/keybindings/KeybindingsProvider.tsx +0 -231
  710. package/src/keybindings/headless/catalog.ts +0 -360
  711. package/src/keybindings/headless/commands.ts +0 -77
  712. package/src/keybindings/headless/fixture-host.ts +0 -51
  713. package/src/keybindings/headless/host.ts +0 -29
  714. package/src/keybindings/headless/index.ts +0 -13
  715. package/src/keybindings/headless/key-scope.ts +0 -91
  716. package/src/keybindings/headless/labels.ts +0 -14
  717. package/src/keybindings/headless/overrides.ts +0 -64
  718. package/src/keybindings/index.ts +0 -15
  719. package/src/keybindings/load-once.ts +0 -11
  720. package/src/keybindings/match.ts +0 -48
  721. package/src/keybindings/press.ts +0 -80
  722. package/src/keybindings/testing/contract.ts +0 -139
  723. package/src/keybindings/testing/index.ts +0 -6
  724. package/src/keybindings/useHelpKey.ts +0 -35
  725. package/src/keybindings/useKeybindingsLabels.ts +0 -14
  726. package/src/labels.tsx +0 -175
  727. package/src/machines/AddServerForm.tsx +0 -151
  728. package/src/machines/Banners.tsx +0 -172
  729. package/src/machines/DaemonMenu.tsx +0 -413
  730. package/src/machines/HostCapabilities.tsx +0 -245
  731. package/src/machines/HostSignIn.tsx +0 -63
  732. package/src/machines/HostSyncPanel.tsx +0 -275
  733. package/src/machines/HostsSection.tsx +0 -312
  734. package/src/machines/MachinesProvider.tsx +0 -164
  735. package/src/machines/ServerCard.tsx +0 -347
  736. package/src/machines/ServerMachinesPanel.tsx +0 -547
  737. package/src/machines/ServerUpdatePanel.tsx +0 -160
  738. package/src/machines/SyncAccounts.tsx +0 -148
  739. package/src/machines/SyncMarker.tsx +0 -87
  740. package/src/machines/SyncOutcomeBadge.tsx +0 -84
  741. package/src/machines/TokensPanel.tsx +0 -249
  742. package/src/machines/headless/fixture-host.ts +0 -519
  743. package/src/machines/headless/fixtures.ts +0 -164
  744. package/src/machines/headless/host.ts +0 -381
  745. package/src/machines/headless/index.ts +0 -13
  746. package/src/machines/headless/labels.ts +0 -364
  747. package/src/machines/headless/messages.ts +0 -209
  748. package/src/machines/headless/presence.ts +0 -110
  749. package/src/machines/headless/settings-focus.ts +0 -25
  750. package/src/machines/headless/stores.ts +0 -137
  751. package/src/machines/headless/sync.ts +0 -207
  752. package/src/machines/index.ts +0 -29
  753. package/src/machines/settings-section.tsx +0 -37
  754. package/src/machines/testing/contract.ts +0 -617
  755. package/src/machines/testing/index.ts +0 -7
  756. package/src/machines/testing/sync.contract.ts +0 -260
  757. package/src/motion/SwapIcon.tsx +0 -29
  758. package/src/motion/collapse.ts +0 -21
  759. package/src/motion/grow.tsx +0 -86
  760. package/src/motion/layout-animating.ts +0 -50
  761. package/src/motion/presence.ts +0 -191
  762. package/src/motion/provider.tsx +0 -63
  763. package/src/motion/reduced.ts +0 -36
  764. package/src/motion/roll.tsx +0 -131
  765. package/src/motion/shimmer.ts +0 -15
  766. package/src/motion/size.tsx +0 -192
  767. package/src/motion/springs.ts +0 -413
  768. package/src/motion/swap.tsx +0 -216
  769. package/src/motion/title-text.tsx +0 -74
  770. package/src/onboarding/ConnectProviderCard.tsx +0 -49
  771. package/src/onboarding/OnboardingFlow.tsx +0 -176
  772. package/src/onboarding/OnboardingProvider.tsx +0 -209
  773. package/src/onboarding/OnboardingStepFrame.tsx +0 -80
  774. package/src/onboarding/conversation.tsx +0 -196
  775. package/src/onboarding/demos/autonomy.tsx +0 -154
  776. package/src/onboarding/demos/extensions.tsx +0 -183
  777. package/src/onboarding/demos/features.tsx +0 -488
  778. package/src/onboarding/demos/how-it-works.tsx +0 -698
  779. package/src/onboarding/demos/index.ts +0 -11
  780. package/src/onboarding/demos/parts.tsx +0 -133
  781. package/src/onboarding/demos/tour.tsx +0 -217
  782. package/src/onboarding/headless/controller.ts +0 -110
  783. package/src/onboarding/headless/fixture-host.ts +0 -269
  784. package/src/onboarding/headless/fixtures.ts +0 -486
  785. package/src/onboarding/headless/host.ts +0 -176
  786. package/src/onboarding/headless/index.ts +0 -8
  787. package/src/onboarding/headless/labels.ts +0 -282
  788. package/src/onboarding/index.ts +0 -21
  789. package/src/onboarding/marks.tsx +0 -107
  790. package/src/onboarding/preview-attachments.ts +0 -39
  791. package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -128
  792. package/src/onboarding/skills/parts.tsx +0 -464
  793. package/src/onboarding/sources/SourceBrowser.tsx +0 -400
  794. package/src/onboarding/steps/AutonomyStep.tsx +0 -128
  795. package/src/onboarding/steps/ConnectStep.tsx +0 -104
  796. package/src/onboarding/steps/ConnectorsStep.tsx +0 -222
  797. package/src/onboarding/steps/ConversationStep.tsx +0 -132
  798. package/src/onboarding/steps/ExtensionsStep.tsx +0 -113
  799. package/src/onboarding/steps/FeatureExample.tsx +0 -46
  800. package/src/onboarding/steps/FeaturesStep.tsx +0 -88
  801. package/src/onboarding/steps/ImportStep.tsx +0 -156
  802. package/src/onboarding/steps/LookStep.tsx +0 -276
  803. package/src/onboarding/steps/ReadyStep.tsx +0 -278
  804. package/src/onboarding/steps/SkillsStep.tsx +0 -45
  805. package/src/onboarding/steps/StepSection.tsx +0 -63
  806. package/src/onboarding/steps/Tradeoff.tsx +0 -45
  807. package/src/onboarding/steps/WelcomeStep.tsx +0 -147
  808. package/src/onboarding/steps/connect/KeyForm.tsx +0 -112
  809. package/src/onboarding/steps/connect/ProviderPanel.tsx +0 -149
  810. package/src/onboarding/steps/connect/ProviderReady.tsx +0 -171
  811. package/src/onboarding/steps/connect/ready-text.ts +0 -17
  812. package/src/onboarding/steps/index.ts +0 -12
  813. package/src/onboarding/steps/tasks.tsx +0 -84
  814. package/src/onboarding/testing/contract.ts +0 -472
  815. package/src/onboarding/testing/index.ts +0 -7
  816. package/src/onboarding/tutorials.tsx +0 -45
  817. package/src/onboarding/useSignIn.ts +0 -58
  818. package/src/palette/CommandPalette.tsx +0 -59
  819. package/src/palette/PaletteDialog.tsx +0 -186
  820. package/src/palette/PaletteProvider.tsx +0 -149
  821. package/src/palette/PaletteRows.tsx +0 -208
  822. package/src/palette/app-sources.ts +0 -62
  823. package/src/palette/headless/app-sources.ts +0 -515
  824. package/src/palette/headless/gather.ts +0 -50
  825. package/src/palette/headless/host.ts +0 -129
  826. package/src/palette/headless/index.ts +0 -15
  827. package/src/palette/headless/labels.ts +0 -124
  828. package/src/palette/headless/rank-protocol.ts +0 -23
  829. package/src/palette/headless/recents.ts +0 -35
  830. package/src/palette/headless/session-sources.ts +0 -218
  831. package/src/palette/headless/sources.ts +0 -313
  832. package/src/palette/headless/store.ts +0 -105
  833. package/src/palette/index.ts +0 -17
  834. package/src/palette/rank.worker.ts +0 -30
  835. package/src/palette/setup.ts +0 -19
  836. package/src/palette/testing/contract.ts +0 -250
  837. package/src/palette/testing/index.ts +0 -152
  838. package/src/palette/useConversationSearch.ts +0 -115
  839. package/src/palette/usePaletteController.ts +0 -229
  840. package/src/palette/useRankedItems.ts +0 -122
  841. package/src/path.ts +0 -199
  842. package/src/server/demo-tools.ts +0 -34
  843. package/src/server/environment.ts +0 -118
  844. package/src/server/index.ts +0 -7
  845. package/src/server/scripted-provider.ts +0 -174
  846. package/src/server/sse-handler.ts +0 -457
  847. package/src/server/testing/index.ts +0 -7
  848. package/src/session/ArtifactRowChips.tsx +0 -260
  849. package/src/session/ArtifactsPanel.tsx +0 -426
  850. package/src/session/DiffFileTree.tsx +0 -173
  851. package/src/session/PanelAttention.tsx +0 -131
  852. package/src/session/ProjectHome.tsx +0 -733
  853. package/src/session/ProviderUsageProvider.tsx +0 -113
  854. package/src/session/QueueTab.tsx +0 -669
  855. package/src/session/RunningWorkDialog.tsx +0 -178
  856. package/src/session/SessionCacheFacts.tsx +0 -190
  857. package/src/session/SessionDetailsDialog.tsx +0 -627
  858. package/src/session/SessionHeader.tsx +0 -242
  859. package/src/session/SessionProvider.tsx +0 -98
  860. package/src/session/SessionShell.tsx +0 -77
  861. package/src/session/SideChat.tsx +0 -320
  862. package/src/session/TodoList.tsx +0 -123
  863. package/src/session/TodosPanel.tsx +0 -279
  864. package/src/session/TurnDetailsDialog.tsx +0 -299
  865. package/src/session/UsagePanel.tsx +0 -358
  866. package/src/session/WelcomeScreen.tsx +0 -88
  867. package/src/session/headless/artifacts.ts +0 -101
  868. package/src/session/headless/diff-tree.ts +0 -167
  869. package/src/session/headless/fixture-host.ts +0 -362
  870. package/src/session/headless/home-layout.ts +0 -276
  871. package/src/session/headless/host.ts +0 -263
  872. package/src/session/headless/index.ts +0 -23
  873. package/src/session/headless/keyed.ts +0 -72
  874. package/src/session/headless/labels.ts +0 -337
  875. package/src/session/headless/queue-attachments.ts +0 -73
  876. package/src/session/headless/queue.ts +0 -122
  877. package/src/session/headless/running-work.ts +0 -85
  878. package/src/session/headless/session-actions.ts +0 -198
  879. package/src/session/headless/session-diffs.ts +0 -136
  880. package/src/session/headless/side.ts +0 -63
  881. package/src/session/headless/todos.ts +0 -62
  882. package/src/session/headless/usage-format.ts +0 -19
  883. package/src/session/headless/usage.ts +0 -407
  884. package/src/session/index.ts +0 -31
  885. package/src/session/modal-shell.tsx +0 -24
  886. package/src/session/testing/contract.ts +0 -588
  887. package/src/session/testing/demo.ts +0 -224
  888. package/src/session/testing/index.ts +0 -7
  889. package/src/session/useSessionLabels.ts +0 -14
  890. package/src/session/useUsageSummary.ts +0 -82
  891. package/src/settings/SettingsHeadingText.tsx +0 -54
  892. package/src/settings/SettingsHostSwitcher.tsx +0 -93
  893. package/src/settings/SettingsNav.tsx +0 -198
  894. package/src/settings/SettingsProvider.tsx +0 -127
  895. package/src/settings/SettingsRowsPage.tsx +0 -218
  896. package/src/settings/SettingsShell.tsx +0 -337
  897. package/src/settings/SettingsTutorial.tsx +0 -55
  898. package/src/settings/headless/catalog.ts +0 -570
  899. package/src/settings/headless/claude-import.ts +0 -61
  900. package/src/settings/headless/enabled.ts +0 -44
  901. package/src/settings/headless/fixture-accounts.ts +0 -260
  902. package/src/settings/headless/fixture-host.ts +0 -162
  903. package/src/settings/headless/fixture-models.ts +0 -51
  904. package/src/settings/headless/fixture-performance.ts +0 -350
  905. package/src/settings/headless/fixture-sections.ts +0 -391
  906. package/src/settings/headless/host.ts +0 -127
  907. package/src/settings/headless/index.ts +0 -22
  908. package/src/settings/headless/labels.ts +0 -63
  909. package/src/settings/headless/layout-sections.ts +0 -41
  910. package/src/settings/headless/layout.ts +0 -732
  911. package/src/settings/headless/mcp.ts +0 -319
  912. package/src/settings/headless/models.ts +0 -51
  913. package/src/settings/headless/page-counts.ts +0 -40
  914. package/src/settings/headless/performance.ts +0 -524
  915. package/src/settings/headless/providers.ts +0 -117
  916. package/src/settings/headless/registry.ts +0 -62
  917. package/src/settings/headless/resource.ts +0 -75
  918. package/src/settings/headless/search.ts +0 -142
  919. package/src/settings/headless/sections-host.ts +0 -340
  920. package/src/settings/index.ts +0 -32
  921. package/src/settings/rows.tsx +0 -152
  922. package/src/settings/section.tsx +0 -165
  923. package/src/settings/sections/appearance/AppearanceSection.tsx +0 -667
  924. package/src/settings/sections/appearance/labels.ts +0 -77
  925. package/src/settings/sections/claude-import/ClaudeImportDialog.tsx +0 -258
  926. package/src/settings/sections/claude-import/labels.ts +0 -42
  927. package/src/settings/sections/claude-import/use-claude-import-available.ts +0 -35
  928. package/src/settings/sections/descriptors.tsx +0 -261
  929. package/src/settings/sections/editor/EditorSection.tsx +0 -521
  930. package/src/settings/sections/editor/labels.ts +0 -84
  931. package/src/settings/sections/enabled-list/EnabledListSection.tsx +0 -112
  932. package/src/settings/sections/enabled-list/labels.ts +0 -37
  933. package/src/settings/sections/environments/EnvironmentsSection.tsx +0 -549
  934. package/src/settings/sections/environments/labels.ts +0 -31
  935. package/src/settings/sections/extensions/ChangeOriginDialog.tsx +0 -218
  936. package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -210
  937. package/src/settings/sections/extensions/ExtensionConfigRows.tsx +0 -508
  938. package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -356
  939. package/src/settings/sections/extensions/ExtensionPicksBar.tsx +0 -112
  940. package/src/settings/sections/extensions/ExtensionSourceBrowser.tsx +0 -244
  941. package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -665
  942. package/src/settings/sections/extensions/create-labels.ts +0 -31
  943. package/src/settings/sections/extensions/labels.ts +0 -64
  944. package/src/settings/sections/extensions/options-labels.ts +0 -34
  945. package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -457
  946. package/src/settings/sections/host-catalog/labels.ts +0 -44
  947. package/src/settings/sections/index.ts +0 -60
  948. package/src/settings/sections/instructions/InstructionsSection.tsx +0 -385
  949. package/src/settings/sections/instructions/labels.ts +0 -33
  950. package/src/settings/sections/keybindings/KeybindingsSection.tsx +0 -124
  951. package/src/settings/sections/keybindings/labels.ts +0 -72
  952. package/src/settings/sections/keybindings/rows.ts +0 -103
  953. package/src/settings/sections/logs/LogsSection.tsx +0 -153
  954. package/src/settings/sections/logs/labels.ts +0 -20
  955. package/src/settings/sections/mcp/McpAddForm.tsx +0 -245
  956. package/src/settings/sections/mcp/McpSection.tsx +0 -358
  957. package/src/settings/sections/mcp/McpServerRow.tsx +0 -404
  958. package/src/settings/sections/mcp/labels.ts +0 -193
  959. package/src/settings/sections/models/AgentDefaults.tsx +0 -365
  960. package/src/settings/sections/models/ModelListPicker.tsx +0 -265
  961. package/src/settings/sections/models/ModelPickField.tsx +0 -220
  962. package/src/settings/sections/models/ModelRows.tsx +0 -381
  963. package/src/settings/sections/models/SpacesDefaultsSection.tsx +0 -102
  964. package/src/settings/sections/models/labels.ts +0 -119
  965. package/src/settings/sections/models/model-test.tsx +0 -125
  966. package/src/settings/sections/performance/PerfSparkline.tsx +0 -64
  967. package/src/settings/sections/performance/PerformanceHud.tsx +0 -110
  968. package/src/settings/sections/performance/PerformanceSection.tsx +0 -770
  969. package/src/settings/sections/performance/labels.ts +0 -114
  970. package/src/settings/sections/performance/use-perf-monitor.ts +0 -26
  971. package/src/settings/sections/plugins/PluginsSection.tsx +0 -151
  972. package/src/settings/sections/plugins/labels.ts +0 -23
  973. package/src/settings/sections/providers/CredentialSources.tsx +0 -237
  974. package/src/settings/sections/providers/ProvidersSection.tsx +0 -389
  975. package/src/settings/sections/providers/ServerProvidersSection.tsx +0 -244
  976. package/src/settings/sections/providers/ServerSignIn.tsx +0 -137
  977. package/src/settings/sections/providers/labels.ts +0 -160
  978. package/src/settings/sections/shared/catalog.tsx +0 -265
  979. package/src/settings/sections/shared/labels.ts +0 -31
  980. package/src/settings/sections/skills/SkillList.tsx +0 -494
  981. package/src/settings/sections/skills/SkillsSection.tsx +0 -249
  982. package/src/settings/sections/skills/labels.ts +0 -54
  983. package/src/settings/sections/use-section-labels.ts +0 -10
  984. package/src/settings/testing/accounts-demo.ts +0 -110
  985. package/src/settings/testing/accounts.contract.ts +0 -319
  986. package/src/settings/testing/claude-import.contract.ts +0 -93
  987. package/src/settings/testing/contract.ts +0 -192
  988. package/src/settings/testing/extension-options.contract.ts +0 -163
  989. package/src/settings/testing/index.ts +0 -11
  990. package/src/settings/testing/models.contract.ts +0 -135
  991. package/src/settings/testing/performance.contract.ts +0 -219
  992. package/src/settings/testing/sections.contract.ts +0 -306
  993. package/src/terminal/HostTerminalSurface.tsx +0 -917
  994. package/src/terminal/TerminalDrawer.tsx +0 -228
  995. package/src/terminal/TerminalPanel.tsx +0 -740
  996. package/src/terminal/TerminalProvider.tsx +0 -201
  997. package/src/terminal/TerminalSurface.tsx +0 -262
  998. package/src/terminal/box-glyphs.ts +0 -333
  999. package/src/terminal/ghostty.ts +0 -116
  1000. package/src/terminal/grid-size.ts +0 -46
  1001. package/src/terminal/headless/fixture-host.ts +0 -250
  1002. package/src/terminal/headless/host.ts +0 -99
  1003. package/src/terminal/headless/index.ts +0 -11
  1004. package/src/terminal/headless/labels.ts +0 -69
  1005. package/src/terminal/headless/layout.ts +0 -57
  1006. package/src/terminal/headless/links.ts +0 -227
  1007. package/src/terminal/headless/order.ts +0 -28
  1008. package/src/terminal/headless/output-cursor.ts +0 -66
  1009. package/src/terminal/headless/recent.ts +0 -20
  1010. package/src/terminal/headless/replay.ts +0 -45
  1011. package/src/terminal/headless/scope.ts +0 -60
  1012. package/src/terminal/headless/store.ts +0 -637
  1013. package/src/terminal/index.ts +0 -40
  1014. package/src/terminal/keys.ts +0 -34
  1015. package/src/terminal/testing/contract.ts +0 -274
  1016. package/src/terminal/testing/demo.ts +0 -40
  1017. package/src/terminal/testing/index.ts +0 -7
  1018. package/src/terminal/theme.ts +0 -110
  1019. package/src/terminal/useTerminalLabels.ts +0 -14
  1020. package/src/theme/accents.ts +0 -46
  1021. package/src/theme/color.ts +0 -450
  1022. package/src/theme/css-vars.ts +0 -187
  1023. package/src/theme/derive.ts +0 -700
  1024. package/src/theme/from-theme.ts +0 -52
  1025. package/src/theme/stylesheet.ts +0 -55
  1026. package/src/theme/themes.ts +0 -767
  1027. package/src/theme/without-transitions.ts +0 -18
  1028. package/src/uno.ts +0 -167
  1029. package/src/workspace/LayoutBudget.tsx +0 -143
  1030. package/src/workspace/PanelContentView.tsx +0 -523
  1031. package/src/workspace/PanelCorner.tsx +0 -111
  1032. package/src/workspace/PanelGroups.tsx +0 -264
  1033. package/src/workspace/PanelHome.tsx +0 -71
  1034. package/src/workspace/PanelItems.tsx +0 -368
  1035. package/src/workspace/PanelStrip.tsx +0 -316
  1036. package/src/workspace/SidePanel.tsx +0 -240
  1037. package/src/workspace/TabParking.tsx +0 -120
  1038. package/src/workspace/WorkspaceProvider.tsx +0 -558
  1039. package/src/workspace/dnd/engine.ts +0 -371
  1040. package/src/workspace/dnd/hooks.ts +0 -72
  1041. package/src/workspace/dnd/index.ts +0 -57
  1042. package/src/workspace/dnd/parking.tsx +0 -181
  1043. package/src/workspace/extension-tabs.tsx +0 -174
  1044. package/src/workspace/frame-motion.ts +0 -160
  1045. package/src/workspace/headless/contents.ts +0 -125
  1046. package/src/workspace/headless/host.ts +0 -129
  1047. package/src/workspace/headless/index.ts +0 -33
  1048. package/src/workspace/headless/labels.ts +0 -44
  1049. package/src/workspace/headless/layout-memory.ts +0 -649
  1050. package/src/workspace/headless/layouts.ts +0 -224
  1051. package/src/workspace/headless/open-target.ts +0 -125
  1052. package/src/workspace/headless/ops.ts +0 -163
  1053. package/src/workspace/headless/panel-focus.ts +0 -58
  1054. package/src/workspace/headless/panel-tree.ts +0 -259
  1055. package/src/workspace/headless/resolve.ts +0 -146
  1056. package/src/workspace/headless/reveal-at.ts +0 -27
  1057. package/src/workspace/headless/strip-drop.ts +0 -81
  1058. package/src/workspace/headless/tree.ts +0 -480
  1059. package/src/workspace/headless/view.ts +0 -164
  1060. package/src/workspace/index.ts +0 -23
  1061. package/src/workspace/panel-group-keys.ts +0 -36
  1062. package/src/workspace/panel-visibility.ts +0 -28
  1063. package/src/workspace/tab-scopes.ts +0 -245
  1064. package/src/workspace/testing/contract.ts +0 -282
  1065. package/src/workspace/testing/index.ts +0 -140
  1066. package/src/workspace/use-split-drag.ts +0 -73
  1067. package/src/workspace/useScopeLayout.ts +0 -26
  1068. package/src/workspace/useViewport.ts +0 -22
  1069. package/src/workspace/useWorkspaceLabels.ts +0 -14
  1070. package/src/workspace/workspace-key-commands.ts +0 -108
  1071. /package/dist/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +0 -0
@@ -1,1039 +0,0 @@
1
- /**
2
- * The session sidebar, whole: its frame (`SidebarFrame`), the top band (the
3
- * orchestration Main, New session, the search well with the filter menu),
4
- * the list (grouped sections whose headers stick, the search results, one
5
- * list per space that slides on a user switch), the extensions' `sidebar.top`
6
- * and `sidebar.bottom` blocks pinned right above and below the list (they
7
- * never scroll with it) and the footer the app puts under it. The keyboard walks the list (`useSidebarKeyboardNav`): ↑ / ↓ go
8
- * from session to session and skip extension item rows (landing on one would
9
- * open its target, which may run an extension command); Tab reaches them.
10
- * An empty list says why: no chats yet, or none matching the view's filters,
11
- * with a reset when the app passes `onViewChange`.
12
- *
13
- * The data comes in as props, the session directory's view
14
- * (`useSessionDirectoryView`) with the app's actions; the live parts of the
15
- * rows from the app's {@link SidebarLive}; the platform rows of the menus
16
- * from the `SidebarHost` in context.
17
- */
18
- import {
19
- forwardRef,
20
- useCallback,
21
- useEffect,
22
- useLayoutEffect,
23
- useMemo,
24
- useRef,
25
- useState,
26
- type CSSProperties,
27
- type ReactNode,
28
- } from 'react';
29
- import {
30
- AnimatePresence,
31
- domAnimation,
32
- LazyMotion,
33
- m,
34
- useIsPresent,
35
- type HTMLMotionProps,
36
- type Variants,
37
- } from 'motion/react';
38
- import type { SessionEnvironmentSummary } from 'zidane/chat';
39
- import { sortRows, type SessionQueryRow, type Space } from 'zidane/chat/pure';
40
-
41
- import { useExtensionsHost } from '../../extensions/ExtensionsProvider';
42
- import { useExtensionScreen } from '../../extensions/ExtensionScreen';
43
- import { ExtensionSlot } from '../../extensions/ExtensionSlot';
44
- import type { ExtensionItem, SidebarRowActionWire } from '../../extensions/headless/wire';
45
- import { useOptionalWorkspaceActions } from '../../workspace/WorkspaceProvider';
46
-
47
- import { KeyHint } from '../../keybindings/KeyHint';
48
- import { useWithFade } from '../../motion/springs';
49
- import { basename } from '../../path';
50
- import { SessionHostHeader } from '../SessionHostHeader';
51
- import { ShowMoreRow } from '../SessionGroupHeader';
52
- import type { HostView } from '../headless/hosts';
53
- import { compareSessions } from '../headless/session-list';
54
- import { MAIN_SESSION_ICON_KEY } from '../headless/sidebar/project-icons';
55
- import {
56
- AGENT_GROUPING,
57
- claimChildSessions,
58
- clearedViewFilters,
59
- createDecorator,
60
- viewFiltersOn,
61
- type SidebarGrouping,
62
- type SidebarQueryLayer,
63
- type SidebarRowDecoration,
64
- } from '../headless/sidebar/query';
65
- import {
66
- buildHostSidebarRows,
67
- buildQuerySidebarRows,
68
- groupsByFolder,
69
- itemRows,
70
- nestSidebarRows,
71
- partitionMainSession,
72
- type SidebarNode,
73
- type SidebarListRow,
74
- } from '../headless/sidebar/rows';
75
- import type {
76
- SessionArchiveFilter,
77
- SidebarGroupBy,
78
- SidebarListSession,
79
- SidebarSortBy,
80
- SidebarView,
81
- } from '../headless/sidebar/types';
82
- import { MainSessionRow } from './MainSessionRow';
83
- import { useProjectIcons } from './ProjectIcon';
84
- import type { RowProject } from './RowChips';
85
- import { useEnvironmentCommands, type SidebarProject } from './session-menu';
86
- import { holdFocusIn } from './sidebar-focus-hold';
87
- import { SidebarFrame, useSidebarFrame, type SidebarChromeInset } from './SidebarFrame';
88
- import { SidebarGroupHeader, type SidebarProjectRef } from './SidebarGroupHeader';
89
- import { SidebarRowView } from './SidebarRowView';
90
- import { useAgentNames } from './useAgentNames';
91
- import type { SidebarLive } from './sidebar-live';
92
- import { useSidebarNotice } from './SidebarHostProvider';
93
- import { SidebarSearchRow } from './SidebarSearchRow';
94
- import { SidebarSessionRow } from './SidebarSessionRow';
95
- import { usePinnedProjects } from './usePinnedProjects';
96
- import { useSessionSearch, type SessionContentSearch } from './useSessionSearch';
97
- import { useSidebarKeyboardNav } from './useSidebarKeyboardNav';
98
- import { useSidebarLabels } from './useSidebarLabels';
99
-
100
- /** A session as the sidebar's rows read it: the list's session plus where it runs when not here. */
101
- export interface SidebarRowSession extends SidebarListSession {
102
- /** Its environment, when it runs somewhere else than this machine's folder. */
103
- environment?: SessionEnvironmentSummary;
104
- }
105
-
106
- /** The space switch that showed the list's space: the list slides that way. */
107
- export interface SidebarSpaceSlide {
108
- /** The space switched to. */
109
- spaceId: string;
110
- /** Toward a later space, or an earlier one. */
111
- direction: 'next' | 'prev';
112
- }
113
-
114
- /** Props of {@link SessionSidebar}. */
115
- export interface SessionSidebarProps<S extends SidebarRowSession> {
116
- /** The sessions the list shows (the shown space's filters applied). */
117
- sessions: readonly S[];
118
- /** This machine and the remote hosts (their sections and chips). */
119
- hosts: readonly HostView[];
120
- /** How the rows group. */
121
- groupBy: SidebarGroupBy;
122
- /** How the rows sort inside a group. */
123
- sortBy: SidebarSortBy;
124
- /** The archive axis, for the content search. */
125
- archiveFilter: SessionArchiveFilter;
126
- /** The open session. */
127
- activeSessionId: S['id'] | null;
128
- /** Opens a session (`null`: the new-session surface). */
129
- onActivate: (sessionId: S['id'] | null) => void;
130
- /** The orchestration Main is on: its session is pinned above the groups. Off: it is hidden. */
131
- orchestration: boolean;
132
- /** Spaces are on. */
133
- spacesOn: boolean;
134
- /** The spaces. */
135
- spaces: readonly Space[];
136
- /** The space the list shows (`listSpaceId`). */
137
- listSpaceId: string;
138
- /** The last user switch of space; the list slides when it showed `listSpaceId`. */
139
- spaceSlide: SidebarSpaceSlide | null;
140
- /** Content search. Absent: titles only. */
141
- search?: SessionContentSearch;
142
- /** The rows' live parts (`createSidebarLive`, built once). */
143
- live: SidebarLive;
144
- /** What runs are doing in the trailing slot. Default: true. */
145
- runDetails?: boolean;
146
- /** Artifacts on a second line. Default: true. */
147
- artifactBadges?: boolean;
148
- /** Starts a new session. */
149
- onNewSession: () => void;
150
- /** Starts a new session in a project's folder. */
151
- onNewSessionIn: (path: string) => void;
152
- /**
153
- * Opens a project's home (its name clicked; a server's project too). Present: project names open it and
154
- * their collapse moves to a chevron after their buttons. Absent: names toggle collapse.
155
- */
156
- onOpenProject?: (project: SidebarProjectRef) => void;
157
- /** The project whose home shows: its header wears the active chip. */
158
- openProject?: SidebarProjectRef | null;
159
- /** Starts a new chat with no folder (the Chats name clicked). Present: the Chats collapse moves to a chevron. */
160
- onOpenChats?: () => void;
161
- /** A new chat with no folder shows: the Chats header wears the active chip. */
162
- chatsOpen?: boolean;
163
- /** Renames a session. */
164
- onRename: (sessionId: S['id'], title: string) => Promise<void>;
165
- /** Archives or restores a session. */
166
- onSetArchived: (sessionId: S['id'], archived: boolean) => Promise<void>;
167
- /** Stars or unstars a session. */
168
- onSetFavorite: (sessionId: S['id'], favorite: boolean) => Promise<void>;
169
- /** Deletes a session (ask first: `useConfirmDeleteSession`). */
170
- onDelete: (session: { id: S['id']; title: string; environment?: SessionEnvironmentSummary }) => void;
171
- /** Moves a session to a space. Absent: no move rows. */
172
- onMoveToSpace?: (sessionId: S['id'], spaceId: string) => Promise<unknown>;
173
- /** Moves a session to another environment of its host (`useMoveSession`, `zidane-ui/git`). Absent: no "Move to…". */
174
- onMoveSession?: (sessionId: S['id']) => void;
175
- /** Moves a project to a space. Absent: no move rows on the headers. */
176
- onMoveProjectToSpace?: (project: SidebarProject, spaceId: string) => Promise<unknown>;
177
- /** Archives a project's conversations (`useProjectSessionActions`). */
178
- onArchiveProject: (project: SidebarProject, label: string) => void;
179
- /** Deletes a project's conversations; `onRemoved` unpins it once they are gone. */
180
- onDeleteProject: (project: SidebarProject, label: string, onRemoved: () => void) => void;
181
- /** The keys belong elsewhere now (a modal is open). */
182
- keyboardBlocked?: () => boolean;
183
- /**
184
- * The shown space's query layer (`SessionDirectoryView.query`): the grouping and sort that apply
185
- * (a space's, an extension's, the agents'), the row decorations and the extension items. Absent:
186
- * the built-in grouping and sort, no decorations, no items.
187
- */
188
- query?: SidebarQueryLayer;
189
- /**
190
- * Changes the shown space's view: the empty list's reset turns its filters off with it, when
191
- * filters hid every session (needs `query`). Absent: the empty list offers no reset.
192
- */
193
- onViewChange?: (patch: Partial<SidebarView>) => void;
194
- /** Agent names by id: the agent grouping's headers. Default: the composer host's agent catalog. An agent left out shows its id. */
195
- agentNames?: Readonly<Record<string, string>>;
196
- /**
197
- * Opens an extension item's target. Default: a session opens, a command runs through the extensions
198
- * host with the item's `args`, a panel focuses in the workspace, a screen opens on the modal layer.
199
- * The wire's ids are already full (`SidebarRowWire`): they are used as they are.
200
- */
201
- onOpenItem?: (
202
- open: NonNullable<ExtensionItem<'sidebar-row'>['item']['open']>,
203
- item: ExtensionItem<'sidebar-row'>,
204
- ) => void;
205
- /** Beside the search well: the filter menu. */
206
- filter?: ReactNode;
207
- /** Under the list: the footer strip. */
208
- footer?: ReactNode;
209
- /** The user collapsed the sidebar. */
210
- collapsed: boolean;
211
- /** The width the user wants (px). */
212
- width: number;
213
- /** A resize ended at this width. */
214
- onWidthCommit: (width: number) => void;
215
- /** A drag strip clearing the window's native controls. */
216
- chromeInset?: SidebarChromeInset;
217
- /** Names the aside's landmark (several sidebars on one page each need their own). */
218
- ariaLabel?: string;
219
- /** Extra classes on the aside. */
220
- className?: string;
221
- /** Inline styles on the aside. */
222
- style?: CSSProperties;
223
- }
224
-
225
- /** The list's top and bottom fades (rows dissolve into the search row and the footer, never cut). */
226
- const LIST_MASK = 'linear-gradient(to bottom, transparent, black 8px, black calc(100% - 12px), transparent)';
227
- const LIST_STYLE: CSSProperties = { maskImage: LIST_MASK, WebkitMaskImage: LIST_MASK };
228
- /**
229
- * The `sidebar.top` and `sidebar.bottom` blocks: pinned (the list scrolls, they don't), each at most 30% of the
230
- * sidebar so the list keeps most of it, scrolling on their own past that. An empty one draws nothing.
231
- */
232
- const PINNED_SLOT = 'shrink-0 max-h-[30%] overflow-y-auto px-2 py-1';
233
-
234
- /*
235
- * The spaces list slide: `custom` is the direction (1 = to a later space, -1
236
- * earlier, 0 = cut). The new list travels a quarter of its width; the leaving
237
- * one goes the other way (`popLayout` pulls it out of flow so both share the slot).
238
- */
239
- /** The space list slide's duration (s). */
240
- const SPACE_SLIDE_S = 0.22;
241
-
242
- const SPACE_LIST_VARIANTS: Variants = {
243
- enter: (dir: number) => (dir === 0 ? { x: 0, opacity: 1 } : { x: `${dir * 24}%`, opacity: 0 }),
244
- center: { x: 0, opacity: 1 },
245
- leave: (dir: number) =>
246
- dir === 0 ? { opacity: 0, transition: { duration: 0 } } : { x: `${dir * -24}%`, opacity: 0 },
247
- };
248
-
249
- /**
250
- * One space's list. While it slides out it is inert, hidden from assistive tech and marked `data-leaving`:
251
- * the incoming list (which may hold the same rows) is the only one to act on.
252
- */
253
- const SpaceList = forwardRef<HTMLUListElement, HTMLMotionProps<'ul'>>(function SpaceList(props, ref) {
254
- const leaving = !useIsPresent();
255
- return (
256
- <m.ul
257
- ref={ref}
258
- {...props}
259
- {...(leaving ? { inert: true, 'aria-hidden': true, 'data-leaving': '' } : { 'data-live-list': '' })}
260
- />
261
- );
262
- });
263
-
264
- /** Props of {@link NewSessionButton}. */
265
- export interface NewSessionButtonProps {
266
- /** Starts a new session. */
267
- onNewSession: () => void;
268
- /** No session is open: the button is the current selection (the raised chip). */
269
- isActive: boolean;
270
- /** Extra classes on the wrapper. */
271
- className?: string;
272
- /** Inline styles on the wrapper. */
273
- style?: CSSProperties;
274
- }
275
-
276
- /**
277
- * The New session row: the same grid as a session row (an 18px glyph column, `text-sm`), raised while no
278
- * session is open, its ⌘N hint fading in on hover or focus.
279
- *
280
- * @param props - What it starts, whether it is the current selection, `className` and `style`.
281
- */
282
- export function NewSessionButton({ onNewSession, isActive, className = '', style }: NewSessionButtonProps) {
283
- const labels = useSidebarLabels();
284
- return (
285
- <div className={`shrink-0${className ? ` ${className}` : ''}`} style={style}>
286
- <button
287
- type="button"
288
- onClick={onNewSession}
289
- title={labels.newSessionTitle}
290
- data-active={isActive ? 'true' : undefined}
291
- // pl-1 + the band's px-2 puts the 18px glyph slot at x=12 and the label
292
- // at x=36: the same columns as the session rows.
293
- className="zg-press-subtle group w-full inline-flex items-center gap-1.5 pl-1 pr-2 py-1 rounded-zg-md bg-transparent hover:before:bg-[var(--zg-row-hover)] data-[active=true]:before:bg-[var(--zg-raised)] data-[active=true]:hover:before:bg-[var(--zg-raised)] data-[active=true]:before:[box-shadow:var(--zg-shadow-raised)] text-[var(--zg-text)] cursor-pointer border-0 transition-[background-color,box-shadow] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--zg-ring)]"
294
- >
295
- <span aria-hidden className="inline-flex items-center justify-center w-[18px] shrink-0">
296
- <span className="i-ph-plus text-sm text-[var(--zg-text-muted)] group-data-[active=true]:text-[var(--zg-text)]" />
297
- </span>
298
- <span className="text-sm text-[var(--zg-text-muted)] group-data-[active=true]:text-[var(--zg-text)]">
299
- {labels.newSession}
300
- </span>
301
- <span className="flex-1" />
302
- <KeyHint
303
- spec="cmd+n"
304
- className="opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100 transition-opacity"
305
- />
306
- </button>
307
- </div>
308
- );
309
- }
310
-
311
- const messageOf = (err: unknown): string => (err as Error)?.message ?? String(err);
312
-
313
- const NO_ITEMS: readonly ExtensionItem<'sidebar-row'>[] = [];
314
-
315
- const NO_DECORATIONS: readonly ExtensionItem<'sidebar-decoration'>[] = [];
316
-
317
- /**
318
- * Renders the session sidebar.
319
- *
320
- * @param props - The directory's view, the app's actions, the live row parts, the footer and the frame.
321
- */
322
- export function SessionSidebar<S extends SidebarRowSession>(props: SessionSidebarProps<S>) {
323
- const {
324
- sessions: allSessions,
325
- hosts,
326
- groupBy,
327
- sortBy,
328
- archiveFilter,
329
- activeSessionId,
330
- onActivate,
331
- orchestration,
332
- spacesOn,
333
- spaces,
334
- listSpaceId,
335
- spaceSlide: lastSpaceSwitch,
336
- search,
337
- live,
338
- runDetails = true,
339
- artifactBadges = true,
340
- onNewSession,
341
- onNewSessionIn: newSessionIn,
342
- onOpenProject,
343
- openProject,
344
- onOpenChats,
345
- chatsOpen = false,
346
- onRename,
347
- onSetArchived,
348
- onSetFavorite,
349
- onDelete,
350
- onMoveToSpace,
351
- onMoveSession,
352
- onMoveProjectToSpace,
353
- onArchiveProject,
354
- onDeleteProject: deleteProject,
355
- keyboardBlocked,
356
- query,
357
- onViewChange,
358
- agentNames: agentNamesProp,
359
- onOpenItem,
360
- filter,
361
- footer,
362
- collapsed,
363
- width,
364
- onWidthCommit,
365
- chromeInset,
366
- ariaLabel,
367
- className,
368
- style,
369
- } = props;
370
- type K = S['id'];
371
- const labels = useSidebarLabels();
372
- const notify = useSidebarNotice();
373
- const environment = useEnvironmentCommands();
374
-
375
- /*
376
- * The slide of the user switch that showed this space (switcher, keys,
377
- * palette); anything else cuts. Keyed on the list's space, so the list swaps
378
- * and slides with the rows it was keyed for.
379
- */
380
- const slideDirection = lastSpaceSwitch?.spaceId === listSpaceId ? lastSpaceSwitch.direction : null;
381
- const slideOffset = slideDirection === 'next' ? 1 : slideDirection === 'prev' ? -1 : 0;
382
- /*
383
- * The list's identity: it changes only when the user switched spaces, so only
384
- * that slides (old list out, new in). Following the open chat, turning Spaces
385
- * off, filters: the same list re-renders, nothing doubles.
386
- */
387
- const lastSlideKey = useRef('list');
388
- // eslint-disable-next-line react-hooks/refs -- the key holds across renders until the next user switch
389
- if (spacesOn && lastSpaceSwitch?.spaceId === listSpaceId) lastSlideKey.current = lastSpaceSwitch.spaceId;
390
- // eslint-disable-next-line react-hooks/refs -- read with the switch above, in the same render
391
- const listKey = lastSlideKey.current;
392
- // The lists move on `slide`; their opacity fades (`withFade`), never on the spring.
393
- // Shorter than `slide`: the new space's rows read as soon as the switcher answers.
394
- const slideTransition = useWithFade('slide', SPACE_SLIDE_S);
395
-
396
- /*
397
- * The orchestration Main is HIDDEN while the feature is off: showing it as an
398
- * ordinary chat while nothing can serve it would invite the user into a
399
- * session whose whole purpose is switched off. Applied once, at the source,
400
- * so the groups, the search results and the pin all see the same list.
401
- */
402
- const sessions = useMemo(
403
- () => (orchestration ? allSessions : allSessions.filter((s) => s.isMain !== true)),
404
- [allSessions, orchestration],
405
- );
406
-
407
- const { searchQuery, setSearchQuery, trimmedQuery, searchMode, searching, titleMatches, contentMatches } =
408
- useSessionSearch(sessions, archiveFilter, search);
409
-
410
- const [renamingId, setRenamingId] = useState<K | null>(null);
411
- const [renameValue, setRenameValue] = useState('');
412
- const [menuForId, setMenuForId] = useState<K | null>(null);
413
-
414
- /**
415
- * Collapsed group headers. Re-grouping produces fresh ids, so stale entries no longer match and the new
416
- * buckets start expanded. Not persisted: collapse is a transient view tweak.
417
- */
418
- const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(() => new Set());
419
- const toggleGroup = useCallback((id: string) => {
420
- setCollapsedGroups((current) => {
421
- const next = new Set(current);
422
- if (next.has(id)) next.delete(id);
423
- else next.add(id);
424
- return next;
425
- });
426
- }, []);
427
-
428
- /** Groups whose "Show more" row was clicked: they render past the per-project cap. */
429
- const [showMoreExpanded, setShowMoreExpanded] = useState<Set<string>>(() => new Set());
430
- const expandGroup = useCallback((id: string) => {
431
- setShowMoreExpanded((current) => new Set(current).add(id));
432
- }, []);
433
-
434
- const { icons: projectIcons, setIcon: setProjectIcon } = useProjectIcons();
435
- /** The listed space's projects pinned at the top of the project grouping, in pin order. */
436
- const { pinned: pinnedProjects, setPinned: setProjectPinned } = usePinnedProjects(listSpaceId);
437
-
438
- /** The pinned Main renders once, above every group, instead of also in its own bucket. */
439
- const { main: mainSession, rest: groupableSessions } = useMemo(
440
- () => partitionMainSession(sessions, orchestration),
441
- [sessions, orchestration],
442
- );
443
-
444
- const catalogNames = useAgentNames();
445
- const agentNames = agentNamesProp ?? catalogNames;
446
- /** The grouping that applies: the query layer's, else the view's ('agent' as a query grouping). */
447
- const grouping = useMemo<SidebarGrouping>(
448
- () =>
449
- query?.grouping ??
450
- (groupBy === 'agent'
451
- ? { kind: 'query', groupBy: AGENT_GROUPING, source: 'agent' }
452
- : { kind: 'builtin', groupBy }),
453
- [query?.grouping, groupBy],
454
- );
455
- /** The grouping the headers and chips read: a query grouping's groups are no folders. */
456
- const listGroupBy = grouping.kind === 'builtin' ? grouping.groupBy : 'none';
457
- /** The view narrows the space's sessions: an empty list then says so, not "no chats yet". */
458
- const filtersOn = useMemo(() => (query ? viewFiltersOn(query.view, query.filters) : false), [query]);
459
- const querySort = query?.sort ?? null;
460
-
461
- /** The extension items of this space, each with the sessions its query lists under it (taken out of the list). */
462
- const claimed = useMemo(
463
- () => claimChildSessions(query?.items ?? NO_ITEMS, groupableSessions),
464
- [query?.items, groupableSessions],
465
- );
466
-
467
- /** What decorations put on each row (`null` for every row while no extension decorates, so the rows' memo holds). */
468
- const decorate = useMemo(() => createDecorator<S>(query?.decorations ?? NO_DECORATIONS), [query?.decorations]);
469
- const decorations = useMemo(
470
- () => new Map<string, SidebarRowDecoration | null>(sessions.map((s) => [s.id, decorate(s)])),
471
- [sessions, decorate],
472
- );
473
- const decorationOf = (session: S): SidebarRowDecoration | null => decorations.get(session.id) ?? null;
474
-
475
- /**
476
- * Sorted + grouped rows. Collapse and the per-project cap are applied inside the builder, so arrow-key nav
477
- * (which walks the session rows) can never land on a hidden row.
478
- */
479
- const rows = useMemo<SidebarListRow<S>[]>(() => {
480
- const rest = claimed.rest;
481
- const sorted = querySort
482
- ? (sortRows(rest as unknown as readonly (S & SessionQueryRow)[], querySort) as unknown as S[])
483
- : null;
484
- if (grouping.kind === 'query') {
485
- return buildQuerySidebarRows(
486
- sorted ?? rest.slice().sort((a, b) => compareSessions(a, b, sortBy)),
487
- grouping.groupBy,
488
- {
489
- collapsedGroups,
490
- ...(grouping.source === 'agent' ? { labels: agentNames } : {}),
491
- missingLabel: grouping.source === 'agent' ? labels.agentGroupDefault : labels.queryGroupOther,
492
- favoritesLabel: labels.favorites,
493
- isFavorite: (s) => s.favorite === true,
494
- items: claimed.items,
495
- },
496
- );
497
- }
498
- const order = sorted ? new Map(sorted.map((s, i) => [s.id, i])) : null;
499
- return [
500
- ...claimed.items.flatMap((item) => itemRows(item, collapsedGroups)),
501
- ...buildHostSidebarRows(rest, hosts, grouping.groupBy, sortBy, {
502
- collapsedGroups,
503
- showMoreExpanded,
504
- pinnedProjects,
505
- ...(order ? { compare: (a, b) => (order.get(a.id) ?? 0) - (order.get(b.id) ?? 0) } : {}),
506
- }),
507
- ];
508
- }, [
509
- claimed,
510
- querySort,
511
- grouping,
512
- hosts,
513
- sortBy,
514
- collapsedGroups,
515
- showMoreExpanded,
516
- pinnedProjects,
517
- agentNames,
518
- labels,
519
- ]);
520
- /** The rows as the list draws them: each header with the rows under it, a section whose header sticks. */
521
- const sections = useMemo(() => nestSidebarRows(rows), [rows]);
522
- const hostById = useMemo(() => new Map(hosts.map((h) => [h.id, h])), [hosts]);
523
-
524
- /** This machine's project folders with a listed conversation not archived yet. */
525
- /* Local folders, and repositories (`repoKey`) with sessions on servers, that still list an open session. */
526
- const archivableProjects = useMemo(() => {
527
- const folders = new Set<string>();
528
- const repos = new Set<string>();
529
- for (const s of groupableSessions) {
530
- if (s.archived) continue;
531
- if (!s.hostId) folders.add((s.projectRoot || s.cwd).replace(/\/+$/, '') || '/');
532
- else if (s.repoKey) repos.add(s.repoKey);
533
- }
534
- return { folders, repos };
535
- }, [groupableSessions]);
536
-
537
- /* A favorite has left its project group: its row names the project, with the group's icon. One object per session, so the rows' memo holds. */
538
- const favoriteProjects = useMemo(() => {
539
- const out = new Map<K, RowProject>();
540
- for (const row of rows) {
541
- if (row.kind !== 'session' || !row.favorites) continue;
542
- const path = (row.session.projectRoot || row.session.cwd).replace(/\/+$/, '');
543
- if (!path) continue;
544
- out.set(row.session.id, {
545
- label: basename(path) || path,
546
- path,
547
- isGitRepo: row.session.isGitRepo === true,
548
- ...(row.session.hostId ? {} : projectIcons[path] ? { icon: projectIcons[path] } : {}),
549
- });
550
- }
551
- return out;
552
- }, [rows, projectIcons]);
553
-
554
- const listRef = useRef<HTMLUListElement | null>(null);
555
- /* During a space slide two lists exist: the leaving one unmounts AFTER the new one mounted, and must not null the ref the new one just set. */
556
- const setListRef = useCallback((node: HTMLUListElement | null) => {
557
- if (node) listRef.current = node;
558
- else if (listRef.current && !listRef.current.isConnected) listRef.current = null;
559
- }, []);
560
-
561
- /*
562
- * Focus in the sidebar stays there across a space switch, so ⌥⌘←/→ and ↑/↓ keep working from it.
563
- * The leaving list turns inert, so a row focused there drops focus to the page: it lands on the
564
- * new list's open row, else its first, else the list itself, after the switch has painted
565
- * (`focus()` lays the page out, which in the switch's frame would cost the whole new conversation's
566
- * layout twice). Until the user acts, the reopened conversation's tools mounting can't take it
567
- * (`holdFocusIn`).
568
- */
569
- const listBox = useRef<HTMLDivElement>(null);
570
- const releaseFocus = useRef<(() => void) | null>(null);
571
- useLayoutEffect(() => {
572
- const box = listBox.current;
573
- // Not `listRef`: the new list's ref lands after this effect (the presence wrapper attaches it).
574
- const list = box?.querySelector<HTMLElement>('[data-live-list]');
575
- const sidebar = box?.closest('aside');
576
- const focused = document.activeElement;
577
- if (!box || !list || !sidebar || !(focused instanceof HTMLElement) || !sidebar.contains(focused)) return undefined;
578
- const moving = box.contains(focused) && !list.contains(focused);
579
- const home = moving
580
- ? (list.querySelector<HTMLElement>('[data-active="true"] [data-row-select]') ??
581
- list.querySelector<HTMLElement>('[data-row-select]') ??
582
- list)
583
- : focused;
584
- releaseFocus.current?.();
585
- releaseFocus.current = holdFocusIn(sidebar, () => (home.isConnected ? home : list));
586
- if (!moving) return undefined;
587
- let timer = 0;
588
- const frame = requestAnimationFrame(() => {
589
- timer = window.setTimeout(() => {
590
- // Still where the switch left it (the page, or the leaving list): the user hasn't moved it.
591
- const now = document.activeElement;
592
- if (!now || now === document.body || now === focused || now.closest('[inert]')) {
593
- home.focus({ preventScroll: true });
594
- }
595
- }, 0);
596
- });
597
- return () => {
598
- cancelAnimationFrame(frame);
599
- clearTimeout(timer);
600
- };
601
- }, [listKey]);
602
- useEffect(() => () => releaseFocus.current?.(), []);
603
-
604
- /** Arrow-nav walks the order the user sees on screen. */
605
- const displaySessions = useMemo<S[]>(() => {
606
- if (searchMode) return [...titleMatches, ...contentMatches.map((m) => m.session)];
607
- return rows
608
- .filter((row): row is Extract<SidebarListRow<S>, { kind: 'session' }> => row.kind === 'session')
609
- .map((r) => r.session);
610
- }, [rows, searchMode, titleMatches, contentMatches]);
611
-
612
- const { commitImmediate } = useSidebarKeyboardNav<K>({
613
- listRef,
614
- sessions: displaySessions,
615
- activeSessionId,
616
- onActivate,
617
- onNewSession,
618
- ...(keyboardBlocked ? { blocked: keyboardBlocked } : {}),
619
- });
620
-
621
- /* Row callbacks keep a stable identity so the rows' memo short-circuits: the row passes its own id. */
622
- const onRowSelect = useCallback(
623
- (sessionId: string) => {
624
- if (renamingId === sessionId) return;
625
- commitImmediate(sessionId as K);
626
- },
627
- [renamingId, commitImmediate],
628
- );
629
-
630
- const onRowStartRename = useCallback((sessionId: string, currentTitle: string) => {
631
- setMenuForId(null);
632
- setRenamingId(sessionId as K);
633
- setRenameValue(currentTitle);
634
- }, []);
635
-
636
- const onRowSetArchived = useCallback(
637
- (sessionId: string, archived: boolean) => {
638
- void onSetArchived(sessionId as K, archived);
639
- },
640
- [onSetArchived],
641
- );
642
-
643
- const onRowSetFavorite = useCallback(
644
- (sessionId: string, favorite: boolean) => {
645
- onSetFavorite(sessionId as K, favorite).catch((err) => console.error('[zidane-ui] favorite failed', err));
646
- },
647
- [onSetFavorite],
648
- );
649
-
650
- const onRowDelete = useCallback(
651
- (sessionId: string, title: string, env?: SessionEnvironmentSummary) => {
652
- onDelete({ id: sessionId as K, title, ...(env ? { environment: env } : {}) });
653
- },
654
- [onDelete],
655
- );
656
-
657
- const onRowMoveToSpace = useCallback(
658
- (sessionId: string, spaceId: string) => {
659
- onMoveToSpace?.(sessionId as K, spaceId).catch((err: unknown) =>
660
- notify(labels.moveSessionFailed(messageOf(err))),
661
- );
662
- },
663
- [onMoveToSpace, notify, labels],
664
- );
665
-
666
- const onRowMoveProjectToSpace = useCallback(
667
- (project: SidebarProject, spaceId: string) => {
668
- onMoveProjectToSpace?.(project, spaceId).catch((err: unknown) =>
669
- notify(labels.moveProjectFailed(messageOf(err))),
670
- );
671
- },
672
- [onMoveProjectToSpace, notify, labels],
673
- );
674
-
675
- const onDeleteProject = useCallback(
676
- (project: SidebarProject, label: string) =>
677
- deleteProject(project, label, () => setProjectPinned(project.path, false)),
678
- [deleteProject, setProjectPinned],
679
- );
680
-
681
- /* Extension items: their targets and actions, through the extensions host and the workspace when the app has them. */
682
- const extensions = useExtensionsHost();
683
- const runCommand = extensions?.commands?.run;
684
- const workspace = useOptionalWorkspaceActions();
685
- const openScreen = useExtensionScreen();
686
- const onOpenItemTarget = useCallback(
687
- (entry: ExtensionItem<'sidebar-row'>) => {
688
- const open = entry.item.open;
689
- if (!open) return;
690
- if (onOpenItem) return onOpenItem(open, entry);
691
- if ('session' in open) commitImmediate(open.session as K);
692
- else if ('command' in open) {
693
- runCommand?.(open.command, { args: entry.item.args }).catch((err: unknown) =>
694
- notify(labels.itemOpenFailed(messageOf(err))),
695
- );
696
- } else if ('panel' in open) workspace?.focusTab(open.panel);
697
- else openScreen(open.screen);
698
- },
699
- [onOpenItem, commitImmediate, runCommand, notify, labels, workspace, openScreen],
700
- );
701
- const onRunItemAction = useCallback(
702
- (entry: ExtensionItem<'sidebar-row'>, action: SidebarRowActionWire) => {
703
- if (!action.command || !runCommand) return;
704
- runCommand(action.command, { args: entry.item.args }).catch((err: unknown) =>
705
- notify(labels.itemOpenFailed(messageOf(err))),
706
- );
707
- },
708
- [runCommand, notify, labels],
709
- );
710
-
711
- const onRowOpenMenu = useCallback((sessionId: string) => setMenuForId(sessionId as K), []);
712
- const onRowCloseMenu = useCallback((sessionId: string) => {
713
- setMenuForId((current) => (current === sessionId ? null : current));
714
- }, []);
715
-
716
- const onRenameCommitRef = useRef<{ id: K | null; value: string }>({ id: null, value: '' });
717
- // eslint-disable-next-line react-hooks/refs -- the commit keeps its identity (the rows' memo) and reads the field
718
- onRenameCommitRef.current = { id: renamingId, value: renameValue };
719
-
720
- const onRowRenameCommit = useCallback(async () => {
721
- const { id, value } = onRenameCommitRef.current;
722
- if (!id) return;
723
- if (value.trim()) await onRename(id, value.trim());
724
- setRenamingId(null);
725
- }, [onRename]);
726
-
727
- const onRowRenameCancel = useCallback(() => setRenamingId(null), []);
728
-
729
- // What rows say beyond their title; primitives, so the rows' memo holds.
730
- const rowDetails = {
731
- runDetails,
732
- artifactBadges: runDetails && artifactBadges,
733
- spaces: spacesOn ? spaces : null,
734
- };
735
- const spaceList = onMoveToSpace ? rowDetails.spaces : null;
736
-
737
- // One stable bag for every row: identities only change with their deps, so the rows' memo holds.
738
- const rowHandlers = useMemo(
739
- () => ({
740
- onSelect: onRowSelect,
741
- onRenameValueChange: setRenameValue,
742
- onRenameCommit: onRowRenameCommit,
743
- onRenameCancel: onRowRenameCancel,
744
- onStartRename: onRowStartRename,
745
- onDelete: onRowDelete,
746
- onSetArchived: onRowSetArchived,
747
- onSetFavorite: onRowSetFavorite,
748
- onRetryEnvironment: environment.retry,
749
- onRunEnvironmentAction: environment.run,
750
- onMoveToSpace: onRowMoveToSpace,
751
- ...(onMoveSession ? { onMoveSession: onMoveSession as (sessionId: string) => void } : {}),
752
- onOpenMenu: onRowOpenMenu,
753
- onCloseMenu: onRowCloseMenu,
754
- live,
755
- }),
756
- [
757
- onRowSelect,
758
- onRowRenameCommit,
759
- onRowRenameCancel,
760
- onRowStartRename,
761
- onRowDelete,
762
- onRowSetArchived,
763
- onRowSetFavorite,
764
- environment,
765
- onRowMoveToSpace,
766
- onMoveSession,
767
- onRowOpenMenu,
768
- onRowCloseMenu,
769
- live,
770
- ],
771
- );
772
-
773
- // A row menu left open goes when the open session flips (keyboard navigation).
774
- useEffect(() => {
775
- // eslint-disable-next-line react-hooks/set-state-in-effect -- a switch from anywhere closes the stale menu
776
- setMenuForId(null);
777
- }, [activeSessionId]);
778
-
779
- // A collapsed sidebar is unmounted: an open rename would be orphaned mid-edit.
780
- useEffect(() => {
781
- // eslint-disable-next-line react-hooks/set-state-in-effect -- collapsing drops the orphaned rename
782
- if (collapsed) setRenamingId(null);
783
- }, [collapsed]);
784
-
785
- // Same draft as "New session", with this project's folder.
786
- const onNewSessionIn = useCallback((fullPath: string) => newSessionIn(fullPath), [newSessionIn]);
787
-
788
- const handleNewSession = useCallback(() => {
789
- commitImmediate(null);
790
- onNewSession();
791
- }, [commitImmediate, onNewSession]);
792
-
793
- const frame = useSidebarFrame({ collapsed, width, onWidthCommit });
794
- // Rows always render their expanded form while mounted: the aside is a sliding sheet at full width.
795
- if (!frame.mounted) return null;
796
-
797
- // Collapse and the per-group caps are already applied in the builder: each row maps 1:1.
798
- // `serverOfGroup`: the server the enclosing group header names (its rows need no chip of their own).
799
- const renderNode = (node: SidebarNode<S>, serverOfGroup?: string): ReactNode => {
800
- if (node.kind === 'section') {
801
- const { header } = node;
802
- return (
803
- <li key={node.id} className={header.kind === 'host' ? 'zg-host-section' : undefined}>
804
- <ul className="list-none m-0 p-0">
805
- {header.kind === 'host' ? (
806
- <SessionHostHeader
807
- id={header.id}
808
- host={header.host}
809
- collapsed={header.collapsed}
810
- onToggle={toggleGroup}
811
- className="zg-sticky-head"
812
- />
813
- ) : (
814
- <SidebarGroupHeader
815
- row={header}
816
- groupBy={listGroupBy}
817
- icon={header.fullPath ? projectIcons[header.fullPath] : undefined}
818
- onAssignIcon={setProjectIcon}
819
- onToggle={toggleGroup}
820
- onNewSessionIn={onNewSessionIn}
821
- spaces={onMoveProjectToSpace ? rowDetails.spaces : null}
822
- spaceId={listSpaceId}
823
- onMoveProject={onRowMoveProjectToSpace}
824
- pinned={header.pinned === true}
825
- onSetPinned={setProjectPinned}
826
- canArchive={
827
- (header.fullPath !== undefined && archivableProjects.folders.has(header.fullPath)) ||
828
- (header.repoKey !== undefined && archivableProjects.repos.has(header.repoKey))
829
- }
830
- onArchiveProject={onArchiveProject}
831
- onDeleteProject={onDeleteProject}
832
- {...(header.hostId && hostById.get(header.hostId) ? { server: hostById.get(header.hostId)! } : {})}
833
- {...(onOpenProject
834
- ? {
835
- onOpenProject,
836
- open:
837
- activeSessionId == null &&
838
- openProject != null &&
839
- openProject.path === header.fullPath &&
840
- openProject.hostId === header.hostId,
841
- }
842
- : {})}
843
- {...(onOpenChats && header.chats ? { onOpenChats, open: activeSessionId == null && chatsOpen } : {})}
844
- />
845
- )}
846
- {node.children.map((child) => renderNode(child, header.kind === 'host' ? header.host.id : header.hostId))}
847
- </ul>
848
- </li>
849
- );
850
- }
851
-
852
- if (node.kind === 'showMore') {
853
- return <ShowMoreRow key={node.id} hiddenCount={node.hiddenCount} onExpand={() => expandGroup(node.groupId)} />;
854
- }
855
-
856
- if (node.kind === 'item') {
857
- return (
858
- <SidebarRowView
859
- key={node.id}
860
- rowId={node.id}
861
- entry={node.row.entry}
862
- collapsed={node.row.collapsed}
863
- childCount={node.row.childCount}
864
- onOpen={onOpenItemTarget}
865
- {...(runCommand ? { onRunAction: onRunItemAction } : {})}
866
- onToggle={toggleGroup}
867
- >
868
- {node.children.map((child) => renderNode(child, serverOfGroup))}
869
- </SidebarRowView>
870
- );
871
- }
872
-
873
- const session = node.session;
874
- const isRenaming = session.id === renamingId;
875
- return (
876
- <SidebarSessionRow
877
- key={session.id}
878
- sessionId={session.id}
879
- title={session.title}
880
- cwd={session.cwd}
881
- hostId={session.hostId}
882
- // A folder or host header above already names the server (not in Favorites). A repository's group
883
- // lists sessions from several machines: each server session names its own.
884
- hostBadge={node.favorites === true || !groupsByFolder(listGroupBy) || session.hostId !== serverOfGroup}
885
- spaceId={session.spaceId}
886
- isMain={session.isMain}
887
- updatedAt={session.updatedAt}
888
- isActive={session.id === activeSessionId}
889
- isRenaming={isRenaming}
890
- archived={session.archived === true}
891
- favorite={session.favorite}
892
- renameValue={isRenaming ? renameValue : ''}
893
- menuOpen={menuForId === session.id}
894
- {...rowHandlers}
895
- {...rowDetails}
896
- spaces={spaceList}
897
- environment={session.environment}
898
- project={favoriteProjects.get(session.id)}
899
- decoration={decorationOf(session)}
900
- />
901
- );
902
- };
903
-
904
- /** The pinned blocks show the open session's items with the unscoped ones. */
905
- const slotScope = activeSessionId != null ? { sessionId: activeSessionId } : {};
906
-
907
- const searchRow = (session: S, excerpt?: string) => (
908
- <SidebarSessionRow
909
- key={session.id}
910
- sessionId={session.id}
911
- title={session.title}
912
- cwd={session.cwd}
913
- hostId={session.hostId}
914
- spaceId={session.spaceId}
915
- isMain={session.isMain}
916
- isActive={session.id === activeSessionId}
917
- isRenaming={session.id === renamingId}
918
- archived={session.archived === true}
919
- favorite={session.favorite}
920
- renameValue={session.id === renamingId ? renameValue : ''}
921
- menuOpen={menuForId === session.id}
922
- {...rowHandlers}
923
- {...rowDetails}
924
- spaces={spaceList}
925
- environment={session.environment}
926
- decoration={decorationOf(session)}
927
- {...(excerpt !== undefined ? { excerpt, excerptQuery: trimmedQuery } : {})}
928
- />
929
- );
930
-
931
- return (
932
- <SidebarFrame
933
- frame={frame}
934
- {...(chromeInset ? { chromeInset } : {})}
935
- {...(ariaLabel ? { ariaLabel } : {})}
936
- {...(className ? { className } : {})}
937
- {...(style ? { style } : {})}
938
- >
939
- {/*
940
- * Top band. ONE vertical rhythm for everything above the list: every item
941
- * is a row on the same grid as the session rows, and the band spaces them
942
- * with the same 4px the list uses between rows. Order is by reach: the
943
- * Main session, New session, then the search right on top of the list.
944
- */}
945
- <div className="shrink-0 flex flex-col gap-1 px-2 pt-1">
946
- {!searchMode && mainSession && (
947
- <ul className="list-none m-0 p-0">
948
- <MainSessionRow
949
- sessionId={mainSession.id}
950
- isActive={mainSession.id === activeSessionId}
951
- icon={projectIcons[MAIN_SESSION_ICON_KEY]}
952
- onAssignIcon={setProjectIcon}
953
- onSelect={onRowSelect}
954
- />
955
- </ul>
956
- )}
957
- {/* A highlighted header (a project home, Chats) is the selection then: the row stays flat. */}
958
- <NewSessionButton
959
- onNewSession={handleNewSession}
960
- isActive={activeSessionId == null && openProject == null && !chatsOpen}
961
- />
962
- <SidebarSearchRow value={searchQuery} onChange={setSearchQuery} filter={filter} />
963
- </div>
964
- <ExtensionSlot at="sidebar.top" {...slotScope} className={PINNED_SLOT} />
965
-
966
- {/*
967
- * The list is the ONLY flexible child (`flex-1 min-h-0`): it absorbs all
968
- * height pressure by scrolling, so nothing pushes past the footer. Its
969
- * edges fade (`LIST_MASK`): a stuck header pushed out dissolves below the
970
- * search row, and a part-scrolled row into the footer; `pb-3` keeps a
971
- * fully scrolled last row out of the 12px fade.
972
- *
973
- * One list per space: the leaving list slides out one way while the new
974
- * one slides in from the other, on the `slide` spring. The key moves only
975
- * on a user switch (`listKey`).
976
- */}
977
- <div ref={listBox} className="relative flex-1 min-h-0 overflow-hidden flex flex-col">
978
- <LazyMotion features={domAnimation}>
979
- <AnimatePresence initial={false} custom={slideOffset} mode="popLayout">
980
- <SpaceList
981
- key={listKey}
982
- ref={setListRef}
983
- custom={slideOffset}
984
- variants={SPACE_LIST_VARIANTS}
985
- initial="enter"
986
- animate="center"
987
- exit="leave"
988
- transition={slideTransition}
989
- data-space={spacesOn ? listSpaceId : undefined}
990
- tabIndex={-1}
991
- className="zg-sidebar-list outline-none flex-1 min-h-0 w-full overflow-y-auto px-2 pt-1 pb-3 list-none m-0"
992
- style={LIST_STYLE}
993
- >
994
- {searchMode ? (
995
- <>
996
- {titleMatches.map((session) => searchRow(session))}
997
- {contentMatches.map(({ session, hit }) => searchRow(session, hit.excerpt))}
998
- {searching && (
999
- <li aria-live="polite" className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 select-none">
1000
- {labels.searchingSessions}
1001
- </li>
1002
- )}
1003
- {!searching && titleMatches.length === 0 && contentMatches.length === 0 && (
1004
- <li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 select-none">
1005
- {labels.sidebarNoMatches}
1006
- </li>
1007
- )}
1008
- </>
1009
- ) : (
1010
- sections.map((node) => renderNode(node))
1011
- )}
1012
- {!searchMode &&
1013
- sessions.length === 0 &&
1014
- claimed.items.length === 0 &&
1015
- (filtersOn && query ? (
1016
- <li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1 flex flex-col items-start gap-1">
1017
- <span>{labels.noChatsMatchFilters}</span>
1018
- {onViewChange && (
1019
- <button
1020
- type="button"
1021
- className="p-0 bg-transparent border-0 text-xs text-[var(--zg-text)] hover:underline cursor-pointer"
1022
- onClick={() => onViewChange(clearedViewFilters(query.view))}
1023
- >
1024
- {labels.resetFilters}
1025
- </button>
1026
- )}
1027
- </li>
1028
- ) : (
1029
- <li className="text-xs text-[var(--zg-text-muted)] px-3 pt-1">{labels.noChatsYet}</li>
1030
- ))}
1031
- </SpaceList>
1032
- </AnimatePresence>
1033
- </LazyMotion>
1034
- </div>
1035
- <ExtensionSlot at="sidebar.bottom" {...slotScope} className={PINNED_SLOT} />
1036
- {footer}
1037
- </SidebarFrame>
1038
- );
1039
- }