dsh-context 0.36.0 → 0.37.0
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/lib/client.js +135 -38
- package/lib/index.d.ts +89 -317
- package/lib/index.js +6 -3
- package/package.json +8 -9
package/lib/client.js
CHANGED
|
@@ -557,10 +557,10 @@ window.__ModuleLoader__.load({
|
|
|
557
557
|
const COMMAND = "context";
|
|
558
558
|
const LINE = "/context";
|
|
559
559
|
function registerContextCommand(ctx, kit) {
|
|
560
|
-
ctx.
|
|
561
|
-
const inputTriggers =
|
|
562
|
-
if (inputTriggers === void 0
|
|
563
|
-
|
|
560
|
+
ctx.inject(["inputTriggers"], (ictx) => {
|
|
561
|
+
const inputTriggers = ictx.get("inputTriggers");
|
|
562
|
+
if (inputTriggers === void 0 || typeof inputTriggers.registerSource !== "function") return;
|
|
563
|
+
ictx.effect(() => inputTriggers.registerSource({
|
|
564
564
|
trigger: "/",
|
|
565
565
|
name: COMMAND,
|
|
566
566
|
order: 1,
|
|
@@ -590,8 +590,8 @@ window.__ModuleLoader__.load({
|
|
|
590
590
|
modalStoreOf(session.sessionId).set(true);
|
|
591
591
|
return Promise.resolve("handled");
|
|
592
592
|
}
|
|
593
|
-
});
|
|
594
|
-
}
|
|
593
|
+
}), "dsh-context: /context command");
|
|
594
|
+
});
|
|
595
595
|
}
|
|
596
596
|
//#endregion
|
|
597
597
|
//#region src/client/categories.ts
|
|
@@ -723,6 +723,57 @@ window.__ModuleLoader__.load({
|
|
|
723
723
|
//#endregion
|
|
724
724
|
//#region src/client/services.ts
|
|
725
725
|
/**
|
|
726
|
+
* A session-authorized durable-image loader over whichever conversation
|
|
727
|
+
* face the running harness provides (`resolveImage` pre-0.1.2, `imageUrl`
|
|
728
|
+
* since), or undefined when neither service is composed — the caller
|
|
729
|
+
* degrades to metadata-only cards. Hostile snapshots and throwing service
|
|
730
|
+
* reads are caught: this helper can never take a render down.
|
|
731
|
+
*/
|
|
732
|
+
function imageLoaderOf(ctx, sessionId) {
|
|
733
|
+
if (typeof sessionId !== "string" || sessionId === "") return void 0;
|
|
734
|
+
try {
|
|
735
|
+
const legacy = ctx.get("conversation");
|
|
736
|
+
if (legacy !== void 0 && typeof legacy.resolveImage === "function") {
|
|
737
|
+
const resolveImage = legacy.resolveImage.bind(legacy);
|
|
738
|
+
return (attachment) => resolveImage(sessionId, attachment);
|
|
739
|
+
}
|
|
740
|
+
const modern = ctx.get("uiConversation");
|
|
741
|
+
if (modern !== void 0 && typeof modern.imageUrl === "function") {
|
|
742
|
+
const imageUrl = modern.imageUrl.bind(modern);
|
|
743
|
+
return (attachment) => imageUrl(sessionId, attachment);
|
|
744
|
+
}
|
|
745
|
+
} catch {}
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* The conversation-window nodes this plugin joins on, from whichever seat
|
|
749
|
+
* the running harness provides — `useChat` (`ChatSnapshot.legacy.nodes`) on
|
|
750
|
+
* dsh 0.1.2+, the session snapshot's own `nodes` before that. Returns
|
|
751
|
+
* undefined when neither seat delivers a real array (absent seat, older or
|
|
752
|
+
* foreign harness, hostile snapshot) — callers render without the join,
|
|
753
|
+
* never an error.
|
|
754
|
+
*
|
|
755
|
+
* Hook-order contract: the seats are real React hooks, so BOTH are invoked
|
|
756
|
+
* on every call whenever present (the chat seat first, the session seat
|
|
757
|
+
* second) and only the RESULT is picked conditionally — a stable call order
|
|
758
|
+
* across renders. Selectors return stable slice references so the
|
|
759
|
+
* framework's snapshot equality can gate re-renders.
|
|
760
|
+
*/
|
|
761
|
+
function conversationNodesOf(props) {
|
|
762
|
+
const useChat = props.useChat;
|
|
763
|
+
let chatNodes;
|
|
764
|
+
if (typeof useChat === "function") try {
|
|
765
|
+
const slice = useChat((s) => s !== null && typeof s === "object" ? s.legacy : void 0);
|
|
766
|
+
chatNodes = slice !== null && typeof slice === "object" ? slice.nodes : void 0;
|
|
767
|
+
} catch {}
|
|
768
|
+
const useSession = props.useSession;
|
|
769
|
+
let sessionNodes;
|
|
770
|
+
if (typeof useSession === "function") try {
|
|
771
|
+
sessionNodes = useSession((s) => s.nodes);
|
|
772
|
+
} catch {}
|
|
773
|
+
if (Array.isArray(chatNodes)) return chatNodes;
|
|
774
|
+
if (Array.isArray(sessionNodes)) return sessionNodes;
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
726
777
|
* Narrow an unknown projection value to a string-keyed record, or null when
|
|
727
778
|
* it is not one. The boundary type is Record<string, unknown> on purpose:
|
|
728
779
|
* every field read below must re-prove itself (the no-white-screen
|
|
@@ -908,9 +959,9 @@ window.__ModuleLoader__.load({
|
|
|
908
959
|
/** Narrow one served row to a validated durable event envelope, or null. */
|
|
909
960
|
function eventOf(entry) {
|
|
910
961
|
if (entry === null || typeof entry !== "object") return null;
|
|
911
|
-
const
|
|
912
|
-
if (
|
|
913
|
-
const e =
|
|
962
|
+
const inner = entry.event ?? entry;
|
|
963
|
+
if (typeof inner !== "object") return null;
|
|
964
|
+
const e = inner;
|
|
914
965
|
if (typeof e.type !== "string" || typeof e.seq !== "number" || !Number.isFinite(e.seq)) return null;
|
|
915
966
|
const data = e.data !== null && typeof e.data === "object" ? e.data : {};
|
|
916
967
|
return {
|
|
@@ -1030,26 +1081,65 @@ window.__ModuleLoader__.load({
|
|
|
1030
1081
|
}
|
|
1031
1082
|
return nodes;
|
|
1032
1083
|
}
|
|
1084
|
+
/** Read a service off the client context without letting an absent/foreign
|
|
1085
|
+
* cordis service (a throwing `ctx.get`) escape: returns undefined instead. */
|
|
1086
|
+
function serviceOf(ctx, name) {
|
|
1087
|
+
try {
|
|
1088
|
+
return ctx.get(name);
|
|
1089
|
+
} catch {
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
/** The rows array of a history/page response, under every served envelope. */
|
|
1094
|
+
function rowsOf(response) {
|
|
1095
|
+
let payload = response;
|
|
1096
|
+
if (payload !== null && typeof payload === "object") {
|
|
1097
|
+
const nested = payload.result;
|
|
1098
|
+
if (nested !== null && typeof nested === "object") payload = nested;
|
|
1099
|
+
}
|
|
1100
|
+
if (payload !== null && typeof payload === "object" && "ok" in payload) {
|
|
1101
|
+
const r = payload;
|
|
1102
|
+
if (r.ok !== true || r.value === null || typeof r.value !== "object") throw new Error("history rpc failed");
|
|
1103
|
+
payload = r.value;
|
|
1104
|
+
}
|
|
1105
|
+
if (payload === null || typeof payload !== "object") throw new Error("history rpc failed");
|
|
1106
|
+
const rows = payload.records ?? payload.events;
|
|
1107
|
+
if (!Array.isArray(rows)) throw new Error("history rpc failed");
|
|
1108
|
+
return rows;
|
|
1109
|
+
}
|
|
1033
1110
|
/**
|
|
1034
|
-
* Build the browser's per-session fetcher over
|
|
1035
|
-
*
|
|
1111
|
+
* Build the browser's per-session fetcher over whichever history face the
|
|
1112
|
+
* running harness serves — the 0.1.2+ gateway remotes (`remote.session.page`)
|
|
1113
|
+
* first, the pre-0.1.2 api client verb (`connection.api.sessions.history`)
|
|
1114
|
+
* beneath it. Both cut message-aligned pages, so `beforeSeq: seq + 1` (with
|
|
1115
|
+
* the inclusive cut pinned to `seq` on the newer face) covers the seq whenever
|
|
1116
|
+
* the durable log still holds it. Undefined when no face exists (older
|
|
1036
1117
|
* hosts) — the caller keeps its static preview-plus-hint degradation. Found
|
|
1037
1118
|
* nodes cache in the closure: one mount re-reading a row never re-fetches.
|
|
1038
1119
|
*/
|
|
1039
1120
|
function makeContentFetcher(ctx, sessionId) {
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1121
|
+
const pageFace = serviceOf(ctx, "remote.session");
|
|
1122
|
+
const page = pageFace !== void 0 && typeof pageFace.page === "function" ? pageFace.page.bind(pageFace) : void 0;
|
|
1123
|
+
const historyFace = serviceOf(ctx, "connection")?.api?.sessions;
|
|
1124
|
+
const history = historyFace !== void 0 && typeof historyFace.history === "function" ? historyFace.history.bind(historyFace) : void 0;
|
|
1125
|
+
if (page === void 0 && history === void 0) return void 0;
|
|
1126
|
+
const pageRequest = (seq) => ({
|
|
1127
|
+
address: {
|
|
1128
|
+
kind: "session",
|
|
1129
|
+
sessionId
|
|
1130
|
+
},
|
|
1131
|
+
throughSeq: seq,
|
|
1132
|
+
beforeSeq: seq + 1
|
|
1133
|
+
});
|
|
1134
|
+
const historyCall = (seq) => history({
|
|
1135
|
+
sessionId,
|
|
1136
|
+
beforeSeq: seq + 1
|
|
1137
|
+
});
|
|
1042
1138
|
const cache = /* @__PURE__ */ new Map();
|
|
1043
1139
|
return async (seq) => {
|
|
1044
1140
|
const hit = cache.get(seq);
|
|
1045
1141
|
if (hit !== void 0) return hit;
|
|
1046
|
-
const
|
|
1047
|
-
sessionId,
|
|
1048
|
-
beforeSeq: seq + 1
|
|
1049
|
-
})).result;
|
|
1050
|
-
if (result === null || typeof result !== "object" || result.ok !== true || result.value === null || typeof result.value !== "object") throw new Error("history rpc failed");
|
|
1051
|
-
const events = result.value.events;
|
|
1052
|
-
const node = pageNodesOf(Array.isArray(events) ? events : []).get(seq) ?? null;
|
|
1142
|
+
const node = pageNodesOf(rowsOf(page !== void 0 ? await page(pageRequest(seq), new AbortController().signal) : await historyCall(seq))).get(seq) ?? null;
|
|
1053
1143
|
if (node !== null) cache.set(seq, node);
|
|
1054
1144
|
return node;
|
|
1055
1145
|
};
|
|
@@ -1499,9 +1589,19 @@ window.__ModuleLoader__.load({
|
|
|
1499
1589
|
}, label);
|
|
1500
1590
|
return /* @__PURE__ */ React.createElement("span", { className: "lc-rich-seg" }, seg("raw", t("rich.raw"), t("rich.toRaw")), seg("md", t("rich.md"), t("rich.toMd")));
|
|
1501
1591
|
}
|
|
1592
|
+
function RawText(props) {
|
|
1593
|
+
const lines = React.useMemo(() => {
|
|
1594
|
+
const parts = props.text.split("\n");
|
|
1595
|
+
return parts.length > 1 && parts[parts.length - 1] === "" ? parts.slice(0, -1) : parts;
|
|
1596
|
+
}, [props.text]);
|
|
1597
|
+
return /* @__PURE__ */ React.createElement("pre", { className: "lc-ts-desc-body lc-ts-lines" }, lines.map((line, index) => /* @__PURE__ */ React.createElement("span", {
|
|
1598
|
+
key: index,
|
|
1599
|
+
className: "lc-ts-line"
|
|
1600
|
+
}, line)));
|
|
1601
|
+
}
|
|
1502
1602
|
function RichText(props) {
|
|
1503
1603
|
if (props.mode === "md") return /* @__PURE__ */ React.createElement("div", { className: "lc-ts-desc-md" }, /* @__PURE__ */ React.createElement(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, { text: props.text }));
|
|
1504
|
-
return /* @__PURE__ */ React.createElement(
|
|
1604
|
+
return /* @__PURE__ */ React.createElement(RawText, { text: props.text });
|
|
1505
1605
|
}
|
|
1506
1606
|
return {
|
|
1507
1607
|
RichText,
|
|
@@ -1906,7 +2006,7 @@ window.__ModuleLoader__.load({
|
|
|
1906
2006
|
const [openElem, setOpenElem] = React.useState(null);
|
|
1907
2007
|
const [rowQuery, setRowQuery] = React.useState("");
|
|
1908
2008
|
const [toolSort, setToolSort] = React.useState("size");
|
|
1909
|
-
const convNodes =
|
|
2009
|
+
const convNodes = props.convNodes;
|
|
1910
2010
|
const [fetched, setFetched] = React.useState(() => /* @__PURE__ */ new Map());
|
|
1911
2011
|
const bySeq = React.useMemo(() => {
|
|
1912
2012
|
const m = /* @__PURE__ */ new Map();
|
|
@@ -1935,7 +2035,8 @@ window.__ModuleLoader__.load({
|
|
|
1935
2035
|
return next;
|
|
1936
2036
|
});
|
|
1937
2037
|
setMissState("idle");
|
|
1938
|
-
}, () => {
|
|
2038
|
+
}, (error) => {
|
|
2039
|
+
console.warn("dsh-context: targeted history read failed", error);
|
|
1939
2040
|
if (live) setMissState("failed");
|
|
1940
2041
|
});
|
|
1941
2042
|
return () => {
|
|
@@ -2373,7 +2474,6 @@ window.__ModuleLoader__.load({
|
|
|
2373
2474
|
//#region src/client/components/contextModal.tsx
|
|
2374
2475
|
function makeContextModal(ctx, kit) {
|
|
2375
2476
|
const { t } = kit;
|
|
2376
|
-
const sessions = ctx.get("sessions");
|
|
2377
2477
|
const StackedBar = makeStackedBar(kit);
|
|
2378
2478
|
const CurrentComposition = makeCurrentComposition(kit, StackedBar, makeLegend(kit));
|
|
2379
2479
|
const ContextBrowser = makeContextBrowser(kit, StackedBar);
|
|
@@ -2385,16 +2485,18 @@ window.__ModuleLoader__.load({
|
|
|
2385
2485
|
const pressure = typeof props.useProjection === "function" ? contextPressureOf(props.useProjection("contextPressure")) : null;
|
|
2386
2486
|
const breakdown = typeof props.useProjection === "function" ? contextBreakdownOf(props.useProjection("contextBreakdown")) : null;
|
|
2387
2487
|
const headers = typeof props.useProjection === "function" ? headersOf(props.useProjection("contextHeaders")) : null;
|
|
2488
|
+
const convNodes = conversationNodesOf(props);
|
|
2388
2489
|
const [hoverCat, setHoverCat] = React.useState(null);
|
|
2389
2490
|
const fetchContent = React.useMemo(() => sessionId !== "" ? makeContentFetcher(ctx, sessionId) : void 0, [ctx, sessionId]);
|
|
2390
2491
|
const close = React.useCallback(() => {
|
|
2391
2492
|
if (sessionId === "") return;
|
|
2392
2493
|
modalStoreOf(sessionId).set(false);
|
|
2393
2494
|
const guard = takePendingConsume(sessionId);
|
|
2495
|
+
const sessions = ctx.get("sessions");
|
|
2394
2496
|
if (guard === void 0 || sessions === void 0) return;
|
|
2395
2497
|
const scope = sessions.scope(sessionId);
|
|
2396
2498
|
if (scope !== void 0) scope.bail(scope, "slash/input-consume-token", { guard });
|
|
2397
|
-
}, [sessionId]);
|
|
2499
|
+
}, [ctx, sessionId]);
|
|
2398
2500
|
React.useEffect(() => {
|
|
2399
2501
|
if (!open) return void 0;
|
|
2400
2502
|
const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
@@ -2433,7 +2535,7 @@ window.__ModuleLoader__.load({
|
|
|
2433
2535
|
}), /* @__PURE__ */ React.createElement(ContextBrowser, {
|
|
2434
2536
|
data,
|
|
2435
2537
|
headers,
|
|
2436
|
-
|
|
2538
|
+
convNodes,
|
|
2437
2539
|
fetchContent,
|
|
2438
2540
|
hoverKey: hoverCat,
|
|
2439
2541
|
onHoverKey: setHoverCat
|
|
@@ -4455,7 +4557,7 @@ window.__ModuleLoader__.load({
|
|
|
4455
4557
|
return function PluginInfo() {
|
|
4456
4558
|
const [latest, setLatest] = React.useState(null);
|
|
4457
4559
|
React.useEffect(() => {
|
|
4458
|
-
if ("0.
|
|
4560
|
+
if ("0.37.0".includes("-dev")) return;
|
|
4459
4561
|
let on = true;
|
|
4460
4562
|
fetchLatestVersion().then((v) => {
|
|
4461
4563
|
if (on && v) setLatest(v);
|
|
@@ -4464,8 +4566,8 @@ window.__ModuleLoader__.load({
|
|
|
4464
4566
|
on = false;
|
|
4465
4567
|
};
|
|
4466
4568
|
}, []);
|
|
4467
|
-
const update = latest !== null && isNewerVersion(latest, "0.
|
|
4468
|
-
const nameValue = ["dsh-context (v0.
|
|
4569
|
+
const update = latest !== null && isNewerVersion(latest, "0.37.0") ? latest : null;
|
|
4570
|
+
const nameValue = ["dsh-context (v0.37.0)"];
|
|
4469
4571
|
if (update) nameValue.push(/* @__PURE__ */ React.createElement("span", {
|
|
4470
4572
|
key: "update",
|
|
4471
4573
|
className: "lc-pi-update"
|
|
@@ -5228,12 +5330,7 @@ window.__ModuleLoader__.load({
|
|
|
5228
5330
|
const clearNodeFocus = React.useCallback(() => {
|
|
5229
5331
|
setNodeFocus(null);
|
|
5230
5332
|
}, []);
|
|
5231
|
-
const loadImage = React.useMemo(() =>
|
|
5232
|
-
if (typeof sessionId !== "string" || sessionId === "") return void 0;
|
|
5233
|
-
const conversation = ctx.get("conversation");
|
|
5234
|
-
if (conversation === void 0 || typeof conversation.resolveImage !== "function") return void 0;
|
|
5235
|
-
return (attachment) => conversation.resolveImage(sessionId, attachment);
|
|
5236
|
-
}, [sessionId]);
|
|
5333
|
+
const loadImage = React.useMemo(() => imageLoaderOf(ctx, typeof sessionId === "string" ? sessionId : void 0), [ctx, sessionId]);
|
|
5237
5334
|
const fetchContent = React.useMemo(() => typeof sessionId === "string" && sessionId !== "" ? makeContentFetcher(ctx, sessionId) : void 0, [ctx, sessionId]);
|
|
5238
5335
|
const rootRef = React.useRef(null);
|
|
5239
5336
|
const scrollerRef = React.useRef(null);
|
|
@@ -5264,7 +5361,7 @@ window.__ModuleLoader__.load({
|
|
|
5264
5361
|
const markers = React.useMemo(() => attachMarkers(displayRequests, events), [displayRequests, events]);
|
|
5265
5362
|
const briefList = React.useMemo(() => data ? briefNodes(data) : [], [data]);
|
|
5266
5363
|
const replyTips = React.useMemo(() => replyTipsOf(briefList), [briefList]);
|
|
5267
|
-
const convNodes =
|
|
5364
|
+
const convNodes = conversationNodesOf(props);
|
|
5268
5365
|
const bySeq = React.useMemo(() => {
|
|
5269
5366
|
const m = /* @__PURE__ */ new Map();
|
|
5270
5367
|
for (const n of convNodes ?? []) m.set(n.seq, n);
|
|
@@ -5430,7 +5527,7 @@ window.__ModuleLoader__.load({
|
|
|
5430
5527
|
})))), /* @__PURE__ */ React.createElement("div", { className: "lc-col lc-col-browser" }, /* @__PURE__ */ React.createElement(ContextBrowser, {
|
|
5431
5528
|
data,
|
|
5432
5529
|
headers,
|
|
5433
|
-
|
|
5530
|
+
convNodes,
|
|
5434
5531
|
fetchContent,
|
|
5435
5532
|
previewSeq: hoveredSeq,
|
|
5436
5533
|
pinSeq: pinnedReq !== null ? pinnedReq.seq : null,
|
|
@@ -5479,7 +5576,7 @@ window.__ModuleLoader__.load({
|
|
|
5479
5576
|
}
|
|
5480
5577
|
//#endregion
|
|
5481
5578
|
//#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles.css.mjs
|
|
5482
|
-
const css = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-card-title{flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-stats{grid-template-columns:repeat(auto-fit,minmax(62px,1fr));gap:6px;display:grid}.lc-stat{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:2px;min-width:0;padding:6px;display:flex}.lc-stat-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;font-weight:600;overflow:hidden}.lc-stat-value{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:center;font-size:14px;font-weight:600;overflow:hidden}.lc-stat-sub{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.lc-stat-tipped{position:relative}.lc-stat-q{text-align:center;width:11px;height:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);cursor:help;border-radius:50%;margin-left:4px;font-size:9px;font-style:normal;font-weight:700;line-height:11px;display:inline-block}.lc-stat-tipped:hover .lc-stat-q{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary)}.lc-stat-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:280px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-stat-tipped:hover .lc-stat-tip{opacity:1}.lc-stat-tip-prices{border-top:1px dashed var(--dsw-alias-border-l1);margin-top:5px;padding-top:5px;display:block}.lc-stat-tip-head{font-weight:600;display:block}.lc-stat-tip-row{margin-top:2px;display:block}.lc-stat-tip-model{color:var(--dsw-alias-label-primary)}.lc-card-sub{color:var(--dsw-alias-label-secondary);margin-left:auto;font-size:12px;font-weight:400}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-trend-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{margin-left:0}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-settings-card{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;transition:border-color .16s,background .16s}.lc-settings-card:hover{border-color:var(--dsw-alias-label-dimmed)}.lc-settings-open,.lc-settings-open:hover{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.lc-settings-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.lc-settings-headtext{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.lc-settings-name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.lc-settings-desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.lc-settings-chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.lc-settings-open .lc-settings-chevron{transform:rotate(180deg)}.lc-settings-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 12px}.lc-settings-row{align-items:center;gap:8px;padding:8px 0;display:flex}.lc-settings-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:14px}.lc-settings-select{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.lc-settings-select:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.lc-settings-select:disabled{opacity:.5;cursor:default}.lc-settings-note{color:var(--dsw-alias-label-tertiary);margin:12px 0 4px;font-size:12px;line-height:1.5}.lc-overview-num{align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.lc-overview-num>b{font-size:20px}.lc-overview-num span{color:var(--dsw-alias-label-secondary)}.lc-overview-pct{margin-left:auto;font-size:11px}.lc-overview-pct b{color:var(--dsw-alias-label-primary);margin-right:4px;font-size:20px}.lc-stacked-wrap{width:100%;position:relative}.lc-stacked{background:#8080802e;border-radius:5px;width:100%;display:flex;position:relative;overflow:hidden}.lc-occupied-box{border:2px solid var(--dsw-alias-label-tertiary);box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:0 0 0 1px var(--dsw-alias-bg-layer-2);border-radius:5px;transition:opacity .12s;position:absolute;top:0;bottom:0;left:0}.lc-occupied-box-on{opacity:1}.lc-bar-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:3px 8px;font-size:12px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar-tip-on{opacity:1}.lc-stacked>div{height:100%}.lc-stacked-seg{transition:filter .12s,opacity .12s}.lc-stacked-free{box-sizing:border-box;transition:box-shadow .12s,opacity .12s}.lc-stacked-seg-on{filter:brightness(1.18)}.lc-reserve{z-index:1;pointer-events:auto;cursor:help;background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--dsw-alias-state-warn-primary) 24%, transparent) 0 5px, transparent 5px 10px);position:absolute;top:0;bottom:0}.lc-stacked-free-on{border:2px dashed var(--dsw-alias-label-secondary);border-radius:3px}.lc-stacked-dim .lc-stacked-seg{opacity:.35}.lc-stacked-dim .lc-stacked-seg-on{opacity:1}.lc-stacked-dim .lc-stacked-free{opacity:.35}.lc-stacked-dim .lc-stacked-free-on{opacity:1}.lc-legend{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px 14px;margin-top:10px;display:grid}.lc-chip{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:5px;padding:1px 6px;transition:background-color .12s;display:flex}.lc-chip-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}.lc-chip-nums{white-space:nowrap;flex:none;align-items:baseline;gap:6px;margin-left:auto;display:inline-flex}.lc-chip i,.lc-detail-row i{border-radius:2px;width:8px;height:8px;display:inline-block}.lc-chip i{transition:box-shadow .12s}.lc-chip em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-chip-on{background:var(--dsw-alias-interactive-bg-hover);font-weight:600}.lc-chip-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-mid{top:69px}.lc-axis-bot{top:125px}.lc-chart-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding-top:18px;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l1);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-mid{top:74px}.lc-grid-zero{border-top-style:solid;border-top-color:#80808080}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;padding:3px 8px;font-size:12px;position:absolute;top:0;left:0;box-shadow:0 2px 8px #0000002e}.lc-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>div{width:100%}.lc-bar-marker{color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-turns{gap:2px;width:max-content;min-width:100%;margin-top:4px;display:flex}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s;overflow:hidden}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{text-overflow:ellipsis;max-width:100%;display:inline-block;overflow:hidden}.lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;transition:background-color .12s;display:flex}.lc-brief-row-link:hover{background:var(--dsw-alias-interactive-bg-hover)}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{z-index:6;white-space:normal;text-align:left;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:240px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-brief-tag:hover .lc-brief-tip{opacity:1}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;transition:background-color .12s;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-chip-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-detail-row{align-items:center;gap:8px;display:flex}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:#8080802e;border-radius:3px;flex:1;height:5px;display:block;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid #80808073;position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-col{flex:1;min-width:280px}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.lc-head>.lc-card:first-child{flex:7 1 0;min-width:360px}.lc-head>.lc-card:last-child{flex:3 1 0;min-width:220px}.lc-pi-grid{grid-template-columns:1fr;gap:8px;display:grid}.lc-pi-row{min-width:0;color:inherit;flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px;text-decoration:none;display:flex}.lc-pi-row:hover .lc-pi-value{text-decoration:underline}.lc-pi-hint{text-decoration:none}.lc-pi-hint:hover{text-decoration:underline}.lc-pi-update{color:var(--dsw-alias-state-warn-primary);white-space:nowrap;margin-left:6px;font-size:11px}.lc-pi-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:none;font-size:11px;font-weight:600;overflow:hidden}.lc-pi-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:right;font-size:13px;font-weight:600;overflow:hidden}.lc-events,.lc-fa-list{flex-direction:column;gap:2px;height:320px;display:flex;overflow-y:auto}.lc-event{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-event-icon{text-align:center;width:18px;color:var(--dsw-alias-state-warn-primary)}.lc-event-icon.lc-event-inject{color:#a855f7}.lc-event-icon.lc-event-model{color:var(--dsw-alias-brand-primary)}.lc-event-icon.lc-event-mode{color:var(--dsw-alias-label-secondary)}.lc-kind{white-space:nowrap;border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}.lc-kind-inject{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-kind-compaction{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent);color:var(--dsw-alias-state-error-primary)}.lc-kind-prune{color:#8b5cf6;background:#8b5cf626}.lc-kind-model{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 15%, transparent);color:var(--dsw-alias-brand-primary)}.lc-kind-mode{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 15%, transparent);color:var(--dsw-alias-label-secondary)}.lc-event-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.lc-event-at{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:11px}.lc-event-tokens{color:var(--dsw-alias-state-success-primary);white-space:nowrap;font-weight:600}.lc-event-tokens.lc-up{color:var(--dsw-alias-state-warn-primary)}.lc-event-time{color:var(--dsw-alias-label-secondary);font-size:12px}.lc-fa-ctl,.lc-br-toolctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search,.lc-br-tool-search{min-width:80px;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-search:focus,.lc-br-tool-search:focus{border-color:var(--dsw-alias-label-dimmed)}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{z-index:6;white-space:normal;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:260px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-fa-meta-delta:hover .lc-fa-meta-tip{opacity:1}.lc-fa-item{border:1px solid #0000;border-radius:8px;transition:background-color .12s,border-color .12s}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l1)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;transition:background-color .12s;display:flex}.lc-fa-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-form{opacity:.85;flex:none;justify-content:center;align-items:center;width:20px;height:14px;font-size:11px;display:flex}.lc-fa-lang{border-radius:4px;justify-content:center;align-items:center;min-width:16px;height:13px;padding:0 2px;font-size:8px;font-weight:700;line-height:1;display:inline-flex}.lc-fa-row .lc-br-chev{margin-right:-2px}.lc-fa-path{word-break:break-all;flex:1;min-width:0}.lc-fa-file{cursor:pointer}.lc-fa-file:hover{text-decoration:underline}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;transition:background-color .12s;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-op-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.lc-fa-op-tool{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.lc-fa-read{color:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;font-weight:600}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:4px 14px;font-size:12px}.lc-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}.lc-modal-backdrop{z-index:200;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.lc-modal-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);width:min(720px,100vw - 48px);max-height:min(82vh,760px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;padding:16px 18px 18px;font-size:13px;overflow-y:auto}.lc-modal-head{align-items:baseline;gap:8px;margin-bottom:12px;display:flex}.lc-modal-title{font-size:14px;font-weight:600}.lc-modal-close{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:2px 6px;font-family:inherit;font-size:18px;line-height:1}.lc-modal-close:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.lc-br-hint{color:var(--dsw-alias-label-secondary);white-space:nowrap;margin-left:auto;font-size:11px;font-weight:400}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-retry:hover{filter:brightness(1.15)}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;transition:background-color .12s;display:flex}.lc-br-cat-row:hover,.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-row i{border-radius:2px;flex:none;width:8px;height:8px;transition:box-shadow .12s;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:flex}.lc-br-chev:before{content:\"\";border-bottom:1px solid;border-right:1px solid;width:5px;height:5px;transition:transform .12s;transform:rotate(-45deg)}.lc-br-chev-on:before{transform:rotate(45deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;transition:background-color .12s;display:flex}.lc-br-elem-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tool-plugin{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);border-color:#0000;border-radius:6px;font-size:12px}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-dim{color:var(--dsw-alias-label-secondary)}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;min-width:0;overflow:hidden}.lc-ts-card-head{color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:8px;padding:6px 10px;font-size:11px;font-weight:600;display:flex}.lc-ts-card-head b{color:var(--dsw-alias-label-primary)}.lc-ts-call-name{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.lc-ts-card-count{margin-left:auto}.lc-ts-card-right{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.lc-ts-card-meta{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;font-weight:400}.lc-ts-call-state{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;line-height:1;display:inline-flex}.lc-ts-call-state i{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.lc-ts-call-ok{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.lc-ts-call-err{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:320px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-param-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,140px) minmax(0,90px) 56px minmax(0,1fr);align-items:baseline;gap:2px 10px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-param-row:first-of-type{border-top:0}.lc-ts-param-name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.lc-ts-param-type{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.lc-ts-param-req{color:var(--dsw-alias-state-warn-primary);font-size:11px;font-weight:600}.lc-ts-param-req-off{color:var(--dsw-alias-label-secondary);font-size:11px}.lc-ts-param-desc{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;grid-column:1/-1;line-height:1.5}.lc-ts-params-empty{color:var(--dsw-alias-label-secondary);padding:8px 10px;font-size:12px}.lc-ts-arg-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,96px) 1fr;align-items:start;column-gap:12px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-arg-row:first-of-type{border-top:0}.lc-ts-arg-row .lc-ts-param-name{text-overflow:unset;white-space:normal;overflow-wrap:anywhere;overflow:visible}.lc-ts-arg-val{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:200px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-json{flex-direction:column;gap:4px;display:flex}.lc-ts-json-toggle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0;font-size:11px}.lc-ts-json-toggle:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.lc-rich-seg{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-rich-seg-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-rich-seg-btn:hover{color:var(--dsw-alias-label-primary)}.lc-rich-seg-on,.lc-rich-seg-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;overflow-wrap:anywhere;white-space:pre-line;scrollbar-width:thin;min-width:0;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow:hidden auto}.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-ts-desc-md div p{margin:6px 0}.lc-ts-desc-md div pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;margin:6px 0}.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-ts-desc-md div table code{font-size:inherit}.lc-att-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:8px 10px;display:grid}.lc-att-item{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:8px;padding:6px;display:flex}.lc-att-item:hover{border-color:var(--dsw-alias-border-l2,var(--dsw-alias-border-l1));background:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;flex:none;justify-content:center;align-items:center;width:64px;height:64px;padding:0;display:flex;overflow:hidden}.lc-att-thumb img{object-fit:cover;width:100%;height:100%;display:block}.lc-att-ph,.lc-att-err{color:var(--dsw-alias-label-secondary);text-align:center;padding:2px;font-size:10px}.lc-att-meta{flex-direction:column;gap:2px;min-width:0;display:flex}.lc-att-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;word-break:break-word;font-size:12px;line-height:1.3}.lc-att-row{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11px}.lc-att-row-label{min-width:3.2em;font-weight:400;display:inline-block}.lc-att-lightbox{z-index:1000;place-items:center;padding:40px;display:grid;position:fixed;inset:0}.lc-att-lightbox-mask{background:var(--dsw-alias-bg-mask-1,#00000073);backdrop-filter:var(--dsw-mask-blur,blur(2px));position:absolute;inset:0}.lc-att-lightbox-img{object-fit:contain;background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));max-width:min(100%,1600px);max-height:calc(100vh - 80px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);border-radius:12px;position:relative}.lc-att-lightbox-close{z-index:1;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l1));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));width:36px;height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:999px;place-items:center;padding:0;display:grid;position:fixed;top:20px;right:20px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])){display:none}.lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill .12s}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
|
|
5579
|
+
const css = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-card-title{flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-stats{grid-template-columns:repeat(auto-fit,minmax(62px,1fr));gap:6px;display:grid}.lc-stat{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:2px;min-width:0;padding:6px;display:flex}.lc-stat-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;font-weight:600;overflow:hidden}.lc-stat-value{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:center;font-size:14px;font-weight:600;overflow:hidden}.lc-stat-sub{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.lc-stat-tipped{position:relative}.lc-stat-q{text-align:center;width:11px;height:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);cursor:help;border-radius:50%;margin-left:4px;font-size:9px;font-style:normal;font-weight:700;line-height:11px;display:inline-block}.lc-stat-tipped:hover .lc-stat-q{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary)}.lc-stat-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:280px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-stat-tipped:hover .lc-stat-tip{opacity:1}.lc-stat-tip-prices{border-top:1px dashed var(--dsw-alias-border-l1);margin-top:5px;padding-top:5px;display:block}.lc-stat-tip-head{font-weight:600;display:block}.lc-stat-tip-row{margin-top:2px;display:block}.lc-stat-tip-model{color:var(--dsw-alias-label-primary)}.lc-card-sub{color:var(--dsw-alias-label-secondary);margin-left:auto;font-size:12px;font-weight:400}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-trend-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{margin-left:0}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-settings-card{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;transition:border-color .16s,background .16s}.lc-settings-card:hover{border-color:var(--dsw-alias-label-dimmed)}.lc-settings-open,.lc-settings-open:hover{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.lc-settings-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.lc-settings-headtext{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.lc-settings-name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.lc-settings-desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.lc-settings-chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.lc-settings-open .lc-settings-chevron{transform:rotate(180deg)}.lc-settings-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 12px}.lc-settings-row{align-items:center;gap:8px;padding:8px 0;display:flex}.lc-settings-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:14px}.lc-settings-select{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.lc-settings-select:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.lc-settings-select:disabled{opacity:.5;cursor:default}.lc-settings-note{color:var(--dsw-alias-label-tertiary);margin:12px 0 4px;font-size:12px;line-height:1.5}.lc-overview-num{align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.lc-overview-num>b{font-size:20px}.lc-overview-num span{color:var(--dsw-alias-label-secondary)}.lc-overview-pct{margin-left:auto;font-size:11px}.lc-overview-pct b{color:var(--dsw-alias-label-primary);margin-right:4px;font-size:20px}.lc-stacked-wrap{width:100%;position:relative}.lc-stacked{background:#8080802e;border-radius:5px;width:100%;display:flex;position:relative;overflow:hidden}.lc-occupied-box{border:2px solid var(--dsw-alias-label-tertiary);box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:0 0 0 1px var(--dsw-alias-bg-layer-2);border-radius:5px;transition:opacity .12s;position:absolute;top:0;bottom:0;left:0}.lc-occupied-box-on{opacity:1}.lc-bar-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:3px 8px;font-size:12px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar-tip-on{opacity:1}.lc-stacked>div{height:100%}.lc-stacked-seg{transition:filter .12s,opacity .12s}.lc-stacked-free{box-sizing:border-box;transition:box-shadow .12s,opacity .12s}.lc-stacked-seg-on{filter:brightness(1.18)}.lc-reserve{z-index:1;pointer-events:auto;cursor:help;background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--dsw-alias-state-warn-primary) 24%, transparent) 0 5px, transparent 5px 10px);position:absolute;top:0;bottom:0}.lc-stacked-free-on{border:2px dashed var(--dsw-alias-label-secondary);border-radius:3px}.lc-stacked-dim .lc-stacked-seg{opacity:.35}.lc-stacked-dim .lc-stacked-seg-on{opacity:1}.lc-stacked-dim .lc-stacked-free{opacity:.35}.lc-stacked-dim .lc-stacked-free-on{opacity:1}.lc-legend{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px 14px;margin-top:10px;display:grid}.lc-chip{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:5px;padding:1px 6px;transition:background-color .12s;display:flex}.lc-chip-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}.lc-chip-nums{white-space:nowrap;flex:none;align-items:baseline;gap:6px;margin-left:auto;display:inline-flex}.lc-chip i,.lc-detail-row i{border-radius:2px;width:8px;height:8px;display:inline-block}.lc-chip i{transition:box-shadow .12s}.lc-chip em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-chip-on{background:var(--dsw-alias-interactive-bg-hover);font-weight:600}.lc-chip-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-mid{top:69px}.lc-axis-bot{top:125px}.lc-chart-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding-top:18px;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l1);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-mid{top:74px}.lc-grid-zero{border-top-style:solid;border-top-color:#80808080}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;padding:3px 8px;font-size:12px;position:absolute;top:0;left:0;box-shadow:0 2px 8px #0000002e}.lc-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>div{width:100%}.lc-bar-marker{color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-turns{gap:2px;width:max-content;min-width:100%;margin-top:4px;display:flex}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s;overflow:hidden}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{text-overflow:ellipsis;max-width:100%;display:inline-block;overflow:hidden}.lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;transition:background-color .12s;display:flex}.lc-brief-row-link:hover{background:var(--dsw-alias-interactive-bg-hover)}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{z-index:6;white-space:normal;text-align:left;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:240px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-brief-tag:hover .lc-brief-tip{opacity:1}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;transition:background-color .12s;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-chip-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-detail-row{align-items:center;gap:8px;display:flex}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:#8080802e;border-radius:3px;flex:1;height:5px;display:block;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid #80808073;position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-col{flex:1;min-width:280px}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.lc-head>.lc-card:first-child{flex:7 1 0;min-width:360px}.lc-head>.lc-card:last-child{flex:3 1 0;min-width:220px}.lc-pi-grid{grid-template-columns:1fr;gap:8px;display:grid}.lc-pi-row{min-width:0;color:inherit;flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px;text-decoration:none;display:flex}.lc-pi-row:hover .lc-pi-value{text-decoration:underline}.lc-pi-hint{text-decoration:none}.lc-pi-hint:hover{text-decoration:underline}.lc-pi-update{color:var(--dsw-alias-state-warn-primary);white-space:nowrap;margin-left:6px;font-size:11px}.lc-pi-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:none;font-size:11px;font-weight:600;overflow:hidden}.lc-pi-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:right;font-size:13px;font-weight:600;overflow:hidden}.lc-events,.lc-fa-list{flex-direction:column;gap:2px;height:320px;display:flex;overflow-y:auto}.lc-event{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-event-icon{text-align:center;width:18px;color:var(--dsw-alias-state-warn-primary)}.lc-event-icon.lc-event-inject{color:#a855f7}.lc-event-icon.lc-event-model{color:var(--dsw-alias-brand-primary)}.lc-event-icon.lc-event-mode{color:var(--dsw-alias-label-secondary)}.lc-kind{white-space:nowrap;border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}.lc-kind-inject{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-kind-compaction{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent);color:var(--dsw-alias-state-error-primary)}.lc-kind-prune{color:#8b5cf6;background:#8b5cf626}.lc-kind-model{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 15%, transparent);color:var(--dsw-alias-brand-primary)}.lc-kind-mode{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 15%, transparent);color:var(--dsw-alias-label-secondary)}.lc-event-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.lc-event-at{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:11px}.lc-event-tokens{color:var(--dsw-alias-state-success-primary);white-space:nowrap;font-weight:600}.lc-event-tokens.lc-up{color:var(--dsw-alias-state-warn-primary)}.lc-event-time{color:var(--dsw-alias-label-secondary);font-size:12px}.lc-fa-ctl,.lc-br-toolctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search,.lc-br-tool-search{min-width:80px;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-search:focus,.lc-br-tool-search:focus{border-color:var(--dsw-alias-label-dimmed)}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{z-index:6;white-space:normal;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:260px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-fa-meta-delta:hover .lc-fa-meta-tip{opacity:1}.lc-fa-item{border:1px solid #0000;border-radius:8px;transition:background-color .12s,border-color .12s}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l1)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;transition:background-color .12s;display:flex}.lc-fa-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-form{opacity:.85;flex:none;justify-content:center;align-items:center;width:20px;height:14px;font-size:11px;display:flex}.lc-fa-lang{border-radius:4px;justify-content:center;align-items:center;min-width:16px;height:13px;padding:0 2px;font-size:8px;font-weight:700;line-height:1;display:inline-flex}.lc-fa-row .lc-br-chev{margin-right:-2px}.lc-fa-path{word-break:break-all;flex:1;min-width:0}.lc-fa-file{cursor:pointer}.lc-fa-file:hover{text-decoration:underline}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;transition:background-color .12s;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-op-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.lc-fa-op-tool{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.lc-fa-read{color:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;font-weight:600}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:4px 14px;font-size:12px}.lc-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}.lc-modal-backdrop{z-index:200;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.lc-modal-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);width:min(720px,100vw - 48px);max-height:min(82vh,760px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;padding:16px 18px 18px;font-size:13px;overflow-y:auto}.lc-modal-head{align-items:baseline;gap:8px;margin-bottom:12px;display:flex}.lc-modal-title{font-size:14px;font-weight:600}.lc-modal-close{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:2px 6px;font-family:inherit;font-size:18px;line-height:1}.lc-modal-close:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.lc-br-hint{color:var(--dsw-alias-label-secondary);white-space:nowrap;margin-left:auto;font-size:11px;font-weight:400}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-retry:hover{filter:brightness(1.15)}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;transition:background-color .12s;display:flex}.lc-br-cat-row:hover,.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-row i{border-radius:2px;flex:none;width:8px;height:8px;transition:box-shadow .12s;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:flex}.lc-br-chev:before{content:\"\";border-bottom:1px solid;border-right:1px solid;width:5px;height:5px;transition:transform .12s;transform:rotate(-45deg)}.lc-br-chev-on:before{transform:rotate(45deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;transition:background-color .12s;display:flex}.lc-br-elem-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tool-plugin{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);border-color:#0000;border-radius:6px;font-size:12px}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-dim{color:var(--dsw-alias-label-secondary)}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;min-width:0;overflow:hidden}.lc-ts-card-head{color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:8px;padding:6px 10px;font-size:11px;font-weight:600;display:flex}.lc-ts-card-head b{color:var(--dsw-alias-label-primary)}.lc-ts-call-name{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.lc-ts-card-count{margin-left:auto}.lc-ts-card-right{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.lc-ts-card-meta{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;font-weight:400}.lc-ts-call-state{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;line-height:1;display:inline-flex}.lc-ts-call-state i{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.lc-ts-call-ok{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.lc-ts-call-err{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:320px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-lines{counter-reset:lc-line}.lc-ts-line{padding-left:26px;display:block;position:relative}.lc-ts-line:before{content:counter(lc-line);counter-increment:lc-line;text-align:right;width:20px;color:var(--dsw-alias-label-tertiary);user-select:none;padding-right:6px;font-size:11px;position:absolute;left:0}.lc-ts-line:empty:after{content:\"\"}.lc-ts-param-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,140px) minmax(0,90px) 56px minmax(0,1fr);align-items:baseline;gap:2px 10px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-param-row:first-of-type{border-top:0}.lc-ts-param-name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.lc-ts-param-type{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.lc-ts-param-req{color:var(--dsw-alias-state-warn-primary);font-size:11px;font-weight:600}.lc-ts-param-req-off{color:var(--dsw-alias-label-secondary);font-size:11px}.lc-ts-param-desc{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;grid-column:1/-1;line-height:1.5}.lc-ts-params-empty{color:var(--dsw-alias-label-secondary);padding:8px 10px;font-size:12px}.lc-ts-arg-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,96px) 1fr;align-items:start;column-gap:12px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-arg-row:first-of-type{border-top:0}.lc-ts-arg-row .lc-ts-param-name{text-overflow:unset;white-space:normal;overflow-wrap:anywhere;overflow:visible}.lc-ts-arg-val{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:200px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-json{flex-direction:column;gap:4px;display:flex}.lc-ts-json-toggle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0;font-size:11px}.lc-ts-json-toggle:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.lc-rich-seg{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-rich-seg-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-rich-seg-btn:hover{color:var(--dsw-alias-label-primary)}.lc-rich-seg-on,.lc-rich-seg-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;overflow-wrap:anywhere;scrollbar-width:thin;min-width:0;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow:hidden auto}.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-ts-desc-md div p{white-space:pre-line;margin:6px 0}.lc-ts-desc-md div p br{display:none}.lc-ts-desc-md div pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;margin:6px 0}.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-ts-desc-md div table code{font-size:inherit}.lc-att-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:8px 10px;display:grid}.lc-att-item{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:8px;padding:6px;display:flex}.lc-att-item:hover{border-color:var(--dsw-alias-border-l2,var(--dsw-alias-border-l1));background:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;flex:none;justify-content:center;align-items:center;width:64px;height:64px;padding:0;display:flex;overflow:hidden}.lc-att-thumb img{object-fit:cover;width:100%;height:100%;display:block}.lc-att-ph,.lc-att-err{color:var(--dsw-alias-label-secondary);text-align:center;padding:2px;font-size:10px}.lc-att-meta{flex-direction:column;gap:2px;min-width:0;display:flex}.lc-att-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;word-break:break-word;font-size:12px;line-height:1.3}.lc-att-row{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11px}.lc-att-row-label{min-width:3.2em;font-weight:400;display:inline-block}.lc-att-lightbox{z-index:1000;place-items:center;padding:40px;display:grid;position:fixed;inset:0}.lc-att-lightbox-mask{background:var(--dsw-alias-bg-mask-1,#00000073);backdrop-filter:var(--dsw-mask-blur,blur(2px));position:absolute;inset:0}.lc-att-lightbox-img{object-fit:contain;background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));max-width:min(100%,1600px);max-height:calc(100vh - 80px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);border-radius:12px;position:relative}.lc-att-lightbox-close{z-index:1;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l1));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));width:36px;height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:999px;place-items:center;padding:0;display:grid;position:fixed;top:20px;right:20px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])){display:none}.lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill .12s}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
|
|
5483
5580
|
const tagId = "dsh-context/styles.css";
|
|
5484
5581
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
5485
5582
|
const tag = document.createElement("style");
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import { Context
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import "@deepseek-ai/dsh-session";
|
|
3
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
4
4
|
//#region src/host/config.d.ts
|
|
5
5
|
interface Config {
|
|
6
6
|
/** Cap on kept per-step request records (the hard step backstop). */
|
|
@@ -29,13 +29,90 @@ declare const Config: z.ZodPreprocess<z.ZodObject<{
|
|
|
29
29
|
maxArchiveNodes: z.ZodDefault<z.ZodNumber>;
|
|
30
30
|
}, z.core.$strict>>;
|
|
31
31
|
//#endregion
|
|
32
|
-
//#region src/
|
|
32
|
+
//#region src/host/headers.d.ts
|
|
33
|
+
interface HeadersState {
|
|
34
|
+
headers: HeaderRecord[];
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/host/fold.d.ts
|
|
33
38
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
39
|
+
* History retention bounds (configurable since 0.11 — see config.ts; these
|
|
40
|
+
* are the defaults' values). The fold keeps per-STEP request records; once the
|
|
41
|
+
* newest run count exceeds `maxKeptTurns`, the timeline is trimmed to the
|
|
42
|
+
* most recent whole TURN runs (never cutting a turn in half), so turn
|
|
43
|
+
* granularity can always show the full recent turn range instead of a
|
|
44
|
+
* step-count fragment. The turn-run trim runs whenever the cap is crossed
|
|
45
|
+
* (not only when the raw step bound is), so the bounded state stays at the
|
|
46
|
+
* newest ~`maxKeptTurns` turns deterministically as a live log grows.
|
|
38
47
|
*/
|
|
48
|
+
interface TimelineState {
|
|
49
|
+
/** Model-visible surface, newest last. */
|
|
50
|
+
surface: SurfaceNode[];
|
|
51
|
+
sums: Record<Category, number>;
|
|
52
|
+
systemTokens: number;
|
|
53
|
+
toolsTokens: number;
|
|
54
|
+
/**
|
|
55
|
+
* The projection-cache precondition is plain JSON: a property whose value
|
|
56
|
+
* is `undefined` makes the whole checkpoint unserializable
|
|
57
|
+
* (`snapshotJsonValue` rejects it), which fails EVERY cache write for the
|
|
58
|
+
* session — including the `title` projection row that powers the session
|
|
59
|
+
* list after a restart. Optional fields therefore use absent properties
|
|
60
|
+
* (`model`/`provider`/`lastModel`/`contextWindow` are simply not set until
|
|
61
|
+
* a value is known) instead of `undefined`-valued ones. Reads via
|
|
62
|
+
* `state.model` are identical for both shapes (`undefined` on miss).
|
|
63
|
+
*/
|
|
64
|
+
model?: string;
|
|
65
|
+
provider?: string;
|
|
66
|
+
lastModel?: string;
|
|
67
|
+
contextWindow?: number;
|
|
68
|
+
requests: RequestRecord[];
|
|
69
|
+
events: ContextEventRecord[];
|
|
70
|
+
/**
|
|
71
|
+
* Recently removed surface nodes (stamped COPIES carrying `gone`), in
|
|
72
|
+
* removal order. Feeds the Context browser's per-step reconstruction.
|
|
73
|
+
* Bounded two ways in trimState: capped to `maxArchiveNodes`, and pruned
|
|
74
|
+
* to removals after the oldest retained request (older removals can only
|
|
75
|
+
* serve steps the requests trim already forgot).
|
|
76
|
+
*/
|
|
77
|
+
archived: SurfaceNode[];
|
|
78
|
+
/**
|
|
79
|
+
* Session-cost raw material: cumulative billed-token totals per DeepSeek
|
|
80
|
+
* V4 model family and pricing period (see SessionCostUsage). Running
|
|
81
|
+
* totals — never trimmed, so the estimate always covers the COMPLETE
|
|
82
|
+
* session log even after the request/event retention bounds cut in.
|
|
83
|
+
* Absent until a v4-flash / v4-pro request reports usage.
|
|
84
|
+
*/
|
|
85
|
+
cost?: SessionCostUsage;
|
|
86
|
+
archiveFloor?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Tool callId → name, armed by `tool/call` and DELETED when its
|
|
89
|
+
* `tool/result` folds in (one result per call, in log order) — the map
|
|
90
|
+
* stays at pending-call size instead of growing for the session's whole
|
|
91
|
+
* lifetime (it is persisted state, shallow-copied by every fold step).
|
|
92
|
+
*/
|
|
93
|
+
callNames: Record<string, string>;
|
|
94
|
+
/**
|
|
95
|
+
* Seq list of the surface nodes the next replacement will shadow, armed by
|
|
96
|
+
* the metering event (`compaction/summary` | `compaction/prune`) and
|
|
97
|
+
* consumed by the replacement that must follow it synchronously. The
|
|
98
|
+
* producer's shadow price covers exactly these seqs — which can differ
|
|
99
|
+
* from the replacement's declared range (pruned replacement nodes keep
|
|
100
|
+
* their own seqs, beyond the range end) — so removal must follow the seqs.
|
|
101
|
+
* Absent until armed, and REMOVED (not set to `undefined`) when consumed,
|
|
102
|
+
* to keep the state plain JSON for the projection cache.
|
|
103
|
+
*/
|
|
104
|
+
pendingShadowedSeqs?: number[];
|
|
105
|
+
/**
|
|
106
|
+
* The seq of the compaction/prune event that armed `pendingShadowedSeqs` —
|
|
107
|
+
* the shadowed path rewrites that event's `tokens` from the gross shadow
|
|
108
|
+
* price to the NET freed amount (removed nodes minus the synchronous
|
|
109
|
+
* replacement), so the row matches the drop the trend chart shows. Same
|
|
110
|
+
* arm/remove lifecycle as `pendingShadowedSeqs`.
|
|
111
|
+
*/
|
|
112
|
+
pendingShadowEventSeq?: number;
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/shared/types.d.ts
|
|
39
116
|
declare module '@deepseek-ai/dsh-session-projection/types' {
|
|
40
117
|
interface SessionProjectionMap {
|
|
41
118
|
/**
|
|
@@ -55,6 +132,10 @@ declare module '@deepseek-ai/dsh-session-projection/types' {
|
|
|
55
132
|
*/
|
|
56
133
|
contextHeaders: ContextHeaders;
|
|
57
134
|
}
|
|
135
|
+
interface SessionProjectionStateMap {
|
|
136
|
+
contextTimeline: TimelineState;
|
|
137
|
+
contextHeaders: HeadersState;
|
|
138
|
+
}
|
|
58
139
|
}
|
|
59
140
|
type Category = 'user' | 'inject' | 'assistant' | 'tool';
|
|
60
141
|
interface Snapshot {
|
|
@@ -273,315 +354,6 @@ interface ContextHeaders {
|
|
|
273
354
|
headers: HeaderRecord[];
|
|
274
355
|
}
|
|
275
356
|
//#endregion
|
|
276
|
-
//#region src/host/fold.d.ts
|
|
277
|
-
/**
|
|
278
|
-
* History retention bounds (configurable since 0.11 — see config.ts; these
|
|
279
|
-
* are the defaults' values). The fold keeps per-STEP request records; once the
|
|
280
|
-
* newest run count exceeds `maxKeptTurns`, the timeline is trimmed to the
|
|
281
|
-
* most recent whole TURN runs (never cutting a turn in half), so turn
|
|
282
|
-
* granularity can always show the full recent turn range instead of a
|
|
283
|
-
* step-count fragment. The turn-run trim runs whenever the cap is crossed
|
|
284
|
-
* (not only when the raw step bound is), so the bounded state stays at the
|
|
285
|
-
* newest ~`maxKeptTurns` turns deterministically as a live log grows.
|
|
286
|
-
*/
|
|
287
|
-
interface TimelineState {
|
|
288
|
-
/** Model-visible surface, newest last. */
|
|
289
|
-
surface: SurfaceNode[];
|
|
290
|
-
sums: Record<Category, number>;
|
|
291
|
-
systemTokens: number;
|
|
292
|
-
toolsTokens: number;
|
|
293
|
-
/**
|
|
294
|
-
* The projection-cache precondition is plain JSON: a property whose value
|
|
295
|
-
* is `undefined` makes the whole checkpoint unserializable
|
|
296
|
-
* (`snapshotJsonValue` rejects it), which fails EVERY cache write for the
|
|
297
|
-
* session — including the `title` projection row that powers the session
|
|
298
|
-
* list after a restart. Optional fields therefore use absent properties
|
|
299
|
-
* (`model`/`provider`/`lastModel`/`contextWindow` are simply not set until
|
|
300
|
-
* a value is known) instead of `undefined`-valued ones. Reads via
|
|
301
|
-
* `state.model` are identical for both shapes (`undefined` on miss).
|
|
302
|
-
*/
|
|
303
|
-
model?: string;
|
|
304
|
-
provider?: string;
|
|
305
|
-
lastModel?: string;
|
|
306
|
-
contextWindow?: number;
|
|
307
|
-
requests: RequestRecord[];
|
|
308
|
-
events: ContextEventRecord[];
|
|
309
|
-
/**
|
|
310
|
-
* Recently removed surface nodes (stamped COPIES carrying `gone`), in
|
|
311
|
-
* removal order. Feeds the Context browser's per-step reconstruction.
|
|
312
|
-
* Bounded two ways in trimState: capped to `maxArchiveNodes`, and pruned
|
|
313
|
-
* to removals after the oldest retained request (older removals can only
|
|
314
|
-
* serve steps the requests trim already forgot).
|
|
315
|
-
*/
|
|
316
|
-
archived: SurfaceNode[];
|
|
317
|
-
/**
|
|
318
|
-
* Session-cost raw material: cumulative billed-token totals per DeepSeek
|
|
319
|
-
* V4 model family and pricing period (see SessionCostUsage). Running
|
|
320
|
-
* totals — never trimmed, so the estimate always covers the COMPLETE
|
|
321
|
-
* session log even after the request/event retention bounds cut in.
|
|
322
|
-
* Absent until a v4-flash / v4-pro request reports usage.
|
|
323
|
-
*/
|
|
324
|
-
cost?: SessionCostUsage;
|
|
325
|
-
archiveFloor?: number;
|
|
326
|
-
/**
|
|
327
|
-
* Tool callId → name, armed by `tool/call` and DELETED when its
|
|
328
|
-
* `tool/result` folds in (one result per call, in log order) — the map
|
|
329
|
-
* stays at pending-call size instead of growing for the session's whole
|
|
330
|
-
* lifetime (it is persisted state, shallow-copied by every fold step).
|
|
331
|
-
*/
|
|
332
|
-
callNames: Record<string, string>;
|
|
333
|
-
/**
|
|
334
|
-
* Seq list of the surface nodes the next replacement will shadow, armed by
|
|
335
|
-
* the metering event (`compaction/summary` | `compaction/prune`) and
|
|
336
|
-
* consumed by the replacement that must follow it synchronously. The
|
|
337
|
-
* producer's shadow price covers exactly these seqs — which can differ
|
|
338
|
-
* from the replacement's declared range (pruned replacement nodes keep
|
|
339
|
-
* their own seqs, beyond the range end) — so removal must follow the seqs.
|
|
340
|
-
* Absent until armed, and REMOVED (not set to `undefined`) when consumed,
|
|
341
|
-
* to keep the state plain JSON for the projection cache.
|
|
342
|
-
*/
|
|
343
|
-
pendingShadowedSeqs?: number[];
|
|
344
|
-
/**
|
|
345
|
-
* The seq of the compaction/prune event that armed `pendingShadowedSeqs` —
|
|
346
|
-
* the shadowed path rewrites that event's `tokens` from the gross shadow
|
|
347
|
-
* price to the NET freed amount (removed nodes minus the synchronous
|
|
348
|
-
* replacement), so the row matches the drop the trend chart shows. Same
|
|
349
|
-
* arm/remove lifecycle as `pendingShadowedSeqs`.
|
|
350
|
-
*/
|
|
351
|
-
pendingShadowEventSeq?: number;
|
|
352
|
-
}
|
|
353
|
-
//#endregion
|
|
354
|
-
//#region node_modules/.pnpm/@deepseek-ai+dsh-session-projection@0.1.0-rc.8_@deepseek-ai+cordis@4.0.1_@deepseek-ai+d_c0ffab70d18276fadfe75ed916313ea3/node_modules/@deepseek-ai/dsh-session-projection/lib/types/types.d.ts
|
|
355
|
-
/**
|
|
356
|
-
* Pure-type outlet of the session-projection Service Definition: the one projection type
|
|
357
|
-
* table, importable from client aggregates without dragging the host-side
|
|
358
|
-
* cordis Context merges of the package root (dsh-agent → dsh-session). Domain
|
|
359
|
-
* packages may declare-merge through either the package root or this outlet —
|
|
360
|
-
* re-export preserves symbol identity, so both land on the same table.
|
|
361
|
-
*
|
|
362
|
-
* @module @deepseek-ai/dsh-session-projection/types
|
|
363
|
-
*/
|
|
364
|
-
/**
|
|
365
|
-
* The single projection type table for the whole chain (host provider, wire
|
|
366
|
-
* block, client cell, React hook). Domain packages merge their key here via
|
|
367
|
-
* declaration merging; values are wire-JSON whole values. How a value is
|
|
368
|
-
* rendered is the slot system's business, never this layer's.
|
|
369
|
-
*/
|
|
370
|
-
interface SessionProjectionMap {}
|
|
371
|
-
//#endregion
|
|
372
|
-
//#region node_modules/.pnpm/@deepseek-ai+dsh-session-projection@0.1.0-rc.8_@deepseek-ai+cordis@4.0.1_@deepseek-ai+d_c0ffab70d18276fadfe75ed916313ea3/node_modules/@deepseek-ai/dsh-session-projection/lib/types/index.d.ts
|
|
373
|
-
declare module '@deepseek-ai/cordis' {
|
|
374
|
-
interface Context {
|
|
375
|
-
sessionProjections: SessionProjectionRegistry;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* One domain's state-driven computation unit: three pure synchronous
|
|
380
|
-
* functions plus declarations — never an opaque getter. The framework drives
|
|
381
|
-
* `apply` on every committed session event; the domain holds no
|
|
382
|
-
* subscriptions and owns only the mathematics. All three functions MUST be
|
|
383
|
-
* synchronous (an async unit would tear the carriers' consistency cut) and
|
|
384
|
-
* `state` MUST be plain JSON (the persisted-cache precondition).
|
|
385
|
-
*/
|
|
386
|
-
interface ProjectionDefinition<K extends keyof SessionProjectionMap, S> {
|
|
387
|
-
/** The projection key this unit owns (its `SessionProjectionMap` entry). */
|
|
388
|
-
key: K;
|
|
389
|
-
/** Validates the wire payload (`view` output) before it leaves the host. */
|
|
390
|
-
schema: ZodType<SessionProjectionMap[K]>;
|
|
391
|
-
/**
|
|
392
|
-
* State for the empty log.
|
|
393
|
-
* @returns the initial state.
|
|
394
|
-
*/
|
|
395
|
-
init(): S;
|
|
396
|
-
/**
|
|
397
|
-
* Pure transition: previous state + one committed event → next state. A
|
|
398
|
-
* unit uninterested in an event MUST return the same state reference — an
|
|
399
|
-
* unchanged reference (`Object.is`) produces zero downstream work.
|
|
400
|
-
* @param state - the state covering all prior events.
|
|
401
|
-
* @param event - the next committed session event.
|
|
402
|
-
* @returns the next state (same reference when the event is not the unit's).
|
|
403
|
-
*/
|
|
404
|
-
apply(state: S, event: SessionEvent): S;
|
|
405
|
-
/**
|
|
406
|
-
* State → wire payload (the read-side projection).
|
|
407
|
-
* @param state - the current state.
|
|
408
|
-
* @returns the whole current value for this unit's key.
|
|
409
|
-
*/
|
|
410
|
-
view(state: S): SessionProjectionMap[K];
|
|
411
|
-
/**
|
|
412
|
-
* Persisted-cache invalidation version: bump whenever the serialized state fields or the
|
|
413
|
-
* fold semantics change, so persisted `(sessionId, key, ver, seq, val)`
|
|
414
|
-
* rows from an older unit are discarded instead of being forward-applied
|
|
415
|
-
* into garbage. Non-negative integer.
|
|
416
|
-
*/
|
|
417
|
-
stateVersion: number;
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Change-feed listener: one unit's value changed for one session. `value` is
|
|
421
|
-
* the schema-validated `view` output; `seq` is the unit's watermark at
|
|
422
|
-
* emission (the seq of the event that caused the change).
|
|
423
|
-
*/
|
|
424
|
-
type ProjectionChangeListener = (session: Session, key: Extract<keyof SessionProjectionMap, string>, value: unknown, seq: number) => void;
|
|
425
|
-
/**
|
|
426
|
-
* One consistent read cut over every registered unit for one session.
|
|
427
|
-
* `asOfSeq` is the shared watermark — the seq of the last event every value
|
|
428
|
-
* reflects (`-1` for an empty log, mirroring `session/subscribed.lastSeq`).
|
|
429
|
-
*/
|
|
430
|
-
interface ProjectionSnapshot {
|
|
431
|
-
/** Seq of the last event the values reflect; -1 for an empty log. */
|
|
432
|
-
asOfSeq: number;
|
|
433
|
-
/** Whole current value per registered key. */
|
|
434
|
-
values: Partial<SessionProjectionMap>;
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* One unit's checkpoint: its internal state (plain JSON by the unit
|
|
438
|
-
* contract), the seq of the last event folded into it, and the unit
|
|
439
|
-
* `stateVersion` that produced it — the persisted projection-cache row
|
|
440
|
-
* `(sessionId, key, ver, seq, val)` minus the two outer keys. A row is
|
|
441
|
-
* never authoritative, only a fold shortcut: `restore` discards it on a
|
|
442
|
-
* version mismatch or when it claims events past the stored log end.
|
|
443
|
-
*/
|
|
444
|
-
interface ProjectionCheckpointRow {
|
|
445
|
-
/** The registering unit's `stateVersion` at fold time. */
|
|
446
|
-
ver: number;
|
|
447
|
-
/** Seq of the last event folded into `val`; -1 for the empty log. */
|
|
448
|
-
seq: number;
|
|
449
|
-
/** The unit's internal state — plain JSON per the unit contract. */
|
|
450
|
-
val: unknown;
|
|
451
|
-
}
|
|
452
|
-
/** Checkpoint rows keyed by projection key (one session's persisted cache value). */
|
|
453
|
-
type ProjectionCheckpoint = Record<string, ProjectionCheckpointRow>;
|
|
454
|
-
/**
|
|
455
|
-
* `ctx.sessionProjections`: the projection unit table and its drive. The
|
|
456
|
-
* service subscribes to `session/event` once; every committed event passes
|
|
457
|
-
* every registered unit's `apply` (eager drive), and a changed state
|
|
458
|
-
* reference notifies the change feed with the schema-validated view.
|
|
459
|
-
* Cells build lazily — a unit registered after events flowed, or a session
|
|
460
|
-
* older than the registry, folds `init` over the in-memory log on first
|
|
461
|
-
* touch (event or read). Registration is an effect (disposer rides the
|
|
462
|
-
* calling fiber): an unloaded domain plugin's key disappears from snapshots
|
|
463
|
-
* and clients read it as capability absence. Domain
|
|
464
|
-
* plugins register under `ctx.inject(['sessionProjections'], …)` so headless
|
|
465
|
-
* assemblies without the registry stay unaffected. Registrants sharing a key
|
|
466
|
-
* share one unit and are counted: the same tool package mounted in N agent
|
|
467
|
-
* presets registers N times, and the key survives until the last one
|
|
468
|
-
* unloads.
|
|
469
|
-
*/
|
|
470
|
-
declare class SessionProjectionRegistry extends Service {
|
|
471
|
-
private readonly registrations;
|
|
472
|
-
private readonly listeners;
|
|
473
|
-
/**
|
|
474
|
-
* Create and install the registry as `ctx.sessionProjections`.
|
|
475
|
-
* @param ctx - Cordis context that owns the service.
|
|
476
|
-
*/
|
|
477
|
-
constructor(ctx: Context);
|
|
478
|
-
/**
|
|
479
|
-
* Register one domain's unit. The registration is an effect on the calling
|
|
480
|
-
* context's fiber: disposing the fiber (or calling the returned disposer)
|
|
481
|
-
* removes the key — and the unit's cached cells — from subsequent drives
|
|
482
|
-
* and snapshots.
|
|
483
|
-
* @param definition - key, state schema, pure unit functions, and stateVersion.
|
|
484
|
-
* @returns the exact disposer that unregisters this unit.
|
|
485
|
-
*/
|
|
486
|
-
register<K extends keyof SessionProjectionMap, S>(definition: ProjectionDefinition<K, S>): () => void;
|
|
487
|
-
/**
|
|
488
|
-
* Subscribe to the change feed. The registration is an effect on the
|
|
489
|
-
* calling context's fiber.
|
|
490
|
-
* @param listener - called once per unit whose state reference changed, per committed event.
|
|
491
|
-
* @returns the exact disposer that unsubscribes.
|
|
492
|
-
*/
|
|
493
|
-
onChanged(listener: ProjectionChangeListener): () => void;
|
|
494
|
-
/**
|
|
495
|
-
* One consistent cut over every registered unit for one session, read from
|
|
496
|
-
* the watermark cache (missing cells fold lazily over the in-memory log).
|
|
497
|
-
* Fully synchronous — every value and `asOfSeq` reflect the same log
|
|
498
|
-
* position. Each value passes its unit's schema before leaving.
|
|
499
|
-
* @param session - the session whose projection values are read.
|
|
500
|
-
* @returns the snapshot; `values` is empty when no unit is registered.
|
|
501
|
-
*/
|
|
502
|
-
snapshot(session: Session): ProjectionSnapshot;
|
|
503
|
-
/**
|
|
504
|
-
* State-level checkpoint of every registered unit for one session, read
|
|
505
|
-
* from the watermark cache (missing cells fold lazily over the in-memory
|
|
506
|
-
* log). This is the write side of the persisted projection cache: the
|
|
507
|
-
* returned rows are the `(key → {ver, seq, val})` part of the durable
|
|
508
|
-
* `(sessionId, key, ver, seq, val)`
|
|
509
|
-
* rows. Every `val` is a DETACHED structured clone — never the live
|
|
510
|
-
* cell reference: the watermark cache is this registry's authoritative
|
|
511
|
-
* mutable state, and a caller reaching the live reference could corrupt
|
|
512
|
-
* every subsequent snapshot and frame through it (plain JSON by the unit
|
|
513
|
-
* contract, so the clone is total).
|
|
514
|
-
* @param session - the session whose unit states are checkpointed.
|
|
515
|
-
* @returns one row per registered key; empty when no unit is registered.
|
|
516
|
-
*/
|
|
517
|
-
checkpoint(session: Session): ProjectionCheckpoint;
|
|
518
|
-
/**
|
|
519
|
-
* The stored seq a {@link restore} tail read over `checkpoint` must start
|
|
520
|
-
* at: one event BELOW the lowest usable watermark (a row is usable when
|
|
521
|
-
* its `ver` matches the live unit's `stateVersion`; an absent or mismatched row
|
|
522
|
-
* pulls the floor to `0` — that key must refold the full log). The
|
|
523
|
-
* one-below anchor is load-bearing: the tail then proves how far the
|
|
524
|
-
* stored log still extends, so {@link restore} can detect a log that
|
|
525
|
-
* shrank below a row's watermark (crash-repair truncation) instead of
|
|
526
|
-
* serving the stale row as current — an empty tail read from the anchor
|
|
527
|
-
* yields an end below every watermark and the restore rejects for a full
|
|
528
|
-
* re-read.
|
|
529
|
-
* @param checkpoint - persisted rows for one session (possibly stale or empty).
|
|
530
|
-
* @returns the seq to hand the persistence `readFrom`, or `undefined`
|
|
531
|
-
* when no unit is registered (no read needed — {@link restore} would
|
|
532
|
-
* serve empty values regardless).
|
|
533
|
-
*/
|
|
534
|
-
restoreFloor(checkpoint: ProjectionCheckpoint): number | undefined;
|
|
535
|
-
/**
|
|
536
|
-
* View a checkpoint's rows without any log read: for every registered
|
|
537
|
-
* unit whose row's `ver` matches, serve the schema-validated
|
|
538
|
-
* `view` of the stored state; mismatched or absent rows leave their key
|
|
539
|
-
* absent (a cold or listing consumer treats it as not-yet-available and a
|
|
540
|
-
* fuller read path refolds it). The zero-I/O rung of the read ladder —
|
|
541
|
-
* values are as stale as their rows, never wrong.
|
|
542
|
-
* @param checkpoint - persisted rows for one session (possibly stale or empty).
|
|
543
|
-
* @returns whole values per key with a usable row; empty when none.
|
|
544
|
-
*/
|
|
545
|
-
viewCheckpoint(checkpoint: ProjectionCheckpoint): Partial<SessionProjectionMap>;
|
|
546
|
-
/**
|
|
547
|
-
* Cold read: fold every registered unit over a stored log suffix, seeding
|
|
548
|
-
* each from its checkpoint row when usable — the one read recipe (cached
|
|
549
|
-
* state + forward tail replay + `view`) applied without a live `Session`.
|
|
550
|
-
* Call with the events returned by a persistence
|
|
551
|
-
* `readFrom(id, restoreFloor(checkpoint))` and that same floor as
|
|
552
|
-
* `baseSeq`; the floor's one-below anchor makes the supplied end honest,
|
|
553
|
-
* so a shrunk log is detected here. A row is usable iff its
|
|
554
|
-
* `ver` matches the live unit's `stateVersion`, it does not predate `baseSeq`
|
|
555
|
-
* (`seq >= baseSeq - 1`), and it does not claim events past the
|
|
556
|
-
* supplied end (`seq <= endSeq`); an unusable row is discarded
|
|
557
|
-
* and its key refolds from `init` — which is only sound over the full
|
|
558
|
-
* log, so a discarded row with `baseSeq > 0` throws (the caller re-reads
|
|
559
|
-
* from seq 0, e.g. after a crash-repair truncation shrank the log below
|
|
560
|
-
* a row's watermark).
|
|
561
|
-
* @param checkpoint - persisted rows for one session (possibly stale or empty).
|
|
562
|
-
* @param events - the stored events with `seq >= baseSeq`, in seq order.
|
|
563
|
-
* @param baseSeq - the seq `events` starts at (its first event's seq when non-empty).
|
|
564
|
-
* @returns the snapshot cut at the supplied log end (`asOfSeq` is the last
|
|
565
|
-
* supplied event's seq, `baseSeq - 1` for an empty tail) plus the
|
|
566
|
-
* refreshed checkpoint rows at that cut, ready for a durable write-back.
|
|
567
|
-
*/
|
|
568
|
-
restore(checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq: number): {
|
|
569
|
-
snapshot: ProjectionSnapshot;
|
|
570
|
-
checkpoint: ProjectionCheckpoint;
|
|
571
|
-
};
|
|
572
|
-
/** Fold one unit from init over `events`, producing a cell watermarked at the last folded event. */
|
|
573
|
-
private buildCell;
|
|
574
|
-
/** Read (or lazily build, folding the full in-memory log) one unit's cell. */
|
|
575
|
-
private cellFor;
|
|
576
|
-
/** Eager drive: pass one committed event through every registered unit; notify on changed references. */
|
|
577
|
-
private drive;
|
|
578
|
-
}
|
|
579
|
-
//#endregion
|
|
580
|
-
//#region src/host/headers.d.ts
|
|
581
|
-
interface HeadersState {
|
|
582
|
-
headers: HeaderRecord[];
|
|
583
|
-
}
|
|
584
|
-
//#endregion
|
|
585
357
|
//#region src/host/index.d.ts
|
|
586
358
|
declare const name = "dsh-context";
|
|
587
359
|
declare const inject: string[];
|
package/lib/index.js
CHANGED
|
@@ -1085,9 +1085,9 @@ function buildTimelineView(state, bounds) {
|
|
|
1085
1085
|
const surfaceTotal = state.sums.user + state.sums.inject + state.sums.assistant + state.sums.tool;
|
|
1086
1086
|
const result = {
|
|
1087
1087
|
ok: true,
|
|
1088
|
-
model: state.model,
|
|
1089
|
-
provider: state.provider,
|
|
1090
|
-
contextWindow: state.contextWindow,
|
|
1088
|
+
...state.model !== void 0 ? { model: state.model } : {},
|
|
1089
|
+
...state.provider !== void 0 ? { provider: state.provider } : {},
|
|
1090
|
+
...state.contextWindow !== void 0 ? { contextWindow: state.contextWindow } : {},
|
|
1091
1091
|
current: {
|
|
1092
1092
|
system: state.systemTokens,
|
|
1093
1093
|
tools: state.toolsTokens,
|
|
@@ -1314,6 +1314,9 @@ const timelineStateSchema = z.object({
|
|
|
1314
1314
|
* The definition carries BOTH session-projection contracts (see compat.ts):
|
|
1315
1315
|
* `schema`/`view` for dsh <= 0.1.0-rc.8, `stateSchema`/`wire` for
|
|
1316
1316
|
* dsh >= 0.1.1-rc.1 — each registry reads its own fields off the same unit.
|
|
1317
|
+
* (The return type is the mirrored dual contract, not the installed dts
|
|
1318
|
+
* `ProjectionDefinition`: the 0.1.1+ registry's wired-register overload
|
|
1319
|
+
* demands `wire` PRESENT, which the dts's optional `wire?` fails.)
|
|
1317
1320
|
* Without the `wire` block the 0.1.1-rc.1+ registry treats the unit as
|
|
1318
1321
|
* host-only and never delivers `contextTimeline` to the browser (the Context
|
|
1319
1322
|
* tab would stay on its loading screen forever).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-context",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "A DeepSeek Harness plugin for context insight and management, with context dashboard and context command, for understanding how the context is made of, and how it evolves.",
|
|
5
5
|
"author": "bowenliang123",
|
|
6
6
|
"repository": {
|
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
"inject": [
|
|
53
53
|
"@deepseek-ai/dsh-client-connection",
|
|
54
54
|
"@deepseek-ai/dsh-client-locale",
|
|
55
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
56
55
|
"@deepseek-ai/dsh-client-ui-conversation",
|
|
57
56
|
"@deepseek-ai/dsh-client-ui-settings"
|
|
58
57
|
],
|
|
@@ -71,9 +70,9 @@
|
|
|
71
70
|
"license": "Apache-2.0",
|
|
72
71
|
"peerDependencies": {
|
|
73
72
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-primitives": "
|
|
75
|
-
"@deepseek-ai/dsh-session": "
|
|
76
|
-
"@deepseek-ai/dsh-settings": "
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.0-rc.7",
|
|
74
|
+
"@deepseek-ai/dsh-session": ">=0.1.0-rc.7",
|
|
75
|
+
"@deepseek-ai/dsh-settings": ">=0.1.0-rc.7",
|
|
77
76
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
78
77
|
"react": "^18.3.1",
|
|
79
78
|
"zod": "^4.4.3"
|
|
@@ -88,10 +87,10 @@
|
|
|
88
87
|
},
|
|
89
88
|
"devDependencies": {
|
|
90
89
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
91
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.
|
|
92
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
93
|
-
"@deepseek-ai/dsh-session-projection": "^0.1.
|
|
94
|
-
"@deepseek-ai/dsh-settings": "^0.1.
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.1-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
95
94
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
96
95
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
97
96
|
"@types/node": "^26.2.0",
|