zidane-ui 9.1.1 → 9.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1071) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/index.js +1 -1
  3. package/dist/adapters/server-transcript-members.d.ts +1 -1
  4. package/dist/adapters/server-transcript-members.js +19 -1
  5. package/dist/app/ModalProvider.d.ts +3 -1
  6. package/dist/app/ModalProvider.js +15 -9
  7. package/dist/approvals/headless/index.js +1 -1
  8. package/dist/chat/HostTranscript.d.ts +3 -1
  9. package/dist/chat/HostTranscript.js +5 -3
  10. package/dist/chat/Transcript.js +1 -1
  11. package/dist/chat/composer/ComposerEditor.js +1 -1
  12. package/dist/chat/composer/index.js +1 -1
  13. package/dist/chat/composer/use-composer-stores.js +1 -1
  14. package/dist/chat/headless/block-runs.d.ts +57 -0
  15. package/dist/chat/headless/block-runs.js +123 -0
  16. package/dist/chat/headless/composer/index.js +2 -2
  17. package/dist/chat/headless/fixture-transcript.d.ts +6 -1
  18. package/dist/chat/headless/fixture-transcript.js +49 -0
  19. package/dist/chat/headless/host.d.ts +3 -0
  20. package/dist/chat/headless/index.d.ts +2 -1
  21. package/dist/chat/headless/index.js +12 -11
  22. package/dist/chat/headless/labels.d.ts +42 -0
  23. package/dist/chat/headless/labels.js +42 -0
  24. package/dist/chat/headless/session-list.d.ts +27 -0
  25. package/dist/chat/headless/sidebar/index.js +1 -1
  26. package/dist/chat/headless/sidebar/labels.d.ts +27 -0
  27. package/dist/chat/headless/streams/index.js +1 -1
  28. package/dist/chat/headless/streams/live-events.js +2 -1
  29. package/dist/chat/headless/streams/session-streams.js +2 -2
  30. package/dist/chat/headless/streams/store.js +2 -2
  31. package/dist/chat/headless/transcript/batch.d.ts +21 -1
  32. package/dist/chat/headless/transcript/batch.js +55 -10
  33. package/dist/chat/headless/transcript/collapse.js +18 -3
  34. package/dist/chat/headless/transcript/fold.js +26 -10
  35. package/dist/chat/headless/transcript/index.js +1 -1
  36. package/dist/chat/headless/transcript/rows.d.ts +7 -1
  37. package/dist/chat/index.d.ts +6 -1
  38. package/dist/chat/index.js +7 -2
  39. package/dist/chat/testing/contract.d.ts +6 -1
  40. package/dist/chat/testing/contract.js +30 -3
  41. package/dist/chat/transcript/AnsiText.d.ts +27 -0
  42. package/dist/chat/transcript/AnsiText.js +73 -0
  43. package/dist/chat/transcript/CodemodeScript.d.ts +33 -0
  44. package/dist/chat/transcript/CodemodeScript.js +212 -0
  45. package/dist/chat/transcript/LiveOutput.d.ts +21 -0
  46. package/dist/chat/transcript/LiveOutput.js +42 -0
  47. package/dist/chat/transcript/TranscriptRow.js +19 -2
  48. package/dist/chat/transcript/actions.d.ts +6 -0
  49. package/dist/chat/transcript/index.d.ts +6 -1
  50. package/dist/chat/transcript/index.js +6 -1
  51. package/dist/chat/transcript/markdown.js +9 -0
  52. package/dist/chat/transcript/renderers.d.ts +7 -0
  53. package/dist/chat/transcript/script-input.d.ts +17 -0
  54. package/dist/chat/transcript/script-input.js +16 -0
  55. package/dist/chat/transcript/shell-block-scope.d.ts +29 -0
  56. package/dist/chat/transcript/shell-block-scope.js +18 -0
  57. package/dist/chat/transcript/shell-block.d.ts +27 -0
  58. package/dist/chat/transcript/shell-block.js +306 -0
  59. package/dist/chat/transcript/tool-parts.d.ts +18 -6
  60. package/dist/chat/transcript/tool-parts.js +15 -5
  61. package/dist/chat/transcript/tool-payload.js +6 -3
  62. package/dist/chat/transcript/tool-row.js +155 -96
  63. package/dist/chat/transcript/user-bash.js +3 -2
  64. package/dist/code/HighlightedCode.js +3 -69
  65. package/dist/code/highlight-lines.d.ts +24 -0
  66. package/dist/code/highlight-lines.js +41 -0
  67. package/dist/code/use-highlighted-html.d.ts +5 -0
  68. package/dist/code/use-highlighted-html.js +75 -0
  69. package/dist/core.css +6 -2
  70. package/dist/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +101 -3
  71. package/dist/extensions/ExtensionSettingsSidebar.js +19 -3
  72. package/dist/extensions/kit.d.ts +1 -1
  73. package/dist/git/BranchMenu.d.ts +1 -7
  74. package/dist/git/BranchMenu.js +17 -40
  75. package/dist/git/headless/labels.d.ts +0 -2
  76. package/dist/git/headless/labels.js +0 -2
  77. package/dist/index.d.ts +4 -3
  78. package/dist/index.js +2 -1
  79. package/dist/onboarding/index.js +1 -1
  80. package/dist/onboarding/steps/ConnectStep.js +1 -1
  81. package/dist/onboarding/steps/ExtensionsStep.js +1 -1
  82. package/dist/onboarding/steps/ReadyStep.js +1 -1
  83. package/dist/onboarding/steps/connect/ProviderPanel.js +1 -1
  84. package/dist/session/headless/index.js +2 -2
  85. package/dist/settings/SettingsShell.d.ts +3 -1
  86. package/dist/settings/SettingsShell.js +15 -8
  87. package/dist/settings/headless/catalog.js +5 -0
  88. package/dist/settings/headless/layout.js +2 -1
  89. package/dist/settings/headless/registry.d.ts +2 -0
  90. package/dist/settings/headless/search.d.ts +1 -1
  91. package/dist/settings/sections/environments/EnvironmentsSection.js +1 -1
  92. package/dist/settings/sections/extensions/ExtensionsSection.js +2 -2
  93. package/dist/settings/sections/models/ModelRows.js +1 -1
  94. package/dist/settings/sections/models/model-test.js +1 -1
  95. package/dist/styles.css +291 -2
  96. package/dist/terminal/TerminalProvider.d.ts +3 -1
  97. package/dist/terminal/TerminalProvider.js +5 -1
  98. package/dist/terminal/headless/store.d.ts +10 -0
  99. package/dist/terminal/headless/store.js +16 -0
  100. package/dist/terminal/index.d.ts +2 -2
  101. package/dist/terminal/index.js +2 -2
  102. package/dist/theme/runtime-icons.d.ts +50 -0
  103. package/dist/theme/runtime-icons.js +95 -0
  104. package/package.json +3 -6
  105. package/src/styles/primitives.css +5 -2
  106. package/src/styles/transcript.css +281 -0
  107. package/src/adapters/browser-appearance-host.ts +0 -51
  108. package/src/adapters/browser-keybindings-host.ts +0 -48
  109. package/src/adapters/browser-workspace-host.ts +0 -92
  110. package/src/adapters/closable-client.ts +0 -34
  111. package/src/adapters/extension-modules.ts +0 -360
  112. package/src/adapters/index.ts +0 -35
  113. package/src/adapters/live-events.ts +0 -6
  114. package/src/adapters/live.ts +0 -270
  115. package/src/adapters/run-host.ts +0 -238
  116. package/src/adapters/server-approvals-host.ts +0 -102
  117. package/src/adapters/server-client.ts +0 -15
  118. package/src/adapters/server-composer-host.ts +0 -459
  119. package/src/adapters/server-extensions-host.ts +0 -979
  120. package/src/adapters/server-files-host.ts +0 -287
  121. package/src/adapters/server-git-host.ts +0 -289
  122. package/src/adapters/server-host.ts +0 -489
  123. package/src/adapters/server-machines-host.ts +0 -283
  124. package/src/adapters/server-oauth-flow.ts +0 -133
  125. package/src/adapters/server-onboarding-host.ts +0 -363
  126. package/src/adapters/server-palette-host.ts +0 -134
  127. package/src/adapters/server-session-host.ts +0 -241
  128. package/src/adapters/server-settings-accounts.ts +0 -212
  129. package/src/adapters/server-settings-host.ts +0 -120
  130. package/src/adapters/server-settings-models.ts +0 -46
  131. package/src/adapters/server-settings-performance.ts +0 -58
  132. package/src/adapters/server-settings-sections.ts +0 -222
  133. package/src/adapters/server-sidebar-host.ts +0 -59
  134. package/src/adapters/server-terminal-host.ts +0 -124
  135. package/src/adapters/server-transcript-members.ts +0 -131
  136. package/src/adapters/sse-host.ts +0 -264
  137. package/src/adapters/sse-parser.ts +0 -82
  138. package/src/adapters/sse-protocol.ts +0 -118
  139. package/src/adapters/stream-pacer.ts +0 -122
  140. package/src/adapters/worker-host.ts +0 -192
  141. package/src/adapters/worker-protocol.ts +0 -97
  142. package/src/app/AppHostProvider.tsx +0 -135
  143. package/src/app/ModalProvider.tsx +0 -731
  144. package/src/app/headless/app-host.ts +0 -61
  145. package/src/app/headless/index.ts +0 -6
  146. package/src/app/headless/resource.ts +0 -444
  147. package/src/app/index.ts +0 -9
  148. package/src/app/testing/index.ts +0 -90
  149. package/src/app/useConfirm.tsx +0 -65
  150. package/src/app/useResource.ts +0 -30
  151. package/src/appearance/AppearanceProvider.tsx +0 -383
  152. package/src/appearance/apply.ts +0 -69
  153. package/src/appearance/headless/fixture-host.ts +0 -111
  154. package/src/appearance/headless/fonts.ts +0 -224
  155. package/src/appearance/headless/host.ts +0 -65
  156. package/src/appearance/headless/index.ts +0 -12
  157. package/src/appearance/headless/prefs.ts +0 -252
  158. package/src/appearance/headless/storage.ts +0 -127
  159. package/src/appearance/headless/zoom-commands.ts +0 -21
  160. package/src/appearance/index.ts +0 -11
  161. package/src/appearance/testing/contract.ts +0 -210
  162. package/src/appearance/testing/index.ts +0 -6
  163. package/src/approvals/ApprovalBar.tsx +0 -234
  164. package/src/approvals/ApprovalConcern.tsx +0 -33
  165. package/src/approvals/ApprovalShell.tsx +0 -69
  166. package/src/approvals/ApprovalsProvider.tsx +0 -110
  167. package/src/approvals/FileEditApproval.tsx +0 -310
  168. package/src/approvals/HunkPreviews.tsx +0 -225
  169. package/src/approvals/SafelistPanel.tsx +0 -149
  170. package/src/approvals/headless/fixture-host.ts +0 -73
  171. package/src/approvals/headless/fixtures.ts +0 -86
  172. package/src/approvals/headless/heads.ts +0 -81
  173. package/src/approvals/headless/host.ts +0 -80
  174. package/src/approvals/headless/index.ts +0 -12
  175. package/src/approvals/headless/labels.ts +0 -67
  176. package/src/approvals/headless/pending.ts +0 -91
  177. package/src/approvals/headless/preview.ts +0 -94
  178. package/src/approvals/headless/safelist.ts +0 -63
  179. package/src/approvals/index.ts +0 -13
  180. package/src/approvals/key-scope.ts +0 -33
  181. package/src/approvals/testing/contract.ts +0 -230
  182. package/src/approvals/testing/index.ts +0 -7
  183. package/src/brands/marks.ts +0 -298
  184. package/src/chat/ChatProvider.tsx +0 -60
  185. package/src/chat/DaemonOrb.tsx +0 -107
  186. package/src/chat/HostBadge.tsx +0 -71
  187. package/src/chat/HostStatusDot.tsx +0 -53
  188. package/src/chat/HostTranscript.tsx +0 -101
  189. package/src/chat/PdfPreview.tsx +0 -65
  190. package/src/chat/RunEstimateChip.tsx +0 -168
  191. package/src/chat/SessionFilterMenu.tsx +0 -397
  192. package/src/chat/SessionGroupHeader.tsx +0 -177
  193. package/src/chat/SessionHostHeader.tsx +0 -66
  194. package/src/chat/SessionList.tsx +0 -413
  195. package/src/chat/SessionListRow.tsx +0 -296
  196. package/src/chat/SessionStreamsProvider.tsx +0 -253
  197. package/src/chat/StatusDot.tsx +0 -128
  198. package/src/chat/TextPreview.tsx +0 -121
  199. package/src/chat/Throbber.tsx +0 -270
  200. package/src/chat/Transcript.tsx +0 -523
  201. package/src/chat/composer/AgentPicker.tsx +0 -155
  202. package/src/chat/composer/AgentPickerDialog.tsx +0 -99
  203. package/src/chat/composer/ApprovalDock.tsx +0 -64
  204. package/src/chat/composer/ArchivedBanner.tsx +0 -44
  205. package/src/chat/composer/AttachmentTiles.tsx +0 -211
  206. package/src/chat/composer/Composer.tsx +0 -500
  207. package/src/chat/composer/ComposerBadges.tsx +0 -339
  208. package/src/chat/composer/ComposerControls.tsx +0 -243
  209. package/src/chat/composer/ComposerEditor.tsx +0 -101
  210. package/src/chat/composer/ComposerHostProvider.tsx +0 -46
  211. package/src/chat/composer/ComposerShell.tsx +0 -129
  212. package/src/chat/composer/ContextBreakdown.tsx +0 -382
  213. package/src/chat/composer/ContextOrb.tsx +0 -176
  214. package/src/chat/composer/ConversationBadges.tsx +0 -168
  215. package/src/chat/composer/DockCard.tsx +0 -126
  216. package/src/chat/composer/EffortPickerDialog.tsx +0 -184
  217. package/src/chat/composer/HostComposer.tsx +0 -135
  218. package/src/chat/composer/HostContextOrb.tsx +0 -94
  219. package/src/chat/composer/HostModelChainList.tsx +0 -102
  220. package/src/chat/composer/HostPicker.tsx +0 -97
  221. package/src/chat/composer/HostPickers.tsx +0 -320
  222. package/src/chat/composer/ImageModelList.tsx +0 -151
  223. package/src/chat/composer/ModelChainList.tsx +0 -442
  224. package/src/chat/composer/ModelChainParts.tsx +0 -247
  225. package/src/chat/composer/ModelChainRow.tsx +0 -191
  226. package/src/chat/composer/ModelChainRows.tsx +0 -223
  227. package/src/chat/composer/ModelChainTooltip.tsx +0 -121
  228. package/src/chat/composer/ModelFacts.tsx +0 -204
  229. package/src/chat/composer/ModelOptionsPicker.tsx +0 -257
  230. package/src/chat/composer/ModelPicker.tsx +0 -513
  231. package/src/chat/composer/ModelPickerDialog.tsx +0 -99
  232. package/src/chat/composer/ModelProviderPills.tsx +0 -141
  233. package/src/chat/composer/PickerPill.tsx +0 -41
  234. package/src/chat/composer/ProjectMenu.tsx +0 -187
  235. package/src/chat/composer/PromptHistoryProvider.tsx +0 -214
  236. package/src/chat/composer/RetryPill.tsx +0 -47
  237. package/src/chat/composer/RunStatusChip.tsx +0 -150
  238. package/src/chat/composer/ScopeToggle.tsx +0 -94
  239. package/src/chat/composer/SelectTurnHint.tsx +0 -40
  240. package/src/chat/composer/SendButton.tsx +0 -89
  241. package/src/chat/composer/ServerScopeToggle.tsx +0 -188
  242. package/src/chat/composer/attachment-ingest.ts +0 -413
  243. package/src/chat/composer/attachments.tsx +0 -176
  244. package/src/chat/composer/badge-order.ts +0 -65
  245. package/src/chat/composer/composer-bus.ts +0 -317
  246. package/src/chat/composer/index.ts +0 -63
  247. package/src/chat/composer/load-composer-editor.ts +0 -25
  248. package/src/chat/composer/model-catalog.ts +0 -424
  249. package/src/chat/composer/model-list-layout.ts +0 -118
  250. package/src/chat/composer/prompt-history-nav.ts +0 -60
  251. package/src/chat/composer/scope-side.ts +0 -7
  252. package/src/chat/composer/suggestion-extension.ts +0 -113
  253. package/src/chat/composer/suggestions.tsx +0 -115
  254. package/src/chat/composer/use-agent-profiles.ts +0 -97
  255. package/src/chat/composer/use-cache-hints.ts +0 -93
  256. package/src/chat/composer/use-composer-stores.ts +0 -140
  257. package/src/chat/composer/use-draft-target.ts +0 -317
  258. package/src/chat/composer/use-new-session-defaults.ts +0 -201
  259. package/src/chat/composer/use-provider-ready-poll.ts +0 -35
  260. package/src/chat/composer/use-run-meter.ts +0 -140
  261. package/src/chat/composer/use-send-prompt.ts +0 -188
  262. package/src/chat/composer/use-session-meters.ts +0 -109
  263. package/src/chat/composer/use-sustained-work.ts +0 -74
  264. package/src/chat/composer/useAttachmentIngest.ts +0 -116
  265. package/src/chat/composer/useModelListSpy.ts +0 -19
  266. package/src/chat/headless/badge-refs.ts +0 -76
  267. package/src/chat/headless/chip-labels.ts +0 -40
  268. package/src/chat/headless/chip-settle.ts +0 -53
  269. package/src/chat/headless/chip-views.ts +0 -215
  270. package/src/chat/headless/composer/attachment-dedupe.ts +0 -50
  271. package/src/chat/headless/composer/commands.ts +0 -16
  272. package/src/chat/headless/composer/composer-sources.ts +0 -150
  273. package/src/chat/headless/composer/conversation-badges.ts +0 -227
  274. package/src/chat/headless/composer/draft-sync.ts +0 -199
  275. package/src/chat/headless/composer/editor-markdown.ts +0 -137
  276. package/src/chat/headless/composer/ghost-autocomplete.ts +0 -381
  277. package/src/chat/headless/composer/host-chrome.ts +0 -197
  278. package/src/chat/headless/composer/host.ts +0 -250
  279. package/src/chat/headless/composer/index.ts +0 -17
  280. package/src/chat/headless/composer/labels-chrome.ts +0 -83
  281. package/src/chat/headless/composer/labels-editor.ts +0 -44
  282. package/src/chat/headless/composer/labels.ts +0 -18
  283. package/src/chat/headless/composer/live-cost.ts +0 -67
  284. package/src/chat/headless/composer/model-knobs.ts +0 -179
  285. package/src/chat/headless/composer/model-names.ts +0 -145
  286. package/src/chat/headless/composer/model-picker-prefs.ts +0 -90
  287. package/src/chat/headless/composer/models.ts +0 -86
  288. package/src/chat/headless/composer/new-session-defaults.ts +0 -68
  289. package/src/chat/headless/composer/prompt-suggestions.ts +0 -72
  290. package/src/chat/headless/composer/remember-model-pick.ts +0 -132
  291. package/src/chat/headless/composer/run-meter.ts +0 -228
  292. package/src/chat/headless/composer-modes.ts +0 -170
  293. package/src/chat/headless/draft-scope.ts +0 -136
  294. package/src/chat/headless/draft-target.ts +0 -87
  295. package/src/chat/headless/extension-sources.ts +0 -64
  296. package/src/chat/headless/file-chip.ts +0 -175
  297. package/src/chat/headless/fixture-host.ts +0 -294
  298. package/src/chat/headless/fixture-transcript.ts +0 -125
  299. package/src/chat/headless/fixtures/demo-transcript-all-kinds.ts +0 -233
  300. package/src/chat/headless/fixtures/demo-transcript.ts +0 -244
  301. package/src/chat/headless/host.ts +0 -264
  302. package/src/chat/headless/hosts.ts +0 -55
  303. package/src/chat/headless/index.ts +0 -31
  304. package/src/chat/headless/labels.ts +0 -373
  305. package/src/chat/headless/markdown-chunks.ts +0 -134
  306. package/src/chat/headless/path-resolver.ts +0 -178
  307. package/src/chat/headless/prompt-origin.ts +0 -90
  308. package/src/chat/headless/reference-store.ts +0 -285
  309. package/src/chat/headless/send-flow.ts +0 -347
  310. package/src/chat/headless/session-list.ts +0 -400
  311. package/src/chat/headless/sidebar/activity.ts +0 -179
  312. package/src/chat/headless/sidebar/badges.ts +0 -190
  313. package/src/chat/headless/sidebar/compaction.ts +0 -98
  314. package/src/chat/headless/sidebar/directory.ts +0 -1046
  315. package/src/chat/headless/sidebar/dot-state.ts +0 -36
  316. package/src/chat/headless/sidebar/environment.ts +0 -70
  317. package/src/chat/headless/sidebar/estimates.ts +0 -146
  318. package/src/chat/headless/sidebar/host.ts +0 -41
  319. package/src/chat/headless/sidebar/index.ts +0 -18
  320. package/src/chat/headless/sidebar/labels.ts +0 -161
  321. package/src/chat/headless/sidebar/notifications.ts +0 -61
  322. package/src/chat/headless/sidebar/pinned-projects.ts +0 -51
  323. package/src/chat/headless/sidebar/pinned-sessions.ts +0 -27
  324. package/src/chat/headless/sidebar/project-icons.ts +0 -116
  325. package/src/chat/headless/sidebar/query.ts +0 -621
  326. package/src/chat/headless/sidebar/rows.ts +0 -427
  327. package/src/chat/headless/sidebar/types.ts +0 -96
  328. package/src/chat/headless/sidebar/view.ts +0 -367
  329. package/src/chat/headless/site-icons.ts +0 -51
  330. package/src/chat/headless/smooth-stream.ts +0 -76
  331. package/src/chat/headless/store.ts +0 -62
  332. package/src/chat/headless/streams/actions.ts +0 -85
  333. package/src/chat/headless/streams/index.ts +0 -25
  334. package/src/chat/headless/streams/live-events.ts +0 -124
  335. package/src/chat/headless/streams/merge.ts +0 -60
  336. package/src/chat/headless/streams/pacer.ts +0 -189
  337. package/src/chat/headless/streams/prompt-previews.ts +0 -64
  338. package/src/chat/headless/streams/scheduler.ts +0 -36
  339. package/src/chat/headless/streams/selectors.ts +0 -76
  340. package/src/chat/headless/streams/session-streams.ts +0 -407
  341. package/src/chat/headless/streams/store.ts +0 -1107
  342. package/src/chat/headless/streams/transcript.ts +0 -41
  343. package/src/chat/headless/streams/types.ts +0 -84
  344. package/src/chat/headless/transcript/batch.ts +0 -429
  345. package/src/chat/headless/transcript/collapse.ts +0 -789
  346. package/src/chat/headless/transcript/fold-actions.ts +0 -269
  347. package/src/chat/headless/transcript/fold-attachments.ts +0 -78
  348. package/src/chat/headless/transcript/fold.ts +0 -382
  349. package/src/chat/headless/transcript/index.ts +0 -41
  350. package/src/chat/headless/transcript/nesting.ts +0 -73
  351. package/src/chat/headless/transcript/pairing.ts +0 -124
  352. package/src/chat/headless/transcript/rows.ts +0 -377
  353. package/src/chat/headless/transcript/run-failures.ts +0 -72
  354. package/src/chat/headless/transcript/select-stops.ts +0 -151
  355. package/src/chat/headless/transcript/tool-media.ts +0 -42
  356. package/src/chat/headless/transcript-host.ts +0 -180
  357. package/src/chat/headless/transcript-labels.ts +0 -12
  358. package/src/chat/headless/turn-labels.ts +0 -28
  359. package/src/chat/headless/turn-prompt.ts +0 -32
  360. package/src/chat/index.ts +0 -31
  361. package/src/chat/interactions/HostInteractions.tsx +0 -76
  362. package/src/chat/interactions/InboxPanel.tsx +0 -226
  363. package/src/chat/interactions/InteractionCard.tsx +0 -111
  364. package/src/chat/interactions/PlanCard.tsx +0 -186
  365. package/src/chat/interactions/QuestionField.tsx +0 -336
  366. package/src/chat/interactions/QuestionForm.tsx +0 -283
  367. package/src/chat/interactions/card-ui.tsx +0 -86
  368. package/src/chat/interactions/hooks.ts +0 -49
  369. package/src/chat/interactions/index.ts +0 -8
  370. package/src/chat/provider-color.ts +0 -71
  371. package/src/chat/rich-composer/MentionList.tsx +0 -238
  372. package/src/chat/rich-composer/RichComposer.tsx +0 -1071
  373. package/src/chat/rich-composer/badge-decorations.ts +0 -157
  374. package/src/chat/rich-composer/composer-controls.tsx +0 -102
  375. package/src/chat/rich-composer/composer-extensions.ts +0 -388
  376. package/src/chat/rich-composer/composer-keys.ts +0 -416
  377. package/src/chat/rich-composer/ghost-plugin.ts +0 -89
  378. package/src/chat/rich-composer/index.ts +0 -3
  379. package/src/chat/rich-composer/mention-popover.ts +0 -336
  380. package/src/chat/rich-composer/slash-completion.ts +0 -143
  381. package/src/chat/rich-composer/use-composer-bus.ts +0 -57
  382. package/src/chat/rich-composer/use-composer-editor.ts +0 -216
  383. package/src/chat/rich-composer/use-composer-sources.ts +0 -90
  384. package/src/chat/rich-composer/use-draft-mirror.ts +0 -398
  385. package/src/chat/rich-composer/use-editor-handover.ts +0 -45
  386. package/src/chat/rich-composer/use-extension-composer.ts +0 -80
  387. package/src/chat/rich-composer/use-ghost-lifecycle.ts +0 -265
  388. package/src/chat/rich-composer/use-prompt-ghost.ts +0 -90
  389. package/src/chat/rich-composer/use-staged-attachments.ts +0 -65
  390. package/src/chat/sidebar/MainSessionRow.tsx +0 -102
  391. package/src/chat/sidebar/ProjectIcon.tsx +0 -399
  392. package/src/chat/sidebar/RowChips.tsx +0 -98
  393. package/src/chat/sidebar/SessionSidebar.tsx +0 -1039
  394. package/src/chat/sidebar/SidebarDecoration.tsx +0 -93
  395. package/src/chat/sidebar/SidebarFilterMenu.tsx +0 -270
  396. package/src/chat/sidebar/SidebarFooter.tsx +0 -244
  397. package/src/chat/sidebar/SidebarFrame.tsx +0 -154
  398. package/src/chat/sidebar/SidebarGroupHeader.tsx +0 -263
  399. package/src/chat/sidebar/SidebarHostProvider.tsx +0 -51
  400. package/src/chat/sidebar/SidebarRowView.tsx +0 -151
  401. package/src/chat/sidebar/SidebarSearchRow.tsx +0 -66
  402. package/src/chat/sidebar/SidebarSessionRow.tsx +0 -317
  403. package/src/chat/sidebar/SidebarToggleButton.tsx +0 -48
  404. package/src/chat/sidebar/SpaceSwitcher.tsx +0 -341
  405. package/src/chat/sidebar/SpacesSection.tsx +0 -259
  406. package/src/chat/sidebar/collapsed.ts +0 -61
  407. package/src/chat/sidebar/index.ts +0 -109
  408. package/src/chat/sidebar/session-menu.ts +0 -441
  409. package/src/chat/sidebar/sidebar-focus-hold.ts +0 -56
  410. package/src/chat/sidebar/sidebar-live.tsx +0 -666
  411. package/src/chat/sidebar/use-main-session.ts +0 -32
  412. package/src/chat/sidebar/useAgentNames.ts +0 -12
  413. package/src/chat/sidebar/useCompactionProgress.ts +0 -24
  414. package/src/chat/sidebar/usePinnedProjects.ts +0 -36
  415. package/src/chat/sidebar/useSaveViewAsSpace.ts +0 -42
  416. package/src/chat/sidebar/useSessionActivity.ts +0 -24
  417. package/src/chat/sidebar/useSessionBadges.ts +0 -26
  418. package/src/chat/sidebar/useSessionDirectoryView.ts +0 -128
  419. package/src/chat/sidebar/useSessionSearch.ts +0 -94
  420. package/src/chat/sidebar/useSidebarKeyboardNav.ts +0 -167
  421. package/src/chat/sidebar/useSidebarLabels.ts +0 -10
  422. package/src/chat/testing/composer.contract.ts +0 -508
  423. package/src/chat/testing/contract.ts +0 -634
  424. package/src/chat/testing/fixture-composer-chrome.ts +0 -159
  425. package/src/chat/testing/fixture-composer-host.ts +0 -147
  426. package/src/chat/testing/fixture-sidebar-host.ts +0 -99
  427. package/src/chat/testing/index.ts +0 -12
  428. package/src/chat/testing/sidebar.contract.ts +0 -196
  429. package/src/chat/transcript/BadgeMenu.tsx +0 -241
  430. package/src/chat/transcript/CardMarkdown.tsx +0 -102
  431. package/src/chat/transcript/ChipCard.tsx +0 -187
  432. package/src/chat/transcript/ChipCards.tsx +0 -100
  433. package/src/chat/transcript/DiffLines.tsx +0 -122
  434. package/src/chat/transcript/EarlierHistory.tsx +0 -136
  435. package/src/chat/transcript/EditDiffBlock.tsx +0 -176
  436. package/src/chat/transcript/FileChip.tsx +0 -361
  437. package/src/chat/transcript/ImageGenerationBlock.tsx +0 -239
  438. package/src/chat/transcript/InlineChipText.tsx +0 -57
  439. package/src/chat/transcript/InteractionToolBody.tsx +0 -211
  440. package/src/chat/transcript/LazyRow.tsx +0 -311
  441. package/src/chat/transcript/MermaidDiagram.tsx +0 -484
  442. package/src/chat/transcript/PromptEcho.tsx +0 -171
  443. package/src/chat/transcript/PromptOriginLabel.tsx +0 -44
  444. package/src/chat/transcript/ProseMarkdown.tsx +0 -168
  445. package/src/chat/transcript/ReferenceText.tsx +0 -198
  446. package/src/chat/transcript/SelectCursor.tsx +0 -118
  447. package/src/chat/transcript/SelectTurnHint.tsx +0 -81
  448. package/src/chat/transcript/SelectTurnProvider.tsx +0 -150
  449. package/src/chat/transcript/SubagentBlock.tsx +0 -224
  450. package/src/chat/transcript/TranscriptRow.tsx +0 -362
  451. package/src/chat/transcript/TranscriptSearch.tsx +0 -171
  452. package/src/chat/transcript/TurnMenu.tsx +0 -217
  453. package/src/chat/transcript/actions.tsx +0 -77
  454. package/src/chat/transcript/badges.tsx +0 -155
  455. package/src/chat/transcript/chip-details.ts +0 -169
  456. package/src/chat/transcript/chip-resolve.ts +0 -56
  457. package/src/chat/transcript/extension-renderers.tsx +0 -148
  458. package/src/chat/transcript/fold-attachments.tsx +0 -221
  459. package/src/chat/transcript/fold-status.tsx +0 -112
  460. package/src/chat/transcript/fold-worker.tsx +0 -160
  461. package/src/chat/transcript/fold.tsx +0 -522
  462. package/src/chat/transcript/frame.tsx +0 -326
  463. package/src/chat/transcript/index.ts +0 -66
  464. package/src/chat/transcript/markdown-cache.ts +0 -84
  465. package/src/chat/transcript/markdown-context.ts +0 -52
  466. package/src/chat/transcript/markdown.tsx +0 -351
  467. package/src/chat/transcript/messages.tsx +0 -169
  468. package/src/chat/transcript/notices.tsx +0 -508
  469. package/src/chat/transcript/prompt-lines.tsx +0 -55
  470. package/src/chat/transcript/prompt.tsx +0 -258
  471. package/src/chat/transcript/prose.tsx +0 -171
  472. package/src/chat/transcript/recent-map.ts +0 -32
  473. package/src/chat/transcript/references.ts +0 -108
  474. package/src/chat/transcript/remark-references.ts +0 -157
  475. package/src/chat/transcript/remark-refs.ts +0 -176
  476. package/src/chat/transcript/renderer-slots.tsx +0 -35
  477. package/src/chat/transcript/renderers.tsx +0 -251
  478. package/src/chat/transcript/row-estimate.ts +0 -158
  479. package/src/chat/transcript/run-rows.tsx +0 -291
  480. package/src/chat/transcript/site-icons.ts +0 -27
  481. package/src/chat/transcript/thumbnails.ts +0 -146
  482. package/src/chat/transcript/tool-batch.tsx +0 -102
  483. package/src/chat/transcript/tool-details.tsx +0 -31
  484. package/src/chat/transcript/tool-media.tsx +0 -132
  485. package/src/chat/transcript/tool-parts.tsx +0 -358
  486. package/src/chat/transcript/tool-payload.tsx +0 -76
  487. package/src/chat/transcript/tool-row.tsx +0 -496
  488. package/src/chat/transcript/turn-commands.ts +0 -101
  489. package/src/chat/transcript/use-transcript-rows.ts +0 -195
  490. package/src/chat/transcript/useComposerSearch.ts +0 -106
  491. package/src/chat/transcript/useSelectTurnKeys.ts +0 -204
  492. package/src/chat/transcript/useSettledReveal.ts +0 -57
  493. package/src/chat/transcript/useStickToBottom.ts +0 -600
  494. package/src/chat/transcript/useTranscriptFind.ts +0 -70
  495. package/src/chat/transcript/useTranscriptFindKey.ts +0 -52
  496. package/src/chat/transcript/useTranscriptScroll.ts +0 -163
  497. package/src/chat/transcript/useTranscriptSearch.tsx +0 -382
  498. package/src/chat/transcript/useTranscriptSelectionCopy.ts +0 -63
  499. package/src/chat/transcript/useWheelHoverPause.ts +0 -79
  500. package/src/chat/transcript/user-bash.tsx +0 -134
  501. package/src/chat/transcript-options.ts +0 -51
  502. package/src/chat/useChatLabels.ts +0 -14
  503. package/src/code/CodeHighlightProvider.tsx +0 -87
  504. package/src/code/HighlightedCode.tsx +0 -156
  505. package/src/code/code-themes.ts +0 -187
  506. package/src/code/editor/CodeCompletion.tsx +0 -719
  507. package/src/code/editor/CodeEditor.tsx +0 -480
  508. package/src/code/editor/CodeHover.tsx +0 -429
  509. package/src/code/editor/DiagnosticAnnotation.tsx +0 -73
  510. package/src/code/editor/DiagnosticsChip.tsx +0 -85
  511. package/src/code/editor/DiffView.tsx +0 -197
  512. package/src/code/editor/EditorColumn.tsx +0 -256
  513. package/src/code/editor/FileIcon.tsx +0 -89
  514. package/src/code/editor/FileTabPill.tsx +0 -101
  515. package/src/code/editor/FileTree.tsx +0 -414
  516. package/src/code/editor/FileView.tsx +0 -462
  517. package/src/code/editor/HighlightWorkers.tsx +0 -84
  518. package/src/code/editor/LanguageEditor.tsx +0 -210
  519. package/src/code/editor/_vendor/tree-icon-colors.ts +0 -72
  520. package/src/code/editor/diagnostics.ts +0 -140
  521. package/src/code/editor/edit-session.ts +0 -32
  522. package/src/code/editor/environment.tsx +0 -88
  523. package/src/code/editor/find/FindBar.tsx +0 -126
  524. package/src/code/editor/find/find-highlight.ts +0 -138
  525. package/src/code/editor/find/find-model.ts +0 -123
  526. package/src/code/editor/find/settle-scroll.ts +0 -77
  527. package/src/code/editor/find/useFind.ts +0 -203
  528. package/src/code/editor/fs-adapter.ts +0 -37
  529. package/src/code/editor/index.ts +0 -36
  530. package/src/code/editor/language.ts +0 -31
  531. package/src/code/editor/patch-parse.ts +0 -176
  532. package/src/code/editor/patch-parse.worker.ts +0 -12
  533. package/src/code/editor/pierre-theme.ts +0 -155
  534. package/src/code/editor/prime-diff.ts +0 -37
  535. package/src/code/editor/reveal.ts +0 -58
  536. package/src/code/editor/scroll-reach.ts +0 -28
  537. package/src/code/editor/useCodeDocument.ts +0 -226
  538. package/src/code/editor/useDefinition.ts +0 -159
  539. package/src/code/editor/useDetachCleanup.ts +0 -36
  540. package/src/code/editor/useFileDocument.ts +0 -87
  541. package/src/code/editor/useRevealLine.ts +0 -92
  542. package/src/code/editor/word-at.ts +0 -145
  543. package/src/code/highlight.worker.ts +0 -16
  544. package/src/code/highlighter.ts +0 -181
  545. package/src/code/highlights.ts +0 -51
  546. package/src/code/mermaid-lexer.ts +0 -331
  547. package/src/code/shiki-theme.ts +0 -46
  548. package/src/components/BrandMark.tsx +0 -118
  549. package/src/components/Breadcrumb.tsx +0 -105
  550. package/src/components/BrowserChrome.tsx +0 -189
  551. package/src/components/BrowserSignIn.tsx +0 -210
  552. package/src/components/ChoiceCards.tsx +0 -170
  553. package/src/components/CodeFrame.tsx +0 -225
  554. package/src/components/ConfirmDialog.tsx +0 -119
  555. package/src/components/CopyButton.tsx +0 -85
  556. package/src/components/EditableTitle.tsx +0 -199
  557. package/src/components/ErrorBoundary.tsx +0 -208
  558. package/src/components/Form.tsx +0 -593
  559. package/src/components/Highlighted.tsx +0 -68
  560. package/src/components/HowItWorks.tsx +0 -123
  561. package/src/components/IconButton.tsx +0 -101
  562. package/src/components/IconToggle.tsx +0 -71
  563. package/src/components/Keycap.tsx +0 -334
  564. package/src/components/Lightbox.tsx +0 -257
  565. package/src/components/LoadError.tsx +0 -45
  566. package/src/components/MediaNav.tsx +0 -85
  567. package/src/components/Menu.tsx +0 -435
  568. package/src/components/Overlay.tsx +0 -327
  569. package/src/components/PanelEmpty.tsx +0 -80
  570. package/src/components/PanelRows.tsx +0 -107
  571. package/src/components/PreviewWindow.tsx +0 -53
  572. package/src/components/ReorderTabs.tsx +0 -103
  573. package/src/components/RowActionsMenu.tsx +0 -383
  574. package/src/components/SegmentSpinner.tsx +0 -88
  575. package/src/components/Segmented.tsx +0 -126
  576. package/src/components/StepFrame.tsx +0 -151
  577. package/src/components/Stepper.tsx +0 -157
  578. package/src/components/Surface.tsx +0 -191
  579. package/src/components/SwatchPicker.tsx +0 -147
  580. package/src/components/SwitchGlyph.tsx +0 -56
  581. package/src/components/TabPill.tsx +0 -188
  582. package/src/components/ThemeThumb.tsx +0 -52
  583. package/src/components/ToggleCard.tsx +0 -120
  584. package/src/components/Tooltip.tsx +0 -288
  585. package/src/components/ZoomableImage.tsx +0 -322
  586. package/src/components/button.ts +0 -120
  587. package/src/components/floating/FloatingSurface.tsx +0 -158
  588. package/src/components/floating/HoverCard.tsx +0 -143
  589. package/src/components/floating/Popover.tsx +0 -166
  590. package/src/components/floating/useAnchoredPosition.ts +0 -186
  591. package/src/components/floating/usePopover.ts +0 -158
  592. package/src/components/image-clipboard.ts +0 -70
  593. package/src/components/keyboard-layout.ts +0 -115
  594. package/src/components/palette/PaletteList.tsx +0 -432
  595. package/src/components/palette/PalettePanel.tsx +0 -338
  596. package/src/components/palette/palette-layout.ts +0 -86
  597. package/src/components/report-error.ts +0 -142
  598. package/src/components/zoom.ts +0 -133
  599. package/src/extensions/ExtensionComponent.tsx +0 -167
  600. package/src/extensions/ExtensionDialogHost.tsx +0 -445
  601. package/src/extensions/ExtensionRenderer.tsx +0 -100
  602. package/src/extensions/ExtensionScreen.tsx +0 -122
  603. package/src/extensions/ExtensionSettingsPage.tsx +0 -112
  604. package/src/extensions/ExtensionSettingsPages.tsx +0 -44
  605. package/src/extensions/ExtensionSettingsSidebar.tsx +0 -373
  606. package/src/extensions/ExtensionSlot.tsx +0 -213
  607. package/src/extensions/ExtensionWebview.tsx +0 -104
  608. package/src/extensions/ExtensionsProvider.tsx +0 -124
  609. package/src/extensions/SettingsWireForm.tsx +0 -182
  610. package/src/extensions/headless/dialog-queue.ts +0 -92
  611. package/src/extensions/headless/effect-channel.ts +0 -50
  612. package/src/extensions/headless/effect-router.ts +0 -107
  613. package/src/extensions/headless/fixture-host.ts +0 -381
  614. package/src/extensions/headless/host.ts +0 -398
  615. package/src/extensions/headless/index.ts +0 -17
  616. package/src/extensions/headless/labels.ts +0 -64
  617. package/src/extensions/headless/links.ts +0 -56
  618. package/src/extensions/headless/select.ts +0 -249
  619. package/src/extensions/headless/webview-bridge.ts +0 -127
  620. package/src/extensions/headless/wire.ts +0 -175
  621. package/src/extensions/hooks.ts +0 -209
  622. package/src/extensions/index.ts +0 -25
  623. package/src/extensions/kit.ts +0 -79
  624. package/src/extensions/links.tsx +0 -165
  625. package/src/extensions/testing/contract.ts +0 -382
  626. package/src/extensions/testing/index.ts +0 -6
  627. package/src/extensions/useExtensionsLabels.ts +0 -14
  628. package/src/files/CodeViewer.tsx +0 -289
  629. package/src/files/DiffFileViewer.tsx +0 -143
  630. package/src/files/DiffsTab.tsx +0 -581
  631. package/src/files/EditorColumn.tsx +0 -453
  632. package/src/files/EditorEnvironmentRoot.tsx +0 -63
  633. package/src/files/FilesDiagnosticsChip.tsx +0 -32
  634. package/src/files/FilesProvider.tsx +0 -58
  635. package/src/files/FilesTab.tsx +0 -441
  636. package/src/files/MediaDiff.tsx +0 -61
  637. package/src/files/MediaView.tsx +0 -170
  638. package/src/files/ReviewDraft.tsx +0 -88
  639. package/src/files/ReviewableDiff.tsx +0 -72
  640. package/src/files/SearchPanel.tsx +0 -325
  641. package/src/files/TreeColumn.tsx +0 -229
  642. package/src/files/code-excerpt.ts +0 -265
  643. package/src/files/code-menu.ts +0 -53
  644. package/src/files/drafts-store.ts +0 -192
  645. package/src/files/file-actions.ts +0 -152
  646. package/src/files/headless/editor-prefs.ts +0 -230
  647. package/src/files/headless/entries.ts +0 -172
  648. package/src/files/headless/fixture-host.ts +0 -260
  649. package/src/files/headless/host.ts +0 -387
  650. package/src/files/headless/index.ts +0 -14
  651. package/src/files/headless/labels.ts +0 -123
  652. package/src/files/headless/lsp-edits.ts +0 -58
  653. package/src/files/headless/media.ts +0 -57
  654. package/src/files/headless/name-match.ts +0 -38
  655. package/src/files/headless/search.ts +0 -23
  656. package/src/files/headless/view.ts +0 -114
  657. package/src/files/headless/workspace-diff.ts +0 -82
  658. package/src/files/index.ts +0 -25
  659. package/src/files/lazy-tabs.tsx +0 -41
  660. package/src/files/session-patch.ts +0 -45
  661. package/src/files/tab-hooks.ts +0 -37
  662. package/src/files/testing/contract.ts +0 -279
  663. package/src/files/testing/demo.ts +0 -36
  664. package/src/files/testing/index.ts +0 -7
  665. package/src/files/useCodeReview.tsx +0 -177
  666. package/src/files/useDiagnostics.ts +0 -59
  667. package/src/files/useDiagnosticsRun.ts +0 -86
  668. package/src/files/useEntryActions.ts +0 -280
  669. package/src/files/useFilesDiagnostics.ts +0 -51
  670. package/src/files/useFilesLabels.ts +0 -14
  671. package/src/files/useFolderChanges.ts +0 -38
  672. package/src/files/useLsp.ts +0 -181
  673. package/src/files/useOpenFiles.ts +0 -402
  674. package/src/files/useWorkspace.ts +0 -148
  675. package/src/files/working-tree-diff.ts +0 -142
  676. package/src/git/BranchMenu.tsx +0 -988
  677. package/src/git/GitBar.tsx +0 -297
  678. package/src/git/GitProvider.tsx +0 -50
  679. package/src/git/ImportRepoDialog.tsx +0 -390
  680. package/src/git/MoveSessionDialog.tsx +0 -396
  681. package/src/git/RemoteFolderPicker.tsx +0 -475
  682. package/src/git/SyncChip.tsx +0 -275
  683. package/src/git/WherePicker.tsx +0 -358
  684. package/src/git/headless/environment.ts +0 -132
  685. package/src/git/headless/host.ts +0 -353
  686. package/src/git/headless/index.ts +0 -14
  687. package/src/git/headless/labels.ts +0 -230
  688. package/src/git/headless/move.ts +0 -101
  689. package/src/git/headless/remote-clone.ts +0 -44
  690. package/src/git/headless/status-reads.ts +0 -77
  691. package/src/git/headless/switcher.ts +0 -215
  692. package/src/git/headless/sync.ts +0 -71
  693. package/src/git/index.ts +0 -17
  694. package/src/git/testing/contract.ts +0 -551
  695. package/src/git/testing/index.ts +0 -537
  696. package/src/git/useEnvironmentChoices.ts +0 -50
  697. package/src/git/useGitBar.ts +0 -180
  698. package/src/hooks/keyed-store.ts +0 -65
  699. package/src/hooks/useDisplayPath.tsx +0 -93
  700. package/src/hooks/useHydrated.ts +0 -16
  701. package/src/hooks/useMinuteTick.ts +0 -49
  702. package/src/hooks/useNearViewport.ts +0 -111
  703. package/src/hooks/usePersistedState.ts +0 -98
  704. package/src/hooks/useResizeDrag.ts +0 -240
  705. package/src/hooks/useTabDrag.ts +0 -88
  706. package/src/index.ts +0 -119
  707. package/src/keybindings/KeyCommands.tsx +0 -123
  708. package/src/keybindings/KeyHint.tsx +0 -78
  709. package/src/keybindings/KeybindingsProvider.tsx +0 -231
  710. package/src/keybindings/headless/catalog.ts +0 -360
  711. package/src/keybindings/headless/commands.ts +0 -77
  712. package/src/keybindings/headless/fixture-host.ts +0 -51
  713. package/src/keybindings/headless/host.ts +0 -29
  714. package/src/keybindings/headless/index.ts +0 -13
  715. package/src/keybindings/headless/key-scope.ts +0 -91
  716. package/src/keybindings/headless/labels.ts +0 -14
  717. package/src/keybindings/headless/overrides.ts +0 -64
  718. package/src/keybindings/index.ts +0 -15
  719. package/src/keybindings/load-once.ts +0 -11
  720. package/src/keybindings/match.ts +0 -48
  721. package/src/keybindings/press.ts +0 -80
  722. package/src/keybindings/testing/contract.ts +0 -139
  723. package/src/keybindings/testing/index.ts +0 -6
  724. package/src/keybindings/useHelpKey.ts +0 -35
  725. package/src/keybindings/useKeybindingsLabels.ts +0 -14
  726. package/src/labels.tsx +0 -175
  727. package/src/machines/AddServerForm.tsx +0 -151
  728. package/src/machines/Banners.tsx +0 -172
  729. package/src/machines/DaemonMenu.tsx +0 -413
  730. package/src/machines/HostCapabilities.tsx +0 -245
  731. package/src/machines/HostSignIn.tsx +0 -63
  732. package/src/machines/HostSyncPanel.tsx +0 -275
  733. package/src/machines/HostsSection.tsx +0 -312
  734. package/src/machines/MachinesProvider.tsx +0 -164
  735. package/src/machines/ServerCard.tsx +0 -347
  736. package/src/machines/ServerMachinesPanel.tsx +0 -547
  737. package/src/machines/ServerUpdatePanel.tsx +0 -160
  738. package/src/machines/SyncAccounts.tsx +0 -148
  739. package/src/machines/SyncMarker.tsx +0 -87
  740. package/src/machines/SyncOutcomeBadge.tsx +0 -84
  741. package/src/machines/TokensPanel.tsx +0 -249
  742. package/src/machines/headless/fixture-host.ts +0 -519
  743. package/src/machines/headless/fixtures.ts +0 -164
  744. package/src/machines/headless/host.ts +0 -381
  745. package/src/machines/headless/index.ts +0 -13
  746. package/src/machines/headless/labels.ts +0 -364
  747. package/src/machines/headless/messages.ts +0 -209
  748. package/src/machines/headless/presence.ts +0 -110
  749. package/src/machines/headless/settings-focus.ts +0 -25
  750. package/src/machines/headless/stores.ts +0 -137
  751. package/src/machines/headless/sync.ts +0 -207
  752. package/src/machines/index.ts +0 -29
  753. package/src/machines/settings-section.tsx +0 -37
  754. package/src/machines/testing/contract.ts +0 -617
  755. package/src/machines/testing/index.ts +0 -7
  756. package/src/machines/testing/sync.contract.ts +0 -260
  757. package/src/motion/SwapIcon.tsx +0 -29
  758. package/src/motion/collapse.ts +0 -21
  759. package/src/motion/grow.tsx +0 -86
  760. package/src/motion/layout-animating.ts +0 -50
  761. package/src/motion/presence.ts +0 -191
  762. package/src/motion/provider.tsx +0 -63
  763. package/src/motion/reduced.ts +0 -36
  764. package/src/motion/roll.tsx +0 -131
  765. package/src/motion/shimmer.ts +0 -15
  766. package/src/motion/size.tsx +0 -192
  767. package/src/motion/springs.ts +0 -413
  768. package/src/motion/swap.tsx +0 -216
  769. package/src/motion/title-text.tsx +0 -74
  770. package/src/onboarding/ConnectProviderCard.tsx +0 -49
  771. package/src/onboarding/OnboardingFlow.tsx +0 -176
  772. package/src/onboarding/OnboardingProvider.tsx +0 -209
  773. package/src/onboarding/OnboardingStepFrame.tsx +0 -80
  774. package/src/onboarding/conversation.tsx +0 -196
  775. package/src/onboarding/demos/autonomy.tsx +0 -154
  776. package/src/onboarding/demos/extensions.tsx +0 -183
  777. package/src/onboarding/demos/features.tsx +0 -488
  778. package/src/onboarding/demos/how-it-works.tsx +0 -698
  779. package/src/onboarding/demos/index.ts +0 -11
  780. package/src/onboarding/demos/parts.tsx +0 -133
  781. package/src/onboarding/demos/tour.tsx +0 -217
  782. package/src/onboarding/headless/controller.ts +0 -110
  783. package/src/onboarding/headless/fixture-host.ts +0 -269
  784. package/src/onboarding/headless/fixtures.ts +0 -486
  785. package/src/onboarding/headless/host.ts +0 -176
  786. package/src/onboarding/headless/index.ts +0 -8
  787. package/src/onboarding/headless/labels.ts +0 -282
  788. package/src/onboarding/index.ts +0 -21
  789. package/src/onboarding/marks.tsx +0 -107
  790. package/src/onboarding/preview-attachments.ts +0 -39
  791. package/src/onboarding/skills/SkillSourceBrowser.tsx +0 -128
  792. package/src/onboarding/skills/parts.tsx +0 -464
  793. package/src/onboarding/sources/SourceBrowser.tsx +0 -400
  794. package/src/onboarding/steps/AutonomyStep.tsx +0 -128
  795. package/src/onboarding/steps/ConnectStep.tsx +0 -104
  796. package/src/onboarding/steps/ConnectorsStep.tsx +0 -222
  797. package/src/onboarding/steps/ConversationStep.tsx +0 -132
  798. package/src/onboarding/steps/ExtensionsStep.tsx +0 -113
  799. package/src/onboarding/steps/FeatureExample.tsx +0 -46
  800. package/src/onboarding/steps/FeaturesStep.tsx +0 -88
  801. package/src/onboarding/steps/ImportStep.tsx +0 -156
  802. package/src/onboarding/steps/LookStep.tsx +0 -276
  803. package/src/onboarding/steps/ReadyStep.tsx +0 -278
  804. package/src/onboarding/steps/SkillsStep.tsx +0 -45
  805. package/src/onboarding/steps/StepSection.tsx +0 -63
  806. package/src/onboarding/steps/Tradeoff.tsx +0 -45
  807. package/src/onboarding/steps/WelcomeStep.tsx +0 -147
  808. package/src/onboarding/steps/connect/KeyForm.tsx +0 -112
  809. package/src/onboarding/steps/connect/ProviderPanel.tsx +0 -149
  810. package/src/onboarding/steps/connect/ProviderReady.tsx +0 -171
  811. package/src/onboarding/steps/connect/ready-text.ts +0 -17
  812. package/src/onboarding/steps/index.ts +0 -12
  813. package/src/onboarding/steps/tasks.tsx +0 -84
  814. package/src/onboarding/testing/contract.ts +0 -472
  815. package/src/onboarding/testing/index.ts +0 -7
  816. package/src/onboarding/tutorials.tsx +0 -45
  817. package/src/onboarding/useSignIn.ts +0 -58
  818. package/src/palette/CommandPalette.tsx +0 -59
  819. package/src/palette/PaletteDialog.tsx +0 -186
  820. package/src/palette/PaletteProvider.tsx +0 -149
  821. package/src/palette/PaletteRows.tsx +0 -208
  822. package/src/palette/app-sources.ts +0 -62
  823. package/src/palette/headless/app-sources.ts +0 -515
  824. package/src/palette/headless/gather.ts +0 -50
  825. package/src/palette/headless/host.ts +0 -129
  826. package/src/palette/headless/index.ts +0 -15
  827. package/src/palette/headless/labels.ts +0 -124
  828. package/src/palette/headless/rank-protocol.ts +0 -23
  829. package/src/palette/headless/recents.ts +0 -35
  830. package/src/palette/headless/session-sources.ts +0 -218
  831. package/src/palette/headless/sources.ts +0 -313
  832. package/src/palette/headless/store.ts +0 -105
  833. package/src/palette/index.ts +0 -17
  834. package/src/palette/rank.worker.ts +0 -30
  835. package/src/palette/setup.ts +0 -19
  836. package/src/palette/testing/contract.ts +0 -250
  837. package/src/palette/testing/index.ts +0 -152
  838. package/src/palette/useConversationSearch.ts +0 -115
  839. package/src/palette/usePaletteController.ts +0 -229
  840. package/src/palette/useRankedItems.ts +0 -122
  841. package/src/path.ts +0 -199
  842. package/src/server/demo-tools.ts +0 -34
  843. package/src/server/environment.ts +0 -118
  844. package/src/server/index.ts +0 -7
  845. package/src/server/scripted-provider.ts +0 -174
  846. package/src/server/sse-handler.ts +0 -457
  847. package/src/server/testing/index.ts +0 -7
  848. package/src/session/ArtifactRowChips.tsx +0 -260
  849. package/src/session/ArtifactsPanel.tsx +0 -426
  850. package/src/session/DiffFileTree.tsx +0 -173
  851. package/src/session/PanelAttention.tsx +0 -131
  852. package/src/session/ProjectHome.tsx +0 -733
  853. package/src/session/ProviderUsageProvider.tsx +0 -113
  854. package/src/session/QueueTab.tsx +0 -669
  855. package/src/session/RunningWorkDialog.tsx +0 -178
  856. package/src/session/SessionCacheFacts.tsx +0 -190
  857. package/src/session/SessionDetailsDialog.tsx +0 -627
  858. package/src/session/SessionHeader.tsx +0 -242
  859. package/src/session/SessionProvider.tsx +0 -98
  860. package/src/session/SessionShell.tsx +0 -77
  861. package/src/session/SideChat.tsx +0 -320
  862. package/src/session/TodoList.tsx +0 -123
  863. package/src/session/TodosPanel.tsx +0 -279
  864. package/src/session/TurnDetailsDialog.tsx +0 -299
  865. package/src/session/UsagePanel.tsx +0 -358
  866. package/src/session/WelcomeScreen.tsx +0 -88
  867. package/src/session/headless/artifacts.ts +0 -101
  868. package/src/session/headless/diff-tree.ts +0 -167
  869. package/src/session/headless/fixture-host.ts +0 -362
  870. package/src/session/headless/home-layout.ts +0 -276
  871. package/src/session/headless/host.ts +0 -263
  872. package/src/session/headless/index.ts +0 -23
  873. package/src/session/headless/keyed.ts +0 -72
  874. package/src/session/headless/labels.ts +0 -337
  875. package/src/session/headless/queue-attachments.ts +0 -73
  876. package/src/session/headless/queue.ts +0 -122
  877. package/src/session/headless/running-work.ts +0 -85
  878. package/src/session/headless/session-actions.ts +0 -198
  879. package/src/session/headless/session-diffs.ts +0 -136
  880. package/src/session/headless/side.ts +0 -63
  881. package/src/session/headless/todos.ts +0 -62
  882. package/src/session/headless/usage-format.ts +0 -19
  883. package/src/session/headless/usage.ts +0 -407
  884. package/src/session/index.ts +0 -31
  885. package/src/session/modal-shell.tsx +0 -24
  886. package/src/session/testing/contract.ts +0 -588
  887. package/src/session/testing/demo.ts +0 -224
  888. package/src/session/testing/index.ts +0 -7
  889. package/src/session/useSessionLabels.ts +0 -14
  890. package/src/session/useUsageSummary.ts +0 -82
  891. package/src/settings/SettingsHeadingText.tsx +0 -54
  892. package/src/settings/SettingsHostSwitcher.tsx +0 -93
  893. package/src/settings/SettingsNav.tsx +0 -198
  894. package/src/settings/SettingsProvider.tsx +0 -127
  895. package/src/settings/SettingsRowsPage.tsx +0 -218
  896. package/src/settings/SettingsShell.tsx +0 -337
  897. package/src/settings/SettingsTutorial.tsx +0 -55
  898. package/src/settings/headless/catalog.ts +0 -570
  899. package/src/settings/headless/claude-import.ts +0 -61
  900. package/src/settings/headless/enabled.ts +0 -44
  901. package/src/settings/headless/fixture-accounts.ts +0 -260
  902. package/src/settings/headless/fixture-host.ts +0 -162
  903. package/src/settings/headless/fixture-models.ts +0 -51
  904. package/src/settings/headless/fixture-performance.ts +0 -350
  905. package/src/settings/headless/fixture-sections.ts +0 -391
  906. package/src/settings/headless/host.ts +0 -127
  907. package/src/settings/headless/index.ts +0 -22
  908. package/src/settings/headless/labels.ts +0 -63
  909. package/src/settings/headless/layout-sections.ts +0 -41
  910. package/src/settings/headless/layout.ts +0 -732
  911. package/src/settings/headless/mcp.ts +0 -319
  912. package/src/settings/headless/models.ts +0 -51
  913. package/src/settings/headless/page-counts.ts +0 -40
  914. package/src/settings/headless/performance.ts +0 -524
  915. package/src/settings/headless/providers.ts +0 -117
  916. package/src/settings/headless/registry.ts +0 -62
  917. package/src/settings/headless/resource.ts +0 -75
  918. package/src/settings/headless/search.ts +0 -142
  919. package/src/settings/headless/sections-host.ts +0 -340
  920. package/src/settings/index.ts +0 -32
  921. package/src/settings/rows.tsx +0 -152
  922. package/src/settings/section.tsx +0 -165
  923. package/src/settings/sections/appearance/AppearanceSection.tsx +0 -667
  924. package/src/settings/sections/appearance/labels.ts +0 -77
  925. package/src/settings/sections/claude-import/ClaudeImportDialog.tsx +0 -258
  926. package/src/settings/sections/claude-import/labels.ts +0 -42
  927. package/src/settings/sections/claude-import/use-claude-import-available.ts +0 -35
  928. package/src/settings/sections/descriptors.tsx +0 -261
  929. package/src/settings/sections/editor/EditorSection.tsx +0 -521
  930. package/src/settings/sections/editor/labels.ts +0 -84
  931. package/src/settings/sections/enabled-list/EnabledListSection.tsx +0 -112
  932. package/src/settings/sections/enabled-list/labels.ts +0 -37
  933. package/src/settings/sections/environments/EnvironmentsSection.tsx +0 -549
  934. package/src/settings/sections/environments/labels.ts +0 -31
  935. package/src/settings/sections/extensions/ChangeOriginDialog.tsx +0 -218
  936. package/src/settings/sections/extensions/CreateExtensionDialog.tsx +0 -210
  937. package/src/settings/sections/extensions/ExtensionConfigRows.tsx +0 -508
  938. package/src/settings/sections/extensions/ExtensionOptionsSection.tsx +0 -356
  939. package/src/settings/sections/extensions/ExtensionPicksBar.tsx +0 -112
  940. package/src/settings/sections/extensions/ExtensionSourceBrowser.tsx +0 -244
  941. package/src/settings/sections/extensions/ExtensionsSection.tsx +0 -665
  942. package/src/settings/sections/extensions/create-labels.ts +0 -31
  943. package/src/settings/sections/extensions/labels.ts +0 -64
  944. package/src/settings/sections/extensions/options-labels.ts +0 -34
  945. package/src/settings/sections/host-catalog/HostCatalogSection.tsx +0 -457
  946. package/src/settings/sections/host-catalog/labels.ts +0 -44
  947. package/src/settings/sections/index.ts +0 -60
  948. package/src/settings/sections/instructions/InstructionsSection.tsx +0 -385
  949. package/src/settings/sections/instructions/labels.ts +0 -33
  950. package/src/settings/sections/keybindings/KeybindingsSection.tsx +0 -124
  951. package/src/settings/sections/keybindings/labels.ts +0 -72
  952. package/src/settings/sections/keybindings/rows.ts +0 -103
  953. package/src/settings/sections/logs/LogsSection.tsx +0 -153
  954. package/src/settings/sections/logs/labels.ts +0 -20
  955. package/src/settings/sections/mcp/McpAddForm.tsx +0 -245
  956. package/src/settings/sections/mcp/McpSection.tsx +0 -358
  957. package/src/settings/sections/mcp/McpServerRow.tsx +0 -404
  958. package/src/settings/sections/mcp/labels.ts +0 -193
  959. package/src/settings/sections/models/AgentDefaults.tsx +0 -365
  960. package/src/settings/sections/models/ModelListPicker.tsx +0 -265
  961. package/src/settings/sections/models/ModelPickField.tsx +0 -220
  962. package/src/settings/sections/models/ModelRows.tsx +0 -381
  963. package/src/settings/sections/models/SpacesDefaultsSection.tsx +0 -102
  964. package/src/settings/sections/models/labels.ts +0 -119
  965. package/src/settings/sections/models/model-test.tsx +0 -125
  966. package/src/settings/sections/performance/PerfSparkline.tsx +0 -64
  967. package/src/settings/sections/performance/PerformanceHud.tsx +0 -110
  968. package/src/settings/sections/performance/PerformanceSection.tsx +0 -770
  969. package/src/settings/sections/performance/labels.ts +0 -114
  970. package/src/settings/sections/performance/use-perf-monitor.ts +0 -26
  971. package/src/settings/sections/plugins/PluginsSection.tsx +0 -151
  972. package/src/settings/sections/plugins/labels.ts +0 -23
  973. package/src/settings/sections/providers/CredentialSources.tsx +0 -237
  974. package/src/settings/sections/providers/ProvidersSection.tsx +0 -389
  975. package/src/settings/sections/providers/ServerProvidersSection.tsx +0 -244
  976. package/src/settings/sections/providers/ServerSignIn.tsx +0 -137
  977. package/src/settings/sections/providers/labels.ts +0 -160
  978. package/src/settings/sections/shared/catalog.tsx +0 -265
  979. package/src/settings/sections/shared/labels.ts +0 -31
  980. package/src/settings/sections/skills/SkillList.tsx +0 -494
  981. package/src/settings/sections/skills/SkillsSection.tsx +0 -249
  982. package/src/settings/sections/skills/labels.ts +0 -54
  983. package/src/settings/sections/use-section-labels.ts +0 -10
  984. package/src/settings/testing/accounts-demo.ts +0 -110
  985. package/src/settings/testing/accounts.contract.ts +0 -319
  986. package/src/settings/testing/claude-import.contract.ts +0 -93
  987. package/src/settings/testing/contract.ts +0 -192
  988. package/src/settings/testing/extension-options.contract.ts +0 -163
  989. package/src/settings/testing/index.ts +0 -11
  990. package/src/settings/testing/models.contract.ts +0 -135
  991. package/src/settings/testing/performance.contract.ts +0 -219
  992. package/src/settings/testing/sections.contract.ts +0 -306
  993. package/src/terminal/HostTerminalSurface.tsx +0 -917
  994. package/src/terminal/TerminalDrawer.tsx +0 -228
  995. package/src/terminal/TerminalPanel.tsx +0 -740
  996. package/src/terminal/TerminalProvider.tsx +0 -201
  997. package/src/terminal/TerminalSurface.tsx +0 -262
  998. package/src/terminal/box-glyphs.ts +0 -333
  999. package/src/terminal/ghostty.ts +0 -116
  1000. package/src/terminal/grid-size.ts +0 -46
  1001. package/src/terminal/headless/fixture-host.ts +0 -250
  1002. package/src/terminal/headless/host.ts +0 -99
  1003. package/src/terminal/headless/index.ts +0 -11
  1004. package/src/terminal/headless/labels.ts +0 -69
  1005. package/src/terminal/headless/layout.ts +0 -57
  1006. package/src/terminal/headless/links.ts +0 -227
  1007. package/src/terminal/headless/order.ts +0 -28
  1008. package/src/terminal/headless/output-cursor.ts +0 -66
  1009. package/src/terminal/headless/recent.ts +0 -20
  1010. package/src/terminal/headless/replay.ts +0 -45
  1011. package/src/terminal/headless/scope.ts +0 -60
  1012. package/src/terminal/headless/store.ts +0 -637
  1013. package/src/terminal/index.ts +0 -40
  1014. package/src/terminal/keys.ts +0 -34
  1015. package/src/terminal/testing/contract.ts +0 -274
  1016. package/src/terminal/testing/demo.ts +0 -40
  1017. package/src/terminal/testing/index.ts +0 -7
  1018. package/src/terminal/theme.ts +0 -110
  1019. package/src/terminal/useTerminalLabels.ts +0 -14
  1020. package/src/theme/accents.ts +0 -46
  1021. package/src/theme/color.ts +0 -450
  1022. package/src/theme/css-vars.ts +0 -187
  1023. package/src/theme/derive.ts +0 -700
  1024. package/src/theme/from-theme.ts +0 -52
  1025. package/src/theme/stylesheet.ts +0 -55
  1026. package/src/theme/themes.ts +0 -767
  1027. package/src/theme/without-transitions.ts +0 -18
  1028. package/src/uno.ts +0 -167
  1029. package/src/workspace/LayoutBudget.tsx +0 -143
  1030. package/src/workspace/PanelContentView.tsx +0 -523
  1031. package/src/workspace/PanelCorner.tsx +0 -111
  1032. package/src/workspace/PanelGroups.tsx +0 -264
  1033. package/src/workspace/PanelHome.tsx +0 -71
  1034. package/src/workspace/PanelItems.tsx +0 -368
  1035. package/src/workspace/PanelStrip.tsx +0 -316
  1036. package/src/workspace/SidePanel.tsx +0 -240
  1037. package/src/workspace/TabParking.tsx +0 -120
  1038. package/src/workspace/WorkspaceProvider.tsx +0 -558
  1039. package/src/workspace/dnd/engine.ts +0 -371
  1040. package/src/workspace/dnd/hooks.ts +0 -72
  1041. package/src/workspace/dnd/index.ts +0 -57
  1042. package/src/workspace/dnd/parking.tsx +0 -181
  1043. package/src/workspace/extension-tabs.tsx +0 -174
  1044. package/src/workspace/frame-motion.ts +0 -160
  1045. package/src/workspace/headless/contents.ts +0 -125
  1046. package/src/workspace/headless/host.ts +0 -129
  1047. package/src/workspace/headless/index.ts +0 -33
  1048. package/src/workspace/headless/labels.ts +0 -44
  1049. package/src/workspace/headless/layout-memory.ts +0 -649
  1050. package/src/workspace/headless/layouts.ts +0 -224
  1051. package/src/workspace/headless/open-target.ts +0 -125
  1052. package/src/workspace/headless/ops.ts +0 -163
  1053. package/src/workspace/headless/panel-focus.ts +0 -58
  1054. package/src/workspace/headless/panel-tree.ts +0 -259
  1055. package/src/workspace/headless/resolve.ts +0 -146
  1056. package/src/workspace/headless/reveal-at.ts +0 -27
  1057. package/src/workspace/headless/strip-drop.ts +0 -81
  1058. package/src/workspace/headless/tree.ts +0 -480
  1059. package/src/workspace/headless/view.ts +0 -164
  1060. package/src/workspace/index.ts +0 -23
  1061. package/src/workspace/panel-group-keys.ts +0 -36
  1062. package/src/workspace/panel-visibility.ts +0 -28
  1063. package/src/workspace/tab-scopes.ts +0 -245
  1064. package/src/workspace/testing/contract.ts +0 -282
  1065. package/src/workspace/testing/index.ts +0 -140
  1066. package/src/workspace/use-split-drag.ts +0 -73
  1067. package/src/workspace/useScopeLayout.ts +0 -26
  1068. package/src/workspace/useViewport.ts +0 -22
  1069. package/src/workspace/useWorkspaceLabels.ts +0 -14
  1070. package/src/workspace/workspace-key-commands.ts +0 -108
  1071. /package/dist/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +0 -0
