bunite-core 0.11.4 → 0.12.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bunite-core",
3
3
  "description": "Uniting UI and Bun",
4
- "version": "0.11.4",
4
+ "version": "0.12.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "setup:cef": "bun ../tools/bunite-dev/scripts/setup-cef.ts",
@@ -24,7 +24,7 @@
24
24
  "msgpackr": "^1.11.9"
25
25
  },
26
26
  "optionalDependencies": {
27
- "bunite-native-win-x64": "0.0.8",
27
+ "bunite-native-win-x64": "0.0.9",
28
28
  "bunite-native-mac-arm64": "0.0.1",
29
29
  "bunite-native-linux-x64": "0.0.1"
30
30
  }
@@ -8,8 +8,13 @@ import {
8
8
  type Connection,
9
9
  type BytesPipe,
10
10
  } from "../../rpc/index";
11
+ import type { EvaluateResult, SurfaceCapabilities } from "../../rpc/framework";
11
12
  import { createEncryptedPipe } from "../encryptedPipe";
12
- import { ensureNativeRuntime, getNativeLibrary, toCString, waitForViewReady, cancelWaitForViewReady } from "../native";
13
+ import {
14
+ ensureNativeRuntime, getNativeLibrary, toCString, waitForViewReady, cancelWaitForViewReady,
15
+ setEvaluateResultHandler, type NativeEvaluateResult
16
+ } from "../native";
17
+ import { getNativeEngineName } from "../native";
13
18
  import { attachBrowserViewRegistry, getRpcPort } from "./Socket";
14
19
  import { getAppRuntimeOrThrow } from "./App";
15
20
  import { randomBytes } from "node:crypto";
@@ -19,6 +24,52 @@ import { removeSurfacesForHostView } from "./SurfaceRegistry";
19
24
  const BrowserViewMap: Record<number, BrowserView> = {};
20
25
  let nextWebviewId = 1;
21
26
 
27
+ // Evaluate request plumbing — native fires `evaluate-result` events keyed by
28
+ // requestId. Resolvers are sliced by viewId on dispatch (set once at module
29
+ // load).
30
+ let nextEvaluateRequestId = 1;
31
+ const evaluateResolvers = new Map<number, (result: EvaluateResult) => void>();
32
+
33
+ function registerEvaluateRequest(resolve: (result: EvaluateResult) => void): number {
34
+ const id = nextEvaluateRequestId++;
35
+ evaluateResolvers.set(id, resolve);
36
+ return id;
37
+ }
38
+
39
+ setEvaluateResultHandler((_viewId, raw: NativeEvaluateResult) => {
40
+ const resolve = evaluateResolvers.get(raw.requestId);
41
+ if (!resolve) return;
42
+ evaluateResolvers.delete(raw.requestId);
43
+ if (raw.ok && raw.value !== undefined) {
44
+ try {
45
+ resolve({ ok: true, value: JSON.parse(raw.value) });
46
+ } catch (e) {
47
+ resolve({ ok: false, code: "runtime_error", message: `result JSON parse failed: ${(e as Error).message}` });
48
+ }
49
+ } else {
50
+ resolve({
51
+ ok: false,
52
+ code: (raw.code as EvaluateResult extends { code: infer C } ? C : never) ?? "runtime_error",
53
+ message: raw.message ?? "evaluate failed",
54
+ });
55
+ }
56
+ });
57
+
58
+ function computeCapabilities(engine: string | null): SurfaceCapabilities {
59
+ const supports = engine === "webview2" || engine === "cef";
60
+ return {
61
+ evaluate: supports,
62
+ crossOriginEval: false,
63
+ titleChanged: supports,
64
+ nativeInputTrusted: false,
65
+ click: false,
66
+ type: false,
67
+ press: false,
68
+ scroll: false,
69
+ screenshot: false,
70
+ };
71
+ }
72
+
22
73
  export type BrowserViewOptions = {
23
74
  url: string | null;
24
75
  html: string | null;
@@ -208,6 +259,20 @@ export class BrowserView {
208
259
  }
209
260
  }
210
261
 
