@opengeni/react 1.4.2 → 1.4.5-canary.37458084490001

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 (240) 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-WGJ43YGI.js → browser-viewer-CV23VIHB.js} +8 -6
  6. package/dist/chunk-3ZC6QPOM.js +174 -0
  7. package/dist/chunk-3ZC6QPOM.js.map +1 -0
  8. package/dist/{chunk-YVFRBXST.js → chunk-4BCVCJSU.js} +2 -2
  9. package/dist/{chunk-JHTIMBOL.js → chunk-5JSUNNQN.js} +26 -4
  10. package/dist/{chunk-JHTIMBOL.js.map → chunk-5JSUNNQN.js.map} +1 -1
  11. package/dist/{chunk-MDIXFKA3.js → chunk-6FOTSVWU.js} +303 -109
  12. package/dist/chunk-6FOTSVWU.js.map +1 -0
  13. package/dist/{chunk-IUHHPMAX.js → chunk-7RRBX5EM.js} +14 -85
  14. package/dist/chunk-7RRBX5EM.js.map +1 -0
  15. package/dist/{chunk-L2J3PU7A.js → chunk-7ZB7I3KP.js} +24 -98
  16. package/dist/chunk-7ZB7I3KP.js.map +1 -0
  17. package/dist/{chunk-LVS3MH5T.js → chunk-ATIRUHBZ.js} +128 -10
  18. package/dist/chunk-ATIRUHBZ.js.map +1 -0
  19. package/dist/chunk-BOFEQC6K.js +162 -0
  20. package/dist/chunk-BOFEQC6K.js.map +1 -0
  21. package/dist/{chunk-VCSERYXH.js → chunk-CESBPQP5.js} +309 -162
  22. package/dist/chunk-CESBPQP5.js.map +1 -0
  23. package/dist/{chunk-IYQCWGU5.js → chunk-GHJU7XG7.js} +35 -62
  24. package/dist/chunk-GHJU7XG7.js.map +1 -0
  25. package/dist/{chunk-G6YRCIYJ.js → chunk-HNVWMDNN.js} +55 -60
  26. package/dist/chunk-HNVWMDNN.js.map +1 -0
  27. package/dist/{chunk-PHBFJCEU.js → chunk-I5EGRXXG.js} +110 -7
  28. package/dist/chunk-I5EGRXXG.js.map +1 -0
  29. package/dist/{chunk-PBCZL4JP.js → chunk-INIZSNXT.js} +2 -2
  30. package/dist/{chunk-XS67YG5R.js → chunk-IX3K4THH.js} +24 -3
  31. package/dist/chunk-IX3K4THH.js.map +1 -0
  32. package/dist/chunk-IZV5FTJC.js +55 -0
  33. package/dist/chunk-IZV5FTJC.js.map +1 -0
  34. package/dist/chunk-JDJJMBB3.js +1883 -0
  35. package/dist/chunk-JDJJMBB3.js.map +1 -0
  36. package/dist/{chunk-C5BF4L26.js → chunk-KHF2VRXF.js} +7 -7
  37. package/dist/{chunk-QMMCJGFI.js → chunk-L5OKM2VX.js} +2 -2
  38. package/dist/chunk-LHF6BVM4.js +83 -0
  39. package/dist/chunk-LHF6BVM4.js.map +1 -0
  40. package/dist/chunk-N7S72EXK.js +25 -0
  41. package/dist/chunk-N7S72EXK.js.map +1 -0
  42. package/dist/{chunk-CVYCLFMH.js → chunk-PEHTX3V7.js} +19 -1
  43. package/dist/chunk-PEHTX3V7.js.map +1 -0
  44. package/dist/chunk-R5R5RQQD.js +51 -0
  45. package/dist/chunk-R5R5RQQD.js.map +1 -0
  46. package/dist/chunk-RI42H5IU.js +326 -0
  47. package/dist/chunk-RI42H5IU.js.map +1 -0
  48. package/dist/{chunk-JH7V627O.js → chunk-SHLZMAJN.js} +2 -11
  49. package/dist/chunk-SHLZMAJN.js.map +1 -0
  50. package/dist/{chunk-CREMJMVN.js → chunk-TZQSHCZN.js} +692 -1996
  51. package/dist/chunk-TZQSHCZN.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-46UIN7F3.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-3ZFWWJ6O.js} +6 -4
  76. package/dist/{embedded-voice-NIL4RDX3.js.map → embedded-voice-3ZFWWJ6O.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-computer-session.d.ts +2 -0
  80. package/dist/hooks/use-goal.d.ts +2 -1
  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-SWC6QEVN.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/machines.js +2 -2
  90. package/dist/model-mark-paths.d.ts +34 -0
  91. package/dist/model-mark-paths.js +16 -0
  92. package/dist/model-picker-model.d.ts +111 -0
  93. package/dist/model-picker-model.js +25 -0
  94. package/dist/model-picker-model.js.map +1 -0
  95. package/dist/{model-policy-picker-menu-WRNSRFQC.js → model-policy-picker-menu-NM4RPTY6.js} +6 -4
  96. package/dist/model-policy-picker-menu-NM4RPTY6.js.map +1 -0
  97. package/dist/model-policy.d.ts +10 -0
  98. package/dist/model-policy.js +5 -1
  99. package/dist/organization-model.d.ts +32 -0
  100. package/dist/organization-model.js +65 -0
  101. package/dist/organization-model.js.map +1 -0
  102. package/dist/{platform-activity-row-PJJVATTZ.js → platform-activity-row-NJ47YBXW.js} +7 -84
  103. package/dist/platform-activity-row-NJ47YBXW.js.map +1 -0
  104. package/dist/queue-presentation-model.d.ts +72 -0
  105. package/dist/queue-presentation-model.js +38 -0
  106. package/dist/queue-presentation-model.js.map +1 -0
  107. package/dist/{queue-surface-implementation-67FS7FUI.js → queue-surface-implementation-YPJFQ3O6.js} +24 -252
  108. package/dist/queue-surface-implementation-YPJFQ3O6.js.map +1 -0
  109. package/dist/realtime.js +5 -3
  110. package/dist/{sandbox-files-34CJJNOY.js → sandbox-files-RCVCMXG7.js} +5 -5
  111. package/dist/sandbox-files-RCVCMXG7.js.map +1 -0
  112. package/dist/sandbox-label-model.d.ts +23 -0
  113. package/dist/sandbox-label-model.js +28 -0
  114. package/dist/sandbox-label-model.js.map +1 -0
  115. package/dist/session-attention-model.d.ts +8 -0
  116. package/dist/session-attention-model.js +46 -0
  117. package/dist/session-attention-model.js.map +1 -0
  118. package/dist/session-feedback-model.d.ts +20 -0
  119. package/dist/session-feedback-model.js +56 -0
  120. package/dist/session-feedback-model.js.map +1 -0
  121. package/dist/session-list-model.d.ts +96 -0
  122. package/dist/session-list-model.js +219 -0
  123. package/dist/session-list-model.js.map +1 -0
  124. package/dist/session-status-model.d.ts +19 -0
  125. package/dist/session-ui.js +26 -17
  126. package/dist/session-ui.js.map +1 -1
  127. package/dist/session.js +8 -6
  128. package/dist/testing/session-scenarios.d.ts +10 -0
  129. package/dist/testing/session-scenarios.js +303 -0
  130. package/dist/testing/session-scenarios.js.map +1 -0
  131. package/dist/timeline/genie-copy.d.ts +3 -0
  132. package/dist/timeline/genie-loading.d.ts +11 -0
  133. package/dist/timeline/index.d.ts +1 -1
  134. package/dist/timeline/notice-presentation.d.ts +7 -0
  135. package/dist/timeline/patch-apply-command.d.ts +18 -0
  136. package/dist/timeline/platform-activity-presentation.d.ts +7 -0
  137. package/dist/timeline/presented-image.d.ts +6 -1
  138. package/dist/timeline/question-nav-model.d.ts +23 -0
  139. package/dist/timeline/registry.d.ts +10 -1
  140. package/dist/timeline/retained-loaders.d.ts +1 -1
  141. package/dist/timeline/tool-presentation.d.ts +172 -0
  142. package/dist/timeline/turn-summary-model.d.ts +90 -0
  143. package/dist/timeline/turn-summary.d.ts +4 -74
  144. package/dist/timeline/work-presentation.d.ts +42 -0
  145. package/dist/timeline-model.d.ts +24 -0
  146. package/dist/timeline-model.js +152 -0
  147. package/dist/timeline-model.js.map +1 -0
  148. package/package.json +47 -3
  149. package/src/artifacts.ts +1 -0
  150. package/src/client.ts +9 -3
  151. package/src/components/browser-viewer.tsx +23 -2
  152. package/src/components/claude-mark.tsx +2 -1
  153. package/src/components/composer.tsx +4 -144
  154. package/src/components/computer-viewer.tsx +139 -30
  155. package/src/components/grok-mark.tsx +2 -1
  156. package/src/components/human-input-form.tsx +13 -124
  157. package/src/components/markdown.tsx +19 -1
  158. package/src/components/message-timeline.tsx +45 -99
  159. package/src/components/model-mark.tsx +2 -1
  160. package/src/components/model-policy-picker-menu.tsx +30 -85
  161. package/src/components/model-policy-picker.tsx +15 -148
  162. package/src/components/opper-mark.tsx +18 -0
  163. package/src/components/provider-recovery-notice.tsx +41 -0
  164. package/src/components/queue-surface-implementation.tsx +20 -349
  165. package/src/components/remark-soft-line-breaks.ts +166 -0
  166. package/src/components/sandbox-workspace.tsx +17 -1
  167. package/src/components/session-chrome.tsx +114 -99
  168. package/src/components/session-conversation.tsx +55 -6
  169. package/src/components/session-list.tsx +1 -1
  170. package/src/components/session-status.tsx +17 -16
  171. package/src/composer-messages.ts +150 -0
  172. package/src/connect-setup.tsx +45 -11
  173. package/src/connect.ts +1 -1
  174. package/src/hooks/shared-machines-list.ts +34 -1
  175. package/src/hooks/use-browser-session.ts +445 -168
  176. package/src/hooks/use-client-config-flags.ts +8 -0
  177. package/src/hooks/use-computer-session.ts +334 -98
  178. package/src/hooks/use-goal.ts +66 -10
  179. package/src/human-input-model.ts +147 -0
  180. package/src/index.ts +16 -0
  181. package/src/lib/clipboard.ts +29 -0
  182. package/src/lib/format.ts +7 -0
  183. package/src/lib/provider-recovery.ts +202 -0
  184. package/src/model-mark-paths.ts +53 -0
  185. package/src/model-picker-model.ts +330 -0
  186. package/src/model-policy.ts +43 -2
  187. package/src/organization-model.ts +118 -0
  188. package/src/queue-presentation-model.ts +464 -0
  189. package/src/sandbox-label-model.ts +41 -0
  190. package/src/session-attention-model.ts +59 -0
  191. package/src/session-feedback-model.ts +95 -0
  192. package/src/session-list-model.ts +327 -0
  193. package/src/session-status-model.ts +62 -0
  194. package/src/testing/session-scenarios.ts +326 -0
  195. package/src/timeline/activity-rail.tsx +5 -17
  196. package/src/timeline/genie-copy.ts +19 -0
  197. package/src/timeline/genie-loading.tsx +13 -18
  198. package/src/timeline/index.ts +1 -0
  199. package/src/timeline/notice-presentation.ts +22 -0
  200. package/src/timeline/patch-apply-command.tsx +135 -0
  201. package/src/timeline/platform-activity-presentation.ts +122 -0
  202. package/src/timeline/platform-activity-row.tsx +6 -96
  203. package/src/timeline/presented-image.ts +16 -2
  204. package/src/timeline/question-nav-model.ts +28 -0
  205. package/src/timeline/registry.ts +11 -1
  206. package/src/timeline/retained-loaders.ts +9 -4
  207. package/src/timeline/rolling-activity.tsx +7 -19
  208. package/src/timeline/tool-presentation.ts +1316 -0
  209. package/src/timeline/tool-renderers.tsx +226 -1025
  210. package/src/timeline/turn-summary-model.ts +338 -0
  211. package/src/timeline/turn-summary.tsx +21 -326
  212. package/src/timeline/work-presentation.ts +139 -0
  213. package/src/timeline-model.ts +108 -0
  214. package/styles/compiled.css +8 -0
  215. package/styles/connect.css +4 -0
  216. package/dist/chunk-CREMJMVN.js.map +0 -1
  217. package/dist/chunk-CVYCLFMH.js.map +0 -1
  218. package/dist/chunk-G6YRCIYJ.js.map +0 -1
  219. package/dist/chunk-HXYOSSQO.js +0 -117
  220. package/dist/chunk-HXYOSSQO.js.map +0 -1
  221. package/dist/chunk-IUHHPMAX.js.map +0 -1
  222. package/dist/chunk-IYQCWGU5.js.map +0 -1
  223. package/dist/chunk-JH7V627O.js.map +0 -1
  224. package/dist/chunk-L2J3PU7A.js.map +0 -1
  225. package/dist/chunk-LVS3MH5T.js.map +0 -1
  226. package/dist/chunk-MDIXFKA3.js.map +0 -1
  227. package/dist/chunk-PHBFJCEU.js.map +0 -1
  228. package/dist/chunk-VCSERYXH.js.map +0 -1
  229. package/dist/chunk-XS67YG5R.js.map +0 -1
  230. package/dist/platform-activity-row-PJJVATTZ.js.map +0 -1
  231. package/dist/queue-surface-implementation-67FS7FUI.js.map +0 -1
  232. /package/dist/{browser-viewer-WGJ43YGI.js.map → browser-viewer-CV23VIHB.js.map} +0 -0
  233. /package/dist/{chunk-YVFRBXST.js.map → chunk-4BCVCJSU.js.map} +0 -0
  234. /package/dist/{chunk-PBCZL4JP.js.map → chunk-INIZSNXT.js.map} +0 -0
  235. /package/dist/{chunk-C5BF4L26.js.map → chunk-KHF2VRXF.js.map} +0 -0
  236. /package/dist/{chunk-QMMCJGFI.js.map → chunk-L5OKM2VX.js.map} +0 -0
  237. /package/dist/{computer-viewer-46UIN7F3.js.map → composer-messages.js.map} +0 -0
  238. /package/dist/{model-policy-picker-menu-WRNSRFQC.js.map → computer-viewer-K4CKYRX6.js.map} +0 -0
  239. /package/dist/{latest-question-2POFPYNB.js.map → latest-question-SWC6QEVN.js.map} +0 -0
  240. /package/dist/{sandbox-files-34CJJNOY.js.map → model-mark-paths.js.map} +0 -0
@@ -8,22 +8,23 @@ import {
8
8
  useBrowserSession,
9
9
  useBrowserSessions,
10
10
  useSiteAuthConnections
11
- } from "./chunk-VCSERYXH.js";
11
+ } from "./chunk-CESBPQP5.js";
12
12
  import {
13
13
  ComputerViewer,
14
14
  useComputerFrameStream,
15
15
  useComputerSession,
16
16
  useComputerSessions
17
- } from "./chunk-MDIXFKA3.js";
17
+ } from "./chunk-6FOTSVWU.js";
18
18
  import {
19
19
  useInteractionInterventions,
20
20
  useInteractionInvalidation
21
21
  } from "./chunk-BNKV5ZLF.js";
