@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001

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 (863) hide show
  1. package/README.md +769 -22
  2. package/dist/accounts.js +89 -11
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/approvals.d.ts +2 -1
  5. package/dist/artifacts-document.js +5 -3
  6. package/dist/artifacts-presentation.js +5 -3
  7. package/dist/artifacts-spreadsheet.d.ts +1 -1
  8. package/dist/artifacts-spreadsheet.js +5 -3
  9. package/dist/artifacts.d.ts +5 -1
  10. package/dist/artifacts.js +536 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
  16. package/dist/chunk-2DDJ6YH6.js +41 -0
  17. package/dist/chunk-2DDJ6YH6.js.map +1 -0
  18. package/dist/chunk-2HVLQ26H.js +183 -0
  19. package/dist/chunk-2HVLQ26H.js.map +1 -0
  20. package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
  21. package/dist/chunk-2I6R3GCZ.js.map +1 -0
  22. package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
  23. package/dist/chunk-2SFFYIH3.js.map +1 -0
  24. package/dist/chunk-3PVDYTTB.js +24 -0
  25. package/dist/chunk-3PVDYTTB.js.map +1 -0
  26. package/dist/chunk-3UZCWK46.js +298 -0
  27. package/dist/chunk-3UZCWK46.js.map +1 -0
  28. package/dist/chunk-47CKUXTW.js +293 -0
  29. package/dist/chunk-47CKUXTW.js.map +1 -0
  30. package/dist/chunk-4QYP6QUI.js +109 -0
  31. package/dist/chunk-4QYP6QUI.js.map +1 -0
  32. package/dist/chunk-5EY26VZ7.js +1053 -0
  33. package/dist/chunk-5EY26VZ7.js.map +1 -0
  34. package/dist/chunk-5I4VRWBB.js +56 -0
  35. package/dist/chunk-5I4VRWBB.js.map +1 -0
  36. package/dist/chunk-5WOR7UCL.js +191 -0
  37. package/dist/chunk-5WOR7UCL.js.map +1 -0
  38. package/dist/chunk-5YJLGOM5.js +51 -0
  39. package/dist/chunk-5YJLGOM5.js.map +1 -0
  40. package/dist/chunk-6JFN3OWG.js +386 -0
  41. package/dist/chunk-6JFN3OWG.js.map +1 -0
  42. package/dist/chunk-7QJT5O4S.js +35 -0
  43. package/dist/chunk-7QJT5O4S.js.map +1 -0
  44. package/dist/chunk-A55KV72M.js +402 -0
  45. package/dist/chunk-A55KV72M.js.map +1 -0
  46. package/dist/chunk-ADWCLI4G.js +2028 -0
  47. package/dist/chunk-ADWCLI4G.js.map +1 -0
  48. package/dist/chunk-B27E3V37.js +29 -0
  49. package/dist/chunk-B27E3V37.js.map +1 -0
  50. package/dist/chunk-B7TC2A33.js +83 -0
  51. package/dist/chunk-B7TC2A33.js.map +1 -0
  52. package/dist/chunk-BLL56F7R.js +385 -0
  53. package/dist/chunk-BLL56F7R.js.map +1 -0
  54. package/dist/chunk-BOFEQC6K.js +162 -0
  55. package/dist/chunk-BOFEQC6K.js.map +1 -0
  56. package/dist/chunk-CM7LVUKC.js +35 -0
  57. package/dist/chunk-CM7LVUKC.js.map +1 -0
  58. package/dist/chunk-CORUP6JB.js +122 -0
  59. package/dist/chunk-CORUP6JB.js.map +1 -0
  60. package/dist/chunk-CSX5FFKZ.js +35 -0
  61. package/dist/chunk-CSX5FFKZ.js.map +1 -0
  62. package/dist/chunk-EGVHJKGJ.js +3125 -0
  63. package/dist/chunk-EGVHJKGJ.js.map +1 -0
  64. package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
  65. package/dist/chunk-G76LSA76.js.map +1 -0
  66. package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
  67. package/dist/chunk-GQMRL52F.js.map +1 -0
  68. package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
  69. package/dist/chunk-GUUXOISA.js.map +1 -0
  70. package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
  71. package/dist/chunk-I7X2P4FU.js.map +1 -0
  72. package/dist/chunk-IGFZFLI2.js +1390 -0
  73. package/dist/chunk-IGFZFLI2.js.map +1 -0
  74. package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
  75. package/dist/chunk-IMSUVYQB.js.map +1 -0
  76. package/dist/chunk-IOYHDEP3.js +38 -0
  77. package/dist/chunk-IOYHDEP3.js.map +1 -0
  78. package/dist/chunk-IZV5FTJC.js +55 -0
  79. package/dist/chunk-IZV5FTJC.js.map +1 -0
  80. package/dist/chunk-KF33GTWN.js +343 -0
  81. package/dist/chunk-KF33GTWN.js.map +1 -0
  82. package/dist/chunk-KSGQ5ODA.js +457 -0
  83. package/dist/chunk-KSGQ5ODA.js.map +1 -0
  84. package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
  85. package/dist/chunk-KZC6QRNR.js.map +1 -0
  86. package/dist/chunk-LJUMYUBO.js +218 -0
  87. package/dist/chunk-LJUMYUBO.js.map +1 -0
  88. package/dist/chunk-LSW2OJVV.js +380 -0
  89. package/dist/chunk-LSW2OJVV.js.map +1 -0
  90. package/dist/chunk-M357MHH3.js +2 -0
  91. package/dist/chunk-M357MHH3.js.map +1 -0
  92. package/dist/chunk-MK2TQO4Y.js +24 -0
  93. package/dist/chunk-MK2TQO4Y.js.map +1 -0
  94. package/dist/chunk-N7S72EXK.js +25 -0
  95. package/dist/chunk-N7S72EXK.js.map +1 -0
  96. package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
  97. package/dist/chunk-NKMYZFHA.js.map +1 -0
  98. package/dist/chunk-NX4ADH73.js +14 -0
  99. package/dist/chunk-NX4ADH73.js.map +1 -0
  100. package/dist/chunk-O7F6UJO4.js +71 -0
  101. package/dist/chunk-O7F6UJO4.js.map +1 -0
  102. package/dist/chunk-OVB5WIG5.js +14064 -0
  103. package/dist/chunk-OVB5WIG5.js.map +1 -0
  104. package/dist/chunk-OYQQJL3J.js +16 -0
  105. package/dist/chunk-OYQQJL3J.js.map +1 -0
  106. package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
  107. package/dist/chunk-P4BNUO57.js.map +1 -0
  108. package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
  109. package/dist/chunk-PEHTX3V7.js.map +1 -0
  110. package/dist/chunk-PMV53IMM.js +26 -0
  111. package/dist/chunk-PMV53IMM.js.map +1 -0
  112. package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
  113. package/dist/chunk-PYEOPA4M.js.map +1 -0
  114. package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
  115. package/dist/chunk-QHUE7E4N.js.map +1 -0
  116. package/dist/chunk-QV3DJVRZ.js +11 -0
  117. package/dist/chunk-QV3DJVRZ.js.map +1 -0
  118. package/dist/chunk-R5SBNG7S.js +810 -0
  119. package/dist/chunk-R5SBNG7S.js.map +1 -0
  120. package/dist/chunk-RI42H5IU.js +326 -0
  121. package/dist/chunk-RI42H5IU.js.map +1 -0
  122. package/dist/chunk-S2QH6EZ5.js +211 -0
  123. package/dist/chunk-S2QH6EZ5.js.map +1 -0
  124. package/dist/chunk-SHLZMAJN.js +304 -0
  125. package/dist/chunk-SHLZMAJN.js.map +1 -0
  126. package/dist/chunk-TGXK4BAZ.js +293 -0
  127. package/dist/chunk-TGXK4BAZ.js.map +1 -0
  128. package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
  129. package/dist/chunk-TNEZNMSN.js.map +1 -0
  130. package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
  131. package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
  132. package/dist/chunk-UNJPZGNK.js +63 -0
  133. package/dist/chunk-UNJPZGNK.js.map +1 -0
  134. package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
  135. package/dist/chunk-V5ZUJT2T.js.map +1 -0
  136. package/dist/chunk-VIUEOHXY.js +394 -0
  137. package/dist/chunk-VIUEOHXY.js.map +1 -0
  138. package/dist/chunk-WIUKB3LD.js +1911 -0
  139. package/dist/chunk-WIUKB3LD.js.map +1 -0
  140. package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
  141. package/dist/chunk-WNN7NO2N.js.map +1 -0
  142. package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
  143. package/dist/chunk-X5UVUIMF.js.map +1 -0
  144. package/dist/chunk-XDA5QJE7.js +402 -0
  145. package/dist/chunk-XDA5QJE7.js.map +1 -0
  146. package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
  147. package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
  148. package/dist/chunk-XHF7OYAN.js +1150 -0
  149. package/dist/chunk-XHF7OYAN.js.map +1 -0
  150. package/dist/chunk-YSRBFJMQ.js +43 -0
  151. package/dist/chunk-YSRBFJMQ.js.map +1 -0
  152. package/dist/chunk-ZOZAPAUO.js +174 -0
  153. package/dist/chunk-ZOZAPAUO.js.map +1 -0
  154. package/dist/chunk-ZQV5W7YC.js +809 -0
  155. package/dist/chunk-ZQV5W7YC.js.map +1 -0
  156. package/dist/chunk-ZUWF4NF7.js +13 -0
  157. package/dist/chunk-ZUWF4NF7.js.map +1 -0
  158. package/dist/client.d.ts +16 -7
  159. package/dist/clipboard.js +3 -1
  160. package/dist/commands/types.d.ts +2 -0
  161. package/dist/components/anthropic-mark.d.ts +3 -0
  162. package/dist/components/approval-surface.d.ts +19 -6
  163. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  164. package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
  165. package/dist/components/artifacts/artifact-surface.d.ts +4 -2
  166. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  167. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  168. package/dist/components/artifacts/document-editor.d.ts +4 -2
  169. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  170. package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
  171. package/dist/components/artifacts/editable-document.d.ts +1 -1
  172. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  173. package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
  174. package/dist/components/artifacts/index.d.ts +9 -2
  175. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  176. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  177. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  178. package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
  179. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  180. package/dist/components/artifacts/site-view.d.ts +26 -0
  181. package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
  182. package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
  183. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  184. package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
  185. package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
  186. package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
  187. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  188. package/dist/components/browser-select-control.d.ts +16 -0
  189. package/dist/components/browser-viewer.d.ts +11 -2
  190. package/dist/components/chat-composer.d.ts +21 -3
  191. package/dist/components/child-session-link.d.ts +9 -0
  192. package/dist/components/claude-mark.d.ts +3 -0
  193. package/dist/components/code-editor.d.ts +1 -4
  194. package/dist/components/composer-transcription-control.d.ts +7 -0
  195. package/dist/components/composer.d.ts +34 -67
  196. package/dist/components/computer-viewer.d.ts +1 -1
  197. package/dist/components/copy-button.d.ts +3 -1
  198. package/dist/components/desktop-viewer.d.ts +1 -1
  199. package/dist/components/fleet-tile.d.ts +2 -2
  200. package/dist/components/grok-mark.d.ts +26 -0
  201. package/dist/components/human-input-form.d.ts +28 -32
  202. package/dist/components/human-input-surface.d.ts +7 -2
  203. package/dist/components/linkified-text.d.ts +18 -0
  204. package/dist/components/machine-input-display.d.ts +22 -1
  205. package/dist/components/machines/agent-status-icon.d.ts +6 -0
  206. package/dist/components/machines/machine-detail.d.ts +7 -1
  207. package/dist/components/machines/machine-status.d.ts +48 -0
  208. package/dist/components/markdown-table-layout.d.ts +18 -0
  209. package/dist/components/markdown.d.ts +37 -4
  210. package/dist/components/message-timeline.d.ts +86 -7
  211. package/dist/components/model-mark.d.ts +29 -0
  212. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  213. package/dist/components/model-policy-picker.d.ts +41 -25
  214. package/dist/components/new-conversation.d.ts +32 -0
  215. package/dist/components/open-geni-chat.d.ts +73 -0
  216. package/dist/components/open-geni-links.d.ts +68 -0
  217. package/dist/components/openrouter-mark.d.ts +6 -0
  218. package/dist/components/opper-mark.d.ts +7 -0
  219. package/dist/components/preview-loading.d.ts +2 -0
  220. package/dist/components/provider-recovery-notice.d.ts +16 -0
  221. package/dist/components/queue-item-content.d.ts +9 -0
  222. package/dist/components/rehype-secret-refs.d.ts +23 -0
  223. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  224. package/dist/components/sandbox-files.d.ts +3 -1
  225. package/dist/components/sandbox-workspace.d.ts +18 -0
  226. package/dist/components/secret-question-field.d.ts +31 -0
  227. package/dist/components/secret-ref-chip.d.ts +35 -0
  228. package/dist/components/session-capability-frame.d.ts +37 -0
  229. package/dist/components/session-chrome.d.ts +57 -8
  230. package/dist/components/session-commands-panel.d.ts +6 -0
  231. package/dist/components/session-commands.d.ts +6 -0
  232. package/dist/components/session-connection-request.d.ts +8 -0
  233. package/dist/components/session-conversation.d.ts +157 -0
  234. package/dist/components/session-list.d.ts +39 -0
  235. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  236. package/dist/components/session-proxy-scope.d.ts +35 -0
  237. package/dist/components/session-status.d.ts +4 -1
  238. package/dist/components/session-usage-limit-notice.d.ts +39 -0
  239. package/dist/components/timeline-anchor.d.ts +24 -0
  240. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  241. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  242. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  243. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  244. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  245. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  246. package/dist/components/timeline-annotations.d.ts +13 -3
  247. package/dist/components/timeline-reading-progress.d.ts +11 -0
  248. package/dist/components/timeline-search.d.ts +34 -0
  249. package/dist/components/timeline-settlement.d.ts +16 -0
  250. package/dist/components/tip-follow.d.ts +16 -0
  251. package/dist/components/tool-action-review.d.ts +47 -0
  252. package/dist/components/tool-review-history.d.ts +25 -0
  253. package/dist/components/usage-limit-notice.d.ts +49 -0
  254. package/dist/components/usage-member-list.d.ts +91 -0
  255. package/dist/components/usage-meter.d.ts +73 -0
  256. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  257. package/dist/components/user-message-body.d.ts +10 -1
  258. package/dist/composer-messages.d.ts +74 -0
  259. package/dist/composer-messages.js +9 -0
  260. package/dist/composer-messages.js.map +1 -0
  261. package/dist/composer-voice-events.d.ts +8 -0
  262. package/dist/composer.d.ts +5 -4
  263. package/dist/composer.js +26 -13
  264. package/dist/computer-viewer-GMLDXPON.js +20 -0
  265. package/dist/computer-viewer-GMLDXPON.js.map +1 -0
  266. package/dist/connect-account-identity.d.ts +8 -0
  267. package/dist/connect-accounts.d.ts +15 -0
  268. package/dist/connect-chooser.d.ts +18 -0
  269. package/dist/connect-panel.d.ts +18 -0
  270. package/dist/connect-setup.d.ts +18 -0
  271. package/dist/connect.d.ts +21 -0
  272. package/dist/connect.js +2149 -0
  273. package/dist/connect.js.map +1 -0
  274. package/dist/connection-catalog.d.ts +38 -0
  275. package/dist/connection-discovery.d.ts +12 -0
  276. package/dist/connection-installed.d.ts +17 -0
  277. package/dist/connection-logo.d.ts +9 -0
  278. package/dist/connection-service-logo.d.ts +8 -0
  279. package/dist/connection-service-presentation.d.ts +13 -0
  280. package/dist/connection-skeleton.d.ts +5 -0
  281. package/dist/connection-type-picker.d.ts +6 -0
  282. package/dist/conversation-timeline.d.ts +5 -0
  283. package/dist/desktop.d.ts +7 -0
  284. package/dist/desktop.js +27 -0
  285. package/dist/desktop.js.map +1 -0
  286. package/dist/device-authorization.d.ts +23 -0
  287. package/dist/diffs.d.ts +8 -0
  288. package/dist/diffs.js +15 -0
  289. package/dist/diffs.js.map +1 -0
  290. package/dist/discovery-cache.d.ts +5 -0
  291. package/dist/editor.d.ts +7 -0
  292. package/dist/editor.js +22 -0
  293. package/dist/editor.js.map +1 -0
  294. package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
  295. package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
  296. package/dist/embedded-voice-RPHPYVBT.js +18 -0
  297. package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
  298. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
  299. package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
  300. package/dist/hooks/latest-question.d.ts +25 -0
  301. package/dist/hooks/shared-machines-list.d.ts +4 -0
  302. package/dist/hooks/shared-query.d.ts +113 -0
  303. package/dist/hooks/use-attached-browsers.d.ts +1 -1
  304. package/dist/hooks/use-auth-runs.d.ts +1 -4
  305. package/dist/hooks/use-available-models.d.ts +1 -1
  306. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  307. package/dist/hooks/use-browser-session.d.ts +12 -1
  308. package/dist/hooks/use-client-config-flags.d.ts +49 -0
  309. package/dist/hooks/use-codex-accounts.d.ts +59 -10
  310. package/dist/hooks/use-composer.d.ts +24 -2
  311. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  312. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  313. package/dist/hooks/use-computer-session.d.ts +4 -0
  314. package/dist/hooks/use-connect.d.ts +23 -0
  315. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  316. package/dist/hooks/use-file-attachments.d.ts +12 -0
  317. package/dist/hooks/use-goal.d.ts +2 -1
  318. package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
  319. package/dist/hooks/use-new-conversation.d.ts +56 -0
  320. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  321. package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
  322. package/dist/hooks/use-sandbox-files.d.ts +4 -1
  323. package/dist/hooks/use-session-conversation.d.ts +49 -0
  324. package/dist/hooks/use-session-events.d.ts +28 -7
  325. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  326. package/dist/hooks/use-session-model-account.d.ts +48 -0
  327. package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
  328. package/dist/hooks/use-terminal-stream.d.ts +11 -5
  329. package/dist/hooks/use-usage.d.ts +40 -0
  330. package/dist/hooks/use-vaults.d.ts +53 -0
  331. package/dist/hooks/use-voice-input.d.ts +8 -1
  332. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  333. package/dist/hooks/use-workspace-sessions.d.ts +22 -5
  334. package/dist/human-input-model.d.ts +122 -0
  335. package/dist/identity-link-accounts.d.ts +11 -0
  336. package/dist/identity-link-consent.d.ts +18 -0
  337. package/dist/index.d.ts +82 -20
  338. package/dist/index.js +2350 -6605
  339. package/dist/index.js.map +1 -1
  340. package/dist/interaction.d.ts +1 -1
  341. package/dist/interaction.js +14 -24
  342. package/dist/interaction.js.map +1 -1
  343. package/dist/latest-question-R77KWSUP.js +118 -0
  344. package/dist/latest-question-R77KWSUP.js.map +1 -0
  345. package/dist/lib/clipboard.d.ts +7 -0
  346. package/dist/lib/error-message.d.ts +7 -0
  347. package/dist/lib/format.d.ts +58 -4
  348. package/dist/lib/host-theme.d.ts +77 -0
  349. package/dist/lib/interaction-errors.d.ts +3 -0
  350. package/dist/lib/menu-styles.d.ts +22 -0
  351. package/dist/lib/notify-observer.d.ts +2 -0
  352. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  353. package/dist/lib/provider-recovery.d.ts +55 -0
  354. package/dist/lib/scrollbars.d.ts +11 -0
  355. package/dist/lib/terminal-input-readiness.d.ts +11 -0
  356. package/dist/lib/transient-retry.d.ts +25 -0
  357. package/dist/lib/workbench-peers.d.ts +36 -0
  358. package/dist/lib/xterm-theme.d.ts +7 -5
  359. package/dist/machines.js +9 -5
  360. package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
  361. package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
  362. package/dist/mcp-connection-status.d.ts +14 -0
  363. package/dist/model-mark-paths.d.ts +34 -0
  364. package/dist/model-mark-paths.js +16 -0
  365. package/dist/model-mark-paths.js.map +1 -0
  366. package/dist/model-picker-model.d.ts +111 -0
  367. package/dist/model-picker-model.js +25 -0
  368. package/dist/model-picker-model.js.map +1 -0
  369. package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
  370. package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
  371. package/dist/model-policy.d.ts +30 -3
  372. package/dist/model-policy.js +14 -1
  373. package/dist/native-previews.d.ts +28 -0
  374. package/dist/native-previews.js +82 -0
  375. package/dist/native-previews.js.map +1 -0
  376. package/dist/new-session-draft.d.ts +7 -0
  377. package/dist/new-session-draft.js +639 -0
  378. package/dist/new-session-draft.js.map +1 -0
  379. package/dist/notification-text.d.ts +27 -0
  380. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
  381. package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
  382. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
  383. package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
  384. package/dist/older-history.d.ts +3 -2
  385. package/dist/organization-model.d.ts +32 -0
  386. package/dist/organization-model.js +65 -0
  387. package/dist/organization-model.js.map +1 -0
  388. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
  389. package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
  390. package/dist/plugin-details.d.ts +14 -0
  391. package/dist/plugin-discovery.d.ts +25 -0
  392. package/dist/preview-loading-paint.d.ts +20 -0
  393. package/dist/provider.d.ts +25 -2
  394. package/dist/queue-presentation-model.d.ts +72 -0
  395. package/dist/queue-presentation-model.js +38 -0
  396. package/dist/queue-presentation-model.js.map +1 -0
  397. package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
  398. package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
  399. package/dist/realtime/embedded-new-voice.d.ts +1 -0
  400. package/dist/realtime/embedded-voice.d.ts +1 -0
  401. package/dist/realtime/realtime-control.d.ts +4 -65
  402. package/dist/realtime/session-realtime.d.ts +78 -0
  403. package/dist/realtime.js +25 -1294
  404. package/dist/realtime.js.map +1 -1
  405. package/dist/sandbox-files-O27IPOZW.js +21 -0
  406. package/dist/sandbox-files-O27IPOZW.js.map +1 -0
  407. package/dist/sandbox-label-model.d.ts +30 -0
  408. package/dist/sandbox-label-model.js +20 -0
  409. package/dist/sandbox-label-model.js.map +1 -0
  410. package/dist/scrollbars.d.ts +1 -0
  411. package/dist/scrollbars.js +10 -0
  412. package/dist/scrollbars.js.map +1 -0
  413. package/dist/secret-reference-label.d.ts +14 -0
  414. package/dist/secrets-ui.d.ts +57 -0
  415. package/dist/session-agents-model.d.ts +10 -0
  416. package/dist/session-agents-model.js +25 -0
  417. package/dist/session-agents-model.js.map +1 -0
  418. package/dist/session-attention-model.d.ts +8 -0
  419. package/dist/session-attention-model.js +47 -0
  420. package/dist/session-attention-model.js.map +1 -0
  421. package/dist/session-auth-recommendation.d.ts +5 -0
  422. package/dist/session-capability-policy.d.ts +31 -0
  423. package/dist/session-feedback-model.d.ts +20 -0
  424. package/dist/session-feedback-model.js +56 -0
  425. package/dist/session-feedback-model.js.map +1 -0
  426. package/dist/session-list-model.d.ts +138 -0
  427. package/dist/session-list-model.js +274 -0
  428. package/dist/session-list-model.js.map +1 -0
  429. package/dist/session-realtime-7DJOIHQW.js +21 -0
  430. package/dist/session-realtime-7DJOIHQW.js.map +1 -0
  431. package/dist/session-realtime.d.ts +7 -0
  432. package/dist/session-realtime.js +19 -0
  433. package/dist/session-realtime.js.map +1 -0
  434. package/dist/session-status-model.d.ts +36 -0
  435. package/dist/session-ui.d.ts +39 -1
  436. package/dist/session-ui.js +126 -12
  437. package/dist/session-ui.js.map +1 -1
  438. package/dist/session.d.ts +8 -2
  439. package/dist/session.js +35 -20
  440. package/dist/site-snapshot.d.ts +14 -0
  441. package/dist/sites-ui.d.ts +24 -0
  442. package/dist/sites.d.ts +3 -0
  443. package/dist/sites.js +14 -0
  444. package/dist/sites.js.map +1 -0
  445. package/dist/skill-discovery.d.ts +47 -0
  446. package/dist/terminal.d.ts +8 -0
  447. package/dist/terminal.js +32 -0
  448. package/dist/terminal.js.map +1 -0
  449. package/dist/testing/session-scenarios.d.ts +10 -0
  450. package/dist/testing/session-scenarios.js +367 -0
  451. package/dist/testing/session-scenarios.js.map +1 -0
  452. package/dist/timeline/activity-rail.d.ts +11 -2
  453. package/dist/timeline/agent-identity.d.ts +30 -0
  454. package/dist/timeline/agent-row.d.ts +31 -0
  455. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  456. package/dist/timeline/compaction-copy.d.ts +46 -0
  457. package/dist/timeline/entrance.d.ts +13 -1
  458. package/dist/timeline/focus-sequence.d.ts +9 -0
  459. package/dist/timeline/genie-copy.d.ts +3 -0
  460. package/dist/timeline/genie-loading.d.ts +47 -0
  461. package/dist/timeline/index.d.ts +10 -5
  462. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  463. package/dist/timeline/message-sender.d.ts +19 -0
  464. package/dist/timeline/notice-presentation.d.ts +13 -0
  465. package/dist/timeline/parsers.d.ts +11 -0
  466. package/dist/timeline/patch-apply-command.d.ts +18 -0
  467. package/dist/timeline/platform-activity-presentation.d.ts +21 -0
  468. package/dist/timeline/platform-activity-row.d.ts +1 -2
  469. package/dist/timeline/presented-image.d.ts +11 -0
  470. package/dist/timeline/projection.d.ts +31 -2
  471. package/dist/timeline/provider-logo.d.ts +15 -0
  472. package/dist/timeline/question-nav-model.d.ts +23 -0
  473. package/dist/timeline/registry.d.ts +12 -1
  474. package/dist/timeline/retained-image.d.ts +18 -0
  475. package/dist/timeline/retained-loaders.d.ts +27 -0
  476. package/dist/timeline/rolling-activity.d.ts +11 -0
  477. package/dist/timeline/screenshot-lightbox.d.ts +23 -1
  478. package/dist/timeline/session-usage-limit-row.d.ts +11 -0
  479. package/dist/timeline/shared.d.ts +4 -1
  480. package/dist/timeline/startup-dispatch-details.d.ts +5 -0
  481. package/dist/timeline/startup-preference.d.ts +3 -0
  482. package/dist/timeline/startup-timings.d.ts +4 -0
  483. package/dist/timeline/tool-display-name.d.ts +5 -2
  484. package/dist/timeline/tool-presentation.d.ts +172 -0
  485. package/dist/timeline/turn-summary-model.d.ts +95 -0
  486. package/dist/timeline/turn-summary.d.ts +20 -54
  487. package/dist/timeline/types.d.ts +179 -7
  488. package/dist/timeline/work-presentation.d.ts +60 -0
  489. package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
  490. package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
  491. package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
  492. package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
  493. package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
  494. package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
  495. package/dist/timeline-model.d.ts +29 -0
  496. package/dist/timeline-model.js +254 -0
  497. package/dist/timeline-model.js.map +1 -0
  498. package/dist/usage/allowance-copy.d.ts +25 -0
  499. package/dist/usage/session-usage-limit.d.ts +88 -0
  500. package/dist/usage/summary.d.ts +35 -0
  501. package/dist/usage.d.ts +17 -0
  502. package/dist/usage.js +1187 -0
  503. package/dist/usage.js.map +1 -0
  504. package/dist/voice-recording-owner.d.ts +7 -0
  505. package/package.json +107 -7
  506. package/src/accounts.tsx +116 -14
  507. package/src/approvals.ts +8 -1
  508. package/src/artifacts-spreadsheet.ts +1 -0
  509. package/src/artifacts.ts +44 -0
  510. package/src/assets/README.md +8 -0
  511. package/src/assets/gmail.ico +0 -0
  512. package/src/assets/outlook.ico +0 -0
  513. package/src/capability-catalog-row.tsx +94 -0
  514. package/src/capability-logo-fallback.ts +22 -0
  515. package/src/client.ts +20 -31
  516. package/src/commands/registry.ts +18 -15
  517. package/src/commands/types.ts +2 -0
  518. package/src/components/anthropic-mark.tsx +10 -0
  519. package/src/components/approval-surface.tsx +401 -138
  520. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  521. package/src/components/artifacts/artifact-sandbox.tsx +189 -0
  522. package/src/components/artifacts/artifact-surface.tsx +40 -20
  523. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  524. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  525. package/src/components/artifacts/document-editor.tsx +141 -16
  526. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  527. package/src/components/artifacts/editable-artifact-view.tsx +197 -0
  528. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  529. package/src/components/artifacts/editable-document.tsx +37 -36
  530. package/src/components/artifacts/editable-presentation.tsx +36 -18
  531. package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
  532. package/src/components/artifacts/index.ts +45 -0
  533. package/src/components/artifacts/inline-html-document.ts +24 -0
  534. package/src/components/artifacts/latest-task-runner.ts +49 -0
  535. package/src/components/artifacts/presentation-editor.tsx +323 -67
  536. package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
  537. package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
  538. package/src/components/artifacts/site-view.tsx +121 -0
  539. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  540. package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
  541. package/src/components/artifacts/spreadsheet-download.tsx +109 -0
  542. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  543. package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
  544. package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
  545. package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
  546. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  547. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  548. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  549. package/src/components/browser-select-control.tsx +312 -0
  550. package/src/components/browser-viewer.tsx +778 -318
  551. package/src/components/chat-composer.tsx +47 -5
  552. package/src/components/child-session-link.tsx +36 -0
  553. package/src/components/claude-mark.tsx +11 -0
  554. package/src/components/code-editor.tsx +13 -16
  555. package/src/components/composer-transcription-control.tsx +128 -30
  556. package/src/components/composer.tsx +404 -195
  557. package/src/components/computer-viewer.tsx +880 -253
  558. package/src/components/copy-button.tsx +13 -5
  559. package/src/components/desktop-viewer.tsx +1 -1
  560. package/src/components/enrollment-consent.tsx +1 -1
  561. package/src/components/enrollment-device-flow.tsx +1 -1
  562. package/src/components/file-browser.tsx +10 -14
  563. package/src/components/fleet-tile.tsx +9 -18
  564. package/src/components/generated-video-player.tsx +4 -2
  565. package/src/components/grok-mark.tsx +34 -0
  566. package/src/components/human-input-form.tsx +590 -283
  567. package/src/components/human-input-surface.tsx +11 -0
  568. package/src/components/interaction-intervention-banner.tsx +2 -2
  569. package/src/components/linkified-text.tsx +79 -0
  570. package/src/components/machine-card.tsx +35 -78
  571. package/src/components/machine-dock-bar.tsx +1 -1
  572. package/src/components/machine-input-display.ts +197 -3
  573. package/src/components/machines/agent-status-icon.tsx +31 -0
  574. package/src/components/machines/machine-detail.tsx +200 -31
  575. package/src/components/machines/machine-operation-policy.tsx +1 -1
  576. package/src/components/machines/machine-status.ts +241 -0
  577. package/src/components/machines-dashboard.tsx +2 -17
  578. package/src/components/markdown-table-layout.ts +143 -0
  579. package/src/components/markdown.tsx +466 -129
  580. package/src/components/message-timeline.tsx +2567 -728
  581. package/src/components/model-mark.tsx +102 -0
  582. package/src/components/model-picker.tsx +15 -4
  583. package/src/components/model-policy-picker-menu.tsx +371 -0
  584. package/src/components/model-policy-picker.tsx +256 -412
  585. package/src/components/new-conversation.tsx +221 -0
  586. package/src/components/open-geni-chat.tsx +309 -0
  587. package/src/components/open-geni-links.tsx +179 -0
  588. package/src/components/openrouter-mark.tsx +13 -0
  589. package/src/components/opper-mark.tsx +18 -0
  590. package/src/components/pierre-diff.tsx +41 -16
  591. package/src/components/pierre-file.tsx +35 -10
  592. package/src/components/preview-loading.tsx +109 -0
  593. package/src/components/provider-recovery-notice.tsx +49 -0
  594. package/src/components/queue-item-content.ts +14 -0
  595. package/src/components/queue-surface-implementation.tsx +51 -356
  596. package/src/components/queue-surface-state.tsx +3 -1
  597. package/src/components/rehype-secret-refs.ts +98 -0
  598. package/src/components/remark-soft-line-breaks.ts +166 -0
  599. package/src/components/sandbox-files.tsx +91 -15
  600. package/src/components/sandbox-terminal.tsx +84 -13
  601. package/src/components/sandbox-workspace.tsx +147 -51
  602. package/src/components/secret-question-field.tsx +324 -0
  603. package/src/components/secret-ref-chip.tsx +185 -0
  604. package/src/components/session-capability-frame.tsx +197 -0
  605. package/src/components/session-chrome.tsx +842 -251
  606. package/src/components/session-commands-panel.tsx +126 -0
  607. package/src/components/session-commands.tsx +18 -0
  608. package/src/components/session-connection-request.tsx +97 -0
  609. package/src/components/session-conversation.tsx +876 -0
  610. package/src/components/session-list.tsx +257 -0
  611. package/src/components/session-mcp-capability-card.tsx +680 -0
  612. package/src/components/session-proxy-scope.tsx +153 -0
  613. package/src/components/session-status.tsx +26 -17
  614. package/src/components/session-usage-limit-notice.tsx +174 -0
  615. package/src/components/timeline-anchor.tsx +119 -0
  616. package/src/components/timeline-annotation-chrome.tsx +196 -0
  617. package/src/components/timeline-annotation-layout.ts +268 -0
  618. package/src/components/timeline-annotation-markers.tsx +185 -0
  619. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  620. package/src/components/timeline-annotation-selection.tsx +106 -54
  621. package/src/components/timeline-annotation-shared.ts +245 -0
  622. package/src/components/timeline-annotations-dialog.tsx +185 -128
  623. package/src/components/timeline-annotations.tsx +189 -45
  624. package/src/components/timeline-reading-progress.ts +80 -0
  625. package/src/components/timeline-search.tsx +168 -0
  626. package/src/components/timeline-settlement.ts +60 -0
  627. package/src/components/tip-follow.ts +52 -0
  628. package/src/components/tool-action-review.tsx +650 -0
  629. package/src/components/tool-review-history.tsx +88 -0
  630. package/src/components/tooltip.tsx +38 -5
  631. package/src/components/usage-limit-notice.tsx +179 -0
  632. package/src/components/usage-member-list.tsx +792 -0
  633. package/src/components/usage-meter.tsx +382 -0
  634. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  635. package/src/components/user-message-body.tsx +27 -2
  636. package/src/components/workspace-dock.tsx +18 -1
  637. package/src/composer-messages.ts +150 -0
  638. package/src/composer-voice-events.ts +12 -0
  639. package/src/composer.ts +6 -1
  640. package/src/connect-account-identity.tsx +34 -0
  641. package/src/connect-accounts.tsx +233 -0
  642. package/src/connect-chooser.tsx +336 -0
  643. package/src/connect-panel.tsx +99 -0
  644. package/src/connect-setup.tsx +355 -0
  645. package/src/connect.ts +60 -0
  646. package/src/connection-assets.d.ts +4 -0
  647. package/src/connection-catalog.tsx +162 -0
  648. package/src/connection-discovery.tsx +238 -0
  649. package/src/connection-installed.tsx +51 -0
  650. package/src/connection-logo.tsx +37 -0
  651. package/src/connection-service-logo.tsx +55 -0
  652. package/src/connection-service-presentation.ts +46 -0
  653. package/src/connection-skeleton.tsx +16 -0
  654. package/src/connection-type-picker.tsx +36 -0
  655. package/src/conversation-timeline.ts +92 -0
  656. package/src/desktop.ts +24 -0
  657. package/src/device-authorization.tsx +98 -0
  658. package/src/diffs.ts +16 -0
  659. package/src/discovery-cache.ts +42 -0
  660. package/src/editor.ts +13 -0
  661. package/src/hooks/internal.ts +3 -2
  662. package/src/hooks/latest-question.ts +164 -0
  663. package/src/hooks/shared-machines-list.ts +34 -1
  664. package/src/hooks/shared-query.ts +721 -0
  665. package/src/hooks/use-attached-browsers.ts +1 -1
  666. package/src/hooks/use-auth-runs.ts +0 -27
  667. package/src/hooks/use-available-models.ts +21 -15
  668. package/src/hooks/use-browser-frame-stream.ts +19 -2
  669. package/src/hooks/use-browser-session.ts +680 -205
  670. package/src/hooks/use-browser-sessions.ts +32 -1
  671. package/src/hooks/use-client-config-flags.ts +118 -0
  672. package/src/hooks/use-codex-accounts.ts +247 -47
  673. package/src/hooks/use-composer.ts +276 -47
  674. package/src/hooks/use-computer-frame-stream.ts +25 -7
  675. package/src/hooks/use-computer-input-posture.ts +94 -0
  676. package/src/hooks/use-computer-session.ts +409 -95
  677. package/src/hooks/use-connect.ts +23 -0
  678. package/src/hooks/use-desktop-stream.ts +19 -28
  679. package/src/hooks/use-file-attachments.ts +80 -4
  680. package/src/hooks/use-goal.ts +107 -13
  681. package/src/hooks/use-last-started-turn-policy.ts +46 -14
  682. package/src/hooks/use-machines.ts +4 -0
  683. package/src/hooks/use-new-conversation.ts +374 -0
  684. package/src/hooks/use-new-session-draft.ts +813 -0
  685. package/src/hooks/use-realtime-voice-models.ts +46 -0
  686. package/src/hooks/use-sandbox-files.ts +68 -20
  687. package/src/hooks/use-session-background-commands.ts +22 -11
  688. package/src/hooks/use-session-capabilities.ts +3 -2
  689. package/src/hooks/use-session-conversation.ts +150 -0
  690. package/src/hooks/use-session-events.ts +703 -382
  691. package/src/hooks/use-session-lineage.ts +20 -16
  692. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  693. package/src/hooks/use-session-model-account.ts +174 -0
  694. package/src/hooks/use-session.ts +53 -21
  695. package/src/hooks/use-slash-commands.ts +6 -11
  696. package/src/hooks/use-supergrok-accounts.ts +22 -8
  697. package/src/hooks/use-terminal-stream.ts +153 -27
  698. package/src/hooks/use-transcription.ts +6 -0
  699. package/src/hooks/use-turn-queue.ts +2 -1
  700. package/src/hooks/use-usage.ts +100 -0
  701. package/src/hooks/use-vaults.ts +153 -0
  702. package/src/hooks/use-video-artifact-playback.ts +1 -1
  703. package/src/hooks/use-voice-input.ts +127 -19
  704. package/src/hooks/use-workspace-capture.ts +3 -2
  705. package/src/hooks/use-workspace-edit.ts +23 -5
  706. package/src/hooks/use-workspace-sessions.ts +97 -32
  707. package/src/human-input-model.ts +359 -0
  708. package/src/identity-link-accounts.tsx +148 -0
  709. package/src/identity-link-consent.tsx +192 -0
  710. package/src/index.ts +262 -16
  711. package/src/interaction.ts +1 -0
  712. package/src/lib/clipboard.ts +29 -0
  713. package/src/lib/error-message.ts +37 -0
  714. package/src/lib/format.ts +213 -16
  715. package/src/lib/host-theme.ts +529 -0
  716. package/src/lib/interaction-errors.ts +15 -0
  717. package/src/lib/menu-styles.ts +44 -0
  718. package/src/lib/notify-observer.ts +15 -0
  719. package/src/lib/pierre-diffs-loader.ts +53 -0
  720. package/src/lib/provider-recovery.ts +243 -0
  721. package/src/lib/scrollbars.ts +30 -0
  722. package/src/lib/terminal-input-readiness.ts +51 -0
  723. package/src/lib/transient-retry.ts +99 -0
  724. package/src/lib/workbench-peers.ts +62 -0
  725. package/src/lib/xterm-theme.ts +23 -21
  726. package/src/mcp-connection-status.ts +35 -0
  727. package/src/model-mark-paths.ts +53 -0
  728. package/src/model-picker-model.ts +330 -0
  729. package/src/model-policy.ts +299 -74
  730. package/src/native-previews.ts +100 -0
  731. package/src/new-session-draft.ts +22 -0
  732. package/src/notification-text.ts +81 -0
  733. package/src/older-history.ts +22 -4
  734. package/src/organization-model.ts +118 -0
  735. package/src/plugin-details.tsx +185 -0
  736. package/src/plugin-discovery.tsx +196 -0
  737. package/src/preview-loading-paint.ts +68 -0
  738. package/src/provider.tsx +74 -15
  739. package/src/queue-presentation-model.ts +464 -0
  740. package/src/realtime/dropdown-menu.tsx +19 -12
  741. package/src/realtime/embedded-new-voice.tsx +1 -0
  742. package/src/realtime/embedded-voice.tsx +3 -0
  743. package/src/realtime/realtime-control.tsx +138 -501
  744. package/src/realtime/session-realtime.ts +566 -0
  745. package/src/sandbox-label-model.ts +53 -0
  746. package/src/scrollbars.ts +3 -0
  747. package/src/secret-reference-label.ts +43 -0
  748. package/src/secrets-ui.tsx +59 -0
  749. package/src/session-agents-model.ts +33 -0
  750. package/src/session-attention-model.ts +62 -0
  751. package/src/session-auth-recommendation.ts +48 -0
  752. package/src/session-capability-policy.ts +196 -0
  753. package/src/session-context.ts +3 -4
  754. package/src/session-feedback-model.ts +95 -0
  755. package/src/session-list-model.ts +434 -0
  756. package/src/session-realtime.ts +18 -0
  757. package/src/session-status-model.ts +99 -0
  758. package/src/session-ui.ts +98 -1
  759. package/src/session.ts +17 -1
  760. package/src/site-snapshot.ts +74 -0
  761. package/src/sites-ui.tsx +348 -0
  762. package/src/sites.ts +3 -0
  763. package/src/skill-discovery.tsx +208 -0
  764. package/src/terminal.ts +26 -0
  765. package/src/testing/session-scenarios.ts +404 -0
  766. package/src/timeline/activity-rail.tsx +242 -101
  767. package/src/timeline/agent-identity.tsx +84 -0
  768. package/src/timeline/agent-row.tsx +231 -0
  769. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  770. package/src/timeline/compaction-copy.ts +115 -0
  771. package/src/timeline/entrance.tsx +28 -3
  772. package/src/timeline/fleet-decision-projection.ts +2 -1
  773. package/src/timeline/fleet-decision-row.tsx +1 -0
  774. package/src/timeline/focus-sequence.ts +44 -0
  775. package/src/timeline/genie-copy.ts +19 -0
  776. package/src/timeline/genie-loading.tsx +143 -0
  777. package/src/timeline/index.ts +30 -2
  778. package/src/timeline/knowledge-receipt.tsx +100 -0
  779. package/src/timeline/message-sender.tsx +71 -0
  780. package/src/timeline/notice-presentation.ts +48 -0
  781. package/src/timeline/parsers.ts +42 -2
  782. package/src/timeline/patch-apply-command.tsx +135 -0
  783. package/src/timeline/platform-activity-presentation.ts +166 -0
  784. package/src/timeline/platform-activity-row.tsx +15 -90
  785. package/src/timeline/presented-image.ts +63 -0
  786. package/src/timeline/projection.ts +1746 -76
  787. package/src/timeline/provider-logo.tsx +53 -0
  788. package/src/timeline/question-nav-model.ts +28 -0
  789. package/src/timeline/registry.ts +26 -4
  790. package/src/timeline/retained-image.ts +97 -0
  791. package/src/timeline/retained-loaders.ts +91 -0
  792. package/src/timeline/rolling-activity.tsx +80 -0
  793. package/src/timeline/screenshot-lightbox.tsx +228 -5
  794. package/src/timeline/session-usage-limit-row.tsx +42 -0
  795. package/src/timeline/shared.tsx +42 -15
  796. package/src/timeline/startup-dispatch-details.tsx +36 -0
  797. package/src/timeline/startup-preference.ts +33 -0
  798. package/src/timeline/startup-timings.tsx +145 -0
  799. package/src/timeline/tool-display-name.ts +19 -7
  800. package/src/timeline/tool-presentation.ts +1316 -0
  801. package/src/timeline/tool-renderers.tsx +835 -1138
  802. package/src/timeline/turn-summary-model.ts +343 -0
  803. package/src/timeline/turn-summary.tsx +272 -365
  804. package/src/timeline/types.ts +189 -6
  805. package/src/timeline/work-presentation.ts +189 -0
  806. package/src/timeline-model.ts +143 -0
  807. package/src/usage/allowance-copy.ts +64 -0
  808. package/src/usage/session-usage-limit.ts +266 -0
  809. package/src/usage/summary.ts +93 -0
  810. package/src/usage.ts +70 -0
  811. package/src/voice-recording-owner.ts +22 -0
  812. package/styles/compiled.css +2319 -748
  813. package/styles/connect.css +290 -0
  814. package/styles/connect.d.ts +1 -0
  815. package/styles/effective-tokens.css +1 -0
  816. package/styles/index.css +309 -9
  817. package/styles/responsive.css +99 -7
  818. package/styles/session-capability.css +44 -0
  819. package/styles/tokens.css +134 -66
  820. package/dist/browser-viewer-AEFHUYZK.js +0 -14
  821. package/dist/chunk-4MDLEHXL.js.map +0 -1
  822. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  823. package/dist/chunk-D3UIAJKY.js.map +0 -1
  824. package/dist/chunk-ELIYWBZR.js.map +0 -1
  825. package/dist/chunk-H5YGYNXS.js.map +0 -1
  826. package/dist/chunk-HQVCKCLG.js +0 -9458
  827. package/dist/chunk-HQVCKCLG.js.map +0 -1
  828. package/dist/chunk-HUIKIDM5.js.map +0 -1
  829. package/dist/chunk-ICA6R6TW.js.map +0 -1
  830. package/dist/chunk-JVYQRRC4.js.map +0 -1
  831. package/dist/chunk-KCGXPP5V.js.map +0 -1
  832. package/dist/chunk-KZ73RL76.js.map +0 -1
  833. package/dist/chunk-LAKLF4PA.js +0 -141
  834. package/dist/chunk-LAKLF4PA.js.map +0 -1
  835. package/dist/chunk-MZ2G2XBA.js.map +0 -1
  836. package/dist/chunk-NEXLLTP4.js.map +0 -1
  837. package/dist/chunk-OAM4WAAM.js.map +0 -1
  838. package/dist/chunk-PEI6RANI.js.map +0 -1
  839. package/dist/chunk-RGALCTWO.js.map +0 -1
  840. package/dist/chunk-W6NFJXSA.js +0 -454
  841. package/dist/chunk-W6NFJXSA.js.map +0 -1
  842. package/dist/chunk-WSK7G5LE.js +0 -170
  843. package/dist/chunk-WSK7G5LE.js.map +0 -1
  844. package/dist/chunk-X4A66EWZ.js +0 -223
  845. package/dist/chunk-X4A66EWZ.js.map +0 -1
  846. package/dist/chunk-XXWH2JLC.js.map +0 -1
  847. package/dist/chunk-YFKJ7VZH.js +0 -268
  848. package/dist/chunk-YFKJ7VZH.js.map +0 -1
  849. package/dist/chunk-YJFGAFBD.js.map +0 -1
  850. package/dist/computer-viewer-FWEZISW4.js +0 -16
  851. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  852. package/dist/hooks/use-environments.d.ts +0 -41
  853. package/dist/hooks/use-packs.d.ts +0 -32
  854. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  855. package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
  856. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  857. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  858. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  859. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  860. package/src/hooks/use-environments.ts +0 -182
  861. package/src/hooks/use-packs.ts +0 -157
  862. /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
  863. /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