262
+ evaluate(script: string): Promise<EvaluateResult> {
263
+ if (!this.nativeAttached) {
264
+ return Promise.resolve({ ok: false, code: "not_supported", message: "native runtime unavailable" });
265
+ }
266
+ return new Promise<EvaluateResult>((resolve) => {
267
+ const requestId = registerEvaluateRequest(resolve);
268
+ getNativeLibrary()?.symbols.bunite_view_evaluate(this.id, requestId, toCString(script));
269
+ });
270
+ }
271
+
272
+ capabilities(): SurfaceCapabilities {
273
+ return computeCapabilities(getNativeEngineName());
274
+ }
275
+
211
276
  goBack() {
212
277
  if (this.nativeAttached) {
213
278
  getNativeLibrary()?.symbols.bunite_view_go_back(this.id);
@@ -314,7 +379,7 @@ export class BrowserView {
314
379
  cancelWaitForViewReady(this.id);
315
380
  this.nativeAttached = false;
316
381
  for (const eventName of [
317
- "will-navigate", "did-navigate", "dom-ready", "new-window-open", "permission-requested"
382
+ "will-navigate", "did-navigate", "dom-ready", "new-window-open", "permission-requested", "title-changed"
318
383
  ]) {
319
384
  buniteEventEmitter.removeAllListeners(`${eventName}-${this.id}`);
320
385
  }
@@ -322,7 +387,7 @@ export class BrowserView {
322
387
  }
323
388
 
324
389
  on(
325
- name: "will-navigate" | "did-navigate" | "dom-ready" | "new-window-open" | "permission-requested",
390
+ name: "will-navigate" | "did-navigate" | "dom-ready" | "new-window-open" | "permission-requested" | "title-changed",
326
391
  handler: (event: unknown) => void
327
392
  ) {
328
393
  const specificName = `${name}-${this.id}`;
@@ -1,7 +1,10 @@
1
- import { onSurfaceInit, emitDidNavigate } from "./SurfaceManager";
1
+ import { onSurfaceInit, emitDidNavigate, emitTitleChanged } from "./SurfaceManager";
2
2
 
3
3
  onSurfaceInit((surfaceId, hostViewId, view) => {
4
4
  view.on("did-navigate", (event: any) => {
5
5
  emitDidNavigate(hostViewId, surfaceId, event.data.detail);
6
6
  });
7
+ view.on("title-changed", (event: any) => {
8
+ emitTitleChanged(hostViewId, surfaceId, event.data.detail);
9
+ });
7
10
  });
@@ -27,6 +27,15 @@ export function emitDidNavigate(hostViewId: number, surfaceId: number, url: stri
27
27
  for (const emit of subs) emit({ surfaceId, url });
28
28
  }
29
29
 
30
+ type TitleChangedEmit = (event: { surfaceId: number; title: string }) => void;
31
+ const titleChangedSubs = new Map<number, Set<TitleChangedEmit>>();
32
+
33
+ export function emitTitleChanged(hostViewId: number, surfaceId: number, title: string) {
34
+ const subs = titleChangedSubs.get(hostViewId);
35
+ if (!subs) return;
36
+ for (const emit of subs) emit({ surfaceId, title });
37
+ }
38
+
30
39
  export function createSurfaceCapImpl(hostViewId: number): ImplOf<typeof SurfaceCap> {
31
40
  function ownedSurface(surfaceId: number) {
32
41
  const record = getOwnedSurface(surfaceId, { viewId: hostViewId });
@@ -136,6 +145,24 @@ export function createSurfaceCapImpl(hostViewId: number): ImplOf<typeof SurfaceC
136
145
  record?.view.reload();
137
146
  },
138
147
 
148
+ evaluate: async ({ surfaceId, script }) => {
149
+ const record = ownedSurface(surfaceId);
150
+ if (!record) return { ok: false, code: "not_supported", message: "surface not found" };
151
+ return record.view.evaluate(script);
152
+ },
153
+
154
+ capabilities: ({ surfaceId }) => {
155
+ const record = ownedSurface(surfaceId);
156
+ if (!record) {
157
+ return {
158
+ evaluate: false, crossOriginEval: false, titleChanged: false,
159
+ nativeInputTrusted: false, click: false, type: false, press: false,
160
+ scroll: false, screenshot: false,
161
+ };
162
+ }
163
+ return record.view.capabilities();
164
+ },
165
+
139
166
  didNavigate: () => Stream.from<{ surfaceId: number; url: string }>((emit, signal) => {
140
167
  let subs = didNavigateSubs.get(hostViewId);
141
168
  if (!subs) {
@@ -150,5 +177,20 @@ export function createSurfaceCapImpl(hostViewId: number): ImplOf<typeof SurfaceC
150
177
  if (set.size === 0) didNavigateSubs.delete(hostViewId);
151
178
  });
152
179
  }),
180
+
181
+ titleChanged: () => Stream.from<{ surfaceId: number; title: string }>((emit, signal) => {
182
+ let subs = titleChangedSubs.get(hostViewId);
183
+ if (!subs) {
184
+ subs = new Set();
185
+ titleChangedSubs.set(hostViewId, subs);
186
+ }
187
+ subs.add(emit);
188
+ signal.addEventListener("abort", () => {
189
+ const set = titleChangedSubs.get(hostViewId);
190
+ if (!set) return;
191
+ set.delete(emit);
192
+ if (set.size === 0) titleChangedSubs.delete(hostViewId);
193
+ });
194
+ }),
153
195
  };
154
196
  }
@@ -7,5 +7,6 @@ export default {
7
7
  newWindowOpen: (data: { detail: string | { url: string } }) =>
8
8
  new BuniteEvent("new-window-open", data),
9
9
  permissionRequested: (data: { requestId: number; kind: number; url?: string }) =>
10
- new BuniteEvent("permission-requested", data)
10
+ new BuniteEvent("permission-requested", data),
11
+ titleChanged: (data: { detail: string }) => new BuniteEvent("title-changed", data)
11
12
  };
@@ -101,6 +101,7 @@ type NativeSymbols = {
101
101
  bunite_view_go_back: (viewId: number) => void;
102
102
  bunite_view_reload: (viewId: number) => void;
103
103
  bunite_view_execute_javascript: (viewId: number, script: CStringPointer) => void;
104
+ bunite_view_evaluate: (viewId: number, requestId: number, script: CStringPointer) => void;
104
105
  bunite_view_load_url: (viewId: number, url: CStringPointer) => void;
105
106
  bunite_view_load_html: (viewId: number, html: CStringPointer) => void;
106
107
  bunite_view_remove: (viewId: number) => void;
@@ -284,6 +285,10 @@ const nativeSymbolDefinitions = {
284
285
  args: [FFIType.u32, FFIType.cstring],
285
286
  returns: FFIType.void
286
287
  },
288
+ bunite_view_evaluate: {
289
+ args: [FFIType.u32, FFIType.u32, FFIType.cstring],
290
+ returns: FFIType.void
291
+ },
287
292
  bunite_view_load_url: {
288
293
  args: [FFIType.u32, FFIType.cstring],
289
294
  returns: FFIType.void
@@ -333,6 +338,18 @@ export function setRouteRequestHandler(handler: (requestId: number, path: string
333
338
  routeRequestHandler = handler;
334
339
  }
335
340
 
341
+ export type NativeEvaluateResult = {
342
+ requestId: number;
343
+ ok: boolean;
344
+ value?: string; // raw JSON string when ok
345
+ code?: string;
346
+ message?: string;
347
+ };
348
+ let evaluateResultHandler: ((viewId: number, result: NativeEvaluateResult) => void) | null = null;
349
+ export function setEvaluateResultHandler(handler: (viewId: number, result: NativeEvaluateResult) => void) {
350
+ evaluateResultHandler = handler;
351
+ }
352
+
336
353
  // Per-view deferred resolvers for "view-ready" (OnAfterCreated).
337
354
  const viewReadyResolvers = new Map<number, () => void>();
338
355
 
@@ -474,6 +491,22 @@ function registerNativeCallbacks(library: LoadedNativeLibrary) {
474
491
  }
475
492
  break;
476
493
  }
494
+ case "evaluate-result": {
495
+ const parsed = maybeParsePayload(payload) as {
496
+ requestId: number; ok: boolean;
497
+ value?: string; code?: string; message?: string;
498
+ };
499
+ evaluateResultHandler?.(viewId, parsed);
500
+ break;
501
+ }
502
+ case "title-changed": {
503
+ const parsed = maybeParsePayload(payload) as { title: string };
504
+ buniteEventEmitter.emitEvent(
505
+ buniteEventEmitter.events.webview.titleChanged({ detail: parsed.title }),
506
+ viewId
507
+ );
508
+ break;
509
+ }
477
510
  }
478
511
  },
479
512
  {
@@ -623,7 +656,7 @@ export async function initNativeRuntime(
623
656
  throw new Error(`bunite: failed to load native library at ${artifacts.nativeLibPath}.`);
624
657
  }
625
658
 
626
- const EXPECTED_ABI = 4;
659
+ const EXPECTED_ABI = 5;
627
660
  const nativeAbi = nativeLibrary.symbols.bunite_abi_version();
628
661
  if (nativeAbi !== EXPECTED_ABI) {
629
662
  throw new Error(
@@ -133,6 +133,14 @@ extern "C" BUNITE_EXPORT void bunite_view_execute_javascript(uint32_t view_id, c
133
133
  });
134
134
  }
135
135
 
136
+ extern "C" BUNITE_EXPORT void bunite_view_evaluate(uint32_t view_id, uint32_t request_id, const char* /*script*/) {
137
+ // Stage A: Linux evaluate not yet implemented.
138
+ std::string payload = "{\"requestId\":" + std::to_string(request_id) +
139
+ ",\"ok\":false,\"code\":\"not_supported\","
140
+ "\"message\":\"Linux evaluate not implemented (Stage A: Windows only)\"}";
141
+ bunite_linux::emitWebviewEvent(view_id, "evaluate-result", payload);
142
+ }
143
+
136
144
  extern "C" BUNITE_EXPORT void bunite_view_load_url(uint32_t view_id, const char* url) {
137
145
  std::string s = url ? url : "";
138
146
  runOnUiThreadSync([=]() {
@@ -16,7 +16,7 @@ bool isOnMainThread() {
16
16
 
17
17
  namespace {
18
18
 
19
- constexpr int32_t kBuniteAbiVersion = 4;
19
+ constexpr int32_t kBuniteAbiVersion = 5;
20
20
 
21
21
  } // namespace
22
22
 
@@ -20,7 +20,7 @@ using bunite_mac::runOnUiThreadSync;
20
20
 
21
21
  namespace {
22
22
 
23
- constexpr int32_t kBuniteAbiVersion = 4;
23
+ constexpr int32_t kBuniteAbiVersion = 5;
24
24
 
25
25
  // warn-once — avoid log spam from tight JS call loops.
26
26
  #define BUNITE_MAC_TODO(name) \
@@ -273,6 +273,15 @@ extern "C" BUNITE_EXPORT void bunite_view_execute_javascript(uint32_t view_id, c
273
273
  });
274
274
  }
275
275
 
276
+ extern "C" BUNITE_EXPORT void bunite_view_evaluate(uint32_t view_id, uint32_t request_id, const char* /*script*/) {
277
+ // Stage A: macOS evaluate not yet implemented. Report not_supported so the
278
+ // JS side's whenReady() resolves with a structured envelope.
279
+ std::string payload = "{\"requestId\":" + std::to_string(request_id) +
280
+ ",\"ok\":false,\"code\":\"not_supported\","
281
+ "\"message\":\"macOS evaluate not implemented (Stage A: Windows only)\"}";
282
+ bunite_mac::emitWebviewEvent(view_id, "evaluate-result", payload);
283
+ }
284
+
276
285
  extern "C" BUNITE_EXPORT void bunite_view_load_url(uint32_t view_id, const char* url) {
277
286
  // Drop stored HTML so a later nav to internal/index.html doesn't resurrect it.
278
287
  bunite::WebviewContentStorage::instance().remove(view_id);
@@ -15,6 +15,8 @@
15
15
  extern "C" {
16
16
  #endif
17
17
 
18
+ /** ABI version. Bump on any breaking change to symbol set / signatures.
19
+ * v5 (2026-05): adds `bunite_view_evaluate` + `evaluate-result` webview event. */
18
20
  BUNITE_EXPORT int32_t bunite_abi_version(void);
19
21
  BUNITE_EXPORT void bunite_set_log_level(int32_t level);
20
22
  BUNITE_EXPORT bool bunite_init(
@@ -87,6 +89,14 @@ BUNITE_EXPORT bool bunite_view_create(
87
89
  const char* preload_origins_json
88
90
  );
89
91
  BUNITE_EXPORT void bunite_view_execute_javascript(uint32_t view_id, const char* script);
92
+ /**
93
+ * Evaluate `script` in the view's main frame and report the result via the
94
+ * webview event handler as `evaluate-result` with payload
95
+ * { requestId, ok: true, value } // value is the raw JSON string
96
+ * { requestId, ok: false, code, message } // code: cross_origin / runtime_error / not_supported / ...
97
+ * Backends that don't implement evaluation report not_supported synchronously.
98
+ */
99
+ BUNITE_EXPORT void bunite_view_evaluate(uint32_t view_id, uint32_t request_id, const char* script);
90
100
  BUNITE_EXPORT void bunite_view_load_url(uint32_t view_id, const char* url);
91
101
  BUNITE_EXPORT void bunite_view_load_html(uint32_t view_id, const char* html);
92
102
  BUNITE_EXPORT void bunite_register_appres_route(const char* path);
@@ -84,7 +84,8 @@ class BuniteCefClient
84
84
  public CefLoadHandler,
85
85
  public CefRequestHandler,
86
86
  public CefResourceRequestHandler,
87
- public CefPermissionHandler {
87
+ public CefPermissionHandler,
88
+ public CefDisplayHandler {
88
89
  public:
89
90
  explicit BuniteCefClient(ViewHost* view)
90
91
  : view_(view) {}
@@ -93,6 +94,37 @@ public:
93
94
  CefRefPtr<CefLoadHandler> GetLoadHandler() override { return this; }
94
95
  CefRefPtr<CefRequestHandler> GetRequestHandler() override { return this; }
95
96
  CefRefPtr<CefPermissionHandler> GetPermissionHandler() override { return this; }
97
+ CefRefPtr<CefDisplayHandler> GetDisplayHandler() override { return this; }
98
+
99
+ bool OnProcessMessageReceived(
100
+ CefRefPtr<CefBrowser> /*browser*/,
101
+ CefRefPtr<CefFrame> /*frame*/,
102
+ CefProcessId /*source_process*/,
103
+ CefRefPtr<CefProcessMessage> message
104
+ ) override {
105
+ if (message->GetName() != "bunite.evaluate.result") return false;
106
+ auto args = message->GetArgumentList();
107
+ if (!args || args->GetSize() < 4) return true;
108
+ uint32_t request_id = static_cast<uint32_t>(args->GetInt(0));
109
+ bool ok = args->GetBool(1);
110
+ std::string a2 = args->GetString(2).ToString(); // value (when ok) | code (when !ok)
111
+ std::string msg = args->GetString(3).ToString(); // message (when !ok)
112
+ std::string payload = "{\"requestId\":" + std::to_string(request_id) + ",\"ok\":";
113
+ if (ok) {
114
+ payload += "true,\"value\":\"" + bunite_win::escapeJsonString(a2) + "\"}";
115
+ } else {
116
+ payload += "false,\"code\":\"" + bunite_win::escapeJsonString(a2) +
117
+ "\",\"message\":\"" + bunite_win::escapeJsonString(msg) + "\"}";
118
+ }
119
+ bunite_win::emitWebviewEvent(view_->id, "evaluate-result", payload);
120
+ return true;
121
+ }
122
+
123
+ void OnTitleChange(CefRefPtr<CefBrowser>, const CefString& title) override {
124
+ CEF_REQUIRE_UI_THREAD();
125
+ std::string payload = "{\"title\":\"" + bunite_win::escapeJsonString(title.ToString()) + "\"}";
126
+ bunite_win::emitWebviewEvent(view_->id, "title-changed", payload);
127
+ }
96
128
 
97
129
  void OnBeforeDevToolsPopup(
98
130
  CefRefPtr<CefBrowser>,
@@ -6,7 +6,7 @@
6
6
  using bunite_win::runOnUiThreadSync;
7
7
  using bunite_win::runOnCefUiThreadSync;
8
8
 
9
- static constexpr int32_t BUNITE_ABI_VERSION = 4;
9
+ static constexpr int32_t BUNITE_ABI_VERSION = 5;
10
10
 
11
11
  namespace {
12
12
 
@@ -536,6 +536,24 @@ extern "C" BUNITE_EXPORT void bunite_view_execute_javascript(uint32_t view_id, c
536
536
  });
537
537
  }
538
538
 
539
+ extern "C" BUNITE_EXPORT void bunite_view_evaluate(uint32_t view_id, uint32_t request_id, const char* script) {
540
+ bunite_win::postCefUiTask([view_id, request_id, code = std::string(script ? script : "")]() {
541
+ auto* view = bunite_win::getViewHostById(view_id);
542
+ if (!view || !view->browser || !view->browser->GetMainFrame()) {
543
+ std::string payload = "{\"requestId\":" + std::to_string(request_id) +
544
+ ",\"ok\":false,\"code\":\"not_supported\","
545
+ "\"message\":\"view not ready\"}";
546
+ bunite_win::emitWebviewEvent(view_id, "evaluate-result", payload);
547
+ return;
548
+ }
549
+ auto message = CefProcessMessage::Create("bunite.evaluate.request");
550
+ auto args = message->GetArgumentList();
551
+ args->SetInt(0, static_cast<int>(request_id));
552
+ args->SetString(1, code);
553
+ view->browser->GetMainFrame()->SendProcessMessage(PID_RENDERER, message);
554
+ });
555
+ }
556
+
539
557
  extern "C" BUNITE_EXPORT void bunite_view_load_url(uint32_t view_id, const char* url) {
540
558
  bunite_win::postCefUiTask([view_id, next_url = std::string(url ? url : "")]() {
541
559
  auto* view = bunite_win::getViewHostById(view_id);
@@ -35,6 +35,68 @@ public:
35
35
  return this;
36
36
  }
37
37
 
38
+ bool OnProcessMessageReceived(
39
+ CefRefPtr<CefBrowser> browser,
40
+ CefRefPtr<CefFrame> frame,
41
+ CefProcessId /*source_process*/,
42
+ CefRefPtr<CefProcessMessage> message
43
+ ) override {
44
+ if (message->GetName() != "bunite.evaluate.request") return false;
45
+ auto args = message->GetArgumentList();
46
+ if (!args || args->GetSize() < 2) return true;
47
+ uint32_t request_id = static_cast<uint32_t>(args->GetInt(0));
48
+ std::string script = args->GetString(1).ToString();
49
+
50
+ auto context = frame->GetV8Context();
51
+ if (!context) {
52
+ auto reply = CefProcessMessage::Create("bunite.evaluate.result");
53
+ auto rl = reply->GetArgumentList();
54
+ rl->SetInt(0, static_cast<int>(request_id));
55
+ rl->SetBool(1, false);
56
+ rl->SetString(2, "runtime_error");
57
+ rl->SetString(3, "no V8 context");
58
+ frame->SendProcessMessage(PID_BROWSER, reply);
59
+ return true;
60
+ }
61
+
62
+ context->Enter();
63
+ CefRefPtr<CefV8Value> retval;
64
+ CefRefPtr<CefV8Exception> exception;
65
+ bool ok = context->Eval(script, "bunite://evaluate", 0, retval, exception);
66
+
67
+ auto reply = CefProcessMessage::Create("bunite.evaluate.result");
68
+ auto rl = reply->GetArgumentList();
69
+ rl->SetInt(0, static_cast<int>(request_id));
70
+ if (ok && retval) {
71
+ // V8 JSON.stringify for cross-process transport.
72
+ auto global = context->GetGlobal();
73
+ auto json_obj = global->GetValue("JSON");
74
+ auto stringify = json_obj ? json_obj->GetValue("stringify") : nullptr;
75
+ std::string json_str;
76
+ if (stringify && stringify->IsFunction()) {
77
+ CefV8ValueList args2; args2.push_back(retval);
78
+ auto json_v = stringify->ExecuteFunction(json_obj, args2);
79
+ if (json_v && json_v->IsString()) json_str = json_v->GetStringValue().ToString();
80
+ }
81
+ if (json_str.empty()) json_str = "null";
82
+ rl->SetBool(1, true);
83
+ rl->SetString(2, json_str);
84
+ rl->SetString(3, "");
85
+ } else {
86
+ std::string msg = exception ? exception->GetMessage().ToString() : "eval failed";
87
+ // SecurityError typically arises from cross-origin reach.
88
+ std::string code = (msg.find("SecurityError") != std::string::npos ||
89
+ msg.find("cross-origin") != std::string::npos)
90
+ ? "cross_origin" : "runtime_error";
91
+ rl->SetBool(1, false);
92
+ rl->SetString(2, code);
93
+ rl->SetString(3, msg);
94
+ }
95
+ context->Exit();
96
+ frame->SendProcessMessage(PID_BROWSER, reply);
97
+ return true;
98
+ }
99
+
38
100
  void OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) override {
39
101
  registrar->AddCustomScheme(
40
102
  "appres",
@@ -11,7 +11,7 @@ void setViewInputPassthrough(ViewHost* v, bool passthrough);
11
11
 
12
12
  extern "C" {
13
13
 
14
- BUNITE_EXPORT int32_t bunite_abi_version(void) { return 4; }
14
+ BUNITE_EXPORT int32_t bunite_abi_version(void) { return 5; }
15
15
 
16
16
  BUNITE_EXPORT void bunite_set_log_level(int32_t level) {
17
17
  if (level < 0) level = 0;
@@ -155,6 +155,42 @@ BUNITE_EXPORT void bunite_view_execute_javascript(uint32_t view_id, const char*
155
155
  v->webview->ExecuteScript(utf8ToWide(script).c_str(), nullptr);
156
156
  }
157
157
 
158
+ BUNITE_EXPORT void bunite_view_evaluate(uint32_t view_id, uint32_t request_id, const char* script) {
159
+ ViewHost* v = getView(view_id);
160
+ if (!v || !v->webview || !script) {
161
+ std::string payload = "{\"requestId\":" + std::to_string(request_id) +
162
+ ",\"ok\":false,\"code\":\"not_supported\","
163
+ "\"message\":\"view not ready\"}";
164
+ emitWebviewEvent(view_id, "evaluate-result", payload);
165
+ return;
166
+ }
167
+ auto lifetime = g_runtime.lifetime;
168
+ v->webview->ExecuteScript(
169
+ utf8ToWide(script).c_str(),
170
+ Microsoft::WRL::Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
171
+ [lifetime, view_id, request_id](HRESULT hr, LPCWSTR raw) -> HRESULT {
172
+ if (!lifetime || !lifetime->alive.load()) return S_OK;
173
+ std::string payload;
174
+ if (FAILED(hr) || !raw) {
175
+ payload = "{\"requestId\":" + std::to_string(request_id) +
176
+ ",\"ok\":false,\"code\":\"runtime_error\","
177
+ "\"message\":\"ExecuteScript failed hr=0x" +
178
+ [hr]() { char b[16]; snprintf(b, sizeof(b), "%08x", static_cast<unsigned>(hr)); return std::string(b); }() +
179
+ "\"}";
180
+ } else {
181
+ // WebView2 returns JSON-encoded result. Embed as a JSON string so
182
+ // the JS-side parses it as a string and re-JSON.parses to get the
183
+ // value back (the `value` field of the envelope is a raw JSON
184
+ // string per the FFI contract).
185
+ std::string value = wideToUtf8(raw);
186
+ payload = "{\"requestId\":" + std::to_string(request_id) +
187
+ ",\"ok\":true,\"value\":\"" + escapeJsonString(value) + "\"}";
188
+ }
189
+ emitWebviewEvent(view_id, "evaluate-result", payload);
190
+ return S_OK;
191
+ }).Get());
192
+ }
193
+
158
194
  BUNITE_EXPORT void bunite_view_load_url(uint32_t view_id, const char* url) {
159
195
  ViewHost* v = getView(view_id);
160
196
  if (!v || !url) return;
@@ -806,6 +806,21 @@ static void attachControllerCallbacks(ViewHost* view) {
806
806
  }).Get(),
807
807
  &tok);
808
808
 
809
+ // DocumentTitleChanged — surface for automation `titleChanged` stream.
810
+ view->webview->add_DocumentTitleChanged(
811
+ Callback<ICoreWebView2DocumentTitleChangedEventHandler>(
812
+ [lifetime, view_id](ICoreWebView2* wv, IUnknown*) -> HRESULT {
813
+ if (!lifetime || !lifetime->alive.load()) return S_OK;
814
+ LPWSTR title_raw = nullptr;
815
+ if (wv) wv->get_DocumentTitle(&title_raw);
816
+ std::string title = wideToUtf8(title_raw);
817
+ if (title_raw) CoTaskMemFree(title_raw);
818
+ std::string payload = "{\"title\":\"" + escapeJsonString(title) + "\"}";
819
+ emitWebviewEvent(view_id, "title-changed", payload);
820
+ return S_OK;
821
+ }).Get(),
822
+ &tok);
823
+
809
824
  // PermissionRequested — map to bunite kind and stash deferral.
810
825
  view->webview->add_PermissionRequested(
811
826
  Callback<ICoreWebView2PermissionRequestedEventHandler>(
@@ -1 +1 @@
1
- var I8=Symbol.for("bunite.rpc.CallDef"),k8=Symbol.for("bunite.rpc.StreamDef"),S8=Symbol.for("bunite.rpc.CapDef"),v8=Symbol.for("bunite.rpc.CapRefToken"),h8=Symbol.for("bunite.rpc.CapArrayToken"),m8=Symbol.for("bunite.rpc.CapRecordToken"),z$=Symbol.for("bunite.rpc.Schema");function n_(_){return{[v8]:!0,cap:_}}n_.array=(_)=>({[h8]:!0,cap:_});n_.record=(_)=>({[m8]:!0,cap:_});var s=n_;function A_(_){return typeof _==="object"&&_!==null&&_[v8]===!0}function U_(_){return typeof _==="object"&&_!==null&&_[h8]===!0}function T_(_){return typeof _==="object"&&_!==null&&_[m8]===!0}function B_(_){return typeof _==="object"&&_!==null&&_[I8]===!0}function z_(_){return typeof _==="object"&&_!==null&&_[k8]===!0}function T(_){return{[I8]:!0,idempotent:!!_?.idempotent,returns:_?.returns}}function P_(_){return{[k8]:!0,hint:_?.hint}}function a(_,$,X){return{[S8]:!0,name:_,version:X?.version!=null?String(X.version):void 0,methods:$,disposal:X?.disposal??void 0}}function V_(_){return typeof _==="object"&&_!==null&&_[S8]===!0}function s_(_){return typeof _==="object"&&_!==null&&_[z$]===!0}var i_;try{i_=new TextDecoder}catch(_){}var G,c,Z=0;var t8=[],a_=t8,r_=0,j={},E,Q_,d=0,r=0,g,$_,l=[],V,f8={useRecords:!1,mapsAsObjects:!0};class b_{}var e_=new b_;e_.name="MessagePack 0xC1";var K_=!1,g8=2,p8,l8,u8;class t{constructor(_){if(_){if(_.useRecords===!1&&_.mapsAsObjects===void 0)_.mapsAsObjects=!0;if(_.sequential&&_.trusted!==!1){if(_.trusted=!0,!_.structures&&_.useRecords!=!1){if(_.structures=[],!_.maxSharedStructures)_.maxSharedStructures=0}}if(_.structures)_.structures.sharedLength=_.structures.length;else if(_.getStructures)(_.structures=[]).uninitialized=!0,_.structures.sharedLength=0;if(_.int64AsNumber)_.int64AsType="number"}Object.assign(this,_)}unpack(_,$){if(G)return H$(()=>{return w_(),this?this.unpack(_,$):t.prototype.unpack.call(f8,_,$)});if(!_.buffer&&_.constructor===ArrayBuffer)_=typeof Buffer<"u"?Buffer.from(_):new Uint8Array(_);if(typeof $==="object")c=$.end||_.length,Z=$.start||0;else Z=0,c=$>-1?$:_.length;r_=0,r=0,Q_=null,a_=t8,g=null,G=_;try{V=_.dataView||(_.dataView=new DataView(_.buffer,_.byteOffset,_.byteLength))}catch(X){if(G=null,_ instanceof Uint8Array)throw X;throw Error("Source must be a Uint8Array or Buffer but was a "+(_&&typeof _=="object"?_.constructor.name:typeof _))}if(this instanceof t){if(j=this,this.structures)return E=this.structures,E_($);else if(!E||E.length>0)E=[]}else if(j=f8,!E||E.length>0)E=[];return E_($)}unpackMultiple(_,$){let X,H=0;try{K_=!0;let Q=_.length,K=this?this.unpack(_,Q):j_.unpack(_,Q);if($){if($(K,H,Z)===!1)return;while(Z<Q)if(H=Z,$(E_(),H,Z)===!1)return}else{X=[K];while(Z<Q)H=Z,X.push(E_());return X}}catch(Q){throw Q.lastPosition=H,Q.values=X,Q}finally{K_=!1,w_()}}_mergeStructures(_,$){if(l8)_=l8.call(this,_);if(_=_||[],Object.isFrozen(_))_=_.map((X)=>X.slice(0));for(let X=0,H=_.length;X<H;X++){let Q=_[X];if(Q){if(Q.isShared=!0,X>=32)Q.highByte=X-32>>5}}_.sharedLength=_.length;for(let X in $||[])if(X>=0){let H=_[X],Q=$[X];if(Q){if(H)(_.restoreStructures||(_.restoreStructures=[]))[X]=H;_[X]=Q}}return this.structures=_}decode(_,$){return this.unpack(_,$)}}function E_(_){try{if(!j.trusted&&!K_){let X=E.sharedLength||0;if(X<E.length)E.length=X}let $;if(j.randomAccessStructure&&G[Z]<64&&G[Z]>=32&&p8){if($=p8(G,Z,c,j),G=null,!(_&&_.lazy)&&$)$=$.toJSON();Z=c}else $=h();if(g)Z=g.postBundlePosition,g=null;if(K_)E.restoreStructures=null;if(Z==c){if(E&&E.restoreStructures)d8();if(E=null,G=null,$_)$_=null}else if(Z>c)throw Error("Unexpected end of MessagePack data");else if(!K_){let X;try{X=JSON.stringify($,(H,Q)=>typeof Q==="bigint"?`${Q}n`:Q).slice(0,100)}catch(H){X="(JSON view not available "+H+")"}throw Error("Data read, but end of buffer not reached "+X)}return $}catch($){if(E&&E.restoreStructures)d8();if(w_(),$ instanceof RangeError||$.message.startsWith("Unexpected end of buffer")||Z>c)$.incomplete=!0;throw $}}function d8(){for(let _ in E.restoreStructures)E[_]=E.restoreStructures[_];E.restoreStructures=null}function h(){let _=G[Z++];if(_<160)if(_<128)if(_<64)return _;else{let $=E[_&63]||j.getStructures&&e8()[_&63];if($){if(!$.read)$.read=_8($,_&63);return $.read()}else return _}else if(_<144)if(_-=128,j.mapsAsObjects){let $={};for(let X=0;X<_;X++){let H=$$();if(H==="__proto__")H="__proto_";$[H]=h()}return $}else{let $=new Map;for(let X=0;X<_;X++)$.set(h(),h());return $}else{_-=144;let $=Array(_);for(let X=0;X<_;X++)$[X]=h();if(j.freezeData)return Object.freeze($);return $}else if(_<192){let $=_-160;if(r>=Z)return Q_.slice(Z-d,(Z+=$)-d);if(r==0&&c<140){let X=$<16?$8($):_$($);if(X!=null)return X}return t_($)}else{let $;switch(_){case 192:return null;case 193:if(g)if($=h(),$>0)return g[1].slice(g.position1,g.position1+=$);else return g[0].slice(g.position0,g.position0-=$);return e_;case 194:return!1;case 195:return!0;case 196:if($=G[Z++],$===void 0)throw Error("Unexpected end of buffer");return o_($);case 197:return $=V.getUint16(Z),Z+=2,o_($);case 198:return $=V.getUint32(Z),Z+=4,o_($);case 199:return F_(G[Z++]);case 200:return $=V.getUint16(Z),Z+=2,F_($);case 201:return $=V.getUint32(Z),Z+=4,F_($);case 202:if($=V.getFloat32(Z),j.useFloat32>2){let X=x_[(G[Z]&127)<<1|G[Z+1]>>7];return Z+=4,(X*$+($>0?0.5:-0.5)>>0)/X}return Z+=4,$;case 203:return $=V.getFloat64(Z),Z+=8,$;case 204:return G[Z++];case 205:return $=V.getUint16(Z),Z+=2,$;case 206:return $=V.getUint32(Z),Z+=4,$;case 207:if(j.int64AsType==="number")$=V.getUint32(Z)*4294967296,$+=V.getUint32(Z+4);else if(j.int64AsType==="string")$=V.getBigUint64(Z).toString();else if(j.int64AsType==="auto"){if($=V.getBigUint64(Z),$<=BigInt(2)<<BigInt(52))$=Number($)}else $=V.getBigUint64(Z);return Z+=8,$;case 208:return V.getInt8(Z++);case 209:return $=V.getInt16(Z),Z+=2,$;case 210:return $=V.getInt32(Z),Z+=4,$;case 211:if(j.int64AsType==="number")$=V.getInt32(Z)*4294967296,$+=V.getUint32(Z+4);else if(j.int64AsType==="string")$=V.getBigInt64(Z).toString();else if(j.int64AsType==="auto"){if($=V.getBigInt64(Z),$>=BigInt(-2)<<BigInt(52)&&$<=BigInt(2)<<BigInt(52))$=Number($)}else $=V.getBigInt64(Z);return Z+=8,$;case 212:if($=G[Z++],$==114)return a8(G[Z++]&63);else{let X=l[$];if(X)if(X.read)return Z++,X.read(h());else if(X.noBuffer)return Z++,X();else return X(G.subarray(Z,++Z));else throw Error("Unknown extension "+$)}case 213:if($=G[Z],$==114)return Z++,a8(G[Z++]&63,G[Z++]);else return F_(2);case 214:return F_(4);case 215:return F_(8);case 216:return F_(16);case 217:if($=G[Z++],r>=Z)return Q_.slice(Z-d,(Z+=$)-d);return V$($);case 218:if($=V.getUint16(Z),Z+=2,r>=Z)return Q_.slice(Z-d,(Z+=$)-d);return E$($);case 219:if($=V.getUint32(Z),Z+=4,r>=Z)return Q_.slice(Z-d,(Z+=$)-d);return w$($);case 220:return $=V.getUint16(Z),Z+=2,n8($);case 221:return $=V.getUint32(Z),Z+=4,n8($);case 222:return $=V.getUint16(Z),Z+=2,s8($);case 223:return $=V.getUint32(Z),Z+=4,s8($);default:if(_>=224)return _-256;if(_===void 0){let X=Error("Unexpected end of MessagePack data");throw X.incomplete=!0,X}throw Error("Unknown MessagePack token "+_)}}}var P$=/^[a-zA-Z_$][a-zA-Z\d_$]*$/;function _8(_,$){function X(){if(X.count++>g8){let Q;try{Q=_.read=Function("r","return function(){return "+(j.freezeData?"Object.freeze":"")+"({"+_.map((K)=>K==="__proto__"?"__proto_:r()":P$.test(K)?K+":r()":"["+JSON.stringify(K)+"]:r()").join(",")+"})}")(h)}catch(K){return g8=1/0,X()}if(_.highByte===0)_.read=c8($,_.read);return Q()}let H={};for(let Q=0,K=_.length;Q<K;Q++){let Y=_[Q];if(Y==="__proto__")Y="__proto_";H[Y]=h()}if(j.freezeData)return Object.freeze(H);return H}if(X.count=0,_.highByte===0)return c8($,X);return X}var c8=(_,$)=>{return function(){let X=G[Z++];if(X===0)return $();let H=_<32?-(_+(X<<5)):_+(X<<5),Q=E[H]||e8()[H];if(!Q)throw Error("Record id is not defined for "+H);if(!Q.read)Q.read=_8(Q,_);return Q.read()}};function e8(){let _=H$(()=>{return G=null,j.getStructures()});return E=j._mergeStructures(_,E)}var t_=J_,V$=J_,E$=J_,w$=J_;function J_(_){let $;if(_<16){if($=$8(_))return $}if(_>64&&i_)return i_.decode(G.subarray(Z,Z+=_));let X=Z+_,H=[];$="";while(Z<X){let Q=G[Z++];if((Q&128)===0)H.push(Q);else if((Q&224)===192){let K=G[Z++]&63,Y=(Q&31)<<6|K;if(Y<128)H.push(65533);else H.push(Y)}else if((Q&240)===224){let K=G[Z++]&63,Y=G[Z++]&63,N=(Q&31)<<12|K<<6|Y;if(N<2048||N>=55296&&N<=57343)H.push(65533);else H.push(N)}else if((Q&248)===240){let K=G[Z++]&63,Y=G[Z++]&63,N=G[Z++]&63,W=(Q&7)<<18|K<<12|Y<<6|N;if(W<65536||W>1114111)H.push(65533);else if(W>65535)W-=65536,H.push(W>>>10&1023|55296),W=56320|W&1023,H.push(W);else H.push(W)}else H.push(65533);if(H.length>=4096)$+=f.apply(String,H),H.length=0}if(H.length>0)$+=f.apply(String,H);return $}function n8(_){let $=Array(_);for(let X=0;X<_;X++)$[X]=h();if(j.freezeData)return Object.freeze($);return $}function s8(_){if(j.mapsAsObjects){let $={};for(let X=0;X<_;X++){let H=$$();if(H==="__proto__")H="__proto_";$[H]=h()}return $}else{let $=new Map;for(let X=0;X<_;X++)$.set(h(),h());return $}}var f=String.fromCharCode;function _$(_){let $=Z,X=Array(_);for(let H=0;H<_;H++){let Q=G[Z++];if((Q&128)>0){Z=$;return}X[H]=Q}return f.apply(String,X)}function $8(_){if(_<4)if(_<2)if(_===0)return"";else{let $=G[Z++];if(($&128)>1){Z-=1;return}return f($)}else{let $=G[Z++],X=G[Z++];if(($&128)>0||(X&128)>0){Z-=2;return}if(_<3)return f($,X);let H=G[Z++];if((H&128)>0){Z-=3;return}return f($,X,H)}else{let $=G[Z++],X=G[Z++],H=G[Z++],Q=G[Z++];if(($&128)>0||(X&128)>0||(H&128)>0||(Q&128)>0){Z-=4;return}if(_<6)if(_===4)return f($,X,H,Q);else{let K=G[Z++];if((K&128)>0){Z-=5;return}return f($,X,H,Q,K)}else if(_<8){let K=G[Z++],Y=G[Z++];if((K&128)>0||(Y&128)>0){Z-=6;return}if(_<7)return f($,X,H,Q,K,Y);let N=G[Z++];if((N&128)>0){Z-=7;return}return f($,X,H,Q,K,Y,N)}else{let K=G[Z++],Y=G[Z++],N=G[Z++],W=G[Z++];if((K&128)>0||(Y&128)>0||(N&128)>0||(W&128)>0){Z-=8;return}if(_<10)if(_===8)return f($,X,H,Q,K,Y,N,W);else{let M=G[Z++];if((M&128)>0){Z-=9;return}return f($,X,H,Q,K,Y,N,W,M)}else if(_<12){let M=G[Z++],z=G[Z++];if((M&128)>0||(z&128)>0){Z-=10;return}if(_<11)return f($,X,H,Q,K,Y,N,W,M,z);let B=G[Z++];if((B&128)>0){Z-=11;return}return f($,X,H,Q,K,Y,N,W,M,z,B)}else{let M=G[Z++],z=G[Z++],B=G[Z++],w=G[Z++];if((M&128)>0||(z&128)>0||(B&128)>0||(w&128)>0){Z-=12;return}if(_<14)if(_===12)return f($,X,H,Q,K,Y,N,W,M,z,B,w);else{let I=G[Z++];if((I&128)>0){Z-=13;return}return f($,X,H,Q,K,Y,N,W,M,z,B,w,I)}else{let I=G[Z++],v=G[Z++];if((I&128)>0||(v&128)>0){Z-=14;return}if(_<15)return f($,X,H,Q,K,Y,N,W,M,z,B,w,I,v);let p=G[Z++];if((p&128)>0){Z-=15;return}return f($,X,H,Q,K,Y,N,W,M,z,B,w,I,v,p)}}}}}function o8(){let _=G[Z++],$;if(_<192)$=_-160;else switch(_){case 217:$=G[Z++];break;case 218:$=V.getUint16(Z),Z+=2;break;case 219:$=V.getUint32(Z),Z+=4;break;default:throw Error("Expected string")}return J_($)}function o_(_){return j.copyBuffers?Uint8Array.prototype.slice.call(G,Z,Z+=_):G.subarray(Z,Z+=_)}function F_(_){let $=G[Z++];if(l[$]){let X;return l[$](G.subarray(Z,X=Z+=_),(H)=>{Z=H;try{return h()}finally{Z=X}})}else throw Error("Unknown extension type "+$)}var i8=Array(4096);function $$(){let _=G[Z++];if(_>=160&&_<192){if(_=_-160,r>=Z)return Q_.slice(Z-d,(Z+=_)-d);else if(!(r==0&&c<180))return t_(_)}else return Z--,X$(h());let $=(_<<5^(_>1?V.getUint16(Z):_>0?G[Z]:0))&4095,X=i8[$],H=Z,Q=Z+_-3,K,Y=0;if(X&&X.bytes==_){while(H<Q){if(K=V.getUint32(H),K!=X[Y++]){H=1879048192;break}H+=4}Q+=3;while(H<Q)if(K=G[H++],K!=X[Y++]){H=1879048192;break}if(H===Q)return Z=H,X.string;Q-=3,H=Z}X=[],i8[$]=X,X.bytes=_;while(H<Q)K=V.getUint32(H),X.push(K),H+=4;Q+=3;while(H<Q)K=G[H++],X.push(K);let N=_<16?$8(_):_$(_);if(N!=null)return X.string=N;return X.string=t_(_)}function X$(_){if(typeof _==="string")return _;if(typeof _==="number"||typeof _==="boolean"||typeof _==="bigint")return _.toString();if(_==null)return _+"";if(j.allowArraysInMapKeys&&Array.isArray(_)&&_.flat().every(($)=>["string","number","boolean","bigint"].includes(typeof $)))return _.flat().toString();throw Error(`Invalid property type for record: ${typeof _}`)}var a8=(_,$)=>{let X=h().map(X$),H=_;if($!==void 0)_=_<32?-(($<<5)+_):($<<5)+_,X.highByte=$;let Q=E[_];if(Q&&(Q.isShared||K_))(E.restoreStructures||(E.restoreStructures=[]))[_]=Q;return E[_]=X,X.read=_8(X,H),X.read()};l[0]=()=>{};l[0].noBuffer=!0;l[66]=(_)=>{let $=_.byteLength%8||8,X=BigInt(_[0]&128?_[0]-256:_[0]);for(let H=1;H<$;H++)X<<=BigInt(8),X+=BigInt(_[H]);if(_.byteLength!==$){let H=new DataView(_.buffer,_.byteOffset,_.byteLength),Q=(K,Y)=>{let N=Y-K;if(N<=40){let B=H.getBigUint64(K);for(let w=K+8;w<Y;w+=8)B<<=BigInt(64),B|=H.getBigUint64(w);return B}let W=K+(N>>4<<3),M=Q(K,W),z=Q(W,Y);return M<<BigInt((Y-W)*8)|z};X=X<<BigInt((H.byteLength-$)*8)|Q($,H.byteLength)}return X};var r8={Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,AggregateError:typeof AggregateError==="function"?AggregateError:null};l[101]=()=>{let _=h();if(!r8[_[0]]){let $=Error(_[1],{cause:_[2]});return $.name=_[0],$}return r8[_[0]](_[1],{cause:_[2]})};l[105]=(_)=>{if(j.structuredClone===!1)throw Error("Structured clone extension is disabled");let $=V.getUint32(Z-4);if(!$_)$_=new Map;let X=G[Z],H;if(X>=144&&X<160||X==220||X==221)H=[];else if(X>=128&&X<144||X==222||X==223)H=new Map;else if((X>=199&&X<=201||X>=212&&X<=216)&&G[Z+1]===115)H=new Set;else H={};let Q={target:H};$_.set($,Q);let K=h();if(!Q.used)return Q.target=K;else Object.assign(H,K);if(H instanceof Map)for(let[Y,N]of K.entries())H.set(Y,N);if(H instanceof Set)for(let Y of Array.from(K))H.add(Y);return H};l[112]=(_)=>{if(j.structuredClone===!1)throw Error("Structured clone extension is disabled");let $=V.getUint32(Z-4),X=$_.get($);return X.used=!0,X.target};l[115]=()=>new Set(h());var X8=["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64","BigInt64","BigUint64"].map((_)=>_+"Array"),b$=typeof globalThis==="object"?globalThis:window;l[116]=(_)=>{let $=_[0],X=Uint8Array.prototype.slice.call(_,1).buffer,H=X8[$];if(!H){if($===16)return X;if($===17)return new DataView(X);throw Error("Could not find typed array for code "+$)}return new b$[H](X)};l[120]=()=>{let _=h();return new RegExp(_[0],_[1])};var x$=[];l[98]=(_)=>{let $=(_[0]<<24)+(_[1]<<16)+(_[2]<<8)+_[3],X=Z;return Z+=$-_.length,g=x$,g=[o8(),o8()],g.position0=0,g.position1=0,g.postBundlePosition=Z,Z=X,h()};l[255]=(_)=>{if(_.length==4)return new Date((_[0]*16777216+(_[1]<<16)+(_[2]<<8)+_[3])*1000);else if(_.length==8)return new Date(((_[0]<<22)+(_[1]<<14)+(_[2]<<6)+(_[3]>>2))/1e6+((_[3]&3)*4294967296+_[4]*16777216+(_[5]<<16)+(_[6]<<8)+_[7])*1000);else if(_.length==12)return new Date(((_[0]<<24)+(_[1]<<16)+(_[2]<<8)+_[3])/1e6+((_[4]&128?-281474976710656:0)+_[6]*1099511627776+_[7]*4294967296+_[8]*16777216+(_[9]<<16)+(_[10]<<8)+_[11])*1000);else return new Date("invalid")};function H$(_){if(u8)u8();let $=c,X=Z,H=r_,Q=d,K=r,Y=Q_,N=a_,W=$_,M=g,z=new Uint8Array(G.slice(0,c)),B=E,w=E.slice(0,E.length),I=j,v=K_,p=_();return c=$,Z=X,r_=H,d=Q,r=K,Q_=Y,a_=N,$_=W,g=M,G=z,K_=v,E=B,E.splice(0,E.length,...w),j=I,V=new DataView(G.buffer,G.byteOffset,G.byteLength),p}function w_(){G=null,$_=null,E=null}function Q$(_){if(_.unpack)l[_.type]=_.unpack;else l[_.type]=_}var x_=Array(147);for(let _=0;_<256;_++)x_[_]=+("1e"+Math.floor(45.15-_*0.30103));var j_=new t({useRecords:!1}),j$=j_.unpack,y$=j_.unpackMultiple,I$=j_.unpack;var k$=new Float32Array(1),DX=new Uint8Array(k$.buffer,0,4);var I_;try{I_=new TextEncoder}catch(_){}var k_,S_,D_=typeof Buffer<"u",y_=D_?function(_){return Buffer.allocUnsafeSlow(_)}:Uint8Array,D$=D_?Buffer:Uint8Array,K$=D_?4294967296:2144337920,D,R_,y,F=0,u,S=null,S$,v$=21760,h$=/[\u0080-\uFFFF]/,Y_=Symbol("record-id");class O_ extends t{constructor(_){super(_);this.offset=0;let $,X,H,Q,K,Y=D$.prototype.utf8Write?function(O,L){return D.utf8Write(O,L,D.byteLength-L)}:I_&&I_.encodeInto?function(O,L){return I_.encodeInto(O,D.subarray(L)).written}:!1,N=this;if(!_)_={};let W=_&&_.sequential,M=_.structures||_.saveStructures,z=_.maxSharedStructures;if(z==null)z=M?32:0;if(z>8160)throw Error("Maximum maxSharedStructure is 8160");if(_.structuredClone&&_.moreTypes==null)this.moreTypes=!0;let B=_.maxOwnStructures;if(B==null)B=M?32:64;if(!this.structures&&_.useRecords!=!1)this.structures=[];let w=z>32||B+z>64,I=z+64,v=z+B+64;if(v>8256)throw Error("Maximum maxSharedStructure + maxOwnStructure is 8192");let p=[],m=0,e=0;this.pack=this.encode=function(O,L){if(!D)D=new y_(8192),y=D.dataView||(D.dataView=new DataView(D.buffer,0,8192)),F=0;if(u=D.length-10,u-F<2048)D=new y_(D.length),y=D.dataView||(D.dataView=new DataView(D.buffer,0,D.length)),u=D.length-10,F=0;else F=F+7&2147483640;if(X=F,L&J$)F+=L&255;if(K=N.structuredClone?new Map:null,N.bundleStrings&&typeof O!=="string")S=[],S.size=1/0;else S=null;if(Q=N.structures,Q){if(Q.uninitialized)Q=N._mergeStructures(N.getStructures());let q=Q.sharedLength||0;if(q>z)throw Error("Shared structures is larger than maximum shared structures, try increasing maxSharedStructures to "+Q.sharedLength);if(!Q.transitions){Q.transitions=Object.create(null);for(let J=0;J<q;J++){let A=Q[J];if(!A)continue;let U,C=Q.transitions;for(let b=0,x=A.length;b<x;b++){let i=A[b];if(U=C[i],!U)U=C[i]=Object.create(null);C=U}C[Y_]=J+64}this.lastNamedStructuresLength=q}if(!W)Q.nextId=q+64}if(H)H=!1;let R;try{if(N.randomAccessStructure&&O&&typeof O==="object")if(O.constructor===Object)y8(O);else if(O.constructor!==Map&&!Array.isArray(O)&&!S_.some((J)=>O instanceof J))y8(O.toJSON?O.toJSON():O);else k(O);else k(O);let q=S;if(S)F$(X,k,0);if(K&&K.idsToInsert){let J=K.idsToInsert.sort((b,x)=>b.offset>x.offset?1:-1),A=J.length,U=-1;while(q&&A>0){let b=J[--A].offset+X;if(b<q.stringsPosition+X&&U===-1)U=0;if(b>q.position+X){if(U>=0)U+=6}else{if(U>=0)y.setUint32(q.position+X,y.getUint32(q.position+X)+U),U=-1;q=q.previous,A++}}if(U>=0&&q)y.setUint32(q.position+X,y.getUint32(q.position+X)+U);if(F+=J.length*6,F>u)__(F);N.offset=F;let C=m$(D.subarray(X,F),J);return K=null,C}if(N.offset=F,L&N$)return D.start=X,D.end=F,D;return D.subarray(X,F)}catch(q){throw R=q,q}finally{if(Q){if(M_(),H&&N.saveStructures){let q=Q.sharedLength||0,J=D.subarray(X,F),A=f$(Q,N);if(!R){if(N.saveStructures(A,A.isCompatible)===!1)return N.pack(O,L);if(N.lastNamedStructuresLength=q,D.length>1073741824)D=null;return J}}}if(D.length>1073741824)D=null;if(L&q$)F=X}};let M_=()=>{if(e<10)e++;let O=Q.sharedLength||0;if(Q.length>O&&!W)Q.length=O;if(m>1e4){if(Q.transitions=null,e=0,m=0,p.length>0)p=[]}else if(p.length>0&&!W){for(let L=0,R=p.length;L<R;L++)p[L][Y_]=0;p=[]}},d_=(O)=>{var L=O.length;if(L<16)D[F++]=144|L;else if(L<65536)D[F++]=220,D[F++]=L>>8,D[F++]=L&255;else D[F++]=221,y.setUint32(F,L),F+=4;for(let R=0;R<L;R++)k(O[R])},k=(O)=>{if(F>u)D=__(F);var L=typeof O,R;if(L==="string"){let q=O.length;if(S&&q>=4&&q<4096){if((S.size+=q)>v$){let C,b=(S[0]?S[0].length*3+S[1].length:0)+10;if(F+b>u)D=__(F+b);let x;if(S.position)x=S,D[F]=200,F+=3,D[F++]=98,C=F-X,F+=4,F$(X,k,0),y.setUint16(C+X-3,F-X-C);else D[F++]=214,D[F++]=98,C=F-X,F+=4;S=["",""],S.previous=x,S.size=0,S.position=C}let U=h$.test(O);S[U?0:1]+=O,D[F++]=193,k(U?-q:q);return}let J;if(q<32)J=1;else if(q<256)J=2;else if(q<65536)J=3;else J=5;let A=q*3;if(F+A>u)D=__(F+A);if(q<64||!Y){let U,C,b,x=F+J;for(U=0;U<q;U++)if(C=O.charCodeAt(U),C<128)D[x++]=C;else if(C<2048)D[x++]=C>>6|192,D[x++]=C&63|128;else if((C&64512)===55296&&((b=O.charCodeAt(U+1))&64512)===56320)C=65536+((C&1023)<<10)+(b&1023),U++,D[x++]=C>>18|240,D[x++]=C>>12&63|128,D[x++]=C>>6&63|128,D[x++]=C&63|128;else D[x++]=C>>12|224,D[x++]=C>>6&63|128,D[x++]=C&63|128;R=x-F-J}else R=Y(O,F+J);if(R<32)D[F++]=160|R;else if(R<256){if(J<2)D.copyWithin(F+2,F+1,F+1+R);D[F++]=217,D[F++]=R}else if(R<65536){if(J<3)D.copyWithin(F+3,F+2,F+2+R);D[F++]=218,D[F++]=R>>8,D[F++]=R&255}else{if(J<5)D.copyWithin(F+5,F+3,F+3+R);D[F++]=219,y.setUint32(F,R),F+=4}F+=R}else if(L==="number")if(O>>>0===O)if(O<32||O<128&&this.useRecords===!1||O<64&&!this.randomAccessStructure)D[F++]=O;else if(O<256)D[F++]=204,D[F++]=O;else if(O<65536)D[F++]=205,D[F++]=O>>8,D[F++]=O&255;else D[F++]=206,y.setUint32(F,O),F+=4;else if(O>>0===O)if(O>=-32)D[F++]=256+O;else if(O>=-128)D[F++]=208,D[F++]=O+256;else if(O>=-32768)D[F++]=209,y.setInt16(F,O),F+=2;else D[F++]=210,y.setInt32(F,O),F+=4;else{let q;if((q=this.useFloat32)>0&&O<4294967296&&O>=-2147483648){D[F++]=202,y.setFloat32(F,O);let J;if(q<4||(J=O*x_[(D[F]&127)<<1|D[F+1]>>7])>>0===J){F+=4;return}else F--}D[F++]=203,y.setFloat64(F,O),F+=8}else if(L==="object"||L==="function")if(!O)D[F++]=192;else{if(K){let J=K.get(O);if(J){if(!J.id){let A=K.idsToInsert||(K.idsToInsert=[]);J.id=A.push(J)}D[F++]=214,D[F++]=112,y.setUint32(F,J.id),F+=4;return}else K.set(O,{offset:F-X})}let q=O.constructor;if(q===Object)C_(O);else if(q===Array)d_(O);else if(q===Map)if(this.mapAsEmptyObject)D[F++]=128;else{if(R=O.size,R<16)D[F++]=128|R;else if(R<65536)D[F++]=222,D[F++]=R>>8,D[F++]=R&255;else D[F++]=223,y.setUint32(F,R),F+=4;for(let[J,A]of O)k(J),k(A)}else{for(let J=0,A=k_.length;J<A;J++){let U=S_[J];if(O instanceof U){let C=k_[J];if(C.write){if(C.type)D[F++]=212,D[F++]=C.type,D[F++]=0;let q_=C.write.call(this,O);if(q_===O)if(Array.isArray(O))d_(O);else C_(O);else k(q_);return}let b=D,x=y,i=F;D=null;let H_;try{H_=C.pack.call(this,O,(q_)=>{if(D=b,b=null,F+=q_,F>u)__(F);return{target:D,targetView:y,position:F-q_}},k)}finally{if(b)D=b,y=x,F=i,u=D.length-10}if(H_){if(H_.length+F>u)__(H_.length+F);F=Z$(H_,D,F,C.type)}return}}if(Array.isArray(O))d_(O);else{if(O.toJSON){let J=O.toJSON();if(J!==O)return k(J)}if(L==="function")return k(this.writeFunction&&this.writeFunction(O));C_(O)}}}else if(L==="boolean")D[F++]=O?195:194;else if(L==="bigint"){if(O<9223372036854776000&&O>=-9223372036854776000)D[F++]=211,y.setBigInt64(F,O);else if(O<18446744073709552000&&O>0)D[F++]=207,y.setBigUint64(F,O);else if(this.largeBigIntToFloat)D[F++]=203,y.setFloat64(F,Number(O));else if(this.largeBigIntToString)return k(O.toString());else if(this.useBigIntExtension||this.moreTypes){let q=O<0?BigInt(-1):BigInt(0),J;if(O>>BigInt(65536)===q){let A=BigInt(18446744073709552000)-BigInt(1),U=[];while(!0){if(U.push(O&A),O>>BigInt(63)===q)break;O>>=BigInt(64)}J=new Uint8Array(new BigUint64Array(U).buffer),J.reverse()}else{let A=O<0,U=(A?~O:O).toString(16);if(U.length%2)U="0"+U;else if(parseInt(U.charAt(0),16)>=8)U="00"+U;if(D_)J=Buffer.from(U,"hex");else{J=new Uint8Array(U.length/2);for(let C=0;C<J.length;C++)J[C]=parseInt(U.slice(C*2,C*2+2),16)}if(A)for(let C=0;C<J.length;C++)J[C]=~J[C]}if(J.length+F>u)__(J.length+F);F=Z$(J,D,F,66);return}else throw RangeError(O+" was too large to fit in MessagePack 64-bit integer format, use useBigIntExtension, or set largeBigIntToFloat to convert to float-64, or set largeBigIntToString to convert to string");F+=8}else if(L==="undefined")if(this.encodeUndefinedAsNil)D[F++]=192;else D[F++]=212,D[F++]=0,D[F++]=0;else throw Error("Unknown type: "+L)},w8=this.variableMapSize||this.coercibleKeyAsNumber||this.skipValues?(O)=>{let L;if(this.skipValues){L=[];for(let J in O)if((typeof O.hasOwnProperty!=="function"||O.hasOwnProperty(J))&&!this.skipValues.includes(O[J]))L.push(J)}else L=Object.keys(O);let R=L.length;if(R<16)D[F++]=128|R;else if(R<65536)D[F++]=222,D[F++]=R>>8,D[F++]=R&255;else D[F++]=223,y.setUint32(F,R),F+=4;let q;if(this.coercibleKeyAsNumber)for(let J=0;J<R;J++){q=L[J];let A=Number(q);k(isNaN(A)?q:A),k(O[q])}else for(let J=0;J<R;J++)k(q=L[J]),k(O[q])}:(O)=>{D[F++]=222;let L=F-X;F+=2;let R=0;for(let q in O)if(typeof O.hasOwnProperty!=="function"||O.hasOwnProperty(q))k(q),k(O[q]),R++;if(R>65535)throw Error('Object is too large to serialize with fast 16-bit map size, use the "variableMapSize" option to serialize this object');D[L+++X]=R>>8,D[L+X]=R&255},b8=this.useRecords===!1?w8:_.progressiveRecords&&!w?(O)=>{let L,R=Q.transitions||(Q.transitions=Object.create(null)),q=F++-X,J;for(let A in O)if(typeof O.hasOwnProperty!=="function"||O.hasOwnProperty(A)){if(L=R[A],L)R=L;else{let U=Object.keys(O),C=R;R=Q.transitions;let b=0;for(let x=0,i=U.length;x<i;x++){let H_=U[x];if(L=R[H_],!L)L=R[H_]=Object.create(null),b++;R=L}if(q+X+1==F)F--,c_(R,U,b);else j8(R,U,q,b);J=!0,R=C[A]}k(O[A])}if(!J){let A=R[Y_];if(A)D[q+X]=A;else j8(R,Object.keys(O),q,0)}}:(O)=>{let L,R=Q.transitions||(Q.transitions=Object.create(null)),q=0;for(let A in O)if(typeof O.hasOwnProperty!=="function"||O.hasOwnProperty(A)){if(L=R[A],!L)L=R[A]=Object.create(null),q++;R=L}let J=R[Y_];if(J)if(J>=96&&w)D[F++]=((J-=96)&31)+96,D[F++]=J>>5;else D[F++]=J;else c_(R,R.__keys__||Object.keys(O),q);for(let A in O)if(typeof O.hasOwnProperty!=="function"||O.hasOwnProperty(A))k(O[A])},x8=typeof this.useRecords=="function"&&this.useRecords,C_=x8?(O)=>{x8(O)?b8(O):w8(O)}:b8,__=(O)=>{let L;if(O>16777216){if(O-X>K$)throw Error("Packed buffer would be larger than maximum buffer size");L=Math.min(K$,Math.round(Math.max((O-X)*(O>67108864?1.25:2),4194304)/4096)*4096)}else L=(Math.max(O-X<<2,D.length-1)>>12)+1<<12;let R=new y_(L);if(y=R.dataView||(R.dataView=new DataView(R.buffer,0,L)),O=Math.min(O,D.length),D.copy)D.copy(R,0,X,O);else R.set(D.slice(X,O));return F-=X,X=0,u=R.length-10,D=R},c_=(O,L,R)=>{let q=Q.nextId;if(!q)q=64;if(q<I&&this.shouldShareStructure&&!this.shouldShareStructure(L)){if(q=Q.nextOwnId,!(q<v))q=I;Q.nextOwnId=q+1}else{if(q>=v)q=I;Q.nextId=q+1}let J=L.highByte=q>=96&&w?q-96>>5:-1;if(O[Y_]=q,O.__keys__=L,Q[q-64]=L,q<I)if(L.isShared=!0,Q.sharedLength=q-63,H=!0,J>=0)D[F++]=(q&31)+96,D[F++]=J;else D[F++]=q;else{if(J>=0)D[F++]=213,D[F++]=114,D[F++]=(q&31)+96,D[F++]=J;else D[F++]=212,D[F++]=114,D[F++]=q;if(R)m+=e*R;if(p.length>=B)p.shift()[Y_]=0;p.push(O),k(L)}},j8=(O,L,R,q)=>{let J=D,A=F,U=u,C=X;if(D=R_,F=0,X=0,!D)R_=D=new y_(8192);u=D.length-10,c_(O,L,q),R_=D;let b=F;if(D=J,F=A,u=U,X=C,b>1){let x=F+b-1;if(x>u)__(x);let i=R+X;D.copyWithin(i+b,i+1,F),D.set(R_.slice(0,b),i),F=x}else D[R+X]=R_[0]},y8=(O)=>{let L=S$(O,D,X,F,Q,__,(R,q,J)=>{if(J)return H=!0;F=q;let A=D;if(k(R),M_(),A!==D)return{position:F,targetView:y,target:D};return F},this);if(L===0)return C_(O);F=L}}useBuffer(_){D=_,D.dataView||(D.dataView=new DataView(D.buffer,D.byteOffset,D.byteLength)),y=D.dataView,F=0}set position(_){F=_}get position(){return F}clearSharedData(){if(this.structures)this.structures=[];if(this.typedStructs)this.typedStructs=[]}}S_=[Date,Set,Error,RegExp,ArrayBuffer,Object.getPrototypeOf(Uint8Array.prototype).constructor,DataView,b_];k_=[{pack(_,$,X){let H=_.getTime()/1000;if((this.useTimestamp32||_.getMilliseconds()===0)&&H>=0&&H<4294967296){let{target:Q,targetView:K,position:Y}=$(6);Q[Y++]=214,Q[Y++]=255,K.setUint32(Y,H)}else if(H>0&&H<4294967296){let{target:Q,targetView:K,position:Y}=$(10);Q[Y++]=215,Q[Y++]=255,K.setUint32(Y,_.getMilliseconds()*4000000+(H/1000/4294967296>>0)),K.setUint32(Y+4,H)}else if(isNaN(H)){if(this.onInvalidDate)return $(0),X(this.onInvalidDate());let{target:Q,targetView:K,position:Y}=$(3);Q[Y++]=212,Q[Y++]=255,Q[Y++]=255}else{let{target:Q,targetView:K,position:Y}=$(15);Q[Y++]=199,Q[Y++]=12,Q[Y++]=255,K.setUint32(Y,_.getMilliseconds()*1e6),K.setBigInt64(Y+4,BigInt(Math.floor(H)))}}},{pack(_,$,X){if(this.setAsEmptyObject)return $(0),X({});let H=Array.from(_),{target:Q,position:K}=$(this.moreTypes?3:0);if(this.moreTypes)Q[K++]=212,Q[K++]=115,Q[K++]=0;X(H)}},{pack(_,$,X){let{target:H,position:Q}=$(this.moreTypes?3:0);if(this.moreTypes)H[Q++]=212,H[Q++]=101,H[Q++]=0;X([_.name,_.message,_.cause])}},{pack(_,$,X){let{target:H,position:Q}=$(this.moreTypes?3:0);if(this.moreTypes)H[Q++]=212,H[Q++]=120,H[Q++]=0;X([_.source,_.flags])}},{pack(_,$){if(this.moreTypes)H8(_,16,$);else Q8(D_?Buffer.from(_):new Uint8Array(_),$)}},{pack(_,$){let X=_.constructor;if(X!==D$&&this.moreTypes)H8(_,X8.indexOf(X.name),$);else Q8(_,$)}},{pack(_,$){if(this.moreTypes)H8(_,17,$);else Q8(D_?Buffer.from(_):new Uint8Array(_),$)}},{pack(_,$){let{target:X,position:H}=$(1);X[H]=193}}];function H8(_,$,X,H){let Q=_.byteLength;if(Q+1<256){var{target:K,position:Y}=X(4+Q);K[Y++]=199,K[Y++]=Q+1}else if(Q+1<65536){var{target:K,position:Y}=X(5+Q);K[Y++]=200,K[Y++]=Q+1>>8,K[Y++]=Q+1&255}else{var{target:K,position:Y,targetView:N}=X(7+Q);K[Y++]=201,N.setUint32(Y,Q+1),Y+=4}if(K[Y++]=116,K[Y++]=$,!_.buffer)_=new Uint8Array(_);K.set(new Uint8Array(_.buffer,_.byteOffset,_.byteLength),Y)}function Q8(_,$){let X=_.byteLength;var H,Q;if(X<256){var{target:H,position:Q}=$(X+2);H[Q++]=196,H[Q++]=X}else if(X<65536){var{target:H,position:Q}=$(X+3);H[Q++]=197,H[Q++]=X>>8,H[Q++]=X&255}else{var{target:H,position:Q,targetView:K}=$(X+5);H[Q++]=198,K.setUint32(Q,X),Q+=4}H.set(_,Q)}function Z$(_,$,X,H){let Q=_.length;switch(Q){case 1:$[X++]=212;break;case 2:$[X++]=213;break;case 4:$[X++]=214;break;case 8:$[X++]=215;break;case 16:$[X++]=216;break;default:if(Q<256)$[X++]=199,$[X++]=Q;else if(Q<65536)$[X++]=200,$[X++]=Q>>8,$[X++]=Q&255;else $[X++]=201,$[X++]=Q>>24,$[X++]=Q>>16&255,$[X++]=Q>>8&255,$[X++]=Q&255}return $[X++]=H,$.set(_,X),X+=Q,X}function m$(_,$){let X,H=$.length*6,Q=_.length-H;while(X=$.pop()){let{offset:K,id:Y}=X;_.copyWithin(K+H,K,Q),H-=6;let N=K+H;_[N++]=214,_[N++]=105,_[N++]=Y>>24,_[N++]=Y>>16&255,_[N++]=Y>>8&255,_[N++]=Y&255,Q=K}return _}function F$(_,$,X){if(S.length>0){y.setUint32(S.position+_,F+X-S.position-_),S.stringsPosition=F-_;let H=S;S=null,$(H[0]),$(H[1])}}function K8(_){if(_.Class){if(!_.pack&&!_.write)throw Error("Extension has no pack or write function");if(_.pack&&!_.type)throw Error("Extension has no type (numeric code to identify the extension)");S_.unshift(_.Class),k_.unshift(_)}Q$(_)}function f$(_,$){return _.isCompatible=(X)=>{let H=!X||($.lastNamedStructuresLength||0)===X.length;if(!H)$._mergeStructures(X);return H},_}var O$=new O_({useRecords:!1}),g$=O$.pack,p$=O$.pack;var N$=512,q$=1024,J$=2048;var G$=80;class o{capId;constructor(_){this.capId=_}}var l$=new Set(["hello","goaway","call","result","cancel","stream","drop","cap_revoked"]);function Z8(_){if(typeof _!=="object"||_===null)return!1;let $=_,X=$.op;if(typeof X!=="string"||!l$.has(X))return!1;switch(X){case"hello":return $.v===1&&($.mode==="native"||$.mode==="web")&&Array.isArray($.features)&&typeof $.maxBytes==="number"&&typeof $.origin==="string";case"goaway":return $.reason===void 0||typeof $.reason==="string";case"call":return typeof $.id==="number"&&typeof $.method==="string"&&typeof $.target==="object"&&$.target!==null&&$.target.kind==="cap"&&typeof $.target.id==="number";case"result":return typeof $.id==="number"&&($.ok===!0||$.ok===!1);case"cancel":return typeof $.id==="number";case"stream":return typeof $.id==="number"&&typeof $.ev==="string"&&($.ev==="next"||$.ev==="credit"||$.ev==="end"||$.ev==="error");case"drop":return Array.isArray($.caps);case"cap_revoked":if(!Array.isArray($.capIds))return!1;for(let H of $.capIds)if(typeof H!=="number"||!Number.isInteger(H)||H<0||H>4294967295)return!1;return!0}}var R$=!1;function u$(){if(R$)return;R$=!0,K8({Class:o,type:G$,pack:(_)=>d$(_.capId),unpack:(_)=>new o(n$(_))})}function F8(){return u$(),{packr:new O_({useRecords:!0,sequential:!0,moreTypes:!0}),unpackr:new t({useRecords:!0,sequential:!0,moreTypes:!0})}}function d$(_){let $=new Uint8Array(5),X=_>>>0,H=0;while(X>=128)$[H++]=X&127|128,X>>>=7;return $[H++]=X&127,$.subarray(0,H)}var c$=5;function n$(_){let $=0,X=0,H=Math.min(_.length,c$);for(let Q=0;Q<H;Q++){let K=_[Q];if($|=(K&127)<<X,(K&128)===0)return $>>>0;X+=7}throw Error("Truncated or oversize varuint")}var Y8=67108864,D8=1,v_="bunite.",h_="bootstrap";class P extends Error{code;details;retry;constructor(_){super(_.message??_.code);this.name="IpcError",this.code=_.code,this.details=_.details,this.retry=_.retry}toStatus(){return{code:this.code,message:this.message,details:this.details,retry:this.retry}}}var m_=a("bunite.BrowserWindow",{focus:T(),close:T(),setBounds:T(),setTitle:T(),id:T({idempotent:!0}),label:T({idempotent:!0})}),O8=a("bunite.Window",{create:T({returns:s(m_)}),list:T({returns:s.array(m_),idempotent:!0}),focus:T(),close:T()}),f_=a("bunite.FileRef",{text:T({idempotent:!0}),bytes:T({idempotent:!0}),path:T({idempotent:!0}),revoke:T()},{disposal:{method:"revoke"}}),N8=a("bunite.Dialogs",{openFile:T({returns:s.array(f_)}),saveFile:T({returns:s(f_)}),showMessage:T()}),q8=a("bunite.Clipboard",{readText:T({idempotent:!0}),writeText:T(),readBytes:T({idempotent:!0}),writeBytes:T()}),J8=a("bunite.Shell",{openExternal:T(),showItemInFolder:T()}),R8=a("bunite.Surface",{init:T(),resize:T(),remove:T(),setHidden:T(),setMasks:T(),setAllPassthrough:T(),bringAllVisiblesToFront:T(),navigate:T(),goBack:T(),reload:T(),didNavigate:P_()}),G_=a("bunite.Runtime",{window:T({returns:s(O8),idempotent:!0}),dialogs:T({returns:s(N8),idempotent:!0}),clipboard:T({returns:s(q8),idempotent:!0}),shell:T({returns:s(J8),idempotent:!0}),appName:T({idempotent:!0}),appVersion:T({idempotent:!0}),theme:T({idempotent:!0}),themeWatch:P_(),surface:T({returns:s(R8),idempotent:!0})}),X_={Runtime:1,Window:2,Dialogs:3,FileRef:4,Clipboard:5,Shell:6,BrowserWindow:7,Surface:8},s$=new Map([[G_,X_.Runtime],[O8,X_.Window],[N8,X_.Dialogs],[f_,X_.FileRef],[q8,X_.Clipboard],[J8,X_.Shell],[m_,X_.BrowserWindow],[R8,X_.Surface]]);function G8(_){return s$.get(_)}var p_=0,M8=1,L$=0,M$=1,N_=2,C8=128,l_=1024,C$=1024,o$=l_*4,i$=500,a$=32,r$=8,t$=1024;function e$(_){let $=_?.initialBudget;if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<1)return a$;return Math.min($,t$)}var g_=null;class A8{entries=new Map;nextCapId=N_;capLimit;constructor(_=l_){this.capLimit=_}install(_,$){if(this.entries.has(_))throw Error(`cap-id ${_} already installed`);let X={capId:_,...$};return this.entries.set(_,X),X}allocate(_){if(this.entries.size>=this.capLimit)throw new P({code:"resource_exhausted",message:`cap-table limit ${this.capLimit}`,details:{reason:"max_caps_per_connection"}});let $=this.nextCapId++;while(this.entries.has($))$=this.nextCapId++;return this.install($,_)}get(_){return this.entries.get(_)}release(_,$=1){let X=this.entries.get(_);if(!X)return!1;if(X.refCount=Math.max(0,X.refCount-$),X.refCount===0&&_>=N_)return this.entries.delete(_),!0;return!1}delete(_){if(_<N_)return!1;return this.entries.delete(_)}clear(){this.entries.clear(),this.nextCapId=N_}size(){return this.entries.size}values(){return this.entries.values()}}var _X={origin:"",topOrigin:"",partition:"default",isAppRes:!1,isMainFrame:!1,userGesture:!1,level:"untrusted"},A$=Symbol("bunite.rpc.ExportedCap"),W$=Symbol("bunite.rpc.CapProxyMeta");function $X(_){return typeof _==="object"&&_!==null&&_[A$]===!0}var XX=typeof FinalizationRegistry<"u"?new FinalizationRegistry((_)=>{if(_.dropped())return;let $=_.connRef.deref();if(!$||$.closed)return;$._dropFromFinalizer(_.capId)}):{register:()=>{}};class U${transport;capTable;pending=new Map;clientStreams=new Map;serverStreams=new Map;serverCallChildren=new Map;serverActiveCalls=new Map;registry=new Map;rootInstances=new Map;revokedCapIds=new Set;closeHandlers=new Set;observers={};nextCallId=1;remoteHello=null;remoteReady;resolveRemoteReady;rejectRemoteReady;closed_=!1;maxBytes;maxInFlightCalls;mode;origin;features;attestation;peerId;policy;constructor(_){this.transport=_.transport,this.mode=_.mode,this.origin=_.origin,this.features=_.features??[],this.maxBytes=_.maxBytes??Y8,this.maxInFlightCalls=_.maxInFlightCalls??C$,this.attestation=_.attestation??_X,this.peerId=_.peerId??"peer",this.policy=_.policy,this.capTable=new A8(_.capLimit??l_),this.capTable.install(p_,{typeId:L$,cap:null,impl:null,refCount:1}),this.capTable.install(M8,{typeId:M$,cap:G_,impl:_.runtime??null,refCount:1}),this.remoteReady=new Promise(($,X)=>{this.resolveRemoteReady=$,this.rejectRemoteReady=X}),this.remoteReady.catch(()=>{}),this.transport.setReceive(($)=>this.handleFrame($)),this.transport.send({op:"hello",v:D8,mode:this.mode,features:this.features,maxBytes:this.maxBytes,origin:this.origin})}get closed(){return this.closed_}onClose(_){return this.closeHandlers.add(_),()=>this.closeHandlers.delete(_)}on(_,$){let X=this.observers[_];if(!X)X=new Set,this.observers[_]=X;return X.add($),()=>{X.delete($)}}emitObs(_,$){let X=this.observers[_];if(!X||X.size===0)return;for(let H of X)try{H($)}catch{}}markRevoked(_){this.revokedCapIds.add(_);while(this.revokedCapIds.size>o$){let $=this.revokedCapIds.values().next().value;if($===void 0)break;this.revokedCapIds.delete($)}}serve(_,$,X){this.assertNotFrameworkName(_.name);let H=X?.ifExists??"throw";if(this.registry.get(_.name))switch(H){case"throw":throw new P({code:"already_exists",message:`cap "${_.name}" already served`,details:{reason:"name_collision"}});case"skip":return this.makeHandle([]);case"replace":return this.replace(_,$),this.makeHandle([_.name])}return this.registry.set(_.name,{cap:_,impl:$,version:_.version}),this.makeHandle([_.name])}makeHandle(_){let $={names:_,[Symbol.dispose]:()=>this.unserve($)};return $}serveAll(_,$,X){let H=X?.ifExists??"throw";for(let K of Object.keys(_.roots)){let Y=_.roots[K];this.assertNotFrameworkName(Y.name);let N=this.registry.get(Y.name);if(N){if(H==="throw")throw new P({code:"already_exists",message:`cap "${Y.name}" already served`,details:{reason:"name_collision"}});if(H==="replace"&&N.version!==Y.version)throw new P({code:"failed_precondition",message:`version mismatch on replace for "${Y.name}" (current "${N.version}", new "${Y.version}")`,details:{reason:"version_mismatch"}})}}let Q=[];for(let K of Object.keys(_.roots)){let Y=_.roots[K],N=$[K];if(this.serve(Y,N,{ifExists:H}).names.length>0)Q.push(Y.name)}return this.makeHandle(Q)}unserve(_){let $=V_(_)?[_.name]:Array.from(_.names),X=[];for(let H of $){if(!this.registry.delete(H))continue;let Q=this.rootInstances.get(H);if(Q!==void 0){let K=this.capTable.get(Q);if(K)this.invokeServerDisposal(K);this.rootInstances.delete(H),this.capTable.delete(Q),X.push(Q)}}if(X.length>0)this.transport.send({op:"cap_revoked",capIds:X}),this.emitObs("revoke",{capIds:X,reason:"unserve"})}replace(_,$){let X=this.registry.get(_.name);if(!X)throw new P({code:"not_found",message:`cap "${_.name}" not served`});if(X.version!==_.version)throw new P({code:"failed_precondition",message:`version mismatch (current "${X.version}", new "${_.version}")`,details:{reason:"version_mismatch"}});X.impl=$,X.cap=_;let H=this.rootInstances.get(_.name);if(H!==void 0){let Q=this.capTable.get(H);if(Q)Q.impl=$,Q.cap=_}this.emitObs("revoke",{capIds:H!==void 0?[H]:[],reason:"replace"})}assertNotFrameworkName(_){if(_.startsWith(v_))throw new P({code:"already_exists",message:`cap name "${_}" uses reserved prefix "${v_}"`,details:{reason:"reserved_namespace"}})}runtimeProxy=null;runtime(){if(!this.runtimeProxy)this.runtimeProxy=this.makeCapProxy(G_,M8);return this.runtimeProxy}async bootstrap(_){if(V_(_))return this._bootstrapCap(_);if(s_(_))return this._bootstrapSchema(_);throw new P({code:"invalid_argument",message:"bootstrap target must be CapDef or Schema"})}async _bootstrapCap(_){await this.remoteReady;let $={name:_.name};if(_.version!=null)$.version=_.version;let X=await this.sendCallTyped(p_,h_,$,void 0);if(!(X instanceof o))throw new P({code:"invalid_argument",message:"bootstrap did not return a CapRef"});return this.makeCapProxy(_,X.capId)}async _bootstrapSchema(_){let $=Object.keys(_.roots),X=await Promise.allSettled($.map((K)=>this._bootstrapCap(_.roots[K]))),H=X.find((K)=>K.status==="rejected");if(H){for(let K of X)if(K.status==="fulfilled")try{this.releaseRef(K.value)}catch{}throw H.reason}let Q={};for(let K=0;K<$.length;K++)Q[$[K]]=X[K].value;return Q}handleFrame(_){if(this.closed_)return;switch(_.op){case"hello":this.handleHello(_);return;case"call":this.handleCall(_);return;case"result":this.handleResult(_);return;case"cancel":this.handleCancel(_);return;case"stream":this.handleStreamFrame(_);return;case"drop":this.handleDrop(_);return;case"cap_revoked":this.handleCapRevoked(_);return;case"goaway":this.handleGoaway(_);return;default:this.handleUnknownFrame(_);return}}handleUnknownFrame(_){let $=_?.id;if(typeof $==="number"){this.transport.send({op:"result",id:$,ok:!1,error:{code:"invalid_argument",message:"unknown opcode"}});return}this.transport.send({op:"goaway",reason:"invalid_argument",error:{code:"invalid_argument",message:"unknown opcode"}}),this.shutdown("invalid_argument")}handleHello(_){this.remoteHello=_,this.resolveRemoteReady(_)}handleGoaway(_){this.rejectRemoteReady(new P(_.error??{code:"unavailable",message:_.reason??"peer goaway"})),this.shutdown(_.reason??"remote goaway")}handleCapRevoked(_){for(let $ of _.capIds){this.markRevoked($);let X=new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}});for(let[H,Q]of this.pending)if(Q.capId===$){if(this.pending.delete(H),Q.timer)clearTimeout(Q.timer);Q.reject(X)}for(let[H,Q]of this.clientStreams)if(Q.capId===$)this.clientStreams.delete(H),Q.fail(X)}}async handleCall(_){if(_.target.id===p_&&_.method===h_){await this.handleBootstrap(_);return}let $=this.capTable.get(_.target.id);if(!$)return this.emitObs("call",{capId:_.target.id,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`cap-id ${_.target.id} not found`);let X=$.cap;if(!X||!$.impl)return this.emitObs("call",{capId:_.target.id,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found","cap has no impl");let H=X.methods[_.method];if(!H)return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`method "${_.method}" on cap "${X.name}"`);let Q=$.impl[_.method];if(typeof Q!=="function")return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`method "${_.method}" has no handler`);if(this.serverActiveCalls.size+this.serverStreams.size>=this.maxInFlightCalls)return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"resource_exhausted"}),this.sendError(_.id,"resource_exhausted",`in-flight calls limit ${this.maxInFlightCalls}`,{reason:"max_concurrent_calls"});await this.invokeServerMethod(_,X,H,Q)}async handleBootstrap(_){let $=_.args??{},X=$.name;if(typeof X!=="string")return this.emitObs("bootstrap",{name:String(X),attestation:this.attestation,result:"invalid_argument"}),this.sendError(_.id,"invalid_argument","bootstrap requires {name: string}");let H=$.version!=null?String($.version):void 0,Q=this.registry.get(X);if(!Q)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"not_found"}),this.sendError(_.id,"not_found",`cap "${X}" not served`);let K=Q.version;if(K!=null&&H!=null&&K!==H)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"version_mismatch"}),this.sendError(_.id,"failed_precondition",`version mismatch (server "${K}", client "${H}")`,{reason:"version_mismatch"});if(this.policy){let N;try{N=await this.policy(X,this.attestation)}catch(W){return this.emitObs("error",{phase:"policy",error:W instanceof Error?W:Error(String(W))}),this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"internal"}),this.sendError(_.id,"internal","policy threw")}if(typeof N!=="boolean")return this.emitObs("error",{phase:"policy",error:Error(`policy must return boolean (got ${typeof N})`)}),this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"internal"}),this.sendError(_.id,"internal","policy returned non-boolean");if(!N)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"denied"}),this.sendError(_.id,"failed_precondition","policy denied",{reason:"unauthorized"})}let Y=this.rootInstances.get(X);if(Y!==void 0){let N=this.capTable.get(Y);if(N)N.refCount+=1;else this.rootInstances.delete(X),Y=void 0}if(Y===void 0)try{Y=this.capTable.allocate({typeId:G8(Q.cap)??C8,cap:Q.cap,impl:Q.impl,refCount:1}).capId,this.rootInstances.set(X,Y)}catch(N){if(N instanceof P){let W=N.code==="resource_exhausted"?"resource_exhausted":"internal";return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:W}),this.sendError(_.id,N.code,N.message,N.details)}throw N}this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"ok",capId:Y}),this.transport.send({op:"result",id:_.id,ok:!0,value:new o(Y)})}async invokeServerMethod(_,$,X,H){let Q=this.makeCallCtx(_);if(z_(X)){let K=e$(X.hint);try{let Y=()=>H(_.args,Q),N=g_,M=(N?()=>N.run({callId:_.id},Y):Y)();this.runServerStream(_.id,M,Q,K,$,_.method,_.target.id)}catch(Y){this.emitObs("stream",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,event:"error"}),this.transport.send({op:"stream",id:_.id,ev:"error",error:W8(Y)})}return}if(B_(X)){let K=performance.now(),Y=X.idempotent?void 0:this.armServerDeadline(_,Q);this.serverActiveCalls.set(_.id,{ctrl:Q._ctrl,capId:_.target.id,capName:$.name,method:_.method,startedAt:K});let N=HX(X.returns),W=()=>Promise.resolve(H(_.args,Q)),M=g_,z=M?()=>M.run({callId:_.id},W):W;try{let B=await z();if(Y)clearTimeout(Y);if(!this.serverActiveCalls.delete(_.id))return;let w=N(B);this.transport.send({op:"result",id:_.id,ok:!0,value:w}),this.emitObs("call",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,durationMs:performance.now()-K,result:"ok"})}catch(B){if(Y)clearTimeout(Y);if(!this.serverActiveCalls.delete(_.id))return;let w=W8(B);this.sendErrorFromStatus(_.id,w),this.emitObs("call",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,durationMs:performance.now()-K,result:w.code})}return}this.sendError(_.id,"not_found","unknown method kind")}armServerDeadline(_,$){let X=_.meta?.deadlineMs;if(!X)return;return setTimeout(()=>{$._ctrl.abort()},X)}makeCallCtx(_){let $=new AbortController;return{callId:_.id,peerId:this.peerId,attestation:this.attestation,signal:$.signal,deadline:_.meta?.deadlineMs,_ctrl:$,exportCap:(H,Q)=>this.exportCap(H,Q)}}exportCap(_,$){let X=G8(_)??C8,H=this.capTable.allocate({typeId:X,cap:_,impl:$,refCount:1});return{[A$]:!0,cap:_,capId:H.capId,typeId:H.typeId}}runServerStream(_,$,X,H,Q,K,Y){let N=$[Symbol.asyncIterator](),W=X._ctrl,M={iter:N,abort:W,cancelled:!1,credit:H,creditWaker:null,capId:Y,capName:Q.name,method:K,callId:_,count:0};this.serverStreams.set(_,M),this.emitObs("stream",{capId:Y,capName:Q.name,method:K,callId:_,event:"start"});let z=()=>{if(M.credit>0||M.cancelled)return Promise.resolve();return new Promise((w)=>{M.creditWaker=w})};(async()=>{let w=!1;try{while(!M.cancelled){if(M.credit===0)await z();if(M.cancelled)break;let{done:I,value:v}=await N.next();if(I)break;if(M.cancelled)break;M.credit-=1,M.count+=1,this.transport.send({op:"stream",id:_,ev:"next",value:v})}}catch(I){w=!0,this.transport.send({op:"stream",id:_,ev:"error",error:W8(I)}),this.emitObs("stream",{capId:Y,capName:Q.name,method:K,callId:_,event:"error",count:M.count})}finally{if(!w)this.transport.send({op:"stream",id:_,ev:"end"}),this.emitObs("stream",{capId:Y,capName:Q.name,method:K,callId:_,event:M.cancelled?"cancel":"end",count:M.count});this.serverStreams.delete(_)}})()}handleResult(_){let $=this.pending.get(_.id);if($){if(this.pending.delete(_.id),this.serverCallChildren.delete(_.id),$.timer)clearTimeout($.timer);if(_.ok){let H=$.decodeReturn?$.decodeReturn(_.value):_.value;$.resolve(H)}else $.reject(new P(_.error));return}let X=this.clientStreams.get(_.id);if(X){this.clientStreams.delete(_.id);let H=_.ok?new P({code:"invalid_argument",message:"stream method returned result frame"}):new P(_.error);X.fail(H)}}handleCancel(_){let $=this.serverStreams.get(_.id);if($)$.cancelled=!0,$.abort.abort(),$.iter?.return?.(),this.serverStreams.delete(_.id);let X=this.serverActiveCalls.get(_.id);if(X)this.serverActiveCalls.delete(_.id),X.ctrl.abort(),this.transport.send({op:"result",id:_.id,ok:!1,error:{code:"cancelled",message:_.reason}}),this.emitObs("call",{capId:X.capId,capName:X.capName,method:X.method,callId:_.id,durationMs:performance.now()-X.startedAt,result:"cancelled"});for(let[H,Q]of this.serverCallChildren){if(Q.parentId!==_.id)continue;if(this.serverCallChildren.delete(H),this.pending.has(H))this.transport.send({op:"cancel",id:H,reason:_.reason})}}releaseRef(_){if(typeof _!=="object"||_===null)return;let $=_[W$];if(!$||$.dropped)return;$.dropped=!0,this.sendDrop($.capId)}sendDrop(_){if(this.closed_)return;if(_<N_)return;this.transport.send({op:"drop",caps:[{id:_,delta:1}]})}handleStreamFrame(_){if(_.ev==="credit"){let X=this.serverStreams.get(_.id);if(!X)return;X.credit+=_.credit?.messages??0;let H=X.creditWaker;X.creditWaker=null,H?.();return}let $=this.clientStreams.get(_.id);if(!$)return;switch(_.ev){case"next":$.push(_.value);return;case"end":$.end(),this.clientStreams.delete(_.id);return;case"error":$.fail(new P(_.error)),this.clientStreams.delete(_.id);return}}handleDrop(_){for(let{id:$,delta:X}of _.caps)if(this.capTable.release($,X)){for(let[Q,K]of this.rootInstances)if(K===$){this.rootInstances.delete(Q);break}}}sendError(_,$,X,H){let Q={code:$,message:X};if(H!==void 0)Q.details=H;this.transport.send({op:"result",id:_,ok:!1,error:Q})}sendErrorFromStatus(_,$){this.transport.send({op:"result",id:_,ok:!1,error:$})}nextId(){return this.nextCallId++}sendCallTyped(_,$,X,H,Q,K){if(this.closed_)return Promise.reject(new P({code:"unavailable",message:"connection closed"}));if(this.revokedCapIds.has(_))return Promise.reject(new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}}));if(this.pending.size>=this.maxInFlightCalls)return Promise.reject(new P({code:"resource_exhausted",message:`in-flight calls limit ${this.maxInFlightCalls}`,details:{reason:"max_concurrent_calls"}}));let Y=this.nextId();return new Promise((N,W)=>{let M=new AbortController,z={resolve:N,reject:W,abort:M,decodeReturn:H,startedAt:performance.now(),capId:_,method:$,capName:K,kind:"call"};if(Q?.deadlineMs)z.timer=setTimeout(()=>{if(this.pending.delete(Y))this.transport.send({op:"cancel",id:Y,reason:"deadline_exceeded"}),W(new P({code:"deadline_exceeded"}))},Q.deadlineMs+i$);this.pending.set(Y,z);let B=Q;if(B?.parentCallId===void 0&&g_){let w=g_.getStore();if(w)B={...B??{},parentCallId:w.callId}}if(B?.parentCallId!==void 0)this.serverCallChildren.set(Y,{parentId:B.parentCallId});this.transport.send({op:"call",id:Y,target:{kind:"cap",id:_},method:$,args:X,meta:B})})}openClientStream(_,$,X,H,Q){if(this.closed_){let M=L8(_,0,()=>{},()=>{});return M.fail(new P({code:"unavailable",message:"connection closed"})),M.stream}if(this.revokedCapIds.has(_)){let M=L8(_,0,()=>{},()=>{});return M.fail(new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}})),M.stream}let K=this.nextId(),W=L8(_,K,()=>{if(this.clientStreams.delete(K))this.transport.send({op:"cancel",id:K,reason:"client_cancel"})},(M)=>{if(this.closed_||!this.clientStreams.has(K))return;this.transport.send({op:"stream",id:K,ev:"credit",credit:{messages:M}})});return this.clientStreams.set(K,W),this.transport.send({op:"call",id:K,target:{kind:"cap",id:_},method:$,args:X,meta:H}),W.stream}makeCapProxy(_,$){let X={},H={capId:$,dropped:!1};X[W$]=H;let Q=()=>{if(H.dropped)return;H.dropped=!0,this.sendDrop($)};for(let Y of Object.keys(_.methods)){let N=_.methods[Y];if(z_(N))X[Y]=(W)=>this.openClientStream($,Y,W,void 0,_.name);else if(B_(N)){let W=QX(N.returns,(M,z)=>this.makeCapProxy(M,z));X[Y]=(M)=>this.sendCallTyped($,Y,M,W,void 0,_.name)}}let K=_.disposal;if(K){let Y=this;X[Symbol.dispose]=()=>{try{let N=X[K.method]?.();if(N&&typeof N.then==="function")N.catch((W)=>Y.emitObs("error",{phase:"dispose",error:W instanceof Error?W:Error(String(W))}))}catch(N){Y.emitObs("error",{phase:"dispose",error:N instanceof Error?N:Error(String(N))})}Q()}}if(typeof FinalizationRegistry<"u")XX.register(X,{connRef:new WeakRef(this),capId:$,dropped:()=>H.dropped});return X}_dropFromFinalizer(_){try{this.sendDrop(_)}catch{}}shutdown(_="shutdown"){if(this.closed_)return;this.closed_=!0;for(let $ of this.pending.values()){if($.timer)clearTimeout($.timer);$.reject(new P({code:"unavailable",message:_}))}this.pending.clear();for(let $ of this.clientStreams.values())$.fail(new P({code:"unavailable",message:_}));this.clientStreams.clear();for(let $ of this.serverStreams.values())$.cancelled=!0,$.abort.abort(),$.iter?.return?.();this.serverStreams.clear();for(let $ of this.serverActiveCalls.values())$.ctrl.abort();this.serverActiveCalls.clear();for(let $ of this.capTable.values())this.invokeServerDisposal($);if(this.capTable.clear(),!this.remoteHello)this.rejectRemoteReady(new P({code:"unavailable",message:_}));for(let $ of this.closeHandlers)try{$()}catch{}this.closeHandlers.clear();try{this.transport.close()}catch{}}invokeServerDisposal(_){let $=_.cap;if(!$)return;let X=$.disposal;if(!X)return;let H=_.impl,Q=H?.[X.method];if(!Q)return;try{Q.call(H,void 0,void 0)}catch{}}}function HX(_){if(!_)return(X)=>X;let $=(X,H)=>{if(!$X(X))throw new P({code:"failed_precondition",message:"expected ctx.exportCap return for cap method",details:{reason:"unregistered_cap_return"}});if(X.cap!==H)throw new P({code:"failed_precondition",message:"exported cap type mismatch with method returns",details:{reason:"unregistered_cap_return"}});return new o(X.capId)};if(A_(_))return(X)=>$(X,_.cap);if(U_(_))return(X)=>{if(!Array.isArray(X))throw new P({code:"invalid_argument",message:"expected ExportedCap[] for cap.array method"});return X.map((H)=>$(H,_.cap))};if(T_(_))return(X)=>{if(!X||typeof X!=="object")throw new P({code:"invalid_argument",message:"expected Record<string, ExportedCap> for cap.record method"});let H={};for(let Q of Object.keys(X))H[Q]=$(X[Q],_.cap);return H};return(X)=>X}function QX(_,$){if(!_)return;if(A_(_)){let X=_.cap;return(H)=>{if(!(H instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef"});return $(X,H.capId)}}if(U_(_)){let X=_.cap,H=X.disposal;return(Q)=>{if(!Array.isArray(Q))throw new P({code:"invalid_argument",message:"expected array"});let K=Q.map((Y)=>{if(!(Y instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef in array"});return $(X,Y.capId)});return KX(K,H),K}}if(T_(_)){let X=_.cap;return(H)=>{if(!H||typeof H!=="object")throw new P({code:"invalid_argument",message:"expected record"});let Q={};for(let K of Object.keys(H)){let Y=H[K];if(!(Y instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef in record"});Q[K]=$(X,Y.capId)}return Q}}return}function KX(_,$){if(!$)return;_[Symbol.dispose]=()=>{for(let X of _)X[Symbol.dispose]?.call(X)}}function W8(_){if(_ instanceof P)return _.toStatus();if(_ instanceof Error)return{code:"internal",message:_.message};return{code:"internal",message:String(_)}}function L8(_,$,X,H){let Q=[],K=[],Y=!1,N=null,W=!1,M=0;function z(){if(M+=1,M>=r$)H(M),M=0}function B(){if(Q.length>0){let m=Q.shift();return z(),{value:m,done:!1}}if(N)return null;if(Y||W)return{value:void 0,done:!0};return null}function w(){let m=B();if(m)return Promise.resolve(m);if(N)return Promise.reject(N);return new Promise((e,M_)=>K.push({resolve:e,reject:M_}))}function I(){while(K.length>0){let m=K.shift(),e=B();if(e){m.resolve(e);continue}if(N){m.reject(N);continue}K.unshift(m);break}}function v(){if(W||Y||N)return;W=!0,X(),I()}let p={[Symbol.asyncIterator]:()=>({next:w,return:()=>{return v(),Promise.resolve({value:void 0,done:!0})},throw:(m)=>{return v(),Promise.reject(m)}}),[Symbol.dispose]:v,cancel:v};return{capId:_,stream:p,push(m){if(W||Y||N)return;Q.push(m),I()},end(){Y=!0,I()},fail(m){N=m,I()}}}function U8(_){return new U$(_)}function T8(_,$={}){let X=F8(),H;return _.setReceive((Q)=>{let K;try{K=X.unpackr.unpack(Q)}catch(Y){$.onProtocolError?.(`unpack failed: ${Y instanceof Error?Y.message:String(Y)}`),_.close();return}if(!Z8(K)){$.onProtocolError?.("malformed frame"),_.close();return}H?.(K)}),{send(Q){let K=X.packr.pack(Q);_.send(K instanceof Uint8Array?K:new Uint8Array(K))},setReceive(Q){H=Q},close(){_.close()}}}function B8(_){if("binaryType"in _)try{_.binaryType="arraybuffer"}catch{}let $,X=(H)=>{if(!$)return;let Q=H.data;if(Q instanceof Uint8Array){$(Q);return}if(Q instanceof ArrayBuffer){$(new Uint8Array(Q));return}if(typeof Blob<"u"&&Q instanceof Blob){Q.arrayBuffer().then((K)=>$?.(new Uint8Array(K)));return}};return _.addEventListener("message",X),{send(H){_.send(H)},setReceive(H){$=H},close(){_.removeEventListener?.("message",X),_.close?.()}}}function W_(_){let $=new ArrayBuffer(_.byteLength);return new Uint8Array($).set(_),$}async function ZX(_){return crypto.subtle.importKey("raw",W_(_),"AES-GCM",!1,["encrypt","decrypt"])}async function z8(_,$){let X=await ZX($),H,Q=Promise.resolve(),K=Promise.resolve(),Y=!1,N=()=>{if(!Y)Y=!0,_.close()};return _.setReceive((W)=>{if(Y)return;if(W.length<13||W[0]!==1){N();return}let M=W_(W.subarray(1,13)),z=W_(W.subarray(13));K=K.then(async()=>{if(Y)return;try{let B=await crypto.subtle.decrypt({name:"AES-GCM",iv:M},X,z);H?.(new Uint8Array(B))}catch{N()}})}),{send(W){if(Y)return;let M=W_(W);Q=Q.then(async()=>{if(Y)return;try{let z=crypto.getRandomValues(new Uint8Array(12)),B=W_(z),w=await crypto.subtle.encrypt({name:"AES-GCM",iv:B},X,M),I=new Uint8Array(w),v=new Uint8Array(13+I.byteLength);v[0]=1,v.set(z,1),v.set(I,13),_.send(v)}catch{N()}})},setReceive(W){H=W},close(){N()}}}class FX{buffer=[];waiters=[];ctrl=new AbortController;cleanup;ended=!1;failure=null;constructor(_){let $=(X)=>{if(this.ended||this.failure)return;let H=this.waiters.shift();if(H){H.resolve({value:X,done:!1});return}this.buffer.push(X)};try{let X=_($,this.ctrl.signal);if(typeof X==="function")this.cleanup=X}catch(X){this.failure=X}}[Symbol.asyncIterator](){return{next:async()=>{if(this.buffer.length>0)return{value:this.buffer.shift(),done:!1};if(this.failure)throw this.failure;if(this.ended)return{value:void 0,done:!0};return new Promise((_,$)=>this.waiters.push({resolve:_,reject:$}))},return:async()=>{return this.dispose(),{value:void 0,done:!0}}}}cancel(){this.dispose()}[Symbol.dispose](){this.dispose()}dispose(){if(this.ended)return;this.ended=!0,this.ctrl.abort();try{this.cleanup?.()}catch{}while(this.waiters.length>0)this.waiters.shift().resolve({value:void 0,done:!0})}}var P8=null;function V8(){if(!P8)P8=host.runtime().then((_)=>_.surface());return P8}function n(_){return V8().then(_).catch(($)=>{if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] surface call failed",$);return})}class T${element;onBoundsChange;observer=null;rafId=0;lastRect={x:0,y:0,width:0,height:0};dirty=!1;stopped=!1;constructor(_,$){this.element=_,this.onBoundsChange=$}start(){this.observer=new ResizeObserver(()=>this.markDirty()),this.observer.observe(this.element),this.scheduleFrame()}stop(){if(this.stopped=!0,this.observer?.disconnect(),this.observer=null,this.rafId)cancelAnimationFrame(this.rafId),this.rafId=0}markDirty(){this.dirty=!0}scheduleFrame(){if(this.stopped)return;this.rafId=requestAnimationFrame(()=>{this.flush(),this.scheduleFrame()})}flush(){let _=window.devicePixelRatio||1,$=this.element.getBoundingClientRect(),X={x:Math.round($.x*_),y:Math.round($.y*_),width:Math.round($.width*_),height:Math.round($.height*_)};if(!this.dirty&&X.x===this.lastRect.x&&X.y===this.lastRect.y&&X.width===this.lastRect.width&&X.height===this.lastRect.height)return;this.dirty=!1,this.lastRect=X,this.onBoundsChange(X)}}class B$ extends HTMLElement{static observedAttributes=["src"];_surfaceId=null;_syncCtrl=null;_initPromise=null;_aborted=!1;_pendingSrc=null;_syncHidden=!1;_userHidden=!1;_layoutObserver=null;_unsubNavigate=null;constructor(){super()}connectedCallback(){this._aborted=!1,this._syncHidden=!1,this._userHidden=!1;let _=new AbortController;this._unsubNavigate=()=>_.abort(),(async()=>{try{let X=(await V8()).didNavigate();for await(let H of X){if(_.signal.aborted)break;if(H.surfaceId===this._surfaceId)this.dispatchEvent(new CustomEvent("did-navigate",{detail:{url:H.url}}))}}catch($){if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] didNavigate stream failed",$)}})(),this._waitForLayout()}_waitForLayout(){if(this._layoutObserver)return;let _=()=>{if(!this.isConnected||this._aborted)return!0;let $=this.getBoundingClientRect();if($.width>0&&$.height>0){if(this.getAttribute("src")||this._pendingSrc||"")this.initSurface();return!0}return!1};requestAnimationFrame(()=>{if(_())return;this._layoutObserver=new ResizeObserver(()=>{if(_())this._layoutObserver?.disconnect(),this._layoutObserver=null}),this._layoutObserver.observe(this)})}disconnectedCallback(){if(this._aborted=!0,this._unsubNavigate?.(),this._unsubNavigate=null,this._layoutObserver?.disconnect(),this._layoutObserver=null,this._syncCtrl?.stop(),this._syncCtrl=null,this._surfaceId!=null){let _=this._surfaceId;this._surfaceId=null,n(($)=>$.remove({surfaceId:_}))}else if(this._initPromise)this._initPromise.then((_)=>{n(($)=>$.remove({surfaceId:_.surfaceId}))}).catch(()=>{});this._initPromise=null}attributeChangedCallback(_,$,X){if(_!=="src")return;if(this._surfaceId!=null){let H=this._surfaceId;n((Q)=>Q.navigate({surfaceId:H,url:X||""}))}else if(this._initPromise)this._pendingSrc=X||"";else if(this.isConnected&&!this._aborted&&X)this._waitForLayout()}setHidden(_){this._userHidden=_,this._applySurfaceHidden()}goBack(){let _=this._surfaceId;if(_!=null)n(($)=>$.goBack({surfaceId:_}))}reload(){let _=this._surfaceId;if(_!=null)n(($)=>$.reload({surfaceId:_}))}navigate(_){this.setAttribute("src",_)}_applySurfaceHidden(){let _=this._surfaceId;if(_==null)return;let $=this._userHidden||this._syncHidden;n((X)=>X.setHidden({surfaceId:_,hidden:$}))}initSurface(){if(this._surfaceId!=null||this._initPromise!=null)return;let _=window.devicePixelRatio||1,$=this.getBoundingClientRect(),X=this._pendingSrc||this.getAttribute("src")||"";this._pendingSrc=null;let H=V8().then((Q)=>Q.init({src:X,x:Math.round($.x*_),y:Math.round($.y*_),width:Math.round($.width*_),height:Math.round($.height*_),hidden:this._userHidden}));this._initPromise=H,H.then((Q)=>{if(this._initPromise!==H)return;if(this._aborted){n((K)=>K.remove({surfaceId:Q.surfaceId}));return}if(this._surfaceId=Q.surfaceId,this._userHidden)this._applySurfaceHidden();if(this._pendingSrc!=null){let K=this._pendingSrc;this._pendingSrc=null;let Y=this._surfaceId;if(Y!=null)n((N)=>N.navigate({surfaceId:Y,url:K}))}this._syncCtrl=new T$(this,(K)=>{let Y=this._surfaceId;if(Y==null)return;if(K.width===0&&K.height===0){if(!this._syncHidden)this._syncHidden=!0,this._applySurfaceHidden();return}if(this._syncHidden)this._syncHidden=!1,this._applySurfaceHidden();n((W)=>W.resize({surfaceId:Y,x:K.x,y:K.y,w:K.width,h:K.height}))}),this._syncCtrl.start()}).catch(()=>{}).finally(()=>{if(this._initPromise===H)this._initPromise=null})}}if(typeof customElements<"u"){customElements.define("bunite-webview",B$);let _=()=>{n(($)=>$.bringAllVisiblesToFront())};document.addEventListener("pointerdown",_,!0),document.addEventListener("dragstart",()=>{n(($)=>$.setAllPassthrough({passthrough:!0}))},!0),document.addEventListener("dragend",()=>{n(($)=>$.setAllPassthrough({passthrough:!1})),_()},!0)}var E8=null,L_=null;function u_(){if(E8)return Promise.resolve(E8);if(L_)return L_;let _=(async()=>{let $=new WebSocket(`ws://localhost:${__buniteRpcSocketPort}/rpc?webviewId=${__buniteWebviewId}`);$.binaryType="arraybuffer",await new Promise((K,Y)=>{$.addEventListener("open",()=>K(),{once:!0}),$.addEventListener("error",()=>Y(Error("bunite preload ws connect failed")),{once:!0})});let X=Uint8Array.from(atob(__buniteSecretKeyBase64),(K)=>K.charCodeAt(0)),H=await z8(B8($),X),Q=U8({transport:T8(H),mode:"native",origin:location.origin});return E8=Q,Q})();return L_=_,_.catch(()=>{if(L_===_)L_=null}),_}var Z_=window;Z_.__bunite??={};Z_.__buniteWebviewId=__buniteWebviewId;Z_.__buniteRpcSocketPort=__buniteRpcSocketPort;Z_.host??={};Z_.host.bootstrap=async(_)=>{return(await u_()).bootstrap(_)};Z_.host.runtime=async()=>(await u_()).runtime();Z_.host.releaseRef=async(_)=>{(await u_()).releaseRef(_)};Z_.host.getConnection=()=>u_();
1
+ var k_=Symbol.for("bunite.rpc.CallDef"),y_=Symbol.for("bunite.rpc.StreamDef"),S_=Symbol.for("bunite.rpc.CapDef"),v_=Symbol.for("bunite.rpc.CapRefToken"),h_=Symbol.for("bunite.rpc.CapArrayToken"),m_=Symbol.for("bunite.rpc.CapRecordToken"),P$=Symbol.for("bunite.rpc.Schema");function s8(_){return{[v_]:!0,cap:_}}s8.array=(_)=>({[h_]:!0,cap:_});s8.record=(_)=>({[m_]:!0,cap:_});var s=s8;function B8(_){return typeof _==="object"&&_!==null&&_[v_]===!0}function T8(_){return typeof _==="object"&&_!==null&&_[h_]===!0}function V8(_){return typeof _==="object"&&_!==null&&_[m_]===!0}function P8(_){return typeof _==="object"&&_!==null&&_[k_]===!0}function C8(_){return typeof _==="object"&&_!==null&&_[y_]===!0}function B(_){return{[k_]:!0,idempotent:!!_?.idempotent,returns:_?.returns}}function O8(_){return{[y_]:!0,hint:_?.hint}}function a(_,$,X){return{[S_]:!0,name:_,version:X?.version!=null?String(X.version):void 0,methods:$,disposal:X?.disposal??void 0}}function E8(_){return typeof _==="object"&&_!==null&&_[S_]===!0}function o8(_){return typeof _==="object"&&_!==null&&_[P$]===!0}var a8;try{a8=new TextDecoder}catch(_){}var D,c,q=0;var t_=[],r8=t_,t8=0,b={},E,Q8,d=0,r=0,g,$8,l=[],C,f_={useRecords:!1,mapsAsObjects:!0};class x8{}var __=new x8;__.name="MessagePack 0xC1";var Z8=!1,g_=2,p_,l_,u_;class t{constructor(_){if(_){if(_.useRecords===!1&&_.mapsAsObjects===void 0)_.mapsAsObjects=!0;if(_.sequential&&_.trusted!==!1){if(_.trusted=!0,!_.structures&&_.useRecords!=!1){if(_.structures=[],!_.maxSharedStructures)_.maxSharedStructures=0}}if(_.structures)_.structures.sharedLength=_.structures.length;else if(_.getStructures)(_.structures=[]).uninitialized=!0,_.structures.sharedLength=0;if(_.int64AsNumber)_.int64AsType="number"}Object.assign(this,_)}unpack(_,$){if(D)return H$(()=>{return j8(),this?this.unpack(_,$):t.prototype.unpack.call(f_,_,$)});if(!_.buffer&&_.constructor===ArrayBuffer)_=typeof Buffer<"u"?Buffer.from(_):new Uint8Array(_);if(typeof $==="object")c=$.end||_.length,q=$.start||0;else q=0,c=$>-1?$:_.length;t8=0,r=0,Q8=null,r8=t_,g=null,D=_;try{C=_.dataView||(_.dataView=new DataView(_.buffer,_.byteOffset,_.byteLength))}catch(X){if(D=null,_ instanceof Uint8Array)throw X;throw Error("Source must be a Uint8Array or Buffer but was a "+(_&&typeof _=="object"?_.constructor.name:typeof _))}if(this instanceof t){if(b=this,this.structures)return E=this.structures,w8($);else if(!E||E.length>0)E=[]}else if(b=f_,!E||E.length>0)E=[];return w8($)}unpackMultiple(_,$){let X,H=0;try{Z8=!0;let Q=_.length,Z=this?this.unpack(_,Q):I8.unpack(_,Q);if($){if($(Z,H,q)===!1)return;while(q<Q)if(H=q,$(w8(),H,q)===!1)return}else{X=[Z];while(q<Q)H=q,X.push(w8());return X}}catch(Q){throw Q.lastPosition=H,Q.values=X,Q}finally{Z8=!1,j8()}}_mergeStructures(_,$){if(l_)_=l_.call(this,_);if(_=_||[],Object.isFrozen(_))_=_.map((X)=>X.slice(0));for(let X=0,H=_.length;X<H;X++){let Q=_[X];if(Q){if(Q.isShared=!0,X>=32)Q.highByte=X-32>>5}}_.sharedLength=_.length;for(let X in $||[])if(X>=0){let H=_[X],Q=$[X];if(Q){if(H)(_.restoreStructures||(_.restoreStructures=[]))[X]=H;_[X]=Q}}return this.structures=_}decode(_,$){return this.unpack(_,$)}}function w8(_){try{if(!b.trusted&&!Z8){let X=E.sharedLength||0;if(X<E.length)E.length=X}let $;if(b.randomAccessStructure&&D[q]<64&&D[q]>=32&&p_){if($=p_(D,q,c,b),D=null,!(_&&_.lazy)&&$)$=$.toJSON();q=c}else $=h();if(g)q=g.postBundlePosition,g=null;if(Z8)E.restoreStructures=null;if(q==c){if(E&&E.restoreStructures)d_();if(E=null,D=null,$8)$8=null}else if(q>c)throw Error("Unexpected end of MessagePack data");else if(!Z8){let X;try{X=JSON.stringify($,(H,Q)=>typeof Q==="bigint"?`${Q}n`:Q).slice(0,100)}catch(H){X="(JSON view not available "+H+")"}throw Error("Data read, but end of buffer not reached "+X)}return $}catch($){if(E&&E.restoreStructures)d_();if(j8(),$ instanceof RangeError||$.message.startsWith("Unexpected end of buffer")||q>c)$.incomplete=!0;throw $}}function d_(){for(let _ in E.restoreStructures)E[_]=E.restoreStructures[_];E.restoreStructures=null}function h(){let _=D[q++];if(_<160)if(_<128)if(_<64)return _;else{let $=E[_&63]||b.getStructures&&e_()[_&63];if($){if(!$.read)$.read=$_($,_&63);return $.read()}else return _}else if(_<144)if(_-=128,b.mapsAsObjects){let $={};for(let X=0;X<_;X++){let H=$$();if(H==="__proto__")H="__proto_";$[H]=h()}return $}else{let $=new Map;for(let X=0;X<_;X++)$.set(h(),h());return $}else{_-=144;let $=Array(_);for(let X=0;X<_;X++)$[X]=h();if(b.freezeData)return Object.freeze($);return $}else if(_<192){let $=_-160;if(r>=q)return Q8.slice(q-d,(q+=$)-d);if(r==0&&c<140){let X=$<16?X_($):_$($);if(X!=null)return X}return e8($)}else{let $;switch(_){case 192:return null;case 193:if(g)if($=h(),$>0)return g[1].slice(g.position1,g.position1+=$);else return g[0].slice(g.position0,g.position0-=$);return __;case 194:return!1;case 195:return!0;case 196:if($=D[q++],$===void 0)throw Error("Unexpected end of buffer");return i8($);case 197:return $=C.getUint16(q),q+=2,i8($);case 198:return $=C.getUint32(q),q+=4,i8($);case 199:return K8(D[q++]);case 200:return $=C.getUint16(q),q+=2,K8($);case 201:return $=C.getUint32(q),q+=4,K8($);case 202:if($=C.getFloat32(q),b.useFloat32>2){let X=b8[(D[q]&127)<<1|D[q+1]>>7];return q+=4,(X*$+($>0?0.5:-0.5)>>0)/X}return q+=4,$;case 203:return $=C.getFloat64(q),q+=8,$;case 204:return D[q++];case 205:return $=C.getUint16(q),q+=2,$;case 206:return $=C.getUint32(q),q+=4,$;case 207:if(b.int64AsType==="number")$=C.getUint32(q)*4294967296,$+=C.getUint32(q+4);else if(b.int64AsType==="string")$=C.getBigUint64(q).toString();else if(b.int64AsType==="auto"){if($=C.getBigUint64(q),$<=BigInt(2)<<BigInt(52))$=Number($)}else $=C.getBigUint64(q);return q+=8,$;case 208:return C.getInt8(q++);case 209:return $=C.getInt16(q),q+=2,$;case 210:return $=C.getInt32(q),q+=4,$;case 211:if(b.int64AsType==="number")$=C.getInt32(q)*4294967296,$+=C.getUint32(q+4);else if(b.int64AsType==="string")$=C.getBigInt64(q).toString();else if(b.int64AsType==="auto"){if($=C.getBigInt64(q),$>=BigInt(-2)<<BigInt(52)&&$<=BigInt(2)<<BigInt(52))$=Number($)}else $=C.getBigInt64(q);return q+=8,$;case 212:if($=D[q++],$==114)return a_(D[q++]&63);else{let X=l[$];if(X)if(X.read)return q++,X.read(h());else if(X.noBuffer)return q++,X();else return X(D.subarray(q,++q));else throw Error("Unknown extension "+$)}case 213:if($=D[q],$==114)return q++,a_(D[q++]&63,D[q++]);else return K8(2);case 214:return K8(4);case 215:return K8(8);case 216:return K8(16);case 217:if($=D[q++],r>=q)return Q8.slice(q-d,(q+=$)-d);return E$($);case 218:if($=C.getUint16(q),q+=2,r>=q)return Q8.slice(q-d,(q+=$)-d);return w$($);case 219:if($=C.getUint32(q),q+=4,r>=q)return Q8.slice(q-d,(q+=$)-d);return j$($);case 220:return $=C.getUint16(q),q+=2,n_($);case 221:return $=C.getUint32(q),q+=4,n_($);case 222:return $=C.getUint16(q),q+=2,s_($);case 223:return $=C.getUint32(q),q+=4,s_($);default:if(_>=224)return _-256;if(_===void 0){let X=Error("Unexpected end of MessagePack data");throw X.incomplete=!0,X}throw Error("Unknown MessagePack token "+_)}}}var C$=/^[a-zA-Z_$][a-zA-Z\d_$]*$/;function $_(_,$){function X(){if(X.count++>g_){let Q;try{Q=_.read=Function("r","return function(){return "+(b.freezeData?"Object.freeze":"")+"({"+_.map((Z)=>Z==="__proto__"?"__proto_:r()":C$.test(Z)?Z+":r()":"["+JSON.stringify(Z)+"]:r()").join(",")+"})}")(h)}catch(Z){return g_=1/0,X()}if(_.highByte===0)_.read=c_($,_.read);return Q()}let H={};for(let Q=0,Z=_.length;Q<Z;Q++){let J=_[Q];if(J==="__proto__")J="__proto_";H[J]=h()}if(b.freezeData)return Object.freeze(H);return H}if(X.count=0,_.highByte===0)return c_($,X);return X}var c_=(_,$)=>{return function(){let X=D[q++];if(X===0)return $();let H=_<32?-(_+(X<<5)):_+(X<<5),Q=E[H]||e_()[H];if(!Q)throw Error("Record id is not defined for "+H);if(!Q.read)Q.read=$_(Q,_);return Q.read()}};function e_(){let _=H$(()=>{return D=null,b.getStructures()});return E=b._mergeStructures(_,E)}var e8=F8,E$=F8,w$=F8,j$=F8;function F8(_){let $;if(_<16){if($=X_(_))return $}if(_>64&&a8)return a8.decode(D.subarray(q,q+=_));let X=q+_,H=[];$="";while(q<X){let Q=D[q++];if((Q&128)===0)H.push(Q);else if((Q&224)===192){let Z=D[q++]&63,J=(Q&31)<<6|Z;if(J<128)H.push(65533);else H.push(J)}else if((Q&240)===224){let Z=D[q++]&63,J=D[q++]&63,Y=(Q&31)<<12|Z<<6|J;if(Y<2048||Y>=55296&&Y<=57343)H.push(65533);else H.push(Y)}else if((Q&248)===240){let Z=D[q++]&63,J=D[q++]&63,Y=D[q++]&63,U=(Q&7)<<18|Z<<12|J<<6|Y;if(U<65536||U>1114111)H.push(65533);else if(U>65535)U-=65536,H.push(U>>>10&1023|55296),U=56320|U&1023,H.push(U);else H.push(U)}else H.push(65533);if(H.length>=4096)$+=f.apply(String,H),H.length=0}if(H.length>0)$+=f.apply(String,H);return $}function n_(_){let $=Array(_);for(let X=0;X<_;X++)$[X]=h();if(b.freezeData)return Object.freeze($);return $}function s_(_){if(b.mapsAsObjects){let $={};for(let X=0;X<_;X++){let H=$$();if(H==="__proto__")H="__proto_";$[H]=h()}return $}else{let $=new Map;for(let X=0;X<_;X++)$.set(h(),h());return $}}var f=String.fromCharCode;function _$(_){let $=q,X=Array(_);for(let H=0;H<_;H++){let Q=D[q++];if((Q&128)>0){q=$;return}X[H]=Q}return f.apply(String,X)}function X_(_){if(_<4)if(_<2)if(_===0)return"";else{let $=D[q++];if(($&128)>1){q-=1;return}return f($)}else{let $=D[q++],X=D[q++];if(($&128)>0||(X&128)>0){q-=2;return}if(_<3)return f($,X);let H=D[q++];if((H&128)>0){q-=3;return}return f($,X,H)}else{let $=D[q++],X=D[q++],H=D[q++],Q=D[q++];if(($&128)>0||(X&128)>0||(H&128)>0||(Q&128)>0){q-=4;return}if(_<6)if(_===4)return f($,X,H,Q);else{let Z=D[q++];if((Z&128)>0){q-=5;return}return f($,X,H,Q,Z)}else if(_<8){let Z=D[q++],J=D[q++];if((Z&128)>0||(J&128)>0){q-=6;return}if(_<7)return f($,X,H,Q,Z,J);let Y=D[q++];if((Y&128)>0){q-=7;return}return f($,X,H,Q,Z,J,Y)}else{let Z=D[q++],J=D[q++],Y=D[q++],U=D[q++];if((Z&128)>0||(J&128)>0||(Y&128)>0||(U&128)>0){q-=8;return}if(_<10)if(_===8)return f($,X,H,Q,Z,J,Y,U);else{let W=D[q++];if((W&128)>0){q-=9;return}return f($,X,H,Q,Z,J,Y,U,W)}else if(_<12){let W=D[q++],V=D[q++];if((W&128)>0||(V&128)>0){q-=10;return}if(_<11)return f($,X,H,Q,Z,J,Y,U,W,V);let T=D[q++];if((T&128)>0){q-=11;return}return f($,X,H,Q,Z,J,Y,U,W,V,T)}else{let W=D[q++],V=D[q++],T=D[q++],w=D[q++];if((W&128)>0||(V&128)>0||(T&128)>0||(w&128)>0){q-=12;return}if(_<14)if(_===12)return f($,X,H,Q,Z,J,Y,U,W,V,T,w);else{let k=D[q++];if((k&128)>0){q-=13;return}return f($,X,H,Q,Z,J,Y,U,W,V,T,w,k)}else{let k=D[q++],v=D[q++];if((k&128)>0||(v&128)>0){q-=14;return}if(_<15)return f($,X,H,Q,Z,J,Y,U,W,V,T,w,k,v);let p=D[q++];if((p&128)>0){q-=15;return}return f($,X,H,Q,Z,J,Y,U,W,V,T,w,k,v,p)}}}}}function o_(){let _=D[q++],$;if(_<192)$=_-160;else switch(_){case 217:$=D[q++];break;case 218:$=C.getUint16(q),q+=2;break;case 219:$=C.getUint32(q),q+=4;break;default:throw Error("Expected string")}return F8($)}function i8(_){return b.copyBuffers?Uint8Array.prototype.slice.call(D,q,q+=_):D.subarray(q,q+=_)}function K8(_){let $=D[q++];if(l[$]){let X;return l[$](D.subarray(q,X=q+=_),(H)=>{q=H;try{return h()}finally{q=X}})}else throw Error("Unknown extension type "+$)}var i_=Array(4096);function $$(){let _=D[q++];if(_>=160&&_<192){if(_=_-160,r>=q)return Q8.slice(q-d,(q+=_)-d);else if(!(r==0&&c<180))return e8(_)}else return q--,X$(h());let $=(_<<5^(_>1?C.getUint16(q):_>0?D[q]:0))&4095,X=i_[$],H=q,Q=q+_-3,Z,J=0;if(X&&X.bytes==_){while(H<Q){if(Z=C.getUint32(H),Z!=X[J++]){H=1879048192;break}H+=4}Q+=3;while(H<Q)if(Z=D[H++],Z!=X[J++]){H=1879048192;break}if(H===Q)return q=H,X.string;Q-=3,H=q}X=[],i_[$]=X,X.bytes=_;while(H<Q)Z=C.getUint32(H),X.push(Z),H+=4;Q+=3;while(H<Q)Z=D[H++],X.push(Z);let Y=_<16?X_(_):_$(_);if(Y!=null)return X.string=Y;return X.string=e8(_)}function X$(_){if(typeof _==="string")return _;if(typeof _==="number"||typeof _==="boolean"||typeof _==="bigint")return _.toString();if(_==null)return _+"";if(b.allowArraysInMapKeys&&Array.isArray(_)&&_.flat().every(($)=>["string","number","boolean","bigint"].includes(typeof $)))return _.flat().toString();throw Error(`Invalid property type for record: ${typeof _}`)}var a_=(_,$)=>{let X=h().map(X$),H=_;if($!==void 0)_=_<32?-(($<<5)+_):($<<5)+_,X.highByte=$;let Q=E[_];if(Q&&(Q.isShared||Z8))(E.restoreStructures||(E.restoreStructures=[]))[_]=Q;return E[_]=X,X.read=$_(X,H),X.read()};l[0]=()=>{};l[0].noBuffer=!0;l[66]=(_)=>{let $=_.byteLength%8||8,X=BigInt(_[0]&128?_[0]-256:_[0]);for(let H=1;H<$;H++)X<<=BigInt(8),X+=BigInt(_[H]);if(_.byteLength!==$){let H=new DataView(_.buffer,_.byteOffset,_.byteLength),Q=(Z,J)=>{let Y=J-Z;if(Y<=40){let T=H.getBigUint64(Z);for(let w=Z+8;w<J;w+=8)T<<=BigInt(64),T|=H.getBigUint64(w);return T}let U=Z+(Y>>4<<3),W=Q(Z,U),V=Q(U,J);return W<<BigInt((J-U)*8)|V};X=X<<BigInt((H.byteLength-$)*8)|Q($,H.byteLength)}return X};var r_={Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,AggregateError:typeof AggregateError==="function"?AggregateError:null};l[101]=()=>{let _=h();if(!r_[_[0]]){let $=Error(_[1],{cause:_[2]});return $.name=_[0],$}return r_[_[0]](_[1],{cause:_[2]})};l[105]=(_)=>{if(b.structuredClone===!1)throw Error("Structured clone extension is disabled");let $=C.getUint32(q-4);if(!$8)$8=new Map;let X=D[q],H;if(X>=144&&X<160||X==220||X==221)H=[];else if(X>=128&&X<144||X==222||X==223)H=new Map;else if((X>=199&&X<=201||X>=212&&X<=216)&&D[q+1]===115)H=new Set;else H={};let Q={target:H};$8.set($,Q);let Z=h();if(!Q.used)return Q.target=Z;else Object.assign(H,Z);if(H instanceof Map)for(let[J,Y]of Z.entries())H.set(J,Y);if(H instanceof Set)for(let J of Array.from(Z))H.add(J);return H};l[112]=(_)=>{if(b.structuredClone===!1)throw Error("Structured clone extension is disabled");let $=C.getUint32(q-4),X=$8.get($);return X.used=!0,X.target};l[115]=()=>new Set(h());var H_=["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64","BigInt64","BigUint64"].map((_)=>_+"Array"),x$=typeof globalThis==="object"?globalThis:window;l[116]=(_)=>{let $=_[0],X=Uint8Array.prototype.slice.call(_,1).buffer,H=H_[$];if(!H){if($===16)return X;if($===17)return new DataView(X);throw Error("Could not find typed array for code "+$)}return new x$[H](X)};l[120]=()=>{let _=h();return new RegExp(_[0],_[1])};var b$=[];l[98]=(_)=>{let $=(_[0]<<24)+(_[1]<<16)+(_[2]<<8)+_[3],X=q;return q+=$-_.length,g=b$,g=[o_(),o_()],g.position0=0,g.position1=0,g.postBundlePosition=q,q=X,h()};l[255]=(_)=>{if(_.length==4)return new Date((_[0]*16777216+(_[1]<<16)+(_[2]<<8)+_[3])*1000);else if(_.length==8)return new Date(((_[0]<<22)+(_[1]<<14)+(_[2]<<6)+(_[3]>>2))/1e6+((_[3]&3)*4294967296+_[4]*16777216+(_[5]<<16)+(_[6]<<8)+_[7])*1000);else if(_.length==12)return new Date(((_[0]<<24)+(_[1]<<16)+(_[2]<<8)+_[3])/1e6+((_[4]&128?-281474976710656:0)+_[6]*1099511627776+_[7]*4294967296+_[8]*16777216+(_[9]<<16)+(_[10]<<8)+_[11])*1000);else return new Date("invalid")};function H$(_){if(u_)u_();let $=c,X=q,H=t8,Q=d,Z=r,J=Q8,Y=r8,U=$8,W=g,V=new Uint8Array(D.slice(0,c)),T=E,w=E.slice(0,E.length),k=b,v=Z8,p=_();return c=$,q=X,t8=H,d=Q,r=Z,Q8=J,r8=Y,$8=U,g=W,D=V,Z8=v,E=T,E.splice(0,E.length,...w),b=k,C=new DataView(D.buffer,D.byteOffset,D.byteLength),p}function j8(){D=null,$8=null,E=null}function Q$(_){if(_.unpack)l[_.type]=_.unpack;else l[_.type]=_}var b8=Array(147);for(let _=0;_<256;_++)b8[_]=+("1e"+Math.floor(45.15-_*0.30103));var I8=new t({useRecords:!1}),I$=I8.unpack,k$=I8.unpackMultiple,y$=I8.unpack;var S$=new Float32Array(1),GX=new Uint8Array(S$.buffer,0,4);var y8;try{y8=new TextEncoder}catch(_){}var S8,v8,N8=typeof Buffer<"u",k8=N8?function(_){return Buffer.allocUnsafeSlow(_)}:Uint8Array,N$=N8?Buffer:Uint8Array,Z$=N8?4294967296:2144337920,N,D8,I,K=0,u,S=null,v$,h$=21760,m$=/[\u0080-\uFFFF]/,J8=Symbol("record-id");class G8 extends t{constructor(_){super(_);this.offset=0;let $,X,H,Q,Z,J=N$.prototype.utf8Write?function(G,M){return N.utf8Write(G,M,N.byteLength-M)}:y8&&y8.encodeInto?function(G,M){return y8.encodeInto(G,N.subarray(M)).written}:!1,Y=this;if(!_)_={};let U=_&&_.sequential,W=_.structures||_.saveStructures,V=_.maxSharedStructures;if(V==null)V=W?32:0;if(V>8160)throw Error("Maximum maxSharedStructure is 8160");if(_.structuredClone&&_.moreTypes==null)this.moreTypes=!0;let T=_.maxOwnStructures;if(T==null)T=W?32:64;if(!this.structures&&_.useRecords!=!1)this.structures=[];let w=V>32||T+V>64,k=V+64,v=V+T+64;if(v>8256)throw Error("Maximum maxSharedStructure + maxOwnStructure is 8192");let p=[],m=0,e=0;this.pack=this.encode=function(G,M){if(!N)N=new k8(8192),I=N.dataView||(N.dataView=new DataView(N.buffer,0,8192)),K=0;if(u=N.length-10,u-K<2048)N=new k8(N.length),I=N.dataView||(N.dataView=new DataView(N.buffer,0,N.length)),u=N.length-10,K=0;else K=K+7&2147483640;if(X=K,M&O$)K+=M&255;if(Z=Y.structuredClone?new Map:null,Y.bundleStrings&&typeof G!=="string")S=[],S.size=1/0;else S=null;if(Q=Y.structures,Q){if(Q.uninitialized)Q=Y._mergeStructures(Y.getStructures());let L=Q.sharedLength||0;if(L>V)throw Error("Shared structures is larger than maximum shared structures, try increasing maxSharedStructures to "+Q.sharedLength);if(!Q.transitions){Q.transitions=Object.create(null);for(let O=0;O<L;O++){let z=Q[O];if(!z)continue;let A,R=Q.transitions;for(let j=0,x=z.length;j<x;j++){let i=z[j];if(A=R[i],!A)A=R[i]=Object.create(null);R=A}R[J8]=O+64}this.lastNamedStructuresLength=L}if(!U)Q.nextId=L+64}if(H)H=!1;let F;try{if(Y.randomAccessStructure&&G&&typeof G==="object")if(G.constructor===Object)I_(G);else if(G.constructor!==Map&&!Array.isArray(G)&&!v8.some((O)=>G instanceof O))I_(G.toJSON?G.toJSON():G);else y(G);else y(G);let L=S;if(S)K$(X,y,0);if(Z&&Z.idsToInsert){let O=Z.idsToInsert.sort((j,x)=>j.offset>x.offset?1:-1),z=O.length,A=-1;while(L&&z>0){let j=O[--z].offset+X;if(j<L.stringsPosition+X&&A===-1)A=0;if(j>L.position+X){if(A>=0)A+=6}else{if(A>=0)I.setUint32(L.position+X,I.getUint32(L.position+X)+A),A=-1;L=L.previous,z++}}if(A>=0&&L)I.setUint32(L.position+X,I.getUint32(L.position+X)+A);if(K+=O.length*6,K>u)_8(K);Y.offset=K;let R=f$(N.subarray(X,K),O);return Z=null,R}if(Y.offset=K,M&Y$)return N.start=X,N.end=K,N;return N.subarray(X,K)}catch(L){throw F=L,L}finally{if(Q){if(z8(),H&&Y.saveStructures){let L=Q.sharedLength||0,O=N.subarray(X,K),z=g$(Q,Y);if(!F){if(Y.saveStructures(z,z.isCompatible)===!1)return Y.pack(G,M);if(Y.lastNamedStructuresLength=L,N.length>1073741824)N=null;return O}}}if(N.length>1073741824)N=null;if(M&L$)K=X}};let z8=()=>{if(e<10)e++;let G=Q.sharedLength||0;if(Q.length>G&&!U)Q.length=G;if(m>1e4){if(Q.transitions=null,e=0,m=0,p.length>0)p=[]}else if(p.length>0&&!U){for(let M=0,F=p.length;M<F;M++)p[M][J8]=0;p=[]}},c8=(G)=>{var M=G.length;if(M<16)N[K++]=144|M;else if(M<65536)N[K++]=220,N[K++]=M>>8,N[K++]=M&255;else N[K++]=221,I.setUint32(K,M),K+=4;for(let F=0;F<M;F++)y(G[F])},y=(G)=>{if(K>u)N=_8(K);var M=typeof G,F;if(M==="string"){let L=G.length;if(S&&L>=4&&L<4096){if((S.size+=L)>h$){let R,j=(S[0]?S[0].length*3+S[1].length:0)+10;if(K+j>u)N=_8(K+j);let x;if(S.position)x=S,N[K]=200,K+=3,N[K++]=98,R=K-X,K+=4,K$(X,y,0),I.setUint16(R+X-3,K-X-R);else N[K++]=214,N[K++]=98,R=K-X,K+=4;S=["",""],S.previous=x,S.size=0,S.position=R}let A=m$.test(G);S[A?0:1]+=G,N[K++]=193,y(A?-L:L);return}let O;if(L<32)O=1;else if(L<256)O=2;else if(L<65536)O=3;else O=5;let z=L*3;if(K+z>u)N=_8(K+z);if(L<64||!J){let A,R,j,x=K+O;for(A=0;A<L;A++)if(R=G.charCodeAt(A),R<128)N[x++]=R;else if(R<2048)N[x++]=R>>6|192,N[x++]=R&63|128;else if((R&64512)===55296&&((j=G.charCodeAt(A+1))&64512)===56320)R=65536+((R&1023)<<10)+(j&1023),A++,N[x++]=R>>18|240,N[x++]=R>>12&63|128,N[x++]=R>>6&63|128,N[x++]=R&63|128;else N[x++]=R>>12|224,N[x++]=R>>6&63|128,N[x++]=R&63|128;F=x-K-O}else F=J(G,K+O);if(F<32)N[K++]=160|F;else if(F<256){if(O<2)N.copyWithin(K+2,K+1,K+1+F);N[K++]=217,N[K++]=F}else if(F<65536){if(O<3)N.copyWithin(K+3,K+2,K+2+F);N[K++]=218,N[K++]=F>>8,N[K++]=F&255}else{if(O<5)N.copyWithin(K+5,K+3,K+3+F);N[K++]=219,I.setUint32(K,F),K+=4}K+=F}else if(M==="number")if(G>>>0===G)if(G<32||G<128&&this.useRecords===!1||G<64&&!this.randomAccessStructure)N[K++]=G;else if(G<256)N[K++]=204,N[K++]=G;else if(G<65536)N[K++]=205,N[K++]=G>>8,N[K++]=G&255;else N[K++]=206,I.setUint32(K,G),K+=4;else if(G>>0===G)if(G>=-32)N[K++]=256+G;else if(G>=-128)N[K++]=208,N[K++]=G+256;else if(G>=-32768)N[K++]=209,I.setInt16(K,G),K+=2;else N[K++]=210,I.setInt32(K,G),K+=4;else{let L;if((L=this.useFloat32)>0&&G<4294967296&&G>=-2147483648){N[K++]=202,I.setFloat32(K,G);let O;if(L<4||(O=G*b8[(N[K]&127)<<1|N[K+1]>>7])>>0===O){K+=4;return}else K--}N[K++]=203,I.setFloat64(K,G),K+=8}else if(M==="object"||M==="function")if(!G)N[K++]=192;else{if(Z){let O=Z.get(G);if(O){if(!O.id){let z=Z.idsToInsert||(Z.idsToInsert=[]);O.id=z.push(O)}N[K++]=214,N[K++]=112,I.setUint32(K,O.id),K+=4;return}else Z.set(G,{offset:K-X})}let L=G.constructor;if(L===Object)A8(G);else if(L===Array)c8(G);else if(L===Map)if(this.mapAsEmptyObject)N[K++]=128;else{if(F=G.size,F<16)N[K++]=128|F;else if(F<65536)N[K++]=222,N[K++]=F>>8,N[K++]=F&255;else N[K++]=223,I.setUint32(K,F),K+=4;for(let[O,z]of G)y(O),y(z)}else{for(let O=0,z=S8.length;O<z;O++){let A=v8[O];if(G instanceof A){let R=S8[O];if(R.write){if(R.type)N[K++]=212,N[K++]=R.type,N[K++]=0;let L8=R.write.call(this,G);if(L8===G)if(Array.isArray(G))c8(G);else A8(G);else y(L8);return}let j=N,x=I,i=K;N=null;let H8;try{H8=R.pack.call(this,G,(L8)=>{if(N=j,j=null,K+=L8,K>u)_8(K);return{target:N,targetView:I,position:K-L8}},y)}finally{if(j)N=j,I=x,K=i,u=N.length-10}if(H8){if(H8.length+K>u)_8(H8.length+K);K=q$(H8,N,K,R.type)}return}}if(Array.isArray(G))c8(G);else{if(G.toJSON){let O=G.toJSON();if(O!==G)return y(O)}if(M==="function")return y(this.writeFunction&&this.writeFunction(G));A8(G)}}}else if(M==="boolean")N[K++]=G?195:194;else if(M==="bigint"){if(G<9223372036854776000&&G>=-9223372036854776000)N[K++]=211,I.setBigInt64(K,G);else if(G<18446744073709552000&&G>0)N[K++]=207,I.setBigUint64(K,G);else if(this.largeBigIntToFloat)N[K++]=203,I.setFloat64(K,Number(G));else if(this.largeBigIntToString)return y(G.toString());else if(this.useBigIntExtension||this.moreTypes){let L=G<0?BigInt(-1):BigInt(0),O;if(G>>BigInt(65536)===L){let z=BigInt(18446744073709552000)-BigInt(1),A=[];while(!0){if(A.push(G&z),G>>BigInt(63)===L)break;G>>=BigInt(64)}O=new Uint8Array(new BigUint64Array(A).buffer),O.reverse()}else{let z=G<0,A=(z?~G:G).toString(16);if(A.length%2)A="0"+A;else if(parseInt(A.charAt(0),16)>=8)A="00"+A;if(N8)O=Buffer.from(A,"hex");else{O=new Uint8Array(A.length/2);for(let R=0;R<O.length;R++)O[R]=parseInt(A.slice(R*2,R*2+2),16)}if(z)for(let R=0;R<O.length;R++)O[R]=~O[R]}if(O.length+K>u)_8(O.length+K);K=q$(O,N,K,66);return}else throw RangeError(G+" was too large to fit in MessagePack 64-bit integer format, use useBigIntExtension, or set largeBigIntToFloat to convert to float-64, or set largeBigIntToString to convert to string");K+=8}else if(M==="undefined")if(this.encodeUndefinedAsNil)N[K++]=192;else N[K++]=212,N[K++]=0,N[K++]=0;else throw Error("Unknown type: "+M)},w_=this.variableMapSize||this.coercibleKeyAsNumber||this.skipValues?(G)=>{let M;if(this.skipValues){M=[];for(let O in G)if((typeof G.hasOwnProperty!=="function"||G.hasOwnProperty(O))&&!this.skipValues.includes(G[O]))M.push(O)}else M=Object.keys(G);let F=M.length;if(F<16)N[K++]=128|F;else if(F<65536)N[K++]=222,N[K++]=F>>8,N[K++]=F&255;else N[K++]=223,I.setUint32(K,F),K+=4;let L;if(this.coercibleKeyAsNumber)for(let O=0;O<F;O++){L=M[O];let z=Number(L);y(isNaN(z)?L:z),y(G[L])}else for(let O=0;O<F;O++)y(L=M[O]),y(G[L])}:(G)=>{N[K++]=222;let M=K-X;K+=2;let F=0;for(let L in G)if(typeof G.hasOwnProperty!=="function"||G.hasOwnProperty(L))y(L),y(G[L]),F++;if(F>65535)throw Error('Object is too large to serialize with fast 16-bit map size, use the "variableMapSize" option to serialize this object');N[M+++X]=F>>8,N[M+X]=F&255},j_=this.useRecords===!1?w_:_.progressiveRecords&&!w?(G)=>{let M,F=Q.transitions||(Q.transitions=Object.create(null)),L=K++-X,O;for(let z in G)if(typeof G.hasOwnProperty!=="function"||G.hasOwnProperty(z)){if(M=F[z],M)F=M;else{let A=Object.keys(G),R=F;F=Q.transitions;let j=0;for(let x=0,i=A.length;x<i;x++){let H8=A[x];if(M=F[H8],!M)M=F[H8]=Object.create(null),j++;F=M}if(L+X+1==K)K--,n8(F,A,j);else b_(F,A,L,j);O=!0,F=R[z]}y(G[z])}if(!O){let z=F[J8];if(z)N[L+X]=z;else b_(F,Object.keys(G),L,0)}}:(G)=>{let M,F=Q.transitions||(Q.transitions=Object.create(null)),L=0;for(let z in G)if(typeof G.hasOwnProperty!=="function"||G.hasOwnProperty(z)){if(M=F[z],!M)M=F[z]=Object.create(null),L++;F=M}let O=F[J8];if(O)if(O>=96&&w)N[K++]=((O-=96)&31)+96,N[K++]=O>>5;else N[K++]=O;else n8(F,F.__keys__||Object.keys(G),L);for(let z in G)if(typeof G.hasOwnProperty!=="function"||G.hasOwnProperty(z))y(G[z])},x_=typeof this.useRecords=="function"&&this.useRecords,A8=x_?(G)=>{x_(G)?j_(G):w_(G)}:j_,_8=(G)=>{let M;if(G>16777216){if(G-X>Z$)throw Error("Packed buffer would be larger than maximum buffer size");M=Math.min(Z$,Math.round(Math.max((G-X)*(G>67108864?1.25:2),4194304)/4096)*4096)}else M=(Math.max(G-X<<2,N.length-1)>>12)+1<<12;let F=new k8(M);if(I=F.dataView||(F.dataView=new DataView(F.buffer,0,M)),G=Math.min(G,N.length),N.copy)N.copy(F,0,X,G);else F.set(N.slice(X,G));return K-=X,X=0,u=F.length-10,N=F},n8=(G,M,F)=>{let L=Q.nextId;if(!L)L=64;if(L<k&&this.shouldShareStructure&&!this.shouldShareStructure(M)){if(L=Q.nextOwnId,!(L<v))L=k;Q.nextOwnId=L+1}else{if(L>=v)L=k;Q.nextId=L+1}let O=M.highByte=L>=96&&w?L-96>>5:-1;if(G[J8]=L,G.__keys__=M,Q[L-64]=M,L<k)if(M.isShared=!0,Q.sharedLength=L-63,H=!0,O>=0)N[K++]=(L&31)+96,N[K++]=O;else N[K++]=L;else{if(O>=0)N[K++]=213,N[K++]=114,N[K++]=(L&31)+96,N[K++]=O;else N[K++]=212,N[K++]=114,N[K++]=L;if(F)m+=e*F;if(p.length>=T)p.shift()[J8]=0;p.push(G),y(M)}},b_=(G,M,F,L)=>{let O=N,z=K,A=u,R=X;if(N=D8,K=0,X=0,!N)D8=N=new k8(8192);u=N.length-10,n8(G,M,L),D8=N;let j=K;if(N=O,K=z,u=A,X=R,j>1){let x=K+j-1;if(x>u)_8(x);let i=F+X;N.copyWithin(i+j,i+1,K),N.set(D8.slice(0,j),i),K=x}else N[F+X]=D8[0]},I_=(G)=>{let M=v$(G,N,X,K,Q,_8,(F,L,O)=>{if(O)return H=!0;K=L;let z=N;if(y(F),z8(),z!==N)return{position:K,targetView:I,target:N};return K},this);if(M===0)return A8(G);K=M}}useBuffer(_){N=_,N.dataView||(N.dataView=new DataView(N.buffer,N.byteOffset,N.byteLength)),I=N.dataView,K=0}set position(_){K=_}get position(){return K}clearSharedData(){if(this.structures)this.structures=[];if(this.typedStructs)this.typedStructs=[]}}v8=[Date,Set,Error,RegExp,ArrayBuffer,Object.getPrototypeOf(Uint8Array.prototype).constructor,DataView,x8];S8=[{pack(_,$,X){let H=_.getTime()/1000;if((this.useTimestamp32||_.getMilliseconds()===0)&&H>=0&&H<4294967296){let{target:Q,targetView:Z,position:J}=$(6);Q[J++]=214,Q[J++]=255,Z.setUint32(J,H)}else if(H>0&&H<4294967296){let{target:Q,targetView:Z,position:J}=$(10);Q[J++]=215,Q[J++]=255,Z.setUint32(J,_.getMilliseconds()*4000000+(H/1000/4294967296>>0)),Z.setUint32(J+4,H)}else if(isNaN(H)){if(this.onInvalidDate)return $(0),X(this.onInvalidDate());let{target:Q,targetView:Z,position:J}=$(3);Q[J++]=212,Q[J++]=255,Q[J++]=255}else{let{target:Q,targetView:Z,position:J}=$(15);Q[J++]=199,Q[J++]=12,Q[J++]=255,Z.setUint32(J,_.getMilliseconds()*1e6),Z.setBigInt64(J+4,BigInt(Math.floor(H)))}}},{pack(_,$,X){if(this.setAsEmptyObject)return $(0),X({});let H=Array.from(_),{target:Q,position:Z}=$(this.moreTypes?3:0);if(this.moreTypes)Q[Z++]=212,Q[Z++]=115,Q[Z++]=0;X(H)}},{pack(_,$,X){let{target:H,position:Q}=$(this.moreTypes?3:0);if(this.moreTypes)H[Q++]=212,H[Q++]=101,H[Q++]=0;X([_.name,_.message,_.cause])}},{pack(_,$,X){let{target:H,position:Q}=$(this.moreTypes?3:0);if(this.moreTypes)H[Q++]=212,H[Q++]=120,H[Q++]=0;X([_.source,_.flags])}},{pack(_,$){if(this.moreTypes)Q_(_,16,$);else Z_(N8?Buffer.from(_):new Uint8Array(_),$)}},{pack(_,$){let X=_.constructor;if(X!==N$&&this.moreTypes)Q_(_,H_.indexOf(X.name),$);else Z_(_,$)}},{pack(_,$){if(this.moreTypes)Q_(_,17,$);else Z_(N8?Buffer.from(_):new Uint8Array(_),$)}},{pack(_,$){let{target:X,position:H}=$(1);X[H]=193}}];function Q_(_,$,X,H){let Q=_.byteLength;if(Q+1<256){var{target:Z,position:J}=X(4+Q);Z[J++]=199,Z[J++]=Q+1}else if(Q+1<65536){var{target:Z,position:J}=X(5+Q);Z[J++]=200,Z[J++]=Q+1>>8,Z[J++]=Q+1&255}else{var{target:Z,position:J,targetView:Y}=X(7+Q);Z[J++]=201,Y.setUint32(J,Q+1),J+=4}if(Z[J++]=116,Z[J++]=$,!_.buffer)_=new Uint8Array(_);Z.set(new Uint8Array(_.buffer,_.byteOffset,_.byteLength),J)}function Z_(_,$){let X=_.byteLength;var H,Q;if(X<256){var{target:H,position:Q}=$(X+2);H[Q++]=196,H[Q++]=X}else if(X<65536){var{target:H,position:Q}=$(X+3);H[Q++]=197,H[Q++]=X>>8,H[Q++]=X&255}else{var{target:H,position:Q,targetView:Z}=$(X+5);H[Q++]=198,Z.setUint32(Q,X),Q+=4}H.set(_,Q)}function q$(_,$,X,H){let Q=_.length;switch(Q){case 1:$[X++]=212;break;case 2:$[X++]=213;break;case 4:$[X++]=214;break;case 8:$[X++]=215;break;case 16:$[X++]=216;break;default:if(Q<256)$[X++]=199,$[X++]=Q;else if(Q<65536)$[X++]=200,$[X++]=Q>>8,$[X++]=Q&255;else $[X++]=201,$[X++]=Q>>24,$[X++]=Q>>16&255,$[X++]=Q>>8&255,$[X++]=Q&255}return $[X++]=H,$.set(_,X),X+=Q,X}function f$(_,$){let X,H=$.length*6,Q=_.length-H;while(X=$.pop()){let{offset:Z,id:J}=X;_.copyWithin(Z+H,Z,Q),H-=6;let Y=Z+H;_[Y++]=214,_[Y++]=105,_[Y++]=J>>24,_[Y++]=J>>16&255,_[Y++]=J>>8&255,_[Y++]=J&255,Q=Z}return _}function K$(_,$,X){if(S.length>0){I.setUint32(S.position+_,K+X-S.position-_),S.stringsPosition=K-_;let H=S;S=null,$(H[0]),$(H[1])}}function q_(_){if(_.Class){if(!_.pack&&!_.write)throw Error("Extension has no pack or write function");if(_.pack&&!_.type)throw Error("Extension has no type (numeric code to identify the extension)");v8.unshift(_.Class),S8.unshift(_)}Q$(_)}function g$(_,$){return _.isCompatible=(X)=>{let H=!X||($.lastNamedStructuresLength||0)===X.length;if(!H)$._mergeStructures(X);return H},_}var G$=new G8({useRecords:!1}),p$=G$.pack,l$=G$.pack;var Y$=512,L$=1024,O$=2048;var D$=80;class o{capId;constructor(_){this.capId=_}}var u$=new Set(["hello","goaway","call","result","cancel","stream","drop","cap_revoked"]);function K_(_){if(typeof _!=="object"||_===null)return!1;let $=_,X=$.op;if(typeof X!=="string"||!u$.has(X))return!1;switch(X){case"hello":return $.v===1&&($.mode==="native"||$.mode==="web")&&Array.isArray($.features)&&typeof $.maxBytes==="number"&&typeof $.origin==="string";case"goaway":return $.reason===void 0||typeof $.reason==="string";case"call":return typeof $.id==="number"&&typeof $.method==="string"&&typeof $.target==="object"&&$.target!==null&&$.target.kind==="cap"&&typeof $.target.id==="number";case"result":return typeof $.id==="number"&&($.ok===!0||$.ok===!1);case"cancel":return typeof $.id==="number";case"stream":return typeof $.id==="number"&&typeof $.ev==="string"&&($.ev==="next"||$.ev==="credit"||$.ev==="end"||$.ev==="error");case"drop":return Array.isArray($.caps);case"cap_revoked":if(!Array.isArray($.capIds))return!1;for(let H of $.capIds)if(typeof H!=="number"||!Number.isInteger(H)||H<0||H>4294967295)return!1;return!0}}var F$=!1;function d$(){if(F$)return;F$=!0,q_({Class:o,type:D$,pack:(_)=>c$(_.capId),unpack:(_)=>new o(s$(_))})}function J_(){return d$(),{packr:new G8({useRecords:!0,sequential:!0,moreTypes:!0}),unpackr:new t({useRecords:!0,sequential:!0,moreTypes:!0})}}function c$(_){let $=new Uint8Array(5),X=_>>>0,H=0;while(X>=128)$[H++]=X&127|128,X>>>=7;return $[H++]=X&127,$.subarray(0,H)}var n$=5;function s$(_){let $=0,X=0,H=Math.min(_.length,n$);for(let Q=0;Q<H;Q++){let Z=_[Q];if($|=(Z&127)<<X,(Z&128)===0)return $>>>0;X+=7}throw Error("Truncated or oversize varuint")}var N_=67108864,G_=1,h8="bunite.",m8="bootstrap";class P extends Error{code;details;retry;constructor(_){super(_.message??_.code);this.name="IpcError",this.code=_.code,this.details=_.details,this.retry=_.retry}toStatus(){return{code:this.code,message:this.message,details:this.details,retry:this.retry}}}var f8=a("bunite.BrowserWindow",{focus:B(),close:B(),setBounds:B(),setTitle:B(),id:B({idempotent:!0}),label:B({idempotent:!0})}),Y_=a("bunite.Window",{create:B({returns:s(f8)}),list:B({returns:s.array(f8),idempotent:!0}),focus:B(),close:B()}),g8=a("bunite.FileRef",{text:B({idempotent:!0}),bytes:B({idempotent:!0}),path:B({idempotent:!0}),revoke:B()},{disposal:{method:"revoke"}}),L_=a("bunite.Dialogs",{openFile:B({returns:s.array(g8)}),saveFile:B({returns:s(g8)}),showMessage:B()}),O_=a("bunite.Clipboard",{readText:B({idempotent:!0}),writeText:B(),readBytes:B({idempotent:!0}),writeBytes:B()}),F_=a("bunite.Shell",{openExternal:B(),showItemInFolder:B()}),D_=a("bunite.Surface",{init:B(),resize:B(),remove:B(),setHidden:B(),setMasks:B(),setAllPassthrough:B(),bringAllVisiblesToFront:B(),navigate:B(),goBack:B(),reload:B(),evaluate:B(),capabilities:B(),didNavigate:O8(),titleChanged:O8()}),U8=a("bunite.Runtime",{window:B({returns:s(Y_),idempotent:!0}),dialogs:B({returns:s(L_),idempotent:!0}),clipboard:B({returns:s(O_),idempotent:!0}),shell:B({returns:s(F_),idempotent:!0}),appName:B({idempotent:!0}),appVersion:B({idempotent:!0}),theme:B({idempotent:!0}),themeWatch:O8(),surface:B({returns:s(D_),idempotent:!0})}),X8={Runtime:1,Window:2,Dialogs:3,FileRef:4,Clipboard:5,Shell:6,BrowserWindow:7,Surface:8},o$=new Map([[U8,X8.Runtime],[Y_,X8.Window],[L_,X8.Dialogs],[g8,X8.FileRef],[O_,X8.Clipboard],[F_,X8.Shell],[f8,X8.BrowserWindow],[D_,X8.Surface]]);function U_(_){return o$.get(_)}var l8=0,R_=1,M$=0,W$=1,Y8=2,z_=128,u8=1024,R$=1024,i$=u8*4,a$=500,r$=32,t$=8,e$=1024;function _X(_){let $=_?.initialBudget;if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<1)return r$;return Math.min($,e$)}var p8=null;class A_{entries=new Map;nextCapId=Y8;capLimit;constructor(_=u8){this.capLimit=_}install(_,$){if(this.entries.has(_))throw Error(`cap-id ${_} already installed`);let X={capId:_,...$};return this.entries.set(_,X),X}allocate(_){if(this.entries.size>=this.capLimit)throw new P({code:"resource_exhausted",message:`cap-table limit ${this.capLimit}`,details:{reason:"max_caps_per_connection"}});let $=this.nextCapId++;while(this.entries.has($))$=this.nextCapId++;return this.install($,_)}get(_){return this.entries.get(_)}release(_,$=1){let X=this.entries.get(_);if(!X)return!1;if(X.refCount=Math.max(0,X.refCount-$),X.refCount===0&&_>=Y8)return this.entries.delete(_),!0;return!1}delete(_){if(_<Y8)return!1;return this.entries.delete(_)}clear(){this.entries.clear(),this.nextCapId=Y8}size(){return this.entries.size}values(){return this.entries.values()}}var $X={origin:"",topOrigin:"",partition:"default",isAppRes:!1,isMainFrame:!1,userGesture:!1,level:"untrusted"},z$=Symbol("bunite.rpc.ExportedCap"),U$=Symbol("bunite.rpc.CapProxyMeta");function XX(_){return typeof _==="object"&&_!==null&&_[z$]===!0}var HX=typeof FinalizationRegistry<"u"?new FinalizationRegistry((_)=>{if(_.dropped())return;let $=_.connRef.deref();if(!$||$.closed)return;$._dropFromFinalizer(_.capId)}):{register:()=>{}};class A${transport;capTable;pending=new Map;clientStreams=new Map;serverStreams=new Map;serverCallChildren=new Map;serverActiveCalls=new Map;registry=new Map;rootInstances=new Map;revokedCapIds=new Set;closeHandlers=new Set;observers={};nextCallId=1;remoteHello=null;remoteReady;resolveRemoteReady;rejectRemoteReady;closed_=!1;maxBytes;maxInFlightCalls;mode;origin;features;attestation;peerId;policy;constructor(_){this.transport=_.transport,this.mode=_.mode,this.origin=_.origin,this.features=_.features??[],this.maxBytes=_.maxBytes??N_,this.maxInFlightCalls=_.maxInFlightCalls??R$,this.attestation=_.attestation??$X,this.peerId=_.peerId??"peer",this.policy=_.policy,this.capTable=new A_(_.capLimit??u8),this.capTable.install(l8,{typeId:M$,cap:null,impl:null,refCount:1}),this.capTable.install(R_,{typeId:W$,cap:U8,impl:_.runtime??null,refCount:1}),this.remoteReady=new Promise(($,X)=>{this.resolveRemoteReady=$,this.rejectRemoteReady=X}),this.remoteReady.catch(()=>{}),this.transport.setReceive(($)=>this.handleFrame($)),this.transport.send({op:"hello",v:G_,mode:this.mode,features:this.features,maxBytes:this.maxBytes,origin:this.origin})}get closed(){return this.closed_}onClose(_){return this.closeHandlers.add(_),()=>this.closeHandlers.delete(_)}on(_,$){let X=this.observers[_];if(!X)X=new Set,this.observers[_]=X;return X.add($),()=>{X.delete($)}}emitObs(_,$){let X=this.observers[_];if(!X||X.size===0)return;for(let H of X)try{H($)}catch{}}markRevoked(_){this.revokedCapIds.add(_);while(this.revokedCapIds.size>i$){let $=this.revokedCapIds.values().next().value;if($===void 0)break;this.revokedCapIds.delete($)}}serve(_,$,X){this.assertNotFrameworkName(_.name);let H=X?.ifExists??"throw";if(this.registry.get(_.name))switch(H){case"throw":throw new P({code:"already_exists",message:`cap "${_.name}" already served`,details:{reason:"name_collision"}});case"skip":return this.makeHandle([]);case"replace":return this.replace(_,$),this.makeHandle([_.name])}return this.registry.set(_.name,{cap:_,impl:$,version:_.version}),this.makeHandle([_.name])}makeHandle(_){let $={names:_,[Symbol.dispose]:()=>this.unserve($)};return $}serveAll(_,$,X){let H=X?.ifExists??"throw";for(let Z of Object.keys(_.roots)){let J=_.roots[Z];this.assertNotFrameworkName(J.name);let Y=this.registry.get(J.name);if(Y){if(H==="throw")throw new P({code:"already_exists",message:`cap "${J.name}" already served`,details:{reason:"name_collision"}});if(H==="replace"&&Y.version!==J.version)throw new P({code:"failed_precondition",message:`version mismatch on replace for "${J.name}" (current "${Y.version}", new "${J.version}")`,details:{reason:"version_mismatch"}})}}let Q=[];for(let Z of Object.keys(_.roots)){let J=_.roots[Z],Y=$[Z];if(this.serve(J,Y,{ifExists:H}).names.length>0)Q.push(J.name)}return this.makeHandle(Q)}unserve(_){let $=E8(_)?[_.name]:Array.from(_.names),X=[];for(let H of $){if(!this.registry.delete(H))continue;let Q=this.rootInstances.get(H);if(Q!==void 0){let Z=this.capTable.get(Q);if(Z)this.invokeServerDisposal(Z);this.rootInstances.delete(H),this.capTable.delete(Q),X.push(Q)}}if(X.length>0)this.transport.send({op:"cap_revoked",capIds:X}),this.emitObs("revoke",{capIds:X,reason:"unserve"})}replace(_,$){let X=this.registry.get(_.name);if(!X)throw new P({code:"not_found",message:`cap "${_.name}" not served`});if(X.version!==_.version)throw new P({code:"failed_precondition",message:`version mismatch (current "${X.version}", new "${_.version}")`,details:{reason:"version_mismatch"}});X.impl=$,X.cap=_;let H=this.rootInstances.get(_.name);if(H!==void 0){let Q=this.capTable.get(H);if(Q)Q.impl=$,Q.cap=_}this.emitObs("revoke",{capIds:H!==void 0?[H]:[],reason:"replace"})}assertNotFrameworkName(_){if(_.startsWith(h8))throw new P({code:"already_exists",message:`cap name "${_}" uses reserved prefix "${h8}"`,details:{reason:"reserved_namespace"}})}runtimeProxy=null;runtime(){if(!this.runtimeProxy)this.runtimeProxy=this.makeCapProxy(U8,R_);return this.runtimeProxy}async bootstrap(_){if(E8(_))return this._bootstrapCap(_);if(o8(_))return this._bootstrapSchema(_);throw new P({code:"invalid_argument",message:"bootstrap target must be CapDef or Schema"})}async _bootstrapCap(_){await this.remoteReady;let $={name:_.name};if(_.version!=null)$.version=_.version;let X=await this.sendCallTyped(l8,m8,$,void 0);if(!(X instanceof o))throw new P({code:"invalid_argument",message:"bootstrap did not return a CapRef"});return this.makeCapProxy(_,X.capId)}async _bootstrapSchema(_){let $=Object.keys(_.roots),X=await Promise.allSettled($.map((Z)=>this._bootstrapCap(_.roots[Z]))),H=X.find((Z)=>Z.status==="rejected");if(H){for(let Z of X)if(Z.status==="fulfilled")try{this.releaseRef(Z.value)}catch{}throw H.reason}let Q={};for(let Z=0;Z<$.length;Z++)Q[$[Z]]=X[Z].value;return Q}handleFrame(_){if(this.closed_)return;switch(_.op){case"hello":this.handleHello(_);return;case"call":this.handleCall(_);return;case"result":this.handleResult(_);return;case"cancel":this.handleCancel(_);return;case"stream":this.handleStreamFrame(_);return;case"drop":this.handleDrop(_);return;case"cap_revoked":this.handleCapRevoked(_);return;case"goaway":this.handleGoaway(_);return;default:this.handleUnknownFrame(_);return}}handleUnknownFrame(_){let $=_?.id;if(typeof $==="number"){this.transport.send({op:"result",id:$,ok:!1,error:{code:"invalid_argument",message:"unknown opcode"}});return}this.transport.send({op:"goaway",reason:"invalid_argument",error:{code:"invalid_argument",message:"unknown opcode"}}),this.shutdown("invalid_argument")}handleHello(_){this.remoteHello=_,this.resolveRemoteReady(_)}handleGoaway(_){this.rejectRemoteReady(new P(_.error??{code:"unavailable",message:_.reason??"peer goaway"})),this.shutdown(_.reason??"remote goaway")}handleCapRevoked(_){for(let $ of _.capIds){this.markRevoked($);let X=new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}});for(let[H,Q]of this.pending)if(Q.capId===$){if(this.pending.delete(H),Q.timer)clearTimeout(Q.timer);Q.reject(X)}for(let[H,Q]of this.clientStreams)if(Q.capId===$)this.clientStreams.delete(H),Q.fail(X)}}async handleCall(_){if(_.target.id===l8&&_.method===m8){await this.handleBootstrap(_);return}let $=this.capTable.get(_.target.id);if(!$)return this.emitObs("call",{capId:_.target.id,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`cap-id ${_.target.id} not found`);let X=$.cap;if(!X||!$.impl)return this.emitObs("call",{capId:_.target.id,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found","cap has no impl");let H=X.methods[_.method];if(!H)return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`method "${_.method}" on cap "${X.name}"`);let Q=$.impl[_.method];if(typeof Q!=="function")return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"not_found"}),this.sendError(_.id,"not_found",`method "${_.method}" has no handler`);if(this.serverActiveCalls.size+this.serverStreams.size>=this.maxInFlightCalls)return this.emitObs("call",{capId:_.target.id,capName:X.name,method:_.method,callId:_.id,result:"resource_exhausted"}),this.sendError(_.id,"resource_exhausted",`in-flight calls limit ${this.maxInFlightCalls}`,{reason:"max_concurrent_calls"});await this.invokeServerMethod(_,X,H,Q)}async handleBootstrap(_){let $=_.args??{},X=$.name;if(typeof X!=="string")return this.emitObs("bootstrap",{name:String(X),attestation:this.attestation,result:"invalid_argument"}),this.sendError(_.id,"invalid_argument","bootstrap requires {name: string}");let H=$.version!=null?String($.version):void 0,Q=this.registry.get(X);if(!Q)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"not_found"}),this.sendError(_.id,"not_found",`cap "${X}" not served`);let Z=Q.version;if(Z!=null&&H!=null&&Z!==H)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"version_mismatch"}),this.sendError(_.id,"failed_precondition",`version mismatch (server "${Z}", client "${H}")`,{reason:"version_mismatch"});if(this.policy){let Y;try{Y=await this.policy(X,this.attestation)}catch(U){return this.emitObs("error",{phase:"policy",error:U instanceof Error?U:Error(String(U))}),this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"internal"}),this.sendError(_.id,"internal","policy threw")}if(typeof Y!=="boolean")return this.emitObs("error",{phase:"policy",error:Error(`policy must return boolean (got ${typeof Y})`)}),this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"internal"}),this.sendError(_.id,"internal","policy returned non-boolean");if(!Y)return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"denied"}),this.sendError(_.id,"failed_precondition","policy denied",{reason:"unauthorized"})}let J=this.rootInstances.get(X);if(J!==void 0){let Y=this.capTable.get(J);if(Y)Y.refCount+=1;else this.rootInstances.delete(X),J=void 0}if(J===void 0)try{J=this.capTable.allocate({typeId:U_(Q.cap)??z_,cap:Q.cap,impl:Q.impl,refCount:1}).capId,this.rootInstances.set(X,J)}catch(Y){if(Y instanceof P){let U=Y.code==="resource_exhausted"?"resource_exhausted":"internal";return this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:U}),this.sendError(_.id,Y.code,Y.message,Y.details)}throw Y}this.emitObs("bootstrap",{name:X,version:H,attestation:this.attestation,result:"ok",capId:J}),this.transport.send({op:"result",id:_.id,ok:!0,value:new o(J)})}async invokeServerMethod(_,$,X,H){let Q=this.makeCallCtx(_);if(C8(X)){let Z=_X(X.hint);try{let J=()=>H(_.args,Q),Y=p8,W=(Y?()=>Y.run({callId:_.id},J):J)();this.runServerStream(_.id,W,Q,Z,$,_.method,_.target.id)}catch(J){this.emitObs("stream",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,event:"error"}),this.transport.send({op:"stream",id:_.id,ev:"error",error:M_(J)})}return}if(P8(X)){let Z=performance.now(),J=X.idempotent?void 0:this.armServerDeadline(_,Q);this.serverActiveCalls.set(_.id,{ctrl:Q._ctrl,capId:_.target.id,capName:$.name,method:_.method,startedAt:Z});let Y=QX(X.returns),U=()=>Promise.resolve(H(_.args,Q)),W=p8,V=W?()=>W.run({callId:_.id},U):U;try{let T=await V();if(J)clearTimeout(J);if(!this.serverActiveCalls.delete(_.id))return;let w=Y(T);this.transport.send({op:"result",id:_.id,ok:!0,value:w}),this.emitObs("call",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,durationMs:performance.now()-Z,result:"ok"})}catch(T){if(J)clearTimeout(J);if(!this.serverActiveCalls.delete(_.id))return;let w=M_(T);this.sendErrorFromStatus(_.id,w),this.emitObs("call",{capId:_.target.id,capName:$.name,method:_.method,callId:_.id,durationMs:performance.now()-Z,result:w.code})}return}this.sendError(_.id,"not_found","unknown method kind")}armServerDeadline(_,$){let X=_.meta?.deadlineMs;if(!X)return;return setTimeout(()=>{$._ctrl.abort()},X)}makeCallCtx(_){let $=new AbortController;return{callId:_.id,peerId:this.peerId,attestation:this.attestation,signal:$.signal,deadline:_.meta?.deadlineMs,_ctrl:$,exportCap:(H,Q)=>this.exportCap(H,Q)}}exportCap(_,$){let X=U_(_)??z_,H=this.capTable.allocate({typeId:X,cap:_,impl:$,refCount:1});return{[z$]:!0,cap:_,capId:H.capId,typeId:H.typeId}}runServerStream(_,$,X,H,Q,Z,J){let Y=$[Symbol.asyncIterator](),U=X._ctrl,W={iter:Y,abort:U,cancelled:!1,credit:H,creditWaker:null,capId:J,capName:Q.name,method:Z,callId:_,count:0};this.serverStreams.set(_,W),this.emitObs("stream",{capId:J,capName:Q.name,method:Z,callId:_,event:"start"});let V=()=>{if(W.credit>0||W.cancelled)return Promise.resolve();return new Promise((w)=>{W.creditWaker=w})};(async()=>{let w=!1;try{while(!W.cancelled){if(W.credit===0)await V();if(W.cancelled)break;let{done:k,value:v}=await Y.next();if(k)break;if(W.cancelled)break;W.credit-=1,W.count+=1,this.transport.send({op:"stream",id:_,ev:"next",value:v})}}catch(k){w=!0,this.transport.send({op:"stream",id:_,ev:"error",error:M_(k)}),this.emitObs("stream",{capId:J,capName:Q.name,method:Z,callId:_,event:"error",count:W.count})}finally{if(!w)this.transport.send({op:"stream",id:_,ev:"end"}),this.emitObs("stream",{capId:J,capName:Q.name,method:Z,callId:_,event:W.cancelled?"cancel":"end",count:W.count});this.serverStreams.delete(_)}})()}handleResult(_){let $=this.pending.get(_.id);if($){if(this.pending.delete(_.id),this.serverCallChildren.delete(_.id),$.timer)clearTimeout($.timer);if(_.ok){let H=$.decodeReturn?$.decodeReturn(_.value):_.value;$.resolve(H)}else $.reject(new P(_.error));return}let X=this.clientStreams.get(_.id);if(X){this.clientStreams.delete(_.id);let H=_.ok?new P({code:"invalid_argument",message:"stream method returned result frame"}):new P(_.error);X.fail(H)}}handleCancel(_){let $=this.serverStreams.get(_.id);if($)$.cancelled=!0,$.abort.abort(),$.iter?.return?.(),this.serverStreams.delete(_.id);let X=this.serverActiveCalls.get(_.id);if(X)this.serverActiveCalls.delete(_.id),X.ctrl.abort(),this.transport.send({op:"result",id:_.id,ok:!1,error:{code:"cancelled",message:_.reason}}),this.emitObs("call",{capId:X.capId,capName:X.capName,method:X.method,callId:_.id,durationMs:performance.now()-X.startedAt,result:"cancelled"});for(let[H,Q]of this.serverCallChildren){if(Q.parentId!==_.id)continue;if(this.serverCallChildren.delete(H),this.pending.has(H))this.transport.send({op:"cancel",id:H,reason:_.reason})}}releaseRef(_){if(typeof _!=="object"||_===null)return;let $=_[U$];if(!$||$.dropped)return;$.dropped=!0,this.sendDrop($.capId)}sendDrop(_){if(this.closed_)return;if(_<Y8)return;this.transport.send({op:"drop",caps:[{id:_,delta:1}]})}handleStreamFrame(_){if(_.ev==="credit"){let X=this.serverStreams.get(_.id);if(!X)return;X.credit+=_.credit?.messages??0;let H=X.creditWaker;X.creditWaker=null,H?.();return}let $=this.clientStreams.get(_.id);if(!$)return;switch(_.ev){case"next":$.push(_.value);return;case"end":$.end(),this.clientStreams.delete(_.id);return;case"error":$.fail(new P(_.error)),this.clientStreams.delete(_.id);return}}handleDrop(_){for(let{id:$,delta:X}of _.caps)if(this.capTable.release($,X)){for(let[Q,Z]of this.rootInstances)if(Z===$){this.rootInstances.delete(Q);break}}}sendError(_,$,X,H){let Q={code:$,message:X};if(H!==void 0)Q.details=H;this.transport.send({op:"result",id:_,ok:!1,error:Q})}sendErrorFromStatus(_,$){this.transport.send({op:"result",id:_,ok:!1,error:$})}nextId(){return this.nextCallId++}sendCallTyped(_,$,X,H,Q,Z){if(this.closed_)return Promise.reject(new P({code:"unavailable",message:"connection closed"}));if(this.revokedCapIds.has(_))return Promise.reject(new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}}));if(this.pending.size>=this.maxInFlightCalls)return Promise.reject(new P({code:"resource_exhausted",message:`in-flight calls limit ${this.maxInFlightCalls}`,details:{reason:"max_concurrent_calls"}}));let J=this.nextId();return new Promise((Y,U)=>{let W=new AbortController,V={resolve:Y,reject:U,abort:W,decodeReturn:H,startedAt:performance.now(),capId:_,method:$,capName:Z,kind:"call"};if(Q?.deadlineMs)V.timer=setTimeout(()=>{if(this.pending.delete(J))this.transport.send({op:"cancel",id:J,reason:"deadline_exceeded"}),U(new P({code:"deadline_exceeded"}))},Q.deadlineMs+a$);this.pending.set(J,V);let T=Q;if(T?.parentCallId===void 0&&p8){let w=p8.getStore();if(w)T={...T??{},parentCallId:w.callId}}if(T?.parentCallId!==void 0)this.serverCallChildren.set(J,{parentId:T.parentCallId});this.transport.send({op:"call",id:J,target:{kind:"cap",id:_},method:$,args:X,meta:T})})}openClientStream(_,$,X,H,Q){if(this.closed_){let W=W_(_,0,()=>{},()=>{});return W.fail(new P({code:"unavailable",message:"connection closed"})),W.stream}if(this.revokedCapIds.has(_)){let W=W_(_,0,()=>{},()=>{});return W.fail(new P({code:"failed_precondition",message:"cap revoked",details:{reason:"revoked"}})),W.stream}let Z=this.nextId(),U=W_(_,Z,()=>{if(this.clientStreams.delete(Z))this.transport.send({op:"cancel",id:Z,reason:"client_cancel"})},(W)=>{if(this.closed_||!this.clientStreams.has(Z))return;this.transport.send({op:"stream",id:Z,ev:"credit",credit:{messages:W}})});return this.clientStreams.set(Z,U),this.transport.send({op:"call",id:Z,target:{kind:"cap",id:_},method:$,args:X,meta:H}),U.stream}makeCapProxy(_,$){let X={},H={capId:$,dropped:!1};X[U$]=H;let Q=()=>{if(H.dropped)return;H.dropped=!0,this.sendDrop($)};for(let J of Object.keys(_.methods)){let Y=_.methods[J];if(C8(Y))X[J]=(U)=>this.openClientStream($,J,U,void 0,_.name);else if(P8(Y)){let U=ZX(Y.returns,(W,V)=>this.makeCapProxy(W,V));X[J]=(W)=>this.sendCallTyped($,J,W,U,void 0,_.name)}}let Z=_.disposal;if(Z){let J=this;X[Symbol.dispose]=()=>{try{let Y=X[Z.method]?.();if(Y&&typeof Y.then==="function")Y.catch((U)=>J.emitObs("error",{phase:"dispose",error:U instanceof Error?U:Error(String(U))}))}catch(Y){J.emitObs("error",{phase:"dispose",error:Y instanceof Error?Y:Error(String(Y))})}Q()}}if(typeof FinalizationRegistry<"u")HX.register(X,{connRef:new WeakRef(this),capId:$,dropped:()=>H.dropped});return X}_dropFromFinalizer(_){try{this.sendDrop(_)}catch{}}shutdown(_="shutdown"){if(this.closed_)return;this.closed_=!0;for(let $ of this.pending.values()){if($.timer)clearTimeout($.timer);$.reject(new P({code:"unavailable",message:_}))}this.pending.clear();for(let $ of this.clientStreams.values())$.fail(new P({code:"unavailable",message:_}));this.clientStreams.clear();for(let $ of this.serverStreams.values())$.cancelled=!0,$.abort.abort(),$.iter?.return?.();this.serverStreams.clear();for(let $ of this.serverActiveCalls.values())$.ctrl.abort();this.serverActiveCalls.clear();for(let $ of this.capTable.values())this.invokeServerDisposal($);if(this.capTable.clear(),!this.remoteHello)this.rejectRemoteReady(new P({code:"unavailable",message:_}));for(let $ of this.closeHandlers)try{$()}catch{}this.closeHandlers.clear();try{this.transport.close()}catch{}}invokeServerDisposal(_){let $=_.cap;if(!$)return;let X=$.disposal;if(!X)return;let H=_.impl,Q=H?.[X.method];if(!Q)return;try{Q.call(H,void 0,void 0)}catch{}}}function QX(_){if(!_)return(X)=>X;let $=(X,H)=>{if(!XX(X))throw new P({code:"failed_precondition",message:"expected ctx.exportCap return for cap method",details:{reason:"unregistered_cap_return"}});if(X.cap!==H)throw new P({code:"failed_precondition",message:"exported cap type mismatch with method returns",details:{reason:"unregistered_cap_return"}});return new o(X.capId)};if(B8(_))return(X)=>$(X,_.cap);if(T8(_))return(X)=>{if(!Array.isArray(X))throw new P({code:"invalid_argument",message:"expected ExportedCap[] for cap.array method"});return X.map((H)=>$(H,_.cap))};if(V8(_))return(X)=>{if(!X||typeof X!=="object")throw new P({code:"invalid_argument",message:"expected Record<string, ExportedCap> for cap.record method"});let H={};for(let Q of Object.keys(X))H[Q]=$(X[Q],_.cap);return H};return(X)=>X}function ZX(_,$){if(!_)return;if(B8(_)){let X=_.cap;return(H)=>{if(!(H instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef"});return $(X,H.capId)}}if(T8(_)){let X=_.cap,H=X.disposal;return(Q)=>{if(!Array.isArray(Q))throw new P({code:"invalid_argument",message:"expected array"});let Z=Q.map((J)=>{if(!(J instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef in array"});return $(X,J.capId)});return qX(Z,H),Z}}if(V8(_)){let X=_.cap;return(H)=>{if(!H||typeof H!=="object")throw new P({code:"invalid_argument",message:"expected record"});let Q={};for(let Z of Object.keys(H)){let J=H[Z];if(!(J instanceof o))throw new P({code:"invalid_argument",message:"expected CapRef in record"});Q[Z]=$(X,J.capId)}return Q}}return}function qX(_,$){if(!$)return;_[Symbol.dispose]=()=>{for(let X of _)X[Symbol.dispose]?.call(X)}}function M_(_){if(_ instanceof P)return _.toStatus();if(_ instanceof Error)return{code:"internal",message:_.message};return{code:"internal",message:String(_)}}function W_(_,$,X,H){let Q=[],Z=[],J=!1,Y=null,U=!1,W=0;function V(){if(W+=1,W>=t$)H(W),W=0}function T(){if(Q.length>0){let m=Q.shift();return V(),{value:m,done:!1}}if(Y)return null;if(J||U)return{value:void 0,done:!0};return null}function w(){let m=T();if(m)return Promise.resolve(m);if(Y)return Promise.reject(Y);return new Promise((e,z8)=>Z.push({resolve:e,reject:z8}))}function k(){while(Z.length>0){let m=Z.shift(),e=T();if(e){m.resolve(e);continue}if(Y){m.reject(Y);continue}Z.unshift(m);break}}function v(){if(U||J||Y)return;U=!0,X(),k()}let p={[Symbol.asyncIterator]:()=>({next:w,return:()=>{return v(),Promise.resolve({value:void 0,done:!0})},throw:(m)=>{return v(),Promise.reject(m)}}),[Symbol.dispose]:v,cancel:v};return{capId:_,stream:p,push(m){if(U||J||Y)return;Q.push(m),k()},end(){J=!0,k()},fail(m){Y=m,k()}}}function B_(_){return new A$(_)}function T_(_,$={}){let X=J_(),H;return _.setReceive((Q)=>{let Z;try{Z=X.unpackr.unpack(Q)}catch(J){$.onProtocolError?.(`unpack failed: ${J instanceof Error?J.message:String(J)}`),_.close();return}if(!K_(Z)){$.onProtocolError?.("malformed frame"),_.close();return}H?.(Z)}),{send(Q){let Z=X.packr.pack(Q);_.send(Z instanceof Uint8Array?Z:new Uint8Array(Z))},setReceive(Q){H=Q},close(){_.close()}}}function V_(_){if("binaryType"in _)try{_.binaryType="arraybuffer"}catch{}let $,X=(H)=>{if(!$)return;let Q=H.data;if(Q instanceof Uint8Array){$(Q);return}if(Q instanceof ArrayBuffer){$(new Uint8Array(Q));return}if(typeof Blob<"u"&&Q instanceof Blob){Q.arrayBuffer().then((Z)=>$?.(new Uint8Array(Z)));return}};return _.addEventListener("message",X),{send(H){_.send(H)},setReceive(H){$=H},close(){_.removeEventListener?.("message",X),_.close?.()}}}function M8(_){let $=new ArrayBuffer(_.byteLength);return new Uint8Array($).set(_),$}async function KX(_){return crypto.subtle.importKey("raw",M8(_),"AES-GCM",!1,["encrypt","decrypt"])}async function P_(_,$){let X=await KX($),H,Q=Promise.resolve(),Z=Promise.resolve(),J=!1,Y=()=>{if(!J)J=!0,_.close()};return _.setReceive((U)=>{if(J)return;if(U.length<13||U[0]!==1){Y();return}let W=M8(U.subarray(1,13)),V=M8(U.subarray(13));Z=Z.then(async()=>{if(J)return;try{let T=await crypto.subtle.decrypt({name:"AES-GCM",iv:W},X,V);H?.(new Uint8Array(T))}catch{Y()}})}),{send(U){if(J)return;let W=M8(U);Q=Q.then(async()=>{if(J)return;try{let V=crypto.getRandomValues(new Uint8Array(12)),T=M8(V),w=await crypto.subtle.encrypt({name:"AES-GCM",iv:T},X,W),k=new Uint8Array(w),v=new Uint8Array(13+k.byteLength);v[0]=1,v.set(V,1),v.set(k,13),_.send(v)}catch{Y()}})},setReceive(U){H=U},close(){Y()}}}class JX{buffer=[];waiters=[];ctrl=new AbortController;cleanup;ended=!1;failure=null;constructor(_){let $=(X)=>{if(this.ended||this.failure)return;let H=this.waiters.shift();if(H){H.resolve({value:X,done:!1});return}this.buffer.push(X)};try{let X=_($,this.ctrl.signal);if(typeof X==="function")this.cleanup=X}catch(X){this.failure=X}}[Symbol.asyncIterator](){return{next:async()=>{if(this.buffer.length>0)return{value:this.buffer.shift(),done:!1};if(this.failure)throw this.failure;if(this.ended)return{value:void 0,done:!0};return new Promise((_,$)=>this.waiters.push({resolve:_,reject:$}))},return:async()=>{return this.dispose(),{value:void 0,done:!0}}}}cancel(){this.dispose()}[Symbol.dispose](){this.dispose()}dispose(){if(this.ended)return;this.ended=!0,this.ctrl.abort();try{this.cleanup?.()}catch{}while(this.waiters.length>0)this.waiters.shift().resolve({value:void 0,done:!0})}}var C_=null;function W8(){if(!C_)C_=host.runtime().then((_)=>_.surface());return C_}function n(_){return W8().then(_).catch(($)=>{if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] surface call failed",$);return})}function B$(_){return W8().then(_)}class T${element;onBoundsChange;observer=null;rafId=0;lastRect={x:0,y:0,width:0,height:0};dirty=!1;stopped=!1;constructor(_,$){this.element=_,this.onBoundsChange=$}start(){this.observer=new ResizeObserver(()=>this.markDirty()),this.observer.observe(this.element),this.scheduleFrame()}stop(){if(this.stopped=!0,this.observer?.disconnect(),this.observer=null,this.rafId)cancelAnimationFrame(this.rafId),this.rafId=0}markDirty(){this.dirty=!0}scheduleFrame(){if(this.stopped)return;this.rafId=requestAnimationFrame(()=>{this.flush(),this.scheduleFrame()})}flush(){let _=window.devicePixelRatio||1,$=this.element.getBoundingClientRect(),X={x:Math.round($.x*_),y:Math.round($.y*_),width:Math.round($.width*_),height:Math.round($.height*_)};if(!this.dirty&&X.x===this.lastRect.x&&X.y===this.lastRect.y&&X.width===this.lastRect.width&&X.height===this.lastRect.height)return;this.dirty=!1,this.lastRect=X,this.onBoundsChange(X)}}class V$ extends HTMLElement{static observedAttributes=["src"];_surfaceId=null;_syncCtrl=null;_initPromise=null;_aborted=!1;_pendingSrc=null;_syncHidden=!1;_userHidden=!1;_layoutObserver=null;_unsubNavigate=null;constructor(){super()}connectedCallback(){this._aborted=!1,this._syncHidden=!1,this._userHidden=!1;let _=new AbortController;this._unsubNavigate=()=>_.abort(),(async()=>{try{let X=(await W8()).didNavigate();for await(let H of X){if(_.signal.aborted)break;if(H.surfaceId===this._surfaceId)this.dispatchEvent(new CustomEvent("did-navigate",{detail:{url:H.url}}))}}catch($){if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] didNavigate stream failed",$)}})(),(async()=>{try{let X=(await W8()).titleChanged();for await(let H of X){if(_.signal.aborted)break;if(H.surfaceId===this._surfaceId)this.dispatchEvent(new CustomEvent("title-changed",{detail:{title:H.title}}))}}catch($){if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] titleChanged stream failed",$)}})(),this._waitForLayout()}_waitForLayout(){if(this._layoutObserver)return;let _=()=>{if(!this.isConnected||this._aborted)return!0;let $=this.getBoundingClientRect();if($.width>0&&$.height>0){if(this.getAttribute("src")||this._pendingSrc||"")this.initSurface();return!0}return!1};requestAnimationFrame(()=>{if(_())return;this._layoutObserver=new ResizeObserver(()=>{if(_())this._layoutObserver?.disconnect(),this._layoutObserver=null}),this._layoutObserver.observe(this)})}disconnectedCallback(){if(this._aborted=!0,this._unsubNavigate?.(),this._unsubNavigate=null,this._layoutObserver?.disconnect(),this._layoutObserver=null,this._syncCtrl?.stop(),this._syncCtrl=null,this._surfaceId!=null){let _=this._surfaceId;this._surfaceId=null,n(($)=>$.remove({surfaceId:_}))}else if(this._initPromise)this._initPromise.then((_)=>{n(($)=>$.remove({surfaceId:_.surfaceId}))}).catch(()=>{});this._initPromise=null}attributeChangedCallback(_,$,X){if(_!=="src")return;if(this._surfaceId!=null){let H=this._surfaceId;n((Q)=>Q.navigate({surfaceId:H,url:X||""}))}else if(this._initPromise)this._pendingSrc=X||"";else if(this.isConnected&&!this._aborted&&X)this._waitForLayout()}setHidden(_){this._userHidden=_,this._applySurfaceHidden()}goBack(){let _=this._surfaceId;if(_!=null)n(($)=>$.goBack({surfaceId:_}))}reload(){let _=this._surfaceId;if(_!=null)n(($)=>$.reload({surfaceId:_}))}navigate(_){this.setAttribute("src",_)}async evaluate(_){let $=this._surfaceId;if($==null)return{ok:!1,code:"not_supported",message:"surface not ready"};return B$((X)=>X.evaluate({surfaceId:$,script:_}))}async capabilities(){let _=this._surfaceId;if(_==null)return{evaluate:!1,crossOriginEval:!1,titleChanged:!1,nativeInputTrusted:!1,click:!1,type:!1,press:!1,scroll:!1,screenshot:!1};return B$(($)=>$.capabilities({surfaceId:_}))}_applySurfaceHidden(){let _=this._surfaceId;if(_==null)return;let $=this._userHidden||this._syncHidden;n((X)=>X.setHidden({surfaceId:_,hidden:$}))}initSurface(){if(this._surfaceId!=null||this._initPromise!=null)return;let _=window.devicePixelRatio||1,$=this.getBoundingClientRect(),X=this._pendingSrc||this.getAttribute("src")||"";this._pendingSrc=null;let H=W8().then((Q)=>Q.init({src:X,x:Math.round($.x*_),y:Math.round($.y*_),width:Math.round($.width*_),height:Math.round($.height*_),hidden:this._userHidden}));this._initPromise=H,H.then((Q)=>{if(this._initPromise!==H)return;if(this._aborted){n((Z)=>Z.remove({surfaceId:Q.surfaceId}));return}if(this._surfaceId=Q.surfaceId,this._userHidden)this._applySurfaceHidden();if(this._pendingSrc!=null){let Z=this._pendingSrc;this._pendingSrc=null;let J=this._surfaceId;if(J!=null)n((Y)=>Y.navigate({surfaceId:J,url:Z}))}this._syncCtrl=new T$(this,(Z)=>{let J=this._surfaceId;if(J==null)return;if(Z.width===0&&Z.height===0){if(!this._syncHidden)this._syncHidden=!0,this._applySurfaceHidden();return}if(this._syncHidden)this._syncHidden=!1,this._applySurfaceHidden();n((U)=>U.resize({surfaceId:J,x:Z.x,y:Z.y,w:Z.width,h:Z.height}))}),this._syncCtrl.start()}).catch(()=>{}).finally(()=>{if(this._initPromise===H)this._initPromise=null})}}if(typeof customElements<"u"){customElements.define("bunite-webview",V$);let _=()=>{n(($)=>$.bringAllVisiblesToFront())};document.addEventListener("pointerdown",_,!0),document.addEventListener("dragstart",()=>{n(($)=>$.setAllPassthrough({passthrough:!0}))},!0),document.addEventListener("dragend",()=>{n(($)=>$.setAllPassthrough({passthrough:!1})),_()},!0)}var E_=null,R8=null;function d8(){if(E_)return Promise.resolve(E_);if(R8)return R8;let _=(async()=>{let $=new WebSocket(`ws://localhost:${__buniteRpcSocketPort}/rpc?webviewId=${__buniteWebviewId}`);$.binaryType="arraybuffer",await new Promise((Z,J)=>{$.addEventListener("open",()=>Z(),{once:!0}),$.addEventListener("error",()=>J(Error("bunite preload ws connect failed")),{once:!0})});let X=Uint8Array.from(atob(__buniteSecretKeyBase64),(Z)=>Z.charCodeAt(0)),H=await P_(V_($),X),Q=B_({transport:T_(H),mode:"native",origin:location.origin});return E_=Q,Q})();return R8=_,_.catch(()=>{if(R8===_)R8=null}),_}var q8=window;q8.__bunite??={};q8.__buniteWebviewId=__buniteWebviewId;q8.__buniteRpcSocketPort=__buniteRpcSocketPort;q8.host??={};q8.host.bootstrap=async(_)=>{return(await d8()).bootstrap(_)};q8.host.runtime=async()=>(await d8()).runtime();q8.host.releaseRef=async(_)=>{(await d8()).releaseRef(_)};q8.host.getConnection=()=>d8();
@@ -72,6 +72,28 @@ export const ShellCap = defineCap("bunite.Shell", {
72
72
 
73
73
  export type SurfaceMask = { x: number; y: number; w: number; h: number };
74
74
 
75
+ /** Automation feature flags reported per surface. Append-only — consumers
76
+ * treat missing fields as `false`. Backend-honest: a method may exist on the
77
+ * RPC surface but return `not_supported` when the backend can't fulfil it. */
78
+ export interface SurfaceCapabilities {
79
+ evaluate: boolean;
80
+ crossOriginEval: boolean;
81
+ titleChanged: boolean;
82
+ /** Stage A: always false. Set true when SendInput focus choreography lands. */
83
+ nativeInputTrusted: boolean;
84
+ click: boolean;
85
+ type: boolean;
86
+ press: boolean;
87
+ scroll: boolean;
88
+ screenshot: boolean;
89
+ /** Present only when `screenshot` is true. */
90
+ formats?: ("png" | "jpeg")[];
91
+ }
92
+
93
+ export type EvaluateResult =
94
+ | { ok: true; value: unknown }
95
+ | { ok: false; code: "cross_origin" | "runtime_error" | "not_supported" | "timeout"; message: string };
96
+
75
97
  export const SurfaceCap = defineCap("bunite.Surface", {
76
98
  init: call<{
77
99
  src: string;
@@ -90,7 +112,10 @@ export const SurfaceCap = defineCap("bunite.Surface", {
90
112
  navigate: call<{ surfaceId: number; url: string }, void>(),
91
113
  goBack: call<{ surfaceId: number }, void>(),
92
114
  reload: call<{ surfaceId: number }, void>(),
115
+ evaluate: call<{ surfaceId: number; script: string }, EvaluateResult>(),
116
+ capabilities: call<{ surfaceId: number }, SurfaceCapabilities>(),
93
117
  didNavigate: stream<void, { surfaceId: number; url: string }>(),
118
+ titleChanged: stream<void, { surfaceId: number; title: string }>(),
94
119
  });
95
120
 
96
121
  export const RuntimeCap = defineCap("bunite.Runtime", {
@@ -1,7 +1,7 @@
1
1
  // <bunite-webview> custom element — registered in every appres:// page via preload.
2
2
 
3
3
  import type { ClientOf } from "../rpc/index";
4
- import type { SurfaceCap } from "../rpc/framework";
4
+ import type { SurfaceCap, EvaluateResult, SurfaceCapabilities } from "../rpc/framework";
5
5
 
6
6
  declare const host: {
7
7
  runtime(): Promise<ClientOf<typeof import("../rpc/framework").RuntimeCap>>;
@@ -25,6 +25,12 @@ function callSurface<R>(fn: (s: SurfaceClient) => Promise<R> | R): Promise<R | v
25
25
  });
26
26
  }
27
27
 
28
+ /** Like `callSurface` but never swallows — automation surface API needs to
29
+ * return structured envelopes so callers can react to surface absence. */
30
+ function callSurfaceTyped<R>(fn: (s: SurfaceClient) => Promise<R> | R): Promise<R> {
31
+ return getSurfaceCap().then(fn);
32
+ }
33
+
28
34
  // OverlaySyncController: ResizeObserver + rAF position polling; dirty-flag coalescing ≤1 IPC/frame.
29
35
 
30
36
  type Rect = { x: number; y: number; width: number; height: number };
@@ -142,6 +148,22 @@ class BuniteWebviewElement extends HTMLElement {
142
148
  }
143
149
  }
144
150
  })();
151
+ void (async () => {
152
+ try {
153
+ const s = await getSurfaceCap();
154
+ const stream = s.titleChanged();
155
+ for await (const ev of stream) {
156
+ if (ctrl.signal.aborted) break;
157
+ if (ev.surfaceId === this._surfaceId) {
158
+ this.dispatchEvent(new CustomEvent("title-changed", { detail: { title: ev.title } }));
159
+ }
160
+ }
161
+ } catch (err) {
162
+ if ((globalThis as { __BUNITE_DEBUG__?: boolean }).__BUNITE_DEBUG__) {
163
+ console.warn("[bunite] titleChanged stream failed", err);
164
+ }
165
+ }
166
+ })();
145
167
  this._waitForLayout();
146
168
  }
147
169
 
@@ -226,6 +248,24 @@ class BuniteWebviewElement extends HTMLElement {
226
248
  this.setAttribute("src", url);
227
249
  }
228
250
 
251
+ async evaluate(script: string): Promise<EvaluateResult> {
252
+ const sid = this._surfaceId;
253
+ if (sid == null) return { ok: false, code: "not_supported", message: "surface not ready" };
254
+ return callSurfaceTyped((s) => s.evaluate({ surfaceId: sid, script }));
255
+ }
256
+
257
+ async capabilities(): Promise<SurfaceCapabilities> {
258
+ const sid = this._surfaceId;
259
+ if (sid == null) {
260
+ return {
261
+ evaluate: false, crossOriginEval: false, titleChanged: false,
262
+ nativeInputTrusted: false, click: false, type: false, press: false,
263
+ scroll: false, screenshot: false,
264
+ };
265
+ }
266
+ return callSurfaceTyped((s) => s.capabilities({ surfaceId: sid }));
267
+ }
268
+
229
269
  private _applySurfaceHidden() {
230
270
  const sid = this._surfaceId;
231
271
  if (sid == null) return;
@@ -117,6 +117,22 @@ function definePolyfillClass(): CustomElementConstructor {
117
117
  this._iframe.style.display = hidden ? "none" : "block";
118
118
  }
119
119
  }
120
+
121
+ // Automation surface — web iframe polyfill is intentionally limited.
122
+ // Sandbox omits `allow-same-origin`, so `contentWindow.eval` would fail even
123
+ // for same-origin URLs. Reporting `evaluate: false` matches reality; callers
124
+ // can opt-in with `<bunite-webview unsandboxed>` and extend this method.
125
+ async evaluate(_script: string) {
126
+ return { ok: false as const, code: "not_supported" as const, message: "iframe polyfill does not support evaluate" };
127
+ }
128
+
129
+ async capabilities() {
130
+ return {
131
+ evaluate: false, crossOriginEval: false, titleChanged: false,
132
+ nativeInputTrusted: false, click: false, type: false, press: false,
133
+ scroll: false, screenshot: false,
134
+ };
135
+ }
120
136
  }
121
137
 
122
138
  cachedClass = BuniteWebviewPolyfill;