22
- import "./chunk-CVYCLFMH.js";
22
+ import "./chunk-PEHTX3V7.js";
23
23
  import "./chunk-IMSUVYQB.js";
24
24
  import "./chunk-ZUWF4NF7.js";
25
- import "./chunk-LVS3MH5T.js";
25
+ import "./chunk-ATIRUHBZ.js";
26
26
  import "./chunk-TNEZNMSN.js";
27
+ import "./chunk-5I4VRWBB.js";
27
28
  import "./chunk-QHUE7E4N.js";
28
29
  import "./chunk-CM7LVUKC.js";
29
30
  import {
@@ -32,7 +33,6 @@ import {
32
33
  useEmbeddedInteraction,
33
34
  useEmbeddedInterventions
34
35
  } from "./chunk-XTD7TZHW.js";
35
- import "./chunk-5I4VRWBB.js";
36
36
  import "./chunk-TXS65BB2.js";
37
37
 
38
38
  // src/hooks/use-network-routes.ts
@@ -3,9 +3,9 @@ import {
3
3
  isTimelineUserQuestion,
4
4
  isTurnExecutionEvidence,
5
5
  timelineQuestionPlacement
6
- } from "./chunk-QMMCJGFI.js";
6
+ } from "./chunk-L5OKM2VX.js";
7
7
  import "./chunk-T46QZH3E.js";
