local-operator-ui 0.42.1 → 0.42.2

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 (116) hide show
  1. package/out/main/index.js +496 -2
  2. package/out/renderer/assets/{_basePickBy-bSYERMaj.js → _basePickBy-BA9uepHv.js} +1 -1
  3. package/out/renderer/assets/{_baseUniq-XXFAU1GI.js → _baseUniq-CVACH15m.js} +1 -1
  4. package/out/renderer/assets/{agent-details-page-FzlOCzmB.js → agent-details-page-xNTNJ7kP.js} +2 -2
  5. package/out/renderer/assets/{agent-hub-page-V0BSbGBu.js → agent-hub-page-B-zE3Ln0.js} +2 -2
  6. package/out/renderer/assets/{agents-page-DHu2xkX8.js → agents-page-BeZQ1S7f.js} +3 -3
  7. package/out/renderer/assets/approvalsOverlay-BBr6f98F.css +1 -0
  8. package/out/renderer/assets/approvalsOverlay-BmSmF8Ga.js +1 -0
  9. package/out/renderer/assets/{arc-DJDaWivU.js → arc-DYIy54Kn.js} +1 -1
  10. package/out/renderer/assets/architectureDiagram-IEHRJDOE-CmfaKw-J.js +36 -0
  11. package/out/renderer/assets/{blockDiagram-JOT3LUYC-BGcgINKS.js → blockDiagram-JOT3LUYC-bQf90tJr.js} +2 -2
  12. package/out/renderer/assets/{book-open-CTVKA12r.js → book-open-iGajLTwQ.js} +1 -1
  13. package/out/renderer/assets/browser-page-B63Z8oE2.js +1 -0
  14. package/out/renderer/assets/browser-webauthn-prompt-DX5l4JNA.js +1 -0
  15. package/out/renderer/assets/{building-2-Bky--3rC.js → building-2-bjja6JTC.js} +1 -1
  16. package/out/renderer/assets/{c4Diagram-VJAJSXHY-Dxg4lYU_.js → c4Diagram-VJAJSXHY-BxIFIYVW.js} +2 -2
  17. package/out/renderer/assets/channel-Blax8LQd.js +1 -0
  18. package/out/renderer/assets/{chunk-4BMEZGHF-Bbfr_o8o.js → chunk-4BMEZGHF-C2LQ_mlD.js} +1 -1
  19. package/out/renderer/assets/{chunk-A2AXSNBT-CnzwrRQc.js → chunk-A2AXSNBT-BKH53MbC.js} +1 -1
  20. package/out/renderer/assets/{chunk-AEK57VVT-DIq6FzSQ.js → chunk-AEK57VVT-CuB5dlAL.js} +1 -1
  21. package/out/renderer/assets/{chunk-D6G4REZN-BhQgOD8q.js → chunk-D6G4REZN-CECeg3Wn.js} +1 -1
  22. package/out/renderer/assets/{chunk-RZ5BOZE2-1bt5bhUU.js → chunk-RZ5BOZE2-D-zkJWYc.js} +1 -1
  23. package/out/renderer/assets/{chunk-XZIHB7SX-BV47b5FV.js → chunk-XZIHB7SX-DstteBuH.js} +1 -1
  24. package/out/renderer/assets/classDiagram-GIVACNV2-DA1IQG_V.js +1 -0
  25. package/out/renderer/assets/classDiagram-v2-COTLJTTW-DA1IQG_V.js +1 -0
  26. package/out/renderer/assets/clone-mVVuLCMS.js +1 -0
  27. package/out/renderer/assets/{console-mirror-CfrfbIAp.js → console-mirror-gqAdwBWl.js} +2 -2
  28. package/out/renderer/assets/consoleCapture-BQQVRcXT.js +1 -0
  29. package/out/renderer/assets/{conversation-input-sync-DKNOMiIp.js → conversation-input-sync-grry80zS.js} +41 -41
  30. package/out/renderer/assets/dagre-OKDRZEBW-D6RBxeJd.js +4 -0
  31. package/out/renderer/assets/diagram-SSKATNLV--xUREIPn.js +43 -0
  32. package/out/renderer/assets/diagram-VNBRO52H-BYjZ86BM.js +24 -0
  33. package/out/renderer/assets/{erDiagram-Q7BY3M3F-jChbtQ8s.js → erDiagram-Q7BY3M3F-CmajcoOO.js} +2 -2
  34. package/out/renderer/assets/{error-boundary-CQf4hj53.js → error-boundary-DfTTKe65.js} +3 -3
  35. package/out/renderer/assets/{flowDiagram-4HSFHLVR-C-ETkl-L.js → flowDiagram-4HSFHLVR-CtQab7ap.js} +2 -2
  36. package/out/renderer/assets/{ganttDiagram-APWFNJXF-D42KlmKC.js → ganttDiagram-APWFNJXF-CuKez3d0.js} +2 -2
  37. package/out/renderer/assets/gitGraphDiagram-7IBYFJ6S-D9QOaWwN.js +65 -0
  38. package/out/renderer/assets/{graph-BdWT-wGp.js → graph-Ccifoj7G.js} +1 -1
  39. package/out/renderer/assets/{hash-C5NRsgoq.js → hash-EZ0d40pW.js} +1 -1
  40. package/out/renderer/assets/{heart-B_TWxEVI.js → heart-Bo3ZudoI.js} +1 -1
  41. package/out/renderer/assets/index-ByZv232u.css +1 -0
  42. package/out/renderer/assets/index-CLJ4-1jd.js +1 -0
  43. package/out/renderer/assets/index-DXk6NfLu.js +55 -0
  44. package/out/renderer/assets/index-Dw4hyitu.js +7 -0
  45. package/out/renderer/assets/{index-DiHe1x_2.js → index-LBzSehKd.js} +30 -30
  46. package/out/renderer/assets/infoDiagram-PH2N3AL5-DrTRSok5.js +2 -0
  47. package/out/renderer/assets/installer-B7DhTrnG.js +1 -0
  48. package/out/renderer/assets/{journeyDiagram-U35MCT3I-Dvj6m4R3.js → journeyDiagram-U35MCT3I-YTjOSo-b.js} +2 -2
  49. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-Dcs6Y93q.js → kanban-definition-NDS4AKOZ-C1UmNEaT.js} +4 -4
  50. package/out/renderer/assets/{layout--rr1tBJG.js → layout-CWPZ7noV.js} +1 -1
  51. package/out/renderer/assets/{legacy-agents-page-bX8ZD1oF.js → legacy-agents-page-ikCownYN.js} +2 -2
  52. package/out/renderer/assets/library-page-DBSSkZvn.js +157 -0
  53. package/out/renderer/assets/{mermaid.core-DlGo2U0C.js → mermaid.core-B_nZt27J.js} +5 -5
  54. package/out/renderer/assets/mesh-page-CgjL4HIw.js +1 -0
  55. package/out/renderer/assets/messages-Bswe4yCX.js +3 -0
  56. package/out/renderer/assets/mindmap-definition-ALO5MXBD-D-Y3n0RT.js +95 -0
  57. package/out/renderer/assets/mini-BdCfujvn.js +1 -0
  58. package/out/renderer/assets/{notebook-pen-BhmcgRiW.js → notebook-pen-BvZPJ7Yv.js} +1 -1
  59. package/out/renderer/assets/org-access-C1u_2VVY.js +1 -0
  60. package/out/renderer/assets/{org-surface-gate-BpVvnvxX.js → org-surface-gate-CyIC6H59.js} +1 -1
  61. package/out/renderer/assets/{page-header-rgKs_qEp.js → page-header-C9IFgiIB.js} +1 -1
  62. package/out/renderer/assets/{path-utils-Ch7GC1fh.js → path-utils-DC6z9Ymz.js} +17 -17
  63. package/out/renderer/assets/pieDiagram-IB7DONF6-BJ2PZoWa.js +30 -0
  64. package/out/renderer/assets/{projects-page-BQd1Mkfd.js → projects-page-CwwrR-j7.js} +2 -2
  65. package/out/renderer/assets/{publication-validation-DyFQAbl6.js → publication-validation-DAffiuLy.js} +1 -1
  66. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-wWLUIv_7.js → quadrantDiagram-7GDLP6J5-Dpr0N86G.js} +2 -2
  67. package/out/renderer/assets/{radar-MK3ICKWK-DD77Iyne.js → radar-MK3ICKWK-CwLLK6fK.js} +1 -1
  68. package/out/renderer/assets/radient-auth-buttons-DN7K_uGZ.js +1 -0
  69. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-Bu415aDm.js → requirementDiagram-KVF5MWMF-LI2fP6nJ.js} +2 -2
  70. package/out/renderer/assets/sankeyDiagram-QLVOVGJD-uUOWgFO1.js +10 -0
  71. package/out/renderer/assets/{schedules-page-BbKsER5C.js → schedules-page-Cf1PQGDR.js} +2 -2
  72. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-BTO-WEKG.js → sequenceDiagram-X6HHIX6F-DperbqVG.js} +2 -2
  73. package/out/renderer/assets/{settings-page-qICF0iah.js → settings-page-CrnST8YF.js} +3 -3
  74. package/out/renderer/assets/smartart-qEAWtDlk.js +1 -0
  75. package/out/renderer/assets/stateDiagram-DGXRK772-RvRbNkSX.js +1 -0
  76. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-fK1yLl-v.js +1 -0
  77. package/out/renderer/assets/{team-bridge-page-bhH2QlXH.js → team-bridge-page-BgcLwc5M.js} +2 -2
  78. package/out/renderer/assets/{timeline-definition-BDJGKUSR-DcGupo97.js → timeline-definition-BDJGKUSR-CeQ3AsWj.js} +2 -2
  79. package/out/renderer/assets/{use-download-agent-mutation-DFoPvSHB.js → use-download-agent-mutation-C_zDZ6-1.js} +2 -2
  80. package/out/renderer/assets/{use-session-snapshot-BTmPQFBS.js → use-session-snapshot-BMDB4uZ0.js} +1 -1
  81. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-Bqjodw42.js → xychartDiagram-VJFVF3MP-C6-d6maF.js} +5 -5
  82. package/out/renderer/browser-approvals-overlay.html +40 -0
  83. package/out/renderer/console-capture.html +6 -5
  84. package/out/renderer/index.html +8 -7
  85. package/out/renderer/installer.html +5 -4
  86. package/out/renderer/mini.html +8 -7
  87. package/package.json +6 -4
  88. package/out/renderer/assets/architectureDiagram-IEHRJDOE-BnQwEGXh.js +0 -36
  89. package/out/renderer/assets/browser-page-DFFwHX_q.js +0 -1
  90. package/out/renderer/assets/browser-webauthn-prompt-BWCI9wPS.js +0 -1
  91. package/out/renderer/assets/channel-EkPte-cJ.js +0 -1
  92. package/out/renderer/assets/classDiagram-GIVACNV2-CFmWhsn7.js +0 -1
  93. package/out/renderer/assets/classDiagram-v2-COTLJTTW-CFmWhsn7.js +0 -1
  94. package/out/renderer/assets/clone-kXBnCGzD.js +0 -1
  95. package/out/renderer/assets/consoleCapture-BFG3Xbps.js +0 -1
  96. package/out/renderer/assets/dagre-OKDRZEBW-DA1nw5sl.js +0 -4
  97. package/out/renderer/assets/diagram-SSKATNLV-CVVTgWt7.js +0 -43
  98. package/out/renderer/assets/diagram-VNBRO52H-DHTfzrp0.js +0 -24
  99. package/out/renderer/assets/gitGraphDiagram-7IBYFJ6S-P9nmqR2u.js +0 -65
  100. package/out/renderer/assets/index-CdcfcuWL.js +0 -7
  101. package/out/renderer/assets/index-CgLFXaCJ.js +0 -57
  102. package/out/renderer/assets/index-CjtdK8OG.css +0 -1
  103. package/out/renderer/assets/index-uHBz6pD4.js +0 -1
  104. package/out/renderer/assets/infoDiagram-PH2N3AL5-CGwg5naH.js +0 -2
  105. package/out/renderer/assets/installer-BPsqzY3G.js +0 -1
  106. package/out/renderer/assets/library-page-DeVhJsuP.js +0 -157
  107. package/out/renderer/assets/mesh-page-BOHX8DXw.js +0 -1
  108. package/out/renderer/assets/mindmap-definition-ALO5MXBD-D2k6gjX2.js +0 -95
  109. package/out/renderer/assets/mini-D58TB08i.js +0 -1
  110. package/out/renderer/assets/org-access-BIqG4bO9.js +0 -1
  111. package/out/renderer/assets/pieDiagram-IB7DONF6-TkoS-yEQ.js +0 -30
  112. package/out/renderer/assets/radient-auth-buttons-DOUeYctr.js +0 -1
  113. package/out/renderer/assets/sankeyDiagram-QLVOVGJD-DicsIJ4H.js +0 -10
  114. package/out/renderer/assets/smartart-drXgC4cZ.js +0 -1
  115. package/out/renderer/assets/stateDiagram-DGXRK772-DRBkBLBL.js +0 -1
  116. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CCFNyg2W.js +0 -1
