@k2b/ui 0.28.0 → 0.30.0

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 (278) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/ContextMenu.js +5 -0
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/DragAndDrop.js +89 -0
  6. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +6 -3
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/FilterChip.js +137 -7
  10. package/dist/browser/actions/FilterChip.js.map +1 -1
  11. package/dist/browser/actions/GestureMenu.js +26 -3
  12. package/dist/browser/actions/GestureMenu.js.map +1 -1
  13. package/dist/browser/actions/SegmentedControl.js +5 -9
  14. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  15. package/dist/browser/actions/SpotlightSearch.js +6 -3
  16. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  17. package/dist/browser/actions/Tabs.js +5 -2
  18. package/dist/browser/actions/Tabs.js.map +1 -1
  19. package/dist/browser/actions/ViewTabs.js +294 -0
  20. package/dist/browser/actions/ViewTabs.js.map +1 -0
  21. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  22. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  23. package/dist/browser/actions/drag-and-drop.js +692 -0
  24. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  25. package/dist/browser/actions/filter-messages.js +6 -2
  26. package/dist/browser/actions/filter-messages.js.map +1 -1
  27. package/dist/browser/actions/index.js +3 -1
  28. package/dist/browser/actions/index.js.map +1 -1
  29. package/dist/browser/chat/ChatComposer.js +1229 -605
  30. package/dist/browser/chat/ChatComposer.js.map +1 -1
  31. package/dist/browser/chat/ChatDecision.js +814 -0
  32. package/dist/browser/chat/ChatDecision.js.map +1 -0
  33. package/dist/browser/chat/ChatPrimitives.js +292 -153
  34. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  35. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  36. package/dist/browser/chat/chat-messages.js +14 -0
  37. package/dist/browser/chat/chat-messages.js.map +1 -1
  38. package/dist/browser/chat/command-search.js +35 -17
  39. package/dist/browser/chat/command-search.js.map +1 -1
  40. package/dist/browser/chat/index.js +10 -3
  41. package/dist/browser/chat/index.js.map +1 -1
  42. package/dist/browser/chat/types.js.map +1 -1
  43. package/dist/browser/content/Calendar.js +146 -119
  44. package/dist/browser/content/Calendar.js.map +1 -1
  45. package/dist/browser/content/CalendarWeekView.js +291 -266
  46. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  47. package/dist/browser/content/Chart.js +54 -71
  48. package/dist/browser/content/Chart.js.map +1 -1
  49. package/dist/browser/content/DataTable.js +224 -155
  50. package/dist/browser/content/DataTable.js.map +1 -1
  51. package/dist/browser/content/FileBrowser.js +2 -2
  52. package/dist/browser/content/FileBrowser.js.map +1 -1
  53. package/dist/browser/content/FileTree.js +42 -36
  54. package/dist/browser/content/FileTree.js.map +1 -1
  55. package/dist/browser/content/FileTypeIcon.js +72 -0
  56. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  57. package/dist/browser/content/FileView.js +2 -2
  58. package/dist/browser/content/FileView.js.map +1 -1
  59. package/dist/browser/content/ReferenceChip.js +162 -0
  60. package/dist/browser/content/ReferenceChip.js.map +1 -0
  61. package/dist/browser/content/calendar-pointer.js +9 -0
  62. package/dist/browser/content/calendar-pointer.js.map +1 -1
  63. package/dist/browser/content/calendar-time-view.js +6 -3
  64. package/dist/browser/content/calendar-time-view.js.map +1 -1
  65. package/dist/browser/content/data-table-messages.js +4 -2
  66. package/dist/browser/content/data-table-messages.js.map +1 -1
  67. package/dist/browser/content/index.js +2 -0
  68. package/dist/browser/content/index.js.map +1 -1
  69. package/dist/browser/feedback/MovedHint.js +197 -0
  70. package/dist/browser/feedback/MovedHint.js.map +1 -0
  71. package/dist/browser/feedback/dialog-core.js +66 -9
  72. package/dist/browser/feedback/dialog-core.js.map +1 -1
  73. package/dist/browser/feedback/index.js +1 -0
  74. package/dist/browser/feedback/index.js.map +1 -1
  75. package/dist/browser/feedback/prompts.js +6 -1
  76. package/dist/browser/feedback/prompts.js.map +1 -1
  77. package/dist/browser/inputs/DatePicker.js +337 -212
  78. package/dist/browser/inputs/DatePicker.js.map +1 -1
  79. package/dist/browser/inputs/date-picker.js +59 -5
  80. package/dist/browser/inputs/date-picker.js.map +1 -1
  81. package/dist/browser/intl/messages.js +12 -0
  82. package/dist/browser/intl/messages.js.map +1 -1
  83. package/dist/browser/intl/weekend.js +39 -0
  84. package/dist/browser/intl/weekend.js.map +1 -0
  85. package/dist/browser/layout/AppOverview.js +1 -2
  86. package/dist/browser/layout/AppOverview.js.map +1 -1
  87. package/dist/browser/layout/AppWorkspace.js +947 -531
  88. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  89. package/dist/browser/layout/PageTitle.js +3 -2
  90. package/dist/browser/layout/PageTitle.js.map +1 -1
  91. package/dist/browser/layout/PanelDialog.js +88 -86
  92. package/dist/browser/layout/PanelDialog.js.map +1 -1
  93. package/dist/browser/layout/ResizeSeparator.js +81 -0
  94. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  95. package/dist/browser/layout/SettingsModal.js +2 -2
  96. package/dist/browser/layout/SettingsModal.js.map +1 -1
  97. package/dist/browser/layout/SidebarSwitcher.js +19 -11
  98. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  99. package/dist/browser/layout/TabBar.js +16 -13
  100. package/dist/browser/layout/TabBar.js.map +1 -1
  101. package/dist/browser/layout/app-host-width.js +44 -0
  102. package/dist/browser/layout/app-host-width.js.map +1 -0
  103. package/dist/browser/layout/app-workspace-controller.js +337 -44
  104. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  105. package/dist/browser/layout/index.js +4 -1
  106. package/dist/browser/layout/index.js.map +1 -1
  107. package/dist/browser/layout/resize-separator.js +90 -0
  108. package/dist/browser/layout/resize-separator.js.map +1 -0
  109. package/dist/browser/layout/workspace-messages.js +12 -2
  110. package/dist/browser/layout/workspace-messages.js.map +1 -1
  111. package/dist/browser/surfaces/LinkCard.js +1 -1
  112. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  113. package/dist/browser/surfaces/Placeholder.js +45 -11
  114. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +23 -0
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/widgets/Widget.js +1 -1
  118. package/dist/browser/widgets/Widget.js.map +1 -1
  119. package/dist/ssr/actions/ContextMenu.js +5 -0
  120. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  121. package/dist/ssr/actions/DragAndDrop.js +63 -0
  122. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  123. package/dist/ssr/actions/Dropdown.js +5 -2
  124. package/dist/ssr/actions/Dropdown.js.map +1 -1
  125. package/dist/ssr/actions/FilterChip.js +59 -7
  126. package/dist/ssr/actions/FilterChip.js.map +1 -1
  127. package/dist/ssr/actions/GestureMenu.js +26 -3
  128. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  129. package/dist/ssr/actions/SegmentedControl.js +1 -2
  130. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  131. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  132. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  133. package/dist/ssr/actions/Tabs.js +2 -2
  134. package/dist/ssr/actions/Tabs.js.map +1 -1
  135. package/dist/ssr/actions/ViewTabs.js +211 -0
  136. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  137. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  138. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  139. package/dist/ssr/actions/drag-and-drop.js +692 -0
  140. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  141. package/dist/ssr/actions/filter-messages.js +6 -2
  142. package/dist/ssr/actions/filter-messages.js.map +1 -1
  143. package/dist/ssr/actions/index.js +3 -1
  144. package/dist/ssr/actions/index.js.map +1 -1
  145. package/dist/ssr/chat/ChatComposer.js +668 -136
  146. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  147. package/dist/ssr/chat/ChatDecision.js +479 -0
  148. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  149. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  150. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  151. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  152. package/dist/ssr/chat/chat-messages.js +14 -0
  153. package/dist/ssr/chat/chat-messages.js.map +1 -1
  154. package/dist/ssr/chat/command-search.js +35 -17
  155. package/dist/ssr/chat/command-search.js.map +1 -1
  156. package/dist/ssr/chat/index.js +10 -3
  157. package/dist/ssr/chat/index.js.map +1 -1
  158. package/dist/ssr/chat/types.js.map +1 -1
  159. package/dist/ssr/content/Calendar.js +112 -103
  160. package/dist/ssr/content/Calendar.js.map +1 -1
  161. package/dist/ssr/content/CalendarWeekView.js +42 -28
  162. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  163. package/dist/ssr/content/Chart.js +19 -23
  164. package/dist/ssr/content/Chart.js.map +1 -1
  165. package/dist/ssr/content/DataTable.js +78 -31
  166. package/dist/ssr/content/DataTable.js.map +1 -1
  167. package/dist/ssr/content/FileBrowser.js +2 -2
  168. package/dist/ssr/content/FileBrowser.js.map +1 -1
  169. package/dist/ssr/content/FileTree.js +21 -14
  170. package/dist/ssr/content/FileTree.js.map +1 -1
  171. package/dist/ssr/content/FileTypeIcon.js +50 -0
  172. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  173. package/dist/ssr/content/FileView.js +2 -2
  174. package/dist/ssr/content/FileView.js.map +1 -1
  175. package/dist/ssr/content/ReferenceChip.js +121 -0
  176. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  177. package/dist/ssr/content/calendar-pointer.js +9 -0
  178. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  179. package/dist/ssr/content/calendar-time-view.js +6 -3
  180. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  181. package/dist/ssr/content/data-table-messages.js +4 -2
  182. package/dist/ssr/content/data-table-messages.js.map +1 -1
  183. package/dist/ssr/content/index.js +2 -0
  184. package/dist/ssr/content/index.js.map +1 -1
  185. package/dist/ssr/feedback/MovedHint.js +166 -0
  186. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  187. package/dist/ssr/feedback/dialog-core.js +66 -9
  188. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  189. package/dist/ssr/feedback/index.js +1 -0
  190. package/dist/ssr/feedback/index.js.map +1 -1
  191. package/dist/ssr/feedback/prompts.js +6 -1
  192. package/dist/ssr/feedback/prompts.js.map +1 -1
  193. package/dist/ssr/inputs/DatePicker.js +138 -69
  194. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  195. package/dist/ssr/inputs/date-picker.js +59 -5
  196. package/dist/ssr/inputs/date-picker.js.map +1 -1
  197. package/dist/ssr/intl/messages.js +12 -0
  198. package/dist/ssr/intl/messages.js.map +1 -1
  199. package/dist/ssr/intl/weekend.js +39 -0
  200. package/dist/ssr/intl/weekend.js.map +1 -0
  201. package/dist/ssr/layout/AppOverview.js +1 -2
  202. package/dist/ssr/layout/AppOverview.js.map +1 -1
  203. package/dist/ssr/layout/AppWorkspace.js +457 -116
  204. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  205. package/dist/ssr/layout/PageTitle.js +3 -2
  206. package/dist/ssr/layout/PageTitle.js.map +1 -1
  207. package/dist/ssr/layout/PanelDialog.js +7 -6
  208. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  209. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  210. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  211. package/dist/ssr/layout/SettingsModal.js +2 -2
  212. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  213. package/dist/ssr/layout/SidebarSwitcher.js +19 -11
  214. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  215. package/dist/ssr/layout/TabBar.js +2 -2
  216. package/dist/ssr/layout/TabBar.js.map +1 -1
  217. package/dist/ssr/layout/app-host-width.js +44 -0
  218. package/dist/ssr/layout/app-host-width.js.map +1 -0
  219. package/dist/ssr/layout/app-workspace-controller.js +337 -44
  220. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  221. package/dist/ssr/layout/index.js +4 -1
  222. package/dist/ssr/layout/index.js.map +1 -1
  223. package/dist/ssr/layout/resize-separator.js +90 -0
  224. package/dist/ssr/layout/resize-separator.js.map +1 -0
  225. package/dist/ssr/layout/workspace-messages.js +12 -2
  226. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  227. package/dist/ssr/surfaces/LinkCard.js +1 -1
  228. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  229. package/dist/ssr/surfaces/Placeholder.js +25 -6
  230. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  231. package/dist/ssr/surfaces/StatCell.js +23 -0
  232. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  233. package/dist/ssr/widgets/Widget.js +1 -1
  234. package/dist/ssr/widgets/Widget.js.map +1 -1
  235. package/dist/styles.css +1 -1
  236. package/dist/types/actions/ContextMenu.d.ts +1 -0
  237. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  238. package/dist/types/actions/Dropdown.d.ts +4 -0
  239. package/dist/types/actions/FilterChip.d.ts +22 -0
  240. package/dist/types/actions/ViewTabs.d.ts +30 -0
  241. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  242. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  243. package/dist/types/actions/filter-messages.d.ts +2 -0
  244. package/dist/types/actions/index.d.ts +6 -2
  245. package/dist/types/chat/ChatComposer.d.ts +71 -1
  246. package/dist/types/chat/ChatDecision.d.ts +149 -0
  247. package/dist/types/chat/ChatPrimitives.d.ts +14 -1
  248. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  249. package/dist/types/chat/chat-messages.d.ts +7 -0
  250. package/dist/types/chat/command-search.d.ts +5 -0
  251. package/dist/types/chat/index.d.ts +28 -5
  252. package/dist/types/chat/types.d.ts +54 -1
  253. package/dist/types/content/Chart.d.ts +9 -3
  254. package/dist/types/content/DataTable.d.ts +3 -0
  255. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  256. package/dist/types/content/ReferenceChip.d.ts +49 -0
  257. package/dist/types/content/calendar-pointer.d.ts +6 -0
  258. package/dist/types/content/data-table-messages.d.ts +1 -0
  259. package/dist/types/content/index.d.ts +3 -0
  260. package/dist/types/feedback/MovedHint.d.ts +25 -0
  261. package/dist/types/feedback/dialog-core.d.ts +5 -2
  262. package/dist/types/feedback/index.d.ts +2 -0
  263. package/dist/types/feedback/prompts.d.ts +2 -0
  264. package/dist/types/inputs/DatePicker.d.ts +7 -0
  265. package/dist/types/inputs/date-picker.d.ts +25 -1
  266. package/dist/types/intl/messages.d.ts +6 -0
  267. package/dist/types/intl/weekend.d.ts +12 -0
  268. package/dist/types/layout/AppWorkspace.d.ts +48 -10
  269. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  270. package/dist/types/layout/TabBar.d.ts +7 -0
  271. package/dist/types/layout/app-host-width.d.ts +6 -0
  272. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  273. package/dist/types/layout/index.d.ts +5 -2
  274. package/dist/types/layout/resize-separator.d.ts +18 -0
  275. package/dist/types/layout/workspace-messages.d.ts +5 -0
  276. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  277. package/dist/types/surfaces/StatCell.d.ts +6 -0
  278. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/chat-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nexport const chatMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n commandFailed: \"That did not work.\",\n commandSelected: \"selected\",\n attachments: \"Attachments\",\n assistant: \"Assistant\",\n addToChat: \"Add to chat\",\n attachFiles: \"Attach files\",\n addGuidance: \"Add guidance...\",\n chat: \"Chat\",\n chooseModel: \"Choose model\",\n commands: \"Commands\",\n commandsNothingFound: ({ query }: { query: string }) => `Nothing found for “${query}”`,\n commandSuggestions: ({ count }: { count: number }) =>\n count === 0 ? \"No suggestions\" : count === 1 ? \"1 suggestion\" : `${count} suggestions`,\n dropFilesToAttach: \"Drop to attach to the message\",\n conversation: \"Conversation\",\n jumpToLatest: \"Jump to latest\",\n messageSent: \"Sent\",\n messageNotSent: \"Not sent\",\n messageRetry: \"Retry\",\n messageShowMore: \"Show more\",\n messageShowLess: \"Show less\",\n messageReplyTo: \"In reply to\",\n messageForwarded: \"Forwarded\",\n messageEdited: \"edited\",\n messageDeleted: \"This message was deleted\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }: { count: number }) => `${count} more`,\n messageReactions: \"Reactions\",\n messageReaction: ({ emoji, count, names, own }: { emoji: string; count: number; names?: string; own?: boolean }) =>\n `${emoji} ${own && count === 1 ? \"your reaction\" : `${count} ${count === 1 ? \"reaction\" : \"reactions\"}${own ? \", including yours\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Add reaction\",\n moreReactions: ({ count }: { count: number }) => (count === 1 ? \"1 more reaction\" : `${count} more reactions`),\n reactionYou: \"You\",\n reactionAnd: \"and\",\n reactionMorePeople: ({ count }: { count: number }) => `and ${count} more`,\n messageReplies: ({ count }: { count: number }) => (count === 1 ? \"1 reply\" : `${count} replies`),\n messageLastReply: ({ time }: { time: string }) => `Last reply ${time}`,\n messageStop: \"Stop\",\n conversationMessages: ({ label }: { label: string }) => `${label} messages`,\n loadEarlier: \"Load earlier\",\n loadingConversation: \"Loading conversation\",\n loadingMessages: \"Loading messages\",\n failed: \"Failed\",\n generating: \"Generating\",\n loadOlderMessages: \"Load older messages\",\n loadingOlderMessages: \"Loading older messages\",\n couldNotLoadOlderMessages: \"Could not load older messages\",\n couldNotLoadEarlierMessages: \"Could not load earlier messages\",\n couldNotPostMessage: \"Could not post message\",\n messageActions: \"Message actions\",\n messageComposer: \"Message composer\",\n messageInput: \"Message input\",\n model: \"Model\",\n input: \"Input\",\n output: \"Output\",\n loopTotal: \"Whole response\",\n remaining: \"Remaining\",\n notConfigured: \"Not configured\",\n system: \"System\",\n tool: \"Tool\",\n user: \"User\",\n waiting: \"Waiting\",\n lastRequestContext: \"Last request context\",\n contextWindowUsed: \"Context window used\",\n contextWindow: \"Context window\",\n contextUsageUnavailable: \"Context usage unavailable\",\n contextUsageUnavailableWithWindow: ({ window }: { window: string }) => `Context usage unavailable, ${window} token context window`,\n tokensUsed: ({ total }: { total: string }) => `${total} tokens used`,\n tokensUsedPercent: ({ total, percent }: { total: string; percent: number }) =>\n `${total} tokens used, ${percent}% of the context window`,\n postMessage: \"Post message\",\n queueMessage: \"Queue message\",\n queueing: \"Queueing\",\n sending: \"Sending\",\n steering: \"Steering\",\n writeMessage: \"Write a message or type / ...\",\n writeConversationMessage: \"Write a message\",\n composerFormatting: \"Formatting\",\n insertEmoji: \"Insert emoji\",\n emojiSuggestions: \"Emoji suggestions\",\n dictate: \"Dictate\",\n dictateOrHold: \"Dictate. Hold to record a voice message.\",\n stopDictation: \"Stop dictation\",\n microphoneOptions: \"Microphone options\",\n recordVoiceMessage: \"Record voice message\",\n dictationListening: \"Dictating …\",\n dictationRefining: \"Refining the text …\",\n dictationRefined: \"Text refined\",\n dictationUnrefined: \"Text not refined\",\n dictationInterrupted: \"Dictation interrupted\",\n restoreOriginal: \"Restore original\",\n openInNewTab: ({ name }: { name: string }) => `Open ${name} in a new tab`,\n retryOlderMessages: \"Retry loading older messages\",\n sendMessage: \"Send message\",\n startConversation: \"Start a conversation\",\n steerResponse: \"Steer response\",\n stopResponse: \"Stop response\",\n stopping: \"Stopping\",\n },\n de: {\n commandFailed: \"Das hat nicht geklappt.\",\n commandSelected: \"gewählt\",\n attachments: \"Anhänge\",\n assistant: \"Assistent\",\n addToChat: \"Zum Chat hinzufügen\",\n attachFiles: \"Dateien anhängen\",\n addGuidance: \"Hinweis hinzufügen...\",\n chat: \"Chat\",\n chooseModel: \"Modell auswählen\",\n commands: \"Befehle\",\n commandsNothingFound: ({ query }) => `Nichts gefunden für „${query}“`,\n commandSuggestions: ({ count }) => (count === 0 ? \"Keine Vorschläge\" : count === 1 ? \"1 Vorschlag\" : `${count} Vorschläge`),\n dropFilesToAttach: \"Ablegen, um an die Nachricht anzuhängen\",\n conversation: \"Unterhaltung\",\n jumpToLatest: \"Zur neuesten Nachricht\",\n messageSent: \"Gesendet\",\n messageNotSent: \"Nicht gesendet\",\n messageRetry: \"Erneut senden\",\n messageShowMore: \"Mehr anzeigen\",\n messageShowLess: \"Weniger anzeigen\",\n messageReplyTo: \"Antwort auf\",\n messageForwarded: \"Weitergeleitet\",\n messageEdited: \"bearbeitet\",\n messageDeleted: \"Diese Nachricht wurde gelöscht\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }) => `${count} weitere`,\n messageReactions: \"Reaktionen\",\n messageReaction: ({ emoji, count, names, own }) =>\n `${emoji} ${own && count === 1 ? \"deine Reaktion\" : `${count} ${count === 1 ? \"Reaktion\" : \"Reaktionen\"}${own ? \", einschließlich deiner\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Reaktion hinzufügen\",\n moreReactions: ({ count }) => (count === 1 ? \"1 weitere Reaktion\" : `${count} weitere Reaktionen`),\n reactionYou: \"Du\",\n reactionAnd: \"und\",\n reactionMorePeople: ({ count }) => `und ${count} weitere`,\n messageReplies: ({ count }) => (count === 1 ? \"1 Antwort\" : `${count} Antworten`),\n messageLastReply: ({ time }) => `Letzte Antwort ${time}`,\n messageStop: \"Stoppen\",\n conversationMessages: ({ label }) => `Nachrichten in ${label}`,\n loadEarlier: \"Ältere laden\",\n loadingConversation: \"Unterhaltung wird geladen\",\n loadingMessages: \"Nachrichten werden geladen\",\n failed: \"Fehlgeschlagen\",\n generating: \"Wird generiert\",\n loadOlderMessages: \"Ältere Nachrichten laden\",\n loadingOlderMessages: \"Ältere Nachrichten werden geladen\",\n couldNotLoadOlderMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotLoadEarlierMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotPostMessage: \"Nachricht konnte nicht gepostet werden\",\n messageActions: \"Nachrichtenaktionen\",\n messageComposer: \"Nachricht verfassen\",\n messageInput: \"Nachrichteneingabe\",\n model: \"Modell\",\n input: \"Eingabe\",\n output: \"Ausgabe\",\n loopTotal: \"Ganze Antwort\",\n remaining: \"Verbleibend\",\n notConfigured: \"Nicht konfiguriert\",\n system: \"System\",\n tool: \"Werkzeug\",\n user: \"Benutzer\",\n waiting: \"Wartet\",\n lastRequestContext: \"Kontext der letzten Anfrage\",\n contextWindowUsed: \"Kontextfenster verwendet\",\n contextWindow: \"Kontextfenster\",\n contextUsageUnavailable: \"Kontextnutzung nicht verfügbar\",\n contextUsageUnavailableWithWindow: ({ window }) => `Kontextnutzung nicht verfügbar, Kontextfenster mit ${window} Token`,\n tokensUsed: ({ total }) => `${total} Token verwendet`,\n tokensUsedPercent: ({ total, percent }) => `${total} Token verwendet, ${percent}% des Kontextfensters`,\n postMessage: \"Nachricht posten\",\n queueMessage: \"Nachricht einreihen\",\n queueing: \"Wird eingereiht\",\n sending: \"Wird gesendet\",\n steering: \"Wird gesteuert\",\n writeMessage: \"Nachricht schreiben oder / eingeben ...\",\n writeConversationMessage: \"Nachricht schreiben\",\n composerFormatting: \"Formatierung\",\n insertEmoji: \"Emoji einfügen\",\n emojiSuggestions: \"Emoji-Vorschläge\",\n dictate: \"Diktieren\",\n dictateOrHold: \"Diktieren. Halten nimmt eine Sprachnachricht auf.\",\n stopDictation: \"Diktat beenden\",\n microphoneOptions: \"Mikrofon-Optionen\",\n recordVoiceMessage: \"Sprachnachricht aufnehmen\",\n dictationListening: \"Diktat läuft …\",\n dictationRefining: \"Text wird verfeinert …\",\n dictationRefined: \"Text verfeinert\",\n dictationUnrefined: \"Text nicht verfeinert\",\n dictationInterrupted: \"Diktat unterbrochen\",\n restoreOriginal: \"Original wiederherstellen\",\n openInNewTab: ({ name }) => `${name} in neuem Tab öffnen`,\n retryOlderMessages: \"Ältere Nachrichten erneut laden\",\n sendMessage: \"Nachricht senden\",\n startConversation: \"Unterhaltung beginnen\",\n steerResponse: \"Antwort steuern\",\n stopResponse: \"Antwort stoppen\",\n stopping: \"Wird gestoppt\",\n },\n },\n});\n\nexport type ChatMessages = ReturnType<(typeof chatMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useChatMessages = (): (() => ChatMessages) => {\n const locale = useLocale();\n return () => chatMessages.resolve([locale()]).t;\n};\n\nexport const checkChatMessages = () => chatMessages.check();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/chat-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nexport const chatMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n commandFailed: \"That did not work.\",\n commandDraftChanged: \"The text changed in the meantime, so nothing was inserted.\",\n markAdded: \"new:\",\n markRemoved: \"removed:\",\n commandOpening: \"Opening …\",\n commandSelected: \"selected\",\n attachments: \"Attachments\",\n assistant: \"Assistant\",\n addToChat: \"Add to chat\",\n addMenu: \"Add\",\n commandSearch: \"Search\",\n commandSearchLabel: \"Search entries\",\n attachFiles: \"Attach files\",\n addGuidance: \"Add guidance...\",\n chat: \"Chat\",\n chooseModel: \"Choose model\",\n commands: \"Commands\",\n commandsNothingFound: ({ query }: { query: string }) => `Nothing found for “${query}”`,\n commandSuggestions: ({ count }: { count: number }) =>\n count === 0 ? \"No suggestions\" : count === 1 ? \"1 suggestion\" : `${count} suggestions`,\n dropFilesToAttach: \"Drop to attach to the message\",\n conversation: \"Conversation\",\n jumpToLatest: \"Jump to latest\",\n messageSent: \"Sent\",\n messageNotSent: \"Not sent\",\n messageRetry: \"Retry\",\n messageShowMore: \"Show more\",\n messageShowLess: \"Show less\",\n messageReplyTo: \"In reply to\",\n messageForwarded: \"Forwarded\",\n messageEdited: \"edited\",\n messageDeleted: \"This message was deleted\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }: { count: number }) => `${count} more`,\n messageReactions: \"Reactions\",\n messageReaction: ({ emoji, count, names, own }: { emoji: string; count: number; names?: string; own?: boolean }) =>\n `${emoji} ${own && count === 1 ? \"your reaction\" : `${count} ${count === 1 ? \"reaction\" : \"reactions\"}${own ? \", including yours\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Add reaction\",\n moreReactions: ({ count }: { count: number }) => (count === 1 ? \"1 more reaction\" : `${count} more reactions`),\n reactionYou: \"You\",\n reactionAnd: \"and\",\n reactionMorePeople: ({ count }: { count: number }) => `and ${count} more`,\n messageReplies: ({ count }: { count: number }) => (count === 1 ? \"1 reply\" : `${count} replies`),\n messageLastReply: ({ time }: { time: string }) => `Last reply ${time}`,\n messageStop: \"Stop\",\n conversationMessages: ({ label }: { label: string }) => `${label} messages`,\n loadEarlier: \"Load earlier\",\n loadingConversation: \"Loading conversation\",\n loadingMessages: \"Loading messages\",\n failed: \"Failed\",\n generating: \"Generating\",\n loadOlderMessages: \"Load older messages\",\n loadingOlderMessages: \"Loading older messages\",\n couldNotLoadOlderMessages: \"Could not load older messages\",\n couldNotLoadEarlierMessages: \"Could not load earlier messages\",\n couldNotPostMessage: \"Could not post message\",\n messageActions: \"Message actions\",\n messageComposer: \"Message composer\",\n messageInput: \"Message input\",\n model: \"Model\",\n input: \"Input\",\n output: \"Output\",\n loopTotal: \"Whole response\",\n remaining: \"Remaining\",\n notConfigured: \"Not configured\",\n system: \"System\",\n tool: \"Tool\",\n user: \"User\",\n waiting: \"Waiting\",\n lastRequestContext: \"Last request context\",\n contextWindowUsed: \"Context window used\",\n contextWindow: \"Context window\",\n contextUsageUnavailable: \"Context usage unavailable\",\n contextUsageUnavailableWithWindow: ({ window }: { window: string }) => `Context usage unavailable, ${window} token context window`,\n tokensUsed: ({ total }: { total: string }) => `${total} tokens used`,\n tokensUsedPercent: ({ total, percent }: { total: string; percent: number }) =>\n `${total} tokens used, ${percent}% of the context window`,\n postMessage: \"Post message\",\n queueMessage: \"Queue message\",\n queueing: \"Queueing\",\n sending: \"Sending\",\n steering: \"Steering\",\n writeMessage: \"Write a message or type / ...\",\n writeConversationMessage: \"Write a message\",\n composerFormatting: \"Formatting\",\n insertEmoji: \"Insert emoji\",\n emojiSuggestions: \"Emoji suggestions\",\n dictate: \"Dictate\",\n dictateOrHold: \"Dictate. Hold to record a voice message.\",\n stopDictation: \"Stop dictation\",\n microphoneOptions: \"Microphone options\",\n recordVoiceMessage: \"Record voice message\",\n dictationListening: \"Dictating …\",\n dictationRefining: \"Refining the text …\",\n dictationRefined: \"Text refined\",\n dictationUnrefined: \"Text not refined\",\n dictationInterrupted: \"Dictation interrupted\",\n restoreOriginal: \"Restore original\",\n openInNewTab: ({ name }: { name: string }) => `Open ${name} in a new tab`,\n retryOlderMessages: \"Retry loading older messages\",\n sendMessage: \"Send message\",\n startConversation: \"Start a conversation\",\n steerResponse: \"Steer response\",\n stopResponse: \"Stop response\",\n stopping: \"Stopping\",\n },\n de: {\n commandFailed: \"Das hat nicht geklappt.\",\n commandDraftChanged: \"Der Text hat sich inzwischen geändert, darum wurde nichts eingefügt.\",\n markAdded: \"neu:\",\n markRemoved: \"weg:\",\n commandOpening: \"Wird geöffnet …\",\n commandSelected: \"gewählt\",\n attachments: \"Anhänge\",\n assistant: \"Assistent\",\n addToChat: \"Zum Chat hinzufügen\",\n addMenu: \"Hinzufügen\",\n commandSearch: \"Suchen\",\n commandSearchLabel: \"Einträge durchsuchen\",\n attachFiles: \"Dateien anhängen\",\n addGuidance: \"Hinweis hinzufügen...\",\n chat: \"Chat\",\n chooseModel: \"Modell auswählen\",\n commands: \"Befehle\",\n commandsNothingFound: ({ query }) => `Nichts gefunden für „${query}“`,\n commandSuggestions: ({ count }) => (count === 0 ? \"Keine Vorschläge\" : count === 1 ? \"1 Vorschlag\" : `${count} Vorschläge`),\n dropFilesToAttach: \"Ablegen, um an die Nachricht anzuhängen\",\n conversation: \"Unterhaltung\",\n jumpToLatest: \"Zur neuesten Nachricht\",\n messageSent: \"Gesendet\",\n messageNotSent: \"Nicht gesendet\",\n messageRetry: \"Erneut senden\",\n messageShowMore: \"Mehr anzeigen\",\n messageShowLess: \"Weniger anzeigen\",\n messageReplyTo: \"Antwort auf\",\n messageForwarded: \"Weitergeleitet\",\n messageEdited: \"bearbeitet\",\n messageDeleted: \"Diese Nachricht wurde gelöscht\",\n messageVideo: \"Video\",\n messageMoreAttachments: ({ count }) => `${count} weitere`,\n messageReactions: \"Reaktionen\",\n messageReaction: ({ emoji, count, names, own }) =>\n `${emoji} ${own && count === 1 ? \"deine Reaktion\" : `${count} ${count === 1 ? \"Reaktion\" : \"Reaktionen\"}${own ? \", einschließlich deiner\" : \"\"}`}${names ? `: ${names}` : \"\"}`,\n messageAddReaction: \"Reaktion hinzufügen\",\n moreReactions: ({ count }) => (count === 1 ? \"1 weitere Reaktion\" : `${count} weitere Reaktionen`),\n reactionYou: \"Du\",\n reactionAnd: \"und\",\n reactionMorePeople: ({ count }) => `und ${count} weitere`,\n messageReplies: ({ count }) => (count === 1 ? \"1 Antwort\" : `${count} Antworten`),\n messageLastReply: ({ time }) => `Letzte Antwort ${time}`,\n messageStop: \"Stoppen\",\n conversationMessages: ({ label }) => `Nachrichten in ${label}`,\n loadEarlier: \"Ältere laden\",\n loadingConversation: \"Unterhaltung wird geladen\",\n loadingMessages: \"Nachrichten werden geladen\",\n failed: \"Fehlgeschlagen\",\n generating: \"Wird generiert\",\n loadOlderMessages: \"Ältere Nachrichten laden\",\n loadingOlderMessages: \"Ältere Nachrichten werden geladen\",\n couldNotLoadOlderMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotLoadEarlierMessages: \"Ältere Nachrichten konnten nicht geladen werden\",\n couldNotPostMessage: \"Nachricht konnte nicht gepostet werden\",\n messageActions: \"Nachrichtenaktionen\",\n messageComposer: \"Nachricht verfassen\",\n messageInput: \"Nachrichteneingabe\",\n model: \"Modell\",\n input: \"Eingabe\",\n output: \"Ausgabe\",\n loopTotal: \"Ganze Antwort\",\n remaining: \"Verbleibend\",\n notConfigured: \"Nicht konfiguriert\",\n system: \"System\",\n tool: \"Werkzeug\",\n user: \"Benutzer\",\n waiting: \"Wartet\",\n lastRequestContext: \"Kontext der letzten Anfrage\",\n contextWindowUsed: \"Kontextfenster verwendet\",\n contextWindow: \"Kontextfenster\",\n contextUsageUnavailable: \"Kontextnutzung nicht verfügbar\",\n contextUsageUnavailableWithWindow: ({ window }) => `Kontextnutzung nicht verfügbar, Kontextfenster mit ${window} Token`,\n tokensUsed: ({ total }) => `${total} Token verwendet`,\n tokensUsedPercent: ({ total, percent }) => `${total} Token verwendet, ${percent}% des Kontextfensters`,\n postMessage: \"Nachricht posten\",\n queueMessage: \"Nachricht einreihen\",\n queueing: \"Wird eingereiht\",\n sending: \"Wird gesendet\",\n steering: \"Wird gesteuert\",\n writeMessage: \"Nachricht schreiben oder / eingeben ...\",\n writeConversationMessage: \"Nachricht schreiben\",\n composerFormatting: \"Formatierung\",\n insertEmoji: \"Emoji einfügen\",\n emojiSuggestions: \"Emoji-Vorschläge\",\n dictate: \"Diktieren\",\n dictateOrHold: \"Diktieren. Halten nimmt eine Sprachnachricht auf.\",\n stopDictation: \"Diktat beenden\",\n microphoneOptions: \"Mikrofon-Optionen\",\n recordVoiceMessage: \"Sprachnachricht aufnehmen\",\n dictationListening: \"Diktat läuft …\",\n dictationRefining: \"Text wird verfeinert …\",\n dictationRefined: \"Text verfeinert\",\n dictationUnrefined: \"Text nicht verfeinert\",\n dictationInterrupted: \"Diktat unterbrochen\",\n restoreOriginal: \"Original wiederherstellen\",\n openInNewTab: ({ name }) => `${name} in neuem Tab öffnen`,\n retryOlderMessages: \"Ältere Nachrichten erneut laden\",\n sendMessage: \"Nachricht senden\",\n startConversation: \"Unterhaltung beginnen\",\n steerResponse: \"Antwort steuern\",\n stopResponse: \"Antwort stoppen\",\n stopping: \"Wird gestoppt\",\n },\n },\n});\n\nexport type ChatMessages = ReturnType<(typeof chatMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useChatMessages = (): (() => ChatMessages) => {\n const locale = useLocale();\n return () => chatMessages.resolve([locale()]).t;\n};\n\nexport const checkChatMessages = () => chatMessages.check();\n"],"mappings":"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","ignoreList":[]}