@@ -1,1046 +0,0 @@
1
- /**
2
- * The session directory: every host's sessions as the sidebar lists them,
3
- * kept current outside React.
4
- *
5
- * - Listing: one read per host (this machine plus each remote host) under
6
- * the shown archive filter. Reads are versioned: only the newest refresh
7
- * lands, and a host's own older answer never overwrites a newer one.
8
- * - Run state: a refresh reconciles the rows' status with the stream store
9
- * (a running row marks the session running, an idle one confirmed by the
10
- * host clears a run this client missed the end of) unless a stream signal
11
- * moved the run state while the refresh was in flight.
12
- * - Live: a debounced change signal re-reads the hosts it touched; a run end
13
- * re-reads its host and leaves a notification on a session not open; a
14
- * runtime switch drops every stream; a reconnect (runtime or the open
15
- * session's server) re-reads the open transcript when no run streams it.
16
- * - Prewarm: the transcripts around the open session load in idle time.
17
- * - Spaces: the shown space (kept by the views store), the slide direction of
18
- * the last switch, following the open session to its space, and reopening
19
- * the conversation last open in a space when switching back to it.
20
- * - Actions: create (in the shown space), rename, optimistic favorite,
21
- * archive, move to a space (a session or a whole project), delete.
22
- * - Extensions: the spaces they add join the user's (`query.ts`), facets
23
- * pushed by the host land on their rows, and the switcher keeps its own
24
- * order and hidden spaces; the current view can be saved as a space (its
25
- * query built by `viewQuery`, checked before it is stored). Facet pushes
26
- * arriving together land in one state change.
27
- *
28
- * Generic over the app's row type and its transcript page type, so an app
29
- * keeps its own branded session keys.
30
- */
31
- import {
32
- activeSpaceOf,
33
- DEFAULT_SPACE_ID,
34
- normalizeSpaces,
35
- projectNameOf,
36
- resolveSessionSpace,
37
- SessionQueryError,
38
- sessionDirLabel,
39
- viewQuery,
40
- type QueryBound,
41
- } from 'zidane/chat/pure';
42
-
43
- import { constant, writable, type Readable } from '../store';
44
- import { createNotificationStore, type SessionNotificationStore } from './notifications';
45
- import {
46
- filterQueryOf,
47
- filtersForSpace,
48
- mergeSidebarSpaces,
49
- NO_SIDEBAR_CONTRIBUTIONS,
50
- resolveGrouping,
51
- resolveSort,
52
- spaceMembership,
53
- switcherSpaces,
54
- type SidebarContributions,
55
- type SidebarSpace,
56
- } from './query';
57
- import { isProjectMember } from './rows';
58
- import { VIEW_CHOICE, type SessionActivityFilter, type SessionArchiveFilter, type SidebarListSession } from './types';
59
- import { DEFAULT_SIDEBAR_VIEW, type SidebarViews } from './view';
60
-
61
- /** A project as one space lists it: its path (`projectPathOf`), the host it is on, the space. */
62
- export interface ProjectInSpace {
63
- /** The project's folder (`projectPathOf`). */
64
- path: string;
65
- /** A remote host's id; absent for this machine. */
66
- hostId?: string;
67
- /** The space it is listed in (an unknown or absent id is the default space). */
68
- spaceId?: string;
69
- /** Its repository, when its group also lists the repository's sessions on other machines (`isProjectMember`). */
70
- repoKey?: string;
71
- }
72
-
73
- /** What deleting a session did with its environment. */
74
- export type SessionRemoval = { kept: false } | { kept: true; reason?: string };
75
-
76
- /** The sessions transport the directory reads and acts through (`ChatHost.sessions`). */
77
- export interface SessionDirectorySource<S extends SidebarListSession, C = unknown> {
78
- /** One host's sessions under the archive filter; `hostId` absent = this machine. */
79
- query(filter: { archive: SessionArchiveFilter; hostId?: string }): Promise<readonly S[]>;
80
- /** Creates a session and resolves with its row. */
81
- create?(input: C): Promise<S>;
82
- /** Sets a session's title. */
83
- rename?(sessionId: S['id'], title: string): Promise<void>;
84
- /** Stars or unstars a session. */
85
- setFavorite?(sessionId: S['id'], favorite: boolean): Promise<void>;
86
- /** Archives or restores a session. */
87
- setArchived?(sessionId: S['id'], archived: boolean): Promise<void>;
88
- /** Moves a session to a space. */
89
- setSpace?(sessionId: S['id'], spaceId: string): Promise<void>;
90
- /** Resolves to `{ kept: true }` when the session's environment stayed on disk. */
91
- remove?(sessionId: S['id']): Promise<void | SessionRemoval>;
92
- /** Fires (possibly in bursts) with a session whose row changed. */
93
- onChanged?(listener: (sessionId: S['id']) => void): () => void;
94
- /**
95
- * Fires with a session's facets when the extensions computed new ones (`sessions:facets`): every
96
- * value, keyed `<extensionId>.<key>`. Absent: facets change only with a re-read.
97
- */
98
- onFacets?(listener: (sessionId: S['id'], facets: Readonly<Record<string, unknown>>) => void): () => void;
99
- }
100
-
101
- /** The slice of the session stream store the directory keeps in step. */
102
- export interface SessionDirectoryStreams<K extends string, P> {
103
- /** A snapshot of the run state; the returned check says whether it still holds. */
104
- captureRunState(): () => boolean;
105
- /** A row says the session runs: show it running. */
106
- markRunning(sessionId: K): void;
107
- /** The host confirmed the session is idle: end a run whose end was missed. */
108
- confirmIdle(sessionId: K): void;
109
- /** Whether a run streams for the session here. */
110
- peekRunning(sessionId: K | null): boolean;
111
- /** The session's run counter (bumps on every run start). */
112
- peekRunSeq(sessionId: K | null): number;
113
- /** The session's transcript is cached. */
114
- hasEvents(sessionId: K): boolean;
115
- /** Cache a loaded transcript page. */
116
- setEventsPage(sessionId: K, page: P): void;
117
- /** Drop every cached transcript except these. */
118
- evictExcept(keep: ReadonlySet<K>): void;
119
- /** Drop every stream (a runtime switch). */
120
- dropAll(): void;
121
- /** Drop one session's stream (deleted). */
122
- reset(sessionId: K): void;
123
- }
124
-
125
- /** A remote host as the directory follows it. */
126
- export interface DirectoryServer {
127
- /** The host id rows carry as `hostId`. */
128
- id: string;
129
- /** Its connection status (`connected` when reachable). */
130
- status: string;
131
- }
132
-
133
- /** The settings the directory reads. */
134
- export interface DirectorySettings {
135
- /** Spaces are on. */
136
- spaces: boolean;
137
- /** The settings' space list as stored (normalized here). */
138
- spaceList: unknown;
139
- /** The orchestration main session is listed. */
140
- orchestration: boolean;
141
- }
142
-
143
- /** Options of {@link createSessionDirectory}: the ports it reads and acts through. */
144
- export interface SessionDirectoryOptions<S extends SidebarListSession, P, C = unknown> {
145
- /** The sessions transport (`ChatHost.sessions`). */
146
- sessions: SessionDirectorySource<S, C>;
147
- /** The stream store it keeps in step. */
148
- streams: SessionDirectoryStreams<S['id'], P>;
149
- /** Load a session's latest transcript page. */
150
- loadEvents(sessionId: S['id'], options?: { prewarm?: boolean }): Promise<P>;
151
- /** Ask whether a session runs; `false` only when the host is sure it doesn't. */
152
- isRunning(sessionId: S['id']): Promise<boolean | null | undefined>;
153
- /** The remote hosts listed next to this machine. */
154
- servers: Readable<readonly DirectoryServer[]>;
155
- /** Spaces and orchestration settings. */
156
- settings: Readable<DirectorySettings>;
157
- /** The views and the shown space. */
158
- views: SidebarViews;
159
- /** The archive filter the list shows (the shown space's view). */
160
- archive?: SessionArchiveFilter;
161
- /** Live signals; each one left out is not followed. */
162
- signals?: {
163
- /** A run ended. */
164
- onRunEnd?(listener: (sessionId: S['id'], ok: boolean) => void): () => void;
165
- /** The runtime connected or disconnected (a daemon, a server connection). */
166
- onRuntime?(listener: (connected: boolean) => void): () => void;
167
- /** A remote host was removed, with the sessions it held and the words to show. */
168
- onHostRemoved?(
169
- listener: (removed: { hostId: string; sessionIds: readonly S['id'][]; notice: string | null }) => void,
170
- ): () => void;
171
- };
172
- /** The remote host a session lives on, `null` on this machine. */
173
- serverOf(sessionId: S['id']): string | null;
174
- /** Session keys kept in the transcript cache besides the prewarmed ones (`pinnedSessions`). */
175
- pinned?: () => Iterable<S['id']>;
176
- /** A window that only ever shows this session (its other sessions are never opened). */
177
- pinnedSession?: S['id'] | null;
178
- /** Schedules prewarm reads; defaults to `requestIdleCallback` with a timer fallback. */
179
- idle?: { request(run: () => void): number; cancel(handle: number): void };
180
- /** Debounce of change signals. Defaults to 300 ms. */
181
- changedDebounceMs?: number;
182
- /** A refresh is about to list these rows (an app's per-row bookkeeping, before they render). */
183
- onListed?(rows: readonly S[]): void;
184
- /** A session was deleted: drop what the app keeps for it (panels, layouts). */
185
- onRemoved?(sessionId: S['id']): void;
186
- /** A refresh failed. */
187
- onError?(error: unknown): void;
188
- /**
189
- * What the extensions contribute to the sidebar (`sidebarContributionsOf(host.items)`). An app whose
190
- * extensions host comes later attaches it then (`attachContributions`).
191
- */
192
- contributions?: Readable<SidebarContributions>;
193
- /** Adds a space to the user's list (the settings' `spaceList`). Absent: a view can't be saved as a space. */
194
- saveSpace?(space: SidebarSpace): Promise<void>;
195
- }
196
-
197
- /** The directory's state as one snapshot: a new object whenever any field changes. */
198
- export interface SessionDirectoryState<S extends SidebarListSession> {
199
- /** Every listed session, unfiltered (the archive filter is the host's). */
200
- allSessions: readonly S[];
201
- /** The open session. */
202
- activeSessionId: S['id'] | null;
203
- /** Spaces are on. */
204
- spacesOn: boolean;
205
- /** Every space, the default one always present: the user's in order, then the extensions'. */
206
- spaces: readonly SidebarSpace[];
207
- /** The spaces the switcher shows, in its order (the user's arrangement on top of `spaces`). */
208
- switcherSpaces: readonly SidebarSpace[];
209
- /**
210
- * The spaces the user hid from the switcher on this device (`setSpaceHidden`), in `spaces` order:
211
- * what the switcher's Hidden spaces menu offers to show again. A space hidden in the settings'
212
- * space list (`hidden: true`) is not in it: the settings show it again.
213
- */
214
- hiddenSpaces: readonly SidebarSpace[];
215
- /** The space shown (the default one while spaces are off). */
216
- activeSpace: SidebarSpace;
217
- /** What the extensions contribute to the sidebar. */
218
- contributions: SidebarContributions;
219
- /** The last space switch, for the list's slide. */
220
- spaceSlide: { spaceId: string; direction: 'next' | 'prev' } | null;
221
- /** Why the open session closed (its host was removed), until dismissed or another opens. */
222
- hostNotice: string | null;
223
- }
224
-
225
- /** The session directory: its state, notifications and views, and the actions on them. */
226
- export interface SessionDirectory<S extends SidebarListSession, C = unknown> {
227
- /** The state, one snapshot per change. */
228
- state: Readable<SessionDirectoryState<S>>;
229
- /** What finished runs left on sessions not open. */
230
- notifications: SessionNotificationStore;
231
- /** The views and the shown space. */
232
- views: SidebarViews;
233
- /** Start following hosts, signals and settings; returns the stop. */
234
- start(): () => void;
235
- /** Re-read every host. */
236
- refresh(): Promise<void>;
237
- /** The list's archive filter changed (re-reads when it did). */
238
- setArchive(archive: SessionArchiveFilter): void;
239
- /** Open a session (or none) and clear its notification and the host notice. */
240
- select(sessionId: S['id'] | null): void;
241
- /** Set the open session without clearing anything (window routing, deletes). */
242
- setActive(sessionId: S['id'] | null | ((current: S['id'] | null) => S['id'] | null)): void;
243
- /** Hides the host notice. */
244
- dismissHostNotice(): void;
245
- /** Create a session in the shown space (unless the input names one) and list it. */
246
- create(input: C & { spaceId?: string }): Promise<S>;
247
- /** Renames a session, then re-reads. */
248
- rename(sessionId: S['id'], title: string): Promise<void>;
249
- /** Stars or unstars a session at once; a failed write puts it back. */
250
- setFavorite(sessionId: S['id'], favorite: boolean): Promise<void>;
251
- /** Archives or restores a session, then re-reads. */
252
- setArchived(sessionId: S['id'], archived: boolean): Promise<void>;
253
- /** Archives sessions, then re-reads once. */
254
- archiveMany(sessionIds: readonly S['id'][]): Promise<void>;
255
- /** Delete one session without re-reading; the caller refreshes. */
256
- drop(sessionId: S['id']): Promise<SessionRemoval>;
257
- /** Delete sessions, then re-read; resolves to how many kept their environment. */
258
- removeMany(sessionIds: readonly S['id'][]): Promise<{ kept: number; reason?: string }>;
259
- /**
260
- * Shows another space and reopens the conversation last open there, when it is still listed in it;
261
- * else the open session closes when it belongs elsewhere.
262
- */
263
- setActiveSpace(spaceId: string): void;
264
- /** Step to the next or previous space, wrapping at either end; false with spaces off or only one space. */
265
- stepSpace(delta: 1 | -1): boolean;
266
- /** Moves a session to a space, then re-reads. */
267
- setSessionSpace(sessionId: S['id'], spaceId: string): Promise<void>;
268
- /** Hides a space from the switcher or shows it again; hiding the shown space shows the default one. */
269
- setSpaceHidden(spaceId: string, hidden: boolean): void;
270
- /** Moves a space one place left (-1) or right (1) in the switcher. */
271
- moveSpace(spaceId: string, delta: 1 | -1): void;
272
- /** Follow an extensions host's sidebar contributions from now on (replacing any); returns the detach. */
273
- attachContributions(contributions: Readable<SidebarContributions>): () => void;
274
- /**
275
- * Saves the shown space's view as a new user space (its query, grouping and sort) and shows it.
276
- * The query is `viewQuery`'s (`zidane/chat/pure`): the space's membership, then the project,
277
- * activity, agent and contributed filters. Rejects with a `SessionQueryError` (nothing saved)
278
- * when that query is not valid (too deep, too many nodes or values), and with `saveSpace`'s error.
279
- * Undefined without `saveSpace`. The sidebar's `useSaveViewAsSpace` names the space and words a failure.
280
- */
281
- saveViewAsSpace?: (name: string) => Promise<SidebarSpace>;
282
- /** A project's sessions in its space (every archive state), read fresh from its host. */
283
- listProjectSessions(project: ProjectInSpace): Promise<S[]>;
284
- /** Move a project's sessions to another space; resolves to how many moved. */
285
- setProjectSpace(project: ProjectInSpace, spaceId: string): Promise<number>;
286
- }
287
-
288
- const PREWARM_FULL_THRESHOLD = 12;
289
- const PREWARM_WINDOW_RADIUS = 6;
290
-
291
- const defaultIdle = {
292
- request(run: () => void): number {
293
- if (typeof requestIdleCallback === 'function') return requestIdleCallback(() => run());
294
- return setTimeout(run, 150) as unknown as number;
295
- },
296
- cancel(handle: number): void {
297
- if (typeof cancelIdleCallback === 'function') cancelIdleCallback(handle);
298
- else clearTimeout(handle);
299
- },
300
- };
301
-
302
- /**
303
- * The directory over the app's ports; nothing runs until `start()`.
304
- *
305
- * @param options - The transport, stream store, settings, views and signals.
306
- */
307
- export function createSessionDirectory<S extends SidebarListSession, P, C = unknown>(
308
- options: SessionDirectoryOptions<S, P, C>,
309
- ): SessionDirectory<S, C> {
310
- type K = S['id'];
311
- const { sessions, streams, views } = options;
312
- const idle = options.idle ?? defaultIdle;
313
- const debounceMs = options.changedDebounceMs ?? 300;
314
- const pinnedSession = options.pinnedSession ?? null;
315
- const notifications = createNotificationStore();
316
-
317
- let contributionsStore: Readable<SidebarContributions> = options.contributions ?? constant(NO_SIDEBAR_CONTRIBUTIONS);
318
- /** Swaps the contributions store while started (set by `start`). */
319
- let followContributions: ((next: Readable<SidebarContributions>) => void) | null = null;
320
-
321
- // One merged list per settings list and extension spaces, so an unchanged input keeps every space object.
322
- let mergedFrom: { list: unknown; extension: SidebarContributions['spaces'] } | null = null;
323
- let merged: readonly SidebarSpace[] = [];
324
- let switcherFrom: { spaces: readonly SidebarSpace[]; prefs: unknown } | null = null;
325
- let switcher: readonly SidebarSpace[] = [];
326
- let hiddenSpaces: readonly SidebarSpace[] = [];
327
- const spacesFrom = (settings: DirectorySettings, spaceId: string) => {
328
- const spacesOn = settings.spaces;
329
- const contributions = contributionsStore.get();
330
- if (!mergedFrom || mergedFrom.list !== settings.spaceList || mergedFrom.extension !== contributions.spaces) {
331
- mergedFrom = { list: settings.spaceList, extension: contributions.spaces };
332
- merged = mergeSidebarSpaces(normalizeSpaces(settings.spaceList), settings.spaceList, contributions.spaces);
333
- }
334
- const spaces = merged;
335
- const prefs = views.switcher.get();
336
- if (!switcherFrom || switcherFrom.spaces !== spaces || switcherFrom.prefs !== prefs) {
337
- switcherFrom = { spaces, prefs };
338
- switcher = switcherSpaces(spaces, prefs);
339
- const hidden = new Set(prefs.hidden);
340
- hiddenSpaces = spaces.filter((s) => s.id !== DEFAULT_SPACE_ID && hidden.has(s.id));
341
- }
342
- return {
343
- spacesOn,
344
- spaces,
345
- switcherSpaces: switcher,
346
- hiddenSpaces,
347
- contributions,
348
- activeSpace: activeSpaceOf(spaces, spacesOn ? spaceId : DEFAULT_SPACE_ID) as SidebarSpace,
349
- };
350
- };
351
-
352
- const initialSpaces = spacesFrom(options.settings.get(), views.space.get());
353
- const state = writable<SessionDirectoryState<S>>({
354
- allSessions: [],
355
- activeSessionId: pinnedSession,
356
- ...initialSpaces,
357
- spaceSlide: null,
358
- hostNotice: null,
359
- });
360
- const patch = (next: Partial<SessionDirectoryState<S>>) => {
361
- const current = state.get();
362
- if ((Object.keys(next) as (keyof SessionDirectoryState<S>)[]).every((k) => Object.is(current[k], next[k]))) return;
363
- state.set({ ...current, ...next });
364
- };
365
-
366
- let archive: SessionArchiveFilter = options.archive ?? 'active';
367
- let refreshVersion = 0;
368
- const hostLists = new Map<string, readonly S[]>();
369
- const hostReads = new Map<string, number>();
370
-
371
- const refreshHosts = async (only?: ReadonlySet<string>): Promise<void> => {
372
- const version = ++refreshVersion;
373
- const unchanged = streams.captureRunState();
374
- const filter = archive;
375
- try {
376
- // '' is this machine; a host dropped from the list leaves with its rows.
377
- const hosts = ['', ...options.servers.get().map((host) => host.id)];
378
- await Promise.all(
379
- hosts
380
- .filter((host) => !only || only.has(host) || !hostLists.has(host))
381
- .map(async (host) => {
382
- const read = (hostReads.get(host) ?? 0) + 1;
383
- hostReads.set(host, read);
384
- const rows = host
385
- ? await sessions.query({ archive: filter, hostId: host }).catch(() => [] as readonly S[])
386
- : await sessions.query({ archive: filter });
387
- if (hostReads.get(host) === read) hostLists.set(host, rows);
388
- }),
389
- );
390
- // A newer refresh owns the host list: pruning by this one's older list would drop a host it just read.
391
- if (version !== refreshVersion) return;
392
- for (const host of hostLists.keys()) {
393
- if (!hosts.includes(host)) hostLists.delete(host);
394
- }
395
- const next = hosts.flatMap((host) => hostLists.get(host) ?? []);
396
- // A row the stream store thinks runs but the host lists idle: ask whether it really stopped.
397
- const idleRows = await Promise.all(
398
- next.map(async (row) => {
399
- if (row.status === 'running' || !streams.peekRunning(row.id)) return false;
400
- return Promise.resolve(options.isRunning(row.id))
401
- .then((running) => running === false)
402
- .catch(() => false);
403
- }),
404
- );
405
- if (version !== refreshVersion) return;
406
- const runStateStable = unchanged();
407
- options.onListed?.(next);
408
- patch({ allSessions: next });
409
- // A signal moved the run state while this read was in flight: its rows are older than the signal.
410
- if (!runStateStable) return;
411
- for (const [index, row] of next.entries()) {
412
- if (row.status === 'running') streams.markRunning(row.id);
413
- else if (idleRows[index]) streams.confirmIdle(row.id);
414
- }
415
- const active = state.get().activeSessionId;
416
- if (active && next.some((row, index) => row.id === active && idleRows[index])) {
417
- const stillIdle = streams.captureRunState();
418
- const page = await options.loadEvents(active);
419
- if (
420
- version === refreshVersion &&
421
- stillIdle() &&
422
- state.get().activeSessionId === active &&
423
- !streams.peekRunning(active)
424
- ) {
425
- streams.setEventsPage(active, page);
426
- }
427
- }
428
- } catch (err) {
429
- options.onError?.(err);
430
- }
431
- };
432
- const refresh = () => refreshHosts();
433
-
434
- const reconvergeActiveTranscript = () => {
435
- const active = state.get().activeSessionId;
436
- // A streaming run owns the transcript; a reload would race it.
437
- if (
438
- !active ||
439
- streams.peekRunning(active) ||
440
- state.get().allSessions.some((s) => s.id === active && s.status === 'running')
441
- ) {
442
- return;
443
- }
444
- const runSeqAtKickoff = streams.peekRunSeq(active);
445
- options
446
- .loadEvents(active)
447
- .then((events) => {
448
- if (
449
- state.get().activeSessionId === active &&
450
- !streams.peekRunning(active) &&
451
- streams.peekRunSeq(active) === runSeqAtKickoff
452
- ) {
453
- streams.setEventsPage(active, events);
454
- }
455
- })
456
- .catch(() => undefined);
457
- };
458
-
459
- const setActive: SessionDirectory<S, C>['setActive'] = (next) => {
460
- const current = state.get().activeSessionId;
461
- patch({ activeSessionId: typeof next === 'function' ? next(current) : next });
462
- };
463
-
464
- const select = (sessionId: K | null) => {
465
- setActive(sessionId);
466
- if (sessionId) {
467
- notifications.clear(sessionId);
468
- patch({ hostNotice: null });
469
- }
470
- };
471
-
472
- // Prewarm: the transcripts around the open session, one per idle slot.
473
- let stopPrewarm: (() => void) | null = null;
474
- const prewarm = () => {
475
- stopPrewarm?.();
476
- stopPrewarm = null;
477
- const { allSessions: raw, activeSessionId } = state.get();
478
- if (raw.length === 0) return;
479
- let candidates: readonly S[];
480
- if (raw.length <= PREWARM_FULL_THRESHOLD) {
481
- candidates = raw;
482
- } else {
483
- const anchor = activeSessionId ? raw.findIndex((s) => s.id === activeSessionId) : -1;
484
- const center = anchor === -1 ? 0 : anchor;
485
- const start = Math.max(0, center - PREWARM_WINDOW_RADIUS);
486
- const end = Math.min(raw.length, center + PREWARM_WINDOW_RADIUS + 1);
487
- candidates = raw.slice(start, end);
488
- }
489
- // The cache keeps the window, the open session and the pinned ones; the rest go.
490
- const keep = new Set<K>(candidates.map((s) => s.id));
491
- if (activeSessionId) keep.add(activeSessionId);
492
- for (const key of options.pinned?.() ?? []) keep.add(key);
493
- streams.evictExcept(keep);
494
- const targets = candidates.filter((session) => !streams.hasEvents(session.id));
495
- if (targets.length === 0) return;
496
- let cancelled = false;
497
- let handle: number | undefined;
498
- const pump = (index: number): void => {
499
- if (cancelled || index >= targets.length) return;
500
- handle = idle.request(() => {
501
- if (cancelled) return;
502
- const session = targets[index]!;
503
- const next = (): void => pump(index + 1);
504
- if (streams.hasEvents(session.id)) {
505
- next();
506
- return;
507
- }
508
- options
509
- .loadEvents(session.id, { prewarm: true })
510
- .then((events) => {
511
- if (cancelled) return;
512
- if (!streams.hasEvents(session.id)) streams.setEventsPage(session.id, events);
513
- })
514
- .catch(() => {
515
- /* prewarm is best-effort */
516
- })
517
- .finally(next);
518
- });
519
- };
520
- pump(0);
521
- stopPrewarm = () => {
522
- cancelled = true;
523
- if (handle !== undefined) idle.cancel(handle);
524
- };
525
- };
526
-
527
- /** `direction`: the way the list slides; by default the switcher's order (a wrapping step overrides it). */
528
- const showSpace = (spaceId: string, direction?: 'next' | 'prev') => {
529
- const { spaces, switcherSpaces: order, activeSpace, allSessions, activeSessionId, spacesOn } = state.get();
530
- const from = order.findIndex((s) => s.id === activeSpace.id);
531
- const to = order.findIndex((s) => s.id === spaceId);
532
- patch({
533
- spaceSlide:
534
- from !== -1 && to !== -1 && from !== to
535
- ? { spaceId, direction: direction ?? (to > from ? 'next' : 'prev') }
536
- : null,
537
- });
538
- const space = spaces.find((s) => s.id === spaceId) ?? activeSpaceOf(spaces, spaceId);
539
- const inSpace = spaceMembership<S>(space, spaces, true);
540
- const belongs = (s: S) => !s.isMain && (!spacesOn || !inSpace || inSpace(s));
541
- // The conversation last open there, when it is still listed and still in that space.
542
- const rememberedId = pinnedSession ? null : views.lastSessionOf(spaceId);
543
- const remembered = rememberedId ? allSessions.find((s) => s.id === rememberedId && belongs(s)) : undefined;
544
- // Else the open session stays open only when it belongs to the new space (closed first, so the
545
- // sidebar doesn't follow it back).
546
- const open = allSessions.find((s) => s.id === activeSessionId);
547
- // Opened before the switch, so the sidebar's follow lands on the new space, not the old.
548
- if (remembered) select(remembered.id);
549
- else if (open && !open.isMain && !belongs(open)) setActive(null);
550
- views.setSpace(spaceId);
551
- };
552
- const setActiveSpace = (spaceId: string) => showSpace(spaceId);
553
-
554
- const listProjectSessions = async (project: ProjectInSpace): Promise<S[]> => {
555
- if (!project.path) return [];
556
- const { spaces } = state.get();
557
- const from = resolveSessionSpace(project.spaceId, spaces);
558
- // A repository's group spans machines: read every host. Otherwise only the project's own.
559
- const hosts = project.repoKey ? ['', ...options.servers.get().map((host) => host.id)] : [project.hostId ?? ''];
560
- const all = (
561
- await Promise.all(
562
- hosts.map((host) =>
563
- host
564
- ? sessions.query({ archive: 'all', hostId: host }).catch(() => [] as readonly S[])
565
- : sessions.query({ archive: 'all' }),
566
- ),
567
- )
568
- ).flat();
569
- return all.filter(
570
- (s) => !s.isMain && isProjectMember(s, project) && resolveSessionSpace(s.spaceId, spaces) === from,
571
- );
572
- };
573
-
574
- const drop = async (sessionId: K): Promise<SessionRemoval> => {
575
- const removed = await sessions.remove?.(sessionId);
576
- streams.reset(sessionId);
577
- options.onRemoved?.(sessionId);
578
- views.forgetSession(sessionId);
579
- setActive((current) => (current === sessionId ? null : current));
580
- notifications.clear(sessionId);
581
- return removed && removed.kept ? removed : { kept: false };
582
- };
583
-
584
- /** Keep derived state in step with the settings, the space and the rows. */
585
- const reconcile = () => {
586
- const settings = options.settings.get();
587
- const spaces = spacesFrom(settings, views.space.get());
588
- patch(spaces);
589
- const { allSessions, activeSessionId, activeSpace, spacesOn } = state.get();
590
- const shown = spaceMembership<S>(activeSpace, spaces.spaces, spacesOn);
591
- const open = allSessions.find((s) => s.id === activeSessionId);
592
- // Orchestration off: the main session is unlisted, so it can't stay open.
593
- if (!settings.orchestration && open?.isMain) {
594
- setActive(null);
595
- return;
596
- }
597
- // Open a session from another space (a link, the palette): the sidebar follows it there.
598
- if (spacesOn && !pinnedSession && open && !open.isMain) {
599
- // A query space that lists it (not its own) keeps showing it.
600
- if (activeSpace.query && shown?.(open)) {
601
- views.rememberSession(activeSpace.id, open.id);
602
- return;
603
- }
604
- const home = resolveSessionSpace(open.spaceId, spaces.spaces);
605
- if (home !== activeSpace.id) views.setSpace(home);
606
- views.rememberSession(home, open.id);
607
- }
608
- };
609
-
610
- return {
611
- state,
612
- notifications,
613
- views,
614
- start() {
615
- const offs: (() => void)[] = [];
616
- let lastRows = state.get().allSessions;
617
- let lastActive = state.get().activeSessionId;
618
- offs.push(
619
- state.subscribe(() => {
620
- const { allSessions, activeSessionId } = state.get();
621
- if (allSessions === lastRows && activeSessionId === lastActive) return;
622
- lastRows = allSessions;
623
- lastActive = activeSessionId;
624
- reconcile();
625
- prewarm();
626
- }),
627
- );
628
- offs.push(options.settings.subscribe(reconcile));
629
- offs.push(views.space.subscribe(reconcile));
630
- offs.push(views.switcher.subscribe(reconcile));
631
- let offContributions = contributionsStore.subscribe(reconcile);
632
- offs.push(() => offContributions());
633
- followContributions = (next) => {
634
- offContributions();
635
- contributionsStore = next;
636
- offContributions = next.subscribe(reconcile);
637
- reconcile();
638
- };
639
-
640
- if (sessions.onFacets) {
641
- // Pushes arriving together (a refresh computes many sessions) land in one state change.
642
- let pending: Map<string, Readonly<Record<string, unknown>>> | null = null;
643
- let stopped = false;
644
- const flush = () => {
645
- const batch = pending;
646
- pending = null;
647
- if (stopped || !batch) return;
648
- const rows = state.get().allSessions;
649
- if (!rows.some((s) => batch.has(s.id))) return;
650
- patch({ allSessions: rows.map((s) => (batch.has(s.id) ? { ...s, facets: batch.get(s.id)! } : s)) });
651
- };
652
- const off = sessions.onFacets((sessionId, facets) => {
653
- if (!pending) {
654
- pending = new Map();
655
- queueMicrotask(flush);
656
- }
657
- pending.set(sessionId, facets);
658
- });
659
- offs.push(() => {
660
- stopped = true;
661
- off();
662
- });
663
- }
664
-
665
- let serversKey = options.servers
666
- .get()
667
- .map((host) => `${host.id}:${host.status}`)
668
- .join('|');
669
- let lastActiveServer: { id: string | null; status: string | undefined } = { id: null, status: undefined };
670
- const followActiveServer = () => {
671
- const active = state.get().activeSessionId;
672
- const id = active ? options.serverOf(active) : null;
673
- const status = id ? options.servers.get().find((host) => host.id === id)?.status : undefined;
674
- const last = lastActiveServer;
675
- lastActiveServer = { id, status };
676
- // The open session's server came back: its transcript may have moved on.
677
- const reconnected =
678
- id !== null &&
679
- last.id === id &&
680
- last.status !== undefined &&
681
- last.status !== 'connected' &&
682
- status === 'connected';
683
- if (reconnected) reconvergeActiveTranscript();
684
- };
685
- followActiveServer();
686
- offs.push(state.subscribe(followActiveServer));
687
- offs.push(
688
- options.servers.subscribe(() => {
689
- followActiveServer();
690
- const key = options.servers
691
- .get()
692
- .map((host) => `${host.id}:${host.status}`)
693
- .join('|');
694
- if (key === serversKey) return;
695
- serversKey = key;
696
- void refresh();
697
- }),
698
- );
699
-
700
- // Runtime switch (daemon on / off): every stream belongs to the old runtime.
701
- let runtime: boolean | null = null;
702
- const onRuntime = options.signals?.onRuntime;
703
- if (onRuntime) {
704
- offs.push(
705
- onRuntime((connected) => {
706
- const previous = runtime;
707
- runtime = connected;
708
- if (previous === null || previous === connected) return;
709
- streams.dropAll();
710
- void refresh();
711
- }),
712
- );
713
- offs.push(
714
- onRuntime((connected) => {
715
- if (!connected) return;
716
- void refresh();
717
- reconvergeActiveTranscript();
718
- }),
719
- );
720
- }
721
-
722
- const onRunEnd = options.signals?.onRunEnd;
723
- if (onRunEnd) {
724
- offs.push(
725
- onRunEnd((sessionId, ok) => {
726
- void refreshHosts(new Set([options.serverOf(sessionId) ?? '']));
727
- if (sessionId === state.get().activeSessionId) return;
728
- notifications.set(sessionId, ok ? 'completed' : 'error');
729
- }),
730
- );
731
- }
732
-
733
- const onHostRemoved = options.signals?.onHostRemoved;
734
- if (onHostRemoved) {
735
- offs.push(
736
- onHostRemoved(({ hostId, sessionIds, notice }) => {
737
- const active = state.get().activeSessionId;
738
- if (active && (options.serverOf(active) === hostId || sessionIds.includes(active))) {
739
- setActive(null);
740
- patch({ hostNotice: notice });
741
- }
742
- void refresh();
743
- }),
744
- );
745
- }
746
-
747
- if (sessions.onChanged) {
748
- let timer: ReturnType<typeof setTimeout> | null = null;
749
- let activeTouched = false;
750
- let touched = new Set<string>();
751
- const off = sessions.onChanged((sessionId) => {
752
- activeTouched ||= sessionId === state.get().activeSessionId;
753
- touched.add(options.serverOf(sessionId) ?? '');
754
- if (timer !== null) clearTimeout(timer);
755
- timer = setTimeout(() => {
756
- timer = null;
757
- const hosts = touched;
758
- touched = new Set();
759
- void refreshHosts(hosts);
760
- if (activeTouched) {
761
- activeTouched = false;
762
- reconvergeActiveTranscript();
763
- }
764
- }, debounceMs);
765
- });
766
- offs.push(() => {
767
- off();
768
- if (timer !== null) clearTimeout(timer);
769
- });
770
- }
771
-
772
- void refresh();
773
- return () => {
774
- for (const off of offs.splice(0).reverse()) off();
775
- followContributions = null;
776
- stopPrewarm?.();
777
- stopPrewarm = null;
778
- };
779
- },
780
- refresh,
781
- setArchive(next) {
782
- if (next === archive) return;
783
- archive = next;
784
- void refresh();
785
- },
786
- select,
787
- setActive,
788
- dismissHostNotice: () => patch({ hostNotice: null }),
789
- async create(input) {
790
- const { spacesOn, activeSpace } = state.get();
791
- const withSpace = spacesOn && input.spaceId === undefined ? { ...input, spaceId: activeSpace.id } : input;
792
- if (!sessions.create) throw new Error('This host cannot create sessions.');
793
- const created = await sessions.create(withSpace);
794
- return created;
795
- },
796
- async rename(sessionId, title) {
797
- await sessions.rename?.(sessionId, title);
798
- await refresh();
799
- },
800
- async setFavorite(sessionId, favorite) {
801
- // Optimistic: the star moves now; a failed write puts it back.
802
- const flip = (value: boolean) => {
803
- refreshVersion += 1;
804
- patch({
805
- allSessions: state.get().allSessions.map((s) => (s.id === sessionId ? { ...s, favorite: value } : s)),
806
- });
807
- };
808
- flip(favorite);
809
- try {
810
- await sessions.setFavorite?.(sessionId, favorite);
811
- } catch (err) {
812
- flip(!favorite);
813
- throw err;
814
- }
815
- await refresh();
816
- },
817
- async setArchived(sessionId, archived) {
818
- await sessions.setArchived?.(sessionId, archived);
819
- await refresh();
820
- },
821
- async archiveMany(sessionIds) {
822
- try {
823
- for (const id of sessionIds) await sessions.setArchived?.(id, true);
824
- } finally {
825
- await refresh();
826
- }
827
- },
828
- drop,
829
- async removeMany(sessionIds) {
830
- let kept = 0;
831
- let reason: string | undefined;
832
- try {
833
- for (const id of sessionIds) {
834
- const result = await drop(id);
835
- if (result.kept) {
836
- kept += 1;
837
- reason ??= result.reason;
838
- }
839
- }
840
- } finally {
841
- await refresh();
842
- }
843
- return reason ? { kept, reason } : { kept };
844
- },
845
- setActiveSpace,
846
- stepSpace(delta) {
847
- const { spacesOn, switcherSpaces: spaces, activeSpace } = state.get();
848
- if (!spacesOn || spaces.length < 2) return false;
849
- const at = spaces.findIndex((s) => s.id === activeSpace.id);
850
- // Wraps: past the last space comes the first, and before the first the last.
851
- const next = spaces[(at + delta + spaces.length) % spaces.length]!;
852
- showSpace(next.id, delta === 1 ? 'next' : 'prev');
853
- return true;
854
- },
855
- async setSessionSpace(sessionId, spaceId) {
856
- await sessions.setSpace?.(sessionId, spaceId);
857
- views.forgetSession(sessionId, spaceId);
858
- await refresh();
859
- },
860
- setSpaceHidden(spaceId, hidden) {
861
- if (spaceId === DEFAULT_SPACE_ID) return;
862
- const prefs = views.switcher.get();
863
- const rest = prefs.hidden.filter((id) => id !== spaceId);
864
- views.setSwitcher({ ...prefs, hidden: hidden ? [...rest, spaceId] : rest });
865
- if (hidden && state.get().activeSpace.id === spaceId) showSpace(DEFAULT_SPACE_ID);
866
- },
867
- moveSpace(spaceId, delta) {
868
- const order = state.get().switcherSpaces.map((s) => s.id);
869
- const at = order.indexOf(spaceId);
870
- const to = at + delta;
871
- if (at === -1 || to < 0 || to >= order.length) return;
872
- order.splice(at, 1);
873
- order.splice(to, 0, spaceId);
874
- // Hidden spaces keep their place in the stored order, after the shown ones.
875
- const prefs = views.switcher.get();
876
- const kept = prefs.order.filter((id) => !order.includes(id));
877
- views.setSwitcher({ ...prefs, order: [...order, ...kept] });
878
- },
879
- attachContributions(next) {
880
- if (followContributions) followContributions(next);
881
- else {
882
- contributionsStore = next;
883
- reconcile();
884
- }
885
- return () => {
886
- if (contributionsStore !== next) return;
887
- const none = constant(NO_SIDEBAR_CONTRIBUTIONS);
888
- if (followContributions) followContributions(none);
889
- else {
890
- contributionsStore = none;
891
- reconcile();
892
- }
893
- };
894
- },
895
- ...(options.saveSpace
896
- ? {
897
- saveViewAsSpace: async (name: string) => {
898
- const { activeSpace, spaces, spacesOn, contributions } = state.get();
899
- const view = views.viewOf(activeSpace.id);
900
- const grouping = resolveGrouping(view, activeSpace, contributions.groups);
901
- const sort = resolveSort(view, activeSpace, contributions.sorts);
902
- const values = view.extension?.filters ?? {};
903
- const filters = filtersForSpace(contributions.filters, activeSpace.id).flatMap(({ item }) => {
904
- const query = filterQueryOf(item, values[item.id]);
905
- return query ? [query] : [];
906
- });
907
- // The archive axis stays the new space's view's own (copied below), not part of its query.
908
- const result = viewQuery({
909
- space: spacesOn
910
- ? { id: activeSpace.id, ...(activeSpace.query ? { query: activeSpace.query } : {}) }
911
- : null,
912
- view: {
913
- project: view.project,
914
- agent: view.agent ?? null,
915
- ...(view.activity !== 'all' ? { updatedSince: ACTIVITY_BOUND[view.activity] } : {}),
916
- filters,
917
- },
918
- knownSpaceIds: spaces.map((s) => s.id),
919
- });
920
- if (result.issues) throw new SessionQueryError(result.issues);
921
- const taken = new Set(spaces.map((s) => s.id));
922
- let n = 1;
923
- while (taken.has(`view-${n}`)) n += 1;
924
- const space: SidebarSpace = {
925
- id: `view-${n}`,
926
- name,
927
- query: result.query,
928
- ...(grouping.kind === 'query' ? { groupBy: grouping.groupBy } : {}),
929
- ...(sort ? { sortBy: [...sort] } : {}),
930
- };
931
- await options.saveSpace!(space);
932
- // The new space starts on the view's built-in axes; its filters are in its query now.
933
- const { agent: _agent, extension: _extension, ...axes } = { ...DEFAULT_SIDEBAR_VIEW, ...view };
934
- views.patch(space.id, {
935
- ...axes,
936
- project: null,
937
- activity: 'all',
938
- extension: { filters: {}, ...(grouping.kind === 'builtin' ? { group: VIEW_CHOICE } : {}) },
939
- });
940
- showSpace(space.id);
941
- return space;
942
- },
943
- }
944
- : {}),
945
- listProjectSessions,
946
- async setProjectSpace(project, spaceId) {
947
- const members = await listProjectSessions(project);
948
- for (const member of members) {
949
- await sessions.setSpace?.(member.id, spaceId);
950
- views.forgetSession(member.id, spaceId);
951
- }
952
- await refresh();
953
- return members.length;
954
- },
955
- };
956
- }
957
-
958
- /** The activity axis as a relative `updatedAt` bound, for a saved view's query. */
959
- const ACTIVITY_BOUND: Record<Exclude<SessionActivityFilter, 'all'>, QueryBound> = {
960
- '1d': '-1d',
961
- '3d': '-3d',
962
- '7d': '-7d',
963
- '30d': '-30d',
964
- };
965
-
966
- const ACTIVITY_FILTER_MS: Record<Exclude<SessionActivityFilter, 'all'>, number> = {
967
- '1d': 24 * 60 * 60 * 1000,
968
- '3d': 3 * 24 * 60 * 60 * 1000,
969
- '7d': 7 * 24 * 60 * 60 * 1000,
970
- '30d': 30 * 24 * 60 * 60 * 1000,
971
- };
972
-
973
- /**
974
- * The project filter's key for a session: its folder's name, as a query's
975
- * `projectName` reads it (`projectNameOf`: `/` and `\` both separate), so a
976
- * view saved from the filter matches the same sessions.
977
- *
978
- * @param session - Its folder and project root.
979
- */
980
- export function projectKeyOf(session: Pick<SidebarListSession, 'projectRoot' | 'cwd'>): string {
981
- return projectNameOf({ projectRoot: session.projectRoot ?? null, cwd: session.cwd }) ?? '';
982
- }
983
-
984
- /**
985
- * Every project the sessions belong to, by folder name, sorted.
986
- *
987
- * @param sessions - The listed sessions.
988
- */
989
- export function availableProjectsOf(sessions: readonly SidebarListSession[]): string[] {
990
- const seen = new Set<string>();
991
- for (const s of sessions) {
992
- const key = projectKeyOf(s);
993
- if (key) seen.add(key);
994
- }
995
- return Array.from(seen).sort();
996
- }
997
-
998
- /** How a reference names a session: its title, and its folder's name when it has one. */
999
- export interface SessionRef {
1000
- /** The session's title. */
1001
- title: string;
1002
- /** Directory basename — the sidebar's project label. Absent for a directory-less session. */
1003
- dir?: string;
1004
- }
1005
-
1006
- /**
1007
- * Each session's {@link SessionRef}, by id.
1008
- *
1009
- * @param sessions - The listed sessions.
1010
- */
1011
- export function sessionRefsOf(sessions: readonly SidebarListSession[]): Map<string, SessionRef> {
1012
- return new Map(
1013
- sessions.map((s) => {
1014
- const dir = sessionDirLabel(s.projectRoot);
1015
- return [s.id, dir ? { title: s.title, dir } : { title: s.title }];
1016
- }),
1017
- );
1018
- }
1019
-
1020
- /**
1021
- * The sessions the list shows: the space's (a remote session without a space
1022
- * shows in every space), then the project and activity filters. The same
1023
- * array when nothing filters.
1024
- *
1025
- * @param sessions - Every listed session.
1026
- * @param filter - The space predicate (`null`: spaces off), the project and activity axes.
1027
- */
1028
- export function filterDirectorySessions<S extends SidebarListSession>(
1029
- sessions: readonly S[],
1030
- filter: {
1031
- inSpace: ((session: S) => boolean) | null;
1032
- project: string | null;
1033
- activity: SessionActivityFilter;
1034
- now?: number;
1035
- },
1036
- ): readonly S[] {
1037
- const { inSpace, project, activity } = filter;
1038
- if (project === null && activity === 'all' && inSpace === null) return sessions;
1039
- const cutoff = activity === 'all' ? 0 : (filter.now ?? Date.now()) - ACTIVITY_FILTER_MS[activity];
1040
- return sessions.filter((s) => {
1041
- if (inSpace && !inSpace(s) && !(s.hostId && !s.spaceId)) return false;
1042
- if (project !== null && projectKeyOf(s) !== project) return false;
1043
- if (cutoff > 0 && s.updatedAt < cutoff) return false;
1044
- return true;
1045
- });
1046
- }