local-operator-ui 0.17.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/out/main/index.js +395 -10
  2. package/out/renderer/assets/{_basePickBy-BJr_fQtB.js → _basePickBy-C3hLSrXE.js} +1 -1
  3. package/out/renderer/assets/{_baseUniq-CYir-14_.js → _baseUniq-DvVdHboz.js} +1 -1
  4. package/out/renderer/assets/{agent-details-page-D6PQzszA.js → agent-details-page-6irHwYok.js} +1 -1
  5. package/out/renderer/assets/{agent-hub-page-BU8BMGm-.js → agent-hub-page-t3NZyvhe.js} +1 -1
  6. package/out/renderer/assets/{agents-page-3jWcFYcZ.js → agents-page-Cu3tV_JM.js} +2 -2
  7. package/out/renderer/assets/{architectureDiagram-IEHRJDOE-CCErX8Tf.js → architectureDiagram-IEHRJDOE-Dy32lq21.js} +1 -1
  8. package/out/renderer/assets/{blockDiagram-JOT3LUYC-CUvjtfSj.js → blockDiagram-JOT3LUYC-D9CCHreU.js} +1 -1
  9. package/out/renderer/assets/{c4Diagram-VJAJSXHY-VeJwMCKK.js → c4Diagram-VJAJSXHY-D6JYul4W.js} +1 -1
  10. package/out/renderer/assets/channel-CLzqtgQj.js +1 -0
  11. package/out/renderer/assets/{chunk-4BMEZGHF-3Bq4xtvZ.js → chunk-4BMEZGHF-CWZ3r21W.js} +1 -1
  12. package/out/renderer/assets/{chunk-A2AXSNBT-B3y7xV7i.js → chunk-A2AXSNBT-_jdJLEL4.js} +1 -1
  13. package/out/renderer/assets/{chunk-AEK57VVT-EVfEpH4f.js → chunk-AEK57VVT-BRqxxp9X.js} +1 -1
  14. package/out/renderer/assets/{chunk-D6G4REZN-DMvU3WoU.js → chunk-D6G4REZN-mvuW_LPO.js} +1 -1
  15. package/out/renderer/assets/{chunk-RZ5BOZE2-IvUVaxD4.js → chunk-RZ5BOZE2-B2kzBW8d.js} +1 -1
  16. package/out/renderer/assets/{chunk-XZIHB7SX-qRGLrBmi.js → chunk-XZIHB7SX-CqZmhFu_.js} +1 -1
  17. package/out/renderer/assets/classDiagram-GIVACNV2-Bu04i3t4.js +1 -0
  18. package/out/renderer/assets/classDiagram-v2-COTLJTTW-Bu04i3t4.js +1 -0
  19. package/out/renderer/assets/clone-DHy7FuoP.js +1 -0
  20. package/out/renderer/assets/{compact-pagination-C9MHaQh8.js → compact-pagination-BJa5bxJe.js} +1 -1
  21. package/out/renderer/assets/{dagre-OKDRZEBW-mkOM0foV.js → dagre-OKDRZEBW-BLi9lW3T.js} +1 -1
  22. package/out/renderer/assets/{diagram-SSKATNLV-nPhdvd43.js → diagram-SSKATNLV-DQa3WYjU.js} +1 -1
  23. package/out/renderer/assets/{diagram-VNBRO52H-DwSuRePG.js → diagram-VNBRO52H-C99A8WuH.js} +1 -1
  24. package/out/renderer/assets/{erDiagram-Q7BY3M3F-H_hDC8d0.js → erDiagram-Q7BY3M3F-DLWwdshb.js} +1 -1
  25. package/out/renderer/assets/{flowDiagram-4HSFHLVR-COn1sttR.js → flowDiagram-4HSFHLVR-CHDQ3e9O.js} +1 -1
  26. package/out/renderer/assets/{ganttDiagram-APWFNJXF-DbxYzA4C.js → ganttDiagram-APWFNJXF-G4Rf9Yhs.js} +1 -1
  27. package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-GJA88tpY.js → gitGraphDiagram-7IBYFJ6S-2JN_jG8T.js} +1 -1
  28. package/out/renderer/assets/{graph-CDkZGsbw.js → graph-BR85xHbv.js} +1 -1
  29. package/out/renderer/assets/icon-2KHv58kf.css +1 -0
  30. package/out/renderer/assets/{index-Coj74S4F.js → index-BIyDfbOQ.js} +1 -1
  31. package/out/renderer/assets/{index-DyRL2cJn.js → index-BuhuPWhs.js} +1 -1
  32. package/out/renderer/assets/{index-CVSo1eIn.js → index-_UzVA1oU.js} +279 -278
  33. package/out/renderer/assets/{infoDiagram-PH2N3AL5-DCDmAfuD.js → infoDiagram-PH2N3AL5-xVzynFeN.js} +1 -1
  34. package/out/renderer/assets/{installer-JsKFFZ0N.js → installer-CwpKGBgz.js} +1 -1
  35. package/out/renderer/assets/{journeyDiagram-U35MCT3I-D5zuKm0h.js → journeyDiagram-U35MCT3I-C8-eHlWx.js} +1 -1
  36. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-D28NqnN2.js → kanban-definition-NDS4AKOZ-C2Oyzo6d.js} +1 -1
  37. package/out/renderer/assets/{layout-B__Skqp8.js → layout-mlSyc_4q.js} +1 -1
  38. package/out/renderer/assets/{legacy-agents-page-d_nYp_Kx.js → legacy-agents-page-CTGA2lul.js} +1 -1
  39. package/out/renderer/assets/{mermaid.core-BHfHBA6R.js → mermaid.core-BvFuUEpc.js} +5 -5
  40. package/out/renderer/assets/{mindmap-definition-ALO5MXBD-DKRrQTAb.js → mindmap-definition-ALO5MXBD-DWnloutf.js} +1 -1
  41. package/out/renderer/assets/{page-header-JYwkpfbT.js → page-header-C-9zjakn.js} +1 -1
  42. package/out/renderer/assets/{parseISO-D2eiqdi5.js → parseISO-Bp3fMoKU.js} +1 -1
  43. package/out/renderer/assets/{pieDiagram-IB7DONF6-B1BtzilZ.js → pieDiagram-IB7DONF6-B990Tpnk.js} +1 -1
  44. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-2ZnW_kzE.js → quadrantDiagram-7GDLP6J5-BYeOekBR.js} +1 -1
  45. package/out/renderer/assets/{radar-MK3ICKWK-BxdSoZJX.js → radar-MK3ICKWK-DcxkUK5Z.js} +1 -1
  46. package/out/renderer/assets/{radient-auth-buttons-Bi1-KXYI.js → radient-auth-buttons-CK9Icvbq.js} +1 -1
  47. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-6W-9ZOiF.js → requirementDiagram-KVF5MWMF-D_tf_1lk.js} +1 -1
  48. package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-DsCO-xHN.js → sankeyDiagram-QLVOVGJD-DlDfWN8k.js} +1 -1
  49. package/out/renderer/assets/{schedules-page-BGkrdg_o.js → schedules-page-AQ9gMlkR.js} +1 -1
  50. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-DTsOsVHj.js → sequenceDiagram-X6HHIX6F-wr3-RcoT.js} +1 -1
  51. package/out/renderer/assets/{settings-page-UqW8Dofa.js → settings-page-BSjdxTFW.js} +1 -1
  52. package/out/renderer/assets/{square-pen-DOIqaj9i.js → square-pen-2Yxvf_S9.js} +1 -1
  53. package/out/renderer/assets/{stateDiagram-DGXRK772-Hgu5z66Y.js → stateDiagram-DGXRK772-BLD6Vmgd.js} +1 -1
  54. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CsGkljza.js +1 -0
  55. package/out/renderer/assets/{timeline-definition-BDJGKUSR-BkaQadIG.js → timeline-definition-BDJGKUSR-B-JeF04j.js} +1 -1
  56. package/out/renderer/assets/{use-agent-like-mutation-BSrvgpki.js → use-agent-like-mutation-tstZNIUn.js} +1 -1
  57. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-DuWwCccB.js → xychartDiagram-VJFVF3MP-DuFpzjW6.js} +1 -1
  58. package/out/renderer/index.html +3 -3
  59. package/out/renderer/installer.html +3 -3
  60. package/package.json +2 -2
  61. package/out/renderer/assets/channel-BtWQQlRJ.js +0 -1
  62. package/out/renderer/assets/classDiagram-GIVACNV2-C298zC-3.js +0 -1
  63. package/out/renderer/assets/classDiagram-v2-COTLJTTW-C298zC-3.js +0 -1
  64. package/out/renderer/assets/clone-dCQCshht.js +0 -1
  65. package/out/renderer/assets/icon-DM6KYqqV.css +0 -1
  66. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-BrBwSEFe.js +0 -1
  67. /package/out/renderer/assets/{icon-D9xnujmI.js → icon-2OdwuA9u.js} +0 -0
package/out/main/index.js CHANGED
@@ -457,6 +457,17 @@ const desktopRequestSchema = zod.z.discriminatedUnion("op", [
457
457
  sessionId,
458
458
  completionToken: zod.z.string().uuid()
459
459
  }).strict(),