8
- import "./chunk-LVS3MH5T.js";
8
+ import "./chunk-ATIRUHBZ.js";
9
9
 
10
10
  // src/hooks/latest-question.ts
11
11
  import { SESSION_EVENT_TYPES } from "@opengeni/sdk";
@@ -115,4 +115,4 @@ export {
115
115
  TIMELINE_TURN_ANCHOR_EVENT_TYPES,
116
116
  resolveLatestQuestion
117
117
  };
118
- //# sourceMappingURL=latest-question-2POFPYNB.js.map
118
+ //# sourceMappingURL=latest-question-SWC6QEVN.js.map
@@ -3,5 +3,12 @@
3
3
  * back to a short-lived textarea for older embeds / denied permissions.
4
4
  */
5
5
  export declare function copyTextToClipboard(text: string): Promise<boolean>;
6
+ /**
7
+ * Copy text that is still being prepared, such as a command around a freshly
8
+ * minted URL. Safari only allows a clipboard write during the click itself, so
9
+ * hand the pending text to a `ClipboardItem` where supported; otherwise wait
10
+ * for it and copy. Resolves false when the text failed or nothing was copied.
11
+ */
12
+ export declare function copyPendingTextToClipboard(text: Promise<string>): Promise<boolean>;
6
13
  /** Serialize an HTML table to tab-separated values (spreadsheet-friendly). */
7
14
  export declare function tableElementToTsv(table: HTMLTableElement | null | undefined): string;
@@ -0,0 +1,49 @@
1
+ import type { SessionEvent, SessionStatus } from "@opengeni/sdk";
2
+ /**
3
+ * Finite same-turn provider recovery, projected for people. Presentation only:
4
+ * the worker owns retry authority, pacing and the recovery budget. The worker
5
+ * (`apps/worker/src/activities/agent-turn/provider-recovery-copy.ts`) writes
6
+ * the same exhausted sentence into `turn.failed.error`; keep the two in step.
7
+ */
8
+ export type ProviderRecoveryCondition = "overloaded" | "unavailable" | "unresponsive" | "rate_limited";
9
+ export type ProviderRecoveryFacts = {
10
+ /** Recorded worker failure code (`provider_unavailable`, `mcp_transport_timeout`, ...). */
11
+ code: string;
12
+ condition: ProviderRecoveryCondition | null;
13
+ /** Display label of the affected model, when the route was recorded. */
14
+ modelLabel: string | null;
15
+ /** Display label of the serving provider, when the route was recorded. */
16
+ providerLabel: string | null;
17
+ /** Automatic retries scheduled (live) or spent (exhausted). */
18
+ attempt: number | null;
19
+ /** Finite automatic retry budget. */
20
+ maxAttempts: number | null;
21
+ /** True when the model route itself is affected, so another model may help. */
22
+ modelRoute: boolean;
23
+ };
24
+ /**
25
+ * Read a retryable `turn.recovery.requested` payload or an exhausted
26
+ * `turn.failed` payload. Returns null for every other recovery reason (human
27
+ * Retry, worker shutdown, credential rotation, capacity waits, ...).
28
+ */
29
+ export declare function parseProviderRecovery(payload: unknown): ProviderRecoveryFacts | null;
30
+ /** One present-tense clause naming what is unavailable, without a trailing period. */
31
+ export declare function providerRecoverySubject(facts: ProviderRecoveryFacts): string;
32
+ /** Live status while the same turn waits for its next automatic retry. */
33
+ export declare function providerRecoveryRetryingText(facts: ProviderRecoveryFacts): string;
34
+ /** Terminal sentence once the automatic budget is spent. */
35
+ export declare function providerRecoveryExhaustedText(facts: ProviderRecoveryFacts): string;
36
+ /**
37
+ * The active turn's current automatic provider retry, or null. Only a
38
+ * `recovering`, unpaused session qualifies, and only the newest boundary of its
39
+ * exact active turn counts, so merged or replayed pages never borrow another
40
+ * turn's diagnosis.
41
+ */
42
+ export declare function currentProviderRecovery(session: {
43
+ id: string;
44
+ status: SessionStatus | null | undefined;
45
+ activeTurnId: string | null | undefined;
46
+ effectiveControl?: {
47
+ state: string;
48
+ } | null | undefined;
49
+ }, events: readonly SessionEvent[]): ProviderRecoveryFacts | null;
package/dist/machines.js CHANGED
@@ -29,9 +29,9 @@ import {
29
29
  healthPulses,
30
30
  pointsFor,
31
31
  useMachines
32
- } from "./chunk-JHTIMBOL.js";
32
+ } from "./chunk-5JSUNNQN.js";
33
33
  import "./chunk-PKCAYHDC.js";
