local-operator-ui 0.22.0 → 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 (68) hide show
  1. package/out/main/index.js +203 -81
  2. package/out/preload/index.js +20 -7
  3. package/out/renderer/assets/{_basePickBy-BeQ9vtr8.js → _basePickBy-CQf9pXjH.js} +1 -1
  4. package/out/renderer/assets/{_baseUniq-jNQP-e40.js → _baseUniq-Dl__bWA7.js} +1 -1
  5. package/out/renderer/assets/{agent-details-page-9uaeITDU.js → agent-details-page-BFRNeq_9.js} +1 -1
  6. package/out/renderer/assets/{agent-hub-page-D00EYmFH.js → agent-hub-page-C5uTa1OP.js} +1 -1
  7. package/out/renderer/assets/{agents-page-tvOD-Uab.js → agents-page-Dsjf2XVl.js} +2 -2
  8. package/out/renderer/assets/{architectureDiagram-IEHRJDOE-DiG6lB3k.js → architectureDiagram-IEHRJDOE-CX1LT070.js} +1 -1
  9. package/out/renderer/assets/{blockDiagram-JOT3LUYC-BwDJ8ME3.js → blockDiagram-JOT3LUYC-BHvh337m.js} +1 -1
  10. package/out/renderer/assets/{c4Diagram-VJAJSXHY-C6i03Pqk.js → c4Diagram-VJAJSXHY-CB25WTAa.js} +1 -1
  11. package/out/renderer/assets/channel-DVkN6WFV.js +1 -0
  12. package/out/renderer/assets/{chunk-4BMEZGHF-CTx_WrmV.js → chunk-4BMEZGHF-CdL7mvmD.js} +1 -1
  13. package/out/renderer/assets/{chunk-A2AXSNBT-Dg8PU2Hw.js → chunk-A2AXSNBT-CTXaSuto.js} +1 -1
  14. package/out/renderer/assets/{chunk-AEK57VVT-CBp1W_io.js → chunk-AEK57VVT-BEicr1Dd.js} +1 -1
  15. package/out/renderer/assets/{chunk-D6G4REZN-DOqf6sBF.js → chunk-D6G4REZN-CFWRaGZz.js} +1 -1
  16. package/out/renderer/assets/{chunk-RZ5BOZE2-c4NZDSCk.js → chunk-RZ5BOZE2-CBpkIuQb.js} +1 -1
  17. package/out/renderer/assets/{chunk-XZIHB7SX-M80AzyRM.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-B8AHJW_h.js → compact-pagination-B96s9yzm.js} +1 -1
  22. package/out/renderer/assets/{dagre-OKDRZEBW-CIHoQTiW.js → dagre-OKDRZEBW-Do-kgEkR.js} +1 -1
  23. package/out/renderer/assets/{diagram-SSKATNLV-CBv6-N1r.js → diagram-SSKATNLV-CsCb8wpf.js} +1 -1
  24. package/out/renderer/assets/{diagram-VNBRO52H-oe2NlrCN.js → diagram-VNBRO52H-Dw7PjT0P.js} +1 -1
  25. package/out/renderer/assets/{erDiagram-Q7BY3M3F-BnkIqgqC.js → erDiagram-Q7BY3M3F-BWkH3nZy.js} +1 -1
  26. package/out/renderer/assets/{flowDiagram-4HSFHLVR-xUqJ9igl.js → flowDiagram-4HSFHLVR-CxX3FcH6.js} +1 -1
  27. package/out/renderer/assets/{ganttDiagram-APWFNJXF-BX1_Rgv5.js → ganttDiagram-APWFNJXF-YCFrsDSI.js} +1 -1
  28. package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-XPpNnM_f.js → gitGraphDiagram-7IBYFJ6S-BYdWJ5DA.js} +1 -1
  29. package/out/renderer/assets/{graph-Cp5inlbe.js → graph-ComyQBRb.js} +1 -1
  30. package/out/renderer/assets/icon-QMJVPxLk.css +1 -0
  31. package/out/renderer/assets/{index-C4_Ypk8f.js → index-DDsRNI1O.js} +1 -1
  32. package/out/renderer/assets/{index-CdXgOl0F.js → index-DQUWRv4C.js} +1 -1
  33. package/out/renderer/assets/{index-f1OMVN5Q.js → index-D_A5gtvt.js} +311 -311
  34. package/out/renderer/assets/{infoDiagram-PH2N3AL5-NEuE_EoZ.js → infoDiagram-PH2N3AL5-DFQIA9CA.js} +1 -1
  35. package/out/renderer/assets/{installer-d_BYw04I.js → installer-Dk2DPu97.js} +1 -1
  36. package/out/renderer/assets/{journeyDiagram-U35MCT3I-1ZGyp-FK.js → journeyDiagram-U35MCT3I-CJBnzG-O.js} +1 -1
  37. package/out/renderer/assets/{kanban-definition-NDS4AKOZ-CHRRjxYu.js → kanban-definition-NDS4AKOZ-CD0zYhU1.js} +1 -1
  38. package/out/renderer/assets/{layout-owitWDQ9.js → layout-g2mCw-ag.js} +1 -1
  39. package/out/renderer/assets/{legacy-agents-page-CPgqQdYZ.js → legacy-agents-page-DYU9zDAP.js} +1 -1
  40. package/out/renderer/assets/{mermaid.core-ByEjDU8I.js → mermaid.core-BxDLTp0O.js} +5 -5
  41. package/out/renderer/assets/{mindmap-definition-ALO5MXBD-acZmrSZp.js → mindmap-definition-ALO5MXBD-CtrzjPYX.js} +1 -1
  42. package/out/renderer/assets/{page-header-ENK--OpK.js → page-header-DRId65yK.js} +1 -1
  43. package/out/renderer/assets/{parseISO-Cfsnb_ML.js → parseISO-BAPYsQpI.js} +1 -1
  44. package/out/renderer/assets/{pieDiagram-IB7DONF6-CBlmSuUy.js → pieDiagram-IB7DONF6-BtXIEy7w.js} +1 -1
  45. package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-FH2q_WHS.js → quadrantDiagram-7GDLP6J5-B2MB8zLh.js} +1 -1
  46. package/out/renderer/assets/{radar-MK3ICKWK-B7OziLd9.js → radar-MK3ICKWK-wEym7YVM.js} +1 -1
  47. package/out/renderer/assets/{radient-auth-buttons-CHSdmLM3.js → radient-auth-buttons-BzWCAZ_N.js} +1 -1
  48. package/out/renderer/assets/{requirementDiagram-KVF5MWMF-xIQ9gKv2.js → requirementDiagram-KVF5MWMF-8tAGZJgl.js} +1 -1
  49. package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-BR57eoXB.js → sankeyDiagram-QLVOVGJD-C3TpTAdo.js} +1 -1
  50. package/out/renderer/assets/{schedules-page-CgpgOnly.js → schedules-page-aInPZ6Nj.js} +1 -1
  51. package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-ly8FBjif.js → sequenceDiagram-X6HHIX6F-BdmPdYc4.js} +1 -1
  52. package/out/renderer/assets/{settings-page-DzMBU4wg.js → settings-page-BOMpNRHm.js} +1 -1
  53. package/out/renderer/assets/{square-pen-BpQ_6Lgs.js → square-pen-Kx7D4qf-.js} +1 -1
  54. package/out/renderer/assets/{stateDiagram-DGXRK772-D8q6PM3f.js → stateDiagram-DGXRK772-DEafFSZS.js} +1 -1
  55. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-C1d0k_1g.js +1 -0
  56. package/out/renderer/assets/{timeline-definition-BDJGKUSR-DMXdshQZ.js → timeline-definition-BDJGKUSR-GokU5DHP.js} +1 -1
  57. package/out/renderer/assets/{use-agent-like-mutation-y0mt7F5Z.js → use-agent-like-mutation-Njja4mrf.js} +1 -1
  58. package/out/renderer/assets/{xychartDiagram-VJFVF3MP-CHwXE1ES.js → xychartDiagram-VJFVF3MP-6VbWNkOe.js} +1 -1
  59. package/out/renderer/index.html +3 -3
  60. package/out/renderer/installer.html +3 -3
  61. package/package.json +2 -2
  62. package/out/renderer/assets/channel-CJMp_ZIa.js +0 -1
  63. package/out/renderer/assets/classDiagram-GIVACNV2-CJU4ZrqI.js +0 -1
  64. package/out/renderer/assets/classDiagram-v2-COTLJTTW-CJU4ZrqI.js +0 -1
  65. package/out/renderer/assets/clone-D9uKrDcZ.js +0 -1
  66. package/out/renderer/assets/icon-DDxGQ4fY.css +0 -1
  67. package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CUS9Wd9Z.js +0 -1
  68. /package/out/renderer/assets/{icon-D_ZYoi4t.js → icon-CE4SVRJy.js} +0 -0
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),
@@ -249,7 +250,7 @@ const desktopRequestSchema = zod.z.discriminatedUnion("op", [
249
250
  zod.z.object({
250
251
  op: zod.z.literal("sessions.watch"),
251
252
  sessionId,
252
- subscriptionId: zod.z.string().regex(/^[a-f0-9]{32}$/),
253
+ subscriptionId: zod.z.string().regex(SUBSCRIPTION_ID_PATTERN),
253
254
  visible: zod.z.boolean(),
254
255
  canNotify: zod.z.boolean()
255
256
  }).strict(),
@@ -1262,8 +1263,38 @@ async function requestDesktopMedia(input, bytes, backendUrl, token) {
1262
1263
  };
1263
1264
  }
1264
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
+ };
1265
1288
  const SESSION_ID = /^[a-f0-9]{12}$/;
