@opengeni/react 1.4.4 → 1.4.5-canary.37485542607001

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 (249) hide show
  1. package/README.md +17 -6
  2. package/dist/artifacts.d.ts +1 -0
  3. package/dist/artifacts.js +22 -15
  4. package/dist/artifacts.js.map +1 -1
  5. package/dist/{browser-viewer-5EEAS3IU.js → browser-viewer-CV23VIHB.js} +8 -6
  6. package/dist/{chunk-XS67YG5R.js → chunk-4O7OE7ON.js} +45 -4
  7. package/dist/chunk-4O7OE7ON.js.map +1 -0
  8. package/dist/{chunk-JHTIMBOL.js → chunk-5JSUNNQN.js} +26 -4
  9. package/dist/{chunk-JHTIMBOL.js.map → chunk-5JSUNNQN.js.map} +1 -1
  10. package/dist/{chunk-QMMCJGFI.js → chunk-6BAMPGBV.js} +6 -3
  11. package/dist/chunk-6BAMPGBV.js.map +1 -0
  12. package/dist/{chunk-I6OY3MWC.js → chunk-6FOTSVWU.js} +2 -2
  13. package/dist/{chunk-LVS3MH5T.js → chunk-ATIRUHBZ.js} +128 -10
  14. package/dist/chunk-ATIRUHBZ.js.map +1 -0
  15. package/dist/chunk-BOFEQC6K.js +162 -0
  16. package/dist/chunk-BOFEQC6K.js.map +1 -0
  17. package/dist/{chunk-2OQA3CPB.js → chunk-CESBPQP5.js} +19 -5
  18. package/dist/chunk-CESBPQP5.js.map +1 -0
  19. package/dist/{chunk-YVFRBXST.js → chunk-GMNGUPMX.js} +2 -2
  20. package/dist/{chunk-PHBFJCEU.js → chunk-I5EGRXXG.js} +110 -7
  21. package/dist/chunk-I5EGRXXG.js.map +1 -0
  22. package/dist/{chunk-PBCZL4JP.js → chunk-INIZSNXT.js} +2 -2
  23. package/dist/chunk-IZV5FTJC.js +55 -0
  24. package/dist/chunk-IZV5FTJC.js.map +1 -0
  25. package/dist/chunk-JDJJMBB3.js +1883 -0
  26. package/dist/chunk-JDJJMBB3.js.map +1 -0
  27. package/dist/chunk-LHF6BVM4.js +83 -0
  28. package/dist/chunk-LHF6BVM4.js.map +1 -0
  29. package/dist/{chunk-C5BF4L26.js → chunk-LSMWZSCJ.js} +7 -7
  30. package/dist/chunk-LTKGTXUQ.js +174 -0
  31. package/dist/chunk-LTKGTXUQ.js.map +1 -0
  32. package/dist/chunk-N7S72EXK.js +25 -0
  33. package/dist/chunk-N7S72EXK.js.map +1 -0
  34. package/dist/{chunk-CVYCLFMH.js → chunk-PEHTX3V7.js} +19 -1
  35. package/dist/chunk-PEHTX3V7.js.map +1 -0
  36. package/dist/chunk-R5R5RQQD.js +51 -0
  37. package/dist/chunk-R5R5RQQD.js.map +1 -0
  38. package/dist/{chunk-IYQCWGU5.js → chunk-RGTZ2VDR.js} +35 -62
  39. package/dist/chunk-RGTZ2VDR.js.map +1 -0
  40. package/dist/chunk-RI42H5IU.js +326 -0
  41. package/dist/chunk-RI42H5IU.js.map +1 -0
  42. package/dist/{chunk-EAOSEIXB.js → chunk-RRRS5D5T.js} +727 -1983
  43. package/dist/chunk-RRRS5D5T.js.map +1 -0
  44. package/dist/{chunk-JH7V627O.js → chunk-SHLZMAJN.js} +2 -11
  45. package/dist/chunk-SHLZMAJN.js.map +1 -0
  46. package/dist/{chunk-IUHHPMAX.js → chunk-SZOCY5VG.js} +18 -87
  47. package/dist/chunk-SZOCY5VG.js.map +1 -0
  48. package/dist/{chunk-L2J3PU7A.js → chunk-VYIPNDUZ.js} +29 -100
  49. package/dist/chunk-VYIPNDUZ.js.map +1 -0
  50. package/dist/{chunk-G6YRCIYJ.js → chunk-YK6QMGVL.js} +55 -60
  51. package/dist/chunk-YK6QMGVL.js.map +1 -0
  52. package/dist/chunk-ZIB4H5LN.js +101 -0
  53. package/dist/chunk-ZIB4H5LN.js.map +1 -0
  54. package/dist/client.d.ts +9 -3
  55. package/dist/clipboard.js +1 -1
  56. package/dist/components/browser-viewer.d.ts +6 -0
  57. package/dist/components/composer.d.ts +3 -69
  58. package/dist/components/human-input-form.d.ts +3 -32
  59. package/dist/components/markdown.d.ts +8 -0
  60. package/dist/components/model-policy-picker.d.ts +4 -37
  61. package/dist/components/opper-mark.d.ts +7 -0
  62. package/dist/components/provider-recovery-notice.d.ts +15 -0
  63. package/dist/components/remark-soft-line-breaks.d.ts +38 -0
  64. package/dist/components/sandbox-workspace.d.ts +13 -0
  65. package/dist/components/session-chrome.d.ts +5 -3
  66. package/dist/components/session-conversation.d.ts +15 -3
  67. package/dist/composer-messages.d.ts +74 -0
  68. package/dist/composer-messages.js +9 -0
  69. package/dist/composer.js +15 -10
  70. package/dist/{computer-viewer-ELNLZGHI.js → computer-viewer-K4CKYRX6.js} +4 -4
  71. package/dist/connect-setup.d.ts +2 -0
  72. package/dist/connect.d.ts +1 -1
  73. package/dist/connect.js +21 -6
  74. package/dist/connect.js.map +1 -1
  75. package/dist/{embedded-voice-NIL4RDX3.js → embedded-voice-K7SOZVVZ.js} +6 -4
  76. package/dist/{embedded-voice-NIL4RDX3.js.map → embedded-voice-K7SOZVVZ.js.map} +1 -1
  77. package/dist/hooks/shared-machines-list.d.ts +4 -0
  78. package/dist/hooks/use-client-config-flags.d.ts +6 -0
  79. package/dist/hooks/use-goal.d.ts +2 -1
  80. package/dist/hooks/use-new-session-draft.d.ts +74 -0
  81. package/dist/human-input-model.d.ts +40 -0
  82. package/dist/index.d.ts +4 -1
  83. package/dist/index.js +116 -73
  84. package/dist/index.js.map +1 -1
  85. package/dist/interaction.js +5 -5
  86. package/dist/{latest-question-2POFPYNB.js → latest-question-27HGRPVF.js} +3 -3
  87. package/dist/lib/clipboard.d.ts +7 -0
  88. package/dist/lib/provider-recovery.d.ts +49 -0
  89. package/dist/lib/transient-retry.d.ts +25 -0
  90. package/dist/machines.js +2 -2
  91. package/dist/model-mark-paths.d.ts +34 -0
  92. package/dist/model-mark-paths.js +16 -0
  93. package/dist/model-picker-model.d.ts +111 -0
  94. package/dist/model-picker-model.js +25 -0
  95. package/dist/model-picker-model.js.map +1 -0
  96. package/dist/{model-policy-picker-menu-WRNSRFQC.js → model-policy-picker-menu-I5KPC3D6.js} +6 -4
  97. package/dist/model-policy-picker-menu-I5KPC3D6.js.map +1 -0
  98. package/dist/model-policy.d.ts +10 -0
  99. package/dist/model-policy.js +5 -1
  100. package/dist/new-session-draft.d.ts +7 -0
  101. package/dist/new-session-draft.js +639 -0
  102. package/dist/new-session-draft.js.map +1 -0
  103. package/dist/organization-model.d.ts +32 -0
  104. package/dist/organization-model.js +65 -0
  105. package/dist/organization-model.js.map +1 -0
  106. package/dist/{platform-activity-row-PJJVATTZ.js → platform-activity-row-NJ47YBXW.js} +7 -84
  107. package/dist/platform-activity-row-NJ47YBXW.js.map +1 -0
  108. package/dist/queue-presentation-model.d.ts +72 -0
  109. package/dist/queue-presentation-model.js +38 -0
  110. package/dist/queue-presentation-model.js.map +1 -0
  111. package/dist/{queue-surface-implementation-67FS7FUI.js → queue-surface-implementation-YPJFQ3O6.js} +24 -252
  112. package/dist/queue-surface-implementation-YPJFQ3O6.js.map +1 -0
  113. package/dist/realtime.js +5 -3
  114. package/dist/{sandbox-files-34CJJNOY.js → sandbox-files-2DGDO6NI.js} +5 -5
  115. package/dist/sandbox-files-2DGDO6NI.js.map +1 -0
  116. package/dist/sandbox-label-model.d.ts +23 -0
  117. package/dist/sandbox-label-model.js +28 -0
  118. package/dist/sandbox-label-model.js.map +1 -0
  119. package/dist/session-agents-model.d.ts +10 -0
  120. package/dist/session-agents-model.js +25 -0
  121. package/dist/session-agents-model.js.map +1 -0
  122. package/dist/session-attention-model.d.ts +8 -0
  123. package/dist/session-attention-model.js +46 -0
  124. package/dist/session-attention-model.js.map +1 -0
  125. package/dist/session-feedback-model.d.ts +20 -0
  126. package/dist/session-feedback-model.js +56 -0
  127. package/dist/session-feedback-model.js.map +1 -0
  128. package/dist/session-list-model.d.ts +119 -0
  129. package/dist/session-list-model.js +244 -0
  130. package/dist/session-list-model.js.map +1 -0
  131. package/dist/session-status-model.d.ts +19 -0
  132. package/dist/session-ui.js +26 -17
  133. package/dist/session-ui.js.map +1 -1
  134. package/dist/session.js +8 -6
  135. package/dist/testing/session-scenarios.d.ts +10 -0
  136. package/dist/testing/session-scenarios.js +303 -0
  137. package/dist/testing/session-scenarios.js.map +1 -0
  138. package/dist/timeline/genie-copy.d.ts +3 -0
  139. package/dist/timeline/genie-loading.d.ts +11 -0
  140. package/dist/timeline/index.d.ts +1 -1
  141. package/dist/timeline/notice-presentation.d.ts +7 -0
  142. package/dist/timeline/patch-apply-command.d.ts +18 -0
  143. package/dist/timeline/platform-activity-presentation.d.ts +7 -0
  144. package/dist/timeline/presented-image.d.ts +6 -1
  145. package/dist/timeline/question-nav-model.d.ts +23 -0
  146. package/dist/timeline/registry.d.ts +10 -1
  147. package/dist/timeline/retained-loaders.d.ts +1 -1
  148. package/dist/timeline/tool-presentation.d.ts +172 -0
  149. package/dist/timeline/turn-summary-model.d.ts +90 -0
  150. package/dist/timeline/turn-summary.d.ts +4 -74
  151. package/dist/timeline/work-presentation.d.ts +42 -0
  152. package/dist/timeline-model.d.ts +24 -0
  153. package/dist/timeline-model.js +152 -0
  154. package/dist/timeline-model.js.map +1 -0
  155. package/package.json +55 -3
  156. package/src/artifacts.ts +1 -0
  157. package/src/client.ts +9 -3
  158. package/src/components/browser-viewer.tsx +23 -2
  159. package/src/components/claude-mark.tsx +2 -1
  160. package/src/components/composer.tsx +8 -146
  161. package/src/components/grok-mark.tsx +2 -1
  162. package/src/components/human-input-form.tsx +13 -124
  163. package/src/components/markdown.tsx +19 -1
  164. package/src/components/message-timeline.tsx +45 -99
  165. package/src/components/model-mark.tsx +2 -1
  166. package/src/components/model-policy-picker-menu.tsx +30 -85
  167. package/src/components/model-policy-picker.tsx +20 -150
  168. package/src/components/opper-mark.tsx +18 -0
  169. package/src/components/provider-recovery-notice.tsx +41 -0
  170. package/src/components/queue-surface-implementation.tsx +20 -349
  171. package/src/components/remark-soft-line-breaks.ts +166 -0
  172. package/src/components/sandbox-workspace.tsx +17 -1
  173. package/src/components/session-chrome.tsx +114 -99
  174. package/src/components/session-conversation.tsx +55 -6
  175. package/src/components/session-status.tsx +17 -16
  176. package/src/composer-messages.ts +150 -0
  177. package/src/connect-setup.tsx +45 -11
  178. package/src/connect.ts +1 -1
  179. package/src/hooks/shared-machines-list.ts +34 -1
  180. package/src/hooks/use-client-config-flags.ts +8 -0
  181. package/src/hooks/use-goal.ts +66 -10
  182. package/src/hooks/use-new-session-draft.ts +813 -0
  183. package/src/human-input-model.ts +147 -0
  184. package/src/index.ts +16 -0
  185. package/src/lib/clipboard.ts +29 -0
  186. package/src/lib/format.ts +7 -0
  187. package/src/lib/provider-recovery.ts +202 -0
  188. package/src/lib/transient-retry.ts +99 -0
  189. package/src/model-mark-paths.ts +53 -0
  190. package/src/model-picker-model.ts +330 -0
  191. package/src/model-policy.ts +75 -5
  192. package/src/new-session-draft.ts +22 -0
  193. package/src/organization-model.ts +118 -0
  194. package/src/queue-presentation-model.ts +464 -0
  195. package/src/sandbox-label-model.ts +41 -0
  196. package/src/session-agents-model.ts +33 -0
  197. package/src/session-attention-model.ts +59 -0
  198. package/src/session-feedback-model.ts +95 -0
  199. package/src/session-list-model.ts +377 -0
  200. package/src/session-status-model.ts +62 -0
  201. package/src/testing/session-scenarios.ts +326 -0
  202. package/src/timeline/activity-rail.tsx +54 -24
  203. package/src/timeline/genie-copy.ts +19 -0
  204. package/src/timeline/genie-loading.tsx +15 -19
  205. package/src/timeline/index.ts +1 -0
  206. package/src/timeline/notice-presentation.ts +22 -0
  207. package/src/timeline/patch-apply-command.tsx +135 -0
  208. package/src/timeline/platform-activity-presentation.ts +122 -0
  209. package/src/timeline/platform-activity-row.tsx +6 -96
  210. package/src/timeline/presented-image.ts +16 -2
  211. package/src/timeline/projection.ts +12 -1
  212. package/src/timeline/question-nav-model.ts +28 -0
  213. package/src/timeline/registry.ts +11 -1
  214. package/src/timeline/retained-loaders.ts +9 -4
  215. package/src/timeline/rolling-activity.tsx +7 -19
  216. package/src/timeline/tool-presentation.ts +1316 -0
  217. package/src/timeline/tool-renderers.tsx +254 -1024
  218. package/src/timeline/turn-summary-model.ts +338 -0
  219. package/src/timeline/turn-summary.tsx +21 -326
  220. package/src/timeline/work-presentation.ts +139 -0
  221. package/src/timeline-model.ts +108 -0
  222. package/styles/compiled.css +17 -4
  223. package/styles/connect.css +4 -0
  224. package/styles/responsive.css +11 -2
  225. package/dist/chunk-2OQA3CPB.js.map +0 -1
  226. package/dist/chunk-CVYCLFMH.js.map +0 -1
  227. package/dist/chunk-EAOSEIXB.js.map +0 -1
  228. package/dist/chunk-G6YRCIYJ.js.map +0 -1
  229. package/dist/chunk-HXYOSSQO.js +0 -117
  230. package/dist/chunk-HXYOSSQO.js.map +0 -1
  231. package/dist/chunk-IUHHPMAX.js.map +0 -1
  232. package/dist/chunk-IYQCWGU5.js.map +0 -1
  233. package/dist/chunk-JH7V627O.js.map +0 -1
  234. package/dist/chunk-L2J3PU7A.js.map +0 -1
  235. package/dist/chunk-LVS3MH5T.js.map +0 -1
  236. package/dist/chunk-PHBFJCEU.js.map +0 -1
  237. package/dist/chunk-QMMCJGFI.js.map +0 -1
  238. package/dist/chunk-XS67YG5R.js.map +0 -1
  239. package/dist/platform-activity-row-PJJVATTZ.js.map +0 -1
  240. package/dist/queue-surface-implementation-67FS7FUI.js.map +0 -1
  241. /package/dist/{browser-viewer-5EEAS3IU.js.map → browser-viewer-CV23VIHB.js.map} +0 -0
  242. /package/dist/{chunk-I6OY3MWC.js.map → chunk-6FOTSVWU.js.map} +0 -0
  243. /package/dist/{chunk-YVFRBXST.js.map → chunk-GMNGUPMX.js.map} +0 -0
  244. /package/dist/{chunk-PBCZL4JP.js.map → chunk-INIZSNXT.js.map} +0 -0
  245. /package/dist/{chunk-C5BF4L26.js.map → chunk-LSMWZSCJ.js.map} +0 -0
  246. /package/dist/{computer-viewer-ELNLZGHI.js.map → composer-messages.js.map} +0 -0
  247. /package/dist/{model-policy-picker-menu-WRNSRFQC.js.map → computer-viewer-K4CKYRX6.js.map} +0 -0
  248. /package/dist/{latest-question-2POFPYNB.js.map → latest-question-27HGRPVF.js.map} +0 -0
  249. /package/dist/{sandbox-files-34CJJNOY.js.map → model-mark-paths.js.map} +0 -0
