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,1071 +0,0 @@
1
- /**
2
- * The desktop app's rich composer: a Tiptap editor set in the chatbox card,
3
- * with `@` `/` `#` and extension completions, typed badges, inline ghost
4
- * text and the next-prompt suggestion, shell (`!`) and transcript-search
5
- * (`?`) modes, ↑/↓ prompt history, staged attachments, the shared
6
- * per-session draft and the composer bus. Data comes from `ComposerHost`
7
- * (`useComposerHost`); sending is the app's (`onSend`).
8
- *
9
- * Its modules: `use-composer-editor.ts` (the editor: `composer-extensions.ts`,
10
- * `composer-keys.ts`), `use-ghost-lifecycle.ts`, `use-draft-mirror.ts`,
11
- * `use-composer-sources.ts`, `use-composer-bus.ts`, `use-staged-attachments.ts`,
12
- * `composer-controls.tsx`.
13
- */
14
- import { EditorContent, useEditorState, type Editor } from '@tiptap/react';
15
- import {
16
- type ChangeEvent,
17
- type ComponentType,
18
- type CSSProperties,
19
- type MouseEvent as ReactMouseEvent,
20
- type ReactNode,
21
- useEffect,
22
- useLayoutEffect,
23
- useMemo,
24
- useRef,
25
- useState,
26
- } from 'react';
27
- import { createSkillsCompletionProvider, type InlineGhost, uniqueSkillNamesFromReferences } from 'zidane/chat/pure';
28
-
29
- import { useLightbox } from '../../components/Lightbox';
30
- import { basename } from '../../path';
31
- import { AttachmentNotices, attachmentLightboxItems } from '../composer/attachments';
32
- import { type AttachmentLabelFn, AttachmentRow } from '../composer/AttachmentTiles';
33
- import { useComposerHost, useComposerLabels } from '../composer/ComposerHostProvider';
34
- import { usePromptHistory } from '../composer/PromptHistoryProvider';
35
- import { plainTextToDocJson } from '../composer/prompt-history-nav';
36
- import { composeSubmitText, type ComposerMode, unsentDraft } from '../headless/composer-modes';
37
- import { findCommand } from '../headless/composer/commands';
38
- import { draftTextToDocJson } from '../headless/composer/draft-sync';
39
- import { editorJsonToMarkdown, type JsonNode } from '../headless/composer/editor-markdown';
40
- import type { GhostController, PromptGhostOffer } from '../headless/composer/ghost-autocomplete';
41
- import type { ComposerAttachment, ComposerCommandArgs } from '../headless/composer/host';
42
- import type { ChatSiteIcons } from '../headless/transcript-host';
43
- import type { TextPreviewSlotProps } from '../transcript/renderers';
44
- import { badgeDecorationsKey, createBadgeDecorationsPlugin, refreshBadgeDecorations } from './badge-decorations';
45
- import { MODE_CHIP, modeChipTone, PlusButton, SendStopButton } from './composer-controls';
46
- import { ghostTextPluginKey } from './ghost-plugin';
47
- import { createPopoverGate } from './mention-popover';
48
- import { useComposerBus } from './use-composer-bus';
49
- import { useComposerEditor } from './use-composer-editor';
50
- import { useComposerSources } from './use-composer-sources';
51
- import { useExtensionComposerEffects } from './use-extension-composer';
52
- import { ExtensionSlot } from '../../extensions/ExtensionSlot';
53
- import { serializeDraftText, useDraftMirror } from './use-draft-mirror';
54
- import { type GhostLifecycle, useGhostLifecycle, useSharedGhost } from './use-ghost-lifecycle';
55
- import { usePromptGhost } from './use-prompt-ghost';
56
- import { useStagedAttachments } from './use-staged-attachments';
57
-
58
- /**
59
- * Once-latch for the `useEditorState` selector's `getText()` catch —
60
- * see the comment at the catch site. Module-level (not a ref) because
61
- * the selector can run before any render commits, and one warning per
62
- * app lifetime is the point.
63
- */
64
- let warnedEditorGetText = false;
65
-
66
- const NO_ARGS: ReadonlySet<string> = new Set();
67
-
68
- /** Props for {@link RichComposer}. */
69
- export interface RichComposerProps {
70
- /** No folder picked: read-only, with its own placeholder. */
71
- disabled: boolean;
72
- /** The folder the session runs in (`''`: none; `null`: none picked yet). */
73
- folderPath: string | null;
74
-
75
- /**
76
- * Where `@` file mentions list from, when it isn't `folderPath`: a sandbox
77
- * session's virtual root (`SidebarSession.workspace`).
78
- */
79
- fileRoot?: string;
80
- /** The session the composer writes to (`null`: a new chat). */
81
- activeSessionId?: string | null;
82
-
83
- /**
84
- * The server the session (or the draft) runs on: `/` commands, their
85
- * arguments and the ghost text come from it; this window's extension
86
- * popups don't apply there. Absent = This computer.
87
- */
88
- hostId?: string | null;
89
-
90
- /** When true, the send button is replaced by a stop button that calls `onStop`. */
91
- running?: boolean;
92
- /** Stops the run. */
93
- onStop?: () => void;
94
- /** Sends a prompt. Rejecting puts the prompt back in an empty composer. */
95
- onSend: (
96
- text: string,
97
- attachments: ComposerAttachment[],
98
- skills: string[],
99
- opts?: { keepDraft?: boolean },
100
- ) => void | Promise<void>;
101
-
102
- /**
103
- * Rendered next to the `+` attachment button — typically the inline
104
- * AgentPicker. Kept as a slot so the Chatbox doesn't need to know
105
- * which app-level controls the user wants inline.
106
- */
107
- leadingActions?: React.ReactNode;
108
-
109
- /**
110
- * Rendered on the right side of the controls row, immediately before
111
- * the Send / Stop button — the per-session context gauge + cost pill
112
- * cluster lives here. Slot keeps Chatbox agnostic of the actual
113
- * pills (App.tsx owns the state, Center.tsx threads the node in).
114
- * Children are responsible for their own collapse behavior; the
115
- * Chatbox surface declares a CSS container so container queries on
116
- * descendants can react to the prompt's inline-size.
117
- */
118
- trailingActions?: React.ReactNode;
119
-
120
- /**
121
- * The badge strip (`ConversationBadges`, the kit's `ComposerBadges`): the
122
- * band at the top of the tray ring, above the card, the git bar's mirror.
123
- * Built by `ConversationComposer`, so a keystroke here never re-renders it.
124
- */
125
- badges?: React.ReactNode;
126
-
127
- /*
128
- * ---- `?` transcript-search mode (TUI parity) --------------------
129
- * The Chatbox owns the MODE (entered by typing `?` into an empty
130
- * composer, exited by Esc / Backspace-at-start); the host owns the
131
- * search ENGINE (`useTranscriptSearch` needs the transcript's scroll
132
- * container + events, which live in Center). Query changes stream
133
- * out through `onSearchQueryChange` (`null` = mode exited), match
134
- * hops go through `onSearchNavigate`, and the counter state comes
135
- * back in as `searchStatus`.
136
- */
137
- /** The search engine's counter while in search mode: matches, whether capped, the active one, whether a query is typed. */
138
- searchStatus?: { count: number; capped: boolean; activeIndex: number; hasNeedle: boolean } | null;
139
- /** The search query as typed (`null`: search mode exited). */
140
- onSearchQueryChange?: (query: string | null) => void;
141
- /** Hops to the next (`1`) or previous (`-1`) match. */
142
- onSearchNavigate?: (direction: 1 | -1) => void;
143
-
144
- /**
145
- * True while the ⌘F overlay is open. The overlay and the composer
146
- * mode drive the same document-wide highlight registry, so opening
147
- * the overlay force-exits the composer's search mode.
148
- */
149
- searchOverlayOpen?: boolean;
150
-
151
- /**
152
- * Shared-search application (daemon mode) — Center threads the active
153
- * session's `search:changed` signals here so the composer's `?` mode
154
- * mirrors a search driven from another window. `seq` forces the apply
155
- * effect to re-fire on every signal (values alone can repeat).
156
- */
157
- remoteSearchApply?: { active: boolean; query: string; seq: number } | null;
158
- /** Pasted and dropped files become attachments (off: images and long pastes stay inline, drops are ignored). Default true. */
159
- attachmentsEnabled?: boolean;
160
- /** Inline ghost-text autocomplete (`ComposerHost.autocomplete`). Default false. */
161
- inlineAutocomplete?: boolean;
162
- /** The next-prompt suggestion as a ghost while the composer is empty (`ComposerHost.suggestions`). Default false. */
163
- promptSuggestions?: boolean;
164
- /** The composer's scope on the composer bus (`composer-bus.ts`): pushes aimed at it land here. */
165
- scopeKey?: string | null;
166
- /** The commands' fixed argument values (the command badge, the `/` popover's arguments). */
167
- commandArgs?: ComposerCommandArgs;
168
- /** Site icons for link badges. Absent: links show the globe. */
169
- siteIcons?: ChatSiteIcons;
170
- /** The icon and name an attachment tile shows. */
171
- attachmentLabel?: AttachmentLabelFn;
172
- /** What a text attachment opens as in the lightbox. Default: the kit's `TextPreview`. */
173
- textPreview?: ComponentType<TextPreviewSlotProps>;
174
- /** Rendered in the tray under the card (the desktop app's git bar). */
175
- footer?: ReactNode;
176
- /** Classes merged on the root. */
177
- className?: string;
178
- /** Styles on the root. */
179
- style?: CSSProperties;
180
- }
181
-
182
- /**
183
- * Search-mode tint — the TUI paints its search-mode prompt border with
184
- * `COLOR.warn`; the GUI uses the themable `--zg-warn` token (tokens.css
185
- * defaults it to amber, theme packs can override). Shell mode reuses the
186
- * accent, exactly like the TUI.
187
- */
188
- const SEARCH_MODE_COLOR = 'var(--zg-warn)';
189
-
190
- /** What the composer's editor-state selector returns for a non-empty draft outside search mode. */
191
- const DRAFT_HAS_TEXT = '\u0000draft';
192
-
193
- /**
194
- * The desktop app's composer card: the editor, its completions and modes, staged attachments and Send / Stop.
195
- *
196
- * @param props - What the composer edits and sends, and its slots.
197
- */
198
- export function RichComposer({
199
- disabled,
200
- folderPath,
201
- fileRoot,
202
- activeSessionId = null,
203
- hostId = null,
204
- running = false,
205
- onStop,
206
- onSend,
207
- leadingActions,
208
- trailingActions,
209
- badges,
210
- searchStatus = null,
211
- onSearchQueryChange,
212
- onSearchNavigate,
213
- searchOverlayOpen = false,
214
- remoteSearchApply = null,
215
- attachmentsEnabled = true,
216
- inlineAutocomplete = false,
217
- promptSuggestions = false,
218
- scopeKey = null,
219
- commandArgs,
220
- siteIcons,
221
- attachmentLabel,
222
- textPreview,
223
- footer,
224
- className,
225
- style,
226
- }: RichComposerProps) {
227
- const { completions, autocomplete } = useComposerHost();
228
- const labels = useComposerLabels();
229
-
230
- /*
231
- * Prompt history — the provider owns the per-session ring (draft
232
- * stash, cursor, persistence); the Chatbox owns the keyboard edge
233
- * conditions and the "history N/M" indicator.
234
- */
235
- const history = usePromptHistory();
236
- const [historyStatus, setHistoryStatus] = useState<{ position: number; total: number } | null>(null);
237
-
238
- /*
239
- * `editorRef` exposes the live TipTap editor to closures captured by
240
- * `editorProps.handleKeyDown` (which is evaluated when `useEditor`
241
- * builds the editor — at that point the `editor` const itself is still
242
- * undefined). The ref is wired below via `useEffect`.
243
- */
244
- const editorRef = useRef<Editor | null>(null);
245
- // TipTap's destroy() nulls the command manager while the ref still holds the
246
- // editor: `editor.commands` then throws. Effects reach the editor through this.
247
- const liveEditor = () => {
248
- const ed = editorRef.current;
249
- return ed && !ed.isDestroyed ? ed : null;
250
- };
251
-
252
- /*
253
- * Completion catalogs (`chatbox/use-composer-sources.ts`): one stable handle
254
- * the editor's callbacks read per call (the popover re-renders itself,
255
- * `chatbox/mention-popover.ts`). A commands or skills change re-reads the
256
- * typed `/name` badges.
257
- */
258
- const [refreshBadges] = useState(() => () => {
259
- const ed = editorRef.current;
260
- if (ed && !ed.isDestroyed) refreshBadgeDecorations(ed.view);
261
- });
262
- const { sources, providers: extensionCompletionProviders } = useComposerSources(
263
- folderPath,
264
- fileRoot ?? null,
265
- hostId,
266
- refreshBadges,
267
- );
268
- const [mentionPopovers] = useState(createPopoverGate);
269
- const staged = useStagedAttachments();
270
- const {
271
- attachments,
272
- setAttachments,
273
- addFiles: addAttachmentFiles,
274
- replace: replaceAttachments,
275
- notices: attachmentNotices,
276
- exitingIds,
277
- removeAttachment,
278
- finalizeRemove,
279
- } = staged;
280
- // Synchronous re-entry guard: React state updates flush async, so two rapid
281
- // Enter presses could both pass a state check across the submit-hook await.
282
- // A ref claimed synchronously closes that window; `submitting` state only
283
- // drives the button's disabled visual.
284
- const submittingRef = useRef(false);
285
- const [submitting, setSubmitting] = useState(false);
286
-
287
- /*
288
- * Composer prompt mode — TUI parity (src/tui/prompt/). `!` typed
289
- * into an empty composer enters SHELL mode (the bang is consumed;
290
- * submit re-attaches it), `?` enters transcript-SEARCH mode (the
291
- * draft drives the host's match engine). Stateful — NOT derived from
292
- * the draft text — so the sentinel never sits in the buffer and
293
- * pasted/recalled `!cmd` stays literal.
294
- *
295
- * `modeRef` is the synchronous mirror for the `editorProps.handleKeyDown`
296
- * closure (captured at `useEditor` build time) and for same-tick
297
- * reads after a flip — the TUI's `setShellModeNow` pattern.
298
- */
299
- const [composerMode, setComposerMode] = useState<ComposerMode>('normal');
300
- const modeRef = useRef<ComposerMode>('normal');
301
-
302
- /*
303
- * Edit-less ghost-gate transitions (popover closed, prompt mode
304
- * flipped, setting toggled) re-evaluate the ghost through here —
305
- * assigned by the ghost lifecycle effect below, no-op until the
306
- * editor mounts. The TUI gets this for free from its trigger effect's
307
- * dependency list (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts);
308
- * the GUI's transaction listener
309
- * only sees edits, so the gate-flag owners call this explicitly.
310
- */
311
- const ghostGateChangedRef = useRef<() => void>(() => {});
312
-
313
- const applyMode = (next: ComposerMode) => {
314
- const prev = modeRef.current;
315
-
316
- if (prev === next) {
317
- return;
318
- }
319
-
320
- modeRef.current = next;
321
- setComposerMode(next);
322
-
323
- /*
324
- * Search mode is a live wire to the host's engine: entering opens
325
- * the (empty) query, leaving sends `null` so the host clears the
326
- * highlights + counter.
327
- */
328
- if (next === 'search') {
329
- live.current.onSearchQueryChange?.('');
330
- } else if (prev === 'search') {
331
- live.current.onSearchQueryChange?.(null);
332
- }
333
-
334
- /*
335
- * The mode is a ghost-gate input that just flipped WITHOUT an edit
336
- * — e.g. shell mode exiting on Backspace-at-start keeps the buffer.
337
- * The TUI's trigger effect re-runs on `shellMode`/`searchMode`
338
- * (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts)
339
- * and re-queries; mirror that here.
340
- */
341
- ghostGateChangedRef.current();
342
- };
343
-
344
- /*
345
- * ---- Inline ghost-text autocomplete (TUI parity) -----------------
346
- * State is a ref + a ProseMirror plugin, not React state: the ghost
347
- * changes per keystroke and is consumed by `editorProps.handleKeyDown`
348
- * (captured at `useEditor` build time) and painted by the plugin's
349
- * decoration — a re-render would buy nothing. `applyGhost` keeps the
350
- * ref and the plugin's display string in lockstep. The canonical
351
- * provider engine runs main-side behind `autocomplete:inline`; the
352
- * snapshot/patch machinery is the canonical `patchInlineGhost`
353
- * (core `zidane/chat/pure`, `inline-ghost.ts`).
354
- */
355
- const ghostRef = useRef<InlineGhost | null>(null);
356
- // Bumped per transaction — an IPC reply whose sequence is stale is
357
- // dropped (latest-wins), the renderer half of the TUI's abort-on-edit
358
- // (`useInlineGhostQuery`, src/tui/prompt/use-inline-ghost-query.ts).
359
- const inlineAutocompleteEnabled = !disabled && inlineAutocomplete;
360
- // True only while a prompt-history recall's own setContent/focus
361
- // transactions run — browsing history must not pop ghosts, but editing
362
- // the recalled text afterwards queries normally.
363
- const historyRecallRef = useRef(false);
364
-
365
- // The next-prompt suggestion rides the same ghost plugin while the doc is empty (`chatbox/use-prompt-ghost.ts`).
366
- const promptGhost = usePromptGhost(activeSessionId, running, !disabled && promptSuggestions, () =>
367
- ghostGateChangedRef.current(),
368
- );
369
-
370
- const applyGhost = (next: InlineGhost | null, prompt?: PromptGhostOffer) => {
371
- ghostRef.current = next;
372
- promptGhost.setPainted(next ? (prompt ?? null) : null);
373
-
374
- const ed = editorRef.current;
375
-
376
- if (!ed || ed.isDestroyed) {
377
- return;
378
- }
379
-
380
- const display = next ? next.suffixes[next.index] : null;
381
-
382
- if (ghostTextPluginKey.getState(ed.state) !== display) {
383
- ed.view.dispatch(ed.state.tr.setMeta(ghostTextPluginKey, display));
384
- }
385
- };
386
-
387
- // Read by callbacks registered once (editor plugins, IPC listeners, mount-keyed effects): current as of the last commit.
388
- const live = useRef({
389
- activeSessionId,
390
- folderPath,
391
- hostId,
392
- inlineAutocompleteEnabled,
393
- onSearchQueryChange,
394
- applyMode,
395
- applyGhost,
396
- });
397
- useLayoutEffect(() => {
398
- live.current = {
399
- activeSessionId,
400
- folderPath,
401
- hostId,
402
- inlineAutocompleteEnabled,
403
- onSearchQueryChange,
404
- applyMode,
405
- applyGhost,
406
- };
407
- });
408
- // Live controller handle for the remote-mirror path — its `hasPending()`
409
- // is the "this window is the active typist" test.
410
- const ghostControllerRef = useRef<GhostController | null>(null);
411
-
412
- const [isDragOver, setIsDragOver] = useState(false);
413
- const lightbox = useLightbox();
414
- const openLightbox = (id: string, origin: HTMLElement) => {
415
- const items = attachmentLightboxItems(attachments, textPreview);
416
- lightbox.open(
417
- items,
418
- items.findIndex((item) => item.key === id),
419
- origin,
420
- );
421
- };
422
- const fileInputRef = useRef<HTMLInputElement>(null);
423
-
424
- // eslint-disable-next-line react-hooks/exhaustive-deps -- stable handles (refs, built-once sources and host); the effect keys on what it re-runs for
425
- const skillsProvider = useMemo(() => createSkillsCompletionProvider({ getCatalog: () => sources.skills() }), []);
426
-
427
- const editor = useComposerEditor({
428
- disabled,
429
- folderPath,
430
- extensionCompletionProviders,
431
- sources,
432
- skillsProvider,
433
- mentionPopovers,
434
- promptGhost,
435
- editorRef,
436
- modeRef,
437
- ghostRef,
438
- historyRecallRef,
439
- ghostGateChangedRef,
440
- attachmentsEnabled,
441
- history,
442
- activeSessionId,
443
- hostId,
444
- // Declared below: it reads the editor.
445
- send: () => send(),
446
- onSearchNavigate,
447
- applyMode,
448
- applyGhost,
449
- addFiles: addAttachmentFiles,
450
- setHistoryStatus,
451
- commandArgs,
452
- });
453
-
454
- /*
455
- * Mirror `editor` into `editorRef` so the `editorProps.handleKeyDown`
456
- * closure can reach the live TipTap commands API (e.g. for the
457
- * history-cycle setContent). `useEditor` returns a fresh instance
458
- * when its deps change, so we re-pin each render.
459
- */
460
- useEffect(() => {
461
- editorRef.current = editor;
462
- }, [editor]);
463
-
464
- // Links and a leading command's `/name` read as badges while typed (see badge-decorations.ts).
465
- useEffect(() => {
466
- if (!editor || editor.isDestroyed) {
467
- return;
468
- }
469
-
470
- const scope = () => ({ cwd: live.current.folderPath ?? '', hostId: live.current.hostId });
471
- editor.registerPlugin(
472
- createBadgeDecorationsPlugin(
473
- {
474
- isCommand: (name) => findCommand(sources.commands.peek(), name) !== undefined,
475
- args: (name) => commandArgs?.args(scope(), name) ?? NO_ARGS,
476
- request: (name) => commandArgs?.request(scope(), name),
477
- ...(commandArgs ? { subscribe: (listener: () => void) => commandArgs.subscribe(listener) } : {}),
478
- isSkill: (name) => sources.skills().some((skill) => skill.name === name),
479
- },
480
- siteIcons,
481
- ),
482
- );
483
-
484
- return () => {
485
- if (!editor.isDestroyed) {
486
- editor.unregisterPlugin(badgeDecorationsKey);
487
- }
488
- };
489
- // eslint-disable-next-line react-hooks/exhaustive-deps -- stable handles (refs, built-once sources and host); the effect keys on what it re-runs for
490
- }, [editor]);
491
-
492
- const ghost: GhostLifecycle = {
493
- editor,
494
- editorRef,
495
- live,
496
- autocomplete,
497
- inlineAutocompleteEnabled,
498
- mentionPopovers,
499
- modeRef,
500
- historyRecallRef,
501
- ghostRef,
502
- promptGhost,
503
- ghostGateChangedRef,
504
- ghostControllerRef,
505
- };
506
- useGhostLifecycle(ghost);
507
-
508
- /*
509
- * Fresh session, fresh navigation: a cursor parked by an earlier
510
- * visit shouldn't make the first ↑ resume mid-ring, and the "history
511
- * N/M" indicator belongs to the session it was navigating.
512
- */
513
- useEffect(() => {
514
- // eslint-disable-next-line react-hooks/set-state-in-effect -- resets with the scope it keys on
515
- setHistoryStatus(null);
516
-
517
- if (activeSessionId) {
518
- history.reset(activeSessionId);
519
- }
520
- }, [activeSessionId, history]);
521
-
522
- const send = () => {
523
- if (!editor) {
524
- return;
525
- }
526
-
527
- /*
528
- * Serialize through the JSON walker rather than `getText()` (which drops
529
- * the mention nodes' ids), with ONE newline per line
530
- * break: the prompt is sent, stored, shown and recalled exactly as it
531
- * looks in the composer. The markdown paragraph gap (`\n\n` per block)
532
- * doubled every line break and tripled every blank line in the
533
- * transcript, the TUI and ↑ history recall.
534
- */
535
- const raw = editorJsonToMarkdown(editor.getJSON() as JsonNode, { blockGap: '\n' }).trim();
536
-
537
- /*
538
- * Shell mode re-attaches the consumed bang so the submit contract
539
- * stays `!cmd` end to end (Center's handleSend + prompt history —
540
- * TUI `submit` in src/tui/prompt/use-composer-actions.ts). A blank
541
- * shell command never submits,
542
- * even with attachments staged; search mode never submits at all.
543
- */
544
- const text = composeSubmitText(modeRef.current, raw);
545
-
546
- if (text === null || (!text && attachments.length === 0) || disabled || submittingRef.current) {
547
- return;
548
- }
549
-
550
- // Submit leaves shell mode — the next prompt starts normal (TUI
551
- // `submit` in src/tui/prompt/use-composer-actions.ts).
552
- live.current.applyMode('normal');
553
-
554
- const submitted = attachments;
555
-
556
- // Clear the composer optimistically: the box empties on the same tick the
557
- // user hits Enter, and a second Enter can't re-submit the same text while
558
- // the submit-hook IPC is in flight.
559
- editor.commands.clearContent();
560
- replaceAttachments([]);
561
- mirror.dropStash();
562
- // Submitting exits history navigation (the host's `push` resets the
563
- // provider cursor); drop the indicator on the same tick.
564
- setHistoryStatus(null);
565
- dispatch(text, submitted);
566
- };
567
-
568
- /*
569
- * A prompt sent from elsewhere (Continue / Retry, the palette): the same
570
- * dispatch as Enter, without reading or clearing the composer.
571
- */
572
- const sendText = (raw: string) => {
573
- const text = raw.trim();
574
- if (!text || disabled || submittingRef.current) {
575
- return;
576
- }
577
- dispatch(text, [], { keepDraft: true });
578
- };
579
-
580
- const dispatch = (text: string, submitted: typeof attachments, opts?: { keepDraft?: boolean }) => {
581
- /*
582
- * Submit-time skill activation. `parseReferences` runs against the
583
- * editor's rendered plain text — TipTap mention nodes serialize back
584
- * to `/<name>` / `@<path>` / `#<chat>`, matching the chat providers'
585
- * reference grammars. Same code path the TUI calls before `agent.run()`.
586
- */
587
- const references = skillsProvider.parseReferences(text, { text, cursor: text.length });
588
- const skills = uniqueSkillNamesFromReferences(references);
589
- mirror.promoteNewChat(live.current.activeSessionId === null);
590
- submittingRef.current = true;
591
- setSubmitting(true);
592
-
593
- // Run extension submit hooks (resolveReferences/onSubmit) before the turn
594
- // is dispatched so their side effects land first, then send.
595
- void (async () => {
596
- try {
597
- if (folderPath !== null) {
598
- await completions?.submit?.({ cwd: folderPath, hostId }, text, text.length).catch(() => undefined);
599
- }
600
- await onSend(text, submitted, skills, opts);
601
- } catch {
602
- /*
603
- * Not sent (the host says why, e.g. a new chat's server went
604
- * offline): the box was cleared on Enter, so put the prompt back,
605
- * unless something was typed since or it came from elsewhere.
606
- */
607
- mirror.promoteNewChat(false);
608
- const ed = editorRef.current;
609
- if (!opts?.keepDraft && ed && !ed.isDestroyed && serializeDraftText(ed) === '') {
610
- const draft = unsentDraft(text);
611
- mirror.applyDraft(draft.text, draft.shell);
612
- setAttachments((current) => (current.length === 0 ? [...submitted] : current));
613
- }
614
- } finally {
615
- submittingRef.current = false;
616
- setSubmitting(false);
617
- }
618
- })();
619
- };
620
-
621
- /*
622
- * Live plain-text mirror of the draft. TipTap v3's `useEditor` does
623
- * NOT re-render the host component on transactions (its internal
624
- * `shouldRerenderOnTransaction` selector short-circuits to `null`
625
- * when the option is unset), so render-time `editor.getText()` reads
626
- * — as a draft-derived `hasContent` or shell flag would do — only
627
- * ever see the state from the LAST unrelated re-render, so the send
628
- * button and the `!` affordance would look dead while typing.
629
- * `useEditorState` subscribes to transactions and re-renders
630
- * exactly when the selected string changes.
631
- *
632
- * Outside search mode only emptiness is selected (`DRAFT_HAS_TEXT`), so
633
- * the composer does not re-render on every keystroke for a send button
634
- * that only cares whether there is anything to send. Search mode selects
635
- * the text itself (it drives the match engine per edit).
636
- */
637
- const searchingDraft = composerMode === 'search';
638
- const editorPlainText =
639
- useEditorState({
640
- editor,
641
- /*
642
- * Defensive beyond the null check: on the very first render the
643
- * editor INSTANCE can exist while its state/schema is still being
644
- * constructed — `getText()` then dereferences a null schema inside
645
- * `getTextSerializersFromSchema` and the whole app white-screens
646
- * (this exact crash shipped once; caught by the e2e launch test).
647
- * A mid-construction snapshot is worthless anyway: the store
648
- * notifies again the moment the editor is ready.
649
- */
650
- selector: (ctx) => {
651
- const ed = ctx.editor;
652
-
653
- if (!ed || ed.isDestroyed) {
654
- return '';
655
- }
656
-
657
- try {
658
- const text = ed.getText({ blockSeparator: '\n' });
659
- if (searchingDraft) return text;
660
- return text.trim().length > 0 ? DRAFT_HAS_TEXT : '';
661
- } catch (error) {
662
- /*
663
- * Once-latched: the selector runs per transaction, so an
664
- * editor whose serialization is persistently broken would
665
- * otherwise spam a warn per keystroke — but swallowing
666
- * silently forever hides the breakage (send button dead with
667
- * no trace). One warning is enough to diagnose.
668
- */
669
- if (!warnedEditorGetText) {
670
- warnedEditorGetText = true;
671
- console.warn('[chatbox] editor.getText() threw; treating the draft as empty.', error);
672
- }
673
-
674
- return '';
675
- }
676
- },
677
- }) ?? '';
678
-
679
- const hasContent = editorPlainText.trim().length > 0 || attachments.length > 0;
680
- const canSend = !disabled && !submitting && hasContent && composerMode !== 'search';
681
-
682
- const shellMode = !disabled && composerMode === 'shell';
683
- const searchMode = !disabled && composerMode === 'search';
684
-
685
- /*
686
- * Search mode is a live wire: every draft edit re-drives the host's
687
- * match engine (TUI parity — `syncBuffer` pushes `onSearchQueryChange`
688
- * per keystroke, src/tui/prompt/use-sync-buffer.ts).
689
- */
690
- useEffect(() => {
691
- if (composerMode === 'search') {
692
- live.current.onSearchQueryChange?.(editorPlainText);
693
- }
694
- }, [composerMode, editorPlainText]);
695
-
696
- /*
697
- * Mode flips happen on consumed keystrokes (no transaction), so the
698
- * Placeholder decoration — recomputed only per state update — would
699
- * keep the previous copy. A no-op dispatch repaints it.
700
- */
701
- useEffect(() => {
702
- const ed = editorRef.current;
703
-
704
- if (ed && !ed.isDestroyed) {
705
- ed.view.dispatch(ed.state.tr);
706
- }
707
- }, [composerMode]);
708
-
709
- /*
710
- * Session switch tears the mode down: a shell/search mode armed on
711
- * one conversation must not leak into the next (the TUI's modes are
712
- * per-prompt-block state with the same lifetime). Search also drops
713
- * its query text — it belongs to the previous transcript.
714
- */
715
- useEffect(() => {
716
- if (modeRef.current === 'search') {
717
- liveEditor()?.commands.clearContent(true);
718
- }
719
-
720
- live.current.applyMode('normal');
721
- }, [activeSessionId]);
722
-
723
- /*
724
- * The ⌘F overlay owns the same document-wide highlight registry —
725
- * opening it while the composer is searching would leave two writers
726
- * fighting per stream tick. The overlay wins; the composer exits.
727
- */
728
- useEffect(() => {
729
- if (searchOverlayOpen && modeRef.current === 'search') {
730
- liveEditor()?.commands.clearContent(true);
731
- live.current.applyMode('normal');
732
- }
733
- }, [searchOverlayOpen]);
734
-
735
- // The shared per-session draft and the buffers kept across session switches (`chatbox/use-draft-mirror.ts`).
736
- const mirror = useDraftMirror({
737
- editor,
738
- editorRef,
739
- modeRef,
740
- composerMode,
741
- activeSessionId,
742
- staged,
743
- applyMode,
744
- resetHistoryStatus: () => setHistoryStatus(null),
745
- });
746
-
747
- // Far-away producers (review comments, palette prompts, Edit message) push into this composer.
748
- useComposerBus(scopeKey, {
749
- attachment: staged.add,
750
- mention: (path) => {
751
- liveEditor()
752
- ?.chain()
753
- .focus('end')
754
- .insertContent([
755
- { type: 'mention', attrs: { id: path, label: basename(path) } },
756
- { type: 'text', text: ' ' },
757
- ])
758
- .run();
759
- },
760
- insert: (text) => {
761
- liveEditor()?.chain().focus('end').insertContent(text).run();
762
- },
763
- focus: () => {
764
- liveEditor()?.commands.focus('end');
765
- },
766
- // Sent as is, beside the draft: whatever the user was typing stays put.
767
- prompt: sendText,
768
- // The draft is replaced, not merged.
769
- draft: ({ text, attachments: next }) => {
770
- const ed = liveEditor();
771
- if (!ed) return;
772
- live.current.applyMode('normal');
773
- ed.chain().setContent(draftTextToDocJson(text), { emitUpdate: true }).focus('end').run();
774
- replaceAttachments([...next]);
775
- },
776
- });
777
-
778
- // The extensions' `ctx.composer` edits for this composer.
779
- useExtensionComposerEffects({
780
- sessionId: activeSessionId,
781
- scopeKey,
782
- enabled: !disabled,
783
- insert: (text) => {
784
- const ed = liveEditor();
785
- if (!ed) return false;
786
- ed.chain().focus('end').insertContent(text).run();
787
- return true;
788
- },
789
- setText: (text) => {
790
- const ed = liveEditor();
791
- if (!ed) return false;
792
- live.current.applyMode('normal');
793
- ed.chain().setContent(draftTextToDocJson(text), { emitUpdate: true }).focus('end').run();
794
- return true;
795
- },
796
- attach: staged.add,
797
- });
798
-
799
- useSharedGhost(ghost);
800
-
801
- /*
802
- * Shared-search application (daemon mode). Mode + buffer are set
803
- * directly (NOT via `applyMode`) so no `onSearchQueryChange` fires —
804
- * Center already holds the remote value; re-emitting the transient ''
805
- * from `applyMode('search')` would publish it back and clobber the
806
- * remote query. The live-wire effect above re-emits the final query
807
- * after `setContent`, which Center's echo guard absorbs.
808
- */
809
- useEffect(() => {
810
- if (!remoteSearchApply) {
811
- return;
812
- }
813
-
814
- const ed = editorRef.current;
815
-
816
- if (!ed || ed.isDestroyed) {
817
- return;
818
- }
819
-
820
- if (remoteSearchApply.active) {
821
- if (modeRef.current !== 'search') {
822
- modeRef.current = 'search';
823
- setComposerMode('search');
824
- }
825
-
826
- if (ed.getText({ blockSeparator: '\n' }) !== remoteSearchApply.query) {
827
- ed.commands.setContent(plainTextToDocJson(remoteSearchApply.query), { emitUpdate: true });
828
- }
829
- } else if (modeRef.current === 'search') {
830
- ed.commands.clearContent(true);
831
- modeRef.current = 'normal';
832
- setComposerMode('normal');
833
- }
834
- // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed by seq: values alone can repeat across signals.
835
- }, [remoteSearchApply?.seq]);
836
-
837
- const onPlusClick = () => fileInputRef.current?.click();
838
-
839
- const onFilesPicked = (event: ChangeEvent<HTMLInputElement>) => {
840
- /*
841
- * The picker offers every file (no `accept`): what can attach is
842
- * `readAttachment`'s call, the same for paste and drop, and a refused
843
- * file says why in the card. Images become `PromptImagePart`s, PDFs
844
- * and text `PromptDocumentPart`s (the engine's media-type branch).
845
- */
846
- const picked = Array.from(event.target.files ?? []);
847
- addAttachmentFiles(picked);
848
- event.target.value = '';
849
- };
850
-
851
- /*
852
- * A click on the chatbox's empty surface focuses the composer. Clicks
853
- * that land on a control (a pill, a button, a popover's search field)
854
- * belong to that control: focusing the composer from their bubbling click
855
- * stole focus from, e.g., the model picker's search right after it opened.
856
- */
857
- const focusEditor = (event: ReactMouseEvent) => {
858
- const target = event.target as HTMLElement | null;
859
- if (
860
- target?.closest('button, a, input, textarea, select, [role="dialog"], [role="listbox"], [contenteditable="true"]')
861
- )
862
- return;
863
- editor?.commands.focus();
864
- };
865
-
866
- return (
867
- /*
868
- * The composer is a raised card set in a tray (gui/CLAUDE.md "Surfaces").
869
- * The tray's 4px ring comes out of the footer's budget (Center.tsx: px-5,
870
- * pb-2), so the card keeps its size, its edges on the transcript column,
871
- * and the + button's center on the sidebar footer separator (H − 37).
872
- * Radius 28 = the card's 24 + the 4px ring: concentric.
873
- */
874
- <div
875
- className={`zg-chatbox-surface zg-tray relative rounded-[28px] p-1${className ? ` ${className}` : ''}`}
876
- style={style}
877
- >
878
- {/* The extensions' banners (`composer.above`), at the top of the tray. */}
879
- <ExtensionSlot
880
- at="composer.above"
881
- {...(activeSessionId ? { sessionId: activeSessionId } : {})}
882
- className="px-2 pt-1 pb-1"
883
- />
884
- {badges}
885
- <input ref={fileInputRef} type="file" multiple onChange={onFilesPicked} className="hidden" />
886
- {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- a click on the card's empty surface focuses the editor, which has its own keyboard */}
887
- <div
888
- onClick={focusEditor}
889
- onDragOver={(event) => {
890
- event.preventDefault();
891
-
892
- // Any file: the drop decides what attaches. A file's type is often empty mid-drag.
893
- if (attachmentsEnabled && Array.from(event.dataTransfer.types).includes('Files')) {
894
- setIsDragOver(true);
895
- }
896
- }}
897
- onDragLeave={(event) => {
898
- if (event.currentTarget === event.target) {
899
- setIsDragOver(false);
900
- }
901
- }}
902
- onDrop={(event) => {
903
- event.preventDefault();
904
- setIsDragOver(false);
905
-
906
- if (!attachmentsEnabled) {
907
- return;
908
- }
909
-
910
- addAttachmentFiles(Array.from(event.dataTransfer.files));
911
- }}
912
- /*
913
- * Vertical padding is INTENTIONALLY asymmetric (pt-4/pb-2 = 16/8px):
914
- * 1. The controls row mixes heights (24px pills, 30px scope toggle,
915
- * 32px + / send circles) all centered on one axis via
916
- * `items-center` on the row and both subgroups. The row's 32px
917
- * box is set by the two circles, but its dominant visual mass —
918
- * the 24px pills — floats 4px above the box bottom. A symmetric
919
- * pb-3 stacked 12px under that built-in optical padding, so the
920
- * bottom band read 13–17px against a crisp 13px above the
921
- * cap-trimmed editor text (measured in an 800px window: text top
922
- * at card+13, pill bottoms at card_bottom−17) — bottom-heavy.
923
- * pb-2 puts the pill bottoms 13px from the border, matching the
924
- * 13px the text then sat below the top (pt-3). pt-4 leaves
925
- * ~17px above the text on purpose: a roomier prompt; the bottom
926
- * band keeps its 13px.
927
- * 2. Concentric corner nesting (send circle ⇄ card corner): the
928
- * card radius is rounded-3xl (24px) so the corner arc's center
929
- * lands 1.4px from the send circle's center — the circle inset
930
- * is 8px content + 1px border = 9px on BOTH axes (pb-2 below;
931
- * px-1 + the controls row's pr-1 on the right). Measured gaps
932
- * button-edge → outer card border: right 9.0, bottom 9.0,
933
- * 45° diagonal 9.4 — uniform within ±1px, so the circle reads
934
- * as following the curve. At rounded-2xl (16px) the
935
- * gaps would be 5 / 9 / 10.05 (the unnested look) and the only
936
- * uniform inset is ≈2.4px — too cramped. Rule: concentric when
937
- * R ≈ button inset(outer) + button radius (= 9 + 16 = 25 here;
938
- * 24 is the nearest Tailwind step). Re-measure if either moves.
939
- * 3. Cross-app alignment invariant: with the outer footer's pb-3
940
- * (12px, Center.tsx) + 1px card border + 8px here + 16px half
941
- * of the 32px + button, the + button's center lands at
942
- * windowH − 37 — exactly the sidebar footer's top separator
943
- * (28px h-7 row + 2×4px py-1 + 1px border-t = 37px,
944
- * Footer.tsx). Both are bottom-anchored fixed heights, so the
945
- * equality holds at every window size. If you change this
946
- * padding, retune Footer.tsx's py to keep separator-y ==
947
- * plus-center-y.
948
- */
949
- className="zg-raised relative rounded-3xl border pt-4 pb-2 px-1 flex flex-col cursor-text"
950
- // Lifts one step while a run streams; settles when it ends.
951
- data-live={running ? '' : undefined}
952
- style={
953
- {
954
- /*
955
- * Mode border repaint — the TUI's visual contract for prompt
956
- * modes (`PromptBlock`, src/tui/prompt/prompt-block.tsx):
957
- * shell = accent, search = warn (`--zg-warn`). Drag-over keeps accent.
958
- */
959
- borderColor:
960
- isDragOver || shellMode ? 'var(--zg-accent)' : searchMode ? SEARCH_MODE_COLOR : 'var(--zg-hairline)',
961
- // Transitions live on `.zg-raised` (primitives.css) so motion-off can stop them.
962
- // ONE structural knob for the composer text column — consumed by
963
- // .zg-editor-scroll's padding-inline (rich-composer.css). See the editor
964
- // wrapper comment below for the alignment contract.
965
- '--zg-composer-inset': '12px',
966
- } as CSSProperties
967
- }
968
- >
969
- {/*
970
- * Always mounted — the collapse animation handles both the row's
971
- * inner content (grid-template-rows) and its own outer spacing
972
- * (margin-bottom), so unmounting on `attachments.length === 0`
973
- * would yank the 12px gap and produce a visible jump on
974
- * removing the LAST attachment. The CSS hides it at zero
975
- * height + zero margin when empty.
976
- */}
977
- <AttachmentNotices notices={attachmentNotices.notices} onDismiss={attachmentNotices.dismiss} />
978
- <AttachmentRow
979
- attachments={attachments}
980
- exitingIds={exitingIds}
981
- onRemove={removeAttachment}
982
- onExited={finalizeRemove}
983
- onOpenLightbox={openLightbox}
984
- attachmentLabel={attachmentLabel}
985
- />
986
- {/*
987
- * Height-capped scroll region — the editor grows with content up
988
- * to `.zg-editor-scroll`'s max-height, then scrolls internally
989
- * (TUI parity: the textarea grows to MAX_CONTENT_LINES then
990
- * scrolls, `PromptBlock` in src/tui/prompt/prompt-block.tsx). The
991
- * cap lives on this wrapper
992
- * (not `.ProseMirror`) so ProseMirror's own scrollIntoView finds
993
- * a scrollable ANCESTOR and keeps the caret visible while typing
994
- * at the cap. Attachment row + controls row are siblings outside
995
- * the region, so the card's bottom-band geometry (separator ==
996
- * plus-center == H−37, concentric corner nesting — see the card
997
- * comment above) is unaffected by content height.
998
- */}
999
- {/* Text inset comes from --zg-composer-inset (declared on the card,
1000
- consumed in rich-composer.css) — ONE structural knob placing the editor
1001
- text's left edge against the + button's glyph column (8px sat
1002
- exactly on the glyph; 12px sits 4px inside it, for room). The card's own
1003
- px-1 is dictated by the send-button corner nesting; changing that
1004
- or the button width means retuning the variable in ONE place. */}
1005
- {/* min-h-12 (two leading-6 lines even when empty) sits here, not on .ProseMirror: its
1006
- overflow-clip must hug the trimmed text so the line-tall caret Chrome draws after a
1007
- badge is clipped to the plain caret's height. */}
1008
- <div className="zg-editor-scroll min-w-0 min-h-12">
1009
- <EditorContent editor={editor} />
1010
- </div>
1011
- {/*
1012
- * One line at every width (`zg-chatbox` container tiers in
1013
- * composer.css): the left group shrinks, its names truncating; the
1014
- * right group (status, a draft's pickers, send) never shrinks, its
1015
- * parts fold instead.
1016
- */}
1017
- <div className="zg-chatbox-controls flex items-center justify-between gap-2 mt-3 min-w-0">
1018
- <div className="flex items-center gap-1 flex-1 min-w-0">
1019
- <PlusButton onClick={onPlusClick} />
1020
- {leadingActions}
1021
- {shellMode && (
1022
- <span className={MODE_CHIP} style={modeChipTone('var(--zg-accent)')}>
1023
- <span className="i-ph-terminal-window text-zg-meta" />
1024
- {labels.modeShell}
1025
- </span>
1026
- )}
1027
- {searchMode && (
1028
- <span className={MODE_CHIP} style={modeChipTone(SEARCH_MODE_COLOR)}>
1029
- <span className="i-ph-magnifying-glass text-zg-meta" />
1030
- {labels.modeSearch}
1031
- {searchStatus?.hasNeedle && (
1032
- <span className="opacity-90">
1033
- {searchStatus.count === 0
1034
- ? '0/0'
1035
- : `${searchStatus.activeIndex + 1}/${searchStatus.capped ? `${searchStatus.count}+` : searchStatus.count}`}
1036
- </span>
1037
- )}
1038
- </span>
1039
- )}
1040
- {historyStatus && (
1041
- <span className={MODE_CHIP}>
1042
- <span className="i-ph-clock text-zg-meta" />
1043
- {labels.historyPosition(historyStatus.position, historyStatus.total)}
1044
- </span>
1045
- )}
1046
- </div>
1047
- {/*
1048
- * pr-1 equalizes the send button's right inset with its bottom
1049
- * one (4px px-1 + 4px here = 8px content, 9px to the outer
1050
- * border) — the concentric-nesting invariant documented on the
1051
- * card's padding comment above. Horizontal only: the row's
1052
- * shared vertical center axis is untouched.
1053
- */}
1054
- <div className="flex items-center gap-2 shrink-0 pr-1">
1055
- {trailingActions}
1056
- <SendStopButton running={running && Boolean(onStop)} canSend={canSend} onSend={send} onStop={onStop} />
1057
- </div>
1058
- </div>
1059
- </div>
1060
- {/* The tray showing under the card (the desktop app: where the checkout stands). */}
1061
- {footer}
1062
- {/* The extensions' items under the card (`composer.below`). */}
1063
- <ExtensionSlot
1064
- at="composer.below"
1065
- {...(activeSessionId ? { sessionId: activeSessionId } : {})}
1066
- className="px-2 pt-1"
1067
- />
1068
- {lightbox.element}
1069
- </div>
1070
- );
1071
- }