local-operator-ui 0.21.4 → 0.22.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 (70) hide show
  1. package/out/main/index.js +253 -82
  2. package/out/preload/index.js +20 -7
  3. package/out/renderer/assets/{_basePickBy-DCkhfufs.js → _basePickBy-CQf9pXjH.js} +1 -1
  4. package/out/renderer/assets/{_baseUniq-CbXRn6Sz.js → _baseUniq-Dl__bWA7.js} +1 -1
  5. package/out/renderer/assets/{agent-details-page-CzZG1eTh.js → agent-details-page-BFRNeq_9.js} +1 -1
  6. package/out/renderer/assets/{agent-hub-page-BUlhFKrQ.js → agent-hub-page-C5uTa1OP.js} +1 -1
  7. package/out/renderer/assets/{agents-page-BChq9qh8.js → agents-page-Dsjf2XVl.js} +2 -2
  8. package/out/renderer/assets/{architectureDiagram-IEHRJDOE-CUcZIqGz.js → architectureDiagram-IEHRJDOE-CX1LT070.js} +1 -1
  9. package/out/renderer/assets/{blockDiagram-JOT3LUYC-C8iWDIl7.js → blockDiagram-JOT3LUYC-BHvh337m.js} +1 -1
  10. package/out/renderer/assets/{c4Diagram-VJAJSXHY-Rf7kjwb8.js → c4Diagram-VJAJSXHY-CB25WTAa.js} +1 -1
  11. package/out/renderer/assets/channel-DVkN6WFV.js +1 -0
  12. package/out/renderer/assets/{chunk-4BMEZGHF-B8xwSed9.js → chunk-4BMEZGHF-CdL7mvmD.js} +1 -1
  13. package/out/renderer/assets/{chunk-A2AXSNBT-Cd443Eh9.js → chunk-A2AXSNBT-CTXaSuto.js} +1 -1
  14. package/out/renderer/assets/{chunk-AEK57VVT-CfWs2qUA.js → chunk-AEK57VVT-BEicr1Dd.js} +1 -1
  15. package/out/renderer/assets/{chunk-D6G4REZN-DQS_tD7n.js → chunk-D6G4REZN-CFWRaGZz.js} +1 -1
  16. package/out/renderer/assets/{chunk-RZ5BOZE2-GGjWUC8K.js → chunk-RZ5BOZE2-CBpkIuQb.js} +1 -1
  17. package/out/renderer/assets/{chunk-XZIHB7SX-C_z5Swpc.js → chunk-XZIHB7SX-CzYmS0vQ.js} +1 -1
  18. package/out/renderer/assets/classDiagram-GIVACNV2-BG_nYqj6.js +1 -0
  19. package/out/renderer/assets/classDiagram-v2-COTLJTTW-BG_nYqj6.js +1 -0
  20. package/out/renderer/assets/clone-C_snK9kE.js +1 -0
  21. package/out/renderer/assets/{compact-pagination-BoBK24RF.js → compact-pagination-B96s9yzm.js} +1 -1
  22. package/out/renderer/assets/{dagre-OKDRZEBW-BeC8pWE9.js → dagre-OKDRZEBW-Do-kgEkR.js} +1 -1
  23. package/out/renderer/assets/{diagram-SSKATNLV-Bxa_2UeV.js → diagram-SSKATNLV-CsCb8wpf.js} +1 -1
  24. package/out/renderer/assets/{diagram-VNBRO52H-CadMYaoj.js → diagram-VNBRO52H-Dw7PjT0P.js} +1 -1
  25. package/out/renderer/assets/{erDiagram-Q7BY3M3F-MaHtoLsT.js → erDiagram-Q7BY3M3F-BWkH3nZy.js} +1 -1
  26. package/out/renderer/assets/{flowDiagram-4HSFHLVR-Dthy2ic-.js → flowDiagram-4HSFHLVR-CxX3FcH6.js} +1 -1
  27. package/out/renderer/assets/{ganttDiagram-APWFNJXF-CAk8SxD7.js → ganttDiagram-APWFNJXF-YCFrsDSI.js} +1 -1
  28. package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-Dva-2htw.js → gitGraphDiagram-7IBYFJ6S-BYdWJ5DA.js} +1 -1
  29. package/out/renderer/assets/{graph-s_OViwzG.js → graph-ComyQBRb.js} +1 -1
  30. package/out/renderer/assets/{icon-Bt3GeFFS.js → icon-CE4SVRJy.js} +30 -30
  31. package/out/renderer/assets/icon-QMJVPxLk.css +1 -0
  32. package/out/renderer/assets/{index-CsCp5pB0.js → index-DDsRNI1O.js} +1 -1
  33. package/out/renderer/assets/{index--bextIso.js → index-DQUWRv4C.js} +1 -1
  34. package/out/renderer/assets/{index-CFAVcqcg.js → index-D_A5gtvt.js} +332 -323
  35. package/out/renderer/assets/{infoDiagram-PH2N3AL5-i9VhPGfZ.js → infoDiagram-PH2N3AL5-DFQIA9CA.js} +1 -1
  36. package/out/renderer/assets/{installer-Dk6RajAB.js → installer-Dk2DPu97.js} +1 -1
  37. package/out/renderer/assets/{journeyDiagram-U35MCT3I-DjN1JRcf.js → journeyDiagram-U35MCT3I-CJBnzG-O.js} +1 -1
  38. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-DeBvWNw2.js → kanban-definition-NDS4AKOZ-CD0zYhU1.js} +1 -1
  39. package/out/renderer/assets/{layout-D9rlSDZl.js → layout-g2mCw-ag.js} +1 -1
  40. package/out/renderer/assets/{legacy-agents-page-E3hHPrtT.js → legacy-agents-page-DYU9zDAP.js} +4 -4
  41. package/out/renderer/assets/{mermaid.core-CXUoJGge.js → mermaid.core-BxDLTp0O.js} +5 -5
  42. package/out/renderer/assets/{mindmap-definition-ALO5MXBD-CsbDlfvY.js → mindmap-definition-ALO5MXBD-CtrzjPYX.js} +1 -1
  43. package/out/renderer/assets/{page-header-6ahaMOFS.js → page-header-DRId65yK.js} +1 -1
  44. package/out/renderer/assets/{parseISO-BvU3ISTP.js → parseISO-BAPYsQpI.js} +1 -1
  45. package/out/renderer/assets/{pieDiagram-IB7DONF6-wWJJMpcD.js → pieDiagram-IB7DONF6-BtXIEy7w.js} +1 -1
  46. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-B1gEaGpX.js → quadrantDiagram-7GDLP6J5-B2MB8zLh.js} +1 -1
  47. package/out/renderer/assets/{radar-MK3ICKWK-BsQyOA66.js → radar-MK3ICKWK-wEym7YVM.js} +1 -1
  48. package/out/renderer/assets/radient-auth-buttons-BzWCAZ_N.js +6 -0
  49. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-DFGVsPwn.js → requirementDiagram-KVF5MWMF-8tAGZJgl.js} +1 -1
  50. package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-Cpr12W3J.js → sankeyDiagram-QLVOVGJD-C3TpTAdo.js} +1 -1
  51. package/out/renderer/assets/{schedules-page-DLGJUTRX.js → schedules-page-aInPZ6Nj.js} +1 -1
  52. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-CY6u9Tii.js → sequenceDiagram-X6HHIX6F-BdmPdYc4.js} +1 -1
  53. package/out/renderer/assets/settings-page-BOMpNRHm.js +159 -0
  54. package/out/renderer/assets/{square-pen-ztv62ABT.js → square-pen-Kx7D4qf-.js} +1 -1
  55. package/out/renderer/assets/{stateDiagram-DGXRK772-DvrY4Q_D.js → stateDiagram-DGXRK772-DEafFSZS.js} +1 -1
  56. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-C1d0k_1g.js +1 -0
  57. package/out/renderer/assets/{timeline-definition-BDJGKUSR-B8_J7X8q.js → timeline-definition-BDJGKUSR-GokU5DHP.js} +1 -1
  58. package/out/renderer/assets/{use-agent-like-mutation-BowqVPFo.js → use-agent-like-mutation-Njja4mrf.js} +1 -1
  59. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-D7x_UntQ.js → xychartDiagram-VJFVF3MP-6VbWNkOe.js} +1 -1
  60. package/out/renderer/index.html +3 -3
  61. package/out/renderer/installer.html +3 -3
  62. package/package.json +2 -2
  63. package/out/renderer/assets/channel-C0H6vNPZ.js +0 -1
  64. package/out/renderer/assets/classDiagram-GIVACNV2-CK43jL1V.js +0 -1
  65. package/out/renderer/assets/classDiagram-v2-COTLJTTW-CK43jL1V.js +0 -1
  66. package/out/renderer/assets/clone-C7ZRecHq.js +0 -1
  67. package/out/renderer/assets/icon-ByNY0u25.css +0 -1
  68. package/out/renderer/assets/radient-auth-buttons-Dzwx2_bO.js +0 -6
  69. package/out/renderer/assets/settings-page-zkuTaAfc.js +0 -165
  70. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-B5oCdb35.js +0 -1
