@dexto/tui 1.15.0-beta.0 → 1.15.0-beta.1

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 (554) hide show
  1. package/dist/InkCLIRefactored.cjs +30 -24
  2. package/dist/InkCLIRefactored.d.ts.map +1 -1
  3. package/dist/InkCLIRefactored.js +30 -24
  4. package/dist/components/ApprovalPrompt.cjs +128 -40
  5. package/dist/components/ApprovalPrompt.d.ts +2 -0
  6. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  7. package/dist/components/ApprovalPrompt.js +128 -41
  8. package/dist/components/CustomInput.cjs +4 -3
  9. package/dist/components/CustomInput.d.ts.map +1 -1
  10. package/dist/components/CustomInput.js +4 -3
  11. package/dist/components/DeckArea.cjs +43 -0
  12. package/dist/components/DeckArea.d.ts +14 -0
  13. package/dist/components/DeckArea.d.ts.map +1 -0
  14. package/dist/components/DeckArea.js +19 -0
  15. package/dist/components/EditableMultiLineInput.cjs +9 -8
  16. package/dist/components/EditableMultiLineInput.d.ts.map +1 -1
  17. package/dist/components/EditableMultiLineInput.js +9 -8
  18. package/dist/components/ElicitationForm.cjs +78 -18
  19. package/dist/components/ElicitationForm.d.ts.map +1 -1
  20. package/dist/components/ElicitationForm.js +78 -18
  21. package/dist/components/ErrorBoundary.cjs +15 -5
  22. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  23. package/dist/components/ErrorBoundary.js +15 -5
  24. package/dist/components/Footer.cjs +37 -113
  25. package/dist/components/Footer.d.ts +2 -2
  26. package/dist/components/Footer.d.ts.map +1 -1
  27. package/dist/components/Footer.js +40 -119
  28. package/dist/components/HistorySearchBar.cjs +6 -5
  29. package/dist/components/HistorySearchBar.d.ts.map +1 -1
  30. package/dist/components/HistorySearchBar.js +6 -5
  31. package/dist/components/MultiLineInput.cjs +6 -5
  32. package/dist/components/MultiLineInput.d.ts.map +1 -1
  33. package/dist/components/MultiLineInput.js +6 -5
  34. package/dist/components/ResourceAutocomplete.cjs +5 -4
  35. package/dist/components/ResourceAutocomplete.d.ts.map +1 -1
  36. package/dist/components/ResourceAutocomplete.js +5 -4
  37. package/dist/components/SignalGates.test.cjs +215 -0
  38. package/dist/components/SignalGates.test.d.ts +2 -0
  39. package/dist/components/SignalGates.test.d.ts.map +1 -0
  40. package/dist/components/SignalGates.test.js +217 -0
  41. package/dist/components/SlashCommandAutocomplete.cjs +4 -3
  42. package/dist/components/SlashCommandAutocomplete.d.ts.map +1 -1
  43. package/dist/components/SlashCommandAutocomplete.js +4 -3
  44. package/dist/components/StatusBar.cjs +13 -30
  45. package/dist/components/StatusBar.d.ts +1 -3
  46. package/dist/components/StatusBar.d.ts.map +1 -1
  47. package/dist/components/StatusBar.js +13 -30
  48. package/dist/components/TextBufferInput.cjs +13 -12
  49. package/dist/components/TextBufferInput.d.ts.map +1 -1
  50. package/dist/components/TextBufferInput.js +13 -12
  51. package/dist/components/TodoPanel.cjs +23 -16
  52. package/dist/components/TodoPanel.d.ts.map +1 -1
  53. package/dist/components/TodoPanel.js +23 -16
  54. package/dist/components/base/BaseAutocomplete.cjs +7 -6
  55. package/dist/components/base/BaseAutocomplete.d.ts.map +1 -1
  56. package/dist/components/base/BaseAutocomplete.js +7 -6
  57. package/dist/components/base/BaseSelector.cjs +5 -4
  58. package/dist/components/base/BaseSelector.d.ts.map +1 -1
  59. package/dist/components/base/BaseSelector.js +5 -4
  60. package/dist/components/chat/Footer.cjs +2 -1
  61. package/dist/components/chat/Footer.d.ts.map +1 -1
  62. package/dist/components/chat/Footer.js +2 -1
  63. package/dist/components/chat/Header.cjs +20 -16
  64. package/dist/components/chat/Header.d.ts.map +1 -1
  65. package/dist/components/chat/Header.js +20 -16
  66. package/dist/components/chat/MessageItem.cjs +47 -30
  67. package/dist/components/chat/MessageItem.d.ts.map +1 -1
  68. package/dist/components/chat/MessageItem.js +52 -29
  69. package/dist/components/chat/MessageList.cjs +3 -2
  70. package/dist/components/chat/MessageList.d.ts.map +1 -1
  71. package/dist/components/chat/MessageList.js +3 -2
  72. package/dist/components/chat/QueuedMessagesDisplay.cjs +17 -5
  73. package/dist/components/chat/QueuedMessagesDisplay.d.ts.map +1 -1
  74. package/dist/components/chat/QueuedMessagesDisplay.js +18 -6
  75. package/dist/components/chat/SignalMessage.cjs +116 -0
  76. package/dist/components/chat/SignalMessage.d.ts +18 -0
  77. package/dist/components/chat/SignalMessage.d.ts.map +1 -0
  78. package/dist/components/chat/SignalMessage.js +96 -0
  79. package/dist/components/chat/SignalMessage.test.cjs +112 -0
  80. package/dist/components/chat/SignalMessage.test.d.ts +2 -0
  81. package/dist/components/chat/SignalMessage.test.d.ts.map +1 -0
  82. package/dist/components/chat/SignalMessage.test.js +116 -0
  83. package/dist/components/chat/ToolIcon.cjs +6 -5
  84. package/dist/components/chat/ToolIcon.d.ts.map +1 -1
  85. package/dist/components/chat/ToolIcon.js +6 -5
  86. package/dist/components/chat/styled-boxes/ConfigBox.cjs +8 -7
  87. package/dist/components/chat/styled-boxes/ConfigBox.d.ts.map +1 -1
  88. package/dist/components/chat/styled-boxes/ConfigBox.js +8 -7
  89. package/dist/components/chat/styled-boxes/HelpBox.cjs +4 -3
  90. package/dist/components/chat/styled-boxes/HelpBox.d.ts.map +1 -1
  91. package/dist/components/chat/styled-boxes/HelpBox.js +4 -3
  92. package/dist/components/chat/styled-boxes/LogConfigBox.cjs +11 -3
  93. package/dist/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -1
  94. package/dist/components/chat/styled-boxes/LogConfigBox.js +11 -3
  95. package/dist/components/chat/styled-boxes/SessionHistoryBox.cjs +8 -7
  96. package/dist/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +1 -1
  97. package/dist/components/chat/styled-boxes/SessionHistoryBox.js +8 -7
  98. package/dist/components/chat/styled-boxes/SessionListBox.cjs +19 -11
  99. package/dist/components/chat/styled-boxes/SessionListBox.d.ts.map +1 -1
  100. package/dist/components/chat/styled-boxes/SessionListBox.js +19 -11
  101. package/dist/components/chat/styled-boxes/ShortcutsBox.cjs +4 -3
  102. package/dist/components/chat/styled-boxes/ShortcutsBox.d.ts.map +1 -1
  103. package/dist/components/chat/styled-boxes/ShortcutsBox.js +4 -3
  104. package/dist/components/chat/styled-boxes/StatsBox.cjs +13 -5
  105. package/dist/components/chat/styled-boxes/StatsBox.d.ts.map +1 -1
  106. package/dist/components/chat/styled-boxes/StatsBox.js +13 -5
  107. package/dist/components/chat/styled-boxes/StyledBox.cjs +7 -6
  108. package/dist/components/chat/styled-boxes/StyledBox.d.ts.map +1 -1
  109. package/dist/components/chat/styled-boxes/StyledBox.js +7 -6
  110. package/dist/components/chat/styled-boxes/SyspromptBox.cjs +2 -1
  111. package/dist/components/chat/styled-boxes/SyspromptBox.d.ts.map +1 -1
  112. package/dist/components/chat/styled-boxes/SyspromptBox.js +2 -1
  113. package/dist/components/modes/AlternateBufferCLI.cjs +53 -43
  114. package/dist/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  115. package/dist/components/modes/AlternateBufferCLI.js +53 -43
  116. package/dist/components/modes/StaticCLI.cjs +53 -42
  117. package/dist/components/modes/StaticCLI.d.ts.map +1 -1
  118. package/dist/components/modes/StaticCLI.js +53 -42
  119. package/dist/components/overlays/ApiKeyInput.cjs +12 -11
  120. package/dist/components/overlays/ApiKeyInput.d.ts.map +1 -1
  121. package/dist/components/overlays/ApiKeyInput.js +12 -11
  122. package/dist/components/overlays/ChatGPTUsageCapOverlay.cjs +7 -6
  123. package/dist/components/overlays/ChatGPTUsageCapOverlay.d.ts.map +1 -1
  124. package/dist/components/overlays/ChatGPTUsageCapOverlay.js +7 -6
  125. package/dist/components/overlays/CommandOutputOverlay.cjs +2 -1
  126. package/dist/components/overlays/CommandOutputOverlay.d.ts.map +1 -1
  127. package/dist/components/overlays/CommandOutputOverlay.js +2 -1
  128. package/dist/components/overlays/ConnectOverlay.cjs +10 -9
  129. package/dist/components/overlays/ConnectOverlay.d.ts.map +1 -1
  130. package/dist/components/overlays/ConnectOverlay.js +10 -9
  131. package/dist/components/overlays/ContextStatsOverlay.cjs +48 -37
  132. package/dist/components/overlays/ContextStatsOverlay.d.ts.map +1 -1
  133. package/dist/components/overlays/ContextStatsOverlay.js +48 -37
  134. package/dist/components/overlays/CustomModelWizard.cjs +5 -4
  135. package/dist/components/overlays/CustomModelWizard.d.ts.map +1 -1
  136. package/dist/components/overlays/CustomModelWizard.js +5 -4
  137. package/dist/components/overlays/ExportWizard.cjs +28 -27
  138. package/dist/components/overlays/ExportWizard.d.ts.map +1 -1
  139. package/dist/components/overlays/ExportWizard.js +28 -27
  140. package/dist/components/overlays/InsufficientCreditsOverlay.cjs +8 -7
  141. package/dist/components/overlays/InsufficientCreditsOverlay.d.ts.map +1 -1
  142. package/dist/components/overlays/InsufficientCreditsOverlay.js +8 -7
  143. package/dist/components/overlays/LogLevelSelector.cjs +6 -5
  144. package/dist/components/overlays/LogLevelSelector.d.ts.map +1 -1
  145. package/dist/components/overlays/LogLevelSelector.js +6 -5
  146. package/dist/components/overlays/LoginOverlay.cjs +7 -6
  147. package/dist/components/overlays/LoginOverlay.d.ts.map +1 -1
  148. package/dist/components/overlays/LoginOverlay.js +7 -6
  149. package/dist/components/overlays/LogoutOverlay.cjs +10 -9
  150. package/dist/components/overlays/LogoutOverlay.d.ts.map +1 -1
  151. package/dist/components/overlays/LogoutOverlay.js +10 -9
  152. package/dist/components/overlays/MarketplaceAddPrompt.cjs +12 -11
  153. package/dist/components/overlays/MarketplaceAddPrompt.d.ts.map +1 -1
  154. package/dist/components/overlays/MarketplaceAddPrompt.js +12 -11
  155. package/dist/components/overlays/MarketplaceBrowser.cjs +27 -26
  156. package/dist/components/overlays/MarketplaceBrowser.d.ts.map +1 -1
  157. package/dist/components/overlays/MarketplaceBrowser.js +27 -26
  158. package/dist/components/overlays/McpAddChoice.cjs +4 -3
  159. package/dist/components/overlays/McpAddChoice.d.ts.map +1 -1
  160. package/dist/components/overlays/McpAddChoice.js +4 -3
  161. package/dist/components/overlays/McpAddSelector.cjs +4 -3
  162. package/dist/components/overlays/McpAddSelector.d.ts.map +1 -1
  163. package/dist/components/overlays/McpAddSelector.js +4 -3
  164. package/dist/components/overlays/McpCustomTypeSelector.cjs +4 -3
  165. package/dist/components/overlays/McpCustomTypeSelector.d.ts.map +1 -1
  166. package/dist/components/overlays/McpCustomTypeSelector.js +4 -3
  167. package/dist/components/overlays/McpCustomWizard.cjs +9 -8
  168. package/dist/components/overlays/McpCustomWizard.d.ts.map +1 -1
  169. package/dist/components/overlays/McpCustomWizard.js +9 -8
  170. package/dist/components/overlays/McpRemoveSelector.cjs +5 -4
  171. package/dist/components/overlays/McpRemoveSelector.d.ts.map +1 -1
  172. package/dist/components/overlays/McpRemoveSelector.js +5 -4
  173. package/dist/components/overlays/McpSelector.cjs +4 -3
  174. package/dist/components/overlays/McpSelector.d.ts.map +1 -1
  175. package/dist/components/overlays/McpSelector.js +4 -3
  176. package/dist/components/overlays/McpServerActions.cjs +7 -6
  177. package/dist/components/overlays/McpServerActions.d.ts.map +1 -1
  178. package/dist/components/overlays/McpServerActions.js +7 -6
  179. package/dist/components/overlays/McpServerList.cjs +6 -5
  180. package/dist/components/overlays/McpServerList.d.ts.map +1 -1
  181. package/dist/components/overlays/McpServerList.js +6 -5
  182. package/dist/components/overlays/ModelSelectorRefactored.cjs +32 -17
  183. package/dist/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  184. package/dist/components/overlays/ModelSelectorRefactored.js +32 -17
  185. package/dist/components/overlays/PermissionsSelector.cjs +6 -5
  186. package/dist/components/overlays/PermissionsSelector.d.ts.map +1 -1
  187. package/dist/components/overlays/PermissionsSelector.js +6 -5
  188. package/dist/components/overlays/PluginActions.cjs +7 -6
  189. package/dist/components/overlays/PluginActions.d.ts.map +1 -1
  190. package/dist/components/overlays/PluginActions.js +7 -6
  191. package/dist/components/overlays/PluginList.cjs +12 -11
  192. package/dist/components/overlays/PluginList.d.ts.map +1 -1
  193. package/dist/components/overlays/PluginList.js +12 -11
  194. package/dist/components/overlays/PluginManager.cjs +13 -5
  195. package/dist/components/overlays/PluginManager.d.ts.map +1 -1
  196. package/dist/components/overlays/PluginManager.js +13 -5
  197. package/dist/components/overlays/PromptAddChoice.cjs +5 -4
  198. package/dist/components/overlays/PromptAddChoice.d.ts.map +1 -1
  199. package/dist/components/overlays/PromptAddChoice.js +5 -4
  200. package/dist/components/overlays/PromptAddWizard.cjs +10 -9
  201. package/dist/components/overlays/PromptAddWizard.d.ts.map +1 -1
  202. package/dist/components/overlays/PromptAddWizard.js +10 -9
  203. package/dist/components/overlays/PromptDeleteSelector.cjs +6 -5
  204. package/dist/components/overlays/PromptDeleteSelector.d.ts.map +1 -1
  205. package/dist/components/overlays/PromptDeleteSelector.js +6 -5
  206. package/dist/components/overlays/PromptList.cjs +10 -9
  207. package/dist/components/overlays/PromptList.d.ts.map +1 -1
  208. package/dist/components/overlays/PromptList.js +10 -9
  209. package/dist/components/overlays/ReasoningOverlay.cjs +30 -23
  210. package/dist/components/overlays/ReasoningOverlay.d.ts.map +1 -1
  211. package/dist/components/overlays/ReasoningOverlay.js +30 -23
  212. package/dist/components/overlays/SearchOverlay.cjs +15 -14
  213. package/dist/components/overlays/SearchOverlay.d.ts.map +1 -1
  214. package/dist/components/overlays/SearchOverlay.js +15 -14
  215. package/dist/components/overlays/SessionRenameOverlay.cjs +9 -8
  216. package/dist/components/overlays/SessionRenameOverlay.d.ts.map +1 -1
  217. package/dist/components/overlays/SessionRenameOverlay.js +9 -8
  218. package/dist/components/overlays/SessionSelectorRefactored.cjs +4 -3
  219. package/dist/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
  220. package/dist/components/overlays/SessionSelectorRefactored.js +4 -3
  221. package/dist/components/overlays/SessionSubcommandSelector.cjs +4 -3
  222. package/dist/components/overlays/SessionSubcommandSelector.d.ts.map +1 -1
  223. package/dist/components/overlays/SessionSubcommandSelector.js +4 -3
  224. package/dist/components/overlays/SoundsSelector.cjs +15 -7
  225. package/dist/components/overlays/SoundsSelector.d.ts.map +1 -1
  226. package/dist/components/overlays/SoundsSelector.js +15 -7
  227. package/dist/components/overlays/StreamSelector.cjs +5 -4
  228. package/dist/components/overlays/StreamSelector.d.ts.map +1 -1
  229. package/dist/components/overlays/StreamSelector.js +5 -4
  230. package/dist/components/overlays/ToolBrowser.cjs +73 -56
  231. package/dist/components/overlays/ToolBrowser.d.ts.map +1 -1
  232. package/dist/components/overlays/ToolBrowser.js +73 -56
  233. package/dist/components/overlays/custom-model-wizard/LocalModelWizard.cjs +103 -69
  234. package/dist/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +1 -1
  235. package/dist/components/overlays/custom-model-wizard/LocalModelWizard.js +103 -69
  236. package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.cjs +3 -2
  237. package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +1 -1
  238. package/dist/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +3 -2
  239. package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.cjs +5 -4
  240. package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +1 -1
  241. package/dist/components/overlays/custom-model-wizard/shared/ProviderSelector.js +5 -4
  242. package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.cjs +4 -3
  243. package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +1 -1
  244. package/dist/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +4 -3
  245. package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.cjs +7 -6
  246. package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +1 -1
  247. package/dist/components/overlays/custom-model-wizard/shared/WizardStepInput.js +7 -6
  248. package/dist/components/renderers/DiffRenderer.cjs +5 -4
  249. package/dist/components/renderers/DiffRenderer.d.ts.map +1 -1
  250. package/dist/components/renderers/DiffRenderer.js +5 -4
  251. package/dist/components/renderers/FilePreviewRenderer.cjs +23 -13
  252. package/dist/components/renderers/FilePreviewRenderer.d.ts.map +1 -1
  253. package/dist/components/renderers/FilePreviewRenderer.js +23 -13
  254. package/dist/components/renderers/FileRenderer.cjs +9 -8
  255. package/dist/components/renderers/FileRenderer.d.ts.map +1 -1
  256. package/dist/components/renderers/FileRenderer.js +9 -8
  257. package/dist/components/renderers/GenericRenderer.cjs +5 -4
  258. package/dist/components/renderers/GenericRenderer.d.ts.map +1 -1
  259. package/dist/components/renderers/GenericRenderer.js +5 -4
  260. package/dist/components/renderers/SearchRenderer.cjs +4 -3
  261. package/dist/components/renderers/SearchRenderer.d.ts.map +1 -1
  262. package/dist/components/renderers/SearchRenderer.js +4 -3
  263. package/dist/components/renderers/ShellRenderer.cjs +6 -5
  264. package/dist/components/renderers/ShellRenderer.d.ts.map +1 -1
  265. package/dist/components/renderers/ShellRenderer.js +6 -5
  266. package/dist/components/renderers/SignalDiff.cjs +139 -0
  267. package/dist/components/renderers/SignalDiff.d.ts +21 -0
  268. package/dist/components/renderers/SignalDiff.d.ts.map +1 -0
  269. package/dist/components/renderers/SignalDiff.js +106 -0
  270. package/dist/components/renderers/SignalDiff.test.cjs +78 -0
  271. package/dist/components/renderers/SignalDiff.test.d.ts +2 -0
  272. package/dist/components/renderers/SignalDiff.test.d.ts.map +1 -0
  273. package/dist/components/renderers/SignalDiff.test.js +77 -0
  274. package/dist/components/renderers/diff-shared.cjs +13 -7
  275. package/dist/components/renderers/diff-shared.d.ts +5 -0
  276. package/dist/components/renderers/diff-shared.d.ts.map +1 -1
  277. package/dist/components/renderers/diff-shared.js +12 -7
  278. package/dist/components/shared/FocusOverlayFrame.cjs +3 -2
  279. package/dist/components/shared/FocusOverlayFrame.d.ts.map +1 -1
  280. package/dist/components/shared/FocusOverlayFrame.js +3 -2
  281. package/dist/components/shared/HintBar.cjs +2 -1
  282. package/dist/components/shared/HintBar.d.ts.map +1 -1
  283. package/dist/components/shared/HintBar.js +2 -1
  284. package/dist/components/shared/MarkdownText.cjs +36 -53
  285. package/dist/components/shared/MarkdownText.d.ts +2 -0
  286. package/dist/components/shared/MarkdownText.d.ts.map +1 -1
  287. package/dist/components/shared/MarkdownText.js +36 -54
  288. package/dist/components/shared/VirtualizedList.cjs +2 -1
  289. package/dist/components/shared/VirtualizedList.d.ts.map +1 -1
  290. package/dist/components/shared/VirtualizedList.js +2 -1
  291. package/dist/containers/OverlayContainer.cjs +2 -4
  292. package/dist/containers/OverlayContainer.d.ts.map +1 -1
  293. package/dist/containers/OverlayContainer.js +2 -4
  294. package/dist/contexts/KeypressContext.cjs +7 -1
  295. package/dist/contexts/KeypressContext.d.ts.map +1 -1
  296. package/dist/contexts/KeypressContext.js +7 -1
  297. package/dist/contexts/KeypressContext.test.cjs +82 -0
  298. package/dist/contexts/KeypressContext.test.d.ts +2 -0
  299. package/dist/contexts/KeypressContext.test.d.ts.map +1 -0
  300. package/dist/contexts/KeypressContext.test.js +81 -0
  301. package/dist/hooks/useAgentEvents.cjs +1 -74
  302. package/dist/hooks/useAgentEvents.d.ts.map +1 -1
  303. package/dist/hooks/useAgentEvents.js +1 -74
  304. package/dist/hooks/useCLIState.cjs +0 -3
  305. package/dist/hooks/useCLIState.d.ts.map +1 -1
  306. package/dist/hooks/useCLIState.js +0 -3
  307. package/dist/hooks/useContextStats.cjs +91 -0
  308. package/dist/hooks/useContextStats.d.ts +13 -0
  309. package/dist/hooks/useContextStats.d.ts.map +1 -0
  310. package/dist/hooks/useContextStats.js +67 -0
  311. package/dist/hooks/useDeckState.cjs +140 -0
  312. package/dist/hooks/useDeckState.d.ts +20 -0
  313. package/dist/hooks/useDeckState.d.ts.map +1 -0
  314. package/dist/hooks/useDeckState.js +123 -0
  315. package/dist/hooks/useDextoCredits.cjs +81 -0
  316. package/dist/hooks/useDextoCredits.d.ts +14 -0
  317. package/dist/hooks/useDextoCredits.d.ts.map +1 -0
  318. package/dist/hooks/useDextoCredits.js +56 -0
  319. package/dist/hooks/useDextoCredits.test.cjs +73 -0
  320. package/dist/hooks/useDextoCredits.test.d.ts +2 -0
  321. package/dist/hooks/useDextoCredits.test.d.ts.map +1 -0
  322. package/dist/hooks/useDextoCredits.test.js +72 -0
  323. package/dist/hooks/useElapsedTime.cjs +13 -24
  324. package/dist/hooks/useElapsedTime.d.ts +3 -1
  325. package/dist/hooks/useElapsedTime.d.ts.map +1 -1
  326. package/dist/hooks/useElapsedTime.js +13 -24
  327. package/dist/hooks/useElapsedTime.test.cjs +35 -0
  328. package/dist/hooks/useElapsedTime.test.d.ts +2 -0
  329. package/dist/hooks/useElapsedTime.test.d.ts.map +1 -0
  330. package/dist/hooks/useElapsedTime.test.js +34 -0
  331. package/dist/hooks/useGitDirtyFiles.cjs +59 -0
  332. package/dist/hooks/useGitDirtyFiles.d.ts +5 -0
  333. package/dist/hooks/useGitDirtyFiles.d.ts.map +1 -0
  334. package/dist/hooks/useGitDirtyFiles.js +34 -0
  335. package/dist/hooks/useGitDirtyFiles.test.cjs +9 -0
  336. package/dist/hooks/useGitDirtyFiles.test.d.ts +2 -0
  337. package/dist/hooks/useGitDirtyFiles.test.d.ts.map +1 -0
  338. package/dist/hooks/useGitDirtyFiles.test.js +8 -0
  339. package/dist/hooks/useHeldValue.cjs +33 -0
  340. package/dist/hooks/useHeldValue.d.ts +3 -0
  341. package/dist/hooks/useHeldValue.d.ts.map +1 -0
  342. package/dist/hooks/useHeldValue.js +9 -0
  343. package/dist/hooks/useHeldValue.test.cjs +31 -0
  344. package/dist/hooks/useHeldValue.test.d.ts +2 -0
  345. package/dist/hooks/useHeldValue.test.d.ts.map +1 -0
  346. package/dist/hooks/useHeldValue.test.js +30 -0
  347. package/dist/hooks/useInputOrchestrator.cjs +22 -30
  348. package/dist/hooks/useInputOrchestrator.d.ts +2 -0
  349. package/dist/hooks/useInputOrchestrator.d.ts.map +1 -1
  350. package/dist/hooks/useInputOrchestrator.js +21 -30
  351. package/dist/hooks/useInputOrchestrator.test.cjs +24 -0
  352. package/dist/hooks/useInputOrchestrator.test.d.ts +2 -0
  353. package/dist/hooks/useInputOrchestrator.test.d.ts.map +1 -0
  354. package/dist/hooks/useInputOrchestrator.test.js +23 -0
  355. package/dist/interactive-commands/command-parser.cjs +13 -21
  356. package/dist/interactive-commands/command-parser.d.ts.map +1 -1
  357. package/dist/interactive-commands/command-parser.js +13 -11
  358. package/dist/interactive-commands/general-commands.cjs +8 -7
  359. package/dist/interactive-commands/general-commands.d.ts.map +1 -1
  360. package/dist/interactive-commands/general-commands.js +8 -7
  361. package/dist/services/processStream.cjs +31 -19
  362. package/dist/services/processStream.d.ts.map +1 -1
  363. package/dist/services/processStream.js +32 -20
  364. package/dist/services/processStream.test.cjs +51 -3
  365. package/dist/services/processStream.test.js +51 -3
  366. package/dist/signal/background.cjs +154 -0
  367. package/dist/signal/background.d.ts +43 -0
  368. package/dist/signal/background.d.ts.map +1 -0
  369. package/dist/signal/background.js +124 -0
  370. package/dist/signal/background.test.cjs +186 -0
  371. package/dist/signal/background.test.d.ts +2 -0
  372. package/dist/signal/background.test.d.ts.map +1 -0
  373. package/dist/signal/background.test.js +192 -0
  374. package/dist/signal/caps.cjs +100 -0
  375. package/dist/signal/caps.d.ts +23 -0
  376. package/dist/signal/caps.d.ts.map +1 -0
  377. package/dist/signal/caps.js +73 -0
  378. package/dist/signal/caps.test.cjs +56 -0
  379. package/dist/signal/caps.test.d.ts +2 -0
  380. package/dist/signal/caps.test.d.ts.map +1 -0
  381. package/dist/signal/caps.test.js +55 -0
  382. package/dist/signal/components.cjs +257 -0
  383. package/dist/signal/components.d.ts +120 -0
  384. package/dist/signal/components.d.ts.map +1 -0
  385. package/dist/signal/components.js +226 -0
  386. package/dist/signal/components.test.cjs +156 -0
  387. package/dist/signal/components.test.d.ts +2 -0
  388. package/dist/signal/components.test.d.ts.map +1 -0
  389. package/dist/signal/components.test.js +133 -0
  390. package/dist/signal/cut.cjs +103 -0
  391. package/dist/signal/cut.d.ts +11 -0
  392. package/dist/signal/cut.d.ts.map +1 -0
  393. package/dist/signal/cut.js +77 -0
  394. package/dist/signal/cut.test.cjs +20 -0
  395. package/dist/signal/cut.test.d.ts +2 -0
  396. package/dist/signal/cut.test.d.ts.map +1 -0
  397. package/dist/signal/cut.test.js +19 -0
  398. package/dist/signal/deck-layout.cjs +57 -0
  399. package/dist/signal/deck-layout.d.ts +29 -0
  400. package/dist/signal/deck-layout.d.ts.map +1 -0
  401. package/dist/signal/deck-layout.js +30 -0
  402. package/dist/signal/deck-parts.cjs +243 -0
  403. package/dist/signal/deck-parts.d.ts +55 -0
  404. package/dist/signal/deck-parts.d.ts.map +1 -0
  405. package/dist/signal/deck-parts.js +205 -0
  406. package/dist/signal/deck.test.cjs +311 -0
  407. package/dist/signal/deck.test.d.ts +2 -0
  408. package/dist/signal/deck.test.d.ts.map +1 -0
  409. package/dist/signal/deck.test.js +288 -0
  410. package/dist/signal/glyphs.cjs +195 -0
  411. package/dist/signal/glyphs.d.ts +8 -0
  412. package/dist/signal/glyphs.d.ts.map +1 -0
  413. package/dist/signal/glyphs.js +171 -0
  414. package/dist/signal/glyphs.test.cjs +17 -0
  415. package/dist/signal/glyphs.test.d.ts +2 -0
  416. package/dist/signal/glyphs.test.d.ts.map +1 -0
  417. package/dist/signal/glyphs.test.js +16 -0
  418. package/dist/signal/harness.cjs +103 -0
  419. package/dist/signal/harness.d.ts +70 -0
  420. package/dist/signal/harness.d.ts.map +1 -0
  421. package/dist/signal/harness.js +67 -0
  422. package/dist/signal/harness.test.cjs +84 -0
  423. package/dist/signal/harness.test.d.ts +2 -0
  424. package/dist/signal/harness.test.d.ts.map +1 -0
  425. package/dist/signal/harness.test.js +61 -0
  426. package/dist/signal/index.cjs +76 -0
  427. package/dist/signal/index.d.ts +8 -0
  428. package/dist/signal/index.d.ts.map +1 -0
  429. package/dist/signal/index.js +45 -0
  430. package/dist/signal/kit.snapshot.test.cjs +56 -0
  431. package/dist/signal/kit.snapshot.test.d.ts +2 -0
  432. package/dist/signal/kit.snapshot.test.d.ts.map +1 -0
  433. package/dist/signal/kit.snapshot.test.js +55 -0
  434. package/dist/signal/no-raw-colours.test.cjs +32 -0
  435. package/dist/signal/no-raw-colours.test.d.ts +2 -0
  436. package/dist/signal/no-raw-colours.test.d.ts.map +1 -0
  437. package/dist/signal/no-raw-colours.test.js +30 -0
  438. package/dist/signal/paint.cjs +76 -0
  439. package/dist/signal/paint.d.ts +15 -0
  440. package/dist/signal/paint.d.ts.map +1 -0
  441. package/dist/signal/paint.js +41 -0
  442. package/dist/signal/paint.test.cjs +98 -0
  443. package/dist/signal/paint.test.d.ts +2 -0
  444. package/dist/signal/paint.test.d.ts.map +1 -0
  445. package/dist/signal/paint.test.js +75 -0
  446. package/dist/signal/tone.cjs +109 -0
  447. package/dist/signal/tone.d.ts +17 -0
  448. package/dist/signal/tone.d.ts.map +1 -0
  449. package/dist/signal/tone.js +83 -0
  450. package/dist/signal/tone.test.cjs +70 -0
  451. package/dist/signal/tone.test.d.ts +2 -0
  452. package/dist/signal/tone.test.d.ts.map +1 -0
  453. package/dist/signal/tone.test.js +69 -0
  454. package/dist/signal/trace.cjs +142 -0
  455. package/dist/signal/trace.d.ts +41 -0
  456. package/dist/signal/trace.d.ts.map +1 -0
  457. package/dist/signal/trace.js +113 -0
  458. package/dist/signal/trace.test.cjs +50 -0
  459. package/dist/signal/trace.test.d.ts +2 -0
  460. package/dist/signal/trace.test.d.ts.map +1 -0
  461. package/dist/signal/trace.test.js +49 -0
  462. package/dist/signal/use-trace.cjs +73 -0
  463. package/dist/signal/use-trace.d.ts +5 -0
  464. package/dist/signal/use-trace.d.ts.map +1 -0
  465. package/dist/signal/use-trace.js +48 -0
  466. package/dist/signal/wordmark-art.generated.cjs +375 -0
  467. package/dist/signal/wordmark-art.generated.d.ts +3 -0
  468. package/dist/signal/wordmark-art.generated.d.ts.map +1 -0
  469. package/dist/signal/wordmark-art.generated.js +351 -0
  470. package/dist/signal/wordmark.cjs +60 -0
  471. package/dist/signal/wordmark.d.ts +23 -0
  472. package/dist/signal/wordmark.d.ts.map +1 -0
  473. package/dist/signal/wordmark.js +34 -0
  474. package/dist/signal/wordmark.test.cjs +71 -0
  475. package/dist/signal/wordmark.test.d.ts +2 -0
  476. package/dist/signal/wordmark.test.d.ts.map +1 -0
  477. package/dist/signal/wordmark.test.js +70 -0
  478. package/dist/state/initialState.cjs +0 -3
  479. package/dist/state/initialState.d.ts.map +1 -1
  480. package/dist/state/initialState.js +0 -3
  481. package/dist/state/types.d.ts +13 -7
  482. package/dist/state/types.d.ts.map +1 -1
  483. package/dist/utils/approval-response.cjs +45 -0
  484. package/dist/utils/approval-response.d.ts +14 -0
  485. package/dist/utils/approval-response.d.ts.map +1 -0
  486. package/dist/utils/approval-response.js +21 -0
  487. package/dist/utils/approval-response.test.cjs +49 -0
  488. package/dist/utils/approval-response.test.d.ts +2 -0
  489. package/dist/utils/approval-response.test.d.ts.map +1 -0
  490. package/dist/utils/approval-response.test.js +55 -0
  491. package/dist/utils/approvalScope.cjs +12 -0
  492. package/dist/utils/approvalScope.d.ts.map +1 -1
  493. package/dist/utils/approvalScope.js +12 -0
  494. package/dist/utils/approvalScope.test.cjs +23 -0
  495. package/dist/utils/approvalScope.test.d.ts +2 -0
  496. package/dist/utils/approvalScope.test.d.ts.map +1 -0
  497. package/dist/utils/approvalScope.test.js +22 -0
  498. package/dist/utils/background-failure.cjs +51 -0
  499. package/dist/utils/background-failure.d.ts +12 -0
  500. package/dist/utils/background-failure.d.ts.map +1 -0
  501. package/dist/utils/background-failure.js +26 -0
  502. package/dist/utils/chatgpt-rate-limit.cjs +10 -0
  503. package/dist/utils/chatgpt-rate-limit.d.ts +9 -0
  504. package/dist/utils/chatgpt-rate-limit.d.ts.map +1 -1
  505. package/dist/utils/chatgpt-rate-limit.js +9 -0
  506. package/dist/utils/chatgpt-rate-limit.test.cjs +10 -0
  507. package/dist/utils/chatgpt-rate-limit.test.js +11 -0
  508. package/dist/utils/deck-state.cjs +107 -0
  509. package/dist/utils/deck-state.d.ts +79 -0
  510. package/dist/utils/deck-state.d.ts.map +1 -0
  511. package/dist/utils/deck-state.js +76 -0
  512. package/dist/utils/deck-state.test.cjs +208 -0
  513. package/dist/utils/deck-state.test.d.ts +2 -0
  514. package/dist/utils/deck-state.test.d.ts.map +1 -0
  515. package/dist/utils/deck-state.test.js +216 -0
  516. package/dist/utils/fault-block.cjs +37 -0
  517. package/dist/utils/fault-block.d.ts +13 -0
  518. package/dist/utils/fault-block.d.ts.map +1 -0
  519. package/dist/utils/fault-block.js +13 -0
  520. package/dist/utils/fault-block.test.cjs +23 -0
  521. package/dist/utils/fault-block.test.d.ts +2 -0
  522. package/dist/utils/fault-block.test.d.ts.map +1 -0
  523. package/dist/utils/fault-block.test.js +22 -0
  524. package/dist/utils/messageFormatting.cjs +26 -23
  525. package/dist/utils/messageFormatting.d.ts +5 -2
  526. package/dist/utils/messageFormatting.d.ts.map +1 -1
  527. package/dist/utils/messageFormatting.js +25 -21
  528. package/dist/utils/messageFormatting.test.cjs +34 -0
  529. package/dist/utils/messageFormatting.test.js +35 -1
  530. package/dist/utils/reasoning-variant.cjs +35 -0
  531. package/dist/utils/reasoning-variant.d.ts +13 -0
  532. package/dist/utils/reasoning-variant.d.ts.map +1 -0
  533. package/dist/utils/reasoning-variant.js +11 -0
  534. package/dist/utils/resize-reflow.cjs +119 -0
  535. package/dist/utils/resize-reflow.d.ts +18 -0
  536. package/dist/utils/resize-reflow.d.ts.map +1 -0
  537. package/dist/utils/resize-reflow.js +83 -0
  538. package/dist/utils/resize-reflow.test.cjs +100 -0
  539. package/dist/utils/resize-reflow.test.d.ts +2 -0
  540. package/dist/utils/resize-reflow.test.d.ts.map +1 -0
  541. package/dist/utils/resize-reflow.test.js +99 -0
  542. package/dist/utils/tool-step.cjs +183 -0
  543. package/dist/utils/tool-step.d.ts +28 -0
  544. package/dist/utils/tool-step.d.ts.map +1 -0
  545. package/dist/utils/tool-step.js +156 -0
  546. package/dist/utils/tool-step.test.cjs +263 -0
  547. package/dist/utils/tool-step.test.d.ts +2 -0
  548. package/dist/utils/tool-step.test.d.ts.map +1 -0
  549. package/dist/utils/tool-step.test.js +262 -0
  550. package/package.json +7 -3
  551. package/dist/components/BackgroundTasksPanel.cjs +0 -117
  552. package/dist/components/BackgroundTasksPanel.d.ts +0 -18
  553. package/dist/components/BackgroundTasksPanel.d.ts.map +0 -1
  554. package/dist/components/BackgroundTasksPanel.js +0 -93