@@ -101,16 +101,24 @@ export function chatCommandListModel(input) {
101
101
  scopeTitle: scope.title,
102
102
  rows: [],
103
103
  loading: input.searching,
104
- placeholder: false
105
- }] : [...(input.sections ?? []).map(section => ({
106
- section,
107
- rows: [],
108
- loading: Boolean(section.searched && input.searching && !(overview && section.searchOnly)),
109
- placeholder: false
110
- })), {
104
+ placeholder: false,
105
+ pendingRows: 0
106
+ }] : [...(input.sections ?? []).map(section => {
107
+ // A section hidden for this query also hides its loading state.
108
+ const hidden = overview ? section.searchOnly : section.overviewOnly;
109
+ const pendingRows = section.pending && !hidden ? overview ? 3 : 1 : 0;
110
+ return {
111
+ section,
112
+ rows: [],
113
+ loading: Boolean(pendingRows || section.searched && input.searching && !hidden),
114
+ placeholder: false,
115
+ pendingRows
116
+ };
117
+ }), {
111
118
  rows: [],
112
119
  loading: !input.sections?.length && input.searching,
113
- placeholder: false
120
+ placeholder: false,
121
+ pendingRows: 0
114
122
  }];
115
123
  const bySection = new Map(groups.map((group, index) => [group.section?.id, index]));