1266
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
+ }
1267
1298
  const MAX_FRAME_BYTES = 8 * 1024 * 1024;
1268
1299
  class DesktopStreamRelay {
1269
1300
  constructor(backendUrl, token) {
@@ -1293,7 +1324,15 @@ class DesktopStreamRelay {
1293
1324
  throw new Error("Invalid stream cursor.");
1294
1325
  }
1295
1326
  if (!this.token) {
1296
- 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 };
1297
1336
  }
1298
1337
  const streamId = node_crypto.randomBytes(16).toString("hex");
1299
1338
  const controller = new AbortController();
@@ -1332,7 +1371,7 @@ class DesktopStreamRelay {
1332
1371
  emit({
1333
1372
  streamId,
1334
1373
  kind: "error",
1335
- detail: `The event stream was refused (${response.status}).`
1374
+ detail: DESKTOP_STREAM_DETAIL.refused(response.status)
1336
1375
  });
1337
1376
  return;
1338
1377
  }
@@ -1350,7 +1389,7 @@ class DesktopStreamRelay {
1350
1389
  emit({
1351
1390
  streamId,
1352
1391
  kind: "error",
1353
- detail: "The event stream exceeded its frame budget."
1392
+ detail: DESKTOP_STREAM_DETAIL.frameBudget
1354
1393
  });
1355
1394
  reader.cancel().catch(() => void 0);
1356
1395
  return;
@@ -1377,7 +1416,7 @@ class DesktopStreamRelay {
1377
1416
  emit({
1378
1417
  streamId,
1379
1418
  kind: "error",
1380
- detail: error instanceof Error && error.name === "AbortError" ? "The event stream ended." : "The event stream connection failed."
1419
+ detail: transportFailureDetail(error)
1381
1420
  });
1382
1421
  }
1383
1422
  }
@@ -1788,10 +1827,25 @@ class BackendServiceManager {
1788
1827
  // Managed starts always rotate this; it is never exposed by preload or logs.
1789
1828
  desktopToken = process.env.LOCAL_OPERATOR_DESKTOP_TOKEN || null;
1790
1829
  /** Authenticated SSE relay for canonical session events. Recreated when the
1791
- * backend URL rotates (external-backend discovery) so streams cannot pin a
1792
- * 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. */
1793
1843
  streamRelay = null;
1794
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;
1795
1849
  /** Survives relay recreation so notifications never silently detach
1796
1850
  * when the backend URL rotates. */
1797
1851
  streamObserver = null;
@@ -1821,7 +1875,7 @@ class BackendServiceManager {
1821
1875
  }
1822
1876
  }
1823
1877
  getStreamRelay() {
1824
- if (!this.streamRelay || this.streamRelayUrl !== this.backendUrl) {
1878
+ if (!this.streamRelay || this.streamRelayUrl !== this.backendUrl || this.streamRelayToken !== this.desktopToken) {
1825
1879
  this.streamRelay?.dispose();
1826
1880
  this.streamRelay = new DesktopStreamRelay(
1827
1881
  this.backendUrl,
@@ -1829,9 +1883,28 @@ class BackendServiceManager {
1829
1883
  );
1830
1884
  this.streamRelay.observe(this.streamObserver);
1831
1885
  this.streamRelayUrl = this.backendUrl;
1886
+ this.streamRelayToken = this.desktopToken;
1832
1887
  }
1833
1888
  return this.streamRelay;
1834
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
+ }
1835
1908
  observeStream(observer) {
1836
1909
  this.streamObserver = observer;
1837
1910
  this.streamRelay?.observe(observer);
@@ -2162,8 +2235,55 @@ class BackendServiceManager {
2162
2235
  return false;
2163
2236
  }
2164
2237
  /**
2165
- * Check if an external backend is already running
2166
- * @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
2167
2287
  */
2168
2288
  async checkExistingBackend() {
2169
2289
  if (this.isDisabled) {
@@ -2173,6 +2293,13 @@ class BackendServiceManager {
2173
2293
  );
2174
2294
  return true;
2175
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
+ }
2176
2303
  try {
2177
2304
  logger.info(
2178
2305
  `Checking for external backend at ${this.backendUrl}/health`,
@@ -2191,8 +2318,15 @@ class BackendServiceManager {
2191
2318
  LogFileType.BACKEND
2192
2319
  );
2193
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
+ }
2194
2328
  logger.info(
2195
- "External backend detected and healthy",
2329
+ "External backend detected, healthy and paired",
2196
2330
  LogFileType.BACKEND
2197
2331
  );
2198
2332
  this.isExternalBackend = true;
@@ -2200,43 +2334,6 @@ class BackendServiceManager {
2200
2334
  return true;
2201
2335
  }
2202
2336
  } catch (error) {
2203
- try {
2204
- if (this.backendUrl.includes("127.0.0.1")) {
2205
- const altUrl = "http://localhost:1111";
2206
- logger.info(
2207
- `Trying alternative URL: ${altUrl}/health`,
2208
- LogFileType.BACKEND
2209
- );
2210
- const controller = new AbortController();
2211
- const timeoutId = setTimeout(() => controller.abort(), 5e3);
2212
- const response = await fetch(`${altUrl}/health`, {
2213
- method: "GET",
2214
- headers: { Accept: "application/json" },
2215
- signal: controller.signal
2216
- });
2217
- clearTimeout(timeoutId);
2218
- logger.info(
2219
- `Alternative URL health check response status: ${response.status}`,
2220
- LogFileType.BACKEND
2221
- );
2222
- if (response.ok) {
2223
- this.backendUrl = altUrl;
2224
- logger.info(
2225
- "External backend detected and healthy using alternative URL",
2226
- LogFileType.BACKEND
2227
- );
2228
- this.isExternalBackend = true;
2229
- this.notifyBackendReady();
2230
- return true;
2231
- }
2232
- }
2233
- } catch (altError) {
2234
- logger.error(
2235
- "Error checking alternative backend URL:",
2236
- LogFileType.BACKEND,
2237
- altError
2238
- );
2239
- }
2240
2337
  logger.error(
2241
2338
  "Error checking external backend:",
2242
2339
  LogFileType.BACKEND,
@@ -2427,6 +2524,7 @@ class BackendServiceManager {
2427
2524
  if (!isRestart) {
2428
2525
  this.isAppClosing = true;
2429
2526
  }
2527
+ this.disposeStreamRelay();
2430
2528
  if (this.healthCheckInterval) {
2431
2529
  clearInterval(this.healthCheckInterval);
2432
2530
  this.healthCheckInterval = null;
@@ -2528,22 +2626,24 @@ class BackendServiceManager {
2528
2626
  }
2529
2627
  } else if (this.process) {
2530
2628
  this.process.kill("SIGKILL");
2531
- try {
2532
- execPromise('pkill -f "local-operator serve"').catch(
2533
- (error) => {
2534
- logger.warn(
2535
- "Error killing processes by pattern:",
2536
- LogFileType.BACKEND,
2537
- error
2538
- );
2539
- }
2540
- );
2541
- } catch (pkillError) {
2542
- logger.warn(
2543
- "Error executing pkill command:",
2544
- LogFileType.BACKEND,
2545
- pkillError
2546
- );
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
+ }
2547
2647
  }
2548
2648
  setTimeout(() => {
2549
2649
  if (this.process) {
@@ -2552,10 +2652,12 @@ class BackendServiceManager {
2552
2652
  LogFileType.BACKEND
2553
2653
  );
2554
2654
  try {
2555
- execPromise('pkill -9 -f "local-operator serve"').catch(
2556
- () => {
2557
- }
2558
- );
2655
+ if (!isRestart) {
2656
+ execPromise(
2657
+ 'pkill -9 -f "local-operator serve"'
2658
+ ).catch(() => {
2659
+ });
2660
+ }
2559
2661
  this.process = null;
2560
2662
  this.isRunning = false;
2561
2663
  if (this.exitResolve) {
@@ -2673,21 +2775,38 @@ class BackendServiceManager {
2673
2775
  if (this.healthCheckInterval) {
2674
2776
  clearInterval(this.healthCheckInterval);
2675
2777
  }
2676
- this.healthCheckInterval = setInterval(async () => {
2677
- const isHealthy = await this.checkHealth();
2678
- if (!isHealthy) {
2679
- logger.info("Backend health check failed", LogFileType.BACKEND);
2680
- if (this.isExternalBackend) {
2681
- this.isExternalBackend = false;
2682
- this.isRunning = false;
2683
- await this.start();
2684
- } else if (this.process) {
2685
- await this.stop();
2686
- await this.start();
2687
- }
2688
- }
2778
+ this.healthCheckInterval = setInterval(() => {
2779
+ void this.checkUnhealthyBackend();
2689
2780
  }, 3e4);
2690
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
+ }
2691
2810
  /**
2692
2811
  * Get the port number used by the backend service
2693
2812
  * @returns The port number
@@ -3927,6 +4046,9 @@ function registerDesktopIPC(window, expectedUrl, request, streams, media, notifi
3927
4046
  if (typeof args?.sessionId !== "string" || typeof args.subscriptionId !== "string" || typeof args.visible !== "boolean" || typeof args.focused !== "boolean") {
3928
4047
  throw new Error("Invalid watch heartbeat.");
3929
4048
  }
4049
+ if (!SUBSCRIPTION_ID_PATTERN.test(args.subscriptionId)) {
4050
+ throw new Error("No live event subscription to lease.");
4051
+ }
3930
4052
  return notifier.heartbeat(event.sender.id, {
3931
4053
  sessionId: args.sessionId,
3932
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-jNQP-e40.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-ByEjDU8I.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-ByEjDU8I.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-D_ZYoi4t.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-f1OMVN5Q.js";import{S as be}from"./square-pen-BpQ_6Lgs.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-y0mt7F5Z.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-D_ZYoi4t.js";import{C as k}from"./compact-pagination-B8AHJW_h.js";import{P as v}from"./page-header-ENK--OpK.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-f1OMVN5Q.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-y0mt7F5Z.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.
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./legacy-agents-page-CPgqQdYZ.js","./icon-D_ZYoi4t.js","./icon-DDxGQ4fY.css","./page-header-ENK--OpK.js","./index-f1OMVN5Q.js","./index-aW0Bo_1a.css","./radient-auth-buttons-CHSdmLM3.js","./compact-pagination-B8AHJW_h.js"])))=>i.map(i=>d[i]);
2
- import{u as O,a as Q,b as J,d as V,c as W,e as G,f as H,g as X,B as Y,U as Z,P as ee,_ as te,h as $,i as z,j as U}from"./index-f1OMVN5Q.js";import{j as e,r as n,B as u,c as P}from"./icon-D_ZYoi4t.js";const ae=n.lazy(()=>te(()=>import("./legacy-agents-page-CPgqQdYZ.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url).then(t=>({default:t.LegacyAgentsPage}))),d="w-full rounded-md border border-control bg-surface px-3 py-2 text-body-sm text-ink";function T({profile:t,creating:v,onSaved:g}){const[r,k]=n.useState(!1),[o,m]=n.useState(v),[p,b]=n.useState(t?.name??""),[x,C]=n.useState(t?.kind??"role"),[h,y]=n.useState(t?.description??""),[j,S]=n.useState(t?.instructions??""),[_,D]=n.useState(t?.tools?.join(", ")??""),[I,N]=n.useState(t?.effort??"inherit"),[R,L]=n.useState(t?.delegate??!1),[f,a]=n.useState(!1),[c,l]=n.useState(null),i=n.useRef(null),w=$(),E=v||r,K=async s=>{if(s.preventDefault(),f)return;const M={kind:x,description:h,instructions:j,tools:_.split(",").map(q=>q.trim()).filter(Boolean),effort:I,delegate:R},A=JSON.stringify({name:p,fields:M,fresh:E});if(i.current&&i.current.body!==A){l("The previous save has not been confirmed. Retry it unchanged or reload the profile to reconcile before editing again.");return}i.current??={id:crypto.randomUUID(),body:A},a(!0),l(null);try{const q=await U({op:E?"profiles.create":"profiles.update",requestId:i.current.id,name:p,fields:M});i.current=null,m(!1),g(q.name)}catch(q){l(q instanceof Error?q.message:"Profile could not be saved.")}finally{a(!1)}},F=async()=>{if(!(!t||f)){a(!0),l(null);try{const s=await U({op:"profiles.install",name:t.name,requestId:crypto.randomUUID()});m(!1),k(!1),i.current=null,b(s.name),C(s.kind),y(s.description??""),S(s.instructions??""),D(s.tools?.join(", ")??""),N(s.effort??"inherit"),L(s.delegate??!1),g(s.name)}catch(s){l(s instanceof Error?s.message:"Profile could not be installed.")}finally{a(!1)}}};return e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("header",{children:[e.jsx("h1",{className:"text-title",children:E?r?"Extend agent":"Create agent":t?.name}),e.jsx("p",{className:"mt-2 text-body-sm text-ink-muted",children:"Reusable instructions shared by agent commands, subagents and teams. Chats remain separate."})]}),t&&!E&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{className:"text-meta text-ink-muted",children:[t.source==="builtin"?"Built-in":t.source==="installed"?"Installed":"Custom",t.divergent_fields?.length?" · Modified":""," ·"," ",t.kind]}),t.source==="builtin"?e.jsx(u,{variant:"outline",onClick:F,disabled:f,children:"Install"}):e.jsx(u,{variant:"outline",onClick:()=>m(!0),children:"Edit"}),e.jsx(u,{variant:"outline",onClick:()=>{k(!0),m(!0),b(""),i.current=null},children:"Extend"}),e.jsx(u,{onClick:()=>{z.getState().stageDraft({kind:"agent",name:t.name}),w("/chat")},children:"New chat"})]}),c&&e.jsx("p",{role:"alert",className:"text-body-sm text-danger",children:c}),!o&&t?.source==="builtin"&&e.jsx("p",{id:"builtin-readonly",className:"text-body-sm text-ink-muted",children:"Built-in agents are read-only. Install this one to edit it, or Extend it to start a separate agent from its instructions."}),e.jsxs("form",{onSubmit:K,className:"space-y-4",children:[e.jsxs("fieldset",{disabled:!o||f,className:"space-y-4",children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Name"}),e.jsx("input",{className:d,value:p,disabled:!E,required:!0,"aria-describedby":t?.source==="builtin"?"builtin-readonly":void 0,onChange:s=>b(s.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Kind"}),e.jsxs("select",{className:d,value:x,disabled:!E,onChange:s=>C(s.target.value),children:[e.jsx("option",{value:"role",children:"Role"}),e.jsx("option",{value:"specialist",children:"Specialist"})]})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"When to use this agent"}),e.jsx("input",{className:d,value:h,maxLength:8e3,onChange:s=>y(s.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Instructions"}),e.jsx("textarea",{className:P(d,"min-h-52"),value:j,required:!0,maxLength:8e3,onChange:s=>S(s.target.value)})]}),x==="role"&&e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Allowed tools"}),e.jsx("input",{className:d,value:_,onChange:s=>D(s.target.value),placeholder:"All tools when empty; otherwise comma-separated names"})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Effort tier"}),e.jsx("input",{className:d,value:I,onChange:s=>N(s.target.value),"aria-describedby":"effort-help"}),e.jsx("span",{id:"effort-help",className:"text-meta text-ink-muted",children:"Use inherit, or a tier configured in backend settings. Unsupported tiers are rejected before saving."})]}),e.jsxs("label",{className:"flex items-center gap-2 text-body-sm",children:[e.jsx("input",{type:"checkbox",checked:R,onChange:s=>L(s.target.checked)}),"May delegate to subagents"]})]})]}),o&&e.jsx(u,{type:"submit",disabled:f,children:f?"Saving…":E?"Create agent":"Save changes"})]}),!o&&t?.packaged_instructions&&t.divergent_fields?.length?e.jsxs("details",{className:"text-body-sm",children:[e.jsx("summary",{children:"Compare packaged instructions"}),e.jsx("pre",{className:"mt-2 whitespace-pre-wrap text-body-sm text-ink-muted",children:t.packaged_instructions})]}):null]})}function B({team:t,onSaved:v}){const[g,r]=n.useState(t?.name??""),[k,o]=n.useState(t?.description??""),[m,p]=n.useState(t?.manager??"manager"),[b,x]=n.useState((t?.members??[]).map(a=>({...a,key:crypto.randomUUID()}))),[C,h]=n.useState(t?.instructions??""),[y,j]=n.useState(t?.project??""),[S,_]=n.useState(!1),[D,I]=n.useState(null),N=n.useRef(null),R=$(),L=async a=>{if(a.preventDefault(),S)return;const c={name:g,description:k,manager:m,members:b.map(({key:i,...w})=>w),instructions:C,project:y},l=JSON.stringify(c);if(N.current&&N.current.body!==l){I("The previous save has not been confirmed. Reload the team before changing that request.");return}N.current??={id:crypto.randomUUID(),body:l},_(!0),I(null);try{const i=t?await U({op:"teams.update",name:t.name,requestId:N.current.id,fields:c}):await U({op:"teams.create",requestId:N.current.id,fields:c});N.current=null,v(i.name)}catch(i){I(i instanceof Error?i.message:"Team could not be saved.")}finally{_(!1)}},f=(a,c)=>x(l=>l.map((i,w)=>w===a?{...i,...c}:i));return e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("header",{children:[e.jsx("h1",{className:"text-title",children:t?t.name:"Create team"}),e.jsx("p",{className:"mt-2 text-body-sm text-ink-muted",children:"The manager leads the chat. Members retain their own instructions and start only when delegated work."})]}),t&&e.jsx(u,{onClick:()=>{z.getState().stageDraft({kind:"team",name:t.name}),R("/chat")},children:"New team chat"}),D&&e.jsx("p",{role:"alert",className:"text-body-sm text-danger",children:D}),e.jsxs("form",{onSubmit:L,className:"space-y-4",children:[e.jsxs("fieldset",{disabled:S,className:"space-y-4",children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Name"}),e.jsx("input",{className:d,required:!0,maxLength:64,value:g,onChange:a=>r(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Description"}),e.jsx("input",{className:d,value:k,onChange:a=>o(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Manager agent"}),e.jsx("input",{className:d,required:!0,value:m,onChange:a=>p(a.target.value)})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h2",{className:"text-heading",children:"Members"}),b.map((a,c)=>e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{className:P(d,"w-48 flex-1"),"aria-label":`Member ${c+1} name`,required:!0,value:a.role,onChange:l=>f(c,{role:l.target.value})}),e.jsxs("select",{className:P(d,"w-32"),"aria-label":`Member ${c+1} kind`,value:a.kind,onChange:l=>f(c,{kind:l.target.value}),children:[e.jsx("option",{value:"agent",children:"Agent"}),e.jsx("option",{value:"team",children:"Nested team"})]}),e.jsx("input",{className:P(d,"w-20"),"aria-label":`Member ${c+1} count`,type:"number",min:1,max:16,value:a.count,onChange:l=>f(c,{count:Number(l.target.value)})}),e.jsx(u,{type:"button",variant:"ghost",onClick:()=>x(l=>l.filter((i,w)=>w!==c)),children:"Remove"})]},a.key)),e.jsx(u,{type:"button",variant:"outline",onClick:()=>x(a=>[...a,{role:"",count:1,kind:"agent",key:crypto.randomUUID()}]),children:"Add member"})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Collaboration instructions"}),e.jsx("textarea",{className:P(d,"min-h-36"),maxLength:8e3,value:C,onChange:a=>h(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Project brief"}),e.jsx("textarea",{className:P(d,"min-h-36"),maxLength:8e3,value:y,onChange:a=>j(a.target.value)})]})]}),e.jsx(u,{type:"submit",disabled:S,children:S?"Saving…":t?"Save team":"Create team"})]})]})}function re(){const{agentId:t}=O(),[v,g]=Q(),r=v.get("kind")==="team"||v.get("create")==="team",k=v.has("create"),o=v.get("name"),m=J(),p=V(m.data,r?"team_catalogue":"profile_catalogue"),b=W(p&&!r),x=G(p&&r),C=H(),h=X({queryKey:["desktop",r?"team":"profile",o],enabled:p&&!!o&&!k,queryFn:()=>U({op:r?"teams.get":"profiles.get",name:o??""}),retry:!1}),y=async j=>{await C.invalidateQueries({queryKey:["desktop"]}),g({kind:r?"team":"agent",name:j})};return t?e.jsx(n.Suspense,{fallback:e.jsx("p",{className:"p-6 text-body",children:"Loading saved agent…"}),children:e.jsx(ae,{})}):e.jsxs("div",{className:"flex h-full min-h-0 bg-canvas text-ink",children:[e.jsxs("aside",{className:"flex w-64 shrink-0 flex-col gap-4 border-r border-hairline bg-surface p-4",children:[e.jsx("h1",{className:"text-heading",children:"Agents and teams"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(u,{variant:r?"ghost":"outline",onClick:()=>g({kind:"agent"}),children:[e.jsx(Y,{className:"size-4"}),"Agents"]}),e.jsxs(u,{variant:r?"outline":"ghost",onClick:()=>g({kind:"team"}),children:[e.jsx(Z,{className:"size-4"}),"Teams"]})]}),e.jsxs(u,{variant:"outline",disabled:!p,onClick:()=>g({create:r?"team":"agent"}),children:[e.jsx(ee,{className:"size-4"}),r?"Create team":"Create agent"]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto",children:(r?x.data:b.data)?.map(j=>e.jsx("button",{type:"button",className:P("flex h-8 w-full items-center rounded-md px-2 text-left text-body-sm hover:bg-elevated",j.name===o&&"bg-accent-wash"),onClick:()=>g({kind:r?"team":"agent",name:j.name}),children:e.jsx("span",{className:"truncate",children:j.name})},j.name))})]}),e.jsx("main",{className:"min-w-0 flex-1 overflow-auto p-6",children:p?b.error||x.error||h.error?e.jsxs("div",{role:"alert",children:[e.jsx("p",{className:"text-danger",children:b.error?.message||x.error?.message||h.error?.message}),e.jsx(u,{variant:"outline",onClick:()=>{b.refetch(),x.refetch(),h.refetch()},children:"Retry"})]}):k?r?e.jsx(B,{onSaved:y},"create-team"):e.jsx(T,{creating:!0,onSaved:y},"create-agent"):o&&h.isLoading?e.jsx("p",{"aria-live":"polite",children:"Loading details…"}):o&&h.data?r?e.jsx(B,{team:h.data,onSaved:y},o):e.jsx(T,{profile:h.data,creating:!1,onSaved:y},`${o}:${h.data.source}`):e.jsxs("div",{children:[e.jsx("h2",{className:"text-title",children:r?"Reusable teams":"Reusable agents"}),e.jsx("p",{className:"mt-2 text-body text-ink-muted",children:"Select a definition to view or edit it. A new chat does not change its definition."})]}):e.jsxs("div",{"aria-live":"polite",className:"space-y-3 text-body-sm",children:[e.jsx("p",{children:m.isLoading?"Connecting to the backend…":m.error?m.error.message:"Update the backend to manage reusable agents and teams. Saved chats are unchanged."}),e.jsx(u,{variant:"outline",onClick:()=>void m.refetch(),children:"Retry connection"})]})})]})}export{re as AgentsPage};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./legacy-agents-page-DYU9zDAP.js","./icon-CE4SVRJy.js","./icon-QMJVPxLk.css","./page-header-DRId65yK.js","./index-D_A5gtvt.js","./index-aW0Bo_1a.css","./radient-auth-buttons-BzWCAZ_N.js","./compact-pagination-B96s9yzm.js"])))=>i.map(i=>d[i]);
2
+ import{u as O,a as Q,b as J,d as V,c as W,e as G,f as H,g as X,B as Y,U as Z,P as ee,_ as te,h as $,i as z,j as U}from"./index-D_A5gtvt.js";import{j as e,r as n,B as u,c as P}from"./icon-CE4SVRJy.js";const ae=n.lazy(()=>te(()=>import("./legacy-agents-page-DYU9zDAP.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url).then(t=>({default:t.LegacyAgentsPage}))),d="w-full rounded-md border border-control bg-surface px-3 py-2 text-body-sm text-ink";function T({profile:t,creating:v,onSaved:g}){const[r,k]=n.useState(!1),[o,m]=n.useState(v),[p,b]=n.useState(t?.name??""),[x,C]=n.useState(t?.kind??"role"),[h,y]=n.useState(t?.description??""),[j,S]=n.useState(t?.instructions??""),[_,D]=n.useState(t?.tools?.join(", ")??""),[I,N]=n.useState(t?.effort??"inherit"),[R,L]=n.useState(t?.delegate??!1),[f,a]=n.useState(!1),[c,l]=n.useState(null),i=n.useRef(null),w=$(),E=v||r,K=async s=>{if(s.preventDefault(),f)return;const M={kind:x,description:h,instructions:j,tools:_.split(",").map(q=>q.trim()).filter(Boolean),effort:I,delegate:R},A=JSON.stringify({name:p,fields:M,fresh:E});if(i.current&&i.current.body!==A){l("The previous save has not been confirmed. Retry it unchanged or reload the profile to reconcile before editing again.");return}i.current??={id:crypto.randomUUID(),body:A},a(!0),l(null);try{const q=await U({op:E?"profiles.create":"profiles.update",requestId:i.current.id,name:p,fields:M});i.current=null,m(!1),g(q.name)}catch(q){l(q instanceof Error?q.message:"Profile could not be saved.")}finally{a(!1)}},F=async()=>{if(!(!t||f)){a(!0),l(null);try{const s=await U({op:"profiles.install",name:t.name,requestId:crypto.randomUUID()});m(!1),k(!1),i.current=null,b(s.name),C(s.kind),y(s.description??""),S(s.instructions??""),D(s.tools?.join(", ")??""),N(s.effort??"inherit"),L(s.delegate??!1),g(s.name)}catch(s){l(s instanceof Error?s.message:"Profile could not be installed.")}finally{a(!1)}}};return e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("header",{children:[e.jsx("h1",{className:"text-title",children:E?r?"Extend agent":"Create agent":t?.name}),e.jsx("p",{className:"mt-2 text-body-sm text-ink-muted",children:"Reusable instructions shared by agent commands, subagents and teams. Chats remain separate."})]}),t&&!E&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{className:"text-meta text-ink-muted",children:[t.source==="builtin"?"Built-in":t.source==="installed"?"Installed":"Custom",t.divergent_fields?.length?" · Modified":""," ·"," ",t.kind]}),t.source==="builtin"?e.jsx(u,{variant:"outline",onClick:F,disabled:f,children:"Install"}):e.jsx(u,{variant:"outline",onClick:()=>m(!0),children:"Edit"}),e.jsx(u,{variant:"outline",onClick:()=>{k(!0),m(!0),b(""),i.current=null},children:"Extend"}),e.jsx(u,{onClick:()=>{z.getState().stageDraft({kind:"agent",name:t.name}),w("/chat")},children:"New chat"})]}),c&&e.jsx("p",{role:"alert",className:"text-body-sm text-danger",children:c}),!o&&t?.source==="builtin"&&e.jsx("p",{id:"builtin-readonly",className:"text-body-sm text-ink-muted",children:"Built-in agents are read-only. Install this one to edit it, or Extend it to start a separate agent from its instructions."}),e.jsxs("form",{onSubmit:K,className:"space-y-4",children:[e.jsxs("fieldset",{disabled:!o||f,className:"space-y-4",children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Name"}),e.jsx("input",{className:d,value:p,disabled:!E,required:!0,"aria-describedby":t?.source==="builtin"?"builtin-readonly":void 0,onChange:s=>b(s.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Kind"}),e.jsxs("select",{className:d,value:x,disabled:!E,onChange:s=>C(s.target.value),children:[e.jsx("option",{value:"role",children:"Role"}),e.jsx("option",{value:"specialist",children:"Specialist"})]})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"When to use this agent"}),e.jsx("input",{className:d,value:h,maxLength:8e3,onChange:s=>y(s.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Instructions"}),e.jsx("textarea",{className:P(d,"min-h-52"),value:j,required:!0,maxLength:8e3,onChange:s=>S(s.target.value)})]}),x==="role"&&e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Allowed tools"}),e.jsx("input",{className:d,value:_,onChange:s=>D(s.target.value),placeholder:"All tools when empty; otherwise comma-separated names"})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Effort tier"}),e.jsx("input",{className:d,value:I,onChange:s=>N(s.target.value),"aria-describedby":"effort-help"}),e.jsx("span",{id:"effort-help",className:"text-meta text-ink-muted",children:"Use inherit, or a tier configured in backend settings. Unsupported tiers are rejected before saving."})]}),e.jsxs("label",{className:"flex items-center gap-2 text-body-sm",children:[e.jsx("input",{type:"checkbox",checked:R,onChange:s=>L(s.target.checked)}),"May delegate to subagents"]})]})]}),o&&e.jsx(u,{type:"submit",disabled:f,children:f?"Saving…":E?"Create agent":"Save changes"})]}),!o&&t?.packaged_instructions&&t.divergent_fields?.length?e.jsxs("details",{className:"text-body-sm",children:[e.jsx("summary",{children:"Compare packaged instructions"}),e.jsx("pre",{className:"mt-2 whitespace-pre-wrap text-body-sm text-ink-muted",children:t.packaged_instructions})]}):null]})}function B({team:t,onSaved:v}){const[g,r]=n.useState(t?.name??""),[k,o]=n.useState(t?.description??""),[m,p]=n.useState(t?.manager??"manager"),[b,x]=n.useState((t?.members??[]).map(a=>({...a,key:crypto.randomUUID()}))),[C,h]=n.useState(t?.instructions??""),[y,j]=n.useState(t?.project??""),[S,_]=n.useState(!1),[D,I]=n.useState(null),N=n.useRef(null),R=$(),L=async a=>{if(a.preventDefault(),S)return;const c={name:g,description:k,manager:m,members:b.map(({key:i,...w})=>w),instructions:C,project:y},l=JSON.stringify(c);if(N.current&&N.current.body!==l){I("The previous save has not been confirmed. Reload the team before changing that request.");return}N.current??={id:crypto.randomUUID(),body:l},_(!0),I(null);try{const i=t?await U({op:"teams.update",name:t.name,requestId:N.current.id,fields:c}):await U({op:"teams.create",requestId:N.current.id,fields:c});N.current=null,v(i.name)}catch(i){I(i instanceof Error?i.message:"Team could not be saved.")}finally{_(!1)}},f=(a,c)=>x(l=>l.map((i,w)=>w===a?{...i,...c}:i));return e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("header",{children:[e.jsx("h1",{className:"text-title",children:t?t.name:"Create team"}),e.jsx("p",{className:"mt-2 text-body-sm text-ink-muted",children:"The manager leads the chat. Members retain their own instructions and start only when delegated work."})]}),t&&e.jsx(u,{onClick:()=>{z.getState().stageDraft({kind:"team",name:t.name}),R("/chat")},children:"New team chat"}),D&&e.jsx("p",{role:"alert",className:"text-body-sm text-danger",children:D}),e.jsxs("form",{onSubmit:L,className:"space-y-4",children:[e.jsxs("fieldset",{disabled:S,className:"space-y-4",children:[e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Name"}),e.jsx("input",{className:d,required:!0,maxLength:64,value:g,onChange:a=>r(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Description"}),e.jsx("input",{className:d,value:k,onChange:a=>o(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Manager agent"}),e.jsx("input",{className:d,required:!0,value:m,onChange:a=>p(a.target.value)})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h2",{className:"text-heading",children:"Members"}),b.map((a,c)=>e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{className:P(d,"w-48 flex-1"),"aria-label":`Member ${c+1} name`,required:!0,value:a.role,onChange:l=>f(c,{role:l.target.value})}),e.jsxs("select",{className:P(d,"w-32"),"aria-label":`Member ${c+1} kind`,value:a.kind,onChange:l=>f(c,{kind:l.target.value}),children:[e.jsx("option",{value:"agent",children:"Agent"}),e.jsx("option",{value:"team",children:"Nested team"})]}),e.jsx("input",{className:P(d,"w-20"),"aria-label":`Member ${c+1} count`,type:"number",min:1,max:16,value:a.count,onChange:l=>f(c,{count:Number(l.target.value)})}),e.jsx(u,{type:"button",variant:"ghost",onClick:()=>x(l=>l.filter((i,w)=>w!==c)),children:"Remove"})]},a.key)),e.jsx(u,{type:"button",variant:"outline",onClick:()=>x(a=>[...a,{role:"",count:1,kind:"agent",key:crypto.randomUUID()}]),children:"Add member"})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Collaboration instructions"}),e.jsx("textarea",{className:P(d,"min-h-36"),maxLength:8e3,value:C,onChange:a=>h(a.target.value)})]}),e.jsxs("label",{className:"block space-y-1 text-body-sm",children:[e.jsx("span",{children:"Project brief"}),e.jsx("textarea",{className:P(d,"min-h-36"),maxLength:8e3,value:y,onChange:a=>j(a.target.value)})]})]}),e.jsx(u,{type:"submit",disabled:S,children:S?"Saving…":t?"Save team":"Create team"})]})]})}function re(){const{agentId:t}=O(),[v,g]=Q(),r=v.get("kind")==="team"||v.get("create")==="team",k=v.has("create"),o=v.get("name"),m=J(),p=V(m.data,r?"team_catalogue":"profile_catalogue"),b=W(p&&!r),x=G(p&&r),C=H(),h=X({queryKey:["desktop",r?"team":"profile",o],enabled:p&&!!o&&!k,queryFn:()=>U({op:r?"teams.get":"profiles.get",name:o??""}),retry:!1}),y=async j=>{await C.invalidateQueries({queryKey:["desktop"]}),g({kind:r?"team":"agent",name:j})};return t?e.jsx(n.Suspense,{fallback:e.jsx("p",{className:"p-6 text-body",children:"Loading saved agent…"}),children:e.jsx(ae,{})}):e.jsxs("div",{className:"flex h-full min-h-0 bg-canvas text-ink",children:[e.jsxs("aside",{className:"flex w-64 shrink-0 flex-col gap-4 border-r border-hairline bg-surface p-4",children:[e.jsx("h1",{className:"text-heading",children:"Agents and teams"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(u,{variant:r?"ghost":"outline",onClick:()=>g({kind:"agent"}),children:[e.jsx(Y,{className:"size-4"}),"Agents"]}),e.jsxs(u,{variant:r?"outline":"ghost",onClick:()=>g({kind:"team"}),children:[e.jsx(Z,{className:"size-4"}),"Teams"]})]}),e.jsxs(u,{variant:"outline",disabled:!p,onClick:()=>g({create:r?"team":"agent"}),children:[e.jsx(ee,{className:"size-4"}),r?"Create team":"Create agent"]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto",children:(r?x.data:b.data)?.map(j=>e.jsx("button",{type:"button",className:P("flex h-8 w-full items-center rounded-md px-2 text-left text-body-sm hover:bg-elevated",j.name===o&&"bg-accent-wash"),onClick:()=>g({kind:r?"team":"agent",name:j.name}),children:e.jsx("span",{className:"truncate",children:j.name})},j.name))})]}),e.jsx("main",{className:"min-w-0 flex-1 overflow-auto p-6",children:p?b.error||x.error||h.error?e.jsxs("div",{role:"alert",children:[e.jsx("p",{className:"text-danger",children:b.error?.message||x.error?.message||h.error?.message}),e.jsx(u,{variant:"outline",onClick:()=>{b.refetch(),x.refetch(),h.refetch()},children:"Retry"})]}):k?r?e.jsx(B,{onSaved:y},"create-team"):e.jsx(T,{creating:!0,onSaved:y},"create-agent"):o&&h.isLoading?e.jsx("p",{"aria-live":"polite",children:"Loading details…"}):o&&h.data?r?e.jsx(B,{team:h.data,onSaved:y},o):e.jsx(T,{profile:h.data,creating:!1,onSaved:y},`${o}:${h.data.source}`):e.jsxs("div",{children:[e.jsx("h2",{className:"text-title",children:r?"Reusable teams":"Reusable agents"}),e.jsx("p",{className:"mt-2 text-body text-ink-muted",children:"Select a definition to view or edit it. A new chat does not change its definition."})]}):e.jsxs("div",{"aria-live":"polite",className:"space-y-3 text-body-sm",children:[e.jsx("p",{children:m.isLoading?"Connecting to the backend…":m.error?m.error.message:"Update the backend to manage reusable agents and teams. Saved chats are unchanged."}),e.jsx(u,{variant:"outline",onClick:()=>void m.refetch(),children:"Retry connection"})]})})]})}export{re as AgentsPage};