zidane-ui 9.1.1 → 9.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1074) 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 +11 -10
  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/labels.d.ts +27 -0
  26. package/dist/chat/headless/streams/index.js +1 -1
  27. package/dist/chat/headless/streams/live-events.js +2 -1
  28. package/dist/chat/headless/streams/session-streams.js +2 -2
  29. package/dist/chat/headless/streams/store.js +2 -2
  30. package/dist/chat/headless/transcript/batch.d.ts +21 -1
  31. package/dist/chat/headless/transcript/batch.js +55 -10
  32. package/dist/chat/headless/transcript/collapse.js +18 -3
  33. package/dist/chat/headless/transcript/fold.js +26 -10
  34. package/dist/chat/headless/transcript/index.js +1 -1
  35. package/dist/chat/headless/transcript/rows.d.ts +7 -1
  36. package/dist/chat/index.d.ts +6 -1
  37. package/dist/chat/index.js +7 -2
  38. package/dist/chat/testing/contract.d.ts +6 -1
  39. package/dist/chat/testing/contract.js +30 -3
  40. package/dist/chat/transcript/AnsiText.d.ts +27 -0
  41. package/dist/chat/transcript/AnsiText.js +73 -0
  42. package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
  43. package/dist/chat/transcript/CodemodeScript.js +212 -0
  44. package/dist/chat/transcript/LiveOutput.d.ts +21 -0
  45. package/dist/chat/transcript/LiveOutput.js +42 -0
  46. package/dist/chat/transcript/TranscriptRow.js +19 -2
  47. package/dist/chat/transcript/actions.d.ts +6 -0
  48. package/dist/chat/transcript/index.d.ts +6 -1
  49. package/dist/chat/transcript/index.js +6 -1
  50. package/dist/chat/transcript/markdown.js +9 -0
  51. package/dist/chat/transcript/renderers.d.ts +7 -0
  52. package/dist/chat/transcript/script-input.d.ts +17 -0
  53. package/dist/chat/transcript/script-input.js +16 -0
  54. package/dist/chat/transcript/shell-block-scope.d.ts +29 -0
  55. package/dist/chat/transcript/shell-block-scope.js +18 -0
  56. package/dist/chat/transcript/shell-block.d.ts +27 -0
  57. package/dist/chat/transcript/shell-block.js +306 -0
  58. package/dist/chat/transcript/tool-parts.d.ts +18 -6
  59. package/dist/chat/transcript/tool-parts.js +15 -5
  60. package/dist/chat/transcript/tool-payload.js +6 -3
  61. package/dist/chat/transcript/tool-row.js +155 -96
  62. package/dist/chat/transcript/user-bash.js +3 -2
  63. package/dist/code/HighlightedCode.js +3 -69
  64. package/dist/code/highlight-lines.d.ts +24 -0
  65. package/dist/code/highlight-lines.js +41 -0
  66. package/dist/code/use-highlighted-html.d.ts +5 -0
  67. package/dist/code/use-highlighted-html.js +75 -0
  68. package/dist/core.css +6 -2
  69. package/dist/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +101 -3
  70. package/dist/extensions/ExtensionSettingsSidebar.js +19 -3
  71. package/dist/extensions/kit.d.ts +1 -1
  72. package/dist/git/BranchMenu.d.ts +1 -7
  73. package/dist/git/BranchMenu.js +17 -40
  74. package/dist/git/headless/labels.d.ts +0 -2
  75. package/dist/git/headless/labels.js +0 -2
  76. package/dist/index.d.ts +4 -3
  77. package/dist/index.js +2 -1
  78. package/dist/onboarding/demos/index.js +1 -1
  79. package/dist/onboarding/index.js +5 -5
  80. package/dist/onboarding/steps/ConnectStep.js +1 -1
  81. package/dist/onboarding/steps/ConnectorsStep.js +1 -1
  82. package/dist/onboarding/steps/ExtensionsStep.js +1 -1
  83. package/dist/onboarding/steps/ReadyStep.js +2 -2
  84. package/dist/onboarding/steps/SkillsStep.js +1 -1
  85. package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
  86. package/dist/session/headless/index.js +1 -1
  87. package/dist/settings/SettingsShell.d.ts +3 -1
  88. package/dist/settings/SettingsShell.js +15 -8
  89. package/dist/settings/headless/catalog.js +5 -0
  90. package/dist/settings/headless/layout.js +2 -1
  91. package/dist/settings/headless/registry.d.ts +2 -0
  92. package/dist/settings/headless/search.d.ts +1 -1
  93. package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
  94. package/dist/settings/sections/extensions/ExtensionsSection.js +2 -2
  95. package/dist/settings/sections/models/ModelRows.js +2 -2
  96. package/dist/settings/sections/models/model-test.js +1 -1
  97. package/dist/settings/sections/skills/SkillsSection.js +1 -1
  98. package/dist/styles.css +291 -2
  99. package/dist/terminal/TerminalProvider.d.ts +3 -1
  100. package/dist/terminal/TerminalProvider.js +5 -1
  101. package/dist/terminal/headless/store.d.ts +10 -0
  102. package/dist/terminal/headless/store.js +16 -0
  103. package/dist/terminal/index.d.ts +2 -2
  104. package/dist/terminal/index.js +2 -2
  105. package/dist/theme/runtime-icons.d.ts +50 -0
  106. package/dist/theme/runtime-icons.js +95 -0
  107. package/package.json +3 -6
  108. package/src/styles/primitives.css +5 -2
  109. package/src/styles/transcript.css +281 -0
  110. package/src/adapters/browser-appearance-host.ts +0 -51
  111. package/src/adapters/browser-keybindings-host.ts +0 -48
  112. package/src/adapters/browser-workspace-host.ts +0 -92
  113. package/src/adapters/closable-client.ts +0 -34
  114. package/src/adapters/extension-modules.ts +0 -360
  115. package/src/adapters/index.ts +0 -35
  116. package/src/adapters/live-events.ts +0 -6
  117. package/src/adapters/live.ts +0 -270
  118. package/src/adapters/run-host.ts +0 -238
  119. package/src/adapters/server-approvals-host.ts +0 -102
  120. package/src/adapters/server-client.ts +0 -15
  121. package/src/adapters/server-composer-host.ts +0 -459
  122. package/src/adapters/server-extensions-host.ts +0 -979
  123. package/src/adapters/server-files-host.ts +0 -287
  124. package/src/adapters/server-git-host.ts +0 -289
  125. package/src/adapters/server-host.ts +0 -489
  126. package/src/adapters/server-machines-host.ts +0 -283
  127. package/src/adapters/server-oauth-flow.ts +0 -133
  128. package/src/adapters/server-onboarding-host.ts +0 -363
  129. package/src/adapters/server-palette-host.ts +0 -134
  130. package/src/adapters/server-session-host.ts +0 -241
  131. package/src/adapters/server-settings-accounts.ts +0 -212
  132. package/src/adapters/server-settings-host.ts +0 -120
  133. package/src/adapters/server-settings-models.ts +0 -46
  134. package/src/adapters/server-settings-performance.ts +0 -58
  135. package/src/adapters/server-settings-sections.ts +0 -222
  136. package/src/adapters/server-sidebar-host.ts +0 -59
  137. package/src/adapters/server-terminal-host.ts +0 -124
  138. package/src/adapters/server-transcript-members.ts +0 -131
  139. package/src/adapters/sse-host.ts +0 -264
  140. package/src/adapters/sse-parser.ts +0 -82
  141. package/src/adapters/sse-protocol.ts +0 -118
  142. package/src/adapters/stream-pacer.ts +0 -122
  143. package/src/adapters/worker-host.ts +0 -192
  144. package/src/adapters/worker-protocol.ts +0 -97
  145. package/src/app/AppHostProvider.tsx +0 -135
  146. package/src/app/ModalProvider.tsx +0 -731
  147. package/src/app/headless/app-host.ts +0 -61
  148. package/src/app/headless/index.ts +0 -6
  149. package/src/app/headless/resource.ts +0 -444
  150. package/src/app/index.ts +0 -9
  151. package/src/app/testing/index.ts +0 -90
  152. package/src/app/useConfirm.tsx +0 -65
  153. package/src/app/useResource.ts +0 -30
  154. package/src/appearance/AppearanceProvider.tsx +0 -383
  155. package/src/appearance/apply.ts +0 -69
  156. package/src/appearance/headless/fixture-host.ts +0 -111
  157. package/src/appearance/headless/fonts.ts +0 -224
  158. package/src/appearance/headless/host.ts +0 -65
  159. package/src/appearance/headless/index.ts +0 -12
  160. package/src/appearance/headless/prefs.ts +0 -252
  161. package/src/appearance/headless/storage.ts +0 -127
  162. package/src/appearance/headless/zoom-commands.ts +0 -21
  163. package/src/appearance/index.ts +0 -11
  164. package/src/appearance/testing/contract.ts +0 -210
  165. package/src/appearance/testing/index.ts +0 -6
  166. package/src/approvals/ApprovalBar.tsx +0 -234
  167. package/src/approvals/ApprovalConcern.tsx +0 -33
  168. package/src/approvals/ApprovalShell.tsx +0 -69
  169. package/src/approvals/ApprovalsProvider.tsx +0 -110
  170. package/src/approvals/FileEditApproval.tsx +0 -310
  171. package/src/approvals/HunkPreviews.tsx +0 -225
  172. package/src/approvals/SafelistPanel.tsx +0 -149
  173. package/src/approvals/headless/fixture-host.ts +0 -73
  174. package/src/approvals/headless/fixtures.ts +0 -86
  175. package/src/approvals/headless/heads.ts +0 -81
  176. package/src/approvals/headless/host.ts +0 -80
  177. package/src/approvals/headless/index.ts +0 -12
  178. package/src/approvals/headless/labels.ts +0 -67
  179. package/src/approvals/headless/pending.ts +0 -91
  180. package/src/approvals/headless/preview.ts +0 -94
  181. package/src/approvals/headless/safelist.ts +0 -63
  182. package/src/approvals/index.ts +0 -13
  183. package/src/approvals/key-scope.ts +0 -33
  184. package/src/approvals/testing/contract.ts +0 -230
  185. package/src/approvals/testing/index.ts +0 -7
  186. package/src/brands/marks.ts +0 -298
  187. package/src/chat/ChatProvider.tsx +0 -60
  188. package/src/chat/DaemonOrb.tsx +0 -107
  189. package/src/chat/HostBadge.tsx +0 -71
  190. package/src/chat/HostStatusDot.tsx +0 -53
  191. package/src/chat/HostTranscript.tsx +0 -101
  192. package/src/chat/PdfPreview.tsx +0 -65
  193. package/src/chat/RunEstimateChip.tsx +0 -168
  194. package/src/chat/SessionFilterMenu.tsx +0 -397
  195. package/src/chat/SessionGroupHeader.tsx +0 -177
  196. package/src/chat/SessionHostHeader.tsx +0 -66
  197. package/src/chat/SessionList.tsx +0 -413
  198. package/src/chat/SessionListRow.tsx +0 -296
  199. package/src/chat/SessionStreamsProvider.tsx +0 -253
  200. package/src/chat/StatusDot.tsx +0 -128
  201. package/src/chat/TextPreview.tsx +0 -121
  202. package/src/chat/Throbber.tsx +0 -270
  203. package/src/chat/Transcript.tsx +0 -523
  204. package/src/chat/composer/AgentPicker.tsx +0 -155
  205. package/src/chat/composer/AgentPickerDialog.tsx +0 -99
  206. package/src/chat/composer/ApprovalDock.tsx +0 -64
  207. package/src/chat/composer/ArchivedBanner.tsx +0 -44
  208. package/src/chat/composer/AttachmentTiles.tsx +0 -211
  209. package/src/chat/composer/Composer.tsx +0 -500
  210. package/src/chat/composer/ComposerBadges.tsx +0 -339
  211. package/src/chat/composer/ComposerControls.tsx +0 -243
  212. package/src/chat/composer/ComposerEditor.tsx +0 -101
  213. package/src/chat/composer/ComposerHostProvider.tsx +0 -46
  214. package/src/chat/composer/ComposerShell.tsx +0 -129
  215. package/src/chat/composer/ContextBreakdown.tsx +0 -382
  216. package/src/chat/composer/ContextOrb.tsx +0 -176
  217. package/src/chat/composer/ConversationBadges.tsx +0 -168
  218. package/src/chat/composer/DockCard.tsx +0 -126
  219. package/src/chat/composer/EffortPickerDialog.tsx +0 -184
  220. package/src/chat/composer/HostComposer.tsx +0 -135
  221. package/src/chat/composer/HostContextOrb.tsx +0 -94
  222. package/src/chat/composer/HostModelChainList.tsx +0 -102
  223. package/src/chat/composer/HostPicker.tsx +0 -97
  224. package/src/chat/composer/HostPickers.tsx +0 -320
  225. package/src/chat/composer/ImageModelList.tsx +0 -151
  226. package/src/chat/composer/ModelChainList.tsx +0 -442
  227. package/src/chat/composer/ModelChainParts.tsx +0 -247
  228. package/src/chat/composer/ModelChainRow.tsx +0 -191
  229. package/src/chat/composer/ModelChainRows.tsx +0 -223
  230. package/src/chat/composer/ModelChainTooltip.tsx +0 -121
  231. package/src/chat/composer/ModelFacts.tsx +0 -204
  232. package/src/chat/composer/ModelOptionsPicker.tsx +0 -257
  233. package/src/chat/composer/ModelPicker.tsx +0 -513
  234. package/src/chat/composer/ModelPickerDialog.tsx +0 -99
  235. package/src/chat/composer/ModelProviderPills.tsx +0 -141
  236. package/src/chat/composer/PickerPill.tsx +0 -41
  237. package/src/chat/composer/ProjectMenu.tsx +0 -187
  238. package/src/chat/composer/PromptHistoryProvider.tsx +0 -214
  239. package/src/chat/composer/RetryPill.tsx +0 -47
  240. package/src/chat/composer/RunStatusChip.tsx +0 -150
  241. package/src/chat/composer/ScopeToggle.tsx +0 -94
  242. package/src/chat/composer/SelectTurnHint.tsx +0 -40
  243. package/src/chat/composer/SendButton.tsx +0 -89
  244. package/src/chat/composer/ServerScopeToggle.tsx +0 -188
  245. package/src/chat/composer/attachment-ingest.ts +0 -413
  246. package/src/chat/composer/attachments.tsx +0 -176
  247. package/src/chat/composer/badge-order.ts +0 -65
  248. package/src/chat/composer/composer-bus.ts +0 -317
  249. package/src/chat/composer/index.ts +0 -63
  250. package/src/chat/composer/load-composer-editor.ts +0 -25
  251. package/src/chat/composer/model-catalog.ts +0 -424
  252. package/src/chat/composer/model-list-layout.ts +0 -118
  253. package/src/chat/composer/prompt-history-nav.ts +0 -60
  254. package/src/chat/composer/scope-side.ts +0 -7
  255. package/src/chat/composer/suggestion-extension.ts +0 -113
  256. package/src/chat/composer/suggestions.tsx +0 -115
  257. package/src/chat/composer/use-agent-profiles.ts +0 -97
  258. package/src/chat/composer/use-cache-hints.ts +0 -93
  259. package/src/chat/composer/use-composer-stores.ts +0 -140
  260. package/src/chat/composer/use-draft-target.ts +0 -317
  261. package/src/chat/composer/use-new-session-defaults.ts +0 -201
  262. package/src/chat/composer/use-provider-ready-poll.ts +0 -35
  263. package/src/chat/composer/use-run-meter.ts +0 -140
  264. package/src/chat/composer/use-send-prompt.ts +0 -188
  265. package/src/chat/composer/use-session-meters.ts +0 -109
  266. package/src/chat/composer/use-sustained-work.ts +0 -74
  267. package/src/chat/composer/useAttachmentIngest.ts +0 -116
  268. package/src/chat/composer/useModelListSpy.ts +0 -19
  269. package/src/chat/headless/badge-refs.ts +0 -76
  270. package/src/chat/headless/chip-labels.ts +0 -40
  271. package/src/chat/headless/chip-settle.ts +0 -53
  272. package/src/chat/headless/chip-views.ts +0 -215
  273. package/src/chat/headless/composer/attachment-dedupe.ts +0 -50
  274. package/src/chat/headless/composer/commands.ts +0 -16
  275. package/src/chat/headless/composer/composer-sources.ts +0 -150
  276. package/src/chat/headless/composer/conversation-badges.ts +0 -227
  277. package/src/chat/headless/composer/draft-sync.ts +0 -199
  278. package/src/chat/headless/composer/editor-markdown.ts +0 -137
  279. package/src/chat/headless/composer/ghost-autocomplete.ts +0 -381
  280. package/src/chat/headless/composer/host-chrome.ts +0 -197
  281. package/src/chat/headless/composer/host.ts +0 -250
  282. package/src/chat/headless/composer/index.ts +0 -17
  283. package/src/chat/headless/composer/labels-chrome.ts +0 -83
  284. package/src/chat/headless/composer/labels-editor.ts +0 -44
  285. package/src/chat/headless/composer/labels.ts +0 -18
  286. package/src/chat/headless/composer/live-cost.ts +0 -67
  287. package/src/chat/headless/composer/model-knobs.ts +0 -179
  288. package/src/chat/headless/composer/model-names.ts +0 -145
  289. package/src/chat/headless/composer/model-picker-prefs.ts +0 -90
  290. package/src/chat/headless/composer/models.ts +0 -86
  291. package/src/chat/headless/composer/new-session-defaults.ts +0 -68
  292. package/src/chat/headless/composer/prompt-suggestions.ts +0 -72
  293. package/src/chat/headless/composer/remember-model-pick.ts +0 -132
  294. package/src/chat/headless/composer/run-meter.ts +0 -228
  295. package/src/chat/headless/composer-modes.ts +0 -170
  296. package/src/chat/headless/draft-scope.ts +0 -136
  297. package/src/chat/headless/draft-target.ts +0 -87
  298. package/src/chat/headless/extension-sources.ts +0 -64
  299. package/src/chat/headless/file-chip.ts +0 -175
  300. package/src/chat/headless/fixture-host.ts +0 -294
  301. package/src/chat/headless/fixture-transcript.ts +0 -125
  302. package/src/chat/headless/fixtures/demo-transcript-all-kinds.ts +0 -233
  303. package/src/chat/headless/fixtures/demo-transcript.ts +0 -244
  304. package/src/chat/headless/host.ts +0 -264
  305. package/src/chat/headless/hosts.ts +0 -55
  306. package/src/chat/headless/index.ts +0 -31
  307. package/src/chat/headless/labels.ts +0 -373
  308. package/src/chat/headless/markdown-chunks.ts +0 -134
  309. package/src/chat/headless/path-resolver.ts +0 -178
  310. package/src/chat/headless/prompt-origin.ts +0 -90
  311. package/src/chat/headless/reference-store.ts +0 -285
  312. package/src/chat/headless/send-flow.ts +0 -347
  313. package/src/chat/headless/session-list.ts +0 -400
  314. package/src/chat/headless/sidebar/activity.ts +0 -179
  315. package/src/chat/headless/sidebar/badges.ts +0 -190
  316. package/src/chat/headless/sidebar/compaction.ts +0 -98
  317. package/src/chat/headless/sidebar/directory.ts +0 -1046
  318. package/src/chat/headless/sidebar/dot-state.ts +0 -36
  319. package/src/chat/headless/sidebar/environment.ts +0 -70
  320. package/src/chat/headless/sidebar/estimates.ts +0 -146
  321. package/src/chat/headless/sidebar/host.ts +0 -41
  322. package/src/chat/headless/sidebar/index.ts +0 -18
  323. package/src/chat/headless/sidebar/labels.ts +0 -161
  324. package/src/chat/headless/sidebar/notifications.ts +0 -61
  325. package/src/chat/headless/sidebar/pinned-projects.ts +0 -51
  326. package/src/chat/headless/sidebar/pinned-sessions.ts +0 -27
  327. package/src/chat/headless/sidebar/project-icons.ts +0 -116
  328. package/src/chat/headless/sidebar/query.ts +0 -621
  329. package/src/chat/headless/sidebar/rows.ts +0 -427
  330. package/src/chat/headless/sidebar/types.ts +0 -96
  331. package/src/chat/headless/sidebar/view.ts +0 -367
  332. package/src/chat/headless/site-icons.ts +0 -51
  333. package/src/chat/headless/smooth-stream.ts +0 -76
  334. package/src/chat/headless/store.ts +0 -62
  335. package/src/chat/headless/streams/actions.ts +0 -85
  336. package/src/chat/headless/streams/index.ts +0 -25
  337. package/src/chat/headless/streams/live-events.ts +0 -124
  338. package/src/chat/headless/streams/merge.ts +0 -60
  339. package/src/chat/headless/streams/pacer.ts +0 -189
  340. package/src/chat/headless/streams/prompt-previews.ts +0 -64
  341. package/src/chat/headless/streams/scheduler.ts +0 -36
  342. package/src/chat/headless/streams/selectors.ts +0 -76
  343. package/src/chat/headless/streams/session-streams.ts +0 -407
  344. package/src/chat/headless/streams/store.ts +0 -1107
  345. package/src/chat/headless/streams/transcript.ts +0 -41
  346. package/src/chat/headless/streams/types.ts +0 -84
  347. package/src/chat/headless/transcript/batch.ts +0 -429
  348. package/src/chat/headless/transcript/collapse.ts +0 -789
  349. package/src/chat/headless/transcript/fold-actions.ts +0 -269
  350. package/src/chat/headless/transcript/fold-attachments.ts +0 -78
  351. package/src/chat/headless/transcript/fold.ts +0 -382
  352. package/src/chat/headless/transcript/index.ts +0 -41
  353. package/src/chat/headless/transcript/nesting.ts +0 -73
  354. package/src/chat/headless/transcript/pairing.ts +0 -124
  355. package/src/chat/headless/transcript/rows.ts +0 -377
  356. package/src/chat/headless/transcript/run-failures.ts +0 -72
  357. package/src/chat/headless/transcript/select-stops.ts +0 -151
  358. package/src/chat/headless/transcript/tool-media.ts +0 -42
  359. package/src/chat/headless/transcript-host.ts +0 -180
  360. package/src/chat/headless/transcript-labels.ts +0 -12
  361. package/src/chat/headless/turn-labels.ts +0 -28
  362. package/src/chat/headless/turn-prompt.ts +0 -32
  363. package/src/chat/index.ts +0 -31
  364. package/src/chat/interactions/HostInteractions.tsx +0 -76
  365. package/src/chat/interactions/InboxPanel.tsx +0 -226
  366. package/src/chat/interactions/InteractionCard.tsx +0 -111
  367. package/src/chat/interactions/PlanCard.tsx +0 -186
  368. package/src/chat/interactions/QuestionField.tsx +0 -336
  369. package/src/chat/interactions/QuestionForm.tsx +0 -283
  370. package/src/chat/interactions/card-ui.tsx +0 -86
  371. package/src/chat/interactions/hooks.ts +0 -49
  372. package/src/chat/interactions/index.ts +0 -8
  373. package/src/chat/provider-color.ts +0 -71
  374. package/src/chat/rich-composer/MentionList.tsx +0 -238
  375. package/src/chat/rich-composer/RichComposer.tsx +0 -1071
  376. package/src/chat/rich-composer/badge-decorations.ts +0 -157
  377. package/src/chat/rich-composer/composer-controls.tsx +0 -102
  378. package/src/chat/rich-composer/composer-extensions.ts +0 -388
  379. package/src/chat/rich-composer/composer-keys.ts +0 -416
  380. package/src/chat/rich-composer/ghost-plugin.ts +0 -89
  381. package/src/chat/rich-composer/index.ts +0 -3
  382. package/src/chat/rich-composer/mention-popover.ts +0 -336
  383. package/src/chat/rich-composer/slash-completion.ts +0 -143
  384. package/src/chat/rich-composer/use-composer-bus.ts +0 -57
  385. package/src/chat/rich-composer/use-composer-editor.ts +0 -216
  386. package/src/chat/rich-composer/use-composer-sources.ts +0 -90
  387. package/src/chat/rich-composer/use-draft-mirror.ts +0 -398
  388. package/src/chat/rich-composer/use-editor-handover.ts +0 -45
  389. package/src/chat/rich-composer/use-extension-composer.ts +0 -80
  390. package/src/chat/rich-composer/use-ghost-lifecycle.ts +0 -265
  391. package/src/chat/rich-composer/use-prompt-ghost.ts +0 -90
  392. package/src/chat/rich-composer/use-staged-attachments.ts +0 -65
  393. package/src/chat/sidebar/MainSessionRow.tsx +0 -102
  394. package/src/chat/sidebar/ProjectIcon.tsx +0 -399
  395. package/src/chat/sidebar/RowChips.tsx +0 -98
  396. package/src/chat/sidebar/SessionSidebar.tsx +0 -1039
  397. package/src/chat/sidebar/SidebarDecoration.tsx +0 -93
  398. package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -270
  399. package/src/chat/sidebar/SidebarFooter.tsx +0 -244
  400. package/src/chat/sidebar/SidebarFrame.tsx +0 -154
  401. package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -263
  402. package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
  403. package/src/chat/sidebar/SidebarRowView.tsx +0 -151
  404. package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
  405. package/src/chat/sidebar/SidebarSessionRow.tsx +0 -317
  406. package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
  407. package/src/chat/sidebar/SpaceSwitcher.tsx +0 -341
  408. package/src/chat/sidebar/SpacesSection.tsx +0 -259
  409. package/src/chat/sidebar/collapsed.ts +0 -61
  410. package/src/chat/sidebar/index.ts +0 -109
  411. package/src/chat/sidebar/session-menu.ts +0 -441
  412. package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
  413. package/src/chat/sidebar/sidebar-live.tsx +0 -666
  414. package/src/chat/sidebar/use-main-session.ts +0 -32
  415. package/src/chat/sidebar/useAgentNames.ts +0 -12
  416. package/src/chat/sidebar/useCompactionProgress.ts +0 -24
  417. package/src/chat/sidebar/usePinnedProjects.ts +0 -36
  418. package/src/chat/sidebar/useSaveViewAsSpace.ts +0 -42
  419. package/src/chat/sidebar/useSessionActivity.ts +0 -24
  420. package/src/chat/sidebar/useSessionBadges.ts +0 -26
  421. package/src/chat/sidebar/useSessionDirectoryView.ts +0 -128
  422. package/src/chat/sidebar/useSessionSearch.ts +0 -94
  423. package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -167
  424. package/src/chat/sidebar/useSidebarLabels.ts +0 -10
  425. package/src/chat/testing/composer.contract.ts +0 -508
  426. package/src/chat/testing/contract.ts +0 -634
  427. package/src/chat/testing/fixture-composer-chrome.ts +0 -159
  428. package/src/chat/testing/fixture-composer-host.ts +0 -147
  429. package/src/chat/testing/fixture-sidebar-host.ts +0 -99
  430. package/src/chat/testing/index.ts +0 -12
  431. package/src/chat/testing/sidebar.contract.ts +0 -196
  432. package/src/chat/transcript/BadgeMenu.tsx +0 -241
  433. package/src/chat/transcript/CardMarkdown.tsx +0 -102
  434. package/src/chat/transcript/ChipCard.tsx +0 -187
  435. package/src/chat/transcript/ChipCards.tsx +0 -100
  436. package/src/chat/transcript/DiffLines.tsx +0 -122
  437. package/src/chat/transcript/EarlierHistory.tsx +0 -136
  438. package/src/chat/transcript/EditDiffBlock.tsx +0 -176
  439. package/src/chat/transcript/FileChip.tsx +0 -361
  440. package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
  441. package/src/chat/transcript/InlineChipText.tsx +0 -57
  442. package/src/chat/transcript/InteractionToolBody.tsx +0 -211
  443. package/src/chat/transcript/LazyRow.tsx +0 -311
  444. package/src/chat/transcript/MermaidDiagram.tsx +0 -484
  445. package/src/chat/transcript/PromptEcho.tsx +0 -171
  446. package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
  447. package/src/chat/transcript/ProseMarkdown.tsx +0 -168
  448. package/src/chat/transcript/ReferenceText.tsx +0 -198
  449. package/src/chat/transcript/SelectCursor.tsx +0 -118
  450. package/src/chat/transcript/SelectTurnHint.tsx +0 -81
  451. package/src/chat/transcript/SelectTurnProvider.tsx +0 -150
  452. package/src/chat/transcript/SubagentBlock.tsx +0 -224
  453. package/src/chat/transcript/TranscriptRow.tsx +0 -362
  454. package/src/chat/transcript/TranscriptSearch.tsx +0 -171
  455. package/src/chat/transcript/TurnMenu.tsx +0 -217
  456. package/src/chat/transcript/actions.tsx +0 -77
  457. package/src/chat/transcript/badges.tsx +0 -155
  458. package/src/chat/transcript/chip-details.ts +0 -169
  459. package/src/chat/transcript/chip-resolve.ts +0 -56
  460. package/src/chat/transcript/extension-renderers.tsx +0 -148
  461. package/src/chat/transcript/fold-attachments.tsx +0 -221
  462. package/src/chat/transcript/fold-status.tsx +0 -112
  463. package/src/chat/transcript/fold-worker.tsx +0 -160
  464. package/src/chat/transcript/fold.tsx +0 -522
  465. package/src/chat/transcript/frame.tsx +0 -326
  466. package/src/chat/transcript/index.ts +0 -66
  467. package/src/chat/transcript/markdown-cache.ts +0 -84
  468. package/src/chat/transcript/markdown-context.ts +0 -52
  469. package/src/chat/transcript/markdown.tsx +0 -351
  470. package/src/chat/transcript/messages.tsx +0 -169
  471. package/src/chat/transcript/notices.tsx +0 -508
  472. package/src/chat/transcript/prompt-lines.tsx +0 -55
  473. package/src/chat/transcript/prompt.tsx +0 -258
  474. package/src/chat/transcript/prose.tsx +0 -171
  475. package/src/chat/transcript/recent-map.ts +0 -32
  476. package/src/chat/transcript/references.ts +0 -108
  477. package/src/chat/transcript/remark-references.ts +0 -157
  478. package/src/chat/transcript/remark-refs.ts +0 -176
  479. package/src/chat/transcript/renderer-slots.tsx +0 -35
  480. package/src/chat/transcript/renderers.tsx +0 -251
  481. package/src/chat/transcript/row-estimate.ts +0 -158
  482. package/src/chat/transcript/run-rows.tsx +0 -291
  483. package/src/chat/transcript/site-icons.ts +0 -27
  484. package/src/chat/transcript/thumbnails.ts +0 -146
  485. package/src/chat/transcript/tool-batch.tsx +0 -102
  486. package/src/chat/transcript/tool-details.tsx +0 -31
  487. package/src/chat/transcript/tool-media.tsx +0 -132
  488. package/src/chat/transcript/tool-parts.tsx +0 -358
  489. package/src/chat/transcript/tool-payload.tsx +0 -76
  490. package/src/chat/transcript/tool-row.tsx +0 -496
  491. package/src/chat/transcript/turn-commands.ts +0 -101
  492. package/src/chat/transcript/use-transcript-rows.ts +0 -195
  493. package/src/chat/transcript/useComposerSearch.ts +0 -106
  494. package/src/chat/transcript/useSelectTurnKeys.ts +0 -204
  495. package/src/chat/transcript/useSettledReveal.ts +0 -57
  496. package/src/chat/transcript/useStickToBottom.ts +0 -600
  497. package/src/chat/transcript/useTranscriptFind.ts +0 -70
  498. package/src/chat/transcript/useTranscriptFindKey.ts +0 -52
  499. package/src/chat/transcript/useTranscriptScroll.ts +0 -163
  500. package/src/chat/transcript/useTranscriptSearch.tsx +0 -382
  501. package/src/chat/transcript/useTranscriptSelectionCopy.ts +0 -63
  502. package/src/chat/transcript/useWheelHoverPause.ts +0 -79
  503. package/src/chat/transcript/user-bash.tsx +0 -134
  504. package/src/chat/transcript-options.ts +0 -51
  505. package/src/chat/useChatLabels.ts +0 -14
  506. package/src/code/CodeHighlightProvider.tsx +0 -87
  507. package/src/code/HighlightedCode.tsx +0 -156
  508. package/src/code/code-themes.ts +0 -187
  509. package/src/code/editor/CodeCompletion.tsx +0 -719
  510. package/src/code/editor/CodeEditor.tsx +0 -480
  511. package/src/code/editor/CodeHover.tsx +0 -429
  512. package/src/code/editor/DiagnosticAnnotation.tsx +0 -73
  513. package/src/code/editor/DiagnosticsChip.tsx +0 -85
  514. package/src/code/editor/DiffView.tsx +0 -197
  515. package/src/code/editor/EditorColumn.tsx +0 -256
  516. package/src/code/editor/FileIcon.tsx +0 -89
  517. package/src/code/editor/FileTabPill.tsx +0 -101
  518. package/src/code/editor/FileTree.tsx +0 -414
  519. package/src/code/editor/FileView.tsx +0 -462
  520. package/src/code/editor/HighlightWorkers.tsx +0 -84
  521. package/src/code/editor/LanguageEditor.tsx +0 -210
  522. package/src/code/editor/_vendor/tree-icon-colors.ts +0 -72
  523. package/src/code/editor/diagnostics.ts +0 -140
  524. package/src/code/editor/edit-session.ts +0 -32
  525. package/src/code/editor/environment.tsx +0 -88
  526. package/src/code/editor/find/FindBar.tsx +0 -126
  527. package/src/code/editor/find/find-highlight.ts +0 -138
  528. package/src/code/editor/find/find-model.ts +0 -123
  529. package/src/code/editor/find/settle-scroll.ts +0 -77
  530. package/src/code/editor/find/useFind.ts +0 -203
  531. package/src/code/editor/fs-adapter.ts +0 -37
  532. package/src/code/editor/index.ts +0 -36
  533. package/src/code/editor/language.ts +0 -31
  534. package/src/code/editor/patch-parse.ts +0 -176
  535. package/src/code/editor/patch-parse.worker.ts +0 -12
  536. package/src/code/editor/pierre-theme.ts +0 -155
  537. package/src/code/editor/prime-diff.ts +0 -37
  538. package/src/code/editor/reveal.ts +0 -58
  539. package/src/code/editor/scroll-reach.ts +0 -28
  540. package/src/code/editor/useCodeDocument.ts +0 -226
  541. package/src/code/editor/useDefinition.ts +0 -159
  542. package/src/code/editor/useDetachCleanup.ts +0 -36
  543. package/src/code/editor/useFileDocument.ts +0 -87
  544. package/src/code/editor/useRevealLine.ts +0 -92
  545. package/src/code/editor/word-at.ts +0 -145
  546. package/src/code/highlight.worker.ts +0 -16
  547. package/src/code/highlighter.ts +0 -181
  548. package/src/code/highlights.ts +0 -51
  549. package/src/code/mermaid-lexer.ts +0 -331
  550. package/src/code/shiki-theme.ts +0 -46
  551. package/src/components/BrandMark.tsx +0 -118
  552. package/src/components/Breadcrumb.tsx +0 -105
  553. package/src/components/BrowserChrome.tsx +0 -189
  554. package/src/components/BrowserSignIn.tsx +0 -210
  555. package/src/components/ChoiceCards.tsx +0 -170
  556. package/src/components/CodeFrame.tsx +0 -225
  557. package/src/components/ConfirmDialog.tsx +0 -119
  558. package/src/components/CopyButton.tsx +0 -85
  559. package/src/components/EditableTitle.tsx +0 -199
  560. package/src/components/ErrorBoundary.tsx +0 -208
  561. package/src/components/Form.tsx +0 -593
  562. package/src/components/Highlighted.tsx +0 -68
  563. package/src/components/HowItWorks.tsx +0 -123
  564. package/src/components/IconButton.tsx +0 -101
  565. package/src/components/IconToggle.tsx +0 -71
  566. package/src/components/Keycap.tsx +0 -334
  567. package/src/components/Lightbox.tsx +0 -257
  568. package/src/components/LoadError.tsx +0 -45
  569. package/src/components/MediaNav.tsx +0 -85
  570. package/src/components/Menu.tsx +0 -435
  571. package/src/components/Overlay.tsx +0 -327
  572. package/src/components/PanelEmpty.tsx +0 -80
  573. package/src/components/PanelRows.tsx +0 -107
  574. package/src/components/PreviewWindow.tsx +0 -53
  575. package/src/components/ReorderTabs.tsx +0 -103
  576. package/src/components/RowActionsMenu.tsx +0 -383
  577. package/src/components/SegmentSpinner.tsx +0 -88
  578. package/src/components/Segmented.tsx +0 -126
  579. package/src/components/StepFrame.tsx +0 -151
  580. package/src/components/Stepper.tsx +0 -157
  581. package/src/components/Surface.tsx +0 -191
  582. package/src/components/SwatchPicker.tsx +0 -147
  583. package/src/components/SwitchGlyph.tsx +0 -56
  584. package/src/components/TabPill.tsx +0 -188
  585. package/src/components/ThemeThumb.tsx +0 -52
  586. package/src/components/ToggleCard.tsx +0 -120
  587. package/src/components/Tooltip.tsx +0 -288
  588. package/src/components/ZoomableImage.tsx +0 -322
  589. package/src/components/button.ts +0 -120
  590. package/src/components/floating/FloatingSurface.tsx +0 -158
  591. package/src/components/floating/HoverCard.tsx +0 -143
  592. package/src/components/floating/Popover.tsx +0 -166
  593. package/src/components/floating/useAnchoredPosition.ts +0 -186
  594. package/src/components/floating/usePopover.ts +0 -158
  595. package/src/components/image-clipboard.ts +0 -70
  596. package/src/components/keyboard-layout.ts +0 -115
  597. package/src/components/palette/PaletteList.tsx +0 -432
  598. package/src/components/palette/PalettePanel.tsx +0 -338
  599. package/src/components/palette/palette-layout.ts +0 -86
  600. package/src/components/report-error.ts +0 -142
  601. package/src/components/zoom.ts +0 -133
  602. package/src/extensions/ExtensionComponent.tsx +0 -167
  603. package/src/extensions/ExtensionDialogHost.tsx +0 -445
  604. package/src/extensions/ExtensionRenderer.tsx +0 -100
  605. package/src/extensions/ExtensionScreen.tsx +0 -122
  606. package/src/extensions/ExtensionSettingsPage.tsx +0 -112
  607. package/src/extensions/ExtensionSettingsPages.tsx +0 -44
  608. package/src/extensions/ExtensionSettingsSidebar.tsx +0 -373
  609. package/src/extensions/ExtensionSlot.tsx +0 -213
  610. package/src/extensions/ExtensionWebview.tsx +0 -104
  611. package/src/extensions/ExtensionsProvider.tsx +0 -124
  612. package/src/extensions/SettingsWireForm.tsx +0 -182
  613. package/src/extensions/headless/dialog-queue.ts +0 -92
  614. package/src/extensions/headless/effect-channel.ts +0 -50
  615. package/src/extensions/headless/effect-router.ts +0 -107
  616. package/src/extensions/headless/fixture-host.ts +0 -381
  617. package/src/extensions/headless/host.ts +0 -398
  618. package/src/extensions/headless/index.ts +0 -17
  619. package/src/extensions/headless/labels.ts +0 -64
  620. package/src/extensions/headless/links.ts +0 -56
  621. package/src/extensions/headless/select.ts +0 -249
  622. package/src/extensions/headless/webview-bridge.ts +0 -127
  623. package/src/extensions/headless/wire.ts +0 -175
  624. package/src/extensions/hooks.ts +0 -209
  625. package/src/extensions/index.ts +0 -25
  626. package/src/extensions/kit.ts +0 -79
  627. package/src/extensions/links.tsx +0 -165
  628. package/src/extensions/testing/contract.ts +0 -382
  629. package/src/extensions/testing/index.ts +0 -6
  630. package/src/extensions/useExtensionsLabels.ts +0 -14
  631. package/src/files/CodeViewer.tsx +0 -289
  632. package/src/files/DiffFileViewer.tsx +0 -143
  633. package/src/files/DiffsTab.tsx +0 -581
  634. package/src/files/EditorColumn.tsx +0 -453
  635. package/src/files/EditorEnvironmentRoot.tsx +0 -63
  636. package/src/files/FilesDiagnosticsChip.tsx +0 -32
  637. package/src/files/FilesProvider.tsx +0 -58
  638. package/src/files/FilesTab.tsx +0 -441
  639. package/src/files/MediaDiff.tsx +0 -61
  640. package/src/files/MediaView.tsx +0 -170
  641. package/src/files/ReviewDraft.tsx +0 -88
  642. package/src/files/ReviewableDiff.tsx +0 -72
  643. package/src/files/SearchPanel.tsx +0 -325
  644. package/src/files/TreeColumn.tsx +0 -229
  645. package/src/files/code-excerpt.ts +0 -265
  646. package/src/files/code-menu.ts +0 -53
  647. package/src/files/drafts-store.ts +0 -192
  648. package/src/files/file-actions.ts +0 -152
  649. package/src/files/headless/editor-prefs.ts +0 -230
  650. package/src/files/headless/entries.ts +0 -172
  651. package/src/files/headless/fixture-host.ts +0 -260
  652. package/src/files/headless/host.ts +0 -387
  653. package/src/files/headless/index.ts +0 -14
  654. package/src/files/headless/labels.ts +0 -123
  655. package/src/files/headless/lsp-edits.ts +0 -58
  656. package/src/files/headless/media.ts +0 -57
  657. package/src/files/headless/name-match.ts +0 -38
  658. package/src/files/headless/search.ts +0 -23
  659. package/src/files/headless/view.ts +0 -114
  660. package/src/files/headless/workspace-diff.ts +0 -82
  661. package/src/files/index.ts +0 -25
  662. package/src/files/lazy-tabs.tsx +0 -41
  663. package/src/files/session-patch.ts +0 -45
  664. package/src/files/tab-hooks.ts +0 -37
  665. package/src/files/testing/contract.ts +0 -279
  666. package/src/files/testing/demo.ts +0 -36
  667. package/src/files/testing/index.ts +0 -7
  668. package/src/files/useCodeReview.tsx +0 -177
  669. package/src/files/useDiagnostics.ts +0 -59
  670. package/src/files/useDiagnosticsRun.ts +0 -86
  671. package/src/files/useEntryActions.ts +0 -280
  672. package/src/files/useFilesDiagnostics.ts +0 -51
  673. package/src/files/useFilesLabels.ts +0 -14
  674. package/src/files/useFolderChanges.ts +0 -38
  675. package/src/files/useLsp.ts +0 -181
  676. package/src/files/useOpenFiles.ts +0 -402
  677. package/src/files/useWorkspace.ts +0 -148
  678. package/src/files/working-tree-diff.ts +0 -142
  679. package/src/git/BranchMenu.tsx +0 -988
  680. package/src/git/GitBar.tsx +0 -297
  681. package/src/git/GitProvider.tsx +0 -50
  682. package/src/git/ImportRepoDialog.tsx +0 -390
  683. package/src/git/MoveSessionDialog.tsx +0 -396
  684. package/src/git/RemoteFolderPicker.tsx +0 -475
  685. package/src/git/SyncChip.tsx +0 -275
  686. package/src/git/WherePicker.tsx +0 -358
  687. package/src/git/headless/environment.ts +0 -132
  688. package/src/git/headless/host.ts +0 -353
  689. package/src/git/headless/index.ts +0 -14
  690. package/src/git/headless/labels.ts +0 -230
  691. package/src/git/headless/move.ts +0 -101
  692. package/src/git/headless/remote-clone.ts +0 -44
  693. package/src/git/headless/status-reads.ts +0 -77
  694. package/src/git/headless/switcher.ts +0 -215
  695. package/src/git/headless/sync.ts +0 -71
  696. package/src/git/index.ts +0 -17
  697. package/src/git/testing/contract.ts +0 -551
  698. package/src/git/testing/index.ts +0 -537
  699. package/src/git/useEnvironmentChoices.ts +0 -50
  700. package/src/git/useGitBar.ts +0 -180
  701. package/src/hooks/keyed-store.ts +0 -65
  702. package/src/hooks/useDisplayPath.tsx +0 -93
  703. package/src/hooks/useHydrated.ts +0 -16
  704. package/src/hooks/useMinuteTick.ts +0 -49
  705. package/src/hooks/useNearViewport.ts +0 -111
  706. package/src/hooks/usePersistedState.ts +0 -98
  707. package/src/hooks/useResizeDrag.ts +0 -240
  708. package/src/hooks/useTabDrag.ts +0 -88
  709. package/src/index.ts +0 -119
  710. package/src/keybindings/KeyCommands.tsx +0 -123
  711. package/src/keybindings/KeyHint.tsx +0 -78
  712. package/src/keybindings/KeybindingsProvider.tsx +0 -231
  713. package/src/keybindings/headless/catalog.ts +0 -360
  714. package/src/keybindings/headless/commands.ts +0 -77
  715. package/src/keybindings/headless/fixture-host.ts +0 -51
  716. package/src/keybindings/headless/host.ts +0 -29
  717. package/src/keybindings/headless/index.ts +0 -13
  718. package/src/keybindings/headless/key-scope.ts +0 -91
  719. package/src/keybindings/headless/labels.ts +0 -14
  720. package/src/keybindings/headless/overrides.ts +0 -64
  721. package/src/keybindings/index.ts +0 -15
  722. package/src/keybindings/load-once.ts +0 -11
  723. package/src/keybindings/match.ts +0 -48
  724. package/src/keybindings/press.ts +0 -80
  725. package/src/keybindings/testing/contract.ts +0 -139
  726. package/src/keybindings/testing/index.ts +0 -6
  727. package/src/keybindings/useHelpKey.ts +0 -35
  728. package/src/keybindings/useKeybindingsLabels.ts +0 -14
  729. package/src/labels.tsx +0 -175
  730. package/src/machines/AddServerForm.tsx +0 -151
  731. package/src/machines/Banners.tsx +0 -172
  732. package/src/machines/DaemonMenu.tsx +0 -413
  733. package/src/machines/HostCapabilities.tsx +0 -245
  734. package/src/machines/HostSignIn.tsx +0 -63
  735. package/src/machines/HostSyncPanel.tsx +0 -275
  736. package/src/machines/HostsSection.tsx +0 -312
  737. package/src/machines/MachinesProvider.tsx +0 -164
  738. package/src/machines/ServerCard.tsx +0 -347
  739. package/src/machines/ServerMachinesPanel.tsx +0 -547
  740. package/src/machines/ServerUpdatePanel.tsx +0 -160
  741. package/src/machines/SyncAccounts.tsx +0 -148
  742. package/src/machines/SyncMarker.tsx +0 -87
  743. package/src/machines/SyncOutcomeBadge.tsx +0 -84
  744. package/src/machines/TokensPanel.tsx +0 -249
  745. package/src/machines/headless/fixture-host.ts +0 -519
  746. package/src/machines/headless/fixtures.ts +0 -164
  747. package/src/machines/headless/host.ts +0 -381
  748. package/src/machines/headless/index.ts +0 -13
  749. package/src/machines/headless/labels.ts +0 -364
  750. package/src/machines/headless/messages.ts +0 -209
  751. package/src/machines/headless/presence.ts +0 -110
  752. package/src/machines/headless/settings-focus.ts +0 -25
  753. package/src/machines/headless/stores.ts +0 -137
  754. package/src/machines/headless/sync.ts +0 -207
  755. package/src/machines/index.ts +0 -29
  756. package/src/machines/settings-section.tsx +0 -37
  757. package/src/machines/testing/contract.ts +0 -617
  758. package/src/machines/testing/index.ts +0 -7
  759. package/src/machines/testing/sync.contract.ts +0 -260
  760. package/src/motion/SwapIcon.tsx +0 -29
  761. package/src/motion/collapse.ts +0 -21
  762. package/src/motion/grow.tsx +0 -86
  763. package/src/motion/layout-animating.ts +0 -50
  764. package/src/motion/presence.ts +0 -191
  765. package/src/motion/provider.tsx +0 -63
  766. package/src/motion/reduced.ts +0 -36
  767. package/src/motion/roll.tsx +0 -131
  768. package/src/motion/shimmer.ts +0 -15
  769. package/src/motion/size.tsx +0 -192
  770. package/src/motion/springs.ts +0 -413
  771. package/src/motion/swap.tsx +0 -216
  772. package/src/motion/title-text.tsx +0 -74
  773. package/src/onboarding/ConnectProviderCard.tsx +0 -49
  774. package/src/onboarding/OnboardingFlow.tsx +0 -176
  775. package/src/onboarding/OnboardingProvider.tsx +0 -209
  776. package/src/onboarding/OnboardingStepFrame.tsx +0 -80
  777. package/src/onboarding/conversation.tsx +0 -196
  778. package/src/onboarding/demos/autonomy.tsx +0 -154
  779. package/src/onboarding/demos/extensions.tsx +0 -183
  780. package/src/onboarding/demos/features.tsx +0 -488
  781. package/src/onboarding/demos/how-it-works.tsx +0 -698
  782. package/src/onboarding/demos/index.ts +0 -11
  783. package/src/onboarding/demos/parts.tsx +0 -133
  784. package/src/onboarding/demos/tour.tsx +0 -217
  785. package/src/onboarding/headless/controller.ts +0 -110
  786. package/src/onboarding/headless/fixture-host.ts +0 -269
  787. package/src/onboarding/headless/fixtures.ts +0 -486
  788. package/src/onboarding/headless/host.ts +0 -176
  789. package/src/onboarding/headless/index.ts +0 -8
  790. package/src/onboarding/headless/labels.ts +0 -282
  791. package/src/onboarding/index.ts +0 -21
  792. package/src/onboarding/marks.tsx +0 -107
  793. package/src/onboarding/preview-attachments.ts +0 -39
  794. package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -128
  795. package/src/onboarding/skills/parts.tsx +0 -464
  796. package/src/onboarding/sources/SourceBrowser.tsx +0 -400
  797. package/src/onboarding/steps/AutonomyStep.tsx +0 -128
  798. package/src/onboarding/steps/ConnectStep.tsx +0 -104
  799. package/src/onboarding/steps/ConnectorsStep.tsx +0 -222
  800. package/src/onboarding/steps/ConversationStep.tsx +0 -132
  801. package/src/onboarding/steps/ExtensionsStep.tsx +0 -113
  802. package/src/onboarding/steps/FeatureExample.tsx +0 -46
  803. package/src/onboarding/steps/FeaturesStep.tsx +0 -88
  804. package/src/onboarding/steps/ImportStep.tsx +0 -156
  805. package/src/onboarding/steps/LookStep.tsx +0 -276
  806. package/src/onboarding/steps/ReadyStep.tsx +0 -278
  807. package/src/onboarding/steps/SkillsStep.tsx +0 -45
  808. package/src/onboarding/steps/StepSection.tsx +0 -63
  809. package/src/onboarding/steps/Tradeoff.tsx +0 -45
  810. package/src/onboarding/steps/WelcomeStep.tsx +0 -147
  811. package/src/onboarding/steps/connect/KeyForm.tsx +0 -112
  812. package/src/onboarding/steps/connect/ProviderPanel.tsx +0 -149
  813. package/src/onboarding/steps/connect/ProviderReady.tsx +0 -171
  814. package/src/onboarding/steps/connect/ready-text.ts +0 -17
  815. package/src/onboarding/steps/index.ts +0 -12
  816. package/src/onboarding/steps/tasks.tsx +0 -84
  817. package/src/onboarding/testing/contract.ts +0 -472
  818. package/src/onboarding/testing/index.ts +0 -7
  819. package/src/onboarding/tutorials.tsx +0 -45
  820. package/src/onboarding/useSignIn.ts +0 -58
  821. package/src/palette/CommandPalette.tsx +0 -59
  822. package/src/palette/PaletteDialog.tsx +0 -186
  823. package/src/palette/PaletteProvider.tsx +0 -149
  824. package/src/palette/PaletteRows.tsx +0 -208
  825. package/src/palette/app-sources.ts +0 -62
  826. package/src/palette/headless/app-sources.ts +0 -515
  827. package/src/palette/headless/gather.ts +0 -50
  828. package/src/palette/headless/host.ts +0 -129
  829. package/src/palette/headless/index.ts +0 -15
  830. package/src/palette/headless/labels.ts +0 -124
  831. package/src/palette/headless/rank-protocol.ts +0 -23
  832. package/src/palette/headless/recents.ts +0 -35
  833. package/src/palette/headless/session-sources.ts +0 -218
  834. package/src/palette/headless/sources.ts +0 -313
  835. package/src/palette/headless/store.ts +0 -105
  836. package/src/palette/index.ts +0 -17
  837. package/src/palette/rank.worker.ts +0 -30
  838. package/src/palette/setup.ts +0 -19
  839. package/src/palette/testing/contract.ts +0 -250
  840. package/src/palette/testing/index.ts +0 -152
  841. package/src/palette/useConversationSearch.ts +0 -115
  842. package/src/palette/usePaletteController.ts +0 -229
  843. package/src/palette/useRankedItems.ts +0 -122
  844. package/src/path.ts +0 -199
  845. package/src/server/demo-tools.ts +0 -34
  846. package/src/server/environment.ts +0 -118
  847. package/src/server/index.ts +0 -7
  848. package/src/server/scripted-provider.ts +0 -174
  849. package/src/server/sse-handler.ts +0 -457
  850. package/src/server/testing/index.ts +0 -7
  851. package/src/session/ArtifactRowChips.tsx +0 -260
  852. package/src/session/ArtifactsPanel.tsx +0 -426
  853. package/src/session/DiffFileTree.tsx +0 -173
  854. package/src/session/PanelAttention.tsx +0 -131
  855. package/src/session/ProjectHome.tsx +0 -733
  856. package/src/session/ProviderUsageProvider.tsx +0 -113
  857. package/src/session/QueueTab.tsx +0 -669
  858. package/src/session/RunningWorkDialog.tsx +0 -178
  859. package/src/session/SessionCacheFacts.tsx +0 -190
  860. package/src/session/SessionDetailsDialog.tsx +0 -627
  861. package/src/session/SessionHeader.tsx +0 -242
  862. package/src/session/SessionProvider.tsx +0 -98
  863. package/src/session/SessionShell.tsx +0 -77
  864. package/src/session/SideChat.tsx +0 -320
  865. package/src/session/TodoList.tsx +0 -123
  866. package/src/session/TodosPanel.tsx +0 -279
  867. package/src/session/TurnDetailsDialog.tsx +0 -299
  868. package/src/session/UsagePanel.tsx +0 -358
  869. package/src/session/WelcomeScreen.tsx +0 -88
  870. package/src/session/headless/artifacts.ts +0 -101
  871. package/src/session/headless/diff-tree.ts +0 -167
  872. package/src/session/headless/fixture-host.ts +0 -362
  873. package/src/session/headless/home-layout.ts +0 -276
  874. package/src/session/headless/host.ts +0 -263
  875. package/src/session/headless/index.ts +0 -23
  876. package/src/session/headless/keyed.ts +0 -72
  877. package/src/session/headless/labels.ts +0 -337
  878. package/src/session/headless/queue-attachments.ts +0 -73
  879. package/src/session/headless/queue.ts +0 -122
  880. package/src/session/headless/running-work.ts +0 -85
  881. package/src/session/headless/session-actions.ts +0 -198
  882. package/src/session/headless/session-diffs.ts +0 -136
  883. package/src/session/headless/side.ts +0 -63
  884. package/src/session/headless/todos.ts +0 -62
  885. package/src/session/headless/usage-format.ts +0 -19
  886. package/src/session/headless/usage.ts +0 -407
  887. package/src/session/index.ts +0 -31
  888. package/src/session/modal-shell.tsx +0 -24
  889. package/src/session/testing/contract.ts +0 -588
  890. package/src/session/testing/demo.ts +0 -224
  891. package/src/session/testing/index.ts +0 -7
  892. package/src/session/useSessionLabels.ts +0 -14
  893. package/src/session/useUsageSummary.ts +0 -82
  894. package/src/settings/SettingsHeadingText.tsx +0 -54
  895. package/src/settings/SettingsHostSwitcher.tsx +0 -93
  896. package/src/settings/SettingsNav.tsx +0 -198
  897. package/src/settings/SettingsProvider.tsx +0 -127
  898. package/src/settings/SettingsRowsPage.tsx +0 -218
  899. package/src/settings/SettingsShell.tsx +0 -337
  900. package/src/settings/SettingsTutorial.tsx +0 -55
  901. package/src/settings/headless/catalog.ts +0 -570
  902. package/src/settings/headless/claude-import.ts +0 -61
  903. package/src/settings/headless/enabled.ts +0 -44
  904. package/src/settings/headless/fixture-accounts.ts +0 -260
  905. package/src/settings/headless/fixture-host.ts +0 -162
  906. package/src/settings/headless/fixture-models.ts +0 -51
  907. package/src/settings/headless/fixture-performance.ts +0 -350
  908. package/src/settings/headless/fixture-sections.ts +0 -391
  909. package/src/settings/headless/host.ts +0 -127
  910. package/src/settings/headless/index.ts +0 -22
  911. package/src/settings/headless/labels.ts +0 -63
  912. package/src/settings/headless/layout-sections.ts +0 -41
  913. package/src/settings/headless/layout.ts +0 -732
  914. package/src/settings/headless/mcp.ts +0 -319
  915. package/src/settings/headless/models.ts +0 -51
  916. package/src/settings/headless/page-counts.ts +0 -40
  917. package/src/settings/headless/performance.ts +0 -524
  918. package/src/settings/headless/providers.ts +0 -117
  919. package/src/settings/headless/registry.ts +0 -62
  920. package/src/settings/headless/resource.ts +0 -75
  921. package/src/settings/headless/search.ts +0 -142
  922. package/src/settings/headless/sections-host.ts +0 -340
  923. package/src/settings/index.ts +0 -32
  924. package/src/settings/rows.tsx +0 -152
  925. package/src/settings/section.tsx +0 -165
  926. package/src/settings/sections/appearance/AppearanceSection.tsx +0 -667
  927. package/src/settings/sections/appearance/labels.ts +0 -77
  928. package/src/settings/sections/claude-import/ClaudeImportDialog.tsx +0 -258
  929. package/src/settings/sections/claude-import/labels.ts +0 -42
  930. package/src/settings/sections/claude-import/use-claude-import-available.ts +0 -35
  931. package/src/settings/sections/descriptors.tsx +0 -261
  932. package/src/settings/sections/editor/EditorSection.tsx +0 -521
  933. package/src/settings/sections/editor/labels.ts +0 -84
  934. package/src/settings/sections/enabled-list/EnabledListSection.tsx +0 -112
  935. package/src/settings/sections/enabled-list/labels.ts +0 -37
  936. package/src/settings/sections/environments/EnvironmentsSection.tsx +0 -549
  937. package/src/settings/sections/environments/labels.ts +0 -31
  938. package/src/settings/sections/extensions/ChangeOriginDialog.tsx +0 -218
  939. package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -210
  940. package/src/settings/sections/extensions/ExtensionConfigRows.tsx +0 -508
  941. package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -356
  942. package/src/settings/sections/extensions/ExtensionPicksBar.tsx +0 -112
  943. package/src/settings/sections/extensions/ExtensionSourceBrowser.tsx +0 -244
  944. package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -665
  945. package/src/settings/sections/extensions/create-labels.ts +0 -31
  946. package/src/settings/sections/extensions/labels.ts +0 -64
  947. package/src/settings/sections/extensions/options-labels.ts +0 -34
  948. package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -457
  949. package/src/settings/sections/host-catalog/labels.ts +0 -44
  950. package/src/settings/sections/index.ts +0 -60
  951. package/src/settings/sections/instructions/InstructionsSection.tsx +0 -385
  952. package/src/settings/sections/instructions/labels.ts +0 -33
  953. package/src/settings/sections/keybindings/KeybindingsSection.tsx +0 -124
  954. package/src/settings/sections/keybindings/labels.ts +0 -72
  955. package/src/settings/sections/keybindings/rows.ts +0 -103
  956. package/src/settings/sections/logs/LogsSection.tsx +0 -153
  957. package/src/settings/sections/logs/labels.ts +0 -20
  958. package/src/settings/sections/mcp/McpAddForm.tsx +0 -245
  959. package/src/settings/sections/mcp/McpSection.tsx +0 -358
  960. package/src/settings/sections/mcp/McpServerRow.tsx +0 -404
  961. package/src/settings/sections/mcp/labels.ts +0 -193
  962. package/src/settings/sections/models/AgentDefaults.tsx +0 -365
  963. package/src/settings/sections/models/ModelListPicker.tsx +0 -265
  964. package/src/settings/sections/models/ModelPickField.tsx +0 -220
  965. package/src/settings/sections/models/ModelRows.tsx +0 -381
  966. package/src/settings/sections/models/SpacesDefaultsSection.tsx +0 -102
  967. package/src/settings/sections/models/labels.ts +0 -119
  968. package/src/settings/sections/models/model-test.tsx +0 -125
  969. package/src/settings/sections/performance/PerfSparkline.tsx +0 -64
  970. package/src/settings/sections/performance/PerformanceHud.tsx +0 -110
  971. package/src/settings/sections/performance/PerformanceSection.tsx +0 -770
  972. package/src/settings/sections/performance/labels.ts +0 -114
  973. package/src/settings/sections/performance/use-perf-monitor.ts +0 -26
  974. package/src/settings/sections/plugins/PluginsSection.tsx +0 -151
  975. package/src/settings/sections/plugins/labels.ts +0 -23
  976. package/src/settings/sections/providers/CredentialSources.tsx +0 -237
  977. package/src/settings/sections/providers/ProvidersSection.tsx +0 -389
  978. package/src/settings/sections/providers/ServerProvidersSection.tsx +0 -244
  979. package/src/settings/sections/providers/ServerSignIn.tsx +0 -137
  980. package/src/settings/sections/providers/labels.ts +0 -160
  981. package/src/settings/sections/shared/catalog.tsx +0 -265
  982. package/src/settings/sections/shared/labels.ts +0 -31
  983. package/src/settings/sections/skills/SkillList.tsx +0 -494
  984. package/src/settings/sections/skills/SkillsSection.tsx +0 -249
  985. package/src/settings/sections/skills/labels.ts +0 -54
  986. package/src/settings/sections/use-section-labels.ts +0 -10
  987. package/src/settings/testing/accounts-demo.ts +0 -110
  988. package/src/settings/testing/accounts.contract.ts +0 -319
  989. package/src/settings/testing/claude-import.contract.ts +0 -93
  990. package/src/settings/testing/contract.ts +0 -192
  991. package/src/settings/testing/extension-options.contract.ts +0 -163
  992. package/src/settings/testing/index.ts +0 -11
  993. package/src/settings/testing/models.contract.ts +0 -135
  994. package/src/settings/testing/performance.contract.ts +0 -219
  995. package/src/settings/testing/sections.contract.ts +0 -306
  996. package/src/terminal/HostTerminalSurface.tsx +0 -917
  997. package/src/terminal/TerminalDrawer.tsx +0 -228
  998. package/src/terminal/TerminalPanel.tsx +0 -740
  999. package/src/terminal/TerminalProvider.tsx +0 -201
  1000. package/src/terminal/TerminalSurface.tsx +0 -262
  1001. package/src/terminal/box-glyphs.ts +0 -333
  1002. package/src/terminal/ghostty.ts +0 -116
  1003. package/src/terminal/grid-size.ts +0 -46
  1004. package/src/terminal/headless/fixture-host.ts +0 -250
  1005. package/src/terminal/headless/host.ts +0 -99
  1006. package/src/terminal/headless/index.ts +0 -11
  1007. package/src/terminal/headless/labels.ts +0 -69
  1008. package/src/terminal/headless/layout.ts +0 -57
  1009. package/src/terminal/headless/links.ts +0 -227
  1010. package/src/terminal/headless/order.ts +0 -28
  1011. package/src/terminal/headless/output-cursor.ts +0 -66
  1012. package/src/terminal/headless/recent.ts +0 -20
  1013. package/src/terminal/headless/replay.ts +0 -45
  1014. package/src/terminal/headless/scope.ts +0 -60
  1015. package/src/terminal/headless/store.ts +0 -637
  1016. package/src/terminal/index.ts +0 -40
  1017. package/src/terminal/keys.ts +0 -34
  1018. package/src/terminal/testing/contract.ts +0 -274
  1019. package/src/terminal/testing/demo.ts +0 -40
  1020. package/src/terminal/testing/index.ts +0 -7
  1021. package/src/terminal/theme.ts +0 -110
  1022. package/src/terminal/useTerminalLabels.ts +0 -14
  1023. package/src/theme/accents.ts +0 -46
  1024. package/src/theme/color.ts +0 -450
  1025. package/src/theme/css-vars.ts +0 -187
  1026. package/src/theme/derive.ts +0 -700
  1027. package/src/theme/from-theme.ts +0 -52
  1028. package/src/theme/stylesheet.ts +0 -55
  1029. package/src/theme/themes.ts +0 -767
  1030. package/src/theme/without-transitions.ts +0 -18
  1031. package/src/uno.ts +0 -167
  1032. package/src/workspace/LayoutBudget.tsx +0 -143
  1033. package/src/workspace/PanelContentView.tsx +0 -523
  1034. package/src/workspace/PanelCorner.tsx +0 -111
  1035. package/src/workspace/PanelGroups.tsx +0 -264
  1036. package/src/workspace/PanelHome.tsx +0 -71
  1037. package/src/workspace/PanelItems.tsx +0 -368
  1038. package/src/workspace/PanelStrip.tsx +0 -316
  1039. package/src/workspace/SidePanel.tsx +0 -240
  1040. package/src/workspace/TabParking.tsx +0 -120
  1041. package/src/workspace/WorkspaceProvider.tsx +0 -558
  1042. package/src/workspace/dnd/engine.ts +0 -371
  1043. package/src/workspace/dnd/hooks.ts +0 -72
  1044. package/src/workspace/dnd/index.ts +0 -57
  1045. package/src/workspace/dnd/parking.tsx +0 -181
  1046. package/src/workspace/extension-tabs.tsx +0 -174
  1047. package/src/workspace/frame-motion.ts +0 -160
  1048. package/src/workspace/headless/contents.ts +0 -125
  1049. package/src/workspace/headless/host.ts +0 -129
  1050. package/src/workspace/headless/index.ts +0 -33
  1051. package/src/workspace/headless/labels.ts +0 -44
  1052. package/src/workspace/headless/layout-memory.ts +0 -649
  1053. package/src/workspace/headless/layouts.ts +0 -224
  1054. package/src/workspace/headless/open-target.ts +0 -125
  1055. package/src/workspace/headless/ops.ts +0 -163
  1056. package/src/workspace/headless/panel-focus.ts +0 -58
  1057. package/src/workspace/headless/panel-tree.ts +0 -259
  1058. package/src/workspace/headless/resolve.ts +0 -146
  1059. package/src/workspace/headless/reveal-at.ts +0 -27
  1060. package/src/workspace/headless/strip-drop.ts +0 -81
  1061. package/src/workspace/headless/tree.ts +0 -480
  1062. package/src/workspace/headless/view.ts +0 -164
  1063. package/src/workspace/index.ts +0 -23
  1064. package/src/workspace/panel-group-keys.ts +0 -36
  1065. package/src/workspace/panel-visibility.ts +0 -28
  1066. package/src/workspace/tab-scopes.ts +0 -245
  1067. package/src/workspace/testing/contract.ts +0 -282
  1068. package/src/workspace/testing/index.ts +0 -140
  1069. package/src/workspace/use-split-drag.ts +0 -73
  1070. package/src/workspace/useScopeLayout.ts +0 -26
  1071. package/src/workspace/useViewport.ts +0 -22
  1072. package/src/workspace/useWorkspaceLabels.ts +0 -14
  1073. package/src/workspace/workspace-key-commands.ts +0 -108
  1074. /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
- }