package/dist/usage.js ADDED
@@ -0,0 +1,1187 @@
1
+ "use client";
2
+ import {
3
+ DEFAULT_ALLOWANCE_LABELS,
4
+ DEFAULT_SESSION_USAGE_LIMIT_LABELS,
5
+ SESSION_USAGE_LIMIT_NEAR_FRACTION,
6
+ allowanceLabels,
7
+ allowanceResetSentence,
8
+ formatAllowanceDate,
9
+ formatAllowanceInstant,
10
+ sessionUsageLimitLabels,
11
+ sessionUsageLimitPercent,
12
+ summarizeSessionUsageLimit,
13
+ summarizeSessionUsageLimitRefusal
14
+ } from "./chunk-5WOR7UCL.js";
15
+ import {
16
+ usePolledValue
17
+ } from "./chunk-QHUE7E4N.js";
18
+ import "./chunk-CM7LVUKC.js";
19
+ import {
20
+ OpenGeniContext
21
+ } from "./chunk-G76LSA76.js";
22
+ import {
23
+ cn
24
+ } from "./chunk-TXS65BB2.js";
25
+
26
+ // src/hooks/use-usage.ts
27
+ import {
28
+ getMyUsage
29
+ } from "@opengeni/sdk/usage-allowances";
30
+ import { useCallback, useContext, useEffect, useMemo, useRef } from "react";
31
+
32
+ // src/usage/summary.ts
33
+ function reading(scope, usage) {
34
+ if (usage.limit === null) return null;
35
+ return {
36
+ scope,
37
+ fraction: usage.fraction ?? (usage.limit === 0 ? 1 : usage.used / usage.limit),
38
+ status: usage.status,
39
+ resetsAt: usage.resetsAt,
40
+ used: usage.used,
41
+ limit: usage.limit,
42
+ remaining: Math.max(0, usage.remaining ?? usage.limit - usage.used)
43
+ };
44
+ }
45
+ function summarizeUsage(usage, subjectId) {
46
+ const row = subjectId === void 0 ? usage.members[0] : usage.members.find((member2) => member2.subjectId === subjectId);
47
+ const member = row ? reading("member", row) : null;
48
+ const workspace = reading("workspace", usage.workspace);
49
+ const readings = [member, workspace].filter((value) => value !== null);
50
+ if (readings.length === 0) return { state: "unlimited", binding: null, member, workspace };
51
+ const exhausted = (workspace?.status === "exhausted" ? workspace : null) ?? (member?.status === "exhausted" ? member : null);
52
+ if (exhausted) return { state: "exhausted", binding: exhausted, member, workspace };
53
+ const warnings = readings.filter((value) => value.status === "warning");
54
+ const candidates = warnings.length > 0 ? warnings : readings;
55
+ const binding = candidates.reduce(
56
+ (tightest, value) => value.remaining < tightest.remaining ? value : tightest
57
+ );
58
+ return { state: warnings.length > 0 ? "warning" : "ok", binding, member, workspace };
59
+ }
60
+ function usagePercentLabel(fraction) {
61
+ if (!Number.isFinite(fraction) || fraction <= 0) return "0";
62
+ if (fraction < 0.01) return "<1";
63
+ if (fraction < 1 && Math.round(fraction * 100) === 100) return "99";
64
+ return String(Math.round(fraction * 100));
65
+ }
66
+
67
+ // src/hooks/use-usage.ts
68
+ function readOwnUsage(client, workspaceId, period, signal) {
69
+ const query = period === void 0 ? {} : { period };
70
+ const options = signal ? { signal } : {};
71
+ if ("getMyUsage" in client && typeof client.getMyUsage === "function") {
72
+ return client.getMyUsage(workspaceId, query, options);
73
+ }
74
+ if ("requestJson" in client && typeof client.requestJson === "function") {
75
+ return getMyUsage(client, workspaceId, query, options);
76
+ }
77
+ throw new Error("@opengeni/react: the usage client needs getMyUsage or requestJson.");
78
+ }
79
+ function useUsage(options = {}) {
80
+ const context = useContext(OpenGeniContext);
81
+ const client = options.client ?? context?.client;
82
+ const workspaceId = options.workspaceId ?? context?.workspaceId;
83
+ if (!client || !workspaceId) {
84
+ throw new Error(
85
+ "@opengeni/react: useUsage needs a client and workspace. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId }."
86
+ );
87
+ }
88
+ const period = options.period;
89
+ const load = useCallback(
90
+ (signal) => readOwnUsage(client, workspaceId, period, signal),
91
+ [client, workspaceId, period]
92
+ );
93
+ const state = usePolledValue(load, {
94
+ pollIntervalMs: options.pollIntervalMs,
95
+ enabled: options.enabled
96
+ });
97
+ const refreshKey = options.refreshKey;
98
+ const seenKey = useRef(refreshKey);
99
+ const refresh = state.refresh;
100
+ useEffect(() => {
101
+ if (Object.is(seenKey.current, refreshKey)) return;
102
+ seenKey.current = refreshKey;
103
+ void refresh();
104
+ }, [refreshKey, refresh]);
105
+ const usage = state.data;
106
+ const summary = useMemo(() => usage ? summarizeUsage(usage) : null, [usage]);
107
+ return { usage, summary, loading: state.loading, error: state.error, refresh };
108
+ }
109
+
110
+ // src/components/usage-meter.tsx
111
+ import { jsx, jsxs } from "react/jsx-runtime";
112
+ var DEFAULT_USAGE_METER_LABELS = {
113
+ ...allowanceLabels(),
114
+ title: "Your usage",
115
+ workspaceTitle: "Workspace usage",
116
+ left: (percent) => `${percent}% left`,
117
+ used: (percent) => `${percent}% used`,
118
+ limitReached: "Limit reached",
119
+ nearLimit: "Near limit",
120
+ amountLeft: (amount) => `${amount} left`,
121
+ unlimited: "No usage limit",
122
+ loading: "Checking usage\u2026",
123
+ error: "Couldn't load usage",
124
+ retry: "Try again",
125
+ amounts: (used, limit) => `${used} of ${limit} used`,
126
+ workspaceLine: (value) => `Workspace: ${value}`
127
+ };
128
+ function UsageMeter({
129
+ usage,
130
+ client,
131
+ workspaceId,
132
+ period,
133
+ refreshKey,
134
+ ...view
135
+ }) {
136
+ if (usage !== void 0) {
137
+ return /* @__PURE__ */ jsx(
138
+ UsageMeterView,
139
+ {
140
+ ...view,
141
+ summary: usage ? summarizeUsage(usage) : null,
142
+ loading: usage === null
143
+ }
144
+ );
145
+ }
146
+ return /* @__PURE__ */ jsx(
147
+ LoadingUsageMeter,
148
+ {
149
+ ...view,
150
+ client,
151
+ workspaceId,
152
+ period,
153
+ refreshKey
154
+ }
155
+ );
156
+ }
157
+ function LoadingUsageMeter({
158
+ client,
159
+ workspaceId,
160
+ period,
161
+ refreshKey,
162
+ ...view
163
+ }) {
164
+ const state = useUsage({ client, workspaceId, period, refreshKey });
165
+ return /* @__PURE__ */ jsx(
166
+ UsageMeterView,
167
+ {
168
+ ...view,
169
+ summary: state.summary,
170
+ loading: state.loading && !state.summary,
171
+ error: state.summary ? null : state.error,
172
+ onRetry: () => void state.refresh()
173
+ }
174
+ );
175
+ }
176
+ var FILL = {
177
+ ok: "bg-og-accent",
178
+ warning: "bg-og-status-waiting",
179
+ exhausted: "bg-og-danger"
180
+ };
181
+ function valueText(reading2, measure, labels) {
182
+ if (reading2.status === "exhausted") return labels.limitReached;
183
+ return measure === "left" ? labels.left(usagePercentLabel(Math.max(0, 1 - reading2.fraction))) : labels.used(usagePercentLabel(reading2.fraction));
184
+ }
185
+ function UsageMeterView({
186
+ summary,
187
+ loading = false,
188
+ error = null,
189
+ onRetry,
190
+ measure = "left",
191
+ formatAmount,
192
+ labels: overrides,
193
+ density = "default",
194
+ showWorkspace = true,
195
+ className
196
+ }) {
197
+ const labels = { ...DEFAULT_USAGE_METER_LABELS, ...overrides };
198
+ const compact = density === "compact";
199
+ if (loading || error || !summary) {
200
+ return /* @__PURE__ */ jsx(
201
+ "div",
202
+ {
203
+ className: cn("og-root min-w-0 text-og-sm", className),
204
+ "data-og-usage-meter": error ? "error" : "loading",
205
+ "aria-busy": loading || void 0,
206
+ children: error ? /* @__PURE__ */ jsxs("p", { className: "flex flex-wrap items-center gap-x-2 text-og-fg-muted", role: "alert", children: [
207
+ labels.error,
208
+ onRetry ? /* @__PURE__ */ jsx(
209
+ "button",
210
+ {
211
+ type: "button",
212
+ onClick: onRetry,
213
+ className: "rounded-og-sm og-link focus-visible:outline-2 focus-visible:outline-og-accent",
214
+ children: labels.retry
215
+ }
216
+ ) : null
217
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-og-fg-subtle", children: labels.loading })
218
+ }
219
+ );
220
+ }
221
+ const primary = summary.member ?? summary.workspace;
222
+ if (!primary) {
223
+ return /* @__PURE__ */ jsxs(
224
+ "div",
225
+ {
226
+ className: cn("og-root min-w-0 text-og-sm text-og-fg-muted", className),
227
+ "data-og-usage-meter": "unlimited",
228
+ children: [
229
+ compact ? null : /* @__PURE__ */ jsxs("span", { className: "font-medium text-og-fg", children: [
230
+ labels.title,
231
+ " \xB7 "
232
+ ] }),
233
+ labels.unlimited
234
+ ]
235
+ }
236
+ );
237
+ }
238
+ const title = summary.member ? labels.title : labels.workspaceTitle;
239
+ const value = valueText(primary, measure, labels);
240
+ const fill = Math.min(1, Math.max(0, primary.fraction));
241
+ const reset = allowanceResetSentence(labels, primary.resetsAt);
242
+ const pool = showWorkspace && summary.member && summary.workspace && (summary.binding?.scope === "workspace" || summary.workspace.status !== "ok") ? summary.workspace : null;
243
+ const meterProps = {
244
+ role: "meter",
245
+ "aria-label": title || labels.title,
246
+ "aria-valuemin": 0,
247
+ "aria-valuemax": 100,
248
+ "aria-valuenow": Math.round(fill * 100),
249
+ "aria-valuetext": `${value}. ${reset}${pool ? ` ${labels.workspaceLine(valueText(pool, measure, labels))}.` : ""}`
250
+ };
251
+ const bar = /* @__PURE__ */ jsx(
252
+ "span",
253
+ {
254
+ "aria-hidden": true,
255
+ className: cn(
256
+ "relative block overflow-hidden rounded-full",
257
+ density === "hero" ? "h-1.5" : "h-1",
258
+ primary.status === "exhausted" ? "bg-og-danger/15" : "bg-og-surface-3",
259
+ compact ? "w-16 shrink-0" : "w-full"
260
+ ),
261
+ children: /* @__PURE__ */ jsx(
262
+ "span",
263
+ {
264
+ className: cn("absolute inset-y-0 left-0 rounded-full", FILL[primary.status]),
265
+ style: { width: `${Math.round(fill * 1e3) / 10}%` }
266
+ }
267
+ )
268
+ }
269
+ );
270
+ const valueClass = cn(
271
+ "shrink-0 whitespace-nowrap tabular-nums",
272
+ primary.status === "ok" ? "text-og-fg-muted" : "font-medium",
273
+ primary.status === "warning" && "text-og-status-waiting",
274
+ primary.status === "exhausted" && "text-og-danger"
275
+ );
276
+ if (compact) {
277
+ return /* @__PURE__ */ jsxs(
278
+ "span",
279
+ {
280
+ ...meterProps,
281
+ "data-og-usage-meter": primary.status,
282
+ title: primary.resetsAt ? `${reset} ${formatAllowanceInstant(primary.resetsAt)}` : reset,
283
+ className: cn("og-root inline-flex min-w-0 items-center gap-2 text-og-xs", className),
284
+ children: [
285
+ /* @__PURE__ */ jsx("span", { className: valueClass, children: value }),
286
+ bar
287
+ ]
288
+ }
289
+ );
290
+ }
291
+ const amounts = formatAmount ? labels.amounts(formatAmount(primary.used), formatAmount(primary.limit)) : null;
292
+ if (density === "hero") {
293
+ const headline = formatAmount ? labels.amountLeft(formatAmount(primary.remaining)) : labels.left(usagePercentLabel(Math.max(0, 1 - primary.fraction)));
294
+ return /* @__PURE__ */ jsxs(
295
+ "div",
296
+ {
297
+ ...meterProps,
298
+ "data-og-usage-meter": primary.status,
299
+ className: cn("og-root flex min-w-0 flex-col gap-3", className),
300
+ children: [
301
+ title ? /* @__PURE__ */ jsx("span", { className: "text-og-sm font-medium text-og-fg-muted", children: title }) : null,
302
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1", children: [
303
+ /* @__PURE__ */ jsx("span", { className: "text-2xl leading-8 font-semibold tracking-[-0.5px] text-og-fg tabular-nums", children: headline }),
304
+ primary.status !== "ok" ? /* @__PURE__ */ jsxs(
305
+ "span",
306
+ {
307
+ className: cn(
308
+ "inline-flex h-[22px] items-center gap-1.5 rounded-full border px-2 text-og-xs font-medium",
309
+ primary.status === "warning" ? "border-og-status-waiting/30 text-og-status-waiting" : "border-og-danger/30 text-og-danger"
310
+ ),
311
+ children: [
312
+ /* @__PURE__ */ jsx(
313
+ "span",
314
+ {
315
+ "aria-hidden": true,
316
+ className: cn(
317
+ "size-1.5 rounded-full",
318
+ primary.status === "warning" ? "bg-og-status-waiting" : "bg-og-danger"
319
+ )
320
+ }
321
+ ),
322
+ primary.status === "warning" ? labels.nearLimit : labels.limitReached
323
+ ]
324
+ }
325
+ ) : null
326
+ ] }),
327
+ bar,
328
+ /* @__PURE__ */ jsxs("p", { className: "text-og-xs text-og-fg-muted tabular-nums", children: [
329
+ [
330
+ amounts ?? labels.used(usagePercentLabel(primary.fraction)),
331
+ amounts ? `${usagePercentLabel(primary.fraction)}%` : null
332
+ ].filter(Boolean).join(" \xB7 "),
333
+ " ",
334
+ "\xB7",
335
+ " ",
336
+ /* @__PURE__ */ jsx("span", { title: primary.resetsAt ? formatAllowanceInstant(primary.resetsAt) : void 0, children: reset })
337
+ ] }),
338
+ pool ? /* @__PURE__ */ jsx(PoolLine, { reading: pool, measure, labels }) : null
339
+ ]
340
+ }
341
+ );
342
+ }
343
+ return /* @__PURE__ */ jsxs(
344
+ "div",
345
+ {
346
+ ...meterProps,
347
+ "data-og-usage-meter": primary.status,
348
+ className: cn("og-root flex min-w-0 flex-col gap-2 text-og-sm", className),
349
+ children: [
350
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-baseline justify-between gap-3", children: [
351
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate font-medium text-og-fg", children: title }),
352
+ /* @__PURE__ */ jsx("span", { className: valueClass, children: value })
353
+ ] }),
354
+ bar,
355
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-baseline justify-between gap-x-3 gap-y-1 text-og-xs text-og-fg-subtle", children: [
356
+ /* @__PURE__ */ jsx("span", { title: primary.resetsAt ? formatAllowanceInstant(primary.resetsAt) : void 0, children: reset }),
357
+ amounts ? /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: amounts }) : null
358
+ ] }),
359
+ pool ? /* @__PURE__ */ jsx(PoolLine, { reading: pool, measure, labels }) : null
360
+ ]
361
+ }
362
+ );
363
+ }
364
+ function PoolLine({
365
+ reading: reading2,
366
+ measure,
367
+ labels
368
+ }) {
369
+ return /* @__PURE__ */ jsx(
370
+ "p",
371
+ {
372
+ className: cn(
373
+ "text-og-xs",
374
+ reading2.status === "exhausted" ? "font-medium text-og-danger" : reading2.status === "warning" ? "text-og-status-waiting" : "text-og-fg-muted"
375
+ ),
376
+ children: labels.workspaceLine(valueText(reading2, measure, labels))
377
+ }
378
+ );
379
+ }
380
+
381
+ // src/components/usage-limit-notice.tsx
382
+ import { GaugeIcon, XIcon } from "lucide-react";
383
+ import { useEffect as useEffect2, useState } from "react";
384
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
385
+ var DEFAULT_USAGE_LIMIT_NOTICE_LABELS = {
386
+ ...allowanceLabels(),
387
+ memberWarning: (percent) => `You've used ${percent}% of your usage limit.`,
388
+ workspaceWarning: (percent) => `This workspace has used ${percent}% of its usage budget.`,
389
+ memberExhausted: "You've reached your usage limit.",
390
+ workspaceExhausted: "This workspace has reached its usage limit.",
391
+ dismiss: "Dismiss"
392
+ };
393
+ function UsageLimitNotice({
394
+ usage,
395
+ client,
396
+ workspaceId,
397
+ period,
398
+ refreshKey,
399
+ ...view
400
+ }) {
401
+ if (usage !== void 0) {
402
+ return /* @__PURE__ */ jsx2(UsageLimitNoticeView, { ...view, summary: usage ? summarizeUsage(usage) : null });
403
+ }
404
+ return /* @__PURE__ */ jsx2(
405
+ LoadingNotice,
406
+ {
407
+ ...view,
408
+ client,
409
+ workspaceId,
410
+ period,
411
+ refreshKey
412
+ }
413
+ );
414
+ }
415
+ function LoadingNotice({
416
+ client,
417
+ workspaceId,
418
+ period,
419
+ refreshKey,
420
+ ...view
421
+ }) {
422
+ const { summary } = useUsage({ client, workspaceId, period, refreshKey });
423
+ return /* @__PURE__ */ jsx2(UsageLimitNoticeView, { ...view, summary });
424
+ }
425
+ function readDismissed(key) {
426
+ if (!key || typeof sessionStorage === "undefined") return false;
427
+ try {
428
+ return sessionStorage.getItem(key) === "1";
429
+ } catch {
430
+ return false;
431
+ }
432
+ }
433
+ function UsageLimitNoticeView({
434
+ summary,
435
+ labels: overrides,
436
+ action,
437
+ dismissStorageKey,
438
+ className
439
+ }) {
440
+ const labels = { ...DEFAULT_USAGE_LIMIT_NOTICE_LABELS, ...overrides };
441
+ const binding = summary?.binding ?? null;
442
+ const state = summary?.state;
443
+ const key = dismissStorageKey && binding && state === "warning" ? `${dismissStorageKey}:warning:${binding.scope}:${binding.resetsAt ?? "none"}` : null;
444
+ const [dismissed, setDismissed] = useState(() => readDismissed(key));
445
+ useEffect2(() => setDismissed(readDismissed(key)), [key]);
446
+ if (!summary || !binding || state !== "warning" && state !== "exhausted") return null;
447
+ if (state === "warning" && dismissed) return null;
448
+ const workspace = binding.scope === "workspace";
449
+ const exhausted = state === "exhausted";
450
+ const headline = exhausted ? workspace ? labels.workspaceExhausted : labels.memberExhausted : workspace ? labels.workspaceWarning(usagePercentLabel(binding.fraction)) : labels.memberWarning(usagePercentLabel(binding.fraction));
451
+ const reset = allowanceResetSentence(labels, binding.resetsAt);
452
+ const dismiss = () => {
453
+ setDismissed(true);
454
+ if (!key) return;
455
+ try {
456
+ sessionStorage.setItem(key, "1");
457
+ } catch {
458
+ }
459
+ };
460
+ return /* @__PURE__ */ jsxs2(
461
+ "div",
462
+ {
463
+ role: "status",
464
+ "data-og-usage-notice": exhausted ? "exhausted" : "warning",
465
+ "data-og-usage-scope": binding.scope,
466
+ className: cn(
467
+ "og-root flex min-w-0 items-start gap-2 px-3.5 pt-2.5 text-og-sm md:px-4",
468
+ className
469
+ ),
470
+ children: [
471
+ /* @__PURE__ */ jsx2(GaugeIcon, { "aria-hidden": true, className: "mt-0.5 size-3.5 shrink-0 text-og-status-waiting" }),
472
+ /* @__PURE__ */ jsxs2("p", { className: "min-w-0 flex-1 text-og-fg-muted", children: [
473
+ /* @__PURE__ */ jsx2("span", { className: cn(exhausted && "font-medium text-og-fg"), children: headline }),
474
+ " ",
475
+ exhausted ? /* @__PURE__ */ jsxs2(Fragment, { children: [
476
+ workspace ? labels.workspaceRemedy : labels.memberRemedy,
477
+ " "
478
+ ] }) : null,
479
+ /* @__PURE__ */ jsx2(
480
+ "span",
481
+ {
482
+ className: "whitespace-nowrap",
483
+ title: binding.resetsAt ? formatAllowanceInstant(binding.resetsAt) : void 0,
484
+ children: reset
485
+ }
486
+ )
487
+ ] }),
488
+ action ? /* @__PURE__ */ jsx2("div", { className: "shrink-0", children: action(summary) }) : null,
489
+ !exhausted ? /* @__PURE__ */ jsx2(
490
+ "button",
491
+ {
492
+ type: "button",
493
+ "aria-label": labels.dismiss,
494
+ onClick: dismiss,
495
+ className: "-mt-0.5 -mr-1 grid size-6 shrink-0 place-items-center rounded-og-sm text-og-fg-subtle transition hover:bg-og-surface-2 hover:text-og-fg focus-visible:outline-2 focus-visible:outline-og-accent pointer-coarse:size-9",
496
+ children: /* @__PURE__ */ jsx2(XIcon, { "aria-hidden": true, className: "size-3.5" })
497
+ }
498
+ ) : null
499
+ ]
500
+ }
501
+ );
502
+ }
503
+
504
+ // src/components/usage-member-list.tsx
505
+ import { Slider } from "radix-ui";
506
+ import { useId, useMemo as useMemo2, useState as useState2 } from "react";
507
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
508
+ var DEFAULT_USAGE_MEMBER_LIST_LABELS = {
509
+ listLabel: "Member usage",
510
+ used: (percent) => `${percent}% used`,
511
+ noLimitUsed: "No individual limit",
512
+ amounts: (used, limit) => `${used} of ${limit}`,
513
+ nearLimit: "Near limit",
514
+ limitReached: "Limit reached",
515
+ limit: "Limit",
516
+ defaultEqualShare: (percent) => `Equal share \xB7 ${percent}%`,
517
+ defaultNone: "No individual limit",
518
+ defaultShare: (percent) => `Default \xB7 ${percent}%`,
519
+ defaultAmount: (amount) => `Default \xB7 ${amount}`,
520
+ share: (percent) => `${percent}% of budget`,
521
+ amount: (amount) => `${amount} fixed`,
522
+ fixedAmountHidden: "Fixed amount",
523
+ edit: (name) => `Change limit for ${name}`,
524
+ editorTitle: (name) => `Limit for ${name}`,
525
+ optionDefault: "Default",
526
+ optionShare: "Share of budget",
527
+ optionAmount: "Fixed amount",
528
+ fixedAmountHint: "Each period. Doesn't grow when the budget does.",
529
+ shareSlider: "Share of the workspace budget",
530
+ shareInput: "Share, percent",
531
+ amountInput: "Fixed amount",
532
+ equalShareMultiple: (multiple) => `${multiple}\xD7 an equal share`,
533
+ sameAsEqualShare: "About an equal share",
534
+ atBudget: (amount) => `About ${amount} at the current budget`,
535
+ save: "Save",
536
+ saving: "Saving\u2026",
537
+ cancel: "Cancel",
538
+ saveFailed: "Couldn't save the limit. Refresh and try again.",
539
+ invalidAmount: "Enter an amount of zero or more.",
540
+ totalWithin: (percent) => `Member limits add up to ${percent}% of the budget.`,
541
+ totalOver: (percent) => `Member limits add up to ${percent}% of the budget.`,
542
+ oversubscribedHelp: "That's allowed: limits are ceilings, not reservations. The workspace budget still caps what everyone spends together.",
543
+ unlimitedMembers: (count) => count === 1 ? "1 member has no individual limit." : `${count} members have no individual limit.`,
544
+ empty: "No members yet."
545
+ };
546
+ var STATUS_RANK = { exhausted: 0, warning: 1, ok: 2 };
547
+ function shareBase(usage) {
548
+ return usage.workspace.includedCredits + usage.workspace.grantsRemaining;
549
+ }
550
+ function formatPercent(value) {
551
+ const scaled = value * 100;
552
+ return Number.isInteger(Math.round(scaled * 10) / 10) || scaled >= 10 ? String(Math.round(scaled)) : (Math.round(scaled * 10) / 10).toFixed(1);
553
+ }
554
+ function formatMultiple(value) {
555
+ return value >= 10 ? String(Math.round(value)) : (Math.round(value * 10) / 10).toString();
556
+ }
557
+ function describeMemberLimit(member, context) {
558
+ const labels = { ...DEFAULT_USAGE_MEMBER_LIST_LABELS, ...context.labels };
559
+ const ofBudget = (limit) => limit !== null && context.shareBase > 0 ? formatPercent(limit / context.shareBase) : "0";
560
+ const rule = member.rule;
561
+ if (rule && "share" in rule) return labels.share(formatPercent(rule.share));
562
+ if (rule && "credits" in rule) {
563
+ return context.amounts ? labels.amount(context.amounts.format(rule.credits)) : labels.fixedAmountHidden;
564
+ }
565
+ const fallback = context.memberDefault ?? "none";
566
+ if (fallback === "none" || member.limit === null) return labels.defaultNone;
567
+ if (fallback === "equal_share") return labels.defaultEqualShare(ofBudget(member.limit));
568
+ if ("share" in fallback) return labels.defaultShare(formatPercent(fallback.share));
569
+ return context.amounts ? labels.defaultAmount(context.amounts.format(fallback.credits)) : labels.defaultShare(ofBudget(member.limit));
570
+ }
571
+ function UsageMemberList({
572
+ usage,
573
+ memberDefault,
574
+ describe,
575
+ onChangeRule,
576
+ amounts,
577
+ labels: overrides,
578
+ framed = true,
579
+ className
580
+ }) {
581
+ const labels = { ...DEFAULT_USAGE_MEMBER_LIST_LABELS, ...overrides };
582
+ const base = shareBase(usage);
583
+ const [editing, setEditing] = useState2(null);
584
+ const name = (member) => describe?.(member) ?? {
585
+ name: member.externalIdentity?.externalId ?? member.subjectId,
586
+ detail: null
587
+ };
588
+ const members = useMemo2(
589
+ () => [...usage.members].sort(
590
+ (left, right) => STATUS_RANK[left.status] - STATUS_RANK[right.status] || right.used - left.used
591
+ ),
592
+ [usage.members]
593
+ );
594
+ if (members.length === 0) {
595
+ return /* @__PURE__ */ jsx3("p", { className: cn("og-root text-og-sm text-og-fg-muted", className), children: labels.empty });
596
+ }
597
+ return /* @__PURE__ */ jsxs3("div", { className: cn("og-root flex min-w-0 flex-col gap-3", className), children: [
598
+ /* @__PURE__ */ jsx3(AllocationSummary, { usage, base, labels, framed }),
599
+ /* @__PURE__ */ jsx3(
600
+ "ul",
601
+ {
602
+ "aria-label": labels.listLabel,
603
+ className: cn(
604
+ "divide-y divide-og-border",
605
+ framed && "overflow-hidden rounded-og-md border border-og-border"
606
+ ),
607
+ children: members.map((member) => /* @__PURE__ */ jsx3(
608
+ MemberRow,
609
+ {
610
+ member,
611
+ identity: name(member),
612
+ usage,
613
+ base,
614
+ memberDefault,
615
+ amounts,
616
+ labels,
617
+ framed,
618
+ editing: editing === member.subjectId,
619
+ onEdit: onChangeRule ? () => setEditing(
620
+ (current) => current === member.subjectId ? null : member.subjectId
621
+ ) : void 0,
622
+ onClose: () => setEditing(null),
623
+ onSave: onChangeRule ? async (rule) => {
624
+ await onChangeRule(member, rule);
625
+ setEditing(null);
626
+ } : void 0
627
+ },
628
+ member.subjectId
629
+ ))
630
+ }
631
+ )
632
+ ] });
633
+ }
634
+ function memberShares(usage, base) {
635
+ let total = 0;
636
+ let unlimited = 0;
637
+ for (const member of usage.members) {
638
+ if (member.limit === null) unlimited += 1;
639
+ else total += base > 0 ? member.limit / base : 0;
640
+ }
641
+ return { total, unlimited };
642
+ }
643
+ function AllocationSummary({
644
+ usage,
645
+ base,
646
+ labels,
647
+ framed
648
+ }) {
649
+ if (base <= 0) return null;
650
+ const { total, unlimited } = memberShares(usage, base);
651
+ const limited = usage.members.length - unlimited;
652
+ const over = total > 1.005;
653
+ const shaped = usage.members.some((member) => member.rule !== null);
654
+ if (limited === 0 || !over && !shaped && unlimited === 0) return null;
655
+ return /* @__PURE__ */ jsxs3(
656
+ "div",
657
+ {
658
+ "data-og-usage-allocation": over ? "oversubscribed" : "within",
659
+ className: cn(
660
+ "flex min-w-0 flex-col gap-1 text-og-sm",
661
+ framed || over ? "rounded-og-md px-3 py-2" : "pt-1",
662
+ over ? "bg-og-status-waiting/8 text-og-fg" : framed ? "bg-og-surface-1 text-og-fg-muted" : "text-og-fg-muted"
663
+ ),
664
+ children: [
665
+ limited > 0 ? /* @__PURE__ */ jsx3(AllocationBar, { total, over, children: over ? labels.totalOver(formatPercent(total)) : labels.totalWithin(formatPercent(total)) }) : null,
666
+ over ? /* @__PURE__ */ jsx3("p", { className: "text-og-xs text-og-fg-muted", children: labels.oversubscribedHelp }) : null,
667
+ unlimited > 0 ? /* @__PURE__ */ jsx3("p", { className: "text-og-xs text-og-fg-muted", children: labels.unlimitedMembers(unlimited) }) : null
668
+ ]
669
+ }
670
+ );
671
+ }
672
+ function AllocationBar({
673
+ total,
674
+ over,
675
+ children
676
+ }) {
677
+ const scale = Math.max(1, total);
678
+ return /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-col gap-1.5", children: [
679
+ /* @__PURE__ */ jsx3("p", { className: cn(over && "font-medium"), children }),
680
+ /* @__PURE__ */ jsxs3("span", { "aria-hidden": true, className: "relative block h-1 overflow-hidden rounded-full bg-og-surface-3", children: [
681
+ /* @__PURE__ */ jsx3(
682
+ "span",
683
+ {
684
+ className: "absolute inset-y-0 left-0 bg-og-accent/70",
685
+ style: { width: `${Math.min(total, 1) / scale * 100}%` }
686
+ }
687
+ ),
688
+ over ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
689
+ /* @__PURE__ */ jsx3(
690
+ "span",
691
+ {
692
+ className: "absolute inset-y-0 bg-og-status-waiting",
693
+ style: { left: `${1 / scale * 100}%`, right: 0 }
694
+ }
695
+ ),
696
+ /* @__PURE__ */ jsx3(
697
+ "span",
698
+ {
699
+ className: "absolute inset-y-[-2px] w-px bg-og-fg",
700
+ style: { left: `${1 / scale * 100}%` }
701
+ }
702
+ )
703
+ ] }) : null
704
+ ] })
705
+ ] });
706
+ }
707
+ function MemberRow({
708
+ member,
709
+ identity,
710
+ usage,
711
+ base,
712
+ memberDefault,
713
+ amounts,
714
+ labels,
715
+ framed,
716
+ editing,
717
+ onEdit,
718
+ onClose,
719
+ onSave
720
+ }) {
721
+ const editorId = useId();
722
+ const limited = member.limit !== null;
723
+ const fraction = member.fraction ?? 0;
724
+ const limitText = describeMemberLimit(member, {
725
+ memberDefault,
726
+ shareBase: base,
727
+ amounts,
728
+ labels
729
+ });
730
+ return /* @__PURE__ */ jsxs3("li", { className: cn("min-w-0", framed && "bg-og-bg"), "data-og-usage-member": member.subjectId, children: [
731
+ /* @__PURE__ */ jsxs3(
732
+ "div",
733
+ {
734
+ className: cn(
735
+ "grid min-w-0 grid-cols-1 gap-x-4 gap-y-2 py-3 sm:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)_11rem] sm:items-center",
736
+ framed && "px-3.5"
737
+ ),
738
+ children: [
739
+ /* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
740
+ /* @__PURE__ */ jsx3("p", { className: "truncate text-og-sm font-medium text-og-fg", children: identity.name }),
741
+ identity.detail ? /* @__PURE__ */ jsx3("p", { className: "truncate text-og-xs text-og-fg-subtle", children: identity.detail }) : null
742
+ ] }),
743
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-col gap-1", children: [
744
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 items-baseline justify-between gap-2 text-og-xs", children: [
745
+ /* @__PURE__ */ jsx3(
746
+ "span",
747
+ {
748
+ className: cn(
749
+ "tabular-nums",
750
+ member.status === "ok" && "text-og-fg-muted",
751
+ member.status === "warning" && "font-medium text-og-status-waiting",
752
+ member.status === "exhausted" && "font-medium text-og-danger"
753
+ ),
754
+ children: limited ? member.status === "exhausted" ? labels.limitReached : `${labels.used(usagePercentLabel(fraction))}${member.status === "warning" ? ` \xB7 ${labels.nearLimit}` : ""}` : labels.noLimitUsed
755
+ }
756
+ ),
757
+ amounts ? /* @__PURE__ */ jsx3("span", { className: "truncate text-og-fg-subtle tabular-nums", children: limited ? labels.amounts(amounts.format(member.used), amounts.format(member.limit)) : amounts.format(member.used) }) : null
758
+ ] }),
759
+ /* @__PURE__ */ jsx3(
760
+ "span",
761
+ {
762
+ "aria-hidden": true,
763
+ className: cn(
764
+ "relative block h-1 overflow-hidden rounded-full",
765
+ limited ? "bg-og-surface-3" : "bg-transparent"
766
+ ),
767
+ children: limited ? /* @__PURE__ */ jsx3(
768
+ "span",
769
+ {
770
+ className: cn(
771
+ "absolute inset-y-0 left-0 rounded-full",
772
+ member.status === "ok" ? "bg-og-accent" : member.status === "warning" ? "bg-og-status-waiting" : "bg-og-danger"
773
+ ),
774
+ style: { width: `${Math.min(1, Math.max(0, fraction)) * 100}%` }
775
+ }
776
+ ) : null
777
+ }
778
+ )
779
+ ] }),
780
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 items-center justify-between gap-2 sm:justify-end", children: [
781
+ /* @__PURE__ */ jsx3("span", { className: "text-og-xs text-og-fg-subtle sm:hidden", children: labels.limit }),
782
+ onEdit ? /* @__PURE__ */ jsx3(
783
+ "button",
784
+ {
785
+ type: "button",
786
+ onClick: onEdit,
787
+ "aria-expanded": editing,
788
+ "aria-controls": editing ? editorId : void 0,
789
+ "aria-label": `${labels.edit(identity.name)}: ${limitText}`,
790
+ className: "inline-flex h-8 max-w-full items-center gap-1.5 truncate rounded-og-sm border border-og-border px-2.5 text-og-control text-og-fg transition hover:bg-og-surface-2 focus-visible:outline-2 focus-visible:outline-og-accent pointer-coarse:h-10",
791
+ children: limitText
792
+ }
793
+ ) : /* @__PURE__ */ jsx3("span", { className: "truncate text-og-xs text-og-fg-muted", children: limitText })
794
+ ] })
795
+ ]
796
+ }
797
+ ),
798
+ editing && onSave ? /* @__PURE__ */ jsx3(
799
+ MemberLimitEditor,
800
+ {
801
+ id: editorId,
802
+ member,
803
+ name: identity.name,
804
+ usage,
805
+ base,
806
+ memberDefault,
807
+ amounts,
808
+ labels,
809
+ framed,
810
+ onCancel: onClose,
811
+ onSave
812
+ }
813
+ ) : null
814
+ ] });
815
+ }
816
+ function initialMode(rule, amounts) {
817
+ if (rule === null) return "share";
818
+ if ("share" in rule) return "share";
819
+ return amounts ? "amount" : "share";
820
+ }
821
+ function MemberLimitEditor({
822
+ id,
823
+ member,
824
+ name,
825
+ usage,
826
+ base,
827
+ memberDefault,
828
+ amounts,
829
+ labels,
830
+ framed,
831
+ onCancel,
832
+ onSave
833
+ }) {
834
+ const count = Math.max(1, usage.members.length);
835
+ const equal = 1 / count;
836
+ const currentShare = member.rule && "share" in member.rule ? member.rule.share : member.limit !== null && base > 0 ? member.limit / base : equal;
837
+ const startPercent = Math.min(100, Math.max(0, Math.round(currentShare * 100)));
838
+ const startAmount = amounts && member.rule && "credits" in member.rule ? stripPrefix(amounts.format(member.rule.credits), amounts.prefix) : amounts && member.limit !== null ? stripPrefix(amounts.format(member.limit), amounts.prefix) : "";
839
+ const [mode, setMode] = useState2(() => initialMode(member.rule, amounts));
840
+ const [sharePercent, setSharePercent] = useState2(startPercent);
841
+ const [amountText, setAmountText] = useState2(startAmount);
842
+ const [saving, setSaving] = useState2(false);
843
+ const [error, setError] = useState2(null);
844
+ const share = sharePercent / 100;
845
+ const parsedAmount = amounts && mode === "amount" ? amounts.parse(amountText) : null;
846
+ const defaultLimitText = describeMemberLimit(
847
+ {
848
+ rule: null,
849
+ limit: member.rule === null ? member.limit : defaultLimitFor(memberDefault, base, count)
850
+ },
851
+ { memberDefault, shareBase: base, amounts, labels }
852
+ );
853
+ const unchanged = mode === "default" ? member.rule === null : mode === "share" ? (member.rule === null || "share" in member.rule) && sharePercent === startPercent : member.rule !== null && "credits" in member.rule && amountText === startAmount;
854
+ const draftLimit = mode === "share" ? share * base : mode === "amount" ? parsedAmount : defaultLimitFor(memberDefault, base, count);
855
+ const others = usage.members.reduce(
856
+ (sum, other) => other.subjectId === member.subjectId || other.limit === null ? sum : sum + other.limit,
857
+ 0
858
+ );
859
+ const draftTotal = base > 0 && draftLimit !== null ? (others + draftLimit) / base : null;
860
+ async function save() {
861
+ let rule;
862
+ if (mode === "default") rule = null;
863
+ else if (mode === "share") rule = { share };
864
+ else {
865
+ if (parsedAmount === null || !Number.isSafeInteger(parsedAmount) || parsedAmount < 0) {
866
+ setError(labels.invalidAmount);
867
+ return;
868
+ }
869
+ rule = { credits: parsedAmount };
870
+ }
871
+ setSaving(true);
872
+ setError(null);
873
+ try {
874
+ await onSave(rule);
875
+ } catch (cause) {
876
+ setError(cause instanceof Error && cause.message ? cause.message : labels.saveFailed);
877
+ setSaving(false);
878
+ }
879
+ }
880
+ const modes = [
881
+ { value: "share", label: labels.optionShare },
882
+ ...amounts ? [{ value: "amount", label: labels.optionAmount }] : [],
883
+ { value: "default", label: labels.optionDefault }
884
+ ];
885
+ return /* @__PURE__ */ jsxs3(
886
+ "div",
887
+ {
888
+ id,
889
+ role: "group",
890
+ "aria-label": labels.editorTitle(name),
891
+ className: cn(
892
+ "bg-og-surface-1 px-3.5 py-3",
893
+ framed ? "border-t border-og-border" : "mb-3 rounded-og-md"
894
+ ),
895
+ onKeyDown: (event) => {
896
+ if (event.key === "Escape" && !saving) {
897
+ event.stopPropagation();
898
+ onCancel();
899
+ }
900
+ },
901
+ children: [
902
+ /* @__PURE__ */ jsxs3("fieldset", { className: "flex min-w-0 flex-col gap-3", disabled: saving, children: [
903
+ /* @__PURE__ */ jsx3("legend", { className: "sr-only", children: labels.editorTitle(name) }),
904
+ /* @__PURE__ */ jsx3(
905
+ "div",
906
+ {
907
+ role: "radiogroup",
908
+ "aria-label": labels.limit,
909
+ className: "inline-flex w-fit max-w-full flex-wrap gap-0.5 rounded-og-sm bg-og-surface-3/60 p-0.5",
910
+ children: modes.map((option) => /* @__PURE__ */ jsxs3(
911
+ "label",
912
+ {
913
+ className: cn(
914
+ "relative inline-flex h-7 cursor-pointer items-center rounded-[5px] px-2.5 text-og-control transition has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-og-accent pointer-coarse:h-9",
915
+ mode === option.value ? "bg-og-bg font-medium text-og-fg shadow-sm" : "text-og-fg-muted hover:text-og-fg"
916
+ ),
917
+ children: [
918
+ /* @__PURE__ */ jsx3(
919
+ "input",
920
+ {
921
+ type: "radio",
922
+ name: `${id}-mode`,
923
+ value: option.value,
924
+ checked: mode === option.value,
925
+ onChange: () => setMode(option.value),
926
+ className: "sr-only"
927
+ }
928
+ ),
929
+ option.label
930
+ ]
931
+ },
932
+ option.value
933
+ ))
934
+ }
935
+ ),
936
+ mode === "share" ? /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-col gap-2", children: [
937
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 items-center gap-3", children: [
938
+ /* @__PURE__ */ jsxs3(
939
+ Slider.Root,
940
+ {
941
+ value: [sharePercent],
942
+ min: 0,
943
+ max: 100,
944
+ step: 1,
945
+ onValueChange: (next) => setSharePercent(next[0] ?? 0),
946
+ "data-og-share-slider": "",
947
+ className: "relative flex h-6 min-w-0 flex-1 touch-none items-center select-none pointer-coarse:h-10",
948
+ children: [
949
+ /* @__PURE__ */ jsx3(Slider.Track, { className: "relative h-1.5 grow overflow-hidden rounded-full bg-og-surface-3", children: /* @__PURE__ */ jsx3(Slider.Range, { className: "absolute h-full rounded-full bg-og-accent" }) }),
950
+ count > 1 ? /* @__PURE__ */ jsx3(
951
+ "span",
952
+ {
953
+ "aria-hidden": true,
954
+ className: "pointer-events-none absolute top-1/2 h-3.5 w-0.5 -translate-x-1/2 -translate-y-1/2 rounded-full bg-og-fg-subtle",
955
+ style: { left: `${equal * 100}%` }
956
+ }
957
+ ) : null,
958
+ /* @__PURE__ */ jsx3(
959
+ Slider.Thumb,
960
+ {
961
+ "aria-label": labels.shareSlider,
962
+ "aria-valuetext": `${sharePercent}%`,
963
+ className: "block size-4 rounded-full border-2 border-og-accent bg-og-bg shadow-sm transition focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent pointer-coarse:size-6"
964
+ }
965
+ )
966
+ ]
967
+ }
968
+ ),
969
+ /* @__PURE__ */ jsxs3("label", { className: "flex shrink-0 items-center gap-1 text-og-sm text-og-fg", children: [
970
+ /* @__PURE__ */ jsx3(
971
+ "input",
972
+ {
973
+ type: "number",
974
+ inputMode: "numeric",
975
+ min: 0,
976
+ max: 100,
977
+ step: 1,
978
+ value: sharePercent,
979
+ "aria-label": labels.shareInput,
980
+ onChange: (event) => {
981
+ const next = Number(event.target.value);
982
+ if (Number.isFinite(next))
983
+ setSharePercent(Math.min(100, Math.max(0, Math.round(next))));
984
+ },
985
+ className: "h-8 w-16 rounded-og-sm border border-og-border bg-og-bg px-2 text-right tabular-nums focus-visible:outline-2 focus-visible:outline-og-accent pointer-coarse:h-10"
986
+ }
987
+ ),
988
+ "%"
989
+ ] })
990
+ ] }),
991
+ /* @__PURE__ */ jsx3("p", { className: "text-og-xs text-og-fg-subtle", "aria-live": "polite", children: [
992
+ count > 1 ? Math.abs(share * count - 1) < 0.05 ? labels.sameAsEqualShare : labels.equalShareMultiple(formatMultiple(share * count)) : null,
993
+ amounts && base > 0 ? labels.atBudget(amounts.format(Math.round(share * base))) : null
994
+ ].filter(Boolean).join(" \xB7 ") })
995
+ ] }) : mode === "amount" && amounts ? /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-1 text-og-sm text-og-fg", children: [
996
+ amounts.prefix ? /* @__PURE__ */ jsx3("span", { className: "text-og-fg-subtle", children: amounts.prefix }) : null,
997
+ /* @__PURE__ */ jsx3(
998
+ "input",
999
+ {
1000
+ type: "number",
1001
+ inputMode: "decimal",
1002
+ min: 0,
1003
+ step: amounts.step ?? 0.01,
1004
+ value: amountText,
1005
+ "aria-label": labels.amountInput,
1006
+ "aria-invalid": error === labels.invalidAmount || void 0,
1007
+ onChange: (event) => setAmountText(event.target.value),
1008
+ className: "h-8 w-28 rounded-og-sm border border-og-border bg-og-bg px-2 tabular-nums focus-visible:outline-2 focus-visible:outline-og-accent pointer-coarse:h-10"
1009
+ }
1010
+ ),
1011
+ /* @__PURE__ */ jsx3("span", { className: "ml-2 text-og-xs text-og-fg-subtle", children: labels.fixedAmountHint })
1012
+ ] }) : /* @__PURE__ */ jsx3("p", { className: "text-og-sm text-og-fg-muted", children: defaultLimitText })
1013
+ ] }),
1014
+ draftTotal !== null ? /* @__PURE__ */ jsx3(
1015
+ "p",
1016
+ {
1017
+ className: cn("mt-3 text-og-xs", draftTotal > 1.005 ? "text-og-fg" : "text-og-fg-subtle"),
1018
+ children: draftTotal > 1.005 ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
1019
+ /* @__PURE__ */ jsx3("span", { className: "font-medium", children: labels.totalOver(formatPercent(draftTotal)) }),
1020
+ " ",
1021
+ /* @__PURE__ */ jsx3("span", { className: "text-og-fg-muted", children: labels.oversubscribedHelp })
1022
+ ] }) : labels.totalWithin(formatPercent(draftTotal))
1023
+ }
1024
+ ) : null,
1025
+ error ? /* @__PURE__ */ jsx3("p", { role: "alert", className: "mt-2 text-og-xs text-og-danger", children: error }) : null,
1026
+ /* @__PURE__ */ jsxs3("div", { className: "mt-3 flex items-center justify-end gap-2", children: [
1027
+ /* @__PURE__ */ jsx3(
1028
+ "button",
1029
+ {
1030
+ type: "button",
1031
+ onClick: onCancel,
1032
+ disabled: saving,
1033
+ className: "inline-flex h-8 items-center rounded-og-sm px-3 text-og-control text-og-fg transition hover:bg-og-surface-2 focus-visible:outline-2 focus-visible:outline-og-accent disabled:opacity-50 pointer-coarse:h-10",
1034
+ children: labels.cancel
1035
+ }
1036
+ ),
1037
+ /* @__PURE__ */ jsx3(
1038
+ "button",
1039
+ {
1040
+ type: "button",
1041
+ onClick: () => void save(),
1042
+ disabled: saving || unchanged,
1043
+ className: "inline-flex h-8 items-center rounded-og-sm border border-og-primary-border bg-og-primary px-3 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:h-10",
1044
+ children: saving ? labels.saving : labels.save
1045
+ }
1046
+ )
1047
+ ] })
1048
+ ]
1049
+ }
1050
+ );
1051
+ }
1052
+ function stripPrefix(text, prefix) {
1053
+ const plain = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
1054
+ return plain.replace(/,/g, "");
1055
+ }
1056
+ function defaultLimitFor(memberDefault, base, count) {
1057
+ const fallback = memberDefault ?? "none";
1058
+ if (fallback === "none") return null;
1059
+ if (fallback === "equal_share") return base / count;
1060
+ if ("share" in fallback) return fallback.share * base;
1061
+ return fallback.credits;
1062
+ }
1063
+
1064
+ // src/components/session-usage-limit-notice.tsx
1065
+ import { GaugeIcon as GaugeIcon2, XIcon as XIcon2 } from "lucide-react";
1066
+ import { useEffect as useEffect3, useState as useState3 } from "react";
1067
+ import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1068
+ function readDismissed2(key) {
1069
+ if (!key || typeof sessionStorage === "undefined") return false;
1070
+ try {
1071
+ return sessionStorage.getItem(key) === "1";
1072
+ } catch {
1073
+ return false;
1074
+ }
1075
+ }
1076
+ function SessionUsageLimitNotice({
1077
+ usage,
1078
+ refusal,
1079
+ onChangeLimit,
1080
+ mainTaskHref,
1081
+ goalPaused = false,
1082
+ stale = false,
1083
+ dismissStorageKey,
1084
+ labels: overrides,
1085
+ className
1086
+ }) {
1087
+ const labels = sessionUsageLimitLabels(overrides);
1088
+ const fromUsage = summarizeSessionUsageLimit(usage, overrides, { stale });
1089
+ const summary = refusal && fromUsage.state !== "reached" ? summarizeSessionUsageLimitRefusal(refusal, overrides) : fromUsage;
1090
+ const near = summary.state === "near";
1091
+ const key = dismissStorageKey && near && summary.rootSessionId ? `${dismissStorageKey}:session-usage-limit:${summary.rootSessionId}:${summary.version ?? 0}` : null;
1092
+ const [dismissed, setDismissed] = useState3(() => readDismissed2(key));
1093
+ useEffect3(() => setDismissed(readDismissed2(key)), [key]);
1094
+ if (summary.state !== "reached" && !near) return null;
1095
+ if (near && dismissed) return null;
1096
+ const reached = summary.state === "reached";
1097
+ const amount = summary.amountText ?? "";
1098
+ const dismiss = () => {
1099
+ setDismissed(true);
1100
+ if (!key) return;
1101
+ try {
1102
+ sessionStorage.setItem(key, "1");
1103
+ } catch {
1104
+ }
1105
+ };
1106
+ let action = null;
1107
+ if (onChangeLimit) {
1108
+ action = /* @__PURE__ */ jsx4(
1109
+ "button",
1110
+ {
1111
+ type: "button",
1112
+ onClick: onChangeLimit,
1113
+ "data-og-session-usage-limit-action": "change",
1114
+ className: cn(
1115
+ "inline-flex h-8 shrink-0 items-center rounded-og-sm border px-3 text-og-control font-medium transition focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent pointer-coarse:h-11",
1116
+ reached ? "border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover" : "border-og-border bg-og-surface-1 text-og-fg hover:bg-og-surface-2"
1117
+ ),
1118
+ children: labels.changeLimit
1119
+ }
1120
+ );
1121
+ } else if (mainTaskHref) {
1122
+ action = /* @__PURE__ */ jsx4("a", { href: mainTaskHref, className: "og-link shrink-0 text-og-control font-medium", children: labels.openMainTask });
1123
+ }
1124
+ const remedy = !onChangeLimit && reached ? labels.reachedReadOnlyRemedy : goalPaused ? labels.reachedGoalRemedy : labels.reachedRemedy;
1125
+ return /* @__PURE__ */ jsxs4(
1126
+ "div",
1127
+ {
1128
+ role: "status",
1129
+ "data-og-session-usage-limit": reached ? "reached" : "near",
1130
+ className: cn(
1131
+ "og-root flex min-w-0 flex-wrap items-start gap-x-2 gap-y-2 px-3.5 pt-2.5 text-og-sm md:px-4",
1132
+ className
1133
+ ),
1134
+ children: [
1135
+ /* @__PURE__ */ jsx4(GaugeIcon2, { "aria-hidden": true, className: "mt-0.5 size-3.5 shrink-0 text-og-status-waiting" }),
1136
+ /* @__PURE__ */ jsx4("div", { className: "min-w-0 flex-1 basis-48", children: reached ? /* @__PURE__ */ jsxs4(Fragment3, { children: [
1137
+ /* @__PURE__ */ jsx4("p", { className: "font-medium text-og-fg", children: labels.reachedTitle }),
1138
+ /* @__PURE__ */ jsxs4("p", { className: "mt-0.5 text-og-fg-muted", children: [
1139
+ amount ? `${labels.reachedAmount(amount)} ` : "",
1140
+ remedy,
1141
+ summary.stale ? ` ${labels.staleNote}` : ""
1142
+ ] })
1143
+ ] }) : /* @__PURE__ */ jsxs4("p", { className: "text-og-fg-muted", children: [
1144
+ labels.near(sessionUsageLimitPercent(summary.fraction ?? 0), amount),
1145
+ summary.stale ? ` ${labels.staleNote}` : ""
1146
+ ] }) }),
1147
+ action,
1148
+ !reached ? /* @__PURE__ */ jsx4(
1149
+ "button",
1150
+ {
1151
+ type: "button",
1152
+ "aria-label": labels.dismiss,
1153
+ onClick: dismiss,
1154
+ className: "-mt-0.5 -mr-1 grid size-6 shrink-0 place-items-center rounded-og-sm text-og-fg-subtle transition hover:bg-og-surface-2 hover:text-og-fg focus-visible:outline-2 focus-visible:outline-og-accent pointer-coarse:size-9",
1155
+ children: /* @__PURE__ */ jsx4(XIcon2, { "aria-hidden": true, className: "size-3.5" })
1156
+ }
1157
+ ) : null
1158
+ ]
1159
+ }
1160
+ );
1161
+ }
1162
+ export {
1163
+ DEFAULT_ALLOWANCE_LABELS,
1164
+ DEFAULT_SESSION_USAGE_LIMIT_LABELS,
1165
+ DEFAULT_USAGE_LIMIT_NOTICE_LABELS,
1166
+ DEFAULT_USAGE_MEMBER_LIST_LABELS,
1167
+ DEFAULT_USAGE_METER_LABELS,
1168
+ SESSION_USAGE_LIMIT_NEAR_FRACTION,
1169
+ SessionUsageLimitNotice,
1170
+ UsageLimitNotice,
1171
+ UsageLimitNoticeView,
1172
+ UsageMemberList,
1173
+ UsageMeter,
1174
+ UsageMeterView,
1175
+ allowanceLabels,
1176
+ allowanceResetSentence,
1177
+ describeMemberLimit,
1178
+ formatAllowanceDate,
1179
+ sessionUsageLimitLabels,
1180
+ sessionUsageLimitPercent,
1181
+ summarizeSessionUsageLimit,
1182
+ summarizeSessionUsageLimitRefusal,
1183
+ summarizeUsage,
1184
+ usagePercentLabel,
1185
+ useUsage
1186
+ };
1187
+ //# sourceMappingURL=usage.js.map