package/out/main/index.js CHANGED
@@ -32054,6 +32054,408 @@ class ApprovalStore {
32054
32054
  );
32055
32055
  }
32056
32056
  }
32057
+ const APPROVALS_CARD_MAX_WIDTH = 352;
32058
+ const APPROVALS_CARD_MAX_HEIGHT = 480;
32059
+ const APPROVALS_CARD_MIN_HEIGHT = 96;
32060
+ const APPROVALS_CARD_INSET = 8;
32061
+ const APPROVALS_CARD_PAD = 8;
32062
+ function integer(value) {
32063
+ return Math.round(value);
32064
+ }
32065
+ function approvalsCardBoundsFor(input) {
32066
+ const pad = input.opaque === true ? 0 : APPROVALS_CARD_PAD;
32067
+ const inset = input.opaque === true ? 0 : APPROVALS_CARD_INSET;
32068
+ const content = input.contentRect;
32069
+ if (!Number.isFinite(content.x) || !Number.isFinite(content.y) || !Number.isFinite(content.width) || !Number.isFinite(content.height) || content.width <= 0 || content.height <= 0) {
32070
+ return null;
32071
+ }
32072
+ const width = Math.min(
32073
+ APPROVALS_CARD_MAX_WIDTH,
32074
+ Math.floor(content.width - 2 * pad)
32075
+ );
32076
+ if (width <= 0) return null;
32077
+ const ceiling = Math.min(
32078
+ APPROVALS_CARD_MAX_HEIGHT,
32079
+ Math.floor(content.height - 2 * pad)
32080
+ );
32081
+ if (ceiling < APPROVALS_CARD_MIN_HEIGHT) return null;
32082
+ const natural = Number.isFinite(input.naturalHeight) ? input.naturalHeight : APPROVALS_CARD_MIN_HEIGHT;
32083
+ const height = Math.min(
32084
+ ceiling,
32085
+ Math.max(APPROVALS_CARD_MIN_HEIGHT, Math.ceil(natural))
32086
+ );
32087
+ const viewWidth = width + 2 * pad;
32088
+ const viewHeight = height + 2 * pad;
32089
+ const viewX = integer(content.x + content.width - inset - width - pad);
32090
+ const viewY = integer(content.y + content.height - inset - height - pad);
32091
+ const view = {
32092
+ x: viewX,
32093
+ y: viewY,
32094
+ width: viewWidth,
32095
+ height: viewHeight
32096
+ };
32097
+ if (view.x < content.x || view.y < content.y || view.x + view.width > content.x + content.width || view.y + view.height > content.y + content.height) {
32098
+ return null;
32099
+ }
32100
+ return {
32101
+ view,
32102
+ card: {
32103
+ x: view.x + pad,
32104
+ y: view.y + pad,
32105
+ width,
32106
+ height
32107
+ },
32108
+ width,
32109
+ height,
32110
+ pad
32111
+ };
32112
+ }
32113
+ const APPROVALS_OVERLAY_S6A_ENV = "LOCAL_OPERATOR_UI_BROWSER_APPROVALS_OVERLAY_S6A";
32114
+ const TRANSPARENT = "#00000000";
32115
+ const OPAQUE = "#1b1f24";
32116
+ function approvalsOverlayEnabled(env) {
32117
+ return env[APPROVALS_OVERLAY_S6A_ENV] === "1";
32118
+ }
32119
+ function approvalsExpiryDelay(entries, now = Date.now()) {
32120
+ if (entries.length === 0) return null;
32121
+ return Math.max(
32122
+ 0,
32123
+ Math.min(...entries.map((entry) => entry.expiresAt)) - now
32124
+ );
32125
+ }
32126
+ function approvalsDocumentUrl(documentUrl, count, theme, opaque) {
32127
+ try {
32128
+ const url = new URL(documentUrl);
32129
+ if (count > 0) url.searchParams.set("count", String(count));
32130
+ url.searchParams.set("theme", theme);
32131
+ if (opaque) url.searchParams.set("opaque", "1");
32132
+ return url.toString();
32133
+ } catch {
32134
+ return documentUrl;
32135
+ }
32136
+ }
32137
+ class ApprovalsOverlayController {
32138
+ window;
32139
+ documentUrl;
32140
+ opaque;
32141
+ theme;
32142
+ log;
32143
+ view;
32144
+ childListeners;
32145
+ pending;
32146
+ ready;
32147
+ visible;
32148
+ failedReason;
32149
+ disposed;
32150
+ naturalHeight;
32151
+ layout;
32152
+ bounds;
32153
+ constructor(deps) {
32154
+ this.window = deps.window;
32155
+ this.documentUrl = deps.documentUrl;
32156
+ this.opaque = deps.opaque === true;
32157
+ this.theme = deps.theme ?? "dark";
32158
+ this.log = deps.log ?? (() => {
32159
+ });
32160
+ this.view = null;
32161
+ this.childListeners = [];
32162
+ this.pending = 0;
32163
+ this.ready = false;
32164
+ this.visible = false;
32165
+ this.failedReason = null;
32166
+ this.disposed = false;
32167
+ this.naturalHeight = APPROVALS_CARD_MIN_HEIGHT;
32168
+ this.layout = {
32169
+ presented: false,
32170
+ contentRect: null,
32171
+ revision: 0
32172
+ };
32173
+ this.bounds = null;
32174
+ this.ensureChild();
32175
+ }
32176
+ /** The live queue's count. Zero hides; a positive count auto-presents. */
32177
+ setPending(count) {
32178
+ if (this.disposed) return;
32179
+ this.pending = Math.max(0, Math.floor(Number.isFinite(count) ? count : 0));
32180
+ if (this.pending === 0) {
32181
+ this.hide();
32182
+ return;
32183
+ }
32184
+ this.updateCount();
32185
+ this.maybeShow();
32186
+ }
32187
+ /** The registry's copied layout snapshot, after every page layout pass. */
32188
+ onLayout(snapshot2) {
32189
+ if (this.disposed) return;
32190
+ this.layout = {
32191
+ presented: snapshot2.presented,
32192
+ contentRect: snapshot2.contentRect ? { ...snapshot2.contentRect } : null,
32193
+ revision: snapshot2.revision
32194
+ };
32195
+ if (!snapshot2.presented || !snapshot2.contentRect) {
32196
+ this.hide();
32197
+ return;
32198
+ }
32199
+ if (this.pending > 0) this.maybeShow();
32200
+ }
32201
+ facts() {
32202
+ const view = this.view;
32203
+ const children = this.window.isDestroyed() ? [] : this.window.contentView.children;
32204
+ const index = view ? children.indexOf(view) : -1;
32205
+ let focused = null;
32206
+ try {
32207
+ focused = electron.webContents.getFocusedWebContents()?.id ?? null;
32208
+ } catch {
32209
+ focused = null;
32210
+ }
32211
+ return {
32212
+ pending: this.pending,
32213
+ presented: this.layout.presented,
32214
+ contentRect: this.layout.contentRect,
32215
+ ready: this.ready,
32216
+ visible: this.visible,
32217
+ failedReason: this.failedReason,
32218
+ bounds: this.bounds,
32219
+ childIndex: index,
32220
+ childCount: children.length,
32221
+ childWebContentsId: view ? view.webContents.id : null,
32222
+ focusedWebContentsId: focused,
32223
+ documentUrl: this.documentUrl,
32224
+ opaque: this.opaque
32225
+ };
32226
+ }
32227
+ dispose(reason = "dispose") {
32228
+ if (this.disposed) return;
32229
+ this.disposed = true;
32230
+ this.visible = false;
32231
+ this.ready = false;
32232
+ this.releaseView(reason);
32233
+ }
32234
+ ensureChild() {
32235
+ if (this.view || this.failedReason !== null || this.disposed) return;
32236
+ this.createChild();
32237
+ }
32238
+ maybeShow() {
32239
+ if (this.disposed || this.failedReason !== null || this.pending <= 0 || !this.layout.presented || !this.layout.contentRect) {
32240
+ this.hide();
32241
+ return;
32242
+ }
32243
+ this.ensureChild();
32244
+ if (!this.view || !this.ready) return;
32245
+ this.applyBounds();
32246
+ }
32247
+ applyBounds() {
32248
+ const view = this.view;
32249
+ if (!view || !this.layout.contentRect) return;
32250
+ const bounds = approvalsCardBoundsFor({
32251
+ contentRect: this.layout.contentRect,
32252
+ naturalHeight: this.naturalHeight,
32253
+ opaque: this.opaque
32254
+ });
32255
+ this.bounds = bounds;
32256
+ if (!bounds) {
32257
+ this.hide();
32258
+ return;
32259
+ }
32260
+ try {
32261
+ const current = view.getBounds();
32262
+ if (current.width !== bounds.view.width || current.height !== bounds.view.height) {
32263
+ this.rebuildAt(bounds);
32264
+ return;
32265
+ }
32266
+ view.setBounds(bounds.view);
32267
+ const children = this.window.contentView.children;
32268
+ if (children[children.length - 1] !== view) {
32269
+ this.window.contentView.addChildView(view);
32270
+ }
32271
+ view.setVisible(true);
32272
+ this.visible = true;
32273
+ } catch (error) {
32274
+ this.fail(`bounds_apply_failed:${String(error)}`);
32275
+ }
32276
+ }
32277
+ rebuildAt(bounds) {
32278
+ this.releaseView("resize");
32279
+ this.visible = false;
32280
+ this.ready = false;
32281
+ this.bounds = bounds;
32282
+ this.createChild();
32283
+ const view = this.view;
32284
+ if (!view) return;
32285
+ view.setBounds(bounds.view);
32286
+ view.setVisible(true);
32287
+ this.visible = true;
32288
+ }
32289
+ releaseView(reason) {
32290
+ const view = this.view;
32291
+ this.view = null;
32292
+ for (const remove of this.childListeners.splice(0)) remove();
32293
+ if (!view) return;
32294
+ try {
32295
+ if (!view.webContents.isDestroyed()) view.webContents.close();
32296
+ } catch {
32297
+ }
32298
+ try {
32299
+ this.window.contentView.removeChildView(view);
32300
+ } catch {
32301
+ }
32302
+ this.log(`[browser] approvals overlay child released: ${reason}`);
32303
+ }
32304
+ createChild() {
32305
+ let view;
32306
+ try {
32307
+ const partition = `approvals-overlay-${node_crypto.randomUUID()}`;
32308
+ const childSession = electron.session.fromPartition(partition);
32309
+ childSession.setPermissionRequestHandler(
32310
+ (_contents, _permission, callback) => callback(false)
32311
+ );
32312
+ childSession.setPermissionCheckHandler(() => false);
32313
+ childSession.on("will-download", (event) => {
32314
+ event.preventDefault();
32315
+ });
32316
+ view = new electron.WebContentsView({
32317
+ webPreferences: {
32318
+ partition,
32319
+ sandbox: true,
32320
+ contextIsolation: true,
32321
+ nodeIntegration: false,
32322
+ webSecurity: true,
32323
+ allowRunningInsecureContent: false,
32324
+ // The document's own module measures itself and paints the count;
32325
+ // there is still no preload, no exposed IPC and no focus path.
32326
+ javascript: true,
32327
+ backgroundThrottling: false
32328
+ }
32329
+ });
32330
+ view.webContents.setWindowOpenHandler(() => ({ action: "deny" }));
32331
+ const allow = approvalsDocumentUrl(
32332
+ this.documentUrl,
32333
+ this.pending,
32334
+ this.theme,
32335
+ this.opaque
32336
+ );
32337
+ const base = (() => {
32338
+ try {
32339
+ const url = new URL(allow);
32340
+ url.search = "";
32341
+ return url.toString();
32342
+ } catch {
32343
+ return allow;
32344
+ }
32345
+ })();
32346
+ view.webContents.on("will-navigate", (event, url) => {
32347
+ const target2 = url.split("?")[0];
32348
+ if (target2 !== base) event.preventDefault();
32349
+ });
32350
+ view.webContents.on("will-redirect", (event, url) => {
32351
+ const target2 = url.split("?")[0];
32352
+ if (target2 !== base) event.preventDefault();
32353
+ });
32354
+ view.setBackgroundColor(this.opaque ? OPAQUE : TRANSPARENT);
32355
+ this.window.contentView.addChildView(view);
32356
+ const initial = this.bounds?.view ?? {
32357
+ x: 0,
32358
+ y: 0,
32359
+ width: 0,
32360
+ height: 0
32361
+ };
32362
+ view.setBounds(initial);
32363
+ view.setVisible(this.bounds !== null);
32364
+ this.view = view;
32365
+ this.ready = false;
32366
+ const onFinish = () => {
32367
+ this.ready = true;
32368
+ this.measureAndShow();
32369
+ };
32370
+ const onFail = (_event, code, description) => {
32371
+ this.fail(`load_failed:${code}:${description}`);
32372
+ };
32373
+ view.webContents.on("did-finish-load", onFinish);
32374
+ view.webContents.on("did-fail-load", onFail);
32375
+ this.childListeners.push(
32376
+ () => view.webContents.removeListener("did-finish-load", onFinish)
32377
+ );
32378
+ this.childListeners.push(
32379
+ () => view.webContents.removeListener("did-fail-load", onFail)
32380
+ );
32381
+ void view.webContents.loadURL(allow).catch((error) => {
32382
+ this.fail(`load_rejected:${String(error)}`);
32383
+ });
32384
+ } catch (error) {
32385
+ this.fail(`child_create_failed:${String(error)}`);
32386
+ return;
32387
+ }
32388
+ }
32389
+ measureAndShow() {
32390
+ const view = this.view;
32391
+ if (!view || view.webContents.isDestroyed()) return;
32392
+ if (view.getBounds().width <= 0) {
32393
+ this.updateCount();
32394
+ this.maybeShow();
32395
+ return;
32396
+ }
32397
+ const measured = view.webContents.executeJavaScript(
32398
+ `new Promise((resolve) => {
32399
+ const read = () => {
32400
+ const el = document.getElementById('approvals-card');
32401
+ if (!el) { resolve(0); return; }
32402
+ /*
32403
+ * Read the UNCLAMPED height. The card's own max-height is the
32404
+ * viewport minus its insets, so measuring the clamped box would
32405
+ * return the provisional 96 DIP view's ceiling forever: a
32406
+ * circular size that never reaches the card's real height.
32407
+ */
32408
+ const previous = el.style.maxHeight;
32409
+ el.style.maxHeight = 'none';
32410
+ const height = el.getBoundingClientRect().height;
32411
+ el.style.maxHeight = previous;
32412
+ resolve(height);
32413
+ };
32414
+ if (document.readyState === 'complete') read();
32415
+ else addEventListener('load', read, { once: true });
32416
+ })`
32417
+ );
32418
+ const timer = new Promise((resolve) => {
32419
+ setTimeout(() => resolve(0), 1500);
32420
+ });
32421
+ void Promise.race([measured, timer]).then((height) => {
32422
+ if (this.view !== view) return;
32423
+ if (typeof height === "number" && Number.isFinite(height) && height > 0) {
32424
+ this.naturalHeight = height;
32425
+ }
32426
+ this.maybeShow();
32427
+ }).catch((error) => {
32428
+ if (this.view !== view) return;
32429
+ this.fail(`measure_failed:${String(error)}`);
32430
+ });
32431
+ this.updateCount();
32432
+ this.maybeShow();
32433
+ }
32434
+ updateCount() {
32435
+ const view = this.view;
32436
+ if (!view || view.webContents.isDestroyed()) return;
32437
+ void view.webContents.executeJavaScript(
32438
+ `(() => { window.__approvalsCard?.setCount(${this.pending}); })()`
32439
+ ).catch(() => {
32440
+ });
32441
+ }
32442
+ hide() {
32443
+ if (this.view) {
32444
+ try {
32445
+ this.view.setVisible(false);
32446
+ } catch {
32447
+ }
32448
+ }
32449
+ this.visible = false;
32450
+ }
32451
+ fail(reason) {
32452
+ if (this.failedReason !== null) return;
32453
+ this.failedReason = reason;
32454
+ this.hide();
32455
+ this.dispose("failed");
32456
+ this.log(`[browser] approvals overlay latched off: ${reason}`);
32457
+ }
32458
+ }
32057
32459
  function browserWindowForeground(window) {
32058
32460
  return !window.isDestroyed() && window.isVisible() && window.isFocused();
32059
32461
  }
