zidane-ui 9.1.1 → 9.1.4

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