@opengeni/react 7.4.0 → 7.5.0-canary.36919050519001

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 (210) hide show
  1. package/README.md +124 -27
  2. package/dist/artifacts-document.js +3 -2
  3. package/dist/artifacts-presentation.js +3 -2
  4. package/dist/artifacts-spreadsheet.js +2 -2
  5. package/dist/artifacts.d.ts +1 -0
  6. package/dist/artifacts.js +516 -1413
  7. package/dist/artifacts.js.map +1 -1
  8. package/dist/{browser-viewer-2E6R2Y4W.js → browser-viewer-Z7S7QEJL.js} +6 -5
  9. package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
  10. package/dist/{chunk-Y3QTZN2F.js → chunk-2VFNCX4E.js} +6 -6
  11. package/dist/{chunk-UDD6DLLT.js → chunk-3IJJEYW4.js} +15 -3
  12. package/dist/chunk-3IJJEYW4.js.map +1 -0
  13. package/dist/chunk-4RVYOY4O.js +379 -0
  14. package/dist/chunk-4RVYOY4O.js.map +1 -0
  15. package/dist/chunk-5CVXZA3Y.js +292 -0
  16. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  17. package/dist/{chunk-5YK2ZDIG.js → chunk-5J4FOW6Q.js} +2 -10
  18. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  19. package/dist/{chunk-KVERXCFY.js → chunk-5KYZIQFY.js} +40 -3
  20. package/dist/chunk-5KYZIQFY.js.map +1 -0
  21. package/dist/{chunk-KNDIXZN6.js → chunk-7UAMYXJY.js} +25 -18
  22. package/dist/{chunk-KNDIXZN6.js.map → chunk-7UAMYXJY.js.map} +1 -1
  23. package/dist/{chunk-SEEVCT36.js → chunk-A4UJB2MM.js} +2 -2
  24. package/dist/{chunk-X4HIN6TV.js → chunk-AFLPWUQ7.js} +71 -162
  25. package/dist/chunk-AFLPWUQ7.js.map +1 -0
  26. package/dist/chunk-B3V6TG77.js +41 -0
  27. package/dist/chunk-B3V6TG77.js.map +1 -0
  28. package/dist/{chunk-XEJEOAOV.js → chunk-B7WMS3CS.js} +51 -40
  29. package/dist/chunk-B7WMS3CS.js.map +1 -0
  30. package/dist/{chunk-S5JQ4R22.js → chunk-BDKR6BAR.js} +54 -24
  31. package/dist/chunk-BDKR6BAR.js.map +1 -0
  32. package/dist/{chunk-4MDLEHXL.js → chunk-DYWBUX5Q.js} +24 -12
  33. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  34. package/dist/{chunk-YZ3YYMOM.js → chunk-E3G7SAYZ.js} +252 -624
  35. package/dist/chunk-E3G7SAYZ.js.map +1 -0
  36. package/dist/chunk-JT4JW7BC.js +54 -0
  37. package/dist/chunk-JT4JW7BC.js.map +1 -0
  38. package/dist/{chunk-5AZSK6MV.js → chunk-LWNLETQT.js} +5 -5
  39. package/dist/{chunk-USXVQACU.js → chunk-M7LBYP63.js} +5 -4
  40. package/dist/{chunk-USXVQACU.js.map → chunk-M7LBYP63.js.map} +1 -1
  41. package/dist/{chunk-L4OSXQ6H.js → chunk-NBOHNRLJ.js} +1289 -1060
  42. package/dist/chunk-NBOHNRLJ.js.map +1 -0
  43. package/dist/chunk-RHREZ7BO.js +11 -0
  44. package/dist/chunk-RHREZ7BO.js.map +1 -0
  45. package/dist/chunk-SCOTPE2I.js +589 -0
  46. package/dist/chunk-SCOTPE2I.js.map +1 -0
  47. package/dist/chunk-WEHMPOXK.js +39 -0
  48. package/dist/chunk-WEHMPOXK.js.map +1 -0
  49. package/dist/chunk-WRHIZYZF.js +988 -0
  50. package/dist/chunk-WRHIZYZF.js.map +1 -0
  51. package/dist/{chunk-3E2AITTZ.js → chunk-WUISZ3WU.js} +32 -28
  52. package/dist/{chunk-3E2AITTZ.js.map → chunk-WUISZ3WU.js.map} +1 -1
  53. package/dist/chunk-XCHWDJ22.js +107 -0
  54. package/dist/chunk-XCHWDJ22.js.map +1 -0
  55. package/dist/{chunk-DUEBTL3N.js → chunk-Y2PRMYLC.js} +4 -3
  56. package/dist/{chunk-DUEBTL3N.js.map → chunk-Y2PRMYLC.js.map} +1 -1
  57. package/dist/chunk-YBXQDQFX.js +1772 -0
  58. package/dist/chunk-YBXQDQFX.js.map +1 -0
  59. package/dist/chunk-YV4L3ILF.js +9 -0
  60. package/dist/chunk-YV4L3ILF.js.map +1 -0
  61. package/dist/{chunk-V2ABIVYJ.js → chunk-ZXSEDZP7.js} +70 -6
  62. package/dist/chunk-ZXSEDZP7.js.map +1 -0
  63. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  64. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  65. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  66. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  67. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  68. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  69. package/dist/components/artifacts/index.d.ts +7 -0
  70. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  71. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  72. package/dist/components/artifacts/site-view.d.ts +23 -0
  73. package/dist/components/browser-select-control.d.ts +3 -1
  74. package/dist/components/code-editor.d.ts +1 -4
  75. package/dist/components/desktop-viewer.d.ts +1 -1
  76. package/dist/components/message-timeline.d.ts +20 -3
  77. package/dist/components/open-geni-links.d.ts +16 -0
  78. package/dist/components/session-conversation.d.ts +20 -1
  79. package/dist/components/timeline-pill-geometry.d.ts +8 -0
  80. package/dist/components/timeline-pill-placement.d.ts +24 -0
  81. package/dist/components/usage-limit-notice.d.ts +49 -0
  82. package/dist/components/usage-member-list.d.ts +91 -0
  83. package/dist/components/usage-meter.d.ts +73 -0
  84. package/dist/composer.js +5 -5
  85. package/dist/{computer-viewer-WMJE6OA3.js → computer-viewer-KJWLH3GI.js} +7 -5
  86. package/dist/connect.js +7 -6
  87. package/dist/connect.js.map +1 -1
  88. package/dist/conversation-timeline.d.ts +1 -1
  89. package/dist/desktop.d.ts +7 -0
  90. package/dist/desktop.js +26 -0
  91. package/dist/desktop.js.map +1 -0
  92. package/dist/editor.d.ts +7 -0
  93. package/dist/editor.js +21 -0
  94. package/dist/editor.js.map +1 -0
  95. package/dist/hooks/latest-question.d.ts +1 -1
  96. package/dist/hooks/use-composer.d.ts +4 -0
  97. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  98. package/dist/hooks/use-usage.d.ts +40 -0
  99. package/dist/index.d.ts +7 -2
  100. package/dist/index.js +460 -1386
  101. package/dist/index.js.map +1 -1
  102. package/dist/interaction.js +8 -6
  103. package/dist/interaction.js.map +1 -1
  104. package/dist/{latest-question-QB4EUCW5.js → latest-question-IS445HOW.js} +3 -3
  105. package/dist/lib/format.d.ts +6 -1
  106. package/dist/lib/workbench-peers.d.ts +36 -0
  107. package/dist/machines.js +2 -2
  108. package/dist/{markdown-table-layout-PFUEZ2U4.js → markdown-table-layout-QXSLK4BY.js} +37 -5
  109. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  110. package/dist/{queue-surface-implementation-IM2HD3SK.js → queue-surface-implementation-2CAQAIHM.js} +2 -2
  111. package/dist/realtime.js +3 -3
  112. package/dist/{sandbox-files-PXPIZAFG.js → sandbox-files-AEJTWGT4.js} +8 -5
  113. package/dist/sandbox-files-AEJTWGT4.js.map +1 -0
  114. package/dist/session-ui.d.ts +9 -2
  115. package/dist/session-ui.js +39 -20
  116. package/dist/session-ui.js.map +1 -1
  117. package/dist/session.js +4 -4
  118. package/dist/sites.js +4 -289
  119. package/dist/sites.js.map +1 -1
  120. package/dist/terminal.d.ts +8 -0
  121. package/dist/terminal.js +31 -0
  122. package/dist/terminal.js.map +1 -0
  123. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  124. package/dist/timeline/genie-loading.d.ts +3 -1
  125. package/dist/timeline/types.d.ts +8 -1
  126. package/dist/{timeline-annotation-selection-ODLVF4OI.js → timeline-annotation-selection-DMLMM2TX.js} +6 -1
  127. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  128. package/dist/timeline-pill-geometry-Z23V243M.js +110 -0
  129. package/dist/timeline-pill-geometry-Z23V243M.js.map +1 -0
  130. package/dist/usage/allowance-copy.d.ts +25 -0
  131. package/dist/usage/summary.d.ts +35 -0
  132. package/dist/usage.d.ts +13 -0
  133. package/dist/usage.js +1073 -0
  134. package/dist/usage.js.map +1 -0
  135. package/package.json +19 -3
  136. package/src/artifacts.ts +37 -0
  137. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  138. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  139. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  140. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  141. package/src/components/artifacts/editable-artifact-ui.tsx +3 -1
  142. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  143. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  144. package/src/components/artifacts/editable-document.tsx +34 -36
  145. package/src/components/artifacts/editable-presentation.tsx +21 -16
  146. package/src/components/artifacts/index.ts +41 -0
  147. package/src/components/artifacts/latest-task-runner.ts +49 -0
  148. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  149. package/src/components/artifacts/site-view.tsx +116 -0
  150. package/src/components/browser-select-control.tsx +4 -1
  151. package/src/components/browser-viewer.tsx +81 -22
  152. package/src/components/code-editor.tsx +13 -16
  153. package/src/components/computer-viewer.tsx +51 -23
  154. package/src/components/desktop-viewer.tsx +1 -1
  155. package/src/components/markdown-table-layout.ts +49 -5
  156. package/src/components/markdown.tsx +5 -2
  157. package/src/components/message-timeline.tsx +557 -516
  158. package/src/components/open-geni-links.tsx +24 -0
  159. package/src/components/sandbox-terminal.tsx +48 -11
  160. package/src/components/session-chrome.tsx +22 -3
  161. package/src/components/session-conversation.tsx +195 -102
  162. package/src/components/timeline-annotation-selection.tsx +7 -0
  163. package/src/components/timeline-pill-geometry.ts +169 -0
  164. package/src/components/timeline-pill-placement.ts +99 -0
  165. package/src/components/usage-limit-notice.tsx +179 -0
  166. package/src/components/usage-member-list.tsx +792 -0
  167. package/src/components/usage-meter.tsx +382 -0
  168. package/src/conversation-timeline.ts +10 -2
  169. package/src/desktop.ts +24 -0
  170. package/src/editor.ts +13 -0
  171. package/src/hooks/use-available-models.ts +1 -1
  172. package/src/hooks/use-composer.ts +57 -2
  173. package/src/hooks/use-desktop-stream.ts +19 -28
  174. package/src/hooks/use-usage.ts +100 -0
  175. package/src/index.ts +22 -0
  176. package/src/lib/format.ts +32 -6
  177. package/src/lib/workbench-peers.ts +62 -0
  178. package/src/session-ui.ts +22 -0
  179. package/src/terminal.ts +26 -0
  180. package/src/timeline/activity-rail.tsx +5 -3
  181. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  182. package/src/timeline/genie-loading.tsx +16 -6
  183. package/src/timeline/projection.ts +78 -4
  184. package/src/timeline/types.ts +8 -0
  185. package/src/usage/allowance-copy.ts +64 -0
  186. package/src/usage/summary.ts +93 -0
  187. package/src/usage.ts +50 -0
  188. package/styles/compiled.css +325 -0
  189. package/dist/chunk-4MDLEHXL.js.map +0 -1
  190. package/dist/chunk-5YK2ZDIG.js.map +0 -1
  191. package/dist/chunk-KVERXCFY.js.map +0 -1
  192. package/dist/chunk-L4OSXQ6H.js.map +0 -1
  193. package/dist/chunk-S5JQ4R22.js.map +0 -1
  194. package/dist/chunk-UDD6DLLT.js.map +0 -1
  195. package/dist/chunk-UGMKPUEM.js +0 -299
  196. package/dist/chunk-UGMKPUEM.js.map +0 -1
  197. package/dist/chunk-V2ABIVYJ.js.map +0 -1
  198. package/dist/chunk-X4HIN6TV.js.map +0 -1
  199. package/dist/chunk-XEJEOAOV.js.map +0 -1
  200. package/dist/chunk-YZ3YYMOM.js.map +0 -1
  201. package/dist/markdown-table-layout-PFUEZ2U4.js.map +0 -1
  202. package/dist/timeline-annotation-selection-ODLVF4OI.js.map +0 -1
  203. /package/dist/{browser-viewer-2E6R2Y4W.js.map → browser-viewer-Z7S7QEJL.js.map} +0 -0
  204. /package/dist/{computer-viewer-WMJE6OA3.js.map → chat-interactive-block-UGBTNB3L.js.map} +0 -0
  205. /package/dist/{chunk-Y3QTZN2F.js.map → chunk-2VFNCX4E.js.map} +0 -0
  206. /package/dist/{chunk-SEEVCT36.js.map → chunk-A4UJB2MM.js.map} +0 -0
  207. /package/dist/{chunk-5AZSK6MV.js.map → chunk-LWNLETQT.js.map} +0 -0
  208. /package/dist/{sandbox-files-PXPIZAFG.js.map → computer-viewer-KJWLH3GI.js.map} +0 -0
  209. /package/dist/{latest-question-QB4EUCW5.js.map → latest-question-IS445HOW.js.map} +0 -0
  210. /package/dist/{queue-surface-implementation-IM2HD3SK.js.map → queue-surface-implementation-2CAQAIHM.js.map} +0 -0