116
124
  const buckets = groups.map(() => []);
@@ -125,8 +133,8 @@ export function chatCommandListModel(input) {
125
133
  }
126
134
  const seen = new Set();
127
135
  for (const [index, group] of groups.entries()) {
128
- // A search-only section is absent from the overview, rows and placeholder included.
129
- if (overview && group.section?.searchOnly) continue;
136
+ // A search-only section is absent from the overview, rows and placeholder included; an overview-only one while searching.
137
+ if (overview ? group.section?.searchOnly : group.section?.overviewOnly) continue;
130
138
  const ranked = [];
131
139
  for (const {
132
140
  command,
@@ -136,13 +144,15 @@ export function chatCommandListModel(input) {
136
144
  if (seen.has(key)) continue;
137
145
  if (overview && command.hiddenUntilSearch) continue;
138
146
  const match = rankPrepared(prepare(command), query);
139
- if (!overview && !match && !(server && input.searchResultsFresh)) continue;
147
+ if (!overview && !match && !command.persistent && !(server && input.searchResultsFresh)) continue;
140
148
  seen.add(key);
149
+ // A recent match moves one step up the ladder and leads its rank.
150
+ const rank = (match?.rank ?? Infinity) - (command.recent && match ? 1.5 : 0);
141
151
  ranked.push({
142
152
  command,
143
153
  server,
144
154
  highlight: match?.highlight,
145
- rank: match?.rank ?? Infinity
155
+ rank
146
156
  });
147
157
  }
148
158
  if (!overview) ranked.sort((a, b) => a.rank - b.rank);
@@ -155,16 +165,24 @@ export function chatCommandListModel(input) {
155
165
  server,
156
166
  highlight
157
167
  }));
158
- group.placeholder = group.loading && group.rows.length === 0 && Boolean(scope || !input.searchSettled || buckets[index].some(entry => entry.server));
168
+ group.placeholder = !group.pendingRows && group.loading && group.rows.length === 0 && Boolean(scope || !input.searchSettled || buckets[index].some(entry => entry.server));
159
169
  }
