@qredence/fleet 0.5.10 → 0.6.0

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 (115) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/web/client/assets/agent-activity-CwMDU7aP.js +1 -0
  3. package/dist/web/client/assets/artifacts-panel-CJ75gQub.js +1 -0
  4. package/dist/web/client/assets/chat-Ci2cEQrR.js +52 -0
  5. package/dist/web/client/assets/{chat-command-palette-DfYSPPXI.js → chat-command-palette-CkISHfKE.js} +1 -1
  6. package/dist/web/client/assets/{citations-BQ_pr_9_.js → citations-C_tPOJE_.js} +1 -1
  7. package/dist/web/client/assets/{command-DPfiaYUL.js → command-_WjnervL.js} +1 -1
  8. package/dist/web/client/assets/fleet-message-queue-BCno4XP-.js +1 -0
  9. package/dist/web/client/assets/{fleet-pi-tool-renderer-AJoMbXBa.js → fleet-pi-tool-renderer-BEDIO3al.js} +4 -4
  10. package/dist/web/client/assets/fleet-reasoning-panel-CbkO7u-v.js +1 -0
  11. package/dist/web/client/assets/{fleet-subagent-list-BnRnrWKS.js → fleet-subagent-list-iKUtLJKZ.js} +1 -1
  12. package/dist/web/client/assets/fleet-tool-timeline-C8heL7ae.js +1 -0
  13. package/dist/web/client/assets/{fork-picker-dialog-CkcSekBl.js → fork-picker-dialog-ByBOGVsa.js} +1 -1
  14. package/dist/web/client/assets/globals-B_I1Eq1u.css +2 -0
  15. package/dist/web/client/assets/horizontal-resize-CwoDojST.js +1 -0
  16. package/dist/web/client/assets/{index-DlnHLDpx.js → index-DJ1fFbQu.js} +3 -3
  17. package/dist/web/client/assets/input-group-Tb5TYbzi.js +1 -0
  18. package/dist/web/client/assets/{ipython-tool-BrMePqD-.js → ipython-tool-ldJ9F1Cw.js} +1 -1
  19. package/dist/web/client/assets/model-selector-list-Ch05B2nZ.js +1 -0
  20. package/dist/web/client/assets/{openui-renderer-DwYFJdbe.js → openui-renderer-Bf60nxNi.js} +4 -4
  21. package/dist/web/client/assets/pencil-DcUwsKLn.js +1 -0
  22. package/dist/web/client/assets/prompt-input-qPIXZ-Rb.js +1 -0
  23. package/dist/web/client/assets/prompt-suggestions-Cc--lSNR.js +1 -0
  24. package/dist/web/client/assets/{provider-label-BCJh04J5.js → provider-label-DDLRnZyC.js} +1 -1
  25. package/dist/web/client/assets/repl-panel-DsPX04Xr.js +1 -0
  26. package/dist/web/client/assets/{resources-panel-Bo8dfUdm.js → resources-panel-D867-goy.js} +1 -1
  27. package/dist/web/client/assets/right-panel-registry-Dp8yX-oL.js +2 -0
  28. package/dist/web/client/assets/routes-DpgMJZ5n.js +16 -0
  29. package/dist/web/client/assets/safe-storage-s25GrfpH.js +1 -0
  30. package/dist/web/client/assets/session-insights-panel-YnaXvTpi.js +1 -0
  31. package/dist/web/client/assets/settings-dialog-YJkvt5EB.js +2 -0
  32. package/dist/web/client/assets/skeleton-loaders-C9vHwAYV.js +1 -0
  33. package/dist/web/client/assets/{subagent-chat-panel-DseoO31p.js → subagent-chat-panel-Yujplxpb.js} +1 -1
  34. package/dist/web/client/assets/subagent-transcript-CnI-mqN0.js +1 -0
  35. package/dist/web/client/assets/subagents-panel-CjXEdimj.js +1 -0
  36. package/dist/web/client/assets/{surfaces-cW-gp56p.js → surfaces-DI-U-_2a.js} +1 -1
  37. package/dist/web/client/assets/tool-result-DfnPN0FQ.js +4 -0
  38. package/dist/web/client/assets/ui-preferences-CImQGZm_.js +1 -0
  39. package/dist/web/client/assets/virtualized-turn-list--Vynre4D.js +6 -0
  40. package/dist/web/client/assets/{workspace-panel-DI1W3ce9.js → workspace-panel-CPPIznT9.js} +1 -1
  41. package/dist/web/client/bundle-budget.json +6 -6
  42. package/dist/web/server/{_tanstack-start-manifest_v-Cdx6hy2i-I7A5YJRU.js → _tanstack-start-manifest_v-DS_CSIFQ-WB3VTKF3.js} +15 -13
  43. package/dist/web/server/{agent-activity-B-JMvecd-SLE3GGY2.js → agent-activity-CS2rbF_C-A3R26CYH.js} +2 -2
  44. package/dist/web/server/{artifacts-panel-DLMK1O8P-42T45JMA.js → artifacts-panel-CaKrX2XC-R37I4BHF.js} +12 -12
  45. package/dist/web/server/{chat-command-palette-CdYwoTMe-4LBAZF7K.js → chat-command-palette-7gbqEnm9-6XICQZN7.js} +4 -4
  46. package/dist/web/server/{chunk-EBCYJSBR.js → chunk-7SD2ZSEA.js} +3 -3
  47. package/dist/web/server/{chunk-6AW2XFTZ.js → chunk-BBBS5AS7.js} +194 -10
  48. package/dist/web/server/{chunk-EOVMHQ2H.js → chunk-CNXJN5HN.js} +7 -7
  49. package/dist/web/server/{chunk-XKKXXG6N.js → chunk-DI7XRK2H.js} +2 -2
  50. package/dist/web/server/{chunk-KNJUSMBT.js → chunk-DZ2IC3FH.js} +2 -2
  51. package/dist/web/server/{chunk-K5ESTT4A.js → chunk-EAE2QXRK.js} +11 -3
  52. package/dist/web/server/{chunk-VHBFU4TG.js → chunk-EH4BZ6QM.js} +123 -16
  53. package/dist/web/server/{chunk-54II5QXQ.js → chunk-ETTDO4UO.js} +6 -3
  54. package/dist/web/server/{chunk-EHNIN245.js → chunk-GETSIVNU.js} +5 -5
  55. package/dist/web/server/{chunk-X2R5YPQZ.js → chunk-IJPCV6DH.js} +3 -2
  56. package/dist/web/server/{chunk-AJJ2S5FF.js → chunk-JQDLJ7KI.js} +20 -20
  57. package/dist/web/server/{chunk-M564UIEY.js → chunk-KELEYPVK.js} +8 -8
  58. package/dist/web/server/{chunk-OB5OSYJK.js → chunk-LXJD6IGW.js} +53 -29
  59. package/dist/web/server/chunk-M5RSPNYN.js +22 -0
  60. package/dist/web/server/{chunk-2TRF62K5.js → chunk-N6NOTURM.js} +3 -3
  61. package/dist/web/server/{chunk-5XX7RKJ6.js → chunk-NXJ32VFR.js} +5 -5
  62. package/dist/web/server/{chunk-P7H2OPKF.js → chunk-PIOFZUOU.js} +9 -1
  63. package/dist/web/server/chunk-PTCKOR23.js +39 -0
  64. package/dist/web/server/chunk-SZJUXVWG.js +40 -0
  65. package/dist/web/server/{chunk-TCH3U26B.js → chunk-TWYHHG5N.js} +2 -10
  66. package/dist/web/server/{chunk-FED63ZHU.js → chunk-WHBVQJ4K.js} +11 -6
  67. package/dist/web/server/{chunk-ANL4B775.js → chunk-XLNCWZMZ.js} +2 -2
  68. package/dist/web/server/{chunk-GM32R7JW.js → chunk-YKVGQBZA.js} +10 -8
  69. package/dist/web/server/{chunk-NRDG2ISJ.js → chunk-YNUWKMNQ.js} +59 -52
  70. package/dist/web/server/{chunk-3PIUR75R.js → chunk-YXXRP3NS.js} +9 -9
  71. package/dist/web/server/fleet-message-queue-BS-cZ56r-GLZXUKDF.js +152 -0
  72. package/dist/web/server/{fleet-pi-tool-renderer-RIeVlM9J-D6MISCQC.js → fleet-pi-tool-renderer-umKunT3K-O4GBH35V.js} +5 -5
  73. package/dist/web/server/{fleet-reasoning-panel-D_K48UOT-GN2PA6KT.js → fleet-reasoning-panel-BxC2COxi-GPLMQSTT.js} +9 -9
  74. package/dist/web/server/{fleet-subagent-list-5luKtpds-3OTVFHJQ.js → fleet-subagent-list-CpSYzCIq-JDH2LHSS.js} +1 -1
  75. package/dist/web/server/{fleet-tool-timeline-DwRqQgOj-HUFLGMDV.js → fleet-tool-timeline-IB36_PB2-XJENTO6I.js} +1 -1
  76. package/dist/web/server/{fork-picker-dialog-B9yGc8Au-IL63F2DN.js → fork-picker-dialog-DlINz9UQ-UWIXFDJX.js} +3 -3
  77. package/dist/web/server/{model-selector-list-cb2-ewoA-KIVU6LD3.js → model-selector-list-jBTZc2Mu-OXJOS5NA.js} +7 -7
  78. package/dist/web/server/{openui-renderer-Czy5Vo2L-BLXPJD65.js → openui-renderer-Biyyjhjn-SJOEKPTJ.js} +4 -4
  79. package/dist/web/server/{prompt-suggestions-BOmHi4-J-C563CHFU.js → prompt-suggestions-D4AEEY7K-RZSP7PWV.js} +3 -3
  80. package/dist/web/server/{repl-panel-yyxhwe4c-7U6HXYPS.js → repl-panel-D5KsoJik-BQKO53JO.js} +9 -9
  81. package/dist/web/server/{resources-panel-j4fAIi9g-5C267IXV.js → resources-panel-CE5pD4vy-V5FXBTYC.js} +2 -2
  82. package/dist/web/server/{router-CgSWrAYc-5UBYSZTJ.js → router-DWALoX_M-I5CBL7FQ.js} +1461 -515
  83. package/dist/web/server/{routes-CP_BBhD0-BAWQYGKY.js → routes-BBVirYfL-5WXMOT7M.js} +908 -566
  84. package/dist/web/server/server.js +2 -2
  85. package/dist/web/server/{session-insights-panel-BHZyKDTo-LRMAMA3O.js → session-insights-panel-CUhdgvRt-VB2HUCQP.js} +4 -4
  86. package/dist/web/server/{settings-dialog-CxHe8nym-KKXDPTIW.js → settings-dialog-DndPbM-v-RFNXXEAN.js} +902 -575
  87. package/dist/web/server/{subagent-chat-panel-DlSsM59d-DBW7DI3T.js → subagent-chat-panel-C0RpnXav-J7VYO7QY.js} +11 -11
  88. package/dist/web/server/{subagents-panel-Txzk8oDb-NRKLASYN.js → subagents-panel-jDqIn9Nh-YEV6QLUY.js} +13 -13
  89. package/dist/web/server/{workspace-panel-BOs-58Cv-SWQBMZSB.js → workspace-panel-CX_Vo6As-EWO6AMPI.js} +5 -4
  90. package/package.json +1 -1
  91. package/dist/web/client/assets/agent-activity-CDcDNVC6.js +0 -1
  92. package/dist/web/client/assets/artifacts-panel-CObI-DMt.js +0 -1
  93. package/dist/web/client/assets/chat-C8XDWWXz.js +0 -52
  94. package/dist/web/client/assets/fleet-message-queue-zWM5-y18.js +0 -1
  95. package/dist/web/client/assets/fleet-reasoning-panel-MtbSdoCv.js +0 -1
  96. package/dist/web/client/assets/fleet-tool-timeline-COzPrwr8.js +0 -1
  97. package/dist/web/client/assets/generative-text-renderer-CDKHv-v_.js +0 -6
  98. package/dist/web/client/assets/globals-DisQPFtV.css +0 -2
  99. package/dist/web/client/assets/horizontal-resize-Bl3AyBJg.js +0 -1
  100. package/dist/web/client/assets/input-group-BFDsCVS9.js +0 -1
  101. package/dist/web/client/assets/model-selector-list-DQaPFUYt.js +0 -1
  102. package/dist/web/client/assets/prompt-input-DZ4cho_e.js +0 -1
  103. package/dist/web/client/assets/prompt-suggestions-CXM6knMK.js +0 -1
  104. package/dist/web/client/assets/repl-panel-BDQ5MEgV.js +0 -1
  105. package/dist/web/client/assets/right-panel-registry-VVRPktV3.js +0 -2
  106. package/dist/web/client/assets/routes-DAikUNzO.js +0 -16
  107. package/dist/web/client/assets/session-insights-panel-CQdT90Op.js +0 -1
  108. package/dist/web/client/assets/settings-dialog-DS64KmwC.js +0 -1
  109. package/dist/web/client/assets/skeleton-loaders-DjGv9LLA.js +0 -1
  110. package/dist/web/client/assets/subagent-transcript-cxVKYnh9.js +0 -1
  111. package/dist/web/client/assets/subagents-panel-CHC96I68.js +0 -1
  112. package/dist/web/client/assets/tool-result-Baj3CdL_.js +0 -4
  113. package/dist/web/client/assets/ui-preferences-DUEFuJFj.js +0 -1
  114. package/dist/web/server/chunk-QK4CHLVV.js +0 -17
  115. package/dist/web/server/fleet-message-queue-BxycG26e-2XLOTCLP.js +0 -75