34
- import "./chunk-LVS3MH5T.js";
34
+ import "./chunk-ATIRUHBZ.js";
35
35
  import "./chunk-QHUE7E4N.js";
36
36
  import "./chunk-CM7LVUKC.js";
37
37
  import "./chunk-XTD7TZHW.js";
@@ -0,0 +1,34 @@
1
+ import { type ModelDisplayInput, type ModelVendor } from "@opengeni/sdk/model-display";
2
+ /** ChatGPT / OpenAI mark (Simple Icons, CC0). */
3
+ export declare const CHATGPT_MARK_PATH = "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";
4
+ /** Claude mark (Simple Icons, CC0; https://github.com/simple-icons/simple-icons). */
5
+ export declare const CLAUDE_MARK_PATH = "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";
6
+ /**
7
+ * MIT License
8
+ *
9
+ * Copyright (c) 2023 LobeHub
10
+ *
11
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ * of this software and associated documentation files (the "Software"), to deal
13
+ * in the Software without restriction, including without limitation the rights
14
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ * copies of the Software, and to permit persons to whom the Software is
16
+ * furnished to do so, subject to the following conditions:
17
+ *
18
+ * The above copyright notice and this permission notice shall be included in all
19
+ * copies or substantial portions of the Software.
20
+ *
21
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ * SOFTWARE.
28
+ * Source: https://raw.githubusercontent.com/lobehub/lobe-icons/master/src/Grok/components/Mono.tsx
29
+ */
30
+ export declare const GROK_MARK_PATH = "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";
31
+ export type MarkedModelVendor = Extract<ModelVendor, "openai" | "anthropic" | "xai">;
32
+ export declare const MODEL_MARK_PATHS: Record<MarkedModelVendor, string>;
33
+ /** The maker whose logo marks this model, or null for the neutral fallback. */
34
+ export declare function modelMarkVendor(model: ModelDisplayInput): MarkedModelVendor | null;
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import {
3
+ CHATGPT_MARK_PATH,
4
+ CLAUDE_MARK_PATH,
5
+ GROK_MARK_PATH,
6
+ MODEL_MARK_PATHS,
7
+ modelMarkVendor
8
+ } from "./chunk-N7S72EXK.js";
9
+ export {
10
+ CHATGPT_MARK_PATH,
11
+ CLAUDE_MARK_PATH,
12
+ GROK_MARK_PATH,
13
+ MODEL_MARK_PATHS,
14
+ modelMarkVendor
15
+ };
16
+ //# sourceMappingURL=model-mark-paths.js.map
@@ -0,0 +1,111 @@
1
+ /**
2
+ * The model picker's presentation logic, free of any renderer: which rows show,
3
+ * how they group and filter, and which thinking/latency controls apply. The web
4
+ * menu and native sheets both render from this.
5
+ */
6
+ import type { ClientModel, LatencyMode, ReasoningEffort } from "@opengeni/sdk";
7
+ import { type PickerBillingClass, type PickerModelRow } from "./model-policy.js";
8
+ type ClientPickerModelRow = PickerModelRow<ClientModel>;
9
+ export type ModelPolicyPickerMessages = {
10
+ label: string;
11
+ loading: string;
12
+ noModels: string;
13
+ connectTitle: string;
14
+ connectBody: string;
15
+ connectAction: string;
16
+ thinking: string;
17
+ fast: string;
18
+ fastRateHint: string;
19
+ codexOnly: string;
20
+ searchLabel?: string;
21
+ searchPlaceholder?: string;
22
+ currentModel?: string;
23
+ noMatches?: string;
24
+ unsupportedAttachments?: string;
25
+ thinkingEffort?: string;
26
+ selected?: string;
27
+ free?: string;
28
+ billingHints: Record<PickerBillingClass, string>;
29
+ };
30
+ export declare const defaultModelPolicyPickerMessages: ModelPolicyPickerMessages;
31
+ /** Host branding for one payment group; the icon type belongs to the renderer. */
32
+ export type ModelPickerGroupBranding<TIcon = unknown> = {
33
+ label?: string | undefined;
34
+ /** Omit to preserve the default; null hides the supporting text. */
35
+ description?: string | null | undefined;
36
+ /** Decorative, non-interactive content. Omit for the default; null hides it. */
37
+ icon?: TIcon | undefined;
38
+ };
39
+ export type ModelPickerGroupPresentation<TIcon = unknown> = Partial<Record<PickerBillingClass, ModelPickerGroupBranding<TIcon>>>;
40
+ /** The renderer-neutral inputs every picker surface shares. */
41
+ export type ModelPickerInput<TIcon = unknown> = {
42
+ groupPresentation?: ModelPickerGroupPresentation<TIcon> | undefined;
43
+ models?: ClientModel[] | undefined;
44
+ rows?: PickerModelRow[] | undefined;
45
+ hasImageAttachments?: boolean | undefined;
46
+ model: string;
47
+ effort: ReasoningEffort;
48
+ latencyMode: LatencyMode;
49
+ codexOnly?: boolean | undefined;
50
+ collapseScopes?: boolean | undefined;
51
+ allowLatencyMode?: boolean | undefined;
52
+ messages?: Partial<ModelPolicyPickerMessages> | undefined;
53
+ };
54
+ /** Models settings keeps naming who is billed for a key. */
55
+ export declare const SCOPED_BILLING_HINTS: Partial<Record<PickerBillingClass, string>>;
56
+ export declare function isCodexPickerModel(model: ClientModel): boolean;
57
+ /** The payment group a selection the catalog no longer lists most likely belonged to. */
58
+ export declare function billingClassForMissingSelection(modelId: string): PickerBillingClass;
59
+ /**
60
+ * Host branding for a payment group. While scopes are collapsed, API keys are
61
+ * one group, so either API-key presentation serves both.
62
+ */
63
+ export declare function groupPresentationFor<TIcon>(props: {
64
+ groupPresentation?: ModelPickerGroupPresentation<TIcon> | undefined;
65
+ collapseScopes?: boolean | undefined;
66
+ }, billingClass: PickerBillingClass): ModelPickerGroupBranding<TIcon> | undefined;
67
+ export declare function effectiveRows<TIcon>(props: ModelPickerInput<TIcon>): ClientPickerModelRow[];
68
+ export type ModelPickerMenuGroup = {
69
+ billingClass: PickerBillingClass;
70
+ label: string;
71
+ description: string | null;
72
+ rows: ClientPickerModelRow[];
73
+ };
74
+ export type ModelPickerThinking = {
75
+ efforts: ReasoningEffort[];
76
+ value: ReasoningEffort;
77
+ showThinking: boolean;
78
+ showFast: boolean;
79
+ /** The selected row cannot run, so its controls are read-only. */
80
+ disabled: boolean;
81
+ };
82
+ export type ModelPickerMenuView = {
83
+ messages: ModelPolicyPickerMessages;
84
+ rows: ClientPickerModelRow[];
85
+ selected: ClientPickerModelRow | null;
86
+ /** Any row can run; otherwise the surface offers to connect models instead. */
87
+ anySelectable: boolean;
88
+ /** Whether the query is non-empty (decides "no matches" versus "no models"). */
89
+ searching: boolean;
90
+ groups: ModelPickerMenuGroup[];
91
+ matchCount: number;
92
+ /** Thinking and Fast controls for the selected model, or null when it has none. */
93
+ thinking: ModelPickerThinking | null;
94
+ /** The selected model cannot view images the draft carries. */
95
+ unsupportedAttachments: boolean;
96
+ };
97
+ /** Everything a picker menu shows for this input and search query. */
98
+ export declare function modelPickerMenuView<TIcon>(props: ModelPickerInput<TIcon>, query: string): ModelPickerMenuView;
99
+ export type ModelPickerChoice = {
100
+ /** The new model, or null when the row is already selected. */
101
+ model: string | null;
102
+ /** Always reported, so hosts can commit model and effort together. */
103
+ effort: ReasoningEffort;
104
+ /** Fast falls back to standard when the new model cannot run it. */
105
+ latencyMode: LatencyMode | null;
106
+ };
107
+ /** What choosing a row changes, or null when the row cannot be chosen. */
108
+ export declare function modelPickerChoice(props: Pick<ModelPickerInput, "model" | "effort" | "latencyMode">, row: ClientPickerModelRow): ModelPickerChoice | null;
109
+ /** The web segmented control's short labels ("X-high" fits a phone row). */
110
+ export declare function compactEffortLabel(effort: ReasoningEffort, label: string): string;
111
+ export {};
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import {
3
+ SCOPED_BILLING_HINTS,
4
+ billingClassForMissingSelection,
5
+ compactEffortLabel,
6
+ defaultModelPolicyPickerMessages,
7
+ effectiveRows,
8
+ groupPresentationFor,
9
+ isCodexPickerModel,
10
+ modelPickerChoice,
11
+ modelPickerMenuView
12
+ } from "./chunk-3ZC6QPOM.js";
13
+ import "./chunk-IX3K4THH.js";
14
+ export {
15
+ SCOPED_BILLING_HINTS,
16
+ billingClassForMissingSelection,
17
+ compactEffortLabel,
18
+ defaultModelPolicyPickerMessages,
19
+ effectiveRows,
20
+ groupPresentationFor,
21
+ isCodexPickerModel,
22
+ modelPickerChoice,
23
+ modelPickerMenuView
24
+ };
25
+ //# sourceMappingURL=model-picker-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -2,14 +2,16 @@
2
2
  import {
3
3
  ModelPolicyPickerMenu,
4
4
  ModelPolicyPickerPopover
5
- } from "./chunk-IYQCWGU5.js";
6
- import "./chunk-L2J3PU7A.js";
5
+ } from "./chunk-GHJU7XG7.js";
6
+ import "./chunk-7ZB7I3KP.js";
7
7
  import "./chunk-PMV53IMM.js";