160
170
  // A section without rows has no heading, also in the overview; a scope always shows its title.
161
- const visible = groups.filter(group => scope || group.rows.length || group.placeholder);
162
- const rows = visible.flatMap(group => group.rows);
171
+ const visible = groups.filter(group => scope || group.rows.length || group.placeholder || group.pendingRows);
172
+ const matches = visible.flatMap(group => group.rows);
173
+ // The fallback is no match: unscoped it ends the list after "Nothing found"; in a scope it is the scope's last row.
174
+ const fallback = !overview && input.fallback && !seen.has(chatCommandKey(input.fallback)) ? {
175
+ command: input.fallback,
176
+ server: false
177
+ } : undefined;
178
+ if (fallback && scope) visible[0].rows.push(fallback);
163
179
  return {
164
180
  scope,
165
181
  groups: visible,
166
- rows,
167
- empty: rows.length === 0 && !input.searching
182
+ rows: fallback ? [...matches, fallback] : matches,
183
+ // Rows still on their way may match, so "Nothing found" waits for them.
184
+ empty: matches.length === 0 && !input.searching && !visible.some(group => group.pendingRows),
185
+ fallback: scope ? undefined : fallback
168
186
  };
169
187
  }
170
188
 
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/command-search.ts"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport type { ChatCommand, ChatCommandScope, ChatCommandSection } from \"./ChatComposer\";\nimport { chatCommandKey, foldChatSearchText } from \"./chat-behavior\";\n\nconst wordPattern = /[^\\s\\-_.\\/·:,()„“\"']+/gu;\nconst words = (text: string) => [...text.matchAll(wordPattern)];\ntype Rank = { rank: number; highlight?: readonly [number, number] };\n\nconst prepare = (command: ChatCommand) => {\n const title = command.label ?? command.name;\n // Each folded UTF-16 position maps to the whole original character and its combining marks.\n const starts: number[] = [],\n ends: number[] = [];\n let foldedTitle = \"\";\n for (const part of title.matchAll(/\\P{M}\\p{M}*|\\p{M}+/gu)) {\n const folded = foldChatSearchText(part[0]);\n foldedTitle += folded;\n for (let i = 0; i < folded.length; i++) {\n starts.push(part.index);\n ends.push(part.index + part[0].length);\n }\n }\n return {\n foldedTitle,\n starts,\n ends,\n titleWords: words(foldedTitle),\n keywords: [...(command.keywords ?? []), ...(command.label !== undefined ? [command.name] : [])].map(foldChatSearchText),\n app: foldChatSearchText(command.app ?? \"\"),\n descriptionWords: words(foldChatSearchText(command.description)),\n };\n};\n\nconst rankPrepared = (entry: ReturnType<typeof prepare>, query: string): Rank | null => {\n if (!query) return { rank: 0 };\n const titleMatch = (rank: number, index: number): Rank => ({\n rank,\n highlight: [entry.starts[index]!, entry.ends[index + query.length - 1]!],\n });\n if (entry.foldedTitle.startsWith(query)) return titleMatch(0, 0);\n const word = entry.titleWords.find((word) => word[0].startsWith(query));\n if (word) return titleMatch(1, word.index);\n const index = entry.foldedTitle.indexOf(query);\n if (index >= 0) return titleMatch(2, index);\n if (entry.keywords.some((word) => word.startsWith(query))) return { rank: 3 };\n if (entry.app.startsWith(query)) return { rank: 4 };\n if (query.length >= 3 && entry.descriptionWords.some((word) => word[0].startsWith(query))) return { rank: 5 };\n if (query.length >= 4) {\n for (const word of [...entry.titleWords.map((word) => word[0]), ...entry.keywords]) {\n for (const length of [query.length - 1, query.length, query.length + 1]) {\n if (word.length >= length && fuzzy.distance(query, word.slice(0, length)) <= 1) return { rank: 6 };\n }\n }\n }\n return null;\n};\n\nexport const rankChatCommand = (command: ChatCommand, query: string): Rank | null =>\n rankPrepared(prepare(command), foldChatSearchText(query).trim());\n\nexport function resolveChatCommandScope(word: string, scopes: readonly ChatCommandScope[]): ChatCommandScope | undefined {\n const query = foldChatSearchText(word);\n const folded = scopes.map((scope) => ({ scope, words: scope.words.map(foldChatSearchText) }));\n const exact = folded.filter((entry) => entry.words.includes(query));\n if (exact.length) return exact.length === 1 ? exact[0]?.scope : undefined;\n if (query.length < 3) return undefined;\n let best: ChatCommandScope | undefined,\n extension = Infinity;\n for (const entry of folded) {\n const extra = Math.min(...entry.words.filter((word) => word.startsWith(query)).map((word) => word.length - query.length));\n if (extra < extension) {\n best = entry.scope;\n extension = extra;\n } else if (extra === extension) best = undefined;\n }\n return best;\n}\n\nexport function parseChatCommandQuery(query: string, scopes: readonly ChatCommandScope[]): { scope?: ChatCommandScope; query: string } {\n const match = /^(\\S+)\\s(.*)$/s.exec(query);\n const scope = match ? resolveChatCommandScope(match[1]!, scopes) : undefined;\n return scope ? { scope, query: match![2]!.trimStart() } : { query };\n}\n\nexport type ChatCommandRow = { command: ChatCommand; server: boolean; highlight?: readonly [number, number] };\ntype Group = { section?: ChatCommandSection; scopeTitle?: string; rows: ChatCommandRow[]; loading: boolean; placeholder: boolean };\n\nexport function chatCommandListModel(input: {\n query: string;\n scopes?: readonly ChatCommandScope[];\n sections?: readonly ChatCommandSection[];\n commands: readonly ChatCommand[];\n searchResults: readonly ChatCommand[];\n searchResultsFresh: boolean;\n searchSettled: boolean;\n searching: boolean;\n}): { scope?: ChatCommandScope; groups: Group[]; rows: ChatCommandRow[]; empty: boolean } {\n const { scope, query: rawQuery } = parseChatCommandQuery(input.query, input.scopes ?? []);\n const query = foldChatSearchText(rawQuery).trim();\n const overview = !scope && !query;\n const groups: Group[] = scope\n ? [{ scopeTitle: scope.title, rows: [], loading: input.searching, placeholder: false }]\n : [\n ...(input.sections ?? []).map((section) => ({\n section,\n rows: [],\n loading: Boolean(section.searched && input.searching && !(overview && section.searchOnly)),\n placeholder: false,\n })),\n { rows: [], loading: !input.sections?.length && input.searching, placeholder: false },\n ];\n const bySection = new Map(groups.map((group, index) => [group.section?.id, index]));\n const buckets: { command: ChatCommand; server: boolean }[][] = groups.map(() => []);\n for (const [commands, server] of [\n [scope ? [] : input.commands, false],\n [input.searchResults, true],\n ] as const) {\n for (const command of commands) {\n const index = scope ? 0 : (bySection.get(command.section) ?? groups.length - 1);\n buckets[index]!.push({ command, server });\n }\n }\n const seen = new Set<string>();\n for (const [index, group] of groups.entries()) {\n // A search-only section is absent from the overview, rows and placeholder included.\n if (overview && group.section?.searchOnly) continue;\n const ranked: (ChatCommandRow & { rank: number })[] = [];\n for (const { command, server } of buckets[index]!) {\n const key = chatCommandKey(command);\n if (seen.has(key)) continue;\n if (overview && command.hiddenUntilSearch) continue;\n const match = rankPrepared(prepare(command), query);\n if (!overview && !match && !(server && input.searchResultsFresh)) continue;\n seen.add(key);\n ranked.push({ command, server, highlight: match?.highlight, rank: match?.rank ?? Infinity });\n }\n if (!overview) ranked.sort((a, b) => a.rank - b.rank);\n group.rows = ranked.map(({ command, server, highlight }) => ({ command, server, highlight }));\n group.placeholder =\n group.loading && group.rows.length === 0 && Boolean(scope || !input.searchSettled || buckets[index]!.some((entry) => entry.server));\n }\n // A section without rows has no heading, also in the overview; a scope always shows its title.\n const visible = groups.filter((group) => scope || group.rows.length || group.placeholder);\n const rows = visible.flatMap((group) => group.rows);\n return { scope, groups: visible, rows, empty: rows.length === 0 && !input.searching };\n}\n\n/** Use the composer ranking rules to filter consumer-owned server rows. */\nexport const matchesChatCommand = (command: ChatCommand, query: string): boolean => rankChatCommand(command, query) !== null;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/command-search.ts"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport type { ChatCommand, ChatCommandScope, ChatCommandSection } from \"./ChatComposer\";\nimport { chatCommandKey, foldChatSearchText } from \"./chat-behavior\";\n\nconst wordPattern = /[^\\s\\-_.\\/·:,()„“\"']+/gu;\nconst words = (text: string) => [...text.matchAll(wordPattern)];\ntype Rank = { rank: number; highlight?: readonly [number, number] };\n\nconst prepare = (command: ChatCommand) => {\n const title = command.label ?? command.name;\n // Each folded UTF-16 position maps to the whole original character and its combining marks.\n const starts: number[] = [],\n ends: number[] = [];\n let foldedTitle = \"\";\n for (const part of title.matchAll(/\\P{M}\\p{M}*|\\p{M}+/gu)) {\n const folded = foldChatSearchText(part[0]);\n foldedTitle += folded;\n for (let i = 0; i < folded.length; i++) {\n starts.push(part.index);\n ends.push(part.index + part[0].length);\n }\n }\n return {\n foldedTitle,\n starts,\n ends,\n titleWords: words(foldedTitle),\n keywords: [...(command.keywords ?? []), ...(command.label !== undefined ? [command.name] : [])].map(foldChatSearchText),\n app: foldChatSearchText(command.app ?? \"\"),\n descriptionWords: words(foldChatSearchText(command.description)),\n };\n};\n\nconst rankPrepared = (entry: ReturnType<typeof prepare>, query: string): Rank | null => {\n if (!query) return { rank: 0 };\n const titleMatch = (rank: number, index: number): Rank => ({\n rank,\n highlight: [entry.starts[index]!, entry.ends[index + query.length - 1]!],\n });\n if (entry.foldedTitle.startsWith(query)) return titleMatch(0, 0);\n const word = entry.titleWords.find((word) => word[0].startsWith(query));\n if (word) return titleMatch(1, word.index);\n const index = entry.foldedTitle.indexOf(query);\n if (index >= 0) return titleMatch(2, index);\n if (entry.keywords.some((word) => word.startsWith(query))) return { rank: 3 };\n if (entry.app.startsWith(query)) return { rank: 4 };\n if (query.length >= 3 && entry.descriptionWords.some((word) => word[0].startsWith(query))) return { rank: 5 };\n if (query.length >= 4) {\n for (const word of [...entry.titleWords.map((word) => word[0]), ...entry.keywords]) {\n for (const length of [query.length - 1, query.length, query.length + 1]) {\n if (word.length >= length && fuzzy.distance(query, word.slice(0, length)) <= 1) return { rank: 6 };\n }\n }\n }\n return null;\n};\n\nexport const rankChatCommand = (command: ChatCommand, query: string): Rank | null =>\n rankPrepared(prepare(command), foldChatSearchText(query).trim());\n\nexport function resolveChatCommandScope(word: string, scopes: readonly ChatCommandScope[]): ChatCommandScope | undefined {\n const query = foldChatSearchText(word);\n const folded = scopes.map((scope) => ({ scope, words: scope.words.map(foldChatSearchText) }));\n const exact = folded.filter((entry) => entry.words.includes(query));\n if (exact.length) return exact.length === 1 ? exact[0]?.scope : undefined;\n if (query.length < 3) return undefined;\n let best: ChatCommandScope | undefined,\n extension = Infinity;\n for (const entry of folded) {\n const extra = Math.min(...entry.words.filter((word) => word.startsWith(query)).map((word) => word.length - query.length));\n if (extra < extension) {\n best = entry.scope;\n extension = extra;\n } else if (extra === extension) best = undefined;\n }\n return best;\n}\n\nexport function parseChatCommandQuery(query: string, scopes: readonly ChatCommandScope[]): { scope?: ChatCommandScope; query: string } {\n const match = /^(\\S+)\\s(.*)$/s.exec(query);\n const scope = match ? resolveChatCommandScope(match[1]!, scopes) : undefined;\n return scope ? { scope, query: match![2]!.trimStart() } : { query };\n}\n\nexport type ChatCommandRow = { command: ChatCommand; server: boolean; highlight?: readonly [number, number] };\ntype Group = {\n section?: ChatCommandSection;\n scopeTitle?: string;\n rows: ChatCommandRow[];\n loading: boolean;\n placeholder: boolean;\n /** Placeholder rows of a `pending` section, after its rows: three in the overview, one while searching. */\n pendingRows: number;\n};\n\nexport function chatCommandListModel(input: {\n query: string;\n scopes?: readonly ChatCommandScope[];\n sections?: readonly ChatCommandSection[];\n commands: readonly ChatCommand[];\n searchResults: readonly ChatCommand[];\n searchResultsFresh: boolean;\n searchSettled: boolean;\n searching: boolean;\n /** The composer's `commandFallback` row for this query, if any. */\n fallback?: ChatCommand;\n}): { scope?: ChatCommandScope; groups: Group[]; rows: ChatCommandRow[]; empty: boolean; fallback?: ChatCommandRow } {\n const { scope, query: rawQuery } = parseChatCommandQuery(input.query, input.scopes ?? []);\n const query = foldChatSearchText(rawQuery).trim();\n const overview = !scope && !query;\n const groups: Group[] = scope\n ? [{ scopeTitle: scope.title, rows: [], loading: input.searching, placeholder: false, pendingRows: 0 }]\n : [\n ...(input.sections ?? []).map((section) => {\n // A section hidden for this query also hides its loading state.\n const hidden = overview ? section.searchOnly : section.overviewOnly;\n const pendingRows = section.pending && !hidden ? (overview ? 3 : 1) : 0;\n return {\n section,\n rows: [],\n loading: Boolean(pendingRows || (section.searched && input.searching && !hidden)),\n placeholder: false,\n pendingRows,\n };\n }),\n { rows: [], loading: !input.sections?.length && input.searching, placeholder: false, pendingRows: 0 },\n ];\n const bySection = new Map(groups.map((group, index) => [group.section?.id, index]));\n const buckets: { command: ChatCommand; server: boolean }[][] = groups.map(() => []);\n for (const [commands, server] of [\n [scope ? [] : input.commands, false],\n [input.searchResults, true],\n ] as const) {\n for (const command of commands) {\n const index = scope ? 0 : (bySection.get(command.section) ?? groups.length - 1);\n buckets[index]!.push({ command, server });\n }\n }\n const seen = new Set<string>();\n for (const [index, group] of groups.entries()) {\n // A search-only section is absent from the overview, rows and placeholder included; an overview-only one while searching.\n if (overview ? group.section?.searchOnly : group.section?.overviewOnly) continue;\n const ranked: (ChatCommandRow & { rank: number })[] = [];\n for (const { command, server } of buckets[index]!) {\n const key = chatCommandKey(command);\n if (seen.has(key)) continue;\n if (overview && command.hiddenUntilSearch) continue;\n const match = rankPrepared(prepare(command), query);\n if (!overview && !match && !command.persistent && !(server && input.searchResultsFresh)) continue;\n seen.add(key);\n // A recent match moves one step up the ladder and leads its rank.\n const rank = (match?.rank ?? Infinity) - (command.recent && match ? 1.5 : 0);\n ranked.push({ command, server, highlight: match?.highlight, rank });\n }\n if (!overview) ranked.sort((a, b) => a.rank - b.rank);\n group.rows = ranked.map(({ command, server, highlight }) => ({ command, server, highlight }));\n group.placeholder =\n !group.pendingRows &&\n group.loading &&\n group.rows.length === 0 &&\n Boolean(scope || !input.searchSettled || buckets[index]!.some((entry) => entry.server));\n }\n // A section without rows has no heading, also in the overview; a scope always shows its title.\n const visible = groups.filter((group) => scope || group.rows.length || group.placeholder || group.pendingRows);\n const matches = visible.flatMap((group) => group.rows);\n // The fallback is no match: unscoped it ends the list after \"Nothing found\"; in a scope it is the scope's last row.\n const fallback =\n !overview && input.fallback && !seen.has(chatCommandKey(input.fallback)) ? { command: input.fallback, server: false } : undefined;\n if (fallback && scope) visible[0]!.rows.push(fallback);\n return {\n scope,\n groups: visible,\n rows: fallback ? [...matches, fallback] : matches,\n // Rows still on their way may match, so \"Nothing found\" waits for them.\n empty: matches.length === 0 && !input.searching && !visible.some((group) => group.pendingRows),\n fallback: scope ? undefined : fallback,\n };\n}\n\n/** Use the composer ranking rules to filter consumer-owned server rows. */\nexport const matchesChatCommand = (command: ChatCommand, query: string): boolean => rankChatCommand(command, query) !== null;\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  import { ChatContextPanel, ChatContextPopup } from "./ChatContextPopup";
2
2
  import { ChatTasks } from "./ChatTasks";