@@ -3,16 +3,25 @@ import {
3
3
  MENU_CHEVRON_CLASS
4
4
  } from "./chunk-PMV53IMM.js";
5
5
  import {
6
- effortOptionsForModel,
7
- findPickerRow,
8
- labelReasoningEffort,
9
- projectClientModelRows,
10
- scopedBillingClassLabel
11
- } from "./chunk-XS67YG5R.js";
6
+ CHATGPT_MARK_PATH,
7
+ CLAUDE_MARK_PATH,
8
+ GROK_MARK_PATH
9
+ } from "./chunk-N7S72EXK.js";
10
+ import {
11
+ billingClassForMissingSelection,
12
+ defaultModelPolicyPickerMessages,
13
+ effectiveRows,
14
+ groupPresentationFor
15
+ } from "./chunk-LTKGTXUQ.js";
12
16
  import {
13
17
  usePortalTokenSource,
14
18
  usePortalTokenStyle
15
19
  } from "./chunk-XEA5BCMA.js";
20
+ import {
21
+ findPickerRow,
22
+ labelReasoningEffort,
23
+ modelOffersEffortChoice
24
+ } from "./chunk-4O7OE7ON.js";
16
25
  import {
17
26
  cn
18
27
  } from "./chunk-TXS65BB2.js";