package/out/main/index.js CHANGED
@@ -38,6 +38,7 @@ const id$1 = zod.z.string().min(1).max(128).regex(/^[a-zA-Z0-9_-]+$/);
38
38
  const settingKey = zod.z.string().min(1).max(256).regex(/^[a-zA-Z0-9_][a-zA-Z0-9_.-]*$/);
39
39
  const secret = zod.z.string().min(1).max(32768);
40
40
  const sessionId = zod.z.string().regex(/^[a-f0-9]{12}$/);
41
+ const SUBSCRIPTION_ID_PATTERN = /^[a-f0-9]{32}$/;
41
42
  const requestId = zod.z.string().regex(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/);
42
43
  const sessionImage = zod.z.object({
43
44
  data_b64: zod.z.string().min(1).max(1e6),
@@ -184,6 +185,27 @@ const desktopRequestSchema = zod.z.discriminatedUnion("op", [
184
185
  beforeId: id$1.optional(),
185
186
  limit: zod.z.number().int().min(1).max(500).optional()
186
187
  }).strict(),
188
+ /*
189
+ * One child's durable transcript, for the run panel's reader
190
+ * (`docs/run-sidebar.md` § 10.1, § 10.3).
191
+ *
192
+ * Both ids are the same `^[a-f0-9]{12}$` the whole desktop surface already
193
+ * validates on, and NEITHER is a path: the child directory is resolved by the
194
+ * route from the id and from the parent's own roster, so the renderer cannot
195
+ * name a directory at all. That containment is the route's, not the caller's —
196
+ * a schema that accepted a path here would be the whole boundary.
197
+ *
198
+ * `beforeId` is an entry id (max 128 chars, the `id` shape) rather than an
199
+ * offset, matching `sessions.history`: file compaction replaces the JSONL
200
+ * atomically, so offsets become lies while ids stay meaningful.
201
+ */
202
+ zod.z.object({
203
+ op: zod.z.literal("subagents.transcript"),
204
+ sessionId,
205
+ childId: sessionId,
206
+ beforeId: id$1.optional(),
207
+ limit: zod.z.number().int().min(1).max(500).optional()
208
+ }).strict(),
187
209
  zod.z.object({
188
210
  op: zod.z.literal("sessions.message"),
189
211
  sessionId,
@@ -228,7 +250,7 @@ const desktopRequestSchema = zod.z.discriminatedUnion("op", [
228
250
  zod.z.object({
229
251
  op: zod.z.literal("sessions.watch"),
230
252
  sessionId,
231
- subscriptionId: zod.z.string().regex(/^[a-f0-9]{32}$/),
253
+ subscriptionId: zod.z.string().regex(SUBSCRIPTION_ID_PATTERN),
232
254
  visible: zod.z.boolean(),
233
255
  canNotify: zod.z.boolean()
234
256
  }).strict(),
@@ -670,6 +692,16 @@ function desktopEndpoint(request) {
670
692
  method: "GET"
671
693
  };
672
694
  }
695
+ case "subagents.transcript": {
696
+ const query = new URLSearchParams({
697
+ limit: String(request.limit ?? 100)
698
+ });
699
+ if (request.beforeId) query.set("before_id", request.beforeId);
700
+ return {
701
+ path: `/v1/desktop/sessions/${request.sessionId}/children/${request.childId}/transcript?${query}`,
702
+ method: "GET"
703
+ };
704
+ }
673
705
  case "sessions.message":
674
706
  return {
675
707
  path: `/v1/desktop/sessions/${request.sessionId}/messages`,
@@ -1098,6 +1130,19 @@ const mediaRequestSchema = zod.z.discriminatedUnion("op", [
1098
1130
  op: zod.z.literal("sessions.attachment"),
1099
1131
  sessionId: zod.z.string().regex(/^[a-f0-9]{12}$/),
1100
1132
  digest: zod.z.string().regex(/^[a-f0-9]{32}$/)
1133
+ }).strict(),
1134
+ // The child-scoped twin of the op above, for the run panel's reader: a
1135
+ // child's durable rows reference attachments in the same content-addressed
1136
+ // store, and the parent's route takes the session whose transcript holds the
1137
+ // reference — which a child session is not, so it refuses. `childId` is
1138
+ // shape-constrained here for the same reason `sessionId` is: the path is
1139
+ // built in main, and an unvalidated id would be renderer-controlled path
1140
+ // text.
1141
+ zod.z.object({
1142
+ op: zod.z.literal("subagents.attachment"),
1143
+ sessionId: zod.z.string().regex(/^[a-f0-9]{12}$/),
1144
+ childId: zod.z.string().regex(/^[a-f0-9]{12}$/),
1145
+ digest: zod.z.string().regex(/^[a-f0-9]{32}$/)
1101
1146
  }).strict()
1102
1147
  ]);
1103
1148
  function endpoint(request) {
@@ -1117,6 +1162,11 @@ function endpoint(request) {
1117
1162
  path: `/v1/desktop/sessions/${request.sessionId}/attachments/${request.digest}`,
1118
1163
  method: "GET"
1119
1164
  };
1165
+ case "subagents.attachment":
1166
+ return {
1167
+ path: `/v1/desktop/sessions/${request.sessionId}/children/${request.childId}/attachments/${request.digest}`,
1168
+ method: "GET"
1169
+ };
1120
1170
  }
1121
1171
  }
1122
1172
  async function requestDesktopMedia(input, bytes, backendUrl, token) {
@@ -1138,7 +1188,7 @@ async function requestDesktopMedia(input, bytes, backendUrl, token) {
1138
1188
  const target2 = endpoint(request);
1139
1189
  let body;
1140
1190
  let contentType;
1141
- if (request.op === "agent.export" || request.op === "sessions.attachment") {
1191
+ if (request.op === "agent.export" || request.op === "sessions.attachment" || request.op === "subagents.attachment") {
1142
1192
  body = void 0;
1143
1193
  } else if (request.op === "speech.create" || request.op === "speech.agent") {
1144
1194
  body = JSON.stringify(request.request);
@@ -1213,8 +1263,38 @@ async function requestDesktopMedia(input, bytes, backendUrl, token) {
1213
1263
  };
1214
1264
  }
1215
1265
  }
1266
+ const DESKTOP_STREAM_DETAIL = {
1267
+ /** No desktop pairing token: nothing to authenticate with. */
1268
+ notPaired: "This backend was not started with desktop controls.",
1269
+ /** Nothing was listening on the backend's origin. */
1270
+ serverDown: "The Local Operator server is not answering.",
1271
+ frameBudget: "The event stream exceeded its frame budget.",
1272
+ ended: "The event stream ended.",
1273
+ connectionFailed: "The event stream connection failed.",
1274
+ /** The IPC subscribe itself rejected before a stream existed. */
1275
+ openFailed: "The event stream could not be opened.",
1276
+ /** A backend answered and refused this app's bearer (typically 401/403). */
1277
+ refused: (status) => `The event stream was refused (${status}).`,
1278
+ /**
1279
+ * The same refusal where no status reached the caller.
1280
+ *
1281
+ * The browser dev proxy (`scripts/vite-plugins/desktop-proxy.ts`) learns the
1282
+ * upstream status but replays it to an `EventSource`, which surfaces only
1283
+ * "the connection closed" to the renderer. Declared here so the vocabulary
1284
+ * stays one list rather than a list plus one string in a script.
1285
+ */
1286
+ refusedWithoutStatus: "The event stream was refused."
1287
+ };
1216
1288
  const SESSION_ID = /^[a-f0-9]{12}$/;
1217
1289
  const SAFE_ID = /^[a-zA-Z0-9_-]{1,128}$/;
1290
+ function transportFailureDetail(error) {
1291
+ if (error instanceof Error && error.name === "AbortError") {
1292
+ return DESKTOP_STREAM_DETAIL.ended;
1293
+ }
1294
+ const code = error?.cause?.code;
1295
+ if (code === "ECONNREFUSED") return DESKTOP_STREAM_DETAIL.serverDown;
1296
+ return DESKTOP_STREAM_DETAIL.connectionFailed;
1297
+ }
1218
1298
  const MAX_FRAME_BYTES = 8 * 1024 * 1024;
1219
1299
  class DesktopStreamRelay {
1220
1300
  constructor(backendUrl, token) {
@@ -1244,7 +1324,15 @@ class DesktopStreamRelay {
1244
1324
  throw new Error("Invalid stream cursor.");
1245
1325
  }
1246
1326
  if (!this.token) {
1247
- throw new Error("This backend was not started with desktop controls.");
1327
+ const streamId2 = node_crypto.randomBytes(16).toString("hex");
1328
+ queueMicrotask(() => {
1329
+ emit({
1330
+ streamId: streamId2,
1331
+ kind: "error",
1332
+ detail: DESKTOP_STREAM_DETAIL.notPaired
1333
+ });
1334
+ });
1335
+ return { streamId: streamId2 };
1248
1336
  }
1249
1337
  const streamId = node_crypto.randomBytes(16).toString("hex");
1250
1338
  const controller = new AbortController();
@@ -1283,7 +1371,7 @@ class DesktopStreamRelay {
1283
1371
  emit({
1284
1372
  streamId,
1285
1373
  kind: "error",
1286
- detail: `The event stream was refused (${response.status}).`
1374
+ detail: DESKTOP_STREAM_DETAIL.refused(response.status)
1287
1375
  });
1288
1376
  return;
1289
1377
  }
@@ -1301,7 +1389,7 @@ class DesktopStreamRelay {
1301
1389
  emit({
1302
1390
  streamId,
1303
1391
  kind: "error",
1304
- detail: "The event stream exceeded its frame budget."
1392
+ detail: DESKTOP_STREAM_DETAIL.frameBudget
1305
1393
  });
1306
1394
  reader.cancel().catch(() => void 0);
1307
1395
  return;
@@ -1328,7 +1416,7 @@ class DesktopStreamRelay {
1328
1416
  emit({
1329
1417
  streamId,
1330
1418
  kind: "error",
1331
- detail: error instanceof Error && error.name === "AbortError" ? "The event stream ended." : "The event stream connection failed."
1419
+ detail: transportFailureDetail(error)
1332
1420
  });
1333
1421
  }
1334
1422
  }
@@ -1739,10 +1827,25 @@ class BackendServiceManager {
1739
1827
  // Managed starts always rotate this; it is never exposed by preload or logs.
1740
1828
  desktopToken = process.env.LOCAL_OPERATOR_DESKTOP_TOKEN || null;
1741
1829
  /** Authenticated SSE relay for canonical session events. Recreated when the
1742
- * backend URL rotates (external-backend discovery) so streams cannot pin a
1743
- * stale origin. */
1830
+ * backend URL rotates (external-backend discovery) or the desktop token does
1831
+ * (every managed start mints one), and dropped outright by `stop()`.
1832
+ *
1833
+ * WHY the token is part of the cache key. A URL-only key was the bug behind
1834
+ * "every conversation opens empty": an in-place restart - the health-check
1835
+ * watchdog, or "Update server" - keeps `backendUrl` at
1836
+ * `http://127.0.0.1:1111` and rotates ONLY the token, so the cached relay
1837
+ * went on authenticating with the credential of the process that had just
1838
+ * been killed. Each `GET /v1/desktop/sessions/{id}/events` was refused 401
1839
+ * while `sessions?limit=500` and `sessions.get` stayed 200 (those read the
1840
+ * live token at call time), the renderer never received an `open` frame, and
1841
+ * with no receipt its single auto-reconnect was skipped - so the transcript
1842
+ * stayed empty until the app itself was restarted. */
1744
1843
  streamRelay = null;
1745
1844
  streamRelayUrl = "";
1845
+ /** The token `streamRelay` was built with. Tracked beside the URL, not
1846
+ * derived from it: the rotation above is exactly a case where the URL is
1847
+ * unchanged and the token is not. */
1848
+ streamRelayToken = null;
1746
1849
  /** Survives relay recreation so notifications never silently detach
1747
1850
  * when the backend URL rotates. */
1748
1851
  streamObserver = null;
@@ -1772,7 +1875,7 @@ class BackendServiceManager {
1772
1875
  }
1773
1876
  }
1774
1877
  getStreamRelay() {
1775
- if (!this.streamRelay || this.streamRelayUrl !== this.backendUrl) {
1878
+ if (!this.streamRelay || this.streamRelayUrl !== this.backendUrl || this.streamRelayToken !== this.desktopToken) {
1776
1879
  this.streamRelay?.dispose();
1777
1880
  this.streamRelay = new DesktopStreamRelay(
1778
1881
  this.backendUrl,
@@ -1780,9 +1883,28 @@ class BackendServiceManager {
1780
1883
  );
1781
1884
  this.streamRelay.observe(this.streamObserver);
1782
1885
  this.streamRelayUrl = this.backendUrl;
1886
+ this.streamRelayToken = this.desktopToken;
1783
1887
  }
1784
1888
  return this.streamRelay;
1785
1889
  }
1890
+ /**
1891
+ * Drop the relay and its streams.
1892
+ *
1893
+ * Called from `stop()` so an in-place restart cannot leave a stream bound to
1894
+ * the token of the process being stopped - the open streams are aborted
1895
+ * deliberately, which the renderer sees as a stream `end` and recovers from
1896
+ * with a bounded retry rather than waiting for a frame that will never come.
1897
+ *
1898
+ * `streamRelayToken` is cleared rather than left at the retired value: the
1899
+ * next `getStreamRelay()` must not be able to answer "already built" for a
1900
+ * token whose relay no longer exists.
1901
+ */
1902
+ disposeStreamRelay() {
1903
+ this.streamRelay?.dispose();
1904
+ this.streamRelay = null;
1905
+ this.streamRelayUrl = "";
1906
+ this.streamRelayToken = null;
1907
+ }
1786
1908
  observeStream(observer) {
1787
1909
  this.streamObserver = observer;
1788
1910
  this.streamRelay?.observe(observer);
@@ -2113,8 +2235,55 @@ class BackendServiceManager {
2113
2235
  return false;
2114
2236
  }
2115
2237
  /**
2116
- * Check if an external backend is already running
2117
- * @returns Promise resolving to true if an external backend is running, false otherwise
2238
+ * True when this app holds a desktop credential for the configured backend.
2239
+ *
2240
+ * This is the RELAY's own `available` fact, asked here rather than re-derived,
2241
+ * so that adopting a backend and streaming from it agree on what "we can talk
2242
+ * to this server" means. A server this app holds no token for is one it can
2243
+ * never authenticate to: adopting it attaches the renderer to a backend that
2244
+ * refuses every session list and every stream - the empty-conversation
2245
+ * outcome this whole subsystem exists to remove.
2246
+ */
2247
+ canAuthenticate() {
2248
+ return this.getStreamRelay().available;
2249
+ }
2250
+ /**
2251
+ * Ask the answering backend whether it will accept this app's bearer.
2252
+ *
2253
+ * A `/health` 200 proves a process is listening, not that it is OURS. The
2254
+ * desktop vocabulary answers 401/403 for a bearer it does not hold, so one
2255
+ * authenticated read is what separates a legitimate paired backend from a
2256
+ * stranger that happens to occupy the port.
2257
+ */
2258
+ async authenticatesAgainstBackend() {
2259
+ try {
2260
+ const result = await this.requestDesktop({
2261
+ op: "sessions.list",
2262
+ limit: 1
2263
+ });
2264
+ return result.status >= 200 && result.status < 300;
2265
+ } catch {
2266
+ return false;
2267
+ }
2268
+ }
2269
+ /**
2270
+ * Check if an external backend is already running AND usable by this app.
2271
+ *
2272
+ * WHY the pairing gate. A liveness probe alone made adoption a decision this
2273
+ * app was not entitled to: `checkExistingBackend()` fired against the
2274
+ * CONFIGURED origin, so an app pointed at one port could still adopt whatever
2275
+ * answered a hardcoded fallback on another one, with no desktop token - i.e.
2276
+ * it attached itself to a backend it could never authenticate to, and every
2277
+ * conversation opened empty. The old code even rotated `backendUrl` onto that
2278
+ * fallback origin, so a rig configured for an isolated port silently became a
2279
+ * client of the operator's live server (QA round 1, Q-1).
2280
+ *
2281
+ * Two rules replace it: the probe only ever targets the configured origin, and
2282
+ * a healthy answer is only adopted when this app can authenticate to it.
2283
+ * Declining is not a failure - `start()` spawns our own backend exactly as it
2284
+ * would have on a cold start.
2285
+ *
2286
+ * @returns Promise resolving to true if a paired external backend is running
2118
2287
  */
2119
2288
  async checkExistingBackend() {
2120
2289
  if (this.isDisabled) {
@@ -2124,6 +2293,13 @@ class BackendServiceManager {
2124
2293
  );
2125
2294
  return true;
2126
2295
  }
2296
+ if (!this.canAuthenticate()) {
2297
+ logger.info(
2298
+ "No desktop pairing token for the configured backend; not adopting an external backend.",
2299
+ LogFileType.BACKEND
2300
+ );
2301
+ return false;
2302
+ }
2127
2303
  try {
2128
2304
  logger.info(
2129
2305
  `Checking for external backend at ${this.backendUrl}/health`,
@@ -2142,8 +2318,15 @@ class BackendServiceManager {
2142
2318
  LogFileType.BACKEND
2143
2319
  );
2144
2320
  if (response.ok) {
2321
+ if (!await this.authenticatesAgainstBackend()) {
2322
+ logger.info(
2323
+ "A backend answered health but refused this app's desktop token; starting our own instead.",
2324
+ LogFileType.BACKEND
2325
+ );
2326
+ return false;
2327
+ }
2145
2328
  logger.info(
2146
- "External backend detected and healthy",
2329
+ "External backend detected, healthy and paired",
2147
2330
  LogFileType.BACKEND
2148
2331
  );
2149
2332
  this.isExternalBackend = true;
@@ -2151,43 +2334,6 @@ class BackendServiceManager {
2151
2334
  return true;
2152
2335
  }
2153
2336
  } catch (error) {
2154
- try {
2155
- if (this.backendUrl.includes("127.0.0.1")) {
2156
- const altUrl = "http://localhost:1111";
2157
- logger.info(
2158
- `Trying alternative URL: ${altUrl}/health`,
2159
- LogFileType.BACKEND
2160
- );
2161
- const controller = new AbortController();
2162
- const timeoutId = setTimeout(() => controller.abort(), 5e3);
2163
- const response = await fetch(`${altUrl}/health`, {
2164
- method: "GET",
2165
- headers: { Accept: "application/json" },
2166
- signal: controller.signal
2167
- });
2168
- clearTimeout(timeoutId);
2169
- logger.info(
2170
- `Alternative URL health check response status: ${response.status}`,
2171
- LogFileType.BACKEND
2172
- );
2173
- if (response.ok) {
2174
- this.backendUrl = altUrl;
2175
- logger.info(
2176
- "External backend detected and healthy using alternative URL",
2177
- LogFileType.BACKEND
2178
- );
2179
- this.isExternalBackend = true;
2180
- this.notifyBackendReady();
2181
- return true;
2182
- }
2183
- }
2184
- } catch (altError) {
2185
- logger.error(
2186
- "Error checking alternative backend URL:",
2187
- LogFileType.BACKEND,
2188
- altError
2189
- );
2190
- }
2191
2337
  logger.error(
2192
2338
  "Error checking external backend:",
2193
2339
  LogFileType.BACKEND,
@@ -2378,6 +2524,7 @@ class BackendServiceManager {
2378
2524
  if (!isRestart) {
2379
2525
  this.isAppClosing = true;
2380
2526
  }
2527
+ this.disposeStreamRelay();
2381
2528
  if (this.healthCheckInterval) {
2382
2529
  clearInterval(this.healthCheckInterval);
2383
2530
  this.healthCheckInterval = null;
@@ -2479,22 +2626,24 @@ class BackendServiceManager {
2479
2626
  }
2480
2627
  } else if (this.process) {
2481
2628
  this.process.kill("SIGKILL");
2482
- try {
2483
- execPromise('pkill -f "local-operator serve"').catch(
2484
- (error) => {
2485
- logger.warn(
2486
- "Error killing processes by pattern:",
2487
- LogFileType.BACKEND,
2488
- error
2489
- );
2490
- }
2491
- );
2492
- } catch (pkillError) {
2493
- logger.warn(
2494
- "Error executing pkill command:",
2495
- LogFileType.BACKEND,
2496
- pkillError
2497
- );
2629
+ if (!isRestart) {
2630
+ try {
2631
+ execPromise('pkill -f "local-operator serve"').catch(
2632
+ (error) => {
2633
+ logger.warn(
2634
+ "Error killing processes by pattern:",
2635
+ LogFileType.BACKEND,
2636
+ error
2637
+ );
2638
+ }
2639
+ );
2640
+ } catch (pkillError) {
2641
+ logger.warn(
2642
+ "Error executing pkill command:",
2643
+ LogFileType.BACKEND,
2644
+ pkillError
2645
+ );
2646
+ }
2498
2647
  }
2499
2648
  setTimeout(() => {
2500
2649
  if (this.process) {
@@ -2503,10 +2652,12 @@ class BackendServiceManager {
2503
2652
  LogFileType.BACKEND
2504
2653
  );
2505
2654
  try {
2506
- execPromise('pkill -9 -f "local-operator serve"').catch(
2507
- () => {
2508
- }
2509
- );
2655
+ if (!isRestart) {
2656
+ execPromise(
2657
+ 'pkill -9 -f "local-operator serve"'
2658
+ ).catch(() => {
2659
+ });
2660
+ }
2510
2661
  this.process = null;
2511
2662
  this.isRunning = false;
2512
2663
  if (this.exitResolve) {
@@ -2624,21 +2775,38 @@ class BackendServiceManager {
2624
2775
  if (this.healthCheckInterval) {
2625
2776
  clearInterval(this.healthCheckInterval);
2626
2777
  }
2627
- this.healthCheckInterval = setInterval(async () => {
2628
- const isHealthy = await this.checkHealth();
2629
- if (!isHealthy) {
2630
- logger.info("Backend health check failed", LogFileType.BACKEND);
2631
- if (this.isExternalBackend) {
2632
- this.isExternalBackend = false;
2633
- this.isRunning = false;
2634
- await this.start();
2635
- } else if (this.process) {
2636
- await this.stop();
2637
- await this.start();
2638
- }
2639
- }
2778
+ this.healthCheckInterval = setInterval(() => {
2779
+ void this.checkUnhealthyBackend();
2640
2780
  }, 3e4);
2641
2781
  }
2782
+ /**
2783
+ * The watchdog's action for one unhealthy sample.
2784
+ *
2785
+ * A method rather than a closure body so the restart INTENT below is
2786
+ * assertable without waiting out a 30s interval.
2787
+ */
2788
+ async checkUnhealthyBackend() {
2789
+ const isHealthy = await this.checkHealth();
2790
+ if (isHealthy) return;
2791
+ logger.info("Backend health check failed", LogFileType.BACKEND);
2792
+ if (this.isExternalBackend) {
2793
+ this.isExternalBackend = false;
2794
+ this.isRunning = false;
2795
+ await this.start();
2796
+ return;
2797
+ }
2798
+ if (!this.process) {
2799
+ if (this.isDisabled || this.isAppClosing || this.isAutoUpdating) return;
2800
+ logger.info(
2801
+ "Backend process is gone; starting a replacement",
2802
+ LogFileType.BACKEND
2803
+ );
2804
+ await this.start();
2805
+ return;
2806
+ }
2807
+ await this.stop(true);
2808
+ await this.start();
2809
+ }
2642
2810
  /**
2643
2811
  * Get the port number used by the backend service
2644
2812
  * @returns The port number
@@ -3878,6 +4046,9 @@ function registerDesktopIPC(window, expectedUrl, request, streams, media, notifi
3878
4046
  if (typeof args?.sessionId !== "string" || typeof args.subscriptionId !== "string" || typeof args.visible !== "boolean" || typeof args.focused !== "boolean") {
3879
4047
  throw new Error("Invalid watch heartbeat.");
3880
4048
  }
4049
+ if (!SUBSCRIPTION_ID_PATTERN.test(args.subscriptionId)) {
4050
+ throw new Error("No live event subscription to lease.");
4051
+ }
3881
4052
  return notifier.heartbeat(event.sender.id, {
3882
4053
  sessionId: args.sessionId,
3883
4054
  subscriptionId: args.subscriptionId,
@@ -73,6 +73,10 @@ const electronAPI = {
73
73
  }
74
74
  }
75
75
  };
76
+ const DESKTOP_STREAM_DETAIL = {
77
+ /** The IPC subscribe itself rejected before a stream existed. */
78
+ openFailed: "The event stream could not be opened."
79
+ };
76
80
  const api = {
77
81
  desktop: {
78
82
  request: (request) => electron.ipcRenderer.invoke("desktop-request", request),
@@ -91,20 +95,29 @@ const api = {
91
95
  },
92
96
  stream: {
93
97
  subscribe: (args, onEvent) => {
94
- const streamIdPromise = electron.ipcRenderer.invoke("desktop-stream-subscribe", args).then((handle) => handle.streamId);
98
+ const settled = electron.ipcRenderer.invoke("desktop-stream-subscribe", args).then((handle) => handle.streamId).catch(() => {
99
+ onEvent({
100
+ streamId: "",
101
+ kind: "error",
102
+ detail: DESKTOP_STREAM_DETAIL.openFailed
103
+ });
104
+ return null;
105
+ });
95
106
  const handler = (_event, frame) => {
96
- void streamIdPromise.then((streamId) => {
97
- if (frame.streamId === streamId) onEvent(frame);
107
+ void settled.then((streamId) => {
108
+ if (streamId !== null && frame.streamId === streamId)
109
+ onEvent(frame);
98
110
  });
99
111
  };
100
112
  electron.ipcRenderer.on("desktop-stream-event", handler);
101
113
  return {
102
- streamId: streamIdPromise,
114
+ streamId: settled.then((streamId) => streamId ?? ""),
103
115
  dispose: () => {
104
116
  electron.ipcRenderer.removeListener("desktop-stream-event", handler);
105
- void streamIdPromise.then(
106
- (streamId) => electron.ipcRenderer.invoke("desktop-stream-unsubscribe", streamId)
107
- );
117
+ void settled.then((streamId) => {
118
+ if (streamId !== null)
119
+ electron.ipcRenderer.invoke("desktop-stream-unsubscribe", streamId);
120
+ });
108
121
  }
109
122
  };
110
123
  }
@@ -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-CbXRn6Sz.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-CXUoJGge.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-Dl__bWA7.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-BxDLTp0O.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-CXUoJGge.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-BxDLTp0O.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-Bt3GeFFS.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-CFAVcqcg.js";import{S as be}from"./square-pen-ztv62ABT.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-BowqVPFo.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-CE4SVRJy.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-D_A5gtvt.js";import{S as be}from"./square-pen-Kx7D4qf-.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-Njja4mrf.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-Bt3GeFFS.js";import{C as k}from"./compact-pagination-BoBK24RF.js";import{P as v}from"./page-header-6ahaMOFS.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-CFAVcqcg.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-BowqVPFo.js";/**
1
+ import{a as p,j as e,c as j,r as m,S as y}from"./icon-CE4SVRJy.js";import{C as k}from"./compact-pagination-B96s9yzm.js";import{P as v}from"./page-header-DRId65yK.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-D_A5gtvt.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-Njja4mrf.js";/**
2
2
  * @license lucide-react v0.507.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.