local-operator-ui 0.22.0 → 0.22.2
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 +203 -81
- package/out/preload/index.js +20 -7
- package/out/renderer/assets/{_basePickBy-BeQ9vtr8.js → _basePickBy-v-Y85eBJ.js} +1 -1
- package/out/renderer/assets/{_baseUniq-jNQP-e40.js → _baseUniq-Dndv7mIT.js} +1 -1
- package/out/renderer/assets/{agent-details-page-9uaeITDU.js → agent-details-page-B1l-Ildt.js} +1 -1
- package/out/renderer/assets/{agent-hub-page-D00EYmFH.js → agent-hub-page-CpTVj2dS.js} +1 -1
- package/out/renderer/assets/{agents-page-tvOD-Uab.js → agents-page-8xM34xSF.js} +2 -2
- package/out/renderer/assets/{architectureDiagram-IEHRJDOE-DiG6lB3k.js → architectureDiagram-IEHRJDOE-Df23ykyB.js} +1 -1
- package/out/renderer/assets/{blockDiagram-JOT3LUYC-BwDJ8ME3.js → blockDiagram-JOT3LUYC-Cac8-vwq.js} +1 -1
- package/out/renderer/assets/{c4Diagram-VJAJSXHY-C6i03Pqk.js → c4Diagram-VJAJSXHY-RicFnhXc.js} +1 -1
- package/out/renderer/assets/channel-D3vO5bAC.js +1 -0
- package/out/renderer/assets/{chunk-4BMEZGHF-CTx_WrmV.js → chunk-4BMEZGHF-DXZkik7U.js} +1 -1
- package/out/renderer/assets/{chunk-A2AXSNBT-Dg8PU2Hw.js → chunk-A2AXSNBT-pZLWtnhN.js} +1 -1
- package/out/renderer/assets/{chunk-AEK57VVT-CBp1W_io.js → chunk-AEK57VVT-DNrkOAjU.js} +1 -1
- package/out/renderer/assets/{chunk-D6G4REZN-DOqf6sBF.js → chunk-D6G4REZN-CorkotEf.js} +1 -1
- package/out/renderer/assets/{chunk-RZ5BOZE2-c4NZDSCk.js → chunk-RZ5BOZE2-D4xWVS0R.js} +1 -1
- package/out/renderer/assets/{chunk-XZIHB7SX-M80AzyRM.js → chunk-XZIHB7SX-D7WktCYW.js} +1 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-DJvhnt-8.js +1 -0
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-DJvhnt-8.js +1 -0
- package/out/renderer/assets/clone-DoopEJwX.js +1 -0
- package/out/renderer/assets/{compact-pagination-B8AHJW_h.js → compact-pagination-BlTai0Ff.js} +1 -1
- package/out/renderer/assets/{dagre-OKDRZEBW-CIHoQTiW.js → dagre-OKDRZEBW-c9Mr4-AU.js} +1 -1
- package/out/renderer/assets/{diagram-SSKATNLV-CBv6-N1r.js → diagram-SSKATNLV-CmfBg6xX.js} +1 -1
- package/out/renderer/assets/{diagram-VNBRO52H-oe2NlrCN.js → diagram-VNBRO52H-D1cSBo4P.js} +1 -1
- package/out/renderer/assets/{erDiagram-Q7BY3M3F-BnkIqgqC.js → erDiagram-Q7BY3M3F-fB9ALlLN.js} +1 -1
- package/out/renderer/assets/{flowDiagram-4HSFHLVR-xUqJ9igl.js → flowDiagram-4HSFHLVR-Bn3e8oxz.js} +1 -1
- package/out/renderer/assets/{ganttDiagram-APWFNJXF-BX1_Rgv5.js → ganttDiagram-APWFNJXF-DmZUyMxr.js} +1 -1
- package/out/renderer/assets/{gitGraphDiagram-7IBYFJ6S-XPpNnM_f.js → gitGraphDiagram-7IBYFJ6S-CXpqrbfr.js} +1 -1
- package/out/renderer/assets/{graph-Cp5inlbe.js → graph-DRSRhBY0.js} +1 -1
- package/out/renderer/assets/{icon-DDxGQ4fY.css → icon-yt1cm_p2.css} +1 -1
- package/out/renderer/assets/{index-CdXgOl0F.js → index-C25cieuM.js} +1 -1
- package/out/renderer/assets/{index-C4_Ypk8f.js → index-DkZ3A4PA.js} +1 -1
- package/out/renderer/assets/{index-f1OMVN5Q.js → index-H_Rgms2j.js} +307 -307
- package/out/renderer/assets/{infoDiagram-PH2N3AL5-NEuE_EoZ.js → infoDiagram-PH2N3AL5-B17SCqgG.js} +1 -1
- package/out/renderer/assets/{installer-d_BYw04I.js → installer-BYBL1HRx.js} +1 -1
- package/out/renderer/assets/{journeyDiagram-U35MCT3I-1ZGyp-FK.js → journeyDiagram-U35MCT3I-Cml5TxnU.js} +1 -1
- package/out/renderer/assets/{kanban-definition-NDS4AKOZ-CHRRjxYu.js → kanban-definition-NDS4AKOZ-CGeUw2LK.js} +1 -1
- package/out/renderer/assets/{layout-owitWDQ9.js → layout-CsdxABYc.js} +1 -1
- package/out/renderer/assets/{legacy-agents-page-CPgqQdYZ.js → legacy-agents-page-Cm8UE3k2.js} +1 -1
- package/out/renderer/assets/{mermaid.core-ByEjDU8I.js → mermaid.core-CgVHZN2K.js} +5 -5
- package/out/renderer/assets/{mindmap-definition-ALO5MXBD-acZmrSZp.js → mindmap-definition-ALO5MXBD-DVUST4ba.js} +1 -1
- package/out/renderer/assets/{page-header-ENK--OpK.js → page-header-jeCj1yzY.js} +1 -1
- package/out/renderer/assets/{parseISO-Cfsnb_ML.js → parseISO-BCF0vJu2.js} +1 -1
- package/out/renderer/assets/{pieDiagram-IB7DONF6-CBlmSuUy.js → pieDiagram-IB7DONF6-BlYbc34V.js} +1 -1
- package/out/renderer/assets/{quadrantDiagram-7GDLP6J5-FH2q_WHS.js → quadrantDiagram-7GDLP6J5-Cpxqo61P.js} +1 -1
- package/out/renderer/assets/{radar-MK3ICKWK-B7OziLd9.js → radar-MK3ICKWK-BkC9BU27.js} +1 -1
- package/out/renderer/assets/{radient-auth-buttons-CHSdmLM3.js → radient-auth-buttons-DxPib61R.js} +1 -1
- package/out/renderer/assets/{requirementDiagram-KVF5MWMF-xIQ9gKv2.js → requirementDiagram-KVF5MWMF-DsmIBK9A.js} +1 -1
- package/out/renderer/assets/{sankeyDiagram-QLVOVGJD-BR57eoXB.js → sankeyDiagram-QLVOVGJD-ClduKe0A.js} +1 -1
- package/out/renderer/assets/{schedules-page-CgpgOnly.js → schedules-page-ISfzO2Sn.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-X6HHIX6F-ly8FBjif.js → sequenceDiagram-X6HHIX6F-BFGhahNN.js} +1 -1
- package/out/renderer/assets/{settings-page-DzMBU4wg.js → settings-page-BlqXX31a.js} +1 -1
- package/out/renderer/assets/{square-pen-BpQ_6Lgs.js → square-pen-qntJecec.js} +1 -1
- package/out/renderer/assets/{stateDiagram-DGXRK772-D8q6PM3f.js → stateDiagram-DGXRK772-CurKWGiG.js} +1 -1
- package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-Dvqfa11m.js +1 -0
- package/out/renderer/assets/{timeline-definition-BDJGKUSR-DMXdshQZ.js → timeline-definition-BDJGKUSR-_K3YGfmM.js} +1 -1
- package/out/renderer/assets/{use-agent-like-mutation-y0mt7F5Z.js → use-agent-like-mutation-DO1KMtbB.js} +1 -1
- package/out/renderer/assets/{xychartDiagram-VJFVF3MP-CHwXE1ES.js → xychartDiagram-VJFVF3MP-pWutYnMr.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-CJMp_ZIa.js +0 -1
- package/out/renderer/assets/classDiagram-GIVACNV2-CJU4ZrqI.js +0 -1
- package/out/renderer/assets/classDiagram-v2-COTLJTTW-CJU4ZrqI.js +0 -1
- package/out/renderer/assets/clone-D9uKrDcZ.js +0 -1
- package/out/renderer/assets/stateDiagram-v2-YXO3MK2T-CUS9Wd9Z.js +0 -1
- /package/out/renderer/assets/{icon-D_ZYoi4t.js → icon-CzgfFzcx.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(
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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)
|
|
1792
|
-
*
|
|
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
|
-
*
|
|
2166
|
-
*
|
|
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
|
|
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
|
-
|
|
2532
|
-
|
|
2533
|
-
(
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
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
|
-
|
|
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(
|
|
2677
|
-
|
|
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,
|
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-Dndv7mIT.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-CgVHZN2K.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ℜ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-CgVHZN2K.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-9uaeITDU.js → agent-details-page-B1l-Ildt.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-CzgfFzcx.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-H_Rgms2j.js";import{S as be}from"./square-pen-qntJecec.js";import{u as we,a as ve,b as Ce,c as Ne}from"./use-agent-like-mutation-DO1KMtbB.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-CzgfFzcx.js";import{C as k}from"./compact-pagination-BlTai0Ff.js";import{P as v}from"./page-header-jeCj1yzY.js";import{J as b,X as A,Y as h,Z as L,$ as N}from"./index-H_Rgms2j.js";import{u as C,a as P,b as w,c as M}from"./use-agent-like-mutation-DO1KMtbB.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-
|
|
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-Cm8UE3k2.js","./icon-CzgfFzcx.js","./icon-yt1cm_p2.css","./page-header-jeCj1yzY.js","./index-H_Rgms2j.js","./index-aW0Bo_1a.css","./radient-auth-buttons-DxPib61R.js","./compact-pagination-BlTai0Ff.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-H_Rgms2j.js";import{j as e,r as n,B as u,c as P}from"./icon-CzgfFzcx.js";const ae=n.lazy(()=>te(()=>import("./legacy-agents-page-Cm8UE3k2.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};
|