460
+ // Cross-surface delivery claim, NOT a read receipt. `claim_delivery`
461
+ // serialises the observers that can see one completion (a TUI, this app) so
462
+ // exactly one of them toasts it. It deliberately never advances the read
463
+ // watermark: routing a notification must not clear the sidebar's unseen mark
464
+ // for a session the user never opened, which is why this is its own op and
465
+ // not a reuse of `sessions.seen`.
466
+ zod.z.object({
467
+ op: zod.z.literal("sessions.notified"),
468
+ sessionId,
469
+ completionToken: zod.z.string().uuid()
470
+ }).strict(),
460
471
  zod.z.object({
461
472
  op: zod.z.literal("sessions.watch"),
462
473
  sessionId,
@@ -917,6 +928,12 @@ function desktopEndpoint(request) {
917
928
  method: "POST",
918
929
  body: { completion_token: request.completionToken }
919
930
  };
931
+ case "sessions.notified":
932
+ return {
933
+ path: `/v1/desktop/sessions/${request.sessionId}/notified`,
934
+ method: "POST",
935
+ body: { completion_token: request.completionToken }
936
+ };
920
937
  case "sessions.watch":
921
938
  return {
922
939
  path: `/v1/desktop/sessions/${request.sessionId}/watch`,
@@ -1835,6 +1852,31 @@ class BackendServiceManager {
1835
1852
  /** Survives relay recreation so notifications never silently detach
1836
1853
  * when the backend URL rotates. */
1837
1854
  streamObserver = null;
1855
+ /**
1856
+ * Called every time the backend becomes reachable and authenticated.
1857
+ *
1858
+ * The desktop token is minted inside `start()`, so anything that must query
1859
+ * the backend cannot be issued from `app.whenReady()` — at that point the
1860
+ * port is dead on the ordinary self-managed cold start and the request is
1861
+ * lost. This fires after the health check passes, which is the first moment
1862
+ * `requestDesktop` can succeed.
1863
+ *
1864
+ * It fires AGAIN on every restart and on external-backend discovery, on
1865
+ * purpose: the backend underneath a running app can be replaced by a
1866
+ * different version, and a capability read taken once at startup would
1867
+ * outlive the backend it described.
1868
+ */
1869
+ backendReadyObserver = null;
1870
+ onBackendReady(observer) {
1871
+ this.backendReadyObserver = observer;
1872
+ }
1873
+ notifyBackendReady() {
1874
+ try {
1875
+ this.backendReadyObserver?.();
1876
+ } catch (error) {
1877
+ logger.error("Backend-ready observer threw:", LogFileType.BACKEND, error);
1878
+ }
1879
+ }
1838
1880
  getStreamRelay() {
1839
1881
  if (!this.streamRelay || this.streamRelayUrl !== this.backendUrl) {
1840
1882
  this.streamRelay?.dispose();
@@ -2182,6 +2224,7 @@ class BackendServiceManager {
2182
2224
  LogFileType.BACKEND
2183
2225
  );
2184
2226
  this.isExternalBackend = true;
2227
+ this.notifyBackendReady();
2185
2228
  return true;
2186
2229
  }
2187
2230
  } catch (error) {
@@ -2211,6 +2254,7 @@ class BackendServiceManager {
2211
2254
  LogFileType.BACKEND
2212
2255
  );
2213
2256
  this.isExternalBackend = true;
2257
+ this.notifyBackendReady();
2214
2258
  return true;
2215
2259
  }
2216
2260
  }
@@ -2244,6 +2288,7 @@ class BackendServiceManager {
2244
2288
  "Backend Service Manager is disabled. Skipping backend start.",
2245
2289
  LogFileType.BACKEND
2246
2290
  );
2291
+ this.notifyBackendReady();
2247
2292
  return true;
2248
2293
  }
2249
2294
  if (await this.checkExistingBackend()) {
@@ -2379,6 +2424,7 @@ class BackendServiceManager {
2379
2424
  if (await this.checkHealth()) {
2380
2425
  this.isRunning = true;
2381
2426
  this.startHealthCheck();
2427
+ this.notifyBackendReady();
2382
2428
  return true;
2383
2429
  }
2384
2430
  await new Promise((resolve) => setTimeout(resolve, 1e3));
@@ -3938,6 +3984,21 @@ function registerDesktopIPC(window, expectedUrl, request, streams, media, notifi
3938
3984
  }
3939
3985
  const NOTIFY_TTL_MS = 10 * 60 * 1e3;
3940
3986
  const MAX_DEDUPE_KEYS = 2048;
3987
+ const CONTRACT_PROBE_ATTEMPTS = 3;
3988
+ const CONTRACT_PROBE_RETRY_MS = 250;
3989
+ const MAX_BODY_CHARS = 240;
3990
+ const TRAILING_COLONS = /:+$/;
3991
+ const GATE_BODIES = {
3992
+ ask: "Waiting for your answer",
3993
+ approval: "Waiting for approval"
3994
+ };
3995
+ function gateBody(kind, gateTitle, gateDetail) {
3996
+ let subject = (gateDetail ?? "").trim();
3997
+ if (subject && gateTitle && !subject.toLowerCase().startsWith(gateTitle.toLowerCase())) {
3998
+ subject = `${gateTitle}: ${subject}`.trim().replace(TRAILING_COLONS, "").trim();
3999
+ }
4000
+ return subject || GATE_BODIES[kind] || GATE_BODIES.approval;
4001
+ }
3941
4002
  class DesktopNotifier {
3942
4003
  constructor(window, request) {
3943
4004
  this.window = window;
@@ -3948,9 +4009,163 @@ class DesktopNotifier {
3948
4009
  epochs = /* @__PURE__ */ new Map();
3949
4010
  /** Window state per (window id) used to decide whether a toast is needed. */
3950
4011
  windows = /* @__PURE__ */ new Map();
4012
+ /**
4013
+ * `features.notification_contract` from `/v1/capabilities`; 0 means legacy.
4014
+ *
4015
+ * A HARD switch, not a heuristic. At >= 1 the backend owns every completion
4016
+ * toast and the legacy event path must stay silent or one turn produces two
4017
+ * banners. Absent or unfetchable stays 0 on purpose: a missing capability
4018
+ * response is a transient HTTP failure far more often than it is an old
4019
+ * backend, and failing toward silence would lose completions outright.
4020
+ */
4021
+ notificationContract = 0;
4022
+ /**
4023
+ * The capability read in flight, or the last one that settled.
4024
+ *
4025
+ * `null` only before the first read is ever issued.
4026
+ */
4027
+ contractProbe = null;
4028
+ /**
4029
+ * Generation of the newest capability read, so the LAST-STARTED one wins.
4030
+ *
4031
+ * Probes are not idempotent and they overlap: the backend-ready hook can
4032
+ * fire twice in a tick (external-backend discovery and `start()` both
4033
+ * reported ready), a health-check restart can fire it while an earlier probe
4034
+ * is still retrying, and `awaitContract` starts one of its own. Without this
4035
+ * the shared fields are written by whichever probe SETTLES last, which on a
4036
+ * transient blip is the older read — a successful answer clobbered by a
4037
+ * stale failure, decided by timing rather than by recency (review round 2,
4038
+ * R2-2).
4039
+ *
4040
+ * A superseded probe therefore writes nothing at all and returns. It is not
4041
+ * cancelled — its in-flight `fetch` is left to settle on its own, because
4042
+ * the only cost is one wasted response and the alternative is threading an
4043
+ * `AbortSignal` through the desktop transport for no user-visible gain.
4044
+ */
4045
+ contractGeneration = 0;
4046
+ /**
4047
+ * Whether a capability read has ever come back with a real HTTP answer.
4048
+ *
4049
+ * This is the distinction that closes the double-banner window BY
4050
+ * CONSTRUCTION. A `notificationContract` of 0 has three causes that look
4051
+ * identical on the field alone: the backend answered and has no contract
4052
+ * (old backend, legacy path is correct), nobody has asked yet, and the ask
4053
+ * never reached a backend at all. Only the first is an answer. The other two
4054
+ * are the cold start the review reproduced — the read went to a port nothing
4055
+ * was listening on, was swallowed, and the legacy `agent_end` toast then
4056
+ * fired alongside the composed frame, two banners for one turn.
4057
+ *
4058
+ * So the legacy path re-asks until it has a genuine answer rather than
4059
+ * reading an unanswered 0 as "no contract". Failing toward the legacy path
4060
+ * rather than toward silence (design 4.3) is preserved: once a bounded probe
4061
+ * really has failed at the moment the toast is due, the toast is raised.
4062
+ *
4063
+ * ONCE TRUE THIS AND `notificationContract` MOVE ONLY TOGETHER. A failed
4064
+ * probe that reset the value while leaving this true produced a pair meaning
4065
+ * "we were told there is no contract" when in fact we were told nothing, and
4066
+ * `awaitContract` then declined to re-ask — the double banner returned and
4067
+ * STAYED, every turn, until the next backend bounce (review round 2, R2-1).
4068
+ */
4069
+ contractAnswered = false;
3951
4070
  get canNotify() {
3952
4071
  return electron.Notification.isSupported();
3953
4072
  }
4073
+ /**
4074
+ * Read `features.notification_contract` from the connected backend.
4075
+ *
4076
+ * Call this every time the backend becomes reachable — first start, a health
4077
+ * check restarting it, external-backend discovery rotating the URL. It is
4078
+ * wired to `BackendServiceManager.onBackendReady` for exactly that reason:
4079
+ * issuing it earlier (inside `app.whenReady()`) queries a port nothing is
4080
+ * listening on yet on the ordinary self-managed cold start, and a swallowed
4081
+ * failure there leaves the gate on the legacy path against a backend that
4082
+ * composes — two banners for one turn.
4083
+ *
4084
+ * Re-reading is also the downgrade story the design names (4.3): an app
4085
+ * pointed from a new backend at an old one re-reads 0 and gets its legacy
4086
+ * completion signal back. The previous one-way latch could not do that.
4087
+ *
4088
+ * A throw or a non-200 after the bounded retry leaves the gate at 0, which
4089
+ * is the legacy path rather than silence: see `notificationContract`.
4090
+ */
4091
+ refreshNotificationContract() {
4092
+ const generation = ++this.contractGeneration;
4093
+ const probe = this.probeNotificationContract(generation);
4094
+ this.contractProbe = probe;
4095
+ return probe;
4096
+ }
4097
+ async probeNotificationContract(generation) {
4098
+ for (let attempt = 0; attempt < CONTRACT_PROBE_ATTEMPTS; attempt++) {
4099
+ let response = null;
4100
+ try {
4101
+ response = await this.request({ op: "capabilities" });
4102
+ } catch {
4103
+ }
4104
+ if (generation !== this.contractGeneration) return;
4105
+ if (response?.status === 200) {
4106
+ const body = response.body;
4107
+ this.applyNotificationContract(
4108
+ body?.result?.features?.notification_contract
4109
+ );
4110
+ this.contractAnswered = true;
4111
+ return;
4112
+ }
4113
+ if (attempt + 1 < CONTRACT_PROBE_ATTEMPTS) {
4114
+ await new Promise(
4115
+ (resolve) => setTimeout(resolve, CONTRACT_PROBE_RETRY_MS)
4116
+ );
4117
+ if (generation !== this.contractGeneration) return;
4118
+ }
4119
+ }
4120
+ }
4121
+ /**
4122
+ * Block until a capability read has ANSWERED against the current backend,
4123
+ * or until a fresh bounded probe has failed here and now.
4124
+ *
4125
+ * Issuing the probe itself when none has answered is what makes the legacy
4126
+ * path safe by construction rather than by call-site discipline. The failure
4127
+ * the review reproduced is a read fired before the backend existed: it is
4128
+ * not enough to move that call later, because any read can lose its race
4129
+ * with a backend that is still starting, and a swallowed one leaves a 0 that
4130
+ * reads exactly like an old backend. Re-asking at the moment the answer is
4131
+ * actually needed cannot be beaten by a slow start.
4132
+ *
4133
+ * Loops rather than awaiting once because a backend rotation can start a
4134
+ * new probe while we are waiting on the old one, and the legacy path must
4135
+ * never be decided on the previous backend's answer.
4136
+ */
4137
+ async awaitContract() {
4138
+ if (!this.contractAnswered) this.refreshNotificationContract();
4139
+ let awaited = null;
4140
+ while (this.contractProbe !== awaited) {
4141
+ awaited = this.contractProbe;
4142
+ await awaited;
4143
+ }
4144
+ }
4145
+ /**
4146
+ * Record the contract version a backend reported.
4147
+ *
4148
+ * Being told the value directly IS an answer, so this also stops the legacy
4149
+ * path issuing a probe of its own and overwriting it.
4150
+ *
4151
+ * Bumps the generation for the same reason a probe does: this is the newest
4152
+ * reading of the backend, so an older probe still in flight must not settle
4153
+ * on top of it.
4154
+ */
4155
+ setNotificationContract(version2) {
4156
+ this.contractGeneration++;
4157
+ this.applyNotificationContract(version2);
4158
+ this.contractAnswered = true;
4159
+ }
4160
+ /**
4161
+ * Normalise a reported contract value. Both callers are ANSWERS and both
4162
+ * set `contractAnswered` themselves; nothing else may write this field.
4163
+ * That invariant is the fix for R2-1, so a third caller that resets the
4164
+ * value without answering re-opens it.
4165
+ */
4166
+ applyNotificationContract(version2) {
4167
+ this.notificationContract = typeof version2 === "number" && Number.isFinite(version2) && version2 > 0 ? version2 : 0;
4168
+ }
3954
4169
  /**
3955
4170
  * Renderer heartbeat. Forwarded to the backend as the watch lease for the
3956
4171
  * renderer's active subscription; `can_notify` is asserted only when main
@@ -3979,21 +4194,103 @@ class DesktopNotifier {
3979
4194
  if (frame.type === "snapshot") {
3980
4195
  this.epochs.set(sessionId2, frame.payload.frontend.epoch);
3981
4196
  const gate = frame.payload.frontend.snapshot.pending_gate;
3982
- if (gate) this.gate(sessionId2, gate.request_id, gate.title, gate.detail);
4197
+ if (gate) this.gate(sessionId2, gate);
3983
4198
  return;
3984
4199
  }
3985
4200
  if (frame.type === "frontend.update") {
3986
4201
  this.epochs.set(sessionId2, frame.payload.epoch);
3987
4202
  const gate = frame.payload.changes.pending_gate;
3988
- if (gate) this.gate(sessionId2, gate.request_id, gate.title, gate.detail);
4203
+ if (gate) this.gate(sessionId2, gate);
4204
+ return;
4205
+ }
4206
+ if (frame.type === "notification") {
4207
+ void this.composed(sessionId2, frame.payload);
3989
4208
  return;
3990
4209
  }
3991
4210
  if (frame.type === "event") {
3992
- const eventType = String(frame.payload.type ?? "");
3993
- if (eventType === "agent_end" || eventType === "turn_end") {
3994
- this.turn(sessionId2, frame.seq);
4211
+ if (String(frame.payload.type ?? "") !== "agent_end") return;
4212
+ void this.legacyTurn(sessionId2, frame.seq);
4213
+ }
4214
+ }
4215
+ /**
4216
+ * The legacy completion toast, raised only against a backend that composes
4217
+ * none of its own.
4218
+ *
4219
+ * DEFERRED, never raced. A backend advertising `notification_contract` owns
4220
+ * every completion toast, so this must stay silent against it or the user
4221
+ * gets two banners for one turn: the legacy one here plus the composed frame.
4222
+ * `agent_end` is published the moment the turn's last model call returns,
4223
+ * while the composed frame follows from the backend's 1 s attention poll
4224
+ * (design 6.1) — so the event reliably arrives FIRST, and any check that
4225
+ * reacts to a frame already in hand closes the window one frame too late.
4226
+ * Waiting for the capability read to settle is what closes it by
4227
+ * construction. The wait is bounded by `CONTRACT_PROBE_*` and only ever
4228
+ * applies before the first answer of a run.
4229
+ *
4230
+ * `agent_end` survives on this path only because dropping it too would leave
4231
+ * an old backend with no completion signal at all. It is still wrong (it
4232
+ * arrives while `task` children run), which is exactly what the
4233
+ * backend-composed path fixes. The event itself is NEVER filtered out of the
4234
+ * stream: the transcript reducer settles on it.
4235
+ */
4236
+ async legacyTurn(sessionId2, seq) {
4237
+ await this.awaitContract();
4238
+ if (this.notificationContract > 0) return;
4239
+ this.turn(sessionId2, seq);
4240
+ }
4241
+ /**
4242
+ * Deliver one backend-composed notification.
4243
+ *
4244
+ * The order of these four checks is load-bearing and is the whole of 7.3.
4245
+ * Dedupe and the focus gate run BEFORE the claim so a toast we are not going
4246
+ * to show never burns the cross-surface claim; the claim runs immediately
4247
+ * before delivery so the claimant really is the deliverer.
4248
+ */
4249
+ async composed(sessionId2, n) {
4250
+ if (!this.claim(n.dedupe_key)) return;
4251
+ if (n.focus_policy === "when_unfocused" && this.anyFocused()) return;
4252
+ if (n.completion_token) {
4253
+ const outcome = await this.claimDelivery(sessionId2, n.completion_token);
4254
+ if (outcome !== "won") {
4255
+ if (outcome === "failed") this.delivered.delete(n.dedupe_key);
4256
+ return;
3995
4257
  }
3996
4258
  }
4259
+ this.show(
4260
+ sessionId2,
4261
+ n.title,
4262
+ n.status,
4263
+ n.body,
4264
+ n.body_is_snippet,
4265
+ n.body_is_failure ?? false
4266
+ );
4267
+ }
4268
+ /**
4269
+ * Ask the backend whether this surface owns this completion's toast.
4270
+ *
4271
+ * Fails CLOSED on the TOAST: neither `lost` nor `failed` shows anything,
4272
+ * because the failure mode of failing open is the duplicate banner on every
4273
+ * surface this whole mechanism exists to prevent.
4274
+ *
4275
+ * The two non-winning outcomes are still reported separately, because they
4276
+ * differ in who owns the completion afterwards. `lost` means the backend
4277
+ * answered and another surface has it. `failed` means the backend was never
4278
+ * reached or never answered cleanly, so nothing was claimed anywhere and the
4279
+ * completion is still owed to somebody — see the caller.
4280
+ */
4281
+ async claimDelivery(sessionId2, completionToken) {
4282
+ try {
4283
+ const response = await this.request({
4284
+ op: "sessions.notified",
4285
+ sessionId: sessionId2,
4286
+ completionToken
4287
+ });
4288
+ if (response.status !== 200) return "failed";
4289
+ const body = response.body;
4290
+ return body?.result?.claimed === true ? "won" : "lost";
4291
+ } catch {
4292
+ return "failed";
4293
+ }
3997
4294
  }
3998
4295
  anyFocused() {
3999
4296
  for (const state of this.windows.values()) {
@@ -4001,16 +4298,59 @@ class DesktopNotifier {
4001
4298
  }
4002
4299
  return false;
4003
4300
  }
4004
- gate(sessionId2, requestId2, title, detail) {
4301
+ /**
4302
+ * Raise the banner for a pending approval or question.
4303
+ *
4304
+ * A gate is worth a toast even when the window is focused: the user may be
4305
+ * reading another conversation in the same window.
4306
+ *
4307
+ * When the backend supplies `session_name`, the banner takes the SHAPE of a
4308
+ * completion banner — session name as the title, the gate's own title
4309
+ * leading the detail. Without it, a gate named only its category while
4310
+ * completions named their session, so the banner a user can safely ignore
4311
+ * identified itself and the banner holding a run hostage did not; with two
4312
+ * or three sessions running, that one cannot be triaged without clicking,
4313
+ * which is the action the user was deciding whether to take.
4314
+ *
4315
+ * The name is rendered ONLY as the backend sent it. `session_name` is
4316
+ * additive and optional: it is absent on an older backend and empty when the
4317
+ * `session_names_in_notifications()` privacy flag is off. The backend owns
4318
+ * that decision because only it can read the flag, so this app must never
4319
+ * resolve the name from a snapshot instead — doing so would leak a name the
4320
+ * user opted out of, on every gate, forever.
4321
+ */
4322
+ gate(sessionId2, gate) {
4323
+ const { request_id: requestId2, kind, title, detail } = gate;
4005
4324
  const key = `gate:${sessionId2}:${this.epochs.get(sessionId2) ?? ""}:${requestId2}`;
4006
4325
  if (!this.claim(key)) return;
4007
- this.show(sessionId2, title || "Approval needed", detail);
4326
+ const fallback = kind === "ask" ? "Question" : "Approval needed";
4327
+ const sessionName = gate.session_name?.trim() || "";
4328
+ if (!sessionName) {
4329
+ this.show(
4330
+ sessionId2,
4331
+ title.trim() || fallback,
4332
+ "",
4333
+ gateBody(kind, "", detail)
4334
+ );
4335
+ return;
4336
+ }
4337
+ this.show(
4338
+ sessionId2,
4339
+ sessionName,
4340
+ "",
4341
+ gateBody(kind, title.trim() || fallback, detail)
4342
+ );
4008
4343
  }
4344
+ /**
4345
+ * Legacy completion toast: canned copy, reached only against a backend that
4346
+ * does not advertise `notification_contract`. Keyed on `session:epoch:seq`
4347
+ * as it always was — an old backend mints no `dedupe_key` to key on.
4348
+ */
4009
4349
  turn(sessionId2, seq) {
4010
4350
  const key = `turn:${sessionId2}:${this.epochs.get(sessionId2) ?? ""}:${seq}`;
4011
4351
  if (!this.claim(key)) return;
4012
4352
  if (this.anyFocused()) return;
4013
- this.show(sessionId2, "Turn complete", "The agent finished its turn.");
4353
+ this.show(sessionId2, "Turn complete", "", "The agent finished its turn.");
4014
4354
  }
4015
4355
  claim(key) {
4016
4356
  const now = Date.now();
@@ -4023,10 +4363,52 @@ class DesktopNotifier {
4023
4363
  }
4024
4364
  return true;
4025
4365
  }
4026
- show(sessionId2, title, body) {
4366
+ /**
4367
+ * Render one toast.
4368
+ *
4369
+ * `status` leads the body rather than riding `subtitle`. Electron's
4370
+ * `subtitle` option is documented macOS-only, so on Windows and Linux the
4371
+ * state category would simply vanish and those users would read a bare
4372
+ * snippet with no indication of whether the turn succeeded or failed. One
4373
+ * shape that degrades on no platform beats a second, platform-forked one.
4374
+ * The strings themselves are the backend's, unchanged; only the join is ours.
4375
+ *
4376
+ * The design doc's stated reason for keeping the status out of the title —
4377
+ * "macOS clips a title at ~43 characters" — is FALSE on a current macOS
4378
+ * banner: rendered frames show an 80-character title wrapping across two
4379
+ * lines, not clipping (design review round 1). The real constraint is a
4380
+ * total budget of roughly five text lines for title and body together, after
4381
+ * which macOS truncates the BODY with its own ellipsis. That is why the join
4382
+ * is spent sparingly below.
4383
+ *
4384
+ * WHETHER THE BODY NAMES THE OUTCOME ITSELF decides whether the status earns
4385
+ * its place, and the backend sends two flags for the two kinds of body that
4386
+ * do not. A model-written snippet describes the work, and the session's own
4387
+ * recorded failure text describes the cause ("anthropic: 429
4388
+ * rate_limit_error - credit balance too low"); neither says whether the turn
4389
+ * succeeded, so the category in front of it is the only thing that does. The
4390
+ * house bodies ("Task complete", "Stopped with an error") already name the
4391
+ * state, so prefixing them renders "Complete — Task complete": one fact
4392
+ * asserted twice in the two lines a banner gets, which is what every user
4393
+ * with the session-name privacy flag off would have received.
4394
+ *
4395
+ * Reading only `body_is_snippet` split the world in two where the backend
4396
+ * made it three, and it inverted the intent of the failure text (design
4397
+ * round 1, D4): a raw 429 envelope under a session name reads as routine log
4398
+ * noise, so the ONE banner that demands action was the one that never said
4399
+ * anything had gone wrong — and it was worse with the privacy flag ON (the
4400
+ * default, which is what produces the failure text) than off, where the user
4401
+ * at least got "Stopped with an error" (QA round 1, Q-1).
4402
+ *
4403
+ * These are the backend's own flags for exactly this difference, so this app
4404
+ * still re-words nothing (design 8.4). Gates pass `status = ""` and are
4405
+ * unaffected either way.
4406
+ */
4407
+ show(sessionId2, title, status, body, isSnippet = false, isFailure = false) {
4408
+ const lead = (isSnippet || isFailure) && status ? `${status} — ` : "";
4027
4409
  const notification = new electron.Notification({
4028
4410
  title,
4029
- body: body.slice(0, 240),
4411
+ body: `${lead}${body}`.slice(0, MAX_BODY_CHARS),
4030
4412
  silent: false
4031
4413
  });
4032
4414
  notification.on("click", () => {
@@ -5433,6 +5815,9 @@ electron.app.whenReady().then(async () => {
5433
5815
  (input) => backendService.requestDesktop(input)
5434
5816
  );
5435
5817
  const desktopNotifier = new DesktopNotifier(() => mainWindow, sendDesktop);
5818
+ backendService.onBackendReady(() => {
5819
+ void desktopNotifier.refreshNotificationContract();
5820
+ });
5436
5821
  backendService.observeStream((sessionId2, data) => {
5437
5822
  try {
5438
5823
  desktopNotifier.observe(sessionId2, JSON.parse(data));
@@ -1 +1 @@
1
- import{e as o,c as b,g as v,k as O,h as P,j as p,l as w,m as A,n as x,t as c,o as N}from"./_baseUniq-CYir-14_.js";import{as as g,aa as y,at as E,au as F,av as M,aw as I,ax as _,ay as $,az as B,aA as T}from"./mermaid.core-BHfHBA6R.js";var S=/\s/;function z(n){for(var r=n.length;r--&&S.test(n.charAt(r)););return r}var G=/^\s+/;function H(n){return n&&n.slice(0,z(n)+1).replace(G,"")}var m=NaN,L=/^[-+]0x[0-9a-f]+$/i,R=/^0b[01]+$/i,q=/^0o[0-7]+$/i,C=parseInt;function K(n){if(typeof n=="number")return n;if(o(n))return m;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=H(n);var t=R.test(n);return t||q.test(n)?C(n.slice(2),t?2:8):L.test(n)?m:+n}var W=1/0,X=17976931348623157e292;function Y(n){if(!n)return n===0?n:0;if(n=K(n),n===W||n===-1/0){var r=n<0?-1:1;return r*X}return n===n?n:0}function D(n){var r=Y(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?b(n):[]}var l=Object.prototype,J=l.hasOwnProperty,dn=y(function(n,r){n=Object(n);var t=-1,e=r.length,a=e>2?r[2]:void 0;for(a&&E(r[0],r[1],a)&&(e=1);++t<e;)for(var f=r[t],i=F(f),s=-1,d=i.length;++s<d;){var u=i[s],h=n[u];(h===void 0||M(h,l[u])&&!J.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function Q(n){return function(r,t,e){var a=Object(r);if(!I(r)){var f=v(t);r=O(r),t=function(s){return f(a[s],s,a)}}var i=n(r,t,e);return i>-1?a[f?r[i]:i]:void 0}}var U=Math.max;function Z(n,r,t){var e=n==null?0:n.length;if(!e)return-1;var a=t==null?0:D(t);return a<0&&(a=U(e+a,0)),P(n,v(r),a)}var hn=Q(Z);function V(n,r){var t=-1,e=I(n)?Array(n.length):[];return p(n,function(a,f,i){e[++t]=r(a,f,i)}),e}function gn(n,r){var t=_(n)?w:V;return t(n,v(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function vn(n,r){return n!=null&&A(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var e=-1,a=n.length;++e<a;){var f=n[e],i=r(f);if(i!=null&&(s===void 0?i===i&&!o(i):t(i,s)))var s=i,d=f}return d}function mn(n){return n&&n.length?tn(n,$,rn):void 0}function an(n,r,t,e){if(!g(n))return n;r=x(r,n);for(var a=-1,f=r.length,i=f-1,s=n;s!=null&&++a<f;){var d=c(r[a]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(a!=i){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:B(r[a+1])?[]:{})}T(s,d,u),s=s[d]}return n}function on(n,r,t){for(var e=-1,a=r.length,f={};++e<a;){var i=r[e],s=N(n,i);t(s,i)&&an(f,x(i,n),s)}return f}export{rn as a,tn as b,V as c,on as d,mn as e,fn as f,hn as g,vn as h,dn as i,D as j,un as l,gn as m,Y as t};
1
+ import{e as o,c as b,g as v,k as O,h as P,j as p,l as w,m as A,n as x,t as c,o as N}from"./_baseUniq-DvVdHboz.js";import{as as g,aa as y,at as E,au as F,av as M,aw as I,ax as _,ay as $,az as B,aA as T}from"./mermaid.core-BvFuUEpc.js";var S=/\s/;function z(n){for(var r=n.length;r--&&S.test(n.charAt(r)););return r}var G=/^\s+/;function H(n){return n&&n.slice(0,z(n)+1).replace(G,"")}var m=NaN,L=/^[-+]0x[0-9a-f]+$/i,R=/^0b[01]+$/i,q=/^0o[0-7]+$/i,C=parseInt;function K(n){if(typeof n=="number")return n;if(o(n))return m;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=H(n);var t=R.test(n);return t||q.test(n)?C(n.slice(2),t?2:8):L.test(n)?m:+n}var W=1/0,X=17976931348623157e292;function Y(n){if(!n)return n===0?n:0;if(n=K(n),n===W||n===-1/0){var r=n<0?-1:1;return r*X}return n===n?n:0}function D(n){var r=Y(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?b(n):[]}var l=Object.prototype,J=l.hasOwnProperty,dn=y(function(n,r){n=Object(n);var t=-1,e=r.length,a=e>2?r[2]:void 0;for(a&&E(r[0],r[1],a)&&(e=1);++t<e;)for(var f=r[t],i=F(f),s=-1,d=i.length;++s<d;){var u=i[s],h=n[u];(h===void 0||M(h,l[u])&&!J.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function Q(n){return function(r,t,e){var a=Object(r);if(!I(r)){var f=v(t);r=O(r),t=function(s){return f(a[s],s,a)}}var i=n(r,t,e);return i>-1?a[f?r[i]:i]:void 0}}var U=Math.max;function Z(n,r,t){var e=n==null?0:n.length;if(!e)return-1;var a=t==null?0:D(t);return a<0&&(a=U(e+a,0)),P(n,v(r),a)}var hn=Q(Z);function V(n,r){var t=-1,e=I(n)?Array(n.length):[];return p(n,function(a,f,i){e[++t]=r(a,f,i)}),e}function gn(n,r){var t=_(n)?w:V;return t(n,v(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function vn(n,r){return n!=null&&A(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var e=-1,a=n.length;++e<a;){var f=n[e],i=r(f);if(i!=null&&(s===void 0?i===i&&!o(i):t(i,s)))var s=i,d=f}return d}function mn(n){return n&&n.length?tn(n,$,rn):void 0}function an(n,r,t,e){if(!g(n))return n;r=x(r,n);for(var a=-1,f=r.length,i=f-1,s=n;s!=null&&++a<f;){var d=c(r[a]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(a!=i){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:B(r[a+1])?[]:{})}T(s,d,u),s=s[d]}return n}function on(n,r,t){for(var e=-1,a=r.length,f={};++e<a;){var i=r[e],s=N(n,i);t(s,i)&&an(f,x(i,n),s)}return f}export{rn as a,tn as b,V as c,on as d,mn as e,fn as f,hn as g,vn as h,dn as i,D as j,un as l,gn as m,Y as t};
@@ -1 +1 @@
1
- import{aH as S,aI as Rn,ax as T,aJ as w,aK as xn,aL as Mn,aw as sn,aM as mn,aN as un,aO as x,au as U,aP as Cn,aQ as on,aR as Fn,aS as E,aF as gn,aT as R,as as ln,aU as Dn,aV as D,aW as Gn,aX as Un,aY as _,aA as Nn,aZ as Bn,av as Kn,a_ as X,a$ as Hn,b0 as jn,az as Yn,ay as cn,aD as Zn,b1 as m}from"./mermaid.core-BHfHBA6R.js";var qn="[object Symbol]";function N(n){return typeof n=="symbol"||S(n)&&Rn(n)==qn}function dn(n,r){for(var e=-1,t=n==null?0:n.length,a=Array(t);++e<t;)a[e]=r(n[e],e,n);return a}var J=w?w.prototype:void 0,Q=J?J.toString:void 0;function pn(n){if(typeof n=="string")return n;if(T(n))return dn(n,pn)+"";if(N(n))return Q?Q.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Xn(){}function An(n,r){for(var e=-1,t=n==null?0:n.length;++e<t&&r(n[e],e,n)!==!1;);return n}function Jn(n,r,e,t){for(var a=n.length,i=e+-1;++i<a;)if(r(n[i],i,n))return i;return-1}function Qn(n){return n!==n}function Wn(n,r,e){for(var t=e-1,a=n.length;++t<a;)if(n[t]===r)return t;return-1}function zn(n,r,e){return r===r?Wn(n,r,e):Jn(n,Qn,e)}function Vn(n,r){var e=n==null?0:n.length;return!!e&&zn(n,r,0)>-1}function $(n){return sn(n)?xn(n):Mn(n)}var kn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nr=/^\w*$/;function B(n,r){if(T(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||N(n)?!0:nr.test(n)||!kn.test(n)||r!=null&&n in Object(r)}var rr=500;function er(n){var r=mn(n,function(t){return e.size===rr&&e.clear(),t}),e=r.cache;return r}var tr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ir=/\\(\\)?/g,ar=er(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(tr,function(e,t,a,i){r.push(a?i.replace(ir,"$1"):t||e)}),r});function fr(n){return n==null?"":pn(n)}function yn(n,r){return T(n)?n:B(n,r)?[n]:ar(fr(n))}function M(n){if(typeof n=="string"||N(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function bn(n,r){r=yn(r,n);for(var e=0,t=r.length;n!=null&&e<t;)n=n[M(r[e++])];return e&&e==t?n:void 0}function sr(n,r,e){var t=n==null?void 0:bn(n,r);return t===void 0?e:t}function K(n,r){for(var e=-1,t=r.length,a=n.length;++e<t;)n[a+e]=r[e];return n}var W=w?w.isConcatSpreadable:void 0;function ur(n){return T(n)||un(n)||!!(W&&n&&n[W])}function Ot(n,r,e,t,a){var i=-1,f=n.length;for(e||(e=ur),a||(a=[]);++i<f;){var s=n[i];e(s)?K(a,s):t||(a[a.length]=s)}return a}function or(n,r,e,t){var a=-1,i=n==null?0:n.length;for(t&&i&&(e=n[++a]);++a<i;)e=r(e,n[a],a,n);return e}function gr(n,r){return n&&x(r,$(r),n)}function lr(n,r){return n&&x(r,U(r),n)}function Tn(n,r){for(var e=-1,t=n==null?0:n.length,a=0,i=[];++e<t;){var f=n[e];r(f,e,n)&&(i[a++]=f)}return i}function hn(){return[]}var cr=Object.prototype,dr=cr.propertyIsEnumerable,z=Object.getOwnPropertySymbols,H=z?function(n){return n==null?[]:(n=Object(n),Tn(z(n),function(r){return dr.call(n,r)}))}:hn;function pr(n,r){return x(n,H(n),r)}var Ar=Object.getOwnPropertySymbols,wn=Ar?function(n){for(var r=[];n;)K(r,H(n)),n=Cn(n);return r}:hn;function yr(n,r){return x(n,wn(n),r)}function On(n,r,e){var t=r(n);return T(n)?t:K(t,e(n))}function G(n){return On(n,$,H)}function br(n){return On(n,U,wn)}var Tr=Object.prototype,hr=Tr.hasOwnProperty;function wr(n){var r=n.length,e=new n.constructor(r);return r&&typeof n[0]=="string"&&hr.call(n,"index")&&(e.index=n.index,e.input=n.input),e}function Or(n,r){var e=r?on(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}var $r=/\w*$/;function _r(n){var r=new n.constructor(n.source,$r.exec(n));return r.lastIndex=n.lastIndex,r}var V=w?w.prototype:void 0,k=V?V.valueOf:void 0;function Sr(n){return k?Object(k.call(n)):{}}var Er="[object Boolean]",Ir="[object Date]",Pr="[object Map]",vr="[object Number]",Lr="[object RegExp]",Rr="[object Set]",xr="[object String]",Mr="[object Symbol]",mr="[object ArrayBuffer]",Cr="[object DataView]",Fr="[object Float32Array]",Dr="[object Float64Array]",Gr="[object Int8Array]",Ur="[object Int16Array]",Nr="[object Int32Array]",Br="[object Uint8Array]",Kr="[object Uint8ClampedArray]",Hr="[object Uint16Array]",jr="[object Uint32Array]";function Yr(n,r,e){var t=n.constructor;switch(r){case mr:return on(n);case Er:case Ir:return new t(+n);case Cr:return Or(n,e);case Fr:case Dr:case Gr:case Ur:case Nr:case Br:case Kr:case Hr:case jr:return Fn(n,e);case Pr:return new t;case vr:case xr:return new t(n);case Lr:return _r(n);case Rr:return new t;case Mr:return Sr(n)}}var Zr="[object Map]";function qr(n){return S(n)&&E(n)==Zr}var nn=R&&R.isMap,Xr=nn?gn(nn):qr,Jr="[object Set]";function Qr(n){return S(n)&&E(n)==Jr}var rn=R&&R.isSet,Wr=rn?gn(rn):Qr,zr=1,Vr=2,kr=4,$n="[object Arguments]",ne="[object Array]",re="[object Boolean]",ee="[object Date]",te="[object Error]",_n="[object Function]",ie="[object GeneratorFunction]",ae="[object Map]",fe="[object Number]",Sn="[object Object]",se="[object RegExp]",ue="[object Set]",oe="[object String]",ge="[object Symbol]",le="[object WeakMap]",ce="[object ArrayBuffer]",de="[object DataView]",pe="[object Float32Array]",Ae="[object Float64Array]",ye="[object Int8Array]",be="[object Int16Array]",Te="[object Int32Array]",he="[object Uint8Array]",we="[object Uint8ClampedArray]",Oe="[object Uint16Array]",$e="[object Uint32Array]",g={};g[$n]=g[ne]=g[ce]=g[de]=g[re]=g[ee]=g[pe]=g[Ae]=g[ye]=g[be]=g[Te]=g[ae]=g[fe]=g[Sn]=g[se]=g[ue]=g[oe]=g[ge]=g[he]=g[we]=g[Oe]=g[$e]=!0;g[te]=g[_n]=g[le]=!1;function C(n,r,e,t,a,i){var f,s=r&zr,u=r&Vr,d=r&kr;if(f!==void 0)return f;if(!ln(n))return n;var l=T(n);if(l){if(f=wr(n),!s)return Dn(n,f)}else{var o=E(n),c=o==_n||o==ie;if(D(n))return Gn(n,s);if(o==Sn||o==$n||c&&!a){if(f=u||c?{}:Un(n),!s)return u?yr(n,lr(f,n)):pr(n,gr(f,n))}else{if(!g[o])return a?n:{};f=Yr(n,o,s)}}i||(i=new _);var h=i.get(n);if(h)return h;i.set(n,f),Wr(n)?n.forEach(function(p){f.add(C(p,r,e,p,n,i))}):Xr(n)&&n.forEach(function(p,A){f.set(A,C(p,r,e,A,n,i))});var y=d?u?br:G:u?U:$,b=l?void 0:y(n);return An(b||n,function(p,A){b&&(A=p,p=n[A]),Nn(f,A,C(p,r,e,A,n,i))}),f}var _e="__lodash_hash_undefined__";function Se(n){return this.__data__.set(n,_e),this}function Ee(n){return this.__data__.has(n)}function I(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new Bn;++r<e;)this.add(n[r])}I.prototype.add=I.prototype.push=Se;I.prototype.has=Ee;function Ie(n,r){for(var e=-1,t=n==null?0:n.length;++e<t;)if(r(n[e],e,n))return!0;return!1}function En(n,r){return n.has(r)}var Pe=1,ve=2;function In(n,r,e,t,a,i){var f=e&Pe,s=n.length,u=r.length;if(s!=u&&!(f&&u>s))return!1;var d=i.get(n),l=i.get(r);if(d&&l)return d==r&&l==n;var o=-1,c=!0,h=e&ve?new I:void 0;for(i.set(n,r),i.set(r,n);++o<s;){var y=n[o],b=r[o];if(t)var p=f?t(b,y,o,r,n,i):t(y,b,o,n,r,i);if(p!==void 0){if(p)continue;c=!1;break}if(h){if(!Ie(r,function(A,O){if(!En(h,O)&&(y===A||a(y,A,e,t,i)))return h.push(O)})){c=!1;break}}else if(!(y===b||a(y,b,e,t,i))){c=!1;break}}return i.delete(n),i.delete(r),c}function Le(n){var r=-1,e=Array(n.size);return n.forEach(function(t,a){e[++r]=[a,t]}),e}function j(n){var r=-1,e=Array(n.size);return n.forEach(function(t){e[++r]=t}),e}var Re=1,xe=2,Me="[object Boolean]",me="[object Date]",Ce="[object Error]",Fe="[object Map]",De="[object Number]",Ge="[object RegExp]",Ue="[object Set]",Ne="[object String]",Be="[object Symbol]",Ke="[object ArrayBuffer]",He="[object DataView]",en=w?w.prototype:void 0,F=en?en.valueOf:void 0;function je(n,r,e,t,a,i,f){switch(e){case He:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case Ke:return!(n.byteLength!=r.byteLength||!i(new X(n),new X(r)));case Me:case me:case De:return Kn(+n,+r);case Ce:return n.name==r.name&&n.message==r.message;case Ge:case Ne:return n==r+"";case Fe:var s=Le;case Ue:var u=t&Re;if(s||(s=j),n.size!=r.size&&!u)return!1;var d=f.get(n);if(d)return d==r;t|=xe,f.set(n,r);var l=In(s(n),s(r),t,a,i,f);return f.delete(n),l;case Be:if(F)return F.call(n)==F.call(r)}return!1}var Ye=1,Ze=Object.prototype,qe=Ze.hasOwnProperty;function Xe(n,r,e,t,a,i){var f=e&Ye,s=G(n),u=s.length,d=G(r),l=d.length;if(u!=l&&!f)return!1;for(var o=u;o--;){var c=s[o];if(!(f?c in r:qe.call(r,c)))return!1}var h=i.get(n),y=i.get(r);if(h&&y)return h==r&&y==n;var b=!0;i.set(n,r),i.set(r,n);for(var p=f;++o<u;){c=s[o];var A=n[c],O=r[c];if(t)var q=f?t(O,A,c,r,n,i):t(A,O,c,n,r,i);if(!(q===void 0?A===O||a(A,O,e,t,i):q)){b=!1;break}p||(p=c=="constructor")}if(b&&!p){var P=n.constructor,v=r.constructor;P!=v&&"constructor"in n&&"constructor"in r&&!(typeof P=="function"&&P instanceof P&&typeof v=="function"&&v instanceof v)&&(b=!1)}return i.delete(n),i.delete(r),b}var Je=1,tn="[object Arguments]",an="[object Array]",L="[object Object]",Qe=Object.prototype,fn=Qe.hasOwnProperty;function We(n,r,e,t,a,i){var f=T(n),s=T(r),u=f?an:E(n),d=s?an:E(r);u=u==tn?L:u,d=d==tn?L:d;var l=u==L,o=d==L,c=u==d;if(c&&D(n)){if(!D(r))return!1;f=!0,l=!1}if(c&&!l)return i||(i=new _),f||Hn(n)?In(n,r,e,t,a,i):je(n,r,u,e,t,a,i);if(!(e&Je)){var h=l&&fn.call(n,"__wrapped__"),y=o&&fn.call(r,"__wrapped__");if(h||y){var b=h?n.value():n,p=y?r.value():r;return i||(i=new _),a(b,p,e,t,i)}}return c?(i||(i=new _),Xe(n,r,e,t,a,i)):!1}function Y(n,r,e,t,a){return n===r?!0:n==null||r==null||!S(n)&&!S(r)?n!==n&&r!==r:We(n,r,e,t,Y,a)}var ze=1,Ve=2;function ke(n,r,e,t){var a=e.length,i=a;if(n==null)return!i;for(n=Object(n);a--;){var f=e[a];if(f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++a<i;){f=e[a];var s=f[0],u=n[s],d=f[1];if(f[2]){if(u===void 0&&!(s in n))return!1}else{var l=new _,o;if(!(o===void 0?Y(d,u,ze|Ve,t,l):o))return!1}}return!0}function Pn(n){return n===n&&!ln(n)}function nt(n){for(var r=$(n),e=r.length;e--;){var t=r[e],a=n[t];r[e]=[t,a,Pn(a)]}return r}function vn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function rt(n){var r=nt(n);return r.length==1&&r[0][2]?vn(r[0][0],r[0][1]):function(e){return e===n||ke(e,n,r)}}function et(n,r){return n!=null&&r in Object(n)}function tt(n,r,e){r=yn(r,n);for(var t=-1,a=r.length,i=!1;++t<a;){var f=M(r[t]);if(!(i=n!=null&&e(n,f)))break;n=n[f]}return i||++t!=a?i:(a=n==null?0:n.length,!!a&&jn(a)&&Yn(f,a)&&(T(n)||un(n)))}function it(n,r){return n!=null&&tt(n,r,et)}var at=1,ft=2;function st(n,r){return B(n)&&Pn(r)?vn(M(n),r):function(e){var t=sr(e,n);return t===void 0&&t===r?it(e,n):Y(r,t,at|ft)}}function ut(n){return function(r){return r?.[n]}}function ot(n){return function(r){return bn(r,n)}}function gt(n){return B(n)?ut(M(n)):ot(n)}function Ln(n){return typeof n=="function"?n:n==null?cn:typeof n=="object"?T(n)?st(n[0],n[1]):rt(n):gt(n)}function lt(n,r){return n&&Zn(n,r,$)}function ct(n,r){return function(e,t){if(e==null)return e;if(!sn(e))return n(e,t);for(var a=e.length,i=-1,f=Object(e);++i<a&&t(f[i],i,f)!==!1;);return e}}var Z=ct(lt);function dt(n){return typeof n=="function"?n:cn}function $t(n,r){var e=T(n)?An:Z;return e(n,dt(r))}function pt(n,r){var e=[];return Z(n,function(t,a,i){r(t,a,i)&&e.push(t)}),e}function _t(n,r){var e=T(n)?Tn:pt;return e(n,Ln(r))}function At(n,r){return dn(r,function(e){return n[e]})}function St(n){return n==null?[]:At(n,$(n))}function Et(n){return n===void 0}function yt(n,r,e,t,a){return a(n,function(i,f,s){e=t?(t=!1,i):r(e,i,f,s)}),e}function It(n,r,e){var t=T(n)?or:yt,a=arguments.length<3;return t(n,Ln(r),e,a,Z)}var bt=1/0,Tt=m&&1/j(new m([,-0]))[1]==bt?function(n){return new m(n)}:Xn,ht=200;function Pt(n,r,e){var t=-1,a=Vn,i=n.length,f=!0,s=[],u=s;if(i>=ht){var d=r?null:Tt(n);if(d)return j(d);f=!1,a=En,u=new I}else u=r?[]:s;n:for(;++t<i;){var l=n[t],o=r?r(l):l;if(l=l!==0?l:0,f&&o===o){for(var c=u.length;c--;)if(u[c]===o)continue n;r&&u.push(o),s.push(l)}else a(u,o,e)||(u!==s&&u.push(o),s.push(l))}return s}export{Tn as A,pt as B,Ie as C,Xn as D,I as S,Pt as a,C as b,Ot as c,$t as d,N as e,_t as f,Ln as g,Jn as h,Et as i,Z as j,$ as k,dn as l,tt as m,yn as n,bn as o,dt as p,lt as q,It as r,it as s,M as t,fr as u,St as v,Vn as w,En as x,zn as y,br as z};
1
+ import{aH as S,aI as Rn,ax as T,aJ as w,aK as xn,aL as Mn,aw as sn,aM as mn,aN as un,aO as x,au as U,aP as Cn,aQ as on,aR as Fn,aS as E,aF as gn,aT as R,as as ln,aU as Dn,aV as D,aW as Gn,aX as Un,aY as _,aA as Nn,aZ as Bn,av as Kn,a_ as X,a$ as Hn,b0 as jn,az as Yn,ay as cn,aD as Zn,b1 as m}from"./mermaid.core-BvFuUEpc.js";var qn="[object Symbol]";function N(n){return typeof n=="symbol"||S(n)&&Rn(n)==qn}function dn(n,r){for(var e=-1,t=n==null?0:n.length,a=Array(t);++e<t;)a[e]=r(n[e],e,n);return a}var J=w?w.prototype:void 0,Q=J?J.toString:void 0;function pn(n){if(typeof n=="string")return n;if(T(n))return dn(n,pn)+"";if(N(n))return Q?Q.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Xn(){}function An(n,r){for(var e=-1,t=n==null?0:n.length;++e<t&&r(n[e],e,n)!==!1;);return n}function Jn(n,r,e,t){for(var a=n.length,i=e+-1;++i<a;)if(r(n[i],i,n))return i;return-1}function Qn(n){return n!==n}function Wn(n,r,e){for(var t=e-1,a=n.length;++t<a;)if(n[t]===r)return t;return-1}function zn(n,r,e){return r===r?Wn(n,r,e):Jn(n,Qn,e)}function Vn(n,r){var e=n==null?0:n.length;return!!e&&zn(n,r,0)>-1}function $(n){return sn(n)?xn(n):Mn(n)}var kn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nr=/^\w*$/;function B(n,r){if(T(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||N(n)?!0:nr.test(n)||!kn.test(n)||r!=null&&n in Object(r)}var rr=500;function er(n){var r=mn(n,function(t){return e.size===rr&&e.clear(),t}),e=r.cache;return r}var tr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ir=/\\(\\)?/g,ar=er(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(tr,function(e,t,a,i){r.push(a?i.replace(ir,"$1"):t||e)}),r});function fr(n){return n==null?"":pn(n)}function yn(n,r){return T(n)?n:B(n,r)?[n]:ar(fr(n))}function M(n){if(typeof n=="string"||N(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function bn(n,r){r=yn(r,n);for(var e=0,t=r.length;n!=null&&e<t;)n=n[M(r[e++])];return e&&e==t?n:void 0}function sr(n,r,e){var t=n==null?void 0:bn(n,r);return t===void 0?e:t}function K(n,r){for(var e=-1,t=r.length,a=n.length;++e<t;)n[a+e]=r[e];return n}var W=w?w.isConcatSpreadable:void 0;function ur(n){return T(n)||un(n)||!!(W&&n&&n[W])}function Ot(n,r,e,t,a){var i=-1,f=n.length;for(e||(e=ur),a||(a=[]);++i<f;){var s=n[i];e(s)?K(a,s):t||(a[a.length]=s)}return a}function or(n,r,e,t){var a=-1,i=n==null?0:n.length;for(t&&i&&(e=n[++a]);++a<i;)e=r(e,n[a],a,n);return e}function gr(n,r){return n&&x(r,$(r),n)}function lr(n,r){return n&&x(r,U(r),n)}function Tn(n,r){for(var e=-1,t=n==null?0:n.length,a=0,i=[];++e<t;){var f=n[e];r(f,e,n)&&(i[a++]=f)}return i}function hn(){return[]}var cr=Object.prototype,dr=cr.propertyIsEnumerable,z=Object.getOwnPropertySymbols,H=z?function(n){return n==null?[]:(n=Object(n),Tn(z(n),function(r){return dr.call(n,r)}))}:hn;function pr(n,r){return x(n,H(n),r)}var Ar=Object.getOwnPropertySymbols,wn=Ar?function(n){for(var r=[];n;)K(r,H(n)),n=Cn(n);return r}:hn;function yr(n,r){return x(n,wn(n),r)}function On(n,r,e){var t=r(n);return T(n)?t:K(t,e(n))}function G(n){return On(n,$,H)}function br(n){return On(n,U,wn)}var Tr=Object.prototype,hr=Tr.hasOwnProperty;function wr(n){var r=n.length,e=new n.constructor(r);return r&&typeof n[0]=="string"&&hr.call(n,"index")&&(e.index=n.index,e.input=n.input),e}function Or(n,r){var e=r?on(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}var $r=/\w*$/;function _r(n){var r=new n.constructor(n.source,$r.exec(n));return r.lastIndex=n.lastIndex,r}var V=w?w.prototype:void 0,k=V?V.valueOf:void 0;function Sr(n){return k?Object(k.call(n)):{}}var Er="[object Boolean]",Ir="[object Date]",Pr="[object Map]",vr="[object Number]",Lr="[object RegExp]",Rr="[object Set]",xr="[object String]",Mr="[object Symbol]",mr="[object ArrayBuffer]",Cr="[object DataView]",Fr="[object Float32Array]",Dr="[object Float64Array]",Gr="[object Int8Array]",Ur="[object Int16Array]",Nr="[object Int32Array]",Br="[object Uint8Array]",Kr="[object Uint8ClampedArray]",Hr="[object Uint16Array]",jr="[object Uint32Array]";function Yr(n,r,e){var t=n.constructor;switch(r){case mr:return on(n);case Er:case Ir:return new t(+n);case Cr:return Or(n,e);case Fr:case Dr:case Gr:case Ur:case Nr:case Br:case Kr:case Hr:case jr:return Fn(n,e);case Pr:return new t;case vr:case xr:return new t(n);case Lr:return _r(n);case Rr:return new t;case Mr:return Sr(n)}}var Zr="[object Map]";function qr(n){return S(n)&&E(n)==Zr}var nn=R&&R.isMap,Xr=nn?gn(nn):qr,Jr="[object Set]";function Qr(n){return S(n)&&E(n)==Jr}var rn=R&&R.isSet,Wr=rn?gn(rn):Qr,zr=1,Vr=2,kr=4,$n="[object Arguments]",ne="[object Array]",re="[object Boolean]",ee="[object Date]",te="[object Error]",_n="[object Function]",ie="[object GeneratorFunction]",ae="[object Map]",fe="[object Number]",Sn="[object Object]",se="[object RegExp]",ue="[object Set]",oe="[object String]",ge="[object Symbol]",le="[object WeakMap]",ce="[object ArrayBuffer]",de="[object DataView]",pe="[object Float32Array]",Ae="[object Float64Array]",ye="[object Int8Array]",be="[object Int16Array]",Te="[object Int32Array]",he="[object Uint8Array]",we="[object Uint8ClampedArray]",Oe="[object Uint16Array]",$e="[object Uint32Array]",g={};g[$n]=g[ne]=g[ce]=g[de]=g[re]=g[ee]=g[pe]=g[Ae]=g[ye]=g[be]=g[Te]=g[ae]=g[fe]=g[Sn]=g[se]=g[ue]=g[oe]=g[ge]=g[he]=g[we]=g[Oe]=g[$e]=!0;g[te]=g[_n]=g[le]=!1;function C(n,r,e,t,a,i){var f,s=r&zr,u=r&Vr,d=r&kr;if(f!==void 0)return f;if(!ln(n))return n;var l=T(n);if(l){if(f=wr(n),!s)return Dn(n,f)}else{var o=E(n),c=o==_n||o==ie;if(D(n))return Gn(n,s);if(o==Sn||o==$n||c&&!a){if(f=u||c?{}:Un(n),!s)return u?yr(n,lr(f,n)):pr(n,gr(f,n))}else{if(!g[o])return a?n:{};f=Yr(n,o,s)}}i||(i=new _);var h=i.get(n);if(h)return h;i.set(n,f),Wr(n)?n.forEach(function(p){f.add(C(p,r,e,p,n,i))}):Xr(n)&&n.forEach(function(p,A){f.set(A,C(p,r,e,A,n,i))});var y=d?u?br:G:u?U:$,b=l?void 0:y(n);return An(b||n,function(p,A){b&&(A=p,p=n[A]),Nn(f,A,C(p,r,e,A,n,i))}),f}var _e="__lodash_hash_undefined__";function Se(n){return this.__data__.set(n,_e),this}function Ee(n){return this.__data__.has(n)}function I(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new Bn;++r<e;)this.add(n[r])}I.prototype.add=I.prototype.push=Se;I.prototype.has=Ee;function Ie(n,r){for(var e=-1,t=n==null?0:n.length;++e<t;)if(r(n[e],e,n))return!0;return!1}function En(n,r){return n.has(r)}var Pe=1,ve=2;function In(n,r,e,t,a,i){var f=e&Pe,s=n.length,u=r.length;if(s!=u&&!(f&&u>s))return!1;var d=i.get(n),l=i.get(r);if(d&&l)return d==r&&l==n;var o=-1,c=!0,h=e&ve?new I:void 0;for(i.set(n,r),i.set(r,n);++o<s;){var y=n[o],b=r[o];if(t)var p=f?t(b,y,o,r,n,i):t(y,b,o,n,r,i);if(p!==void 0){if(p)continue;c=!1;break}if(h){if(!Ie(r,function(A,O){if(!En(h,O)&&(y===A||a(y,A,e,t,i)))return h.push(O)})){c=!1;break}}else if(!(y===b||a(y,b,e,t,i))){c=!1;break}}return i.delete(n),i.delete(r),c}function Le(n){var r=-1,e=Array(n.size);return n.forEach(function(t,a){e[++r]=[a,t]}),e}function j(n){var r=-1,e=Array(n.size);return n.forEach(function(t){e[++r]=t}),e}var Re=1,xe=2,Me="[object Boolean]",me="[object Date]",Ce="[object Error]",Fe="[object Map]",De="[object Number]",Ge="[object RegExp]",Ue="[object Set]",Ne="[object String]",Be="[object Symbol]",Ke="[object ArrayBuffer]",He="[object DataView]",en=w?w.prototype:void 0,F=en?en.valueOf:void 0;function je(n,r,e,t,a,i,f){switch(e){case He:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case Ke:return!(n.byteLength!=r.byteLength||!i(new X(n),new X(r)));case Me:case me:case De:return Kn(+n,+r);case Ce:return n.name==r.name&&n.message==r.message;case Ge:case Ne:return n==r+"";case Fe:var s=Le;case Ue:var u=t&Re;if(s||(s=j),n.size!=r.size&&!u)return!1;var d=f.get(n);if(d)return d==r;t|=xe,f.set(n,r);var l=In(s(n),s(r),t,a,i,f);return f.delete(n),l;case Be:if(F)return F.call(n)==F.call(r)}return!1}var Ye=1,Ze=Object.prototype,qe=Ze.hasOwnProperty;function Xe(n,r,e,t,a,i){var f=e&Ye,s=G(n),u=s.length,d=G(r),l=d.length;if(u!=l&&!f)return!1;for(var o=u;o--;){var c=s[o];if(!(f?c in r:qe.call(r,c)))return!1}var h=i.get(n),y=i.get(r);if(h&&y)return h==r&&y==n;var b=!0;i.set(n,r),i.set(r,n);for(var p=f;++o<u;){c=s[o];var A=n[c],O=r[c];if(t)var q=f?t(O,A,c,r,n,i):t(A,O,c,n,r,i);if(!(q===void 0?A===O||a(A,O,e,t,i):q)){b=!1;break}p||(p=c=="constructor")}if(b&&!p){var P=n.constructor,v=r.constructor;P!=v&&"constructor"in n&&"constructor"in r&&!(typeof P=="function"&&P instanceof P&&typeof v=="function"&&v instanceof v)&&(b=!1)}return i.delete(n),i.delete(r),b}var Je=1,tn="[object Arguments]",an="[object Array]",L="[object Object]",Qe=Object.prototype,fn=Qe.hasOwnProperty;function We(n,r,e,t,a,i){var f=T(n),s=T(r),u=f?an:E(n),d=s?an:E(r);u=u==tn?L:u,d=d==tn?L:d;var l=u==L,o=d==L,c=u==d;if(c&&D(n)){if(!D(r))return!1;f=!0,l=!1}if(c&&!l)return i||(i=new _),f||Hn(n)?In(n,r,e,t,a,i):je(n,r,u,e,t,a,i);if(!(e&Je)){var h=l&&fn.call(n,"__wrapped__"),y=o&&fn.call(r,"__wrapped__");if(h||y){var b=h?n.value():n,p=y?r.value():r;return i||(i=new _),a(b,p,e,t,i)}}return c?(i||(i=new _),Xe(n,r,e,t,a,i)):!1}function Y(n,r,e,t,a){return n===r?!0:n==null||r==null||!S(n)&&!S(r)?n!==n&&r!==r:We(n,r,e,t,Y,a)}var ze=1,Ve=2;function ke(n,r,e,t){var a=e.length,i=a;if(n==null)return!i;for(n=Object(n);a--;){var f=e[a];if(f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++a<i;){f=e[a];var s=f[0],u=n[s],d=f[1];if(f[2]){if(u===void 0&&!(s in n))return!1}else{var l=new _,o;if(!(o===void 0?Y(d,u,ze|Ve,t,l):o))return!1}}return!0}function Pn(n){return n===n&&!ln(n)}function nt(n){for(var r=$(n),e=r.length;e--;){var t=r[e],a=n[t];r[e]=[t,a,Pn(a)]}return r}function vn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function rt(n){var r=nt(n);return r.length==1&&r[0][2]?vn(r[0][0],r[0][1]):function(e){return e===n||ke(e,n,r)}}function et(n,r){return n!=null&&r in Object(n)}function tt(n,r,e){r=yn(r,n);for(var t=-1,a=r.length,i=!1;++t<a;){var f=M(r[t]);if(!(i=n!=null&&e(n,f)))break;n=n[f]}return i||++t!=a?i:(a=n==null?0:n.length,!!a&&jn(a)&&Yn(f,a)&&(T(n)||un(n)))}function it(n,r){return n!=null&&tt(n,r,et)}var at=1,ft=2;function st(n,r){return B(n)&&Pn(r)?vn(M(n),r):function(e){var t=sr(e,n);return t===void 0&&t===r?it(e,n):Y(r,t,at|ft)}}function ut(n){return function(r){return r?.[n]}}function ot(n){return function(r){return bn(r,n)}}function gt(n){return B(n)?ut(M(n)):ot(n)}function Ln(n){return typeof n=="function"?n:n==null?cn:typeof n=="object"?T(n)?st(n[0],n[1]):rt(n):gt(n)}function lt(n,r){return n&&Zn(n,r,$)}function ct(n,r){return function(e,t){if(e==null)return e;if(!sn(e))return n(e,t);for(var a=e.length,i=-1,f=Object(e);++i<a&&t(f[i],i,f)!==!1;);return e}}var Z=ct(lt);function dt(n){return typeof n=="function"?n:cn}function $t(n,r){var e=T(n)?An:Z;return e(n,dt(r))}function pt(n,r){var e=[];return Z(n,function(t,a,i){r(t,a,i)&&e.push(t)}),e}function _t(n,r){var e=T(n)?Tn:pt;return e(n,Ln(r))}function At(n,r){return dn(r,function(e){return n[e]})}function St(n){return n==null?[]:At(n,$(n))}function Et(n){return n===void 0}function yt(n,r,e,t,a){return a(n,function(i,f,s){e=t?(t=!1,i):r(e,i,f,s)}),e}function It(n,r,e){var t=T(n)?or:yt,a=arguments.length<3;return t(n,Ln(r),e,a,Z)}var bt=1/0,Tt=m&&1/j(new m([,-0]))[1]==bt?function(n){return new m(n)}:Xn,ht=200;function Pt(n,r,e){var t=-1,a=Vn,i=n.length,f=!0,s=[],u=s;if(i>=ht){var d=r?null:Tt(n);if(d)return j(d);f=!1,a=En,u=new I}else u=r?[]:s;n:for(;++t<i;){var l=n[t],o=r?r(l):l;if(l=l!==0?l:0,f&&o===o){for(var c=u.length;c--;)if(u[c]===o)continue n;r&&u.push(o),s.push(l)}else a(u,o,e)||(u!==s&&u.push(o),s.push(l))}return s}export{Tn as A,pt as B,Ie as C,Xn as D,I as S,Pt as a,C as b,Ot as c,$t as d,N as e,_t as f,Ln as g,Jn as h,Et as i,Z as j,$ as k,dn as l,tt as m,yn as n,bn as o,dt as p,lt as q,It as r,it as s,M as t,fr as u,St as v,Vn as w,En as x,zn as y,br as z};
@@ -1,4 +1,4 @@
1
- import{a as $,r as S,j as e,L as Z,T as B,B as c,S as L,b as R,d as F,e as q,f as x,X as G,g as j,c as U}from"./icon-D9xnujmI.js";import{g as W,a0 as V,f as E,J as f,M as P,a1 as _,a2 as M,a3 as ee,a4 as te,a5 as se,a6 as ae,a7 as I,a8 as H,a9 as ne,h as Y,aa as ie,ab as re,u as oe,ac as le,ad as ce,ae as de,af as me,B as ue,ag as xe,ah as he,ai as ge,aj as je,ak as O,al as fe,am as ye,an as pe}from"./index-CVSo1eIn.js";import{S as be}from"./square-pen-DOIqaj9i.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-BSrvgpki.js";/**
1
+ import{a as $,r as S,j as e,L as Z,T as B,B as c,S as L,b as R,d as F,e as q,f as x,X as G,g as j,c as U}from"./icon-2OdwuA9u.js";import{g as W,a0 as V,f as E,J as f,M as P,a1 as _,a2 as M,a3 as ee,a4 as te,a5 as se,a6 as ae,a7 as I,a8 as H,a9 as ne,h as Y,aa as ie,ab as re,u as oe,ac as le,ad as ce,ae as de,af as me,B as ue,ag as xe,ah as he,ai as ge,aj as je,ak as O,al as fe,am as ye,an as pe}from"./index-_UzVA1oU.js";import{S as be}from"./square-pen-2Yxvf_S9.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-tstZNIUn.js";/**
2
2
  * @license lucide-react v0.507.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{a as p,j as e,c as j,r as m,S as y}from"./icon-D9xnujmI.js";import{C as k}from"./compact-pagination-C9MHaQh8.js";import{P as v}from"./page-header-JYwkpfbT.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-CVSo1eIn.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-BSrvgpki.js";/**
1
+ import{a as p,j as e,c as j,r as m,S as y}from"./icon-2OdwuA9u.js";import{C as k}from"./compact-pagination-BJa5bxJe.js";import{P as v}from"./page-header-C-9zjakn.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-_UzVA1oU.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-tstZNIUn.js";/**
2
2
  * @license lucide-react v0.507.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.