8
- import "./chunk-XS67YG5R.js";
8
+ import "./chunk-N7S72EXK.js";
9
+ import "./chunk-3ZC6QPOM.js";
9
10
  import "./chunk-XEA5BCMA.js";
11
+ import "./chunk-IX3K4THH.js";
10
12
  import "./chunk-TXS65BB2.js";
11
13
  export {
12
14
  ModelPolicyPickerMenu,
13
15
  ModelPolicyPickerPopover
14
16
  };
15
- //# sourceMappingURL=model-policy-picker-menu-WRNSRFQC.js.map
17
+ //# sourceMappingURL=model-policy-picker-menu-NM4RPTY6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -24,6 +24,16 @@ export declare function availabilityReasonLabel(reason: WorkspaceModelCatalogMod
24
24
  export declare function effortOptionsForModel(model: ClientModel): ReasoningEffort[];
25
25
  export declare function defaultEffortForModel(model: ClientModel): ReasoningEffort;
26
26
  export declare function coerceReasoningEffortForModel(model: ClientModel, effort: ReasoningEffort): ReasoningEffort;
27
+ /** Whether the composer offers (and therefore labels) a reasoning-effort choice. */
28
+ export declare function modelOffersEffortChoice(model: ClientModel): boolean;
29
+ /**
30
+ * The composer model pill at phone width: the catalog's compact name (falling
31
+ * back to the display name) and the effort label when effort is a choice.
32
+ */
33
+ export declare function compactModelPill(models: readonly ClientModel[], modelId: string, effort: ReasoningEffort | null | undefined): {
34
+ name: string;
35
+ effort: string | null;
36
+ };
27
37
  export declare function runnableLatencyModesForModel(model: ClientModel): LatencyModeId[];
28
38
  export declare function labelLatencyMode(mode: LatencyModeId): string;
29
39
  export declare function labelReasoningEffort(effort: ReasoningEffort): string;