@@ -35925,7 +36327,9 @@ const enUiBrowser = {
35925
36327
  "ui.browser.page_context_menu.cut": "Cut",
35926
36328
  "ui.browser.page_context_menu.open_link_in_new_tab": "Open link in new tab",
35927
36329
  "ui.browser.page_context_menu.paste": "Paste",
36330
+ "ui.browser.page_context_menu.redo": "Redo",
35928
36331
  "ui.browser.page_context_menu.select_all": "Select all",
36332
+ "ui.browser.page_context_menu.undo": "Undo",
35929
36333
  "ui.browser.use_browser_chrome.downloads_folder_failed": "Could not open the downloads folder. {message}",
35930
36334
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "That request is no longer waiting.",
35931
36335
  "ui.browser.webauthn_chooser.a_site": "A site",
@@ -37217,6 +37621,7 @@ const enUiLibrary = {
37217
37621
  "ui.library.page.loaded_count": "{loaded} of {total} assets",
37218
37622
  "ui.library.page.preview": "Asset preview",
37219
37623
  "ui.library.page.results": "Library results",
37624
+ "ui.library.page.resize_preview": "Resize details drawer. Double-click to reset.",
37220
37625
  "ui.library.preview.unavailable": "This asset isn't available",
37221
37626
  "ui.library.preview.unavailable_detail": "It may no longer be in the catalog.",
37222
37627
  "ui.library.preview.pptx_preparing": "Preparing presentation…",
@@ -39720,6 +40125,8 @@ const esUiBrowser = {
39720
40125
  "ui.browser.page_context_menu.copy": "Copiar",
39721
40126
  "ui.browser.page_context_menu.paste": "Pegar",
39722
40127
  "ui.browser.page_context_menu.select_all": "Seleccionar todo",
40128
+ "ui.browser.page_context_menu.redo": "Rehacer",
40129
+ "ui.browser.page_context_menu.undo": "Deshacer",
39723
40130
  "ui.browser.page_context_menu.copy_page_address": "Copiar dirección de la página",
39724
40131
  "ui.browser.browser_url_bar.home": "Inicio",
39725
40132
  "ui.browser.browser_url_bar.site_secure": "Conexión segura con {origin}",
@@ -40886,6 +41293,7 @@ const esUiLibrary = {
40886
41293
  "ui.library.page.loaded_count": "{loaded} de {total} recursos",
40887
41294
  "ui.library.page.preview": "Vista previa del recurso",
40888
41295
  "ui.library.page.results": "Resultados de la Biblioteca",
41296
+ "ui.library.page.resize_preview": "Cambiar el tamaño del panel de detalles. Doble clic para restablecer.",
40889
41297
  "ui.library.preview.unavailable": "Este recurso no está disponible",
40890
41298
  "ui.library.preview.unavailable_detail": "Puede que ya no esté en el catálogo.",
40891
41299
  "ui.library.preview.pptx_preparing": "Preparando la presentación…",
@@ -43389,6 +43797,8 @@ const frUiBrowser = {
43389
43797
  "ui.browser.page_context_menu.copy": "Copier",
43390
43798
  "ui.browser.page_context_menu.paste": "Coller",
43391
43799
  "ui.browser.page_context_menu.select_all": "Tout sélectionner",
43800
+ "ui.browser.page_context_menu.redo": "Rétablir",
43801
+ "ui.browser.page_context_menu.undo": "Annuler",
43392
43802
  "ui.browser.page_context_menu.copy_page_address": "Copier l’adresse de la page",
43393
43803
  "ui.browser.browser_url_bar.home": "Accueil",
43394
43804
  "ui.browser.browser_url_bar.site_secure": "Connexion sécurisée à {origin}",
@@ -44555,6 +44965,7 @@ const frUiLibrary = {
44555
44965
  "ui.library.page.loaded_count": "{loaded} éléments sur {total}",
44556
44966
  "ui.library.page.preview": "Aperçu de l’élément",
44557
44967
  "ui.library.page.results": "Résultats de la Bibliothèque",
44968
+ "ui.library.page.resize_preview": "Redimensionner le panneau de détails. Double-cliquer pour réinitialiser.",
44558
44969
  "ui.library.preview.unavailable": "Cet élément n’est pas disponible",
44559
44970
  "ui.library.preview.unavailable_detail": "Il n’est peut-être plus dans le catalogue.",
44560
44971
  "ui.library.preview.pptx_preparing": "Préparation de la présentation…",
@@ -47085,6 +47496,8 @@ const hiUiBrowser = {
47085
47496
  "ui.browser.page_context_menu.open_link_in_new_tab": "लिंक नए टैब में खोलें",
47086
47497
  "ui.browser.page_context_menu.paste": "पेस्ट करें",
47087
47498
  "ui.browser.page_context_menu.select_all": "सभी चुनें",
47499
+ "ui.browser.page_context_menu.redo": "फिर से करें",
47500
+ "ui.browser.page_context_menu.undo": "पूर्ववत करें",
47088
47501
  "ui.browser.use_browser_chrome.downloads_folder_failed": "डाउनलोड फ़ोल्डर नहीं खुल सका। {message}",
47089
47502
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "वह अनुरोध अब इंतज़ार में नहीं है।",
47090
47503
  "ui.browser.webauthn_chooser.a_site": "एक साइट",
@@ -48193,6 +48606,7 @@ const hiUiLibrary = {
48193
48606
  "ui.library.page.loaded_count": "{loaded} एसेट कुल {total} में से",
48194
48607
  "ui.library.page.preview": "एसेट का प्रीव्यू",
48195
48608
  "ui.library.page.results": "लाइब्रेरी के नतीजे",
48609
+ "ui.library.page.resize_preview": "विवरण ड्रॉअर का आकार बदलें। रीसेट करने के लिए दो बार क्लिक करें।",
48196
48610
  "ui.library.preview.unavailable": "यह एसेट उपलब्ध नहीं है",
48197
48611
  "ui.library.preview.unavailable_detail": "हो सकता है यह अब कैटलॉग में न हो।",
48198
48612
  "ui.library.preview.pptx_preparing": "प्रस्तुति तैयार हो रही है…",
@@ -50712,6 +51126,8 @@ const ruUiBrowser = {
50712
51126
  "ui.browser.page_context_menu.open_link_in_new_tab": "Открыть ссылку в новой вкладке",
50713
51127
  "ui.browser.page_context_menu.paste": "Вставить",
50714
51128
  "ui.browser.page_context_menu.select_all": "Выделить всё",
51129
+ "ui.browser.page_context_menu.redo": "Повторить",
51130
+ "ui.browser.page_context_menu.undo": "Отменить",
50715
51131
  "ui.browser.use_browser_chrome.downloads_folder_failed": "Не удалось открыть папку загрузок. {message}",
50716
51132
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "Этот запрос больше не ожидает.",
50717
51133
  "ui.browser.webauthn_chooser.a_site": "Сайт",
@@ -51840,6 +52256,7 @@ const ruUiLibrary = {
51840
52256
  "ui.library.page.loaded_count": "Файлы: {loaded} из {total}",
51841
52257
  "ui.library.page.preview": "Предпросмотр файла",
51842
52258
  "ui.library.page.results": "Результаты Библиотеки",
52259
+ "ui.library.page.resize_preview": "Изменить ширину панели сведений. Дважды щёлкните, чтобы сбросить её.",
51843
52260
  "ui.library.preview.unavailable": "Этот файл недоступен",
51844
52261
  "ui.library.preview.unavailable_detail": "Возможно, его больше нет в каталоге.",
51845
52262
  "ui.library.preview.pptx_preparing": "Подготовка презентации…",
@@ -54359,6 +54776,8 @@ const urUiBrowser = {
54359
54776
  "ui.browser.page_context_menu.open_link_in_new_tab": "لنک نئے ٹیب میں کھولیں",
54360
54777
  "ui.browser.page_context_menu.paste": "چسپاں کریں",
54361
54778
  "ui.browser.page_context_menu.select_all": "سب منتخب کریں",
54779
+ "ui.browser.page_context_menu.redo": "دوبارہ کریں",
54780
+ "ui.browser.page_context_menu.undo": "کالعدم کریں",
54362
54781
  "ui.browser.use_browser_chrome.downloads_folder_failed": "ڈاؤن لوڈ فولڈر نہیں کھل سکا۔ {message}",
54363
54782
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "وہ درخواست اب منتظر نہیں ہے۔",
54364
54783
  "ui.browser.webauthn_chooser.a_site": "ایک سائٹ",
@@ -55487,6 +55906,7 @@ const urUiLibrary = {
55487
55906
  "ui.library.page.loaded_count": "{total} اثاثوں میں سے {loaded}",
55488
55907
  "ui.library.page.preview": "اثاثے کا پیش منظر",
55489
55908
  "ui.library.page.results": "لائبریری کے نتائج",
55909
+ "ui.library.page.resize_preview": "تفصیلات کے پینل کی چوڑائی بدلیں۔ ڈبل کلک کر کے ری سیٹ کریں۔",
55490
55910
  "ui.library.preview.unavailable": "یہ اثاثہ دستیاب نہیں",
55491
55911
  "ui.library.preview.unavailable_detail": "ممکن ہے اب یہ کیٹلاگ میں نہ ہو۔",
55492
55912
  "ui.library.preview.pptx_preparing": "پریزنٹیشن تیار ہو رہی ہے…",
@@ -58006,6 +58426,8 @@ const viUiBrowser = {
58006
58426
  "ui.browser.page_context_menu.open_link_in_new_tab": "Mở liên kết trong tab mới",
58007
58427
  "ui.browser.page_context_menu.paste": "Dán",
58008
58428
  "ui.browser.page_context_menu.select_all": "Chọn tất cả",
58429
+ "ui.browser.page_context_menu.redo": "Làm lại",
58430
+ "ui.browser.page_context_menu.undo": "Hoàn tác",
58009
58431
  "ui.browser.use_browser_chrome.downloads_folder_failed": "Không thể mở thư mục tải xuống. {message}",
58010
58432
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "Yêu cầu đó không còn chờ xử lý.",
58011
58433
  "ui.browser.webauthn_chooser.a_site": "Một trang web",
@@ -59134,6 +59556,7 @@ const viUiLibrary = {
59134
59556
  "ui.library.page.loaded_count": "{loaded}/{total} tệp",
59135
59557
  "ui.library.page.preview": "Xem trước tệp",
59136
59558
  "ui.library.page.results": "Kết quả Thư viện",
59559
+ "ui.library.page.resize_preview": "Điều chỉnh kích thước ngăn chi tiết. Nhấp đúp để đặt lại.",
59137
59560
  "ui.library.preview.unavailable": "Tệp này không khả dụng",
59138
59561
  "ui.library.preview.unavailable_detail": "Có thể tệp không còn trong thư viện.",
59139
59562
  "ui.library.preview.pptx_preparing": "Đang chuẩn bị bản trình bày…",
@@ -61462,6 +61885,8 @@ const zhCNUiBrowser = {
61462
61885
  "ui.browser.page_context_menu.open_link_in_new_tab": "在新标签页中打开链接",
61463
61886
  "ui.browser.page_context_menu.paste": "粘贴",
61464
61887
  "ui.browser.page_context_menu.select_all": "全选",
61888
+ "ui.browser.page_context_menu.redo": "重做",
61889
+ "ui.browser.page_context_menu.undo": "撤销",
61465
61890
  "ui.browser.use_browser_chrome.downloads_folder_failed": "无法打开下载文件夹。{message}",
61466
61891
  "ui.browser.use_consent_attention_lifetime.that_request_is_no_longer_waiting": "此请求已不再等待处理。",
61467
61892
  "ui.browser.webauthn_chooser.a_site": "某个网站",
@@ -62601,6 +63026,7 @@ const zhCNUiLibrary = {
62601
63026
  "ui.library.page.loaded_count": "{loaded}/{total}个资源",
62602
63027
  "ui.library.page.preview": "资源预览",
62603
63028
  "ui.library.page.results": "资源库结果",
63029
+ "ui.library.page.resize_preview": "调整详情抽屉宽度。双击可重置。",
62604
63030
  "ui.library.preview.unavailable": "此资源不可用",
62605
63031
  "ui.library.preview.unavailable_detail": "该资源可能已不在目录中。",
62606
63032
  "ui.library.preview.pptx_preparing": "正在准备演示文稿……",
@@ -69045,6 +69471,10 @@ function withTimeout(work, ms) {
69045
69471
  function isReportableLoadFailure(code) {
69046
69472
  return code !== 0 && code !== -3;
69047
69473
  }
69474
+ function isSupersededRestore(error) {
69475
+ const message = error instanceof Error ? error.message : String(error);
69476
+ return message.includes("ERR_ABORTED (-3)");
69477
+ }
69048
69478
  function sessionRequesterOf(requester) {
69049
69479
  if (!requester.startsWith("session:")) return null;
69050
69480
  const id2 = requester.slice("session:".length);
@@ -69941,7 +70371,7 @@ class BrowserHost {
69941
70371
  if (started) await withTimeout(started, RESTORE_TAB_TIMEOUT_MS);
69942
70372
  } catch (error) {
69943
70373
  this.log(`[browser] could not restore tab ${tabId}: ${String(error)}`);
69944
- if (!committed && !this.loadFailures.has(tabId) && this.registry.get(tabId) && !contents.isDestroyed()) {
70374
+ if (!committed && !isSupersededRestore(error) && !this.loadFailures.has(tabId) && this.registry.get(tabId) && !contents.isDestroyed()) {
69945
70375
  const entry = recorded.entries[recorded.activeIndex];
69946
70376
  this.recordLoadFailure(tabId, {
69947
70377
  code: -2,
@@ -71899,6 +72329,17 @@ function buildPageContextMenuItems(input) {
71899
72329
  if (input.isEditable) {
71900
72330
  const flags = input.editFlags ?? {};
71901
72331
  return [
72332
+ {
72333
+ id: "undo",
72334
+ label: t("ui.browser.page_context_menu.undo"),
72335
+ enabled: flags.canUndo ?? true
72336
+ },
72337
+ {
72338
+ id: "redo",
72339
+ label: t("ui.browser.page_context_menu.redo"),
72340
+ enabled: flags.canRedo ?? true
72341
+ },
72342
+ SEPARATOR,
71902
72343
  {
71903
72344
  id: "cut",
71904
72345
  label: t("ui.browser.page_context_menu.cut"),
@@ -71938,6 +72379,13 @@ function buildPageContextMenuItems(input) {
71938
72379
  enabled: true
71939
72380
  }
71940
72381
  ];
72382
+ if (input.selectionText) {
72383
+ items.push(SEPARATOR, {
72384
+ id: "copy",
72385
+ label: t("ui.browser.page_context_menu.copy"),
72386
+ enabled: true
72387
+ });
72388
+ }
71941
72389
  if (input.linkUrl) {
71942
72390
  items.push(
71943
72391
  SEPARATOR,
@@ -73686,6 +74134,7 @@ async function initializeBrowserHost(options, bindings) {
73686
74134
  canGoBack: navigation ? navigation.canGoBack() : false,
73687
74135
  canGoForward: navigation ? navigation.canGoForward() : false,
73688
74136
  isEditable: params.isEditable,
74137
+ selectionText: params.selectionText ?? "",
73689
74138
  editFlags: params.editFlags
73690
74139
  });
73691
74140
  const menu = electron.Menu.buildFromTemplate(
@@ -73702,6 +74151,8 @@ async function initializeBrowserHost(options, bindings) {
73702
74151
  electron.clipboard.writeText(params.linkURL ?? "");
73703
74152
  else if (item.id === "copy-page")
73704
74153
  electron.clipboard.writeText(contents.getURL());
74154
+ else if (item.id === "undo") contents.undo();
74155
+ else if (item.id === "redo") contents.redo();
73705
74156
  else if (item.id === "cut") contents.cut();
73706
74157
  else if (item.id === "copy") contents.copy();
73707
74158
  else if (item.id === "paste") contents.paste();
@@ -73961,6 +74412,12 @@ async function initializeBrowserHost(options, bindings) {
73961
74412
  type: metric.type
73962
74413
  }))
73963
74414
  }) : null;
74415
+ const approvalsOverlay = options.approvalsOverlay?.enabled === true && approvalsOverlayEnabled(process.env) ? new ApprovalsOverlayController({
74416
+ window: options.window,
74417
+ documentUrl: options.approvalsOverlay.documentUrl,
74418
+ opaque: process.platform !== "darwin",
74419
+ log: log2
74420
+ }) : null;
73964
74421
  const sessionStore = new BrowserSessionStore({
73965
74422
  dir: path$1.join(options.userDataDir, "browser"),
73966
74423
  log: log2
@@ -74016,7 +74473,10 @@ async function initializeBrowserHost(options, bindings) {
74016
74473
  },
74017
74474
  releaseTab,
74018
74475
  notifyChanged,
74019
- (snapshot2) => addressOverlay?.onLayout(snapshot2)
74476
+ (snapshot2) => {
74477
+ addressOverlay?.onLayout(snapshot2);
74478
+ approvalsOverlay?.onLayout(snapshot2);
74479
+ }
74020
74480
  );
74021
74481
  registryForDownloads = registry;
74022
74482
  rollback.add(async () => {
@@ -74026,6 +74486,7 @@ async function initializeBrowserHost(options, bindings) {
74026
74486
  await Promise.allSettled([...releases]);
74027
74487
  });
74028
74488
  rollback.add(() => addressOverlay?.dispose("startup-rollback"));
74489
+ rollback.add(() => approvalsOverlay?.dispose("startup-rollback"));
74029
74490
  const ownership = new OwnershipLedger({
74030
74491
  mayAdopt: (token, requester) => {
74031
74492
  const record = registry.requireSurface(token);
@@ -74049,6 +74510,9 @@ async function initializeBrowserHost(options, bindings) {
74049
74510
  }
74050
74511
  }
74051
74512
  });
74513
+ let approvalsExpiryTimer = null;
74514
+ let syncApprovalsOverlay = () => {
74515
+ };
74052
74516
  const approvals = new ApprovalStore({
74053
74517
  dir: path$1.join(options.userDataDir, "browser"),
74054
74518
  onChanged: () => {
@@ -74056,9 +74520,26 @@ async function initializeBrowserHost(options, bindings) {
74056
74520
  options.window.webContents.send("browser-consent-changed");
74057
74521
  }
74058
74522
  consentNotifier.announce(approvals.pendingEntries());
74523
+ syncApprovalsOverlay();
74059
74524
  },
74060
74525
  log: log2
74061
74526
  });
74527
+ syncApprovalsOverlay = () => {
74528
+ if (!approvalsOverlay) return;
74529
+ if (approvalsExpiryTimer) {
74530
+ clearTimeout(approvalsExpiryTimer);
74531
+ approvalsExpiryTimer = null;
74532
+ }
74533
+ const entries = approvals.pendingEntries();
74534
+ approvalsOverlay?.setPending(entries.length);
74535
+ if (entries.length === 0) return;
74536
+ const delay2 = approvalsExpiryDelay(entries);
74537
+ if (delay2 !== null) {
74538
+ approvalsExpiryTimer = setTimeout(syncApprovalsOverlay, delay2 + 25);
74539
+ approvalsExpiryTimer.unref?.();
74540
+ }
74541
+ };
74542
+ syncApprovalsOverlay();
74062
74543
  const profileDir = browserStoragePath(browserSession) ?? "";
74063
74544
  const facts = {
74064
74545
  proto: 1,
@@ -74349,6 +74830,11 @@ async function initializeBrowserHost(options, bindings) {
74349
74830
  }
74350
74831
  sessionStore.flush();
74351
74832
  addressOverlay?.dispose("host-stop");
74833
+ if (approvalsExpiryTimer) {
74834
+ clearTimeout(approvalsExpiryTimer);
74835
+ approvalsExpiryTimer = null;
74836
+ }
74837
+ approvalsOverlay?.dispose("host-stop");
74352
74838
  registry.destroyAll();
74353
74839
  await Promise.allSettled([...releases]);
74354
74840
  await cdp.close();
@@ -86189,6 +86675,8 @@ electron.app.whenReady().then(async () => {
86189
86675
  const rendererUrl = rendererDocumentUrl();
86190
86676
  const consoleCaptureUrl = consoleCaptureUrlFor(rendererUrl);
86191
86677
  const addressOverlayDocumentUrl = addressOverlayGate.list || addressOverlayProduct ? addressListDocumentUrlFor(rendererUrl) : addressOverlayDocumentUrlFor(rendererUrl);
86678
+ const approvalsOverlayS6a = process.env[APPROVALS_OVERLAY_S6A_ENV] === "1";
86679
+ const approvalsOverlayDocumentUrl = approvalsOverlayS6a ? documentUrlFor(rendererUrl, "browser-approvals-overlay.html") : null;
86192
86680
  backendService.observeDesktopFeed(
86193
86681
  (frame) => {
86194
86682
  if (frame.type === "notification") {
@@ -87041,6 +87529,12 @@ electron.app.whenReady().then(async () => {
87041
87529
  documentUrl: addressOverlayDocumentUrl
87042
87530
  }
87043
87531
  } : {},
87532
+ ...approvalsOverlayS6a && approvalsOverlayDocumentUrl ? {
87533
+ approvalsOverlay: {
87534
+ enabled: true,
87535
+ documentUrl: approvalsOverlayDocumentUrl
87536
+ }
87537
+ } : {},
87044
87538
  preloadPath: path$1.join(__dirname, "../preload/index.js"),
87045
87539
  /*
87046
87540
  * The console's surfaces are handed the user's own PATH, from the same