@@ -20,13 +29,13 @@ import {
20
29
  // src/components/claude-mark.tsx
21
30
  import { jsx } from "react/jsx-runtime";
22
31
  function ClaudeMark(props) {
23
- return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z" }) });
32
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: CLAUDE_MARK_PATH }) });
24
33
  }
25
34
 
26
35
  // src/components/grok-mark.tsx
27
36
  import { jsx as jsx2 } from "react/jsx-runtime";
28
37
  function GrokMark(props) {
29
- return /* @__PURE__ */ jsx2("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx2("path", { d: "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815" }) });
38
+ return /* @__PURE__ */ jsx2("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx2("path", { d: GROK_MARK_PATH }) });
30
39
  }
31
40
 
32
41
  // src/components/model-mark.tsx
@@ -39,7 +48,7 @@ import { SparklesIcon } from "lucide-react";
39
48
  import { useState } from "react";
40
49
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
41
50
  function ChatGptMark(props) {
42
- return /* @__PURE__ */ jsx3("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx3("path", { d: "M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3653-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8414 3.3698-2.02 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.783-2.7622a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" }) });
51
+ return /* @__PURE__ */ jsx3("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx3("path", { d: CHATGPT_MARK_PATH }) });
43
52
  }
44
53
  var MARKED_VENDORS = /* @__PURE__ */ new Set(["openai", "anthropic", "xai"]);
45
54
  function modelHasMark(model) {
@@ -103,39 +112,10 @@ import {
103
112
  } from "react";
104
113
  import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
105
114
  var LazyModelPolicyPickerMenu = lazy(
106
- () => import("./model-policy-picker-menu-WRNSRFQC.js").then(({ ModelPolicyPickerPopover }) => ({
115
+ () => import("./model-policy-picker-menu-I5KPC3D6.js").then(({ ModelPolicyPickerPopover }) => ({
107
116
  default: ModelPolicyPickerPopover
108
117
  }))
109
118
  );
110
- var defaultModelPolicyPickerMessages = {
111
- label: "Model and effort",
112
- loading: "Loading model catalog\u2026",
113
- noModels: "No models available.",
114
- connectTitle: "Connect a model",
115
- connectBody: "Use a subscription or a provider key you already have.",
116
- connectAction: "Open Models",
117
- thinking: "Thinking",
118
- fast: "Fast",
119
- fastRateHint: "2\xD7 rate",
120
- codexOnly: "Codex-only session",
121
- searchLabel: "Search models or providers",
122
- searchPlaceholder: "Search models or providers\u2026",
123
- currentModel: "Current model",
124
- noMatches: "No matching models. Try a model or provider name.",
125
- unsupportedAttachments: "This model cannot view the attached images.",
126
- thinkingEffort: "Thinking effort",
127
- selected: "Selected",
128
- free: "Free",
129
- billingHints: {
130
- opengeni_credits: "Provided by Opengeni",
131
- external: "Provider terms and limits apply",
132
- codex_subscription: "ChatGPT / Codex plan",
133
- supergrok_subscription: "SuperGrok / xAI plan",
134
- claude_subscription: "Claude plan",
135
- byok: "Billed to the connected provider account",
136
- organization_byok: "Billed to the connected provider account"
137
- }
138
- };
139
119
  var SLIDE_EASE = [0.22, 1, 0.36, 1];
140
120
  function BillingClassMark(props) {
141
121
  const labels = {
@@ -165,31 +145,6 @@ function BillingClassMark(props) {
165
145
  }
166
146
  );
167
147
  }
168
- function isCodexModel(model) {
169
- return model.id.startsWith("codex/") || model.source === "codex";
170
- }
171
- function billingClassForMissingSelection(modelId) {
172
- if (modelId.startsWith("workspace-claude-subscription/")) return "claude_subscription";
173
- if (modelId.startsWith("workspace-anthropic/")) return "byok";
174
- if (modelId.startsWith("organization-claude-subscription/")) return "claude_subscription";
175
- if (modelId.startsWith("organization-anthropic/")) return "organization_byok";
176
- if (modelId.startsWith("workspace-gateway/")) return "byok";
177
- if (modelId.startsWith("workspace-openrouter/")) return "byok";
178
- if (modelId.startsWith("openrouter/")) return "opengeni_credits";
179
- if (modelId.startsWith("codex/")) return "codex_subscription";
180
- if (modelId.startsWith("supergrok/")) return "supergrok_subscription";
181
- return "opengeni_credits";
182
- }
183
- function applyCodexOnly(rows, codexOnly, unavailableReason) {
184
- if (!codexOnly) return rows;
185
- return rows.map(
186
- (row) => isCodexModel(row.catalog) ? row : {
187
- ...row,
188
- selectable: false,
189
- unavailableReason: row.unavailableReason ?? unavailableReason
190
- }
191
- );
192
- }
193
148
  function SelectedModelMark(input) {
194
149
  const billingClass = input.selected?.billingClass ?? billingClassForMissingSelection(input.props.model);
195
150
  const presentation = groupPresentationFor(input.props, billingClass);
@@ -224,17 +179,6 @@ var SCOPED_MARK_LABELS = {
224
179
  byok: "Workspace provider account",
225
180
  organization_byok: "Organization provider account"
226
181
  };
227
- var SCOPED_BILLING_HINTS = {
228
- byok: "Billed to the workspace provider account",
229
- organization_byok: "Billed to the organization provider account"
230
- };
231
- function groupPresentationFor(props, billingClass) {
232
- const own = props.groupPresentation?.[billingClass];
233
- if (own !== void 0 || props.collapseScopes === false) return own;
234
- if (billingClass === "byok") return props.groupPresentation?.organization_byok;
235
- if (billingClass === "organization_byok") return props.groupPresentation?.byok;
236
- return void 0;
237
- }
238
182
  function fallbackName(props) {
239
183
  return props.collapseScopes === false ? props.model : modelDisplayName2(props.model);
240
184
  }
@@ -243,22 +187,8 @@ var BRANDED_BILLING_CLASSES = /* @__PURE__ */ new Set([
243
187
  "claude_subscription",
244
188
  "supergrok_subscription"
245
189
  ]);
246
- function effectiveRows(props) {
247
- const rows = props.rows !== void 0 ? props.rows : projectClientModelRows(props.models ?? []);
248
- const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };
249
- return applyCodexOnly(rows, props.codexOnly === true, messages.codexOnly).map((row) => {
250
- const scoped = props.collapseScopes === false ? {
251
- ...row,
252
- label: row.catalog.label,
253
- billingClassLabel: scopedBillingClassLabel(row.billingClass)
254
- } : row;
255
- if (props.collapseScopes === false) {
256
- if (row.catalog.shortLabel) scoped.shortLabel = row.catalog.shortLabel;
257
- else delete scoped.shortLabel;
258
- }
259
- const label = groupPresentationFor(props, row.billingClass)?.label;
260
- return label === void 0 ? scoped : { ...scoped, billingClassLabel: label };
261
- });
190
+ function effectiveRows2(props) {
191
+ return effectiveRows(props);
262
192
  }
263
193
  function PickerNavRow(props) {
264
194
  return /* @__PURE__ */ jsxs2(
@@ -327,7 +257,7 @@ function useModelPolicyPickerState(props) {
327
257
  if (props.open === void 0) setUncontrolledOpen(next);
328
258
  props.onOpenChange?.(next);
329
259
  };
330
- return { open, setOpen, rows: effectiveRows(props) };
260
+ return { open, setOpen, rows: effectiveRows2(props) };
331
261
  }
332
262
  function ModelPolicyPicker(props) {
333
263
  const contentId = useId();
@@ -410,7 +340,10 @@ function ModelPolicyPicker(props) {
410
340
  "aria-label": messages.label,
411
341
  "aria-description": selectedDescription,
412
342
  className: cn(
413
- "og-root og-model-policy-trigger inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border px-2.5 text-og-control outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:px-2",
343
+ // Phone: the composer row also carries attach, dictate, voice, pause
344
+ // and send, so the pill drops its chevron and tightens its padding
345
+ // to keep the model's short name readable.
346
+ "og-root og-model-policy-trigger inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border px-2.5 text-og-control outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:gap-0.5 max-sm:px-1.5",
414
347
  // With no usable model the pill is the one thing that unblocks the
415
348
  // composer, so it takes the primary wash.
416
349
  needsModel ? "border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover" : "border-transparent text-og-fg-muted hover:border-og-border hover:bg-og-surface-2 hover:text-og-fg",
@@ -420,7 +353,7 @@ function ModelPolicyPicker(props) {
420
353
  needsModel ? /* @__PURE__ */ jsx4(SparklesIcon2, { className: "size-3.5 shrink-0", "aria-hidden": true }) : /* @__PURE__ */ jsx4(SelectedModelMark, { props, selected }),
421
354
  /* @__PURE__ */ jsx4("span", { className: "og-model-policy-label-full min-w-0 truncate font-medium text-og-fg max-sm:hidden @max-[20rem]/model-controls:hidden", children: needsModel ? messages.connectTitle : selected?.label ?? fallbackName(props) }),
422
355
  /* @__PURE__ */ jsx4("span", { className: "og-model-policy-label-short min-w-0 truncate font-medium text-og-fg sm:hidden @max-[20rem]/model-controls:block", children: needsModel ? messages.connectTitle : selected?.shortLabel ?? selected?.label ?? fallbackName(props) }),
423
- selected && !needsModel && effortOptionsForModel(selected.catalog).length > 1 && selected.catalog.capabilities?.reasoning.runnable !== false ? /* @__PURE__ */ jsx4(
356
+ selected && !needsModel && modelOffersEffortChoice(selected.catalog) ? /* @__PURE__ */ jsx4(
424
357
  "span",
425
358
  {
426
359
  className: "og-model-policy-effort min-w-0 shrink-[9999] truncate",
@@ -436,7 +369,7 @@ function ModelPolicyPicker(props) {
436
369
  "data-testid": "model-picker-fast-icon"
437
370
  }
438
371
  ) : null,
439
- /* @__PURE__ */ jsx4(ChevronDownIcon, { className: "size-3 shrink-0" })
372
+ /* @__PURE__ */ jsx4(ChevronDownIcon, { className: "og-model-policy-chevron size-3 shrink-0 max-sm:hidden" })
440
373
  ]
441
374
  }
442
375
  ),
@@ -460,14 +393,10 @@ export {
460
393
  modelHasMark,
461
394
  ModelMark,
462
395
  ModelName,
463
- defaultModelPolicyPickerMessages,
464
396
  BillingClassMark,
465
- SCOPED_BILLING_HINTS,
466
- groupPresentationFor,
467
- effectiveRows,
468
397
  PickerNavRow,
469
398
  PickerBackHeader,
470
399
  PickerAnimatedPage,
471
400
  ModelPolicyPicker
472
401
  };
473
- //# sourceMappingURL=chunk-L2J3PU7A.js.map
402
+ //# sourceMappingURL=chunk-VYIPNDUZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/claude-mark.tsx","../src/components/grok-mark.tsx","../src/components/model-mark.tsx","../src/components/model-policy-picker.tsx"],"sourcesContent":["import { CLAUDE_MARK_PATH } from \"../model-mark-paths\";\nimport type { SVGProps } from \"react\";\n\n/** ClaudeMark: Simple Icons, CC0; https://github.com/simple-icons/simple-icons */\nexport function ClaudeMark(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d={CLAUDE_MARK_PATH} />\n </svg>\n );\n}\n","import { GROK_MARK_PATH } from \"../model-mark-paths\";\nimport type { SVGProps } from \"react\";\n\n/**\n * MIT License\n *\n * Copyright (c) 2023 LobeHub\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * Source: https://raw.githubusercontent.com/lobehub/lobe-icons/master/src/Grok/components/Mono.tsx\n */\nexport function GrokMark(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d={GROK_MARK_PATH} />\n </svg>\n );\n}\n","import { CHATGPT_MARK_PATH } from \"../model-mark-paths\";\nimport {\n modelDisplayName,\n modelLogoUrl,\n modelVendor,\n type ModelDisplayInput,\n type ModelVendor,\n} from \"@opengeni/sdk/model-display\";\nimport { SparklesIcon } from \"lucide-react\";\nimport { useState, type ReactNode, type SVGProps } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { ClaudeMark } from \"./claude-mark\";\nimport { GrokMark } from \"./grok-mark\";\n\n/** ChatGPT / OpenAI mark (Simple Icons path), currentColor like the other marks. */\nexport function ChatGptMark(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <path d={CHATGPT_MARK_PATH} />\n </svg>\n );\n}\n\nconst MARKED_VENDORS: ReadonlySet<ModelVendor> = new Set([\"openai\", \"anthropic\", \"xai\"]);\n\n/** True when `ModelMark` has a real maker logo for this model (not the neutral fallback). */\nexport function modelHasMark(model: ModelDisplayInput): boolean {\n const vendor = modelVendor(model);\n return modelLogoUrl(model) !== null || (vendor !== null && MARKED_VENDORS.has(vendor));\n}\n\n/**\n * The catalog's maker logo, with bundled maker logos and a neutral fallback.\n * Makers without a configured or bundled logo get a neutral mark, so an org- and\n * a workspace-connected copy of one model always look the same.\n */\nexport function ModelMark(props: {\n model: ModelDisplayInput;\n className?: string | undefined;\n /** Shown when the maker has no bundled logo. Defaults to a neutral sparkle. */\n fallback?: ReactNode;\n \"aria-label\"?: string | undefined;\n}) {\n const logoUrl = modelLogoUrl(props.model);\n const [failedUrl, setFailedUrl] = useState<string | null>(null);\n const vendor = modelVendor(props.model);\n const className = cn(\"size-3.5 shrink-0\", props.className);\n const label = props[\"aria-label\"];\n const a11y = label ? { role: \"img\" as const, \"aria-label\": label } : { \"aria-hidden\": true };\n const mark =\n logoUrl && logoUrl !== failedUrl ? (\n <img\n src={logoUrl}\n alt=\"\"\n className=\"size-full object-contain\"\n referrerPolicy=\"no-referrer\"\n onError={() => setFailedUrl(logoUrl)}\n />\n ) : vendor === \"openai\" ? (\n <ChatGptMark className=\"size-full\" />\n ) : vendor === \"anthropic\" ? (\n <ClaudeMark className=\"size-full\" />\n ) : vendor === \"xai\" ? (\n <GrokMark className=\"size-full\" />\n ) : props.fallback !== undefined ? (\n props.fallback\n ) : (\n <SparklesIcon className=\"size-full\" aria-hidden />\n );\n if (mark === null) return null;\n return (\n <span\n className={cn(\"inline-flex items-center justify-center [&>svg]:size-full\", className)}\n data-model-vendor={vendor ?? \"unknown\"}\n {...a11y}\n >\n {mark}\n </span>\n );\n}\n\n/**\n * A model as people should see it outside model settings: the maker's mark and\n * the clean display name. Never a routing prefix, connection id or scope.\n */\nexport function ModelName(props: {\n model: ModelDisplayInput;\n /** Hide the maker mark for dense text-only contexts. */\n mark?: boolean | undefined;\n className?: string | undefined;\n markClassName?: string | undefined;\n}) {\n const name = modelDisplayName(props.model);\n return (\n <span className={cn(\"inline-flex min-w-0 items-center gap-1.5\", props.className)} title={name}>\n {props.mark === false ? null : (\n <ModelMark model={props.model} className={props.markClassName} />\n )}\n <span className=\"min-w-0 truncate\">{name}</span>\n </span>\n );\n}\n","import { ClaudeMark } from \"./claude-mark\";\nimport { GrokMark } from \"./grok-mark\";\nimport { ChatGptMark, ModelMark, modelHasMark } from \"./model-mark\";\nimport { modelDisplayName, modelLogoUrl } from \"@opengeni/sdk/model-display\";\nimport type { ClientModel, LatencyMode, ReasoningEffort } from \"@opengeni/sdk\";\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n Globe2Icon,\n KeyRoundIcon,\n SparklesIcon,\n ZapIcon,\n} from \"lucide-react\";\nimport { motion, useReducedMotion } from \"motion/react\";\nimport {\n Suspense,\n lazy,\n useMemo,\n useId,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n billingClassForMissingSelection,\n defaultModelPolicyPickerMessages,\n effectiveRows as sharedEffectiveRows,\n groupPresentationFor,\n SCOPED_BILLING_HINTS,\n type ModelPickerGroupPresentation,\n type ModelPolicyPickerMessages,\n} from \"../model-picker-model\";\nimport { MENU_CHEVRON_CLASS } from \"../lib/menu-styles\";\nimport { usePortalTokenSource, usePortalTokenStyle } from \"../lib/use-portal-token-style\";\nimport {\n findPickerRow,\n labelReasoningEffort,\n modelOffersEffortChoice,\n type PickerBillingClass,\n type PickerModelRow,\n} from \"../model-policy\";\n\nconst LazyModelPolicyPickerMenu = lazy(() =>\n import(\"./model-policy-picker-menu\").then(({ ModelPolicyPickerPopover }) => ({\n default: ModelPolicyPickerPopover,\n })),\n);\n\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\n/** Presentation only; never changes model identity, billing or availability. */\nexport type ModelPolicyPickerGroupPresentation = ModelPickerGroupPresentation<ReactNode>;\n\nexport { defaultModelPolicyPickerMessages, groupPresentationFor, SCOPED_BILLING_HINTS };\nexport type { ModelPolicyPickerMessages };\n\nexport type ModelPolicyPickerProps = {\n /** Host branding for payment-source groups, shared by menu and trigger. */\n groupPresentation?: ModelPolicyPickerGroupPresentation | undefined;\n /** Lightweight deployment models. Catalog rows take precedence when supplied. */\n models?: ClientModel[] | undefined;\n /** Warn only when the draft actually contains images this model cannot view. */\n hasImageAttachments?: boolean | undefined;\n /** Catalog-backed rows with availability and billing-class truth. */\n rows?: PickerModelRow[] | undefined;\n model: string;\n effort: ReasoningEffort;\n latencyMode: LatencyMode;\n disabled?: boolean | undefined;\n loading?: boolean | undefined;\n error?: string | null | undefined;\n /** Controlled menu state. Omit for the built-in uncontrolled behavior. */\n open?: boolean | undefined;\n /** Initial menu state when `open` is uncontrolled. */\n defaultOpen?: boolean | undefined;\n onOpenChange?: ((open: boolean) => void) | undefined;\n /** Non-Codex models stay visible but cannot be selected. */\n codexOnly?: boolean | undefined;\n /** Identity of the current session scope. */\n sessionKey?: string | undefined;\n /** Prefer bottom on new-chat surfaces and top for bottom-docked composers. */\n menuSide?: \"top\" | \"bottom\" | undefined;\n /**\n * Default true: show models the way people choose them, with clean names,\n * maker marks, one \"API keys\" group for organization- and workspace-connected\n * keys, and one row for identical copies. Models settings passes false to\n * keep its scope-aware presentation (raw catalog labels, scoped groups).\n */\n collapseScopes?: boolean | undefined;\n /** Hide latency controls on surfaces whose saved policy does not include latency. */\n allowLatencyMode?: boolean | undefined;\n /** Settings → Models. Shown when the catalog has no model that can run. */\n connectModelsHref?: string | undefined;\n /** Classes for the portalled menu surface. Prefer --og-* tokens for theming. */\n contentClassName?: string | undefined;\n /** Inline styles for the portalled menu, applied after inherited --og-* tokens. */\n contentStyle?: CSSProperties | undefined;\n className?: string | undefined;\n /**\n * \"pill\" (default) is the composer's quiet rounded trigger with the effort.\n * \"field\" is a settings control: a bordered rectangle with the model name\n * and `triggerMeta` (for example the payer) in muted text. The effort stays\n * in the menu.\n */\n triggerStyle?: \"pill\" | \"field\" | undefined;\n /** Muted text after the model name in the \"field\" trigger. */\n triggerMeta?: ReactNode;\n messages?: Partial<ModelPolicyPickerMessages> | undefined;\n onModelChange: (modelId: string) => void;\n onEffortChange: (effort: ReasoningEffort) => void;\n onLatencyModeChange: (latencyMode: LatencyMode) => void;\n};\n\nconst SLIDE_EASE = [0.22, 1, 0.36, 1] as const;\n\nexport function BillingClassMark(props: {\n billingClass: PickerBillingClass;\n presentation?: ModelPolicyPickerGroupPresentation[PickerBillingClass] | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n}) {\n const labels: Record<PickerBillingClass, string> = {\n opengeni_credits: \"Models\",\n external: \"External provider\",\n codex_subscription: \"Codex\",\n supergrok_subscription: \"SuperGrok\",\n claude_subscription: \"Claude\",\n byok: \"API key\",\n organization_byok: \"API key\",\n };\n if (props.presentation?.icon === null) return null;\n const label = props[\"aria-label\"] ?? props.presentation?.label ?? labels[props.billingClass];\n const accessibility =\n label.length === 0\n ? { \"aria-hidden\": true as const }\n : { role: \"img\" as const, \"aria-label\": label };\n const shell = cn(\n \"inline-flex size-3.5 shrink-0 items-center justify-center overflow-hidden text-og-fg-subtle [&>svg]:size-full [&>img]:size-full\",\n props.className,\n );\n const mark = \"size-3.5\";\n return (\n <span\n className={shell}\n data-testid={`billing-class-icon-${props.billingClass}`}\n {...accessibility}\n >\n {props.presentation?.icon !== undefined ? (\n props.presentation.icon\n ) : props.billingClass === \"opengeni_credits\" ? (\n <SparklesIcon className={mark} aria-hidden />\n ) : props.billingClass === \"external\" ? (\n <Globe2Icon className={mark} aria-hidden />\n ) : props.billingClass === \"codex_subscription\" ? (\n <ChatGptMark className={mark} />\n ) : props.billingClass === \"claude_subscription\" ? (\n <ClaudeMark className={mark} />\n ) : props.billingClass === \"supergrok_subscription\" ? (\n <GrokMark className={mark} />\n ) : (\n <KeyRoundIcon className={mark} aria-hidden />\n )}\n </span>\n );\n}\n\n/**\n * The trigger shows who makes the chosen model. Subscription rails already\n * carry their maker's mark (ChatGPT, Claude, Grok). Configured catalog logos win\n * in collapsed model presentation; otherwise explicit host branding wins and models show\n * the maker's logo instead of a generic key, falling back to the group mark.\n */\nfunction SelectedModelMark(input: {\n props: ModelPolicyPickerProps;\n selected: ClientPickerModelRow | null;\n}) {\n const billingClass =\n input.selected?.billingClass ?? billingClassForMissingSelection(input.props.model);\n const presentation = groupPresentationFor(input.props, billingClass);\n const model = input.selected?.catalog ?? input.props.model;\n if (input.props.collapseScopes === false) {\n return (\n <BillingClassMark\n billingClass={billingClass}\n presentation={presentation}\n aria-label={presentation?.label ?? SCOPED_MARK_LABELS[billingClass]}\n className=\"text-og-fg\"\n />\n );\n }\n if (modelLogoUrl(model)) {\n return <ModelMark model={model} className=\"text-og-fg\" />;\n }\n if (\n presentation?.icon !== undefined ||\n BRANDED_BILLING_CLASSES.has(billingClass) ||\n !modelHasMark(model)\n ) {\n return (\n <BillingClassMark\n billingClass={billingClass}\n presentation={presentation}\n className=\"text-og-fg\"\n />\n );\n }\n return <ModelMark model={model} className=\"text-og-fg\" />;\n}\n\nconst SCOPED_MARK_LABELS: Partial<Record<PickerBillingClass, string>> = {\n byok: \"Workspace provider account\",\n organization_byok: \"Organization provider account\",\n};\n\n/** A selection the catalog no longer lists: its clean name (settings keep the id). */\nfunction fallbackName(props: ModelPolicyPickerProps): string {\n return props.collapseScopes === false ? props.model : modelDisplayName(props.model);\n}\n\nconst BRANDED_BILLING_CLASSES: ReadonlySet<PickerBillingClass> = new Set([\n \"codex_subscription\",\n \"claude_subscription\",\n \"supergrok_subscription\",\n]);\n\nexport function effectiveRows(props: ModelPolicyPickerProps): ClientPickerModelRow[] {\n return sharedEffectiveRows(props);\n}\n\nexport function PickerNavRow(props: {\n label: string;\n hint?: string | undefined;\n icon?: ReactNode;\n trailing?: ReactNode;\n showChevron?: boolean | undefined;\n disabled?: boolean | undefined;\n title?: string | undefined;\n description?: string | undefined;\n active?: boolean | undefined;\n testId?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n disabled={props.disabled}\n title={props.title}\n aria-description={props.description}\n onClick={props.onClick}\n data-testid={props.testId}\n className={cn(\n // The one menu row (lib/menu-styles.ts), with density tokens for embedders.\n \"flex min-h-8 w-full cursor-pointer items-center gap-2.5 rounded-og-md px-[var(--og-model-picker-row-padding-x)] py-[var(--og-model-picker-row-padding-y)] text-left text-og-fg outline-hidden transition-colors duration-[120ms] hover:bg-og-hover focus-visible:bg-og-hover focus-visible:outline-2 focus-visible:-outline-offset-2! focus-visible:outline-og-accent/55 pointer-coarse:min-h-11\",\n props.disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {props.icon}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-menu\">{props.label}</span>\n {props.hint ? (\n <span className=\"mt-0.5 block truncate text-og-sm text-og-fg-muted\">{props.hint}</span>\n ) : null}\n </span>\n {props.trailing ? <span className=\"ml-auto shrink-0\">{props.trailing}</span> : null}\n {props.showChevron === false ? null : <ChevronRightIcon className={MENU_CHEVRON_CLASS} />}\n </button>\n );\n}\n\nexport function PickerBackHeader(props: {\n label: string;\n icon?: ReactNode;\n onBack: () => void;\n trailing?: ReactNode;\n}) {\n return (\n <div className=\"mb-1.5 flex min-h-9 items-center gap-1 border-b border-og-border pb-1.5\">\n <button\n type=\"button\"\n onClick={props.onBack}\n data-testid=\"model-picker-back\"\n className=\"flex min-h-8 min-w-0 flex-1 cursor-pointer items-center gap-1 rounded-og-md pr-2.5 text-left text-og-fg outline-hidden transition-colors duration-[120ms] hover:bg-og-hover focus-visible:outline-2 focus-visible:-outline-offset-2! focus-visible:outline-og-accent/55 pointer-coarse:min-h-11\"\n >\n <span className=\"flex size-8 shrink-0 items-center justify-center text-og-fg-muted\">\n <ChevronLeftIcon className=\"size-4\" />\n </span>\n {props.icon}\n <span className=\"min-w-0 flex-1 truncate text-og-menu font-medium\">{props.label}</span>\n </button>\n {props.trailing ? <div className=\"relative z-10 shrink-0\">{props.trailing}</div> : null}\n </div>\n );\n}\n\nexport function PickerAnimatedPage(props: {\n pageKey: string;\n direction: 1 | -1;\n children: ReactNode;\n}) {\n const reduceMotion = useReducedMotion();\n return (\n <motion.div\n key={props.pageKey}\n initial={reduceMotion ? false : { x: props.direction * 14, opacity: 0 }}\n animate={{ x: 0, opacity: 1 }}\n transition={{ duration: reduceMotion ? 0 : 0.18, ease: SLIDE_EASE }}\n className=\"w-full\"\n >\n {props.children}\n </motion.div>\n );\n}\n\n/** @internal Shared controlled/uncontrolled state seam. */\nexport function useModelPolicyPickerState(props: ModelPolicyPickerProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(props.defaultOpen ?? false);\n const open = props.open ?? uncontrolledOpen;\n const setOpen = (next: boolean) => {\n if (props.open === undefined) setUncontrolledOpen(next);\n props.onOpenChange?.(next);\n };\n return { open, setOpen, rows: effectiveRows(props) };\n}\n\nexport function ModelPolicyPicker(props: ModelPolicyPickerProps) {\n const contentId = useId();\n const trigger = usePortalTokenSource<HTMLButtonElement>();\n const portalStyle = usePortalTokenStyle(trigger.source);\n const messages = useMemo(\n () => ({ ...defaultModelPolicyPickerMessages, ...props.messages }),\n [props.messages],\n );\n const { open, setOpen, rows } = useModelPolicyPickerState(props);\n const selected = findPickerRow(rows, props.model);\n const needsModel =\n !rows.some((row) => row.selectable) && (rows.length > 0 || Boolean(props.connectModelsHref));\n const selectedDescription = needsModel\n ? messages.connectTitle\n : [selected?.label ?? fallbackName(props), labelReasoningEffort(props.effort)].join(\" · \");\n\n if (props.loading) {\n return (\n <span\n className={cn(\n \"og-root inline-flex h-8 w-40 shrink-0 animate-pulse rounded-full bg-og-surface-2\",\n props.triggerStyle === \"field\" && \"w-[180px] rounded-og-md\",\n props.className,\n )}\n aria-label={messages.loading}\n data-testid=\"model-picker-loading\"\n />\n );\n }\n if (props.triggerStyle === \"field\") {\n return (\n <>\n <button\n ref={trigger.ref}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n data-state={open ? \"open\" : \"closed\"}\n data-trigger-style=\"field\"\n onClick={() => setOpen(!open)}\n disabled={props.disabled}\n aria-label={messages.label}\n aria-description={selectedDescription}\n className={cn(\n \"og-root inline-flex h-8 min-w-[180px] max-w-full items-center gap-2 rounded-og-md border border-og-border bg-og-surface px-2.5 text-sm text-og-fg outline-hidden transition-colors hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50\",\n props.className,\n )}\n >\n {needsModel ? (\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n <SelectedModelMark props={props} selected={selected} />\n )}\n <span className=\"min-w-0 truncate font-medium\">\n {needsModel ? messages.connectTitle : (selected?.label ?? fallbackName(props))}\n </span>\n {props.triggerMeta && !needsModel ? (\n <span className=\"min-w-0 shrink-[9999] truncate text-og-fg-muted\">\n {props.triggerMeta}\n </span>\n ) : null}\n <ChevronDownIcon className=\"ml-auto size-3.5 shrink-0 text-og-fg-muted\" />\n </button>\n {open ? (\n <Suspense fallback={null}>\n <LazyModelPolicyPickerMenu\n {...props}\n anchor={trigger.currentRef}\n contentId={contentId}\n portalStyle={portalStyle}\n onOpenChange={setOpen}\n />\n </Suspense>\n ) : null}\n </>\n );\n }\n return (\n <>\n <button\n ref={trigger.ref}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n data-state={open ? \"open\" : \"closed\"}\n onClick={() => setOpen(!open)}\n disabled={props.disabled}\n aria-label={messages.label}\n aria-description={selectedDescription}\n className={cn(\n // Phone: the composer row also carries attach, dictate, voice, pause\n // and send, so the pill drops its chevron and tightens its padding\n // to keep the model's short name readable.\n \"og-root og-model-policy-trigger inline-flex h-[var(--og-model-picker-trigger-height)] min-w-0 max-w-64 items-center gap-1 rounded-full border px-2.5 text-og-control outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:cursor-not-allowed disabled:opacity-50 max-sm:h-11 max-sm:max-w-[7.5rem] max-sm:gap-0.5 max-sm:px-1.5\",\n // With no usable model the pill is the one thing that unblocks the\n // composer, so it takes the primary wash.\n needsModel\n ? \"border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover\"\n : \"border-transparent text-og-fg-muted hover:border-og-border hover:bg-og-surface-2 hover:text-og-fg\",\n props.className,\n )}\n >\n {needsModel ? (\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n <SelectedModelMark props={props} selected={selected} />\n )}\n <span className=\"og-model-policy-label-full min-w-0 truncate font-medium text-og-fg max-sm:hidden @max-[20rem]/model-controls:hidden\">\n {needsModel ? messages.connectTitle : (selected?.label ?? fallbackName(props))}\n </span>\n <span className=\"og-model-policy-label-short min-w-0 truncate font-medium text-og-fg sm:hidden @max-[20rem]/model-controls:block\">\n {needsModel\n ? messages.connectTitle\n : (selected?.shortLabel ?? selected?.label ?? fallbackName(props))}\n </span>\n {selected && !needsModel && modelOffersEffortChoice(selected.catalog) ? (\n <span\n className=\"og-model-policy-effort min-w-0 shrink-[9999] truncate\"\n title={labelReasoningEffort(props.effort)}\n >\n {labelReasoningEffort(props.effort)}\n </span>\n ) : null}\n {props.latencyMode === \"fast\" && !needsModel ? (\n <ZapIcon\n className=\"size-3.5 shrink-0 fill-current stroke-current text-og-fg\"\n aria-label={messages.fast}\n data-testid=\"model-picker-fast-icon\"\n />\n ) : null}\n <ChevronDownIcon className=\"og-model-policy-chevron size-3 shrink-0 max-sm:hidden\" />\n </button>\n\n {open ? (\n <Suspense fallback={null}>\n <LazyModelPolicyPickerMenu\n {...props}\n anchor={trigger.currentRef}\n contentId={contentId}\n portalStyle={portalStyle}\n onOpenChange={setOpen}\n />\n </Suspense>\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","modelDisplayName","modelLogoUrl","SparklesIcon","useState","jsx","jsxs","jsx","SparklesIcon","modelLogoUrl","modelDisplayName","effectiveRows","jsxs","useState"]}
@@ -3,7 +3,10 @@ import {
3
3
  buildTimeline,
4
4
  groupTimeline,
5
5
  sessionStatusFromEvents
6
- } from "./chunk-QMMCJGFI.js";
6
+ } from "./chunk-6BAMPGBV.js";
7
+ import {
8
+ isActionableHumanInputRequest
9
+ } from "./chunk-IZV5FTJC.js";
7
10
  import {
8
11
  useDebouncedCallback,
9
12
  useMutationRunner,
@@ -23,53 +26,6 @@ import {
23
26
  useEmbeddedSessionRead
24
27
  } from "./chunk-XTD7TZHW.js";
25
28
 
26
- // src/human-input.ts
27
- function isActionableHumanInputRequest(request, nowMs = Date.now()) {
28
- if (request.status !== "pending") return false;
29
- if (!request.expiresAt) return true;
30
- const deadline = Date.parse(request.expiresAt);
31
- return Number.isFinite(deadline) && deadline > nowMs;
32
- }
33
- function humanInputRequestFromEvent(event) {
34
- if (event.type !== "session.humanInput.requested" || !isRecord(event.payload)) return null;
35
- const request = event.payload.request;
36
- if (!isRecord(request) || typeof request.id !== "string" || !Array.isArray(request.questions)) {
37
- return null;
38
- }
39
- return {
40
- id: request.id,
41
- turnId: event.turnId ?? null,
42
- questions: request.questions,
43
- allowSkip: request.allowSkip === true,
44
- expiresAt: typeof request.expiresAt === "string" ? request.expiresAt : null
45
- };
46
- }
47
- function projectPendingHumanInputRequests(events) {
48
- const pending = /* @__PURE__ */ new Map();
49
- for (const event of events) {
50
- const requested = humanInputRequestFromEvent(event);
51
- if (requested) {
52
- pending.set(requested.id, requested);
53
- continue;
54
- }
55
- if (event.type === "user.humanInputResponse" && isRecord(event.payload)) {
56
- if (typeof event.payload.requestId === "string") pending.delete(event.payload.requestId);
57
- continue;
58
- }
59
- if (event.type === "turn.completed" || event.type === "turn.failed" || event.type === "turn.cancelled") {
60
- for (const [id, request] of pending) {
61
- if (request.turnId === null || event.turnId === null || event.turnId === void 0 || request.turnId === event.turnId) {
62
- pending.delete(id);
63
- }
64
- }
65
- }
66
- }
67
- return [...pending.values()];
68
- }
69
- function isRecord(value) {
70
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
71
- }
72
-
73
29
  // src/approvals.ts
74
30
  import {
75
31
  parseToolDisplayMetadata
@@ -892,7 +848,7 @@ function useSessionEvents(sessionId, options = {}) {
892
848
  let generation = navigationGenerationRef.current;
893
849
  const current = () => ownsNavigation() && generation === navigationGenerationRef.current;
894
850
  try {
895
- const { resolveLatestQuestion } = await import("./latest-question-2POFPYNB.js");
851
+ const { resolveLatestQuestion } = await import("./latest-question-27HGRPVF.js");
896
852
  if (!current()) return null;
897
853
  const destination = await resolveLatestQuestion({
898
854
  client,
@@ -2253,7 +2209,7 @@ function useSessionControl(sessionId, options = {}) {
2253
2209
 
2254
2210
  // src/hooks/use-goal.ts
2255
2211
  import { OpenGeniApiError } from "@opengeni/sdk";
2256
- import { useCallback as useCallback7, useEffect as useEffect6, useRef as useRef7, useState as useState6 } from "react";
2212
+ import { useCallback as useCallback7, useEffect as useEffect6, useLayoutEffect as useLayoutEffect3, useRef as useRef7, useState as useState6 } from "react";
2257
2213
  function isGoalEvent(event) {
2258
2214
  return event.type.startsWith("goal.");
2259
2215
  }
@@ -2274,7 +2230,13 @@ function useGoal(sessionId, options = {}) {
2274
2230
  const generation = useRef7(0);
2275
2231
  const targetKeyRef = useRef7(null);
2276
2232
  const goalAbsentRef = useRef7(false);
2233
+ const pendingRefreshRef = useRef7("none");
2234
+ const sharedEventsRef = useRef7(sharedEvents);
2235
+ useLayoutEffect3(() => {
2236
+ sharedEventsRef.current = sharedEvents;
2237
+ }, [sharedEvents]);
2277
2238
  const loadAbort = useRef7(null);
2239
+ const scheduleRefreshRef = useRef7(() => void 0);
2278
2240
  const retireLoads = useCallback7(() => {
2279
2241
  generation.current += 1;
2280
2242
  loadAbort.current?.abort();
@@ -2285,15 +2247,14 @@ function useGoal(sessionId, options = {}) {
2285
2247
  return;
2286
2248
  }
2287
2249
  const ticket = ++generation.current;
2250
+ pendingRefreshRef.current = "none";
2288
2251
  loadAbort.current?.abort();
2289
2252
  const controller = new AbortController();
2290
2253
  loadAbort.current = controller;
2291
2254
  try {
2292
- const fetched = await client.getGoal(workspaceId, sessionId, {
2293
- signal: controller.signal
2294
- });
2255
+ const fetched = typeof client.findGoal === "function" ? await client.findGoal(workspaceId, sessionId, { signal: controller.signal }) : await client.getGoal(workspaceId, sessionId, { signal: controller.signal });
2295
2256
  if (ticket === generation.current) {
2296
- goalAbsentRef.current = false;
2257
+ goalAbsentRef.current = fetched === null;
2297
2258
  setGoal(fetched);
2298
2259
  setError(null);
2299
2260
  setLoading(false);
@@ -2313,12 +2274,30 @@ function useGoal(sessionId, options = {}) {
2313
2274
  } finally {
2314
2275
  if (loadAbort.current === controller) loadAbort.current = null;
2315
2276
  }
2277
+ if (ticket !== generation.current || pendingRefreshRef.current === "none") {
2278
+ return;
2279
+ }
2280
+ if (goalAbsentRef.current && pendingRefreshRef.current === "refresh") {
2281
+ const events = sharedEventsRef.current ?? [];
2282
+ let latestGoalEvent;
2283
+ for (let index = events.length - 1; index >= 0 && !latestGoalEvent; index -= 1) {
2284
+ const event = events[index];
2285
+ if (event && isGoalEvent(event)) latestGoalEvent = event;
2286
+ }
2287
+ if (!latestGoalEvent || latestGoalEvent.type === "goal.cleared") {
2288
+ pendingRefreshRef.current = "none";
2289
+ return;
2290
+ }
2291
+ pendingRefreshRef.current = "goal";
2292
+ }
2293
+ scheduleRefreshRef.current();
2316
2294
  }, [client, workspaceId, sessionId]);
2317
2295
  useEffect6(() => {
2318
2296
  const targetKey = `${workspaceId} ${sessionId ?? ""}`;
2319
2297
  if (targetKeyRef.current !== targetKey) {
2320
2298
  targetKeyRef.current = targetKey;
2321
2299
  goalAbsentRef.current = false;
2300
+ pendingRefreshRef.current = "none";
2322
2301
  setGoal(null);
2323
2302
  setError(null);
2324
2303
  }
@@ -2367,12 +2346,31 @@ function useGoal(sessionId, options = {}) {
2367
2346
  retireLoads,
2368
2347
  sharedFeed
2369
2348
  ]);
2370
- const scheduleRefresh = useDebouncedCallback(() => void load());
2349
+ const scheduleRefresh = useDebouncedCallback(() => {
2350
+ const pending = pendingRefreshRef.current;
2351
+ if (pending === "none" || loadAbort.current !== null) return;
2352
+ if (pending === "refresh" && goalAbsentRef.current) {
2353
+ pendingRefreshRef.current = "none";
2354
+ return;
2355
+ }
2356
+ void load();
2357
+ });
2358
+ useLayoutEffect3(() => {
2359
+ scheduleRefreshRef.current = scheduleRefresh;
2360
+ }, [scheduleRefresh]);
2371
2361
  const isRefreshEvent = useCallback7(
2372
2362
  (event) => goalAbsentRef.current ? isGoalEvent(event) : isGoalRefreshEvent(event),
2373
2363
  []
2374
2364
  );
2375
- useSessionEventTrigger(client, workspaceId, sessionId, isRefreshEvent, scheduleRefresh, {
2365
+ const onRefreshEvent = useCallback7(
2366
+ (event) => {
2367
+ if (isGoalEvent(event)) pendingRefreshRef.current = "goal";
2368
+ else if (pendingRefreshRef.current === "none") pendingRefreshRef.current = "refresh";
2369
+ scheduleRefresh();
2370
+ },
2371
+ [scheduleRefresh]
2372
+ );
2373
+ useSessionEventTrigger(client, workspaceId, sessionId, isRefreshEvent, onRefreshEvent, {
2376
2374
  enabled,
2377
2375
  ...sharedEvents !== void 0 ? { events: sharedEvents } : {}
2378
2376
  });
@@ -2489,9 +2487,6 @@ function conversationTimeline(items, queue, composer) {
2489
2487
  }
2490
2488
 
2491
2489
  export {
2492
- isActionableHumanInputRequest,
2493
- humanInputRequestFromEvent,
2494
- projectPendingHumanInputRequests,
2495
2490
  approvalsFromRequiresAction,
2496
2491
  projectPendingApprovals,
2497
2492
  invokeOlderHistoryLoaderWithReceiptCapture,
@@ -2514,4 +2509,4 @@ export {
2514
2509
  useGoal,
2515
2510
  conversationTimeline
2516
2511
  };
2517
- //# sourceMappingURL=chunk-G6YRCIYJ.js.map
2512
+ //# sourceMappingURL=chunk-YK6QMGVL.js.map