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.
- package/out/main/index.js +253 -82
- package/out/preload/index.js +20 -7
- package/out/renderer/assets/{_basePickBy-DCkhfufs.js → _basePickBy-CQf9pXjH.js} +1 -1
- package/out/renderer/assets/{_baseUniq-CbXRn6Sz.js → _baseUniq-Dl__bWA7.js} +1 -1
- package/out/renderer/assets/{agent-details-page-CzZG1eTh.js → agent-details-page-BFRNeq_9.js} +1 -1
- package/out/renderer/assets/{agent-hub-page-BUlhFKrQ.js → agent-hub-page-C5uTa1OP.js} +1 -1
- package/out/renderer/assets/{agents-page-BChq9qh8.js → agents-page-Dsjf2XVl.js} +2 -2
- package/out/renderer/assets/{architectureDiagram-IEHRJDOE-CUcZIqGz.js → architectureDiagram-IEHRJDOE-CX1LT070.js} +1 -1
- package/out/renderer/assets/{blockDiagram-JOT3LUYC-C8iWDIl7.js → blockDiagram-JOT3LUYC-BHvh337m.js} +1 -1
- package/out/renderer/assets/{c4Diagram-VJAJSXHY-Rf7kjwb8.js → c4Diagram-VJAJSXHY-CB25WTAa.js} +1 -1
- package/out/renderer/assets/channel-DVkN6WFV.js +1 -0
- package/out/renderer/assets/{chunk-4BMEZGHF-B8xwSed9.js → chunk-4BMEZGHF-CdL7mvmD.js} +1 -1
- package/out/renderer/assets/{chunk-A2AXSNBT-Cd443Eh9.js → chunk-A2AXSNBT-CTXaSuto.js} +1 -1
- package/out/renderer/assets/{chunk-AEK57VVT-CfWs2qUA.js → chunk-AEK57VVT-BEicr1Dd.js} +1 -1
- package/out/renderer/assets/{chunk-D6G4REZN-DQS_tD7n.js → chunk-D6G4REZN-CFWRaGZz.js} +1 -1
- package/out/renderer/assets/{chunk-RZ5BOZE2-GGjWUC8K.js → chunk-RZ5BOZE2-CBpkIuQb.js} +1 -1
- package/out/renderer/assets/{chunk-XZIHB7SX-C_z5Swpc.js → chunk-XZIHB7SX-CzYmS0vQ.js} +1 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-BG_nYqj6.js +1 -0
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-BG_nYqj6.js +1 -0
- package/out/renderer/assets/clone-C_snK9kE.js +1 -0
- package/out/renderer/assets/{compact-pagination-BoBK24RF.js → compact-pagination-B96s9yzm.js} +1 -1
- package/out/renderer/assets/{dagre-OKDRZEBW-BeC8pWE9.js → dagre-OKDRZEBW-Do-kgEkR.js} +1 -1
- package/out/renderer/assets/{diagram-SSKATNLV-Bxa_2UeV.js → diagram-SSKATNLV-CsCb8wpf.js} +1 -1
- package/out/renderer/assets/{diagram-VNBRO52H-CadMYaoj.js → diagram-VNBRO52H-Dw7PjT0P.js} +1 -1
- package/out/renderer/assets/{erDiagram-Q7BY3M3F-MaHtoLsT.js → erDiagram-Q7BY3M3F-BWkH3nZy.js} +1 -1
- package/out/renderer/assets/{flowDiagram-4HSFHLVR-Dthy2ic-.js → flowDiagram-4HSFHLVR-CxX3FcH6.js} +1 -1
- package/out/renderer/assets/{ganttDiagram-APWFNJXF-CAk8SxD7.js → ganttDiagram-APWFNJXF-YCFrsDSI.js} +1 -1
- package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-Dva-2htw.js → gitGraphDiagram-7IBYFJ6S-BYdWJ5DA.js} +1 -1
- package/out/renderer/assets/{graph-s_OViwzG.js → graph-ComyQBRb.js} +1 -1
- package/out/renderer/assets/{icon-Bt3GeFFS.js → icon-CE4SVRJy.js} +30 -30
- package/out/renderer/assets/icon-QMJVPxLk.css +1 -0
- package/out/renderer/assets/{index-CsCp5pB0.js → index-DDsRNI1O.js} +1 -1
- package/out/renderer/assets/{index--bextIso.js → index-DQUWRv4C.js} +1 -1
- package/out/renderer/assets/{index-CFAVcqcg.js → index-D_A5gtvt.js} +332 -323
- package/out/renderer/assets/{infoDiagram-PH2N3AL5-i9VhPGfZ.js → infoDiagram-PH2N3AL5-DFQIA9CA.js} +1 -1
- package/out/renderer/assets/{installer-Dk6RajAB.js → installer-Dk2DPu97.js} +1 -1
- package/out/renderer/assets/{journeyDiagram-U35MCT3I-DjN1JRcf.js → journeyDiagram-U35MCT3I-CJBnzG-O.js} +1 -1
- package/out/renderer/assets/{kanban-definition-NDS4AKOZ-DeBvWNw2.js → kanban-definition-NDS4AKOZ-CD0zYhU1.js} +1 -1
- package/out/renderer/assets/{layout-D9rlSDZl.js → layout-g2mCw-ag.js} +1 -1
- package/out/renderer/assets/{legacy-agents-page-E3hHPrtT.js → legacy-agents-page-DYU9zDAP.js} +4 -4
- package/out/renderer/assets/{mermaid.core-CXUoJGge.js → mermaid.core-BxDLTp0O.js} +5 -5
- package/out/renderer/assets/{mindmap-definition-ALO5MXBD-CsbDlfvY.js → mindmap-definition-ALO5MXBD-CtrzjPYX.js} +1 -1
- package/out/renderer/assets/{page-header-6ahaMOFS.js → page-header-DRId65yK.js} +1 -1
- package/out/renderer/assets/{parseISO-BvU3ISTP.js → parseISO-BAPYsQpI.js} +1 -1
- package/out/renderer/assets/{pieDiagram-IB7DONF6-wWJJMpcD.js → pieDiagram-IB7DONF6-BtXIEy7w.js} +1 -1
- package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-B1gEaGpX.js → quadrantDiagram-7GDLP6J5-B2MB8zLh.js} +1 -1
- package/out/renderer/assets/{radar-MK3ICKWK-BsQyOA66.js → radar-MK3ICKWK-wEym7YVM.js} +1 -1
- package/out/renderer/assets/radient-auth-buttons-BzWCAZ_N.js +6 -0
- package/out/renderer/assets/{requirementDiagram-KVF5MWMF-DFGVsPwn.js → requirementDiagram-KVF5MWMF-8tAGZJgl.js} +1 -1
- package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-Cpr12W3J.js → sankeyDiagram-QLVOVGJD-C3TpTAdo.js} +1 -1
- package/out/renderer/assets/{schedules-page-DLGJUTRX.js → schedules-page-aInPZ6Nj.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-CY6u9Tii.js → sequenceDiagram-X6HHIX6F-BdmPdYc4.js} +1 -1
- package/out/renderer/assets/settings-page-BOMpNRHm.js +159 -0
- package/out/renderer/assets/{square-pen-ztv62ABT.js → square-pen-Kx7D4qf-.js} +1 -1
- package/out/renderer/assets/{stateDiagram-DGXRK772-DvrY4Q_D.js → stateDiagram-DGXRK772-DEafFSZS.js} +1 -1
- package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-C1d0k_1g.js +1 -0
- package/out/renderer/assets/{timeline-definition-BDJGKUSR-B8_J7X8q.js → timeline-definition-BDJGKUSR-GokU5DHP.js} +1 -1
- package/out/renderer/assets/{use-agent-like-mutation-BowqVPFo.js → use-agent-like-mutation-Njja4mrf.js} +1 -1
- package/out/renderer/assets/{xychartDiagram-VJFVF3MP-D7x_UntQ.js → xychartDiagram-VJFVF3MP-6VbWNkOe.js} +1 -1
- package/out/renderer/index.html +3 -3
- package/out/renderer/installer.html +3 -3
- package/package.json +2 -2
- package/out/renderer/assets/channel-C0H6vNPZ.js +0 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-CK43jL1V.js +0 -1
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-CK43jL1V.js +0 -1
- package/out/renderer/assets/clone-C7ZRecHq.js +0 -1
- package/out/renderer/assets/icon-ByNY0u25.css +0 -1
- package/out/renderer/assets/radient-auth-buttons-Dzwx2_bO.js +0 -6
- package/out/renderer/assets/settings-page-zkuTaAfc.js +0 -165
- 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(
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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)
|
|
1743
|
-
*
|
|
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
|
-
*
|
|
2117
|
-
*
|
|
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
|
|
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
|
-
|
|
2483
|
-
|
|
2484
|
-
(
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
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
|
-
|
|
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(
|
|
2628
|
-
|
|
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,
|
package/out/preload/index.js
CHANGED
|
@@ -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
|
|
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
|
|
97
|
-
if (frame.streamId === streamId)
|
|
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:
|
|
114
|
+
streamId: settled.then((streamId) => streamId ?? ""),
|
|
103
115
|
dispose: () => {
|
|
104
116
|
electron.ipcRenderer.removeListener("desktop-stream-event", handler);
|
|
105
|
-
void
|
|
106
|
-
(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-
|
|
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ℜ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ℜ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};
|
package/out/renderer/assets/{agent-details-page-CzZG1eTh.js → agent-details-page-BFRNeq_9.js}
RENAMED
|
@@ -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-
|
|
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-
|
|
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.
|