3
3
  import { ChatComposer } from "./ChatComposer";
4
- import { ChatActivity, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
4
+ import { ChatDecision, ChatMark, ChatOutcome, ChatPreview } from "./ChatDecision";
5
+ import { ChatActivity, ChatActivityToggle, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
5
6
  import { ChatRoot } from "./ChatRoot";
6
7
  import { ChatTimeline } from "./ChatTimeline";
7
8
  export { formatChatTokens } from "./ChatPrimitives";
@@ -13,11 +14,17 @@ export const Chat = Object.assign(ChatRoot, {
13
14
  Tasks: ChatTasks,
14
15
  Timeline: ChatTimeline,
15
16
  Message: ChatMessage,
16
- Activity: ChatActivity,
17
+ Activity: Object.assign(ChatActivity, {
18
+ Toggle: ChatActivityToggle
19
+ }),
17
20
  Composer: ChatComposer,
18
21
  ContextUsage: ChatContextUsage,
19
22
  ContextPopup: ChatContextPopup,
20
- ContextPanel: ChatContextPanel
23
+ ContextPanel: ChatContextPanel,
24
+ Decision: ChatDecision,
25
+ Outcome: ChatOutcome,
26
+ Preview: ChatPreview,
27
+ Mark: ChatMark
21
28
  });
22
29
  export { matchesChatCommand } from "./command-search";
23
30
  export { reconcileChatMentions } from "./composer-document";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/index.ts"],"sourcesContent":["export type { ChatContextPanelProps, ChatContextPopupProps } from \"./ChatContextPopup\";\n\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\n\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\n\nimport { ChatComposer } from \"./ChatComposer\";\nimport { ChatActivity, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type {\n ChatCommand,\n ChatCommandContext,\n ChatCommandResult,\n ChatCommandScope,\n ChatCommandSearch,\n ChatCommandSection,\n ChatComposerProps,\n ChatFileSelection,\n ChatPasteHandler,\n} from \"./ChatComposer\";\nexport type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatDictationState,\n ChatMention,\n ChatMessageStatus,\n ChatModelOption,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Tasks: ChatTasks,\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: ChatActivity,\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n ContextPopup: ChatContextPopup,\n ContextPanel: ChatContextPanel,\n});\n\nexport { matchesChatCommand } from \"./command-search\";\nexport { reconcileChatMentions } from \"./composer-document\";\n\nexport { type ReactionPeopleInput, reactionPeople } from \"./reaction-people\";\n"],"mappings":"AAEA,SAAS,gBAAgB,EAAE,gBAAgB,QAAQ,oBAAoB;AACvE,SAAS,SAAS,QAAQ,aAAa;AAIvC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,YAAY,EAAE,gBAAgB,EAAE,WAAW,QAAQ,kBAAkB;AAC9E,SAAS,QAAQ,QAAQ,YAAY;AACrC,SAAS,YAAY,QAAQ,gBAAgB;AAc7C,SAAS,gBAAgB,QAAQ,kBAAkB;AAqBnD;AACA;AACA;AACA;AACA,OAAO,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;EAC1C,KAAK,EAAE,SAAS;EAChB,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,QAAQ,EAAE,YAAY;EACtB,QAAQ,EAAE,YAAY;EACtB,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE;AAChB,CAAC,CAAC;AAEF,SAAS,kBAAkB,QAAQ,kBAAkB;AACrD,SAAS,qBAAqB,QAAQ,qBAAqB;AAE3D,SAAmC,cAAc,QAAQ,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/index.ts"],"sourcesContent":["export type { ChatContextPanelProps, ChatContextPopupProps } from \"./ChatContextPopup\";\n\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\n\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\n\nimport { ChatComposer } from \"./ChatComposer\";\nimport { ChatDecision, ChatMark, ChatOutcome, ChatPreview } from \"./ChatDecision\";\nimport { ChatActivity, ChatActivityToggle, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type {\n ChatCommand,\n ChatCommandContext,\n ChatCommandDraft,\n ChatCommandOpenResult,\n ChatCommandResult,\n ChatCommandScope,\n ChatCommandSearch,\n ChatCommandSection,\n ChatComposerProps,\n ChatFileSelection,\n ChatPasteHandler,\n} from \"./ChatComposer\";\nexport type {\n ChatDecisionProps,\n ChatMarkProps,\n ChatOutcomeProps,\n ChatPreviewExcerptProps,\n ChatPreviewHeaderProps,\n ChatPreviewLineProps,\n ChatPreviewPeopleProps,\n ChatPreviewProps,\n ChatPreviewReadMoreProps,\n ChatPreviewShowAllProps,\n ChatPreviewTitleProps,\n} from \"./ChatDecision\";\nexport type { ChatActivityProps, ChatActivityToggleProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatDecisionAnswer,\n ChatDecisionReason,\n ChatDecisionState,\n ChatDictationState,\n ChatMention,\n ChatMessageStatus,\n ChatModelOption,\n ChatOutcomeLine,\n ChatOutcomeTone,\n ChatPreviewHeaderRow,\n ChatPreviewPerson,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Tasks: ChatTasks,\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: Object.assign(ChatActivity, { Toggle: ChatActivityToggle }),\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n ContextPopup: ChatContextPopup,\n ContextPanel: ChatContextPanel,\n Decision: ChatDecision,\n Outcome: ChatOutcome,\n Preview: ChatPreview,\n Mark: ChatMark,\n});\n\nexport { matchesChatCommand } from \"./command-search\";\nexport { reconcileChatMentions } from \"./composer-document\";\n\nexport { type ReactionPeopleInput, reactionPeople } from \"./reaction-people\";\n"],"mappings":"AAEA,SAAS,gBAAgB,EAAE,gBAAgB,QAAQ,oBAAoB;AACvE,SAAS,SAAS,QAAQ,aAAa;AAIvC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,QAAQ,gBAAgB;AACjF,SAAS,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,QAAQ,kBAAkB;AAClG,SAAS,QAAQ,QAAQ,YAAY;AACrC,SAAS,YAAY,QAAQ,gBAAgB;AA6B7C,SAAS,gBAAgB,QAAQ,kBAAkB;AA4BnD;AACA;AACA;AACA;AACA,OAAO,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;EAC1C,KAAK,EAAE,SAAS;EAChB,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;IAAE,MAAM,EAAE;EAAmB,CAAC,CAAC;EACrE,QAAQ,EAAE,YAAY;EACtB,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE,gBAAgB;EAC9B,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,WAAW;EACpB,IAAI,EAAE;AACR,CAAC,CAAC;AAEF,SAAS,kBAAkB,QAAQ,kBAAkB;AACrD,SAAS,qBAAqB,QAAQ,qBAAqB;AAE3D,SAAmC,cAAc,QAAQ,mBAAmB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["import type { EmojiSkinTone } from \"../inputs/emoji/emoji-index\";\n\nexport type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n\n/**\n * Live dictation as the caller runs it: `listening` while speech arrives, `refining` after the stop until the refined\n * text replaced it, `refined` afterwards, `unrefined` when the raw text stays, and `interrupted` when the connection\n * ended early and the text so far stays.\n */\nexport type ChatDictationState = \"listening\" | \"refining\" | \"refined\" | \"unrefined\" | \"interrupted\";\n\n/** The composer's microphone. Dictation comes first; a voice message is the deliberate second action. */\nexport type ChatComposerMicrophone = {\n /** A tap starts or stops live dictation. Without it, a tap opens the microphone menu. */\n onDictate?: () => void;\n /** Holding the microphone, or \"Record voice message\" in its menu. Omit it where recording is not available. */\n onVoiceMessage?: () => void;\n /** The dictation state, shown on the microphone and in the hint line. */\n dictation?: ChatDictationState | null;\n /** Offered as \"Restore original\" while `dictation` is `refined`. */\n onRestoreOriginal?: () => void;\n disabled?: boolean;\n};\n\n/**\n * The composer's emoji button and `:shortcode` completion. Typing a colon and two letters suggests emoji by their\n * English or German name or GitHub shortcode; a complete `:thumbsup:` becomes 👍 when its closing colon is typed.\n */\nexport type ChatComposerEmoji = {\n /** Opens the emoji choice next to `anchor`, usually `EmojiPicker.Popover`; `insert` puts the chosen text at the caret. */\n onOpen: (context: { anchor: HTMLElement; insert: (text: string) => void }) => void;\n /** The skin tone of completed emoji that have one, as in the picker. */\n skinTone?: EmojiSkinTone;\n /** Called with each emoji the completion inserted, for example to remember it with `rememberEmoji`. */\n onPick?: (emoji: string) => void;\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport type { EmojiSkinTone } from \"../inputs/emoji/emoji-index\";\n\nexport type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\n/** `warning` marks a partial result or an outcome that is not yet known. */\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"warning\" | \"danger\";\n\n/** `open` asks; `sending` while the answer is on its way; `decided` once answered; `expired` when it ran out. */\nexport type ChatDecisionState = \"open\" | \"sending\" | \"decided\" | \"expired\";\n\n/** One answer of a question. Set the question's state in `onSelect` before awaiting anything, so it collapses at once. */\nexport type ChatDecisionAnswer = {\n label: string;\n /** Icon class, for example `ti ti-send`. */\n icon?: string;\n onSelect: () => void | Promise<void>;\n};\n\n/** Why a question is asked, or why its main answer is off. */\nexport type ChatDecisionReason = {\n text: JSX.Element;\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon?: string;\n /** `danger` for deletions, `warning` for outside content and limits. */\n tone?: \"neutral\" | \"danger\" | \"warning\";\n};\n\nexport type ChatOutcomeTone = \"running\" | \"done\" | \"off\" | \"waiting\" | \"warning\" | \"error\";\n\n/** One text of an outcome flow. */\nexport type ChatOutcomeLine = {\n tone: ChatOutcomeTone;\n /** What happened, as one sentence, usually with `ReferenceChip`s. */\n text: JSX.Element;\n /** A quiet second sentence, such as \"You declined.\" */\n detail?: JSX.Element;\n /** A formatted time after the text. */\n time?: string;\n /** Replaces the tone's icon, for example `ti ti-clock-x` for an expired question. */\n icon?: string;\n /** One text link after the line, such as \"Ask again\". */\n action?: { label: string; onSelect: () => void | Promise<void> };\n /** Small buttons under the line. Shown while this line is current; otherwise hidden but still reserving their row. */\n actions?: JSX.Element;\n};\n\n/** A person in a preview header: the name in the text colour, then the address the message really uses. */\nexport type ChatPreviewPerson = { name?: string; address?: string };\n\n/** One header row, such as \"To Lea Berg lea.berg@example.com\". */\nexport type ChatPreviewHeaderRow = {\n label: string;\n people?: readonly ChatPreviewPerson[];\n /** Further content after the people, such as \"and 2 more\". */\n value?: JSX.Element;\n /** Draws the label stronger, for recipients others cannot see. */\n emphasis?: boolean;\n};\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n\n/**\n * Live dictation as the caller runs it: `listening` while speech arrives, `refining` after the stop until the refined\n * text replaced it, `refined` afterwards, `unrefined` when the raw text stays, and `interrupted` when the connection\n * ended early and the text so far stays.\n */\nexport type ChatDictationState = \"listening\" | \"refining\" | \"refined\" | \"unrefined\" | \"interrupted\";\n\n/** The composer's microphone. Dictation comes first; a voice message is the deliberate second action. */\nexport type ChatComposerMicrophone = {\n /** A tap starts or stops live dictation. Without it, a tap opens the microphone menu. */\n onDictate?: () => void;\n /** Holding the microphone, or \"Record voice message\" in its menu. Omit it where recording is not available. */\n onVoiceMessage?: () => void;\n /** The dictation state, shown on the microphone and in the hint line. */\n dictation?: ChatDictationState | null;\n /** Offered as \"Restore original\" while `dictation` is `refined`. */\n onRestoreOriginal?: () => void;\n disabled?: boolean;\n};\n\n/**\n * The composer's emoji button and `:shortcode` completion. Typing a colon and two letters suggests emoji by their\n * English or German name or GitHub shortcode; a complete `:thumbsup:` becomes 👍 when its closing colon is typed.\n */\nexport type ChatComposerEmoji = {\n /** Opens the emoji choice next to `anchor`, usually `EmojiPicker.Popover`; `insert` puts the chosen text at the caret. */\n onOpen: (context: { anchor: HTMLElement; insert: (text: string) => void }) => void;\n /** The skin tone of completed emoji that have one, as in the picker. */\n skinTone?: EmojiSkinTone;\n /** Called with each emoji the completion inserted, for example to remember it with `rememberEmoji`. */\n onPick?: (emoji: string) => void;\n};\n"],"mappings":"","ignoreList":[]}