@@ -5,6 +5,15 @@ import {
5
5
  useInteractionInterventions,
6
6
  useInteractionInvalidation
7
7
  } from "./chunk-YSMMDOOE.js";
8
+ import {
9
+ copyTextToClipboard
10
+ } from "./chunk-JVYQRRC4.js";
11
+ import {
12
+ interactionHostPlatform
13
+ } from "./chunk-RHREZ7BO.js";
14
+ import {
15
+ formatBytes
16
+ } from "./chunk-3IJJEYW4.js";
8
17
  import {
9
18
  STREAM_CLOSE_REASON_NORMAL,
10
19
  STREAM_KIND_BROWSER,
@@ -12,24 +21,17 @@ import {
12
21
  decodeStreamFrame,
13
22
  decodeStreamOpenAck,
14
23
  encodeStreamClose,
15
- encodeStreamOpen,
16
- interactionHostPlatform
17
- } from "./chunk-5YK2ZDIG.js";
24
+ encodeStreamOpen
25
+ } from "./chunk-5J4FOW6Q.js";
18
26
  import {
19
27
  usePageLiveActivity
20
28
  } from "./chunk-KZ73RL76.js";
21
29
  import {
22
30
  useEmbeddedBrowserInteraction
23
31
  } from "./chunk-NEXLLTP4.js";