@@ -1,6 +1,6 @@
1
1
  import "./chunk-MLKGABMK.js";
2
2
 
3
- // web/app/dist/server/assets/_tanstack-start-manifest_v-Cdx6hy2i.js
3
+ // web/app/dist/server/assets/_tanstack-start-manifest_v-DS_CSIFQ.js
4
4
  var tsrStartManifest = () => ({ routes: {
5
5
  __root__: {
6
6
  filePath: "/home/circleci/prime-agent/web/app/src/routes/__root.tsx",
@@ -15,7 +15,7 @@ var tsrStartManifest = () => ({ routes: {
15
15
  "/api/workspace/tree"
16
16
  ],
17
17
  preloads: [
18
- "/assets/index-DlnHLDpx.js",
18
+ "/assets/index-DJ1fFbQu.js",
19
19
  "/assets/rolldown-runtime-hePW80VL.js",
20
20
  "/assets/bundle-mjs-DKHVkVWu.js",
21
21
  "/assets/react-dom-Bwxum3ti.js",
@@ -25,47 +25,48 @@ var tsrStartManifest = () => ({ routes: {
25
25
  "/assets/layout-gyLzPvVv.js",
26
26
  "/assets/toast-Bt9p2OL4.js",
27
27
  "/assets/card-BKl76a3R.js",
28
- "/assets/ui-preferences-DUEFuJFj.js",
28
+ "/assets/ui-preferences-CImQGZm_.js",
29
29
  "/assets/preload-helper-Czpn1I53.js"
30
30
  ],
31
31
  scripts: [{ attrs: {
32
32
  type: "module",
33
33
  async: true,
34
- src: "/assets/index-DlnHLDpx.js"
34
+ src: "/assets/index-DJ1fFbQu.js"
35
35
  } }]
36
36
  },
37
37
  "/": {
38
38
  filePath: "/home/circleci/prime-agent/web/app/src/routes/index.tsx",
39
39
  children: void 0,
40
40
  preloads: [
41
- "/assets/routes-DAikUNzO.js",
41
+ "/assets/routes-DpgMJZ5n.js",
42
42
  "/assets/ease-u56MhKYS.js",
43
- "/assets/prompt-input-DZ4cho_e.js",
43
+ "/assets/prompt-input-qPIXZ-Rb.js",
44
44
  "/assets/use-reduced-motion-eORd7fqW.js",
45
45
  "/assets/createBaseUIEventDetails-DV0dQrBX.js",
46
46
  "/assets/dialog-BEZuZhzk.js",
47
47
  "/assets/provider-catalog-D8G66gwc.js",
48
48
  "/assets/useBaseUiId-CHqXB2UQ.js",
49
- "/assets/provider-label-BCJh04J5.js",
49
+ "/assets/provider-label-DDLRnZyC.js",
50
50
  "/assets/utils-Eg7xtNmV.js",
51
51
  "/assets/createLucideIcon-DwxZHm0M.js",
52
- "/assets/right-panel-registry-VVRPktV3.js",
53
- "/assets/citations-BQ_pr_9_.js",
52
+ "/assets/right-panel-registry-Dp8yX-oL.js",
53
+ "/assets/citations-C_tPOJE_.js",
54
54
  "/assets/resource-helpers-Q2T0YCMO.js",
55
55
  "/assets/bot-Bs7QWJ2q.js",
56
56
  "/assets/check-JjHKAZas.js",
57
57
  "/assets/chevron-down-BEVGmnSb.js",
58
- "/assets/generative-text-renderer-CDKHv-v_.js",
58
+ "/assets/virtualized-turn-list--Vynre4D.js",
59
59
  "/assets/chevron-right-DrJxToLs.js",
60
60
  "/assets/chevron-up-CnSvySGH.js",
61
61
  "/assets/circle-alert-CONlFReH.js",
62
62
  "/assets/loader-circle-DjfHXUPB.js",
63
63
  "/assets/action-swap-roll-BB8DFMuf.js",
64
64
  "/assets/file-text-T-NcAlZs.js",
65
- "/assets/horizontal-resize-Bl3AyBJg.js",
65
+ "/assets/horizontal-resize-CwoDojST.js",
66
66
  "/assets/folder-BC5p7qK7.js",
67
67
  "/assets/gauge-DNpstbBn.js",
68
68
  "/assets/package-CdcJFPf2.js",
69
+ "/assets/pencil-DcUwsKLn.js",
69
70
  "/assets/plus-DXN1Bg_z.js",
70
71
  "/assets/refresh-cw-IThTJ3j-.js",
71
72
  "/assets/rotate-ccw-WNFNkKQD.js",
@@ -74,14 +75,15 @@ var tsrStartManifest = () => ({ routes: {
74
75
  "/assets/sparkles-DuclzqlE.js",
75
76
  "/assets/triangle-alert-CU-gd7ui.js",
76
77
  "/assets/x-CsRC_tCI.js",
78
+ "/assets/safe-storage-s25GrfpH.js",
77
79
  "/assets/cn-C8c0S2mI.js",
78
80
  "/assets/notify-DgMKgZZW.js",
79
81
  "/assets/workspace-path-nav-C0AQNZyy.js",
80
82
  "/assets/useControlled-CJJ9BOQB.js",
81
83
  "/assets/agent-disclosure-B8SnhQXL.js",
82
- "/assets/surfaces-cW-gp56p.js",
84
+ "/assets/surfaces-DI-U-_2a.js",
83
85
  "/assets/prime-agent-artifacts-C-g1VPiW.js",
84
- "/assets/chat-C8XDWWXz.js",
86
+ "/assets/chat-Ci2cEQrR.js",
85
87
  "/assets/right-panel-context-DHlNWJsF.js",
86
88
  "/assets/input-0wwjWjKq.js",
87
89
  "/assets/artifacts-utils-N_kUFbz2.js"
@@ -54,7 +54,7 @@ import {
54
54
  import "./chunk-JDCCC7A7.js";
55
55
  import "./chunk-MLKGABMK.js";
56
56
 
57
- // web/app/dist/server/assets/agent-activity-B-JMvecd.js
57
+ // web/app/dist/server/assets/agent-activity-CS2rbF_C.js
58
58
  import { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from "react";
59
59
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
60
60
  var Circle = createLucideIcon("circle", [["circle", {
@@ -254,7 +254,7 @@ function ActivityAction({ action }) {
254
254
  type: "button",
255
255
  "aria-label": action.ariaLabel ?? action.label,
256
256
  onClick: action.onClick,
257
- className: "shrink-0 rounded-md px-1.5 py-1 text-[10px] font-medium text-primary outline-none hover:bg-primary/10 focus-visible:ring-2 focus-visible:ring-ring",
257
+ className: "shrink-0 rounded-md px-1.5 py-1 text-[0.625rem] font-medium text-primary outline-none hover:bg-primary/10 focus-visible:ring-2 focus-visible:ring-ring",
258
258
  children: action.label
259
259
  });
260
260
  }
@@ -9,7 +9,7 @@ import {
9
9
  FileDiff,
10
10
  ToolResult,
11
11
  ToolResultOutput
12
- } from "./chunk-3PIUR75R.js";
12
+ } from "./chunk-YXXRP3NS.js";
13
13
  import "./chunk-2ATMSG7U.js";
14
14
  import "./chunk-HFQTI7AX.js";
15
15
  import {
@@ -30,12 +30,12 @@ import "./chunk-FAGDMGLK.js";
30
30
  import {
31
31
  GenerativeTextRenderer,
32
32
  OpenUIHtmlArtifactView
33
- } from "./chunk-M564UIEY.js";
33
+ } from "./chunk-KELEYPVK.js";
34
34
  import {
35
35
  UiErrorBoundary
36
- } from "./chunk-KNJUSMBT.js";
37
- import "./chunk-K5ESTT4A.js";
38
- import "./chunk-NRDG2ISJ.js";
36
+ } from "./chunk-DZ2IC3FH.js";
37
+ import "./chunk-EAE2QXRK.js";
38
+ import "./chunk-YNUWKMNQ.js";
39
39
  import "./chunk-UAPNEWCA.js";
40
40
  import "./chunk-WM4PUT6M.js";
41
41
  import "./chunk-RJOANOT4.js";
@@ -71,7 +71,7 @@ import "./chunk-JDCCC7A7.js";
71
71
  import "./chunk-L547YHC4.js";
72
72
  import "./chunk-MLKGABMK.js";
73
73
 
74
- // web/app/dist/server/assets/artifacts-panel-DLMK1O8P.js
74
+ // web/app/dist/server/assets/artifacts-panel-CaKrX2XC.js
75
75
  import { useEffect, useMemo, useRef, useState } from "react";
76
76
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
77
77
  var LayoutTemplate = createLucideIcon("layout-template", [
@@ -213,7 +213,7 @@ function OpenUIArtifact({ artifact, selected }) {
213
213
  children: artifact.title || "OpenUI artifact"
214
214
  }),
215
215
  /* @__PURE__ */ jsx("span", {
216
- className: "shrink-0 text-[10px] text-foreground/40",
216
+ className: "shrink-0 text-[0.625rem] text-foreground/40",
217
217
  children: artifact.status
218
218
  })
219
219
  ]
@@ -303,7 +303,7 @@ function GenerativeUiBlockRow({ block, expanded, isStreaming, onOpenUIAction, on
303
303
  children: block.component
304
304
  }),
305
305
  /* @__PURE__ */ jsxs("span", {
306
- className: "shrink-0 text-[10px] text-foreground/40",
306
+ className: "shrink-0 text-[0.625rem] text-foreground/40",
307
307
  children: ["#", block.ordinal]
308
308
  })
309
309
  ]
@@ -342,7 +342,7 @@ function ArtifactsPanelContent({ messages, onOpenUIAction, status, artifactRuns
342
342
  children: "OpenUI artifacts"
343
343
  }),
344
344
  /* @__PURE__ */ jsx("span", {
345
- className: "shrink-0 text-[10px] text-foreground/40",
345
+ className: "shrink-0 text-[0.625rem] text-foreground/40",
346
346
  children: openUIArtifacts.length
347
347
  })
348
348
  ]
@@ -365,7 +365,7 @@ function ArtifactsPanelContent({ messages, onOpenUIAction, status, artifactRuns
365
365
  children: "Technical artifacts"
366
366
  }),
367
367
  /* @__PURE__ */ jsx("span", {
368
- className: "shrink-0 text-[10px] text-foreground/40",
368
+ className: "shrink-0 text-[0.625rem] text-foreground/40",
369
369
  children: nonOpenUIArtifacts.length
370
370
  })
371
371
  ]
@@ -388,12 +388,12 @@ function ArtifactsPanelContent({ messages, onOpenUIAction, status, artifactRuns
388
388
  children: "Generative UI"
389
389
  }),
390
390
  /* @__PURE__ */ jsx("span", {
391
- className: "shrink-0 text-[10px] text-foreground/40",
391
+ className: "shrink-0 text-[0.625rem] text-foreground/40",
392
392
  children: blocks.length > 0 ? `${blocks.length}` : "none yet"
393
393
  })
394
394
  ]
395
395
  }), blocks.length === 0 ? /* @__PURE__ */ jsx("p", {
396
- className: "px-2 pb-1 text-[11px] leading-4 text-foreground/40",
396
+ className: "px-2 pb-1 text-[0.6875rem] leading-4 text-foreground/40",
397
397
  children: "OpenUI interfaces the agent generates in this session appear here, and can be re-opened without scrolling the conversation."
398
398
  }) : /* @__PURE__ */ jsx("div", {
399
399
  className: "flex min-h-0 flex-col gap-0.5 overflow-y-auto",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RIGHT_PANEL_LAUNCHER_DEFINITIONS
3
- } from "./chunk-EOVMHQ2H.js";
3
+ } from "./chunk-CNXJN5HN.js";
4
4
  import {
5
5
  Keyboard,
6
6
  Monitor,
@@ -24,8 +24,8 @@ import {
24
24
  CommandItem,
25
25
  CommandList,
26
26
  CommandSeparator
27
- } from "./chunk-XKKXXG6N.js";
28
- import "./chunk-P7H2OPKF.js";
27
+ } from "./chunk-DI7XRK2H.js";
28
+ import "./chunk-PIOFZUOU.js";
29
29
  import "./chunk-JIULUYHT.js";
30
30
  import "./chunk-7PQTPSEE.js";
31
31
  import "./chunk-P6UMR32I.js";
@@ -47,7 +47,7 @@ import "./chunk-JDCCC7A7.js";
47
47
  import "./chunk-L547YHC4.js";
48
48
  import "./chunk-MLKGABMK.js";
49
49
 
50
- // web/app/dist/server/assets/chat-command-palette-CdYwoTMe.js
50
+ // web/app/dist/server/assets/chat-command-palette-7gbqEnm9.js
51
51
  import { useState } from "react";
52
52
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
53
53
  var RotateCcwClock = createLucideIcon("rotate-ccw-clock", [
@@ -16,7 +16,7 @@ import {
16
16
  __exportAll
17
17
  } from "./chunk-L547YHC4.js";
18
18
 
19
- // web/app/dist/server/assets/fleet-subagent-list-5luKtpds.js
19
+ // web/app/dist/server/assets/fleet-subagent-list-CpSYzCIq.js
20
20
  import { useMemo, useState } from "react";
21
21
  import { jsx, jsxs } from "react/jsx-runtime";
22
22
  var fleet_subagent_list_exports = /* @__PURE__ */ __exportAll({ FleetSubagentList: () => FleetSubagentList });
@@ -62,7 +62,7 @@ function FleetSubagentList({ children, tree, className }) {
62
62
  className: "truncate text-sm text-foreground/85",
63
63
  children: child.label
64
64
  }), child.model ? /* @__PURE__ */ jsx("span", {
65
- className: "truncate font-mono text-[10px] text-muted-foreground",
65
+ className: "truncate font-mono text-[0.625rem] text-muted-foreground",
66
66
  children: child.model
67
67
  }) : null]
68
68
  }), child.answerPreview || child.activity?.toolName || child.error ? /* @__PURE__ */ jsx("p", {
@@ -71,7 +71,7 @@ function FleetSubagentList({ children, tree, className }) {
71
71
  }) : null]
72
72
  }),
73
73
  /* @__PURE__ */ jsx("span", {
74
- className: "shrink-0 text-[10px] capitalize text-muted-foreground",
74
+ className: "shrink-0 text-[0.625rem] capitalize text-muted-foreground",
75
75
  children: child.status
76
76
  })
77
77
  ]
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  LazyMarkdown,
9
9
  useHoverCapable
10
- } from "./chunk-2TRF62K5.js";
10
+ } from "./chunk-N6NOTURM.js";
11
11
  import {
12
12
  Copy
13
13
  } from "./chunk-2ATMSG7U.js";
@@ -42,8 +42,8 @@ import {
42
42
  cn
43
43
  } from "./chunk-DJMHPJBP.js";
44
44
 
45
- // web/app/dist/server/assets/generative-text-renderer-B3H8tWzp.js
46
- import { Suspense, cloneElement, createContext, lazy, memo, useCallback, useContext, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
45
+ // web/app/dist/server/assets/virtualized-turn-list-atr4a0d6.js
46
+ import { Fragment, Suspense, cloneElement, createContext, lazy, memo, useCallback, useContext, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
47
47
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
48
48
  import { createPortal } from "react-dom";
49
49
  var ChevronLeft = createLucideIcon("chevron-left", [["path", {
@@ -669,7 +669,7 @@ function MessageScroller({ followOutput = true, followThreshold = 56, smooth = t
669
669
  children: /* @__PURE__ */ jsx("div", {
670
670
  ref: contentRef,
671
671
  role: "log",
672
- "aria-live": "polite",
672
+ "aria-live": busy ? "off" : "polite",
673
673
  "aria-relevant": "additions text",
674
674
  "aria-busy": busy,
675
675
  className: contentClassName,
@@ -971,7 +971,7 @@ function FileAttachment({ id, filename, size, isImage, url, onRemove, className,
971
971
  title: filename,
972
972
  children: filename
973
973
  }), size !== void 0 && /* @__PURE__ */ jsx("span", {
974
- className: "text-[10px] text-muted-foreground",
974
+ className: "text-[0.625rem] text-muted-foreground",
975
975
  children: formatFileSize(size)
976
976
  })]
977
977
  })] }),
@@ -1153,7 +1153,7 @@ function PayloadPart({ part }) {
1153
1153
  children: part.title
1154
1154
  }),
1155
1155
  part.text ? /* @__PURE__ */ jsx("pre", {
1156
- className: "m-0 whitespace-pre-wrap break-words px-3 py-3 font-mono text-xs leading-5 text-foreground/80",
1156
+ className: "m-0 whitespace-pre-wrap break-words p-3 font-mono text-xs leading-5 text-foreground/80",
1157
1157
  children: part.text
1158
1158
  }) : null,
1159
1159
  payload ? /* @__PURE__ */ jsxs("details", {
@@ -1257,7 +1257,7 @@ function CopyButton({ text, onCopied }) {
1257
1257
  onMouseDown: (event) => event.stopPropagation(),
1258
1258
  className: cn("flex size-6 items-center justify-center rounded-md transition-[background-color,opacity,transform] duration-150 ease-out active:scale-[0.97]", "bg-transparent opacity-50 hover:bg-an-foreground/10 hover:opacity-100"),
1259
1259
  children: /* @__PURE__ */ jsxs("div", {
1260
- className: "relative h-3.5 w-3.5",
1260
+ className: "relative size-3.5",
1261
1261
  children: [/* @__PURE__ */ jsx(Copy, { className: cn("absolute inset-0 h-3.5 w-3.5 text-an-foreground-muted transition-[opacity,transform] duration-150 ease-out", copied ? "scale-50 opacity-0" : "scale-100 opacity-100") }), /* @__PURE__ */ jsx(Check, { className: cn("absolute inset-0 h-3.5 w-3.5 text-an-foreground-muted transition-[opacity,transform] duration-150 ease-out", copied ? "scale-100 opacity-100" : "scale-50 opacity-0") })]
1262
1262
  })
1263
1263
  });
@@ -1416,7 +1416,7 @@ function buildAssistantElements(parts, opts) {
1416
1416
  }
1417
1417
  const text = textChunks.join("\n\n");
1418
1418
  if (text) elems.push(/* @__PURE__ */ jsx("div", {
1419
- className: "group/assistant-text text-[14px]",
1419
+ className: "group/assistant-text text-[0.875rem]",
1420
1420
  children: /* @__PURE__ */ jsx(TextRendererComponent, {
1421
1421
  content: text,
1422
1422
  isStreaming,
@@ -1487,7 +1487,7 @@ function groupMessages(messages) {
1487
1487
  if (current) turns.push(current);
1488
1488
  return turns;
1489
1489
  }
1490
- var LazyGenerativeTextRenderer = lazy(() => import("./openui-renderer-Czy5Vo2L-BLXPJD65.js").then((n) => n.n).then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
1490
+ var LazyGenerativeTextRenderer = lazy(() => import("./openui-renderer-Biyyjhjn-SJOEKPTJ.js").then((n) => n.n).then(({ GenerativeTextRenderer }) => ({ default: GenerativeTextRenderer })));
1491
1491
  function PlainTextFallback({ className, content }) {
1492
1492
  return /* @__PURE__ */ jsx("div", {
1493
1493
  className: className ? `${className} whitespace-pre-wrap` : "whitespace-pre-wrap",
@@ -1507,6 +1507,189 @@ function FleetGenerativeTextRenderer(props) {
1507
1507
  children: /* @__PURE__ */ jsx(LazyGenerativeTextRenderer, { ...props })
1508
1508
  });
1509
1509
  }
1510
+ function findItemAtOffset(offsets, target, itemCount) {
1511
+ if (itemCount === 0) return 0;
1512
+ let low = 0;
1513
+ let high = itemCount;
1514
+ while (low < high) {
1515
+ const middle = Math.floor((low + high) / 2);
1516
+ if (offsets[middle] <= target) low = middle + 1;
1517
+ else high = middle;
1518
+ }
1519
+ return Math.max(0, Math.min(itemCount - 1, low - 1));
1520
+ }
1521
+ function buildOffsets(itemKeys, measuredHeights, estimateSize, itemGap) {
1522
+ const offsets = [0];
1523
+ for (const [index, key] of itemKeys.entries()) offsets.push(offsets[offsets.length - 1] + (measuredHeights.get(key) ?? estimateSize) + (index < itemKeys.length - 1 ? itemGap : 0));
1524
+ return offsets;
1525
+ }
1526
+ function VirtualizedTurnList({ estimateSize, getItemKey, itemGap = 0, items, overscan = 1.5, renderItem, viewportRef }) {
1527
+ const itemKeys = useMemo(() => items.map((item, index) => getItemKey(item, index)), [getItemKey, items]);
1528
+ const shouldVirtualize = items.length >= 40;
1529
+ const [measuredHeights, setMeasuredHeights] = useState(() => /* @__PURE__ */ new Map());
1530
+ const [viewport, setViewport] = useState({
1531
+ height: 0,
1532
+ scrollTop: 0
1533
+ });
1534
+ const itemKeysRef = useRef(itemKeys);
1535
+ const measuredHeightsRef = useRef(measuredHeights);
1536
+ const estimateSizeRef = useRef(estimateSize);
1537
+ const itemGapRef = useRef(itemGap);
1538
+ const offsetsRef = useRef([0]);
1539
+ const pendingScrollAdjustmentRef = useRef(0);
1540
+ const rowNodesRef = useRef(/* @__PURE__ */ new Map());
1541
+ const rowKeysRef = useRef(/* @__PURE__ */ new WeakMap());
1542
+ const rowObserverRef = useRef(null);
1543
+ const updateViewport = useCallback(() => {
1544
+ const element = viewportRef.current;
1545
+ if (!element) return;
1546
+ const next = {
1547
+ height: element.clientHeight,
1548
+ scrollTop: element.scrollTop
1549
+ };
1550
+ setViewport((current) => current.height === next.height && current.scrollTop === next.scrollTop ? current : next);
1551
+ }, [viewportRef]);
1552
+ const setRowRef = useCallback((key, node) => {
1553
+ const previous = rowNodesRef.current.get(key);
1554
+ if (previous && previous !== node) {
1555
+ rowObserverRef.current?.unobserve(previous);
1556
+ rowNodesRef.current.delete(key);
1557
+ }
1558
+ if (!node) return;
1559
+ rowNodesRef.current.set(key, node);
1560
+ rowKeysRef.current.set(node, key);
1561
+ rowObserverRef.current?.observe(node);
1562
+ }, []);
1563
+ const offsets = useMemo(() => {
1564
+ return buildOffsets(itemKeys, measuredHeights, estimateSize, itemGap);
1565
+ }, [
1566
+ estimateSize,
1567
+ itemGap,
1568
+ itemKeys,
1569
+ measuredHeights
1570
+ ]);
1571
+ useLayoutEffect(() => {
1572
+ updateViewport();
1573
+ }, [items.length, updateViewport]);
1574
+ useLayoutEffect(() => {
1575
+ itemKeysRef.current = itemKeys;
1576
+ measuredHeightsRef.current = measuredHeights;
1577
+ estimateSizeRef.current = estimateSize;
1578
+ itemGapRef.current = itemGap;
1579
+ offsetsRef.current = offsets;
1580
+ }, [
1581
+ estimateSize,
1582
+ itemGap,
1583
+ itemKeys,
1584
+ measuredHeights,
1585
+ offsets
1586
+ ]);
1587
+ useEffect(() => {
1588
+ const element = viewportRef.current;
1589
+ if (!element) return;
1590
+ element.addEventListener("scroll", updateViewport, { passive: true });
1591
+ window.addEventListener("resize", updateViewport);
1592
+ updateViewport();
1593
+ let viewportObserver;
1594
+ if (typeof ResizeObserver !== "undefined") {
1595
+ viewportObserver = new ResizeObserver(updateViewport);
1596
+ viewportObserver.observe(element);
1597
+ }
1598
+ return () => {
1599
+ element.removeEventListener("scroll", updateViewport);
1600
+ window.removeEventListener("resize", updateViewport);
1601
+ viewportObserver?.disconnect();
1602
+ };
1603
+ }, [updateViewport, viewportRef]);
1604
+ const updateMeasuredHeights = useCallback((entries) => {
1605
+ const current = measuredHeightsRef.current;
1606
+ let next = current;
1607
+ for (const entry of entries) {
1608
+ const key = rowKeysRef.current.get(entry.target);
1609
+ const height = entry.contentRect.height;
1610
+ if (!key || height <= 0 || current.get(key) === height) continue;
1611
+ if (next === current) next = new Map(current);
1612
+ next.set(key, height);
1613
+ }
1614
+ if (next === current) return;
1615
+ const element = viewportRef.current;
1616
+ const itemKeys2 = itemKeysRef.current;
1617
+ const nextOffsets = buildOffsets(itemKeys2, next, estimateSizeRef.current, itemGapRef.current);
1618
+ if (element && itemKeys2.length > 0) {
1619
+ const beforeOffsets = offsetsRef.current;
1620
+ const anchorIndex = findItemAtOffset(beforeOffsets, Math.max(0, element.scrollTop), itemKeys2.length);
1621
+ const anchorKey = itemKeys2[anchorIndex];
1622
+ if (anchorKey && anchorIndex > 0) {
1623
+ const offsetDelta = (nextOffsets[itemKeys2.indexOf(anchorKey)] ?? 0) - (beforeOffsets[anchorIndex] ?? 0);
1624
+ if (offsetDelta !== 0) pendingScrollAdjustmentRef.current += offsetDelta;
1625
+ }
1626
+ }
1627
+ measuredHeightsRef.current = next;
1628
+ offsetsRef.current = nextOffsets;
1629
+ setMeasuredHeights(next);
1630
+ }, [viewportRef]);
1631
+ useLayoutEffect(() => {
1632
+ if (!shouldVirtualize || typeof ResizeObserver === "undefined") return;
1633
+ const observer = new ResizeObserver((entries) => updateMeasuredHeights(entries));
1634
+ rowObserverRef.current = observer;
1635
+ for (const node of rowNodesRef.current.values()) observer.observe(node);
1636
+ return () => {
1637
+ observer.disconnect();
1638
+ if (rowObserverRef.current === observer) rowObserverRef.current = null;
1639
+ };
1640
+ }, [shouldVirtualize, updateMeasuredHeights]);
1641
+ useEffect(() => {
1642
+ const current = measuredHeightsRef.current;
1643
+ if (current.size === 0) return;
1644
+ const validKeys = new Set(itemKeys);
1645
+ const next = new Map([...current].filter(([key]) => validKeys.has(key)));
1646
+ if (next.size === current.size) return;
1647
+ measuredHeightsRef.current = next;
1648
+ setMeasuredHeights(next);
1649
+ }, [itemKeys]);
1650
+ useLayoutEffect(() => {
1651
+ const adjustment = pendingScrollAdjustmentRef.current;
1652
+ const element = viewportRef.current;
1653
+ if (!element || adjustment === 0) return;
1654
+ element.scrollTop += adjustment;
1655
+ pendingScrollAdjustmentRef.current = 0;
1656
+ updateViewport();
1657
+ }, [
1658
+ measuredHeights,
1659
+ updateViewport,
1660
+ viewportRef
1661
+ ]);
1662
+ if (!shouldVirtualize) return /* @__PURE__ */ jsx(Fragment$1, { children: items.map((item, index) => /* @__PURE__ */ jsx(Fragment, { children: renderItem(item, index) }, itemKeys[index])) });
1663
+ const totalHeight = offsets[offsets.length - 1] ?? 0;
1664
+ const overscanDistance = Math.max(estimateSize, viewport.height * overscan);
1665
+ const firstVisible = findItemAtOffset(offsets, Math.max(0, viewport.scrollTop - overscanDistance), items.length);
1666
+ const lastVisible = Math.min(items.length - 1, findItemAtOffset(offsets, viewport.scrollTop + viewport.height + overscanDistance, items.length) + 1);
1667
+ return /* @__PURE__ */ jsx("div", {
1668
+ "data-rendered-turn-count": lastVisible - firstVisible + 1,
1669
+ "data-total-turn-count": items.length,
1670
+ "data-virtualized-transcript": "true",
1671
+ style: {
1672
+ height: totalHeight,
1673
+ position: "relative",
1674
+ width: "100%"
1675
+ },
1676
+ children: items.slice(firstVisible, lastVisible + 1).map((item, index) => {
1677
+ const itemIndex = firstVisible + index;
1678
+ const key = itemKeys[itemIndex];
1679
+ return /* @__PURE__ */ jsx("div", {
1680
+ ref: (node) => setRowRef(key, node),
1681
+ "data-virtualized-turn-index": itemIndex,
1682
+ style: {
1683
+ left: 0,
1684
+ position: "absolute",
1685
+ right: 0,
1686
+ top: offsets[itemIndex]
1687
+ },
1688
+ children: renderItem(item, itemIndex)
1689
+ }, key);
1690
+ })
1691
+ });
1692
+ }
1510
1693
 
1511
1694
  export {
1512
1695
  ChevronLeft,
@@ -1520,7 +1703,8 @@ export {
1520
1703
  normalizeAssistantToolParts,
1521
1704
  buildAssistantElements,
1522
1705
  groupMessages,
1523
- FleetGenerativeTextRenderer
1706
+ FleetGenerativeTextRenderer,
1707
+ VirtualizedTurnList
1524
1708
  };
1525
1709
  /**
1526
1710
  * @license lucide-react v1.38.0 - ISC
@@ -21,7 +21,7 @@ import {
21
21
  createLucideIcon
22
22
  } from "./chunk-4ZIEVI5O.js";
23
23
 
24
- // web/app/dist/server/assets/right-panel-registry-Belw-Qdn.js
24
+ // web/app/dist/server/assets/right-panel-registry-DWzWGCd2.js
25
25
  import { Suspense, lazy } from "react";
26
26
  import { jsx, jsxs } from "react/jsx-runtime";
27
27
  var Activity = createLucideIcon("activity", [["path", {
@@ -46,12 +46,12 @@ var Library = createLucideIcon("library", [
46
46
  key: "6qkkli"
47
47
  }]
48
48
  ]);
49
- var LazyArtifactsPanel = lazy(() => import("./artifacts-panel-DLMK1O8P-42T45JMA.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
50
- var LazyResourcesPanel = lazy(() => import("./resources-panel-j4fAIi9g-5C267IXV.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
51
- var LazySessionInsightsPanel = lazy(() => import("./session-insights-panel-BHZyKDTo-LRMAMA3O.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
52
- var LazyReplPanel = lazy(() => import("./repl-panel-yyxhwe4c-7U6HXYPS.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
53
- var LazySubagentsPanel = lazy(() => import("./subagents-panel-Txzk8oDb-NRKLASYN.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
54
- var LazyWorkspacePanel = lazy(() => import("./workspace-panel-BOs-58Cv-SWQBMZSB.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
49
+ var LazyArtifactsPanel = lazy(() => import("./artifacts-panel-CaKrX2XC-R37I4BHF.js").then(({ ArtifactsPanelContent }) => ({ default: ArtifactsPanelContent })));
50
+ var LazyResourcesPanel = lazy(() => import("./resources-panel-CE5pD4vy-V5FXBTYC.js").then(({ ResourcesPanelContent }) => ({ default: ResourcesPanelContent })));
51
+ var LazySessionInsightsPanel = lazy(() => import("./session-insights-panel-CUhdgvRt-VB2HUCQP.js").then(({ SessionInsightsPanel }) => ({ default: SessionInsightsPanel })));
52
+ var LazyReplPanel = lazy(() => import("./repl-panel-D5KsoJik-BQKO53JO.js").then(({ ReplPanelContent }) => ({ default: ReplPanelContent })));
53
+ var LazySubagentsPanel = lazy(() => import("./subagents-panel-jDqIn9Nh-YEV6QLUY.js").then(({ SubagentsPanelContent }) => ({ default: SubagentsPanelContent })));
54
+ var LazyWorkspacePanel = lazy(() => import("./workspace-panel-CX_Vo6As-EWO6AMPI.js").then(({ WorkspacePanelContent }) => ({ default: WorkspacePanelContent })));
55
55
  function PanelFallback() {
56
56
  return /* @__PURE__ */ jsxs("div", {
57
57
  className: "flex min-h-32 flex-col gap-3 p-4",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  InputGroup,
3
3
  InputGroupAddon
4
- } from "./chunk-P7H2OPKF.js";
4
+ } from "./chunk-PIOFZUOU.js";
5
5
  import {
6
6
  Search
7
7
  } from "./chunk-JIULUYHT.js";
@@ -28,7 +28,7 @@ import {
28
28
  cn
29
29
  } from "./chunk-DJMHPJBP.js";
30
30
 
31
- // web/app/dist/server/assets/command-C5wJdLIS.js
31
+ // web/app/dist/server/assets/command-CMjQxFsV.js
32
32
  import * as t from "react";
33
33
  import { jsx, jsxs } from "react/jsx-runtime";
34
34
  var U = 1;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenPanelActionSchema
3
- } from "./chunk-NRDG2ISJ.js";
3
+ } from "./chunk-YNUWKMNQ.js";
4
4
  import {
5
5
  useRender
6
6
  } from "./chunk-WM4PUT6M.js";
@@ -14,7 +14,7 @@ import {
14
14
  cn
15
15
  } from "./chunk-DJMHPJBP.js";
16
16
 
17
- // web/app/dist/server/assets/open-panel-action-message-D1DsbE-5.js
17
+ // web/app/dist/server/assets/open-panel-action-message-DsPUT3yZ.js
18
18
  import { Component, createContext, createElement } from "react";
19
19
  import { jsx, jsxs } from "react/jsx-runtime";
20
20
  var h = createContext(null);
@@ -2,7 +2,7 @@ import {
2
2
  cn
3
3
  } from "./chunk-DJMHPJBP.js";
4
4
 
5
- // web/app/dist/server/assets/src-dVFP1Mkc.js
5
+ // web/app/dist/server/assets/src-CynIHTTU.js
6
6
  import "react";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  function Card({ className, size = "default", ...props }) {
@@ -50,7 +50,15 @@ var CSP_META_REFERENCE = /\bcontent-security-policy\b/i;
50
50
  var EVENT_HANDLER_ATTRIBUTE = /\son[a-z][\w:-]*\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/i;
51
51
  var SCRIPT_SOURCE_ATTRIBUTE = /<script\b[^>]*\bsrc\s*=/i;
52
52
  var CSS_IMPORT = /@import\b/i;
53
- var NETWORK_API = /\b(?:fetch|XMLHttpRequest|WebSocket|EventSource|sendBeacon|showModalDialog)\s*\(|\bwindow\s*\.\s*open\s*\(|\b(?:window|globalThis|document|location)\s*\.\s*(?:location|assign|replace|reload|href|pathname|host|hostname|port|protocol|search|hash)\s*=|\b(?:window|globalThis|document|location)\s*\.\s*(?:location\s*\.\s*)?(?:assign|replace|reload)\s*\(/i;
53
+ var NETWORK_API_CALL = /\b(?:fetch|XMLHttpRequest|WebSocket|EventSource|sendBeacon|showModalDialog)\s*\(/i;
54
+ var NETWORK_API_COMPUTED = /\[\s*["'`](?:fetch|XMLHttpRequest|WebSocket|EventSource|sendBeacon|showModalDialog|open)\s*["'`]\s*\]/i;
55
+ var WINDOW_OPEN_CALL = /\bwindow\s*\.\s*open\s*\(|\bwindow\?\.\s*open\s*\(|\bwindow\s+\?\s*\.\s*open\s*\(/i;
56
+ var REMOTE_IMPORT = /\bimport\s*\(\s*["'`](?:https?:\/\/|wss?:\/\/|\/\/|data:|blob:)/i;
57
+ var LOCATION_ASSIGN = /\b(?:window|globalThis|document|location)\s*\.\s*(?:location|assign|replace|reload|href|pathname|host|hostname|port|protocol|search|hash)\s*=/i;
58
+ var LOCATION_CALL = /\b(?:window|globalThis|document|location)\s*\.\s*(?:assign|replace|reload)\s*\(|\b(?:window|globalThis|document|location)\s*\.\s*location\s*\.\s*(?:assign|replace|reload)\s*\(/i;
59
+ function hasNetworkApi(document) {
60
+ return NETWORK_API_CALL.test(document) || NETWORK_API_COMPUTED.test(document) || WINDOW_OPEN_CALL.test(document) || REMOTE_IMPORT.test(document) || LOCATION_ASSIGN.test(document) || LOCATION_CALL.test(document);
61
+ }
54
62
  var RESOURCE_ATTRIBUTE = /\b(?:src|href|action|formaction|poster|cite|background|xlink:href)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/gi;
55
63
  var UNSAFE_SCHEME = /^(?:javascript|vbscript|file|blob|filesystem|about|data:text\/html|data:application\/javascript):/i;
56
64
  function byteLength(value) {
@@ -301,7 +309,7 @@ function validateAndNormalizeOpenUIHtmlArtifact(input) {
301
309
  ok: false,
302
310
  reason: "External or unsafe resource URLs are not allowed."
303
311
  };
304
- if (NETWORK_API.test(document)) return {
312
+ if (hasNetworkApi(document)) return {
305
313
  ok: false,
306
314
  reason: "Network access and pop-up APIs are not allowed."
307
315
  };