@@ -5,6 +5,7 @@ import {
5
5
  billingClassForModel,
6
6
  billingClassLabel,
7
7
  coerceReasoningEffortForModel,
8
+ compactModelPill,
8
9
  defaultEffortForModel,
9
10
  effortOptionsForModel,
10
11
  findPickerRow,
@@ -12,6 +13,7 @@ import {
12
13
  labelLatencyMode,
13
14
  labelReasoningEffort,
14
15
  modelDisplayName,
16
+ modelOffersEffortChoice,
15
17
  modelUsesCredits,
16
18
  modelVendor,
17
19
  payerSummaryForModel,
@@ -20,13 +22,14 @@ import {
20
22
  runnableLatencyModesForModel,
21
23
  scopedBillingClassLabel,
22
24
  sortPickerRows
23
- } from "./chunk-XS67YG5R.js";
25
+ } from "./chunk-IX3K4THH.js";
24
26
  export {
25
27
  advancedSourceSummary,
26
28
  availabilityReasonLabel,
27
29
  billingClassForModel,
28
30
  billingClassLabel,
29
31
  coerceReasoningEffortForModel,
32
+ compactModelPill,
30
33
  defaultEffortForModel,
31
34
  effortOptionsForModel,
32
35
  findPickerRow,
@@ -34,6 +37,7 @@ export {
34
37
  labelLatencyMode,
35
38
  labelReasoningEffort,
36
39
  modelDisplayName,
40
+ modelOffersEffortChoice,
37
41
  modelUsesCredits,
38
42
  modelVendor,
39
43
  payerSummaryForModel,
@@ -0,0 +1,32 @@
1
+ import type { AccessContext, AccountGrant, Workspace } from "@opengeni/sdk";
2
+ export type OrgOption = {
3
+ accountId: string;
4
+ label: string;
5
+ /** Whether the subject has the owner/admin authority required by organization settings. */
6
+ canManage: boolean;
7
+ };
8
+ /** Organizations the subject administers (owner or admin), sorted by id. */
9
+ export declare function organizationAdministrationAccountIds(accessContext: AccessContext): string[];
10
+ /** A short, stable id fragment for an account that has no human name. */
11
+ export declare function shortAccountId(accountId: string): string;
12
+ /** The organization's real name, or null when the API sent none. */
13
+ export declare function orgName(accountId: string, grants: AccountGrant[]): string | null;
14
+ /** Human label for an organization: the grant's subjectLabel, else a short id. */
15
+ export declare function orgLabel(accountId: string, grants: AccountGrant[]): string;
16
+ /**
17
+ * The organizations the subject belongs to, in a stable order (default org
18
+ * first, then by name). Derived from account grants, unioned with the accounts
19
+ * that own the accessible workspaces so an org always shows even without an
20
+ * explicit grant.
21
+ */
22
+ export declare function organizationsForSubject(context: AccessContext, workspaces: Workspace[]): OrgOption[];
23
+ /** Workspaces that belong to a given organization, ordered by name. */
24
+ export declare function workspacesInOrg(workspaces: Workspace[], accountId: string): Workspace[];
25
+ /** Organization settings remain anchored to an accessible workspace in that organization. */
26
+ export declare function organizationSettingsWorkspaceId(workspaces: Workspace[], accountId: string, activeWorkspaceId: string): string | null;
27
+ /**
28
+ * Where switching to an organization lands: the workspace last used there
29
+ * while it is still open to the person, else its first shared workspace, else
30
+ * their Personal workspace there. Null when nothing in it is open to them.
31
+ */
32
+ export declare function organizationLandingWorkspaceId(workspaces: Workspace[], accountId: string, rememberedWorkspaceId?: string | null): string | null;
@@ -0,0 +1,65 @@
1
+ "use client";
2
+
3
+ // src/organization-model.ts
4
+ function organizationAdministrationAccountIds(accessContext) {
5
+ return accessContext.accountGrants.filter(
6
+ (grant) => grant.subjectId === accessContext.subjectId && (grant.role === "owner" || grant.role === "admin")
7
+ ).map((grant) => grant.accountId).sort();
8
+ }
9
+ function shortAccountId(accountId) {
10
+ return accountId.length > 8 ? accountId.slice(0, 8) : accountId;
11
+ }
12
+ function orgName(accountId, grants) {
13
+ const grant = grants.find((candidate) => candidate.accountId === accountId);
14
+ const label = grant?.metadata && typeof grant.metadata.accountName === "string" ? grant.metadata.accountName : void 0;
15
+ return label?.trim() || null;
16
+ }
17
+ function orgLabel(accountId, grants) {
18
+ return orgName(accountId, grants) ?? `Org ${shortAccountId(accountId)}`;
19
+ }
20
+ function organizationsForSubject(context, workspaces) {
21
+ const administeredIds = new Set(organizationAdministrationAccountIds(context));
22
+ const ids = /* @__PURE__ */ new Set();
23
+ for (const grant of context.accountGrants) {
24
+ ids.add(grant.accountId);
25
+ }
26
+ for (const workspace of workspaces) {
27
+ ids.add(workspace.accountId);
28
+ }
29
+ const options = [...ids].map((accountId) => ({
30
+ accountId,
31
+ label: orgLabel(accountId, context.accountGrants),
32
+ canManage: administeredIds.has(accountId)
33
+ }));
34
+ return options.sort((a, b) => {
35
+ if (a.accountId === context.defaultAccountId) {
36
+ return -1;
37
+ }
38
+ if (b.accountId === context.defaultAccountId) {
39
+ return 1;
40
+ }
41
+ return a.label.localeCompare(b.label) || a.accountId.localeCompare(b.accountId);
42
+ });
43
+ }
44
+ function workspacesInOrg(workspaces, accountId) {
45
+ return workspaces.filter((workspace) => workspace.accountId === accountId).sort((a, b) => a.name.localeCompare(b.name));
46
+ }
47
+ function organizationSettingsWorkspaceId(workspaces, accountId, activeWorkspaceId) {
48
+ const candidates = workspacesInOrg(workspaces, accountId);
49
+ return candidates.find((workspace) => workspace.id === activeWorkspaceId)?.id ?? candidates[0]?.id ?? null;
50
+ }
51
+ function organizationLandingWorkspaceId(workspaces, accountId, rememberedWorkspaceId) {
52
+ const candidates = workspacesInOrg(workspaces, accountId);
53
+ return candidates.find((workspace) => workspace.id === rememberedWorkspaceId)?.id ?? candidates.find((workspace) => workspace.kind !== "personal")?.id ?? candidates[0]?.id ?? null;
54
+ }
55
+ export {
56
+ orgLabel,
57
+ orgName,
58
+ organizationAdministrationAccountIds,
59
+ organizationLandingWorkspaceId,
60
+ organizationSettingsWorkspaceId,
61
+ organizationsForSubject,
62
+ shortAccountId,
63
+ workspacesInOrg
64
+ };
65
+ //# sourceMappingURL=organization-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/organization-model.ts"],"sourcesContent":["// Pure organization and workspace selection rules shared by the web rail's\n// switcher and native renderers. The wire model has no account *name*, so a\n// display label is derived from the access grant — preferring the account\n// name, falling back to a short, stable id fragment. No DOM, no React.\nimport type { AccessContext, AccountGrant, Workspace } from \"@opengeni/sdk\";\n\nexport type OrgOption = {\n accountId: string;\n label: string;\n /** Whether the subject has the owner/admin authority required by organization settings. */\n canManage: boolean;\n};\n\n/** Organizations the subject administers (owner or admin), sorted by id. */\nexport function organizationAdministrationAccountIds(accessContext: AccessContext): string[] {\n return accessContext.accountGrants\n .filter(\n (grant) =>\n grant.subjectId === accessContext.subjectId &&\n (grant.role === \"owner\" || grant.role === \"admin\"),\n )\n .map((grant) => grant.accountId)\n .sort();\n}\n\n/** A short, stable id fragment for an account that has no human name. */\nexport function shortAccountId(accountId: string): string {\n return accountId.length > 8 ? accountId.slice(0, 8) : accountId;\n}\n\n/** The organization's real name, or null when the API sent none. */\nexport function orgName(accountId: string, grants: AccountGrant[]): string | null {\n const grant = grants.find((candidate) => candidate.accountId === accountId);\n const label =\n grant?.metadata && typeof grant.metadata.accountName === \"string\"\n ? grant.metadata.accountName\n : undefined;\n return label?.trim() || null;\n}\n\n/** Human label for an organization: the grant's subjectLabel, else a short id. */\nexport function orgLabel(accountId: string, grants: AccountGrant[]): string {\n return orgName(accountId, grants) ?? `Org ${shortAccountId(accountId)}`;\n}\n\n/**\n * The organizations the subject belongs to, in a stable order (default org\n * first, then by name). Derived from account grants, unioned with the accounts\n * that own the accessible workspaces so an org always shows even without an\n * explicit grant.\n */\nexport function organizationsForSubject(\n context: AccessContext,\n workspaces: Workspace[],\n): OrgOption[] {\n const administeredIds = new Set(organizationAdministrationAccountIds(context));\n const ids = new Set<string>();\n for (const grant of context.accountGrants) {\n ids.add(grant.accountId);\n }\n for (const workspace of workspaces) {\n ids.add(workspace.accountId);\n }\n const options = [...ids].map((accountId) => ({\n accountId,\n label: orgLabel(accountId, context.accountGrants),\n canManage: administeredIds.has(accountId),\n }));\n return options.sort((a, b) => {\n if (a.accountId === context.defaultAccountId) {\n return -1;\n }\n if (b.accountId === context.defaultAccountId) {\n return 1;\n }\n return a.label.localeCompare(b.label) || a.accountId.localeCompare(b.accountId);\n });\n}\n\n/** Workspaces that belong to a given organization, ordered by name. */\nexport function workspacesInOrg(workspaces: Workspace[], accountId: string): Workspace[] {\n return workspaces\n .filter((workspace) => workspace.accountId === accountId)\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/** Organization settings remain anchored to an accessible workspace in that organization. */\nexport function organizationSettingsWorkspaceId(\n workspaces: Workspace[],\n accountId: string,\n activeWorkspaceId: string,\n): string | null {\n const candidates = workspacesInOrg(workspaces, accountId);\n return (\n candidates.find((workspace) => workspace.id === activeWorkspaceId)?.id ??\n candidates[0]?.id ??\n null\n );\n}\n\n/**\n * Where switching to an organization lands: the workspace last used there\n * while it is still open to the person, else its first shared workspace, else\n * their Personal workspace there. Null when nothing in it is open to them.\n */\nexport function organizationLandingWorkspaceId(\n workspaces: Workspace[],\n accountId: string,\n rememberedWorkspaceId?: string | null,\n): string | null {\n const candidates = workspacesInOrg(workspaces, accountId);\n return (\n candidates.find((workspace) => workspace.id === rememberedWorkspaceId)?.id ??\n candidates.find((workspace) => workspace.kind !== \"personal\")?.id ??\n candidates[0]?.id ??\n null\n );\n}\n"],"mappings":";;;AAcO,SAAS,qCAAqC,eAAwC;AAC3F,SAAO,cAAc,cAClB;AAAA,IACC,CAAC,UACC,MAAM,cAAc,cAAc,cACjC,MAAM,SAAS,WAAW,MAAM,SAAS;AAAA,EAC9C,EACC,IAAI,CAAC,UAAU,MAAM,SAAS,EAC9B,KAAK;AACV;AAGO,SAAS,eAAe,WAA2B;AACxD,SAAO,UAAU,SAAS,IAAI,UAAU,MAAM,GAAG,CAAC,IAAI;AACxD;AAGO,SAAS,QAAQ,WAAmB,QAAuC;AAChF,QAAM,QAAQ,OAAO,KAAK,CAAC,cAAc,UAAU,cAAc,SAAS;AAC1E,QAAM,QACJ,OAAO,YAAY,OAAO,MAAM,SAAS,gBAAgB,WACrD,MAAM,SAAS,cACf;AACN,SAAO,OAAO,KAAK,KAAK;AAC1B;AAGO,SAAS,SAAS,WAAmB,QAAgC;AAC1E,SAAO,QAAQ,WAAW,MAAM,KAAK,OAAO,eAAe,SAAS,CAAC;AACvE;AAQO,SAAS,wBACd,SACA,YACa;AACb,QAAM,kBAAkB,IAAI,IAAI,qCAAqC,OAAO,CAAC;AAC7E,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,SAAS,QAAQ,eAAe;AACzC,QAAI,IAAI,MAAM,SAAS;AAAA,EACzB;AACA,aAAW,aAAa,YAAY;AAClC,QAAI,IAAI,UAAU,SAAS;AAAA,EAC7B;AACA,QAAM,UAAU,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,eAAe;AAAA,IAC3C;AAAA,IACA,OAAO,SAAS,WAAW,QAAQ,aAAa;AAAA,IAChD,WAAW,gBAAgB,IAAI,SAAS;AAAA,EAC1C,EAAE;AACF,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM;AAC5B,QAAI,EAAE,cAAc,QAAQ,kBAAkB;AAC5C,aAAO;AAAA,IACT;AACA,QAAI,EAAE,cAAc,QAAQ,kBAAkB;AAC5C,aAAO;AAAA,IACT;AACA,WAAO,EAAE,MAAM,cAAc,EAAE,KAAK,KAAK,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EAChF,CAAC;AACH;AAGO,SAAS,gBAAgB,YAAyB,WAAgC;AACvF,SAAO,WACJ,OAAO,CAAC,cAAc,UAAU,cAAc,SAAS,EACvD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChD;AAGO,SAAS,gCACd,YACA,WACA,mBACe;AACf,QAAM,aAAa,gBAAgB,YAAY,SAAS;AACxD,SACE,WAAW,KAAK,CAAC,cAAc,UAAU,OAAO,iBAAiB,GAAG,MACpE,WAAW,CAAC,GAAG,MACf;AAEJ;AAOO,SAAS,+BACd,YACA,WACA,uBACe;AACf,QAAM,aAAa,gBAAgB,YAAY,SAAS;AACxD,SACE,WAAW,KAAK,CAAC,cAAc,UAAU,OAAO,qBAAqB,GAAG,MACxE,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,UAAU,GAAG,MAC/D,WAAW,CAAC,GAAG,MACf;AAEJ;","names":[]}
@@ -1,4 +1,10 @@
1
1
  "use client";
2
+ import {
3
+ STARTUP_WAIT_TITLES,
4
+ sandboxRowTitle,
5
+ startupDuration,
6
+ startupPhaseTitle
7
+ } from "./chunk-ZIB4H5LN.js";
2
8
 
3
9
  // src/timeline/platform-activity-row.tsx
4
10
  function PlatformActivityRow({
@@ -95,90 +101,7 @@ function lucideIcon(j, s, name, children) {
95
101
  children
96
102
  });
97
103
  }
98
- function sandboxRowTitle(item, displayName) {
99
- if (item.name === "sandbox.provision") {
100
- return startupPhaseTitle(
101
- "sandbox",
102
- item.status === "cancelled" ? "complete" : item.status,
103
- item.origin ?? null
104
- );
105
- }
106
- return displayName(item.name);
107
- }
108
- function startupPhaseTitle(phase, status, outcome) {
109
- if (status === "complete" && phase === "sandbox" && outcome && outcome !== "skipped") {
110
- return `Sandbox ${outcome === "resumed" ? "reattached" : outcome}`;
111
- }
112
- if (status === "complete" && phase === "rig" && outcome === "skipped") {
113
- return "Sandbox Environment already ready";
114
- }
115
- const statusIndex = status === "running" ? 0 : status === "failed" ? 1 : status === "cancelled" ? 2 : 3;
116
- return STARTUP_PHASE_TITLES[phase][statusIndex];
117
- }
118
- var STARTUP_WAIT_TITLES = {
119
- capture_in_progress: "Waiting for sandbox checkpoint",
120
- rotation_in_progress: "Waiting for sandbox rotation",
121
- provider_recovery_in_progress: "Waiting for sandbox recovery"
122
- };
123
- var STARTUP_PHASE_TITLES = {
124
- queue: [
125
- "Waiting for a worker",
126
- "Worker startup failed",
127
- "Worker wait interrupted",
128
- "Worker started"
129
- ],
130
- sandbox: [
131
- "Starting sandbox",
132
- "Sandbox didn\u2019t start",
133
- "Sandbox startup interrupted",
134
- "Sandbox ready"
135
- ],
136
- rig: [
137
- "Setting up sandbox environment",
138
- "Sandbox Environment setup failed",
139
- "Sandbox Environment setup interrupted",
140
- "Sandbox Environment ready"
141
- ],
142
- repository: [
143
- "Preparing repository",
144
- "Repository preparation failed",
145
- "Repository preparation interrupted",
146
- "Repository ready"
147
- ],
148
- files: [
149
- "Preparing files",
150
- "File preparation failed",
151
- "File preparation interrupted",
152
- "Files ready"
153
- ],
154
- tools: [
155
- "Connecting tools",
156
- "Tool connection failed",
157
- "Tool connection interrupted",
158
- "Tools ready"
159
- ],
160
- model_preparation: [
161
- "Preparing runtime and model request",
162
- "Runtime/model preparation failed",
163
- "Runtime/model preparation interrupted",
164
- "Model request dispatched"
165
- ],
166
- provider_first_byte: [
167
- "Waiting for model",
168
- "Model didn\u2019t respond",
169
- "Model wait interrupted",
170
- "Model started responding"
171
- ]
172
- };
173
- function startupDuration(durationMs) {
174
- if (durationMs === null || !Number.isFinite(durationMs) || durationMs < 0) return null;
175
- if (durationMs < 1e3) return `${Math.round(durationMs)}ms`;
176
- if (durationMs < 6e4) return `${(durationMs / 1e3).toFixed(1)}s`;
177
- const minutes = Math.floor(durationMs / 6e4);
178
- const seconds = Math.round(durationMs % 6e4 / 1e3);
179
- return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
180
- }
181
104
  export {
182
105
  PlatformActivityRow as default
183
106
  };
184
- //# sourceMappingURL=platform-activity-row-PJJVATTZ.js.map
107
+ //# sourceMappingURL=platform-activity-row-NJ47YBXW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/platform-activity-row.tsx"],"sourcesContent":["import {\n sandboxRowTitle,\n startupDuration,\n startupPhaseTitle,\n STARTUP_WAIT_TITLES,\n} from \"./platform-activity-presentation\";\nimport type { ReasoningItem, SandboxItem, StartupPhaseItem } from \"./types\";\n\ntype RowJsx = typeof import(\"react/jsx-runtime\").jsx;\ntype RowJsxs = typeof import(\"react/jsx-runtime\").jsxs;\n\nexport default function PlatformActivityRow({\n item,\n d: ActivityDisclosure,\n p: PayloadBlock,\n t: displayName,\n b: BotIcon,\n m: Markdown,\n j,\n s,\n}: {\n item: ReasoningItem | SandboxItem | StartupPhaseItem;\n d: typeof import(\"./shared\").ActivityDisclosure;\n p: typeof import(\"./shared\").PayloadBlock;\n t: (name: string) => string;\n b: typeof import(\"lucide-react\").BotIcon;\n m: typeof import(\"../components/markdown\").Markdown;\n j: RowJsx;\n s: RowJsxs;\n}) {\n if (item.kind === \"reasoning\") {\n return j(ActivityDisclosure, {\n icon: brainIcon(j, s),\n iconTone: \"muted\",\n title: item.streaming\n ? \"Thinking\"\n : j(\"span\", {\n className: \"font-normal italic text-og-fg-subtle\",\n children: \"Thought\",\n }),\n running: item.streaming,\n compactPreview: item.text.replace(/\\*\\*|__|`/g, \"\").replace(/\\s+/g, \" \"),\n preview: j(\"span\", {\n className: \"og-reasoning-preview\",\n children: j(Markdown, { streaming: item.streaming, children: item.text }),\n }),\n children: j(\"div\", {\n className: \"text-og-base leading-6 text-og-fg-muted [&_strong]:text-og-fg-muted\",\n children: j(Markdown, { streaming: item.streaming, children: item.text }),\n }),\n });\n }\n if (item.kind === \"sandbox\") {\n return s(ActivityDisclosure, {\n icon: terminalIcon(j, s),\n iconTone:\n item.status === \"failed\" ? \"failed\" : item.status === \"running\" ? \"running\" : \"muted\",\n title: sandboxRowTitle(item, displayName),\n running: item.status === \"running\",\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: item.command ?? undefined,\n children: [\n item.command ? j(PayloadBlock, { label: \"Command\", value: item.command }, \"command\") : null,\n item.output ? j(PayloadBlock, { label: \"Output\", value: item.output }, \"output\") : null,\n ],\n });\n }\n\n const failed = item.status === \"failed\";\n const running = item.status === \"running\";\n const duration = startupDuration(item.durationMs);\n return j(ActivityDisclosure, {\n icon: j(BotIcon, { className: \"size-3.5\" }),\n iconTone: failed ? \"failed\" : running ? \"running\" : \"muted\",\n title: item.blockedReason\n ? STARTUP_WAIT_TITLES[item.blockedReason]\n : startupPhaseTitle(item.phase, item.status, item.outcome),\n preview:\n item.phase === \"model_preparation\"\n ? \"Includes overlapping sandbox startup, custom environment setup, repository preparation, and runtime setup shown below.\"\n : undefined,\n running,\n failed,\n cancelled: item.status === \"cancelled\",\n chip: duration ? { tone: failed ? \"bad\" : \"muted\", text: duration } : undefined,\n expandable: false,\n });\n}\n\nfunction brainIcon(j: RowJsx, s: RowJsxs) {\n return lucideIcon(j, s, \"brain\", [\n j(\"path\", { d: \"M 12 18V5\" }, \"spine\"),\n j(\"path\", { d: \"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\" }, \"center\"),\n j(\"path\", { d: \"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\" }, \"top\"),\n j(\"path\", { d: \"M17.997 5.125a4 4 0 0 1 2.526 5.77\" }, \"upper-right\"),\n j(\"path\", { d: \"M18 18a4 4 0 0 0 2-7.464\" }, \"right\"),\n j(\"path\", { d: \"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\" }, \"base\"),\n j(\"path\", { d: \"M6 18a4 4 0 0 1-2-7.464\" }, \"left\"),\n j(\"path\", { d: \"M6.003 5.125a4 4 0 0 0-2.526 5.77\" }, \"upper-left\"),\n ]);\n}\n\nfunction terminalIcon(j: RowJsx, s: RowJsxs) {\n return lucideIcon(j, s, \"square-terminal\", [\n j(\"path\", { d: \"m7 11 2-2-2-2\" }, \"prompt\"),\n j(\"path\", { d: \"M11 13h4\" }, \"cursor\"),\n j(\"rect\", { width: 18, height: 18, x: 3, y: 3, rx: 2, ry: 2 }, \"frame\"),\n ]);\n}\n\nfunction lucideIcon(j: RowJsx, s: RowJsxs, name: string, children: ReturnType<RowJsx>[]) {\n return s(\"svg\", {\n \"aria-hidden\": \"true\",\n className: `lucide lucide-${name} size-3.5`,\n fill: \"none\",\n height: 24,\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n viewBox: \"0 0 24 24\",\n width: 24,\n children,\n });\n}\n"],"mappings":"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","names":[]}