24
- import {
25
- formatBytes
26
- } from "./chunk-UDD6DLLT.js";
27
32
  import {
28
33
  cn
29
34
  } from "./chunk-22KP6LR5.js";
30
- import {
31
- copyTextToClipboard
32
- } from "./chunk-JVYQRRC4.js";
33
35
 
34
36
  // src/components/browser-viewer.tsx
35
37
  import { interactionControlFailureFromError } from "@opengeni/sdk/interaction";
@@ -1881,6 +1883,7 @@ function BrowserSelectControl(props) {
1881
1883
  if (current === request.current) setBusy(false);
1882
1884
  }
1883
1885
  };
1886
+ if (props.manualFallback === false && !open) return null;
1884
1887
  return /* @__PURE__ */ jsxs(
1885
1888
  "div",
1886
1889
  {
@@ -1891,7 +1894,7 @@ function BrowserSelectControl(props) {
1891
1894
  top: position?.y ?? anchor.y
1892
1895
  } : { bottom: 12, left: 12 },
1893
1896
  children: [
1894
- !anchor || !open || error ? /* @__PURE__ */ jsx(
1897
+ props.manualFallback !== false && (!anchor || !open) || error ? /* @__PURE__ */ jsx(
1895
1898
  "button",
1896
1899
  {
1897
1900
  type: "button",
@@ -2078,6 +2081,8 @@ function BrowserViewer({
2078
2081
  () => registry.relevantSessions.filter((session) => isLiveBrowser2(session)),
2079
2082
  [registry.relevantSessions]
2080
2083
  );
2084
+ const latestRelevantBrowser = registry.relevantSessions[0];
2085
+ const unavailableBrowser = latestRelevantBrowser?.lifecycle === "lost" || latestRelevantBrowser?.lifecycle === "failed" ? latestRelevantBrowser : void 0;
2081
2086
  const [selection, setSelection] = useState9(
2082
2087
  () => initialBrowserSessionId ? { sessionId: initialBrowserSessionId, pinned: true } : null
2083
2088
  );
@@ -2521,15 +2526,18 @@ function BrowserViewer({
2521
2526
  );
2522
2527
  }
2523
2528
  if (liveSessions.length === 0) {
2524
- if (renderEmpty) return /* @__PURE__ */ jsx2(Fragment2, { children: renderEmpty(() => createBrowser(), creating) });
2529
+ if (renderEmpty && !unavailableBrowser)
2530
+ return /* @__PURE__ */ jsx2(Fragment2, { children: renderEmpty(() => createBrowser(), creating) });
2525
2531
  return /* @__PURE__ */ jsx2(
2526
2532
  "div",
2527
2533
  {
2528
2534
  className: cn("flex h-full min-h-0 items-center justify-center bg-og-bg p-6", className),
2529
2535
  children: /* @__PURE__ */ jsxs2("div", { className: "max-w-sm text-center", children: [
2530
2536
  /* @__PURE__ */ jsx2("span", { className: "mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-fg-muted", children: /* @__PURE__ */ jsx2(Globe2Icon, { className: "size-4.5" }) }),
2531
- /* @__PURE__ */ jsx2("p", { className: "mt-3 text-og-menu font-medium text-og-fg", children: attachedGenerationLoss ? "Chrome reconnected\u2014open a fresh browser/desktop." : "No browser open" }),
2532
- /* @__PURE__ */ jsx2("p", { className: "mt-1 text-og-control leading-5 text-og-fg-muted", children: attachedGenerationLoss ? "This Chrome profile is live again, but the previous browser cannot move to the new connection. Use Browser \u2192 New browser \u2192 Connected Chrome." : "A browser appears here when this agent\u2014or another agent in the workspace\u2014opens one." }),
2537
+ unavailableBrowser && !attachedGenerationLoss ? /* @__PURE__ */ jsx2(BrowserUnavailableNotice, { session: unavailableBrowser }) : /* @__PURE__ */ jsxs2(Fragment2, { children: [
2538
+ /* @__PURE__ */ jsx2("p", { className: "mt-3 text-og-menu font-medium text-og-fg", children: attachedGenerationLoss ? "Chrome reconnected\u2014open a fresh browser/desktop." : "No browser open" }),
2539
+ /* @__PURE__ */ jsx2("p", { className: "mt-1 text-og-control leading-5 text-og-fg-muted", children: attachedGenerationLoss ? "This Chrome profile is live again, but the previous browser cannot move to the new connection. Use Browser \u2192 New browser \u2192 Connected Chrome." : "A browser appears here when this agent\u2014or another agent in the workspace\u2014opens one." })
2540
+ ] }),
2533
2541
  /* @__PURE__ */ jsx2(
2534
2542
  BrowserLaunchMenu,
2535
2543
  {
@@ -2597,6 +2605,7 @@ function BrowserViewer({
2597
2605
  !selectedRegistrySession ? /* @__PURE__ */ jsx2(
2598
2606
  BrowserUnselectedPanel,
2599
2607
  {
2608
+ unavailableBrowser,
2600
2609
  peerCount: liveSessions.length,
2601
2610
  creating,
2602
2611
  onCreate: () => createBrowser()
@@ -2847,7 +2856,7 @@ function BrowserToolbar(props) {
2847
2856
  function BrowserUnselectedPanel(props) {
2848
2857
  return /* @__PURE__ */ jsx2("div", { className: "grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center", children: /* @__PURE__ */ jsxs2("div", { className: "max-w-sm", children: [
2849
2858
  /* @__PURE__ */ jsx2("span", { className: "mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-fg-muted", children: /* @__PURE__ */ jsx2(Globe2Icon, { className: "size-4.5" }) }),
2850
- /* @__PURE__ */ jsx2("p", { className: "mt-3 text-og-menu font-medium text-og-fg", children: "No browser for this agent" }),
2859
+ props.unavailableBrowser ? /* @__PURE__ */ jsx2(BrowserUnavailableNotice, { session: props.unavailableBrowser }) : /* @__PURE__ */ jsx2("p", { className: "mt-3 text-og-menu font-medium text-og-fg", children: "No browser for this agent" }),
2851
2860
  /* @__PURE__ */ jsx2("p", { className: "mt-1 text-og-control leading-5 text-og-fg-muted", children: props.peerCount === 1 ? "One workspace browser is available from the browser menu." : `${props.peerCount} workspace browsers are available from the browser menu.` }),
2852
2861
  /* @__PURE__ */ jsxs2(
2853
2862
  "button",
@@ -2864,6 +2873,18 @@ function BrowserUnselectedPanel(props) {
2864
2873
  )
2865
2874
  ] }) });
2866
2875
  }
2876
+ function BrowserUnavailableNotice({ session }) {
2877
+ const reason = session.failureCode === "provider_deadline_rotation" ? "The computer running it reached its time limit." : session.failureCode === "source_placement_changed" ? "This chat moved to another computer." : session.lifecycle === "failed" ? "It stopped unexpectedly." : "The connection to it was lost.";
2878
+ return /* @__PURE__ */ jsxs2("div", { role: "status", children: [
2879
+ /* @__PURE__ */ jsx2("p", { className: "mt-3 text-og-menu font-medium text-og-fg", children: "Browser unavailable" }),
2880
+ /* @__PURE__ */ jsxs2("p", { className: "mt-1 break-words text-og-control leading-5 text-og-fg-muted", children: [
2881
+ session.name,
2882
+ ". ",
2883
+ reason,
2884
+ " Open a new browser to continue."
2885
+ ] })
2886
+ ] });
2887
+ }
2867
2888
  function BrowserSessionGroup(props) {
2868
2889
  if (props.sessions.length === 0) return null;
2869
2890
  return /* @__PURE__ */ jsxs2("div", { className: "py-1", children: [
@@ -3247,7 +3268,7 @@ function BrowserProfileMenu(props) {
3247
3268
  ]
3248
3269
  }
3249
3270
  ) : null,
3250
- canSave ? /* @__PURE__ */ jsx2("p", { className: "mt-2 text-[10px] leading-4 text-og-fg-subtle", children: "Saving briefly restarts this browser. Other open browsers are unchanged." }) : null
3271
+ canSave ? /* @__PURE__ */ jsx2("p", { className: "mt-2 text-[10px] leading-4 text-og-fg-subtle", children: "Saving restarts this browser. Save unfinished work on its pages first; unsaved form entries may be lost. Other open browsers are unchanged." }) : null
3251
3272
  ] })
3252
3273
  ] });
3253
3274
  }
@@ -3418,6 +3439,7 @@ function BrowserViewport(props) {
3418
3439
  const pendingTextRef = useRef10(null);
3419
3440
  const actionRef = useRef10(props.onAction);
3420
3441
  const readClipboardRef = useRef10(props.onReadClipboard);
3442
+ const observeInputRef = useRef10(props.onObserveForInput);
3421
3443
  const errorRef = useRef10(props.onError);
3422
3444
  const actionTailRef = useRef10(Promise.resolve());
3423
3445
  const actionQueueEpochRef = useRef10(0);
@@ -3430,6 +3452,7 @@ function BrowserViewport(props) {
3430
3452
  const mountedRef = useRef10(true);
3431
3453
  actionRef.current = props.onAction;
3432
3454
  readClipboardRef.current = props.onReadClipboard;
3455
+ observeInputRef.current = props.onObserveForInput;
3433
3456
  errorRef.current = props.onError;
3434
3457
  const clearBufferedInput = useCallback8(() => {
3435
3458
  dismissSelectPopup();
@@ -3553,8 +3576,12 @@ function BrowserViewport(props) {
3553
3576
  const dispatchedAction = typing && typing.actions.length > 1 ? { type: "batch", actions: typing.actions, fenceEachAction: true } : action;
3554
3577
  const receipt = await actionRef.current(dispatchedAction, frame);
3555
3578
  if (!mountedRef.current || epoch !== actionQueueEpochRef.current) return;
3556
- if (selectAnchor && receipt.observation && inputSequence === inputSequenceRef.current) {
3557
- setSelectPopup({ observation: receipt.observation, anchor: selectAnchor });
3579
+ const keyboardSelect = dispatchedAction.type === "press" && dispatchedAction.key === "Alt+ArrowDown";
3580
+ if ((selectAnchor || keyboardSelect) && inputSequence === inputSequenceRef.current) {
3581
+ const observation = keyboardSelect ? await observeInputRef.current() : receipt.observation;
3582
+ if (mountedRef.current && epoch === actionQueueEpochRef.current && inputSequence === inputSequenceRef.current && observation) {
3583
+ setSelectPopup({ observation, anchor: selectAnchor ?? null });
3584
+ }
3558
3585
  }
3559
3586
  await after?.(receipt);
3560
3587
  }).catch((cause) => {
@@ -3796,6 +3823,7 @@ function BrowserViewport(props) {
3796
3823
  onPaste: paste,
3797
3824
  className: "pointer-events-none absolute left-1/2 top-1/2 size-px resize-none overflow-hidden opacity-0",
3798
3825
  "aria-label": "Browser keyboard input",
3826
+ "aria-keyshortcuts": "Alt+ArrowDown",
3799
3827
  autoCapitalize: "off",
3800
3828
  autoCorrect: "off",
3801
3829
  spellCheck: false
@@ -3818,6 +3846,7 @@ function BrowserViewport(props) {
3818
3846
  showCanvas ? /* @__PURE__ */ jsx2(
3819
3847
  BrowserSelectControl,
3820
3848
  {
3849
+ manualFallback: props.inputBatchAttachment?.focusedInputObservations !== true,
3821
3850
  activation: selectPopup,
3822
3851
  onDismiss: () => inputRef.current?.focus({ preventScroll: true }),
3823
3852
  observe: async () => {
@@ -4011,14 +4040,15 @@ function BrowserDiagnosticsDrawer(props) {
4011
4040
  {
4012
4041
  id: "browser-page-title",
4013
4042
  className: "text-[10px] font-semibold uppercase tracking-[0.14em] text-og-fg-subtle",
4014
- children: "Current page"
4043
+ children: "Tab diagnostics"
4015
4044
  }
4016
4045
  ),
4046
+ /* @__PURE__ */ jsx2("p", { className: "mt-1 text-og-xs text-og-fg-subtle", children: "Includes earlier pages in this tab." }),
4017
4047
  /* @__PURE__ */ jsxs2("dl", { className: "mt-2 grid grid-cols-2 gap-2", children: [
4018
- /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Console errors", value: diagnostics?.consoleErrorCount ?? 0 }),
4019
- /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Page errors", value: diagnostics?.pageErrorCount ?? 0 }),
4020
- /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Failed requests", value: diagnostics?.failedRequestCount ?? 0 }),
4021
- /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Downloads", value: diagnostics?.downloadCount ?? 0 })
4048
+ /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Console errors", value: diagnostics?.consoleErrorCount }),
4049
+ /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Page errors", value: diagnostics?.pageErrorCount }),
4050
+ /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Failed requests", value: diagnostics?.failedRequestCount }),
4051
+ /* @__PURE__ */ jsx2(DiagnosticCount, { label: "Downloads", value: diagnostics?.downloadCount })
4022
4052
  ] }),
4023
4053
  session?.failureCode ? /* @__PURE__ */ jsxs2("p", { className: "mt-2 rounded-og-sm border border-og-status-error/30 bg-og-status-error/5 px-2.5 py-2 text-og-xs text-og-danger", children: [
4024
4054
  "Browser state: ",
@@ -4258,7 +4288,7 @@ function DiagnosticCount(props) {
4258
4288
  "mt-0.5 text-og-sm font-semibold",
4259
4289
  props.value ? "text-og-fg" : "text-og-fg-muted"
4260
4290
  ),
4261
- children: props.value
4291
+ children: props.value ?? "Unavailable"
4262
4292
  }
4263
4293
  )
4264
4294
  ] });
@@ -4441,4 +4471,4 @@ export {
4441
4471
  useBrowserFrameStream,
4442
4472
  BrowserViewer
4443
4473
  };
4444
- //# sourceMappingURL=chunk-S5JQ4R22.js.map
4474
+ //# sourceMappingURL=chunk-BDKR6BAR.js.map