@@ -3,6 +3,7 @@ import {
3
3
  getModelDisplayName,
4
4
  isModelValidForProvider
5
5
  } from "@dexto/llm";
6
+ import { parseCodexBaseURL } from "@dexto/core";
6
7
  const CHATGPT_RATE_LIMIT_WARNING_THRESHOLD = 80;
7
8
  function shouldShowChatGPTRateLimitHint(status) {
8
9
  if (!status) {
@@ -10,6 +11,13 @@ function shouldShowChatGPTRateLimitHint(status) {
10
11
  }
11
12
  return status.exceeded || status.usedPercent >= CHATGPT_RATE_LIMIT_WARNING_THRESHOLD;
12
13
  }
14
+ function resolveChatGPTRateLimitHint(llmConfig, status, form) {
15
+ const isChatGPTLogin = llmConfig?.provider === "openai-compatible" && parseCodexBaseURL(llmConfig.baseURL)?.authMode === "chatgpt";
16
+ if (!isChatGPTLogin || !status || !shouldShowChatGPTRateLimitHint(status)) return null;
17
+ if (form === "full") return getChatGPTRateLimitHint(status);
18
+ if (status.exceeded) return "cap reached";
19
+ return `cap ${Math.max(0, Math.min(100, Math.round(status.usedPercent)))}%`;
20
+ }
13
21
  function formatResetTime(resetsAt) {
14
22
  if (!resetsAt) {
15
23
  return null;
@@ -45,5 +53,6 @@ export {
45
53
  CHATGPT_RATE_LIMIT_WARNING_THRESHOLD,
46
54
  getChatGPTRateLimitHint,
47
55
  resolveChatGPTFallbackModel,
56
+ resolveChatGPTRateLimitHint,
48
57
  shouldShowChatGPTRateLimitHint
49
58
  };
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  var import_vitest = require("vitest");
3
+ var import_core = require("@dexto/core");
3
4
  var import_chatgpt_rate_limit = require("./chatgpt-rate-limit.js");
4
5
  (0, import_vitest.describe)("chatgpt-rate-limit utils", () => {
5
6
  (0, import_vitest.it)("shows footer hints when ChatGPT usage is approaching the cap", () => {
@@ -18,6 +19,15 @@ var import_chatgpt_rate_limit = require("./chatgpt-rate-limit.js");
18
19
  })
19
20
  ).toBe("ChatGPT cap 82% used");
20
21
  });
22
+ (0, import_vitest.it)("gives a short form for tight status lines, and nothing for other providers", () => {
23
+ const chatgpt = { provider: "openai-compatible", baseURL: (0, import_core.createCodexBaseURL)("chatgpt") };
24
+ const near = { source: "chatgpt-login", usedPercent: 95, exceeded: false };
25
+ const capped = { source: "chatgpt-login", usedPercent: 100, exceeded: true };
26
+ (0, import_vitest.expect)((0, import_chatgpt_rate_limit.resolveChatGPTRateLimitHint)(chatgpt, near, "short")).toBe("cap 95%");
27
+ (0, import_vitest.expect)((0, import_chatgpt_rate_limit.resolveChatGPTRateLimitHint)(chatgpt, capped, "short")).toBe("cap reached");
28
+ (0, import_vitest.expect)((0, import_chatgpt_rate_limit.resolveChatGPTRateLimitHint)(chatgpt, near, "full")).toBe("ChatGPT cap 95% used");
29
+ (0, import_vitest.expect)((0, import_chatgpt_rate_limit.resolveChatGPTRateLimitHint)({ provider: "openai" }, near, "short")).toBeNull();
30
+ });
21
31
  (0, import_vitest.it)("formats a hard cap state without showing fake reset data", () => {
22
32
  (0, import_vitest.expect)(
23
33
  (0, import_chatgpt_rate_limit.getChatGPTRateLimitHint)({
@@ -1,6 +1,8 @@
1
1
  import { describe, expect, it } from "vitest";
2
+ import { createCodexBaseURL } from "@dexto/core";
2
3
  import {
3
4
  getChatGPTRateLimitHint,
5
+ resolveChatGPTRateLimitHint,
4
6
  resolveChatGPTFallbackModel,
5
7
  shouldShowChatGPTRateLimitHint
6
8
  } from "./chatgpt-rate-limit.js";
@@ -21,6 +23,15 @@ describe("chatgpt-rate-limit utils", () => {
21
23
  })
22
24
  ).toBe("ChatGPT cap 82% used");
23
25
  });
26
+ it("gives a short form for tight status lines, and nothing for other providers", () => {
27
+ const chatgpt = { provider: "openai-compatible", baseURL: createCodexBaseURL("chatgpt") };
28
+ const near = { source: "chatgpt-login", usedPercent: 95, exceeded: false };
29
+ const capped = { source: "chatgpt-login", usedPercent: 100, exceeded: true };
30
+ expect(resolveChatGPTRateLimitHint(chatgpt, near, "short")).toBe("cap 95%");
31
+ expect(resolveChatGPTRateLimitHint(chatgpt, capped, "short")).toBe("cap reached");
32
+ expect(resolveChatGPTRateLimitHint(chatgpt, near, "full")).toBe("ChatGPT cap 95% used");
33
+ expect(resolveChatGPTRateLimitHint({ provider: "openai" }, near, "short")).toBeNull();
34
+ });
24
35
  it("formats a hard cap state without showing fake reset data", () => {
25
36
  expect(
26
37
  getChatGPTRateLimitHint({
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var deck_state_exports = {};
20
+ __export(deck_state_exports, {
21
+ deckCollapsed: () => deckCollapsed,
22
+ deckCredits: () => deckCredits,
23
+ deckMode: () => deckMode,
24
+ deckModelId: () => deckModelId,
25
+ deckReadout: () => deckReadout,
26
+ keepsTurnSpend: () => keepsTurnSpend,
27
+ nextTurnBaseline: () => nextTurnBaseline,
28
+ permissionLabel: () => permissionLabel
29
+ });
30
+ module.exports = __toCommonJS(deck_state_exports);
31
+ var import_overlayPresentation = require("./overlayPresentation.js");
32
+ function deckMode(a) {
33
+ if (a.awaitingUser) return "wait";
34
+ if (a.isCancelling) return "stop";
35
+ if (!a.isProcessing) return a.lastRunFailed ? "fault" : "idle";
36
+ if (a.steerCount > 0) return "steer";
37
+ if (a.isThinking) return "think";
38
+ if (a.toolRunning || a.isCompacting) return "tool";
39
+ return "stream";
40
+ }
41
+ function join(parts) {
42
+ const kept = parts.filter((p) => p !== null && p !== "");
43
+ return kept.length > 0 ? kept.join(" \xB7 ") : null;
44
+ }
45
+ function deckReadout(mode, r) {
46
+ switch (mode) {
47
+ case "wait":
48
+ return `paused ${r.elapsed}`;
49
+ case "steer":
50
+ return join([
51
+ r.permission,
52
+ `${r.steerCount} steer${r.steerCount === 1 ? "" : "s"} queued`
53
+ ]);
54
+ case "stop":
55
+ return "stopping";
56
+ case "think":
57
+ case "stream":
58
+ case "tool":
59
+ case "cloud":
60
+ return join([r.permission, r.compacting ? "compacting" : r.tokens, r.elapsed]);
61
+ default:
62
+ return join([
63
+ r.permission,
64
+ r.rateLimitHint,
65
+ r.reasoning === null ? null : `r:${r.reasoning}`
66
+ ]);
67
+ }
68
+ }
69
+ function deckModelId(provider, model) {
70
+ if (provider === null) return model;
71
+ return `${provider === "dexto-nova" ? "dexto" : provider}/${model}`;
72
+ }
73
+ function deckCredits(c) {
74
+ if (!c.signedIn) return { kind: "signed-out" };
75
+ if (c.balance === null) return { kind: "signed-in" };
76
+ if (c.balance <= 0) return { kind: "out" };
77
+ const spent = c.turnStartBalance === null ? 0 : Math.round((c.turnStartBalance - c.balance) * 100) / 100;
78
+ return { kind: "balance", balance: c.balance, spend: spent > 0 ? spent : null };
79
+ }
80
+ function keepsTurnSpend(previous, next) {
81
+ return previous === null && next !== null;
82
+ }
83
+ function nextTurnBaseline(prev, now) {
84
+ const switched = prev.sessionId !== now.sessionId && !keepsTurnSpend(prev.sessionId, now.sessionId);
85
+ let balance = switched || prev.account !== now.account ? null : prev.balance;
86
+ if (now.isProcessing && !prev.isProcessing) balance = now.balance;
87
+ return { ...now, balance };
88
+ }
89
+ function deckCollapsed(activeOverlay) {
90
+ return (0, import_overlayPresentation.getOverlayPresentation)(activeOverlay, null) === "focus";
91
+ }
92
+ function permissionLabel(p) {
93
+ const session = p.isShellMode ? "shell mode" : p.planModeActive ? "plan mode" : p.autoApproveEdits ? "accept edits" : null;
94
+ const auto = p.bypassPermissions || p.configuredMode === "auto-approve";
95
+ return join([session, auto ? "auto-approve" : null]);
96
+ }
97
+ // Annotate the CommonJS export names for ESM import in node:
98
+ 0 && (module.exports = {
99
+ deckCollapsed,
100
+ deckCredits,
101
+ deckMode,
102
+ deckModelId,
103
+ deckReadout,
104
+ keepsTurnSpend,
105
+ nextTurnBaseline,
106
+ permissionLabel
107
+ });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * What the Signal deck shows, worked out from the CLI's own state. Pure, so each rule is
3
+ * tested on its own; `useDeckState` gathers the inputs.
4
+ */
5
+ import type { DeckCredits, DeckMode } from '../signal/index.js';
6
+ import type { OverlayType } from '../state/types.js';
7
+ export interface DeckActivity {
8
+ isProcessing: boolean;
9
+ isCancelling: boolean;
10
+ isThinking: boolean;
11
+ isCompacting: boolean;
12
+ /** An approval or a question is waiting on the user. */
13
+ awaitingUser: boolean;
14
+ /** A tool call is executing. */
15
+ toolRunning: boolean;
16
+ /** Steer messages waiting for the current step to finish. */
17
+ steerCount: number;
18
+ /** The last run ended on an error. Cleared when the next run starts. */
19
+ lastRunFailed: boolean;
20
+ }
21
+ /** Highest first: what needs the user, then what the agent is doing. */
22
+ export declare function deckMode(a: DeckActivity): DeckMode;
23
+ export interface DeckReadoutInput {
24
+ /** Formatted elapsed time of the run, or of the wait. */
25
+ elapsed: string;
26
+ /** Formatted token count; '' when too small to show. */
27
+ tokens: string;
28
+ compacting: boolean;
29
+ steerCount: number;
30
+ /** "plan mode", "accept edits", "auto-approve"; null in the default mode. */
31
+ permission: string | null;
32
+ /** The reasoning variant beside the model ("high"); null when the model has none. */
33
+ reasoning: string | null;
34
+ /** ChatGPT plan usage in short form ("cap 95%"), when it is worth showing. */
35
+ rateLimitHint: string | null;
36
+ }
37
+ export declare function deckReadout(mode: DeckMode, r: DeckReadoutInput): string | null;
38
+ /** "dexto/…" for Dexto credits, "provider/model" for an own key. */
39
+ export declare function deckModelId(provider: string | null, model: string): string;
40
+ export interface DeckCreditsInput {
41
+ signedIn: boolean;
42
+ /** Current balance in USD, null when not known. */
43
+ balance: number | null;
44
+ /** Balance when the current or last turn started, to show what it spent. */
45
+ turnStartBalance: number | null;
46
+ }
47
+ export declare function deckCredits(c: DeckCreditsInput): DeckCredits;
48
+ /**
49
+ * Whether the turn's spend baseline survives a session id change. The first turn creates its
50
+ * session after it starts, so null to an id is the same turn; anything else is a real switch.
51
+ */
52
+ export declare function keepsTurnSpend(previous: string | null, next: string | null): boolean;
53
+ /** The balance a turn's spend is measured from, and what it was worked out from. */
54
+ export interface TurnBaseline {
55
+ sessionId: string | null;
56
+ /** Who is signed in; null when no one is. */
57
+ account: string | null;
58
+ isProcessing: boolean;
59
+ balance: number | null;
60
+ }
61
+ /** Cleared by a session switch or an account change; set when a turn starts. */
62
+ export declare function nextTurnBaseline(prev: TurnBaseline, now: TurnBaseline): TurnBaseline;
63
+ /** Focused overlays size themselves to the screen, so the deck's rows would overflow it. */
64
+ export declare function deckCollapsed(activeOverlay: OverlayType): boolean;
65
+ export interface PermissionInput {
66
+ isShellMode: boolean;
67
+ planModeActive: boolean;
68
+ autoApproveEdits: boolean;
69
+ bypassPermissions: boolean;
70
+ /** The agent's configured permissions mode, under any session override. */
71
+ configuredMode: string;
72
+ }
73
+ /**
74
+ * The approval policy in force, for the idle readout; null for manual approvals. The session
75
+ * mode (Shift+Tab) comes first. Auto-approval is always named when it applies: the session
76
+ * flags don't narrow an agent configured to auto-approve.
77
+ */
78
+ export declare function permissionLabel(p: PermissionInput): string | null;
79
+ //# sourceMappingURL=deck-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-state.d.ts","sourceRoot":"","sources":["../../src/utils/deck-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,YAAY,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,OAAO,CAAC;CAC1B;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,QAAQ,CASlD;AAED,MAAM,WAAW,gBAAgB;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAyB9E;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAO5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEpF;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,GAAG,YAAY,CAMpF;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAUjE"}
@@ -0,0 +1,76 @@
1
+ import { getOverlayPresentation } from "./overlayPresentation.js";
2
+ function deckMode(a) {
3
+ if (a.awaitingUser) return "wait";
4
+ if (a.isCancelling) return "stop";
5
+ if (!a.isProcessing) return a.lastRunFailed ? "fault" : "idle";
6
+ if (a.steerCount > 0) return "steer";
7
+ if (a.isThinking) return "think";
8
+ if (a.toolRunning || a.isCompacting) return "tool";
9
+ return "stream";
10
+ }
11
+ function join(parts) {
12
+ const kept = parts.filter((p) => p !== null && p !== "");
13
+ return kept.length > 0 ? kept.join(" \xB7 ") : null;
14
+ }
15
+ function deckReadout(mode, r) {
16
+ switch (mode) {
17
+ case "wait":
18
+ return `paused ${r.elapsed}`;
19
+ case "steer":
20
+ return join([
21
+ r.permission,
22
+ `${r.steerCount} steer${r.steerCount === 1 ? "" : "s"} queued`
23
+ ]);
24
+ case "stop":
25
+ return "stopping";
26
+ case "think":
27
+ case "stream":
28
+ case "tool":
29
+ case "cloud":
30
+ return join([r.permission, r.compacting ? "compacting" : r.tokens, r.elapsed]);
31
+ default:
32
+ return join([
33
+ r.permission,
34
+ r.rateLimitHint,
35
+ r.reasoning === null ? null : `r:${r.reasoning}`
36
+ ]);
37
+ }
38
+ }
39
+ function deckModelId(provider, model) {
40
+ if (provider === null) return model;
41
+ return `${provider === "dexto-nova" ? "dexto" : provider}/${model}`;
42
+ }
43
+ function deckCredits(c) {
44
+ if (!c.signedIn) return { kind: "signed-out" };
45
+ if (c.balance === null) return { kind: "signed-in" };
46
+ if (c.balance <= 0) return { kind: "out" };
47
+ const spent = c.turnStartBalance === null ? 0 : Math.round((c.turnStartBalance - c.balance) * 100) / 100;
48
+ return { kind: "balance", balance: c.balance, spend: spent > 0 ? spent : null };
49
+ }
50
+ function keepsTurnSpend(previous, next) {
51
+ return previous === null && next !== null;
52
+ }
53
+ function nextTurnBaseline(prev, now) {
54
+ const switched = prev.sessionId !== now.sessionId && !keepsTurnSpend(prev.sessionId, now.sessionId);
55
+ let balance = switched || prev.account !== now.account ? null : prev.balance;
56
+ if (now.isProcessing && !prev.isProcessing) balance = now.balance;
57
+ return { ...now, balance };
58
+ }
59
+ function deckCollapsed(activeOverlay) {
60
+ return getOverlayPresentation(activeOverlay, null) === "focus";
61
+ }
62
+ function permissionLabel(p) {
63
+ const session = p.isShellMode ? "shell mode" : p.planModeActive ? "plan mode" : p.autoApproveEdits ? "accept edits" : null;
64
+ const auto = p.bypassPermissions || p.configuredMode === "auto-approve";
65
+ return join([session, auto ? "auto-approve" : null]);
66
+ }
67
+ export {
68
+ deckCollapsed,
69
+ deckCredits,
70
+ deckMode,
71
+ deckModelId,
72
+ deckReadout,
73
+ keepsTurnSpend,
74
+ nextTurnBaseline,
75
+ permissionLabel
76
+ };
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_deck_state = require("./deck-state.js");
4
+ const idle = {
5
+ isProcessing: false,
6
+ isCancelling: false,
7
+ isThinking: false,
8
+ isCompacting: false,
9
+ awaitingUser: false,
10
+ toolRunning: false,
11
+ steerCount: 0,
12
+ lastRunFailed: false
13
+ };
14
+ (0, import_vitest.describe)("deckMode", () => {
15
+ (0, import_vitest.it)("is READY when nothing runs", () => {
16
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)(idle)).toBe("idle");
17
+ });
18
+ (0, import_vitest.it)("is FAULT after a run that failed, until the next one starts", () => {
19
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...idle, lastRunFailed: true })).toBe("fault");
20
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...idle, lastRunFailed: true, isProcessing: true })).toBe("stream");
21
+ });
22
+ (0, import_vitest.it)("puts waiting on you above everything the agent is doing", () => {
23
+ const busy = { ...idle, isProcessing: true, isThinking: true, toolRunning: true };
24
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...busy, awaitingUser: true })).toBe("wait");
25
+ });
26
+ (0, import_vitest.it)("shows STOPPED while a cancel lands", () => {
27
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...idle, isCancelling: true })).toBe("stop");
28
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...idle, isCancelling: true, lastRunFailed: true })).toBe("stop");
29
+ });
30
+ (0, import_vitest.it)("shows STEERING while a steer waits for the current step", () => {
31
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...idle, isProcessing: true, toolRunning: true, steerCount: 1 })).toBe(
32
+ "steer"
33
+ );
34
+ });
35
+ (0, import_vitest.it)("tells thinking, tools and streaming apart", () => {
36
+ const run = { ...idle, isProcessing: true };
37
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...run, isThinking: true })).toBe("think");
38
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...run, toolRunning: true })).toBe("tool");
39
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)({ ...run, isCompacting: true })).toBe("tool");
40
+ (0, import_vitest.expect)((0, import_deck_state.deckMode)(run)).toBe("stream");
41
+ });
42
+ });
43
+ (0, import_vitest.describe)("deckReadout", () => {
44
+ const base = {
45
+ elapsed: "12s",
46
+ tokens: "1.9K tokens",
47
+ compacting: false,
48
+ steerCount: 0,
49
+ permission: null,
50
+ reasoning: null,
51
+ rateLimitHint: null
52
+ };
53
+ (0, import_vitest.it)("reads tokens and time while the agent works", () => {
54
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("stream", base)).toBe("1.9K tokens \xB7 12s");
55
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("think", { ...base, tokens: "" })).toBe("12s");
56
+ });
57
+ (0, import_vitest.it)("says what it is doing when it compacts", () => {
58
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("tool", { ...base, compacting: true })).toBe("compacting \xB7 12s");
59
+ });
60
+ (0, import_vitest.it)("counts queued steers", () => {
61
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("steer", { ...base, steerCount: 2 })).toBe("2 steers queued");
62
+ });
63
+ (0, import_vitest.it)("leads with the permission mode during a run, since Shift+Tab still changes it", () => {
64
+ const auto = { ...base, permission: "auto-approve" };
65
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("stream", auto)).toBe("auto-approve \xB7 1.9K tokens \xB7 12s");
66
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("tool", { ...auto, compacting: true })).toBe(
67
+ "auto-approve \xB7 compacting \xB7 12s"
68
+ );
69
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("steer", { ...auto, steerCount: 1 })).toBe(
70
+ "auto-approve \xB7 1 steer queued"
71
+ );
72
+ });
73
+ (0, import_vitest.it)("shows how long it has waited on you", () => {
74
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("wait", base)).toBe("paused 12s");
75
+ });
76
+ (0, import_vitest.it)("shows the permission mode, then a rate-limit hint, when idle", () => {
77
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("idle", base)).toBeNull();
78
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("idle", { ...base, permission: "plan mode" })).toBe("plan mode");
79
+ (0, import_vitest.expect)(
80
+ (0, import_deck_state.deckReadout)("idle", { ...base, permission: "plan mode", rateLimitHint: "91% used" })
81
+ ).toBe("plan mode \xB7 91% used");
82
+ });
83
+ (0, import_vitest.it)("puts the usage warning before the reasoning variant, since the end truncates first", () => {
84
+ (0, import_vitest.expect)(
85
+ (0, import_deck_state.deckReadout)("idle", {
86
+ ...base,
87
+ permission: "auto-approve",
88
+ reasoning: "medium",
89
+ rateLimitHint: "cap 95%"
90
+ })
91
+ ).toBe("auto-approve \xB7 cap 95% \xB7 r:medium");
92
+ });
93
+ (0, import_vitest.it)("shows the reasoning variant when idle, so Tab has visible feedback", () => {
94
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("idle", { ...base, reasoning: "high" })).toBe("r:high");
95
+ (0, import_vitest.expect)((0, import_deck_state.deckReadout)("idle", { ...base, permission: "plan mode", reasoning: "low" })).toBe(
96
+ "plan mode \xB7 r:low"
97
+ );
98
+ });
99
+ });
100
+ (0, import_vitest.describe)("deckModelId", () => {
101
+ (0, import_vitest.it)("names Dexto models dexto/\u2026 and own-key models by provider", () => {
102
+ (0, import_vitest.expect)((0, import_deck_state.deckModelId)("dexto-nova", "anthropic/claude-sonnet-4.5")).toBe(
103
+ "dexto/anthropic/claude-sonnet-4.5"
104
+ );
105
+ (0, import_vitest.expect)((0, import_deck_state.deckModelId)("openai", "gpt-5")).toBe("openai/gpt-5");
106
+ (0, import_vitest.expect)((0, import_deck_state.deckModelId)(null, "gpt-5")).toBe("gpt-5");
107
+ });
108
+ });
109
+ (0, import_vitest.describe)("deckCredits", () => {
110
+ (0, import_vitest.it)("is signed out without an account", () => {
111
+ (0, import_vitest.expect)((0, import_deck_state.deckCredits)({ signedIn: false, balance: null, turnStartBalance: null })).toEqual({
112
+ kind: "signed-out"
113
+ });
114
+ });
115
+ (0, import_vitest.it)("is out at or below zero", () => {
116
+ (0, import_vitest.expect)((0, import_deck_state.deckCredits)({ signedIn: true, balance: 0, turnStartBalance: null })).toEqual({
117
+ kind: "out"
118
+ });
119
+ });
120
+ (0, import_vitest.it)("reports what this turn spent", () => {
121
+ (0, import_vitest.expect)((0, import_deck_state.deckCredits)({ signedIn: true, balance: 12.5, turnStartBalance: 12.81 })).toEqual({
122
+ kind: "balance",
123
+ balance: 12.5,
124
+ spend: 0.31
125
+ });
126
+ (0, import_vitest.expect)((0, import_deck_state.deckCredits)({ signedIn: true, balance: 12.5, turnStartBalance: 12.5 })).toEqual({
127
+ kind: "balance",
128
+ balance: 12.5,
129
+ spend: null
130
+ });
131
+ });
132
+ });
133
+ (0, import_vitest.describe)("permissionLabel", () => {
134
+ const none = {
135
+ isShellMode: false,
136
+ planModeActive: false,
137
+ autoApproveEdits: false,
138
+ bypassPermissions: false,
139
+ configuredMode: "manual"
140
+ };
141
+ (0, import_vitest.it)("is null for manual approvals", () => {
142
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)(none)).toBeNull();
143
+ });
144
+ (0, import_vitest.it)("shows an agent configured to auto-approve, with no session override", () => {
145
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...none, configuredMode: "auto-approve" })).toBe("auto-approve");
146
+ });
147
+ (0, import_vitest.it)("names the session mode first and keeps configured auto-approval beside it", () => {
148
+ const configured = { ...none, configuredMode: "auto-approve" };
149
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...configured, planModeActive: true })).toBe(
150
+ "plan mode \xB7 auto-approve"
151
+ );
152
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...configured, autoApproveEdits: true })).toBe(
153
+ "accept edits \xB7 auto-approve"
154
+ );
155
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...none, autoApproveEdits: true })).toBe("accept edits");
156
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...none, bypassPermissions: true })).toBe("auto-approve");
157
+ (0, import_vitest.expect)((0, import_deck_state.permissionLabel)({ ...configured, isShellMode: true })).toBe(
158
+ "shell mode \xB7 auto-approve"
159
+ );
160
+ });
161
+ });
162
+ (0, import_vitest.describe)("keepsTurnSpend", () => {
163
+ (0, import_vitest.it)("keeps the spend when the first turn creates its session", () => {
164
+ (0, import_vitest.expect)((0, import_deck_state.keepsTurnSpend)(null, "s1")).toBe(true);
165
+ });
166
+ (0, import_vitest.it)("clears the spend on a switch to another session", () => {
167
+ (0, import_vitest.expect)((0, import_deck_state.keepsTurnSpend)("s1", "s2")).toBe(false);
168
+ (0, import_vitest.expect)((0, import_deck_state.keepsTurnSpend)("s1", null)).toBe(false);
169
+ });
170
+ });
171
+ (0, import_vitest.describe)("nextTurnBaseline", () => {
172
+ const before = { sessionId: "s1", account: "ada", isProcessing: false, balance: 12.84 };
173
+ const now = { sessionId: "s1", account: "ada", isProcessing: false, balance: 12.5 };
174
+ (0, import_vitest.it)("takes the balance when a turn starts and holds it through the turn", () => {
175
+ const started = (0, import_deck_state.nextTurnBaseline)(before, { ...now, isProcessing: true });
176
+ (0, import_vitest.expect)(started.balance).toBe(12.5);
177
+ const later = (0, import_deck_state.nextTurnBaseline)(started, { ...now, isProcessing: true, balance: 12.1 });
178
+ (0, import_vitest.expect)(later.balance).toBe(12.5);
179
+ });
180
+ (0, import_vitest.it)("keeps the baseline while the first turn creates its session", () => {
181
+ const prev = { sessionId: null, account: "ada", isProcessing: true, balance: 12.84 };
182
+ const next = (0, import_deck_state.nextTurnBaseline)(prev, { ...now, isProcessing: true });
183
+ (0, import_vitest.expect)(next).toEqual({
184
+ sessionId: "s1",
185
+ account: "ada",
186
+ isProcessing: true,
187
+ balance: 12.84
188
+ });
189
+ });
190
+ (0, import_vitest.it)("clears the baseline on a session switch", () => {
191
+ (0, import_vitest.expect)((0, import_deck_state.nextTurnBaseline)(before, { ...now, sessionId: "s2" }).balance).toBeNull();
192
+ });
193
+ (0, import_vitest.it)("clears the baseline on sign-out, so it never carries to another account", () => {
194
+ (0, import_vitest.expect)((0, import_deck_state.nextTurnBaseline)(before, { ...now, account: null }).balance).toBeNull();
195
+ });
196
+ (0, import_vitest.it)("clears the baseline when another account signs in without a sign-out", () => {
197
+ (0, import_vitest.expect)((0, import_deck_state.nextTurnBaseline)(before, { ...now, account: "grace" }).balance).toBeNull();
198
+ });
199
+ });
200
+ (0, import_vitest.describe)("deckCollapsed", () => {
201
+ (0, import_vitest.it)("collapses under focused overlays, which budget for the whole screen", () => {
202
+ (0, import_vitest.expect)((0, import_deck_state.deckCollapsed)("model-selector")).toBe(true);
203
+ });
204
+ (0, import_vitest.it)("stays up with no overlay and under inline ones", () => {
205
+ (0, import_vitest.expect)((0, import_deck_state.deckCollapsed)("none")).toBe(false);
206
+ (0, import_vitest.expect)((0, import_deck_state.deckCollapsed)("slash-autocomplete")).toBe(false);
207
+ });
208
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deck-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-state.test.d.ts","sourceRoot":"","sources":["../../src/utils/deck-state.test.ts"],"names":[],"mappings":""}