@jcy2387/dsh-conversation-ui 0.1.7-rc.1 → 0.1.7-rc.3
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/README.en.md +3 -3
- package/README.md +3 -3
- package/lib/client.js +86 -75
- package/lib/client.js.map +1 -1
- package/package.json +24 -21
- package/src/client/TypewriterAssistantNodeView.tsx +36 -10
package/README.en.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @jcy2387/dsh-conversation-ui
|
|
2
2
|
|
|
3
|
-
This release targets Harness `0.1.7-rc.
|
|
3
|
+
This release targets Harness `0.1.7-rc.2`. The deliverables card uses an independent list entry alongside native file previews, change review, and other plugins’ Turn-tail contributions. Settings appear on the Suite or standalone bundle page. Harness `0.1.5` users should keep plugin version `0.1.5-rc.2`.
|
|
4
4
|
|
|
5
5
|
[](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
@@ -53,7 +53,7 @@ A Codex-style conversation UI enhancement plugin for DeepSeek Harness (DSH): the
|
|
|
53
53
|
Published package:
|
|
54
54
|
|
|
55
55
|
```sh
|
|
56
|
-
dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.
|
|
56
|
+
dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.3
|
|
57
57
|
dsh web
|
|
58
58
|
```
|
|
59
59
|
|
|
@@ -123,4 +123,4 @@ Tests run on vitest + Testing Library, covering stream smoothing, native scroll
|
|
|
123
123
|
|
|
124
124
|
[MIT](LICENSE) © jcy2387
|
|
125
125
|
|
|
126
|
-
This release targets DSH `0.1.7-rc.
|
|
126
|
+
This release targets DSH `0.1.7-rc.2`. It imports `conversation-ui.thinkAutoExpand` from `settings.yaml` or `settings.yaml.imported` into the active profile’s `cordis.patch.yml`, recording a marker after success and retaining the source after failure. The plugin’s compatibility import fills only missing values. Exported `locale/en.json` and `locale/zh.json` localize the name and description in DSH.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @jcy2387/dsh-conversation-ui
|
|
2
2
|
|
|
3
|
-
本版本面向 Harness `0.1.7-rc.
|
|
3
|
+
本版本面向 Harness `0.1.7-rc.2`。产物卡片使用新版列表插槽中的独立条目,与原生文件预览、变更审阅及其他插件的回合尾部内容共存;插件设置位于 Suite 或独立插件的配置页。`0.1.5` 用户应继续使用插件 `0.1.5-rc.2`。
|
|
4
4
|
|
|
5
5
|
[](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
@@ -53,7 +53,7 @@ DeepSeek Harness(DSH)的 Codex 风格对话界面增强插件:把 Web 对
|
|
|
53
53
|
已发布版本:
|
|
54
54
|
|
|
55
55
|
```sh
|
|
56
|
-
dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.
|
|
56
|
+
dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.3
|
|
57
57
|
dsh web
|
|
58
58
|
```
|
|
59
59
|
|
|
@@ -123,4 +123,4 @@ pnpm --filter @jcy2387/dsh-conversation-ui build
|
|
|
123
123
|
|
|
124
124
|
[MIT](LICENSE) © jcy2387
|
|
125
125
|
|
|
126
|
-
本版面向 DSH `0.1.7-rc.
|
|
126
|
+
本版面向 DSH `0.1.7-rc.2`。旧 `conversation-ui.thinkAutoExpand` 从 `settings.yaml` 或 `settings.yaml.imported` 导入当前 profile 的 `cordis.patch.yml`,成功后记录迁移标记;失败保留源文件供重试。插件兼容导入只补充缺失的值。名称和描述通过导出的 `locale/en.json`、`locale/zh.json` 跟随 DSH 界面语言。
|
package/lib/client.js
CHANGED
|
@@ -438,50 +438,50 @@ window.__ModuleLoader__.load({
|
|
|
438
438
|
tag.textContent = css$2;
|
|
439
439
|
}
|
|
440
440
|
var TypewriterAssistantNodeView_module_css_default = {
|
|
441
|
-
"
|
|
442
|
-
"
|
|
443
|
-
"dsh-conversation-ui-think-sweep": "Sp5wgW_dsh-conversation-ui-think-sweep",
|
|
444
|
-
"toolGroupAnchor": "Sp5wgW_toolGroupAnchor",
|
|
445
|
-
"toolGroupHeaderChevron": "Sp5wgW_toolGroupHeaderChevron",
|
|
441
|
+
"root": "Sp5wgW_root",
|
|
442
|
+
"toolGroupHeaderLabel": "Sp5wgW_toolGroupHeaderLabel",
|
|
446
443
|
"thinkRow": "Sp5wgW_thinkRow",
|
|
447
444
|
"visuallyHidden": "Sp5wgW_visuallyHidden",
|
|
448
|
-
"
|
|
449
|
-
"
|
|
445
|
+
"follow": "Sp5wgW_follow",
|
|
446
|
+
"toolGroupHeaderIcon": "Sp5wgW_toolGroupHeaderIcon",
|
|
450
447
|
"toolGroupHeaderGlyph": "Sp5wgW_toolGroupHeaderGlyph",
|
|
451
|
-
"root": "Sp5wgW_root",
|
|
452
|
-
"streamSemanticIcon": "Sp5wgW_streamSemanticIcon",
|
|
453
448
|
"thinkLeading": "Sp5wgW_thinkLeading",
|
|
454
|
-
"toolGroupHeaderLabel": "Sp5wgW_toolGroupHeaderLabel",
|
|
455
|
-
"eventRow": "Sp5wgW_eventRow",
|
|
456
|
-
"disclosureRoot": "Sp5wgW_disclosureRoot",
|
|
457
449
|
"toolSemanticIcon": "Sp5wgW_toolSemanticIcon",
|
|
458
|
-
"
|
|
450
|
+
"thinkSummary": "Sp5wgW_thinkSummary",
|
|
451
|
+
"dsh-codex-stream-enter": "Sp5wgW_dsh-codex-stream-enter",
|
|
459
452
|
"reasoningDisclosure": "Sp5wgW_reasoningDisclosure",
|
|
460
|
-
"dsh-turn-waiting-shimmer": "Sp5wgW_dsh-turn-waiting-shimmer",
|
|
461
|
-
"reasoningSummary": "Sp5wgW_reasoningSummary",
|
|
462
|
-
"disclosureTitle": "Sp5wgW_disclosureTitle",
|
|
463
|
-
"turnPrelude": "Sp5wgW_turnPrelude",
|
|
464
|
-
"thinkChevron": "Sp5wgW_thinkChevron",
|
|
465
|
-
"disclosureTrailing": "Sp5wgW_disclosureTrailing",
|
|
466
|
-
"body": "Sp5wgW_body",
|
|
467
|
-
"toolGroupContent": "Sp5wgW_toolGroupContent",
|
|
468
453
|
"nestedToolSemanticIcon": "Sp5wgW_nestedToolSemanticIcon",
|
|
469
|
-
"
|
|
470
|
-
"
|
|
471
|
-
"turnFoldRow": "Sp5wgW_turnFoldRow",
|
|
472
|
-
"turnFoldButton": "Sp5wgW_turnFoldButton",
|
|
454
|
+
"body": "Sp5wgW_body",
|
|
455
|
+
"turnWaiting": "Sp5wgW_turnWaiting",
|
|
473
456
|
"toolGroupHeader": "Sp5wgW_toolGroupHeader",
|
|
474
|
-
"
|
|
475
|
-
"
|
|
476
|
-
"
|
|
477
|
-
"
|
|
457
|
+
"disclosureLeading": "Sp5wgW_disclosureLeading",
|
|
458
|
+
"disclosureContent": "Sp5wgW_disclosureContent",
|
|
459
|
+
"thinkBody": "Sp5wgW_thinkBody",
|
|
460
|
+
"toolGroupContent": "Sp5wgW_toolGroupContent",
|
|
461
|
+
"disclosureRoot": "Sp5wgW_disclosureRoot",
|
|
478
462
|
"reasoningText": "Sp5wgW_reasoningText",
|
|
463
|
+
"dsh-turn-waiting-shimmer": "Sp5wgW_dsh-turn-waiting-shimmer",
|
|
464
|
+
"turnFoldLabel": "Sp5wgW_turnFoldLabel",
|
|
465
|
+
"markdownFlow": "Sp5wgW_markdownFlow",
|
|
466
|
+
"streamSemanticIcon": "Sp5wgW_streamSemanticIcon",
|
|
467
|
+
"dsh-conversation-ui-think-sweep": "Sp5wgW_dsh-conversation-ui-think-sweep",
|
|
479
468
|
"toolGroupFrame": "Sp5wgW_toolGroupFrame",
|
|
469
|
+
"reasoningSummary": "Sp5wgW_reasoningSummary",
|
|
480
470
|
"think": "Sp5wgW_think",
|
|
481
|
-
"
|
|
482
|
-
"
|
|
471
|
+
"turnFoldButton": "Sp5wgW_turnFoldButton",
|
|
472
|
+
"turnPrelude": "Sp5wgW_turnPrelude",
|
|
473
|
+
"eventRow": "Sp5wgW_eventRow",
|
|
474
|
+
"toolGroupHeaderChevron": "Sp5wgW_toolGroupHeaderChevron",
|
|
475
|
+
"turnFoldRow": "Sp5wgW_turnFoldRow",
|
|
483
476
|
"stopped": "Sp5wgW_stopped",
|
|
484
|
-
"
|
|
477
|
+
"toolGroupAnchor": "Sp5wgW_toolGroupAnchor",
|
|
478
|
+
"thinkChevron": "Sp5wgW_thinkChevron",
|
|
479
|
+
"thinkTitle": "Sp5wgW_thinkTitle",
|
|
480
|
+
"disclosureTrailing": "Sp5wgW_disclosureTrailing",
|
|
481
|
+
"disclosureTitle": "Sp5wgW_disclosureTitle",
|
|
482
|
+
"disclosureRow": "Sp5wgW_disclosureRow",
|
|
483
|
+
"editStats": "Sp5wgW_editStats",
|
|
484
|
+
"thinkSeparator": "Sp5wgW_thinkSeparator"
|
|
485
485
|
};
|
|
486
486
|
//#endregion
|
|
487
487
|
//#region src/client/FollowHost.tsx
|
|
@@ -835,7 +835,7 @@ window.__ModuleLoader__.load({
|
|
|
835
835
|
* commits when the frame rate is degraded. Settled text uses the full Markdown
|
|
836
836
|
* pipeline.
|
|
837
837
|
*/
|
|
838
|
-
const TypewriterAssistantNodeView = (0, react.memo)(function TypewriterAssistantNodeView({ mode = DEFAULT_CONVERSATION_CONFIG.mode, preset = DEFAULT_CONVERSATION_CONFIG.preset, revealCharsPerSec = DEFAULT_CONVERSATION_CONFIG.revealCharsPerSec, scrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.scrollSpeedPxPerSec, maxScrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.maxScrollSpeedPxPerSec, thinkAutoExpand = DEFAULT_CONVERSATION_SETTINGS.thinkAutoExpand, node, turnProcess, useTurnData, useSession, openFile, renderMessageImages, fileMentions, t }) {
|
|
838
|
+
const TypewriterAssistantNodeView = (0, react.memo)(function TypewriterAssistantNodeView({ mode = DEFAULT_CONVERSATION_CONFIG.mode, preset = DEFAULT_CONVERSATION_CONFIG.preset, revealCharsPerSec = DEFAULT_CONVERSATION_CONFIG.revealCharsPerSec, scrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.scrollSpeedPxPerSec, maxScrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.maxScrollSpeedPxPerSec, thinkAutoExpand = DEFAULT_CONVERSATION_SETTINGS.thinkAutoExpand, node, groupPart, turnProcess, useTurnData, useSession, openFile, renderMessageImages, fileMentions, t }) {
|
|
839
839
|
const data = node.data;
|
|
840
840
|
const streaming = data.status === "running";
|
|
841
841
|
const reducedMotion = usePrefersReducedMotion();
|
|
@@ -872,7 +872,8 @@ window.__ModuleLoader__.load({
|
|
|
872
872
|
},
|
|
873
873
|
footnotes: t("markdown.footnotes")
|
|
874
874
|
}), [t]);
|
|
875
|
-
const
|
|
875
|
+
const blocks = (0, react.useMemo)(() => groupPart === "reasoning" ? data.blocks.filter((block) => block.kind === "reasoning") : groupPart === "response" ? data.blocks.filter((block) => block.kind !== "reasoning") : data.blocks, [data.blocks, groupPart]);
|
|
876
|
+
const hasVisible = streaming || data.status === "interrupted" || blocks.some((block) => block.kind !== "tool-call");
|
|
876
877
|
const fallbackControl = ownsFallbackProcessControl(node, turnProcess, fallbackGate);
|
|
877
878
|
const fallbackMember = isFallbackProcessMember(node, turnProcess, fallbackGate);
|
|
878
879
|
const reasoningHidden = (turnProcess?.foldable === true || fallbackControl) && turnProcess?.spec.answerStep === data.step && turnProcess.spec.inlineReasoning && !turnProcess.open;
|
|
@@ -887,14 +888,24 @@ window.__ModuleLoader__.load({
|
|
|
887
888
|
}, [guardRef, seatRef]);
|
|
888
889
|
if (!hasVisible) return null;
|
|
889
890
|
const rendered = [];
|
|
890
|
-
const last =
|
|
891
|
+
const last = blocks.length - 1;
|
|
891
892
|
let lastFollow = -1;
|
|
892
|
-
for (let index = 0; index <
|
|
893
|
-
const kind =
|
|
893
|
+
for (let index = 0; index < blocks.length; index += 1) {
|
|
894
|
+
const kind = blocks[index]?.kind;
|
|
894
895
|
if (kind === "text" || kind === "reasoning") lastFollow = index;
|
|
895
896
|
}
|
|
896
|
-
|
|
897
|
-
|
|
897
|
+
let nodeTailBlock;
|
|
898
|
+
for (let index = data.blocks.length - 1; index >= 0; index -= 1) {
|
|
899
|
+
const kind = data.blocks[index]?.kind;
|
|
900
|
+
if (kind === "text" || kind === "reasoning") {
|
|
901
|
+
nodeTailBlock = data.blocks[index];
|
|
902
|
+
break;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
const followsTail = lastFollow >= 0 && lastFollow === last && blocks[lastFollow] === nodeTailBlock;
|
|
906
|
+
const stoppedHere = data.status === "interrupted" && (groupPart === void 0 || groupPart === "response" || !data.blocks.some((block) => block !== void 0 && block.kind !== "reasoning" && block.kind !== "tool-call"));
|
|
907
|
+
for (let index = 0; index < blocks.length; index += 1) {
|
|
908
|
+
const block = blocks[index];
|
|
898
909
|
if (block === void 0) continue;
|
|
899
910
|
switch (block.kind) {
|
|
900
911
|
case "text":
|
|
@@ -933,8 +944,8 @@ window.__ModuleLoader__.load({
|
|
|
933
944
|
case "image": {
|
|
934
945
|
const start = index;
|
|
935
946
|
const group = [block];
|
|
936
|
-
while (index + 1 <
|
|
937
|
-
const next =
|
|
947
|
+
while (index + 1 < blocks.length) {
|
|
948
|
+
const next = blocks[index + 1];
|
|
938
949
|
if (next === void 0 || next.kind !== "image") break;
|
|
939
950
|
group.push(next);
|
|
940
951
|
index += 1;
|
|
@@ -960,13 +971,13 @@ window.__ModuleLoader__.load({
|
|
|
960
971
|
"data-stream-phase": phase,
|
|
961
972
|
"data-streaming": streaming || void 0,
|
|
962
973
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FollowHost, {
|
|
963
|
-
active: streaming && !reducedMotion,
|
|
974
|
+
active: streaming && !reducedMotion && followsTail,
|
|
964
975
|
speedCpsRef: rootSpeedRef,
|
|
965
976
|
minSpeedPxPerSec: scrollSpeedPxPerSec,
|
|
966
977
|
maxSpeedPxPerSec: maxScrollSpeedPxPerSec,
|
|
967
978
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
968
979
|
className: TypewriterAssistantNodeView_module_css_default.body,
|
|
969
|
-
children: [rendered,
|
|
980
|
+
children: [rendered, stoppedHere && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
970
981
|
className: TypewriterAssistantNodeView_module_css_default.stopped,
|
|
971
982
|
children: t("message.stopped")
|
|
972
983
|
})]
|
|
@@ -2035,30 +2046,30 @@ window.__ModuleLoader__.load({
|
|
|
2035
2046
|
tag.textContent = css$1;
|
|
2036
2047
|
}
|
|
2037
2048
|
var ConversationCard_module_css_default = {
|
|
2038
|
-
"
|
|
2039
|
-
"save": "XFnqVW_save",
|
|
2049
|
+
"description": "XFnqVW_description",
|
|
2040
2050
|
"cardOpen": "XFnqVW_cardOpen",
|
|
2041
|
-
"
|
|
2042
|
-
"
|
|
2043
|
-
"update": "XFnqVW_update",
|
|
2044
|
-
"header": "XFnqVW_header",
|
|
2045
|
-
"card": "XFnqVW_card",
|
|
2046
|
-
"hint": "XFnqVW_hint",
|
|
2051
|
+
"metadata": "XFnqVW_metadata",
|
|
2052
|
+
"readOnly": "XFnqVW_readOnly",
|
|
2047
2053
|
"updateRow": "XFnqVW_updateRow",
|
|
2048
|
-
"
|
|
2054
|
+
"failure": "XFnqVW_failure",
|
|
2049
2055
|
"toggle": "XFnqVW_toggle",
|
|
2056
|
+
"card": "XFnqVW_card",
|
|
2050
2057
|
"fieldHead": "XFnqVW_fieldHead",
|
|
2058
|
+
"failed": "XFnqVW_failed",
|
|
2059
|
+
"field": "XFnqVW_field",
|
|
2060
|
+
"headText": "XFnqVW_headText",
|
|
2061
|
+
"version": "XFnqVW_version",
|
|
2062
|
+
"footer": "XFnqVW_footer",
|
|
2063
|
+
"pending": "XFnqVW_pending",
|
|
2064
|
+
"hint": "XFnqVW_hint",
|
|
2065
|
+
"update": "XFnqVW_update",
|
|
2051
2066
|
"discard": "XFnqVW_discard",
|
|
2067
|
+
"label": "XFnqVW_label",
|
|
2052
2068
|
"updateCopy": "XFnqVW_updateCopy",
|
|
2053
|
-
"
|
|
2069
|
+
"body": "XFnqVW_body",
|
|
2070
|
+
"save": "XFnqVW_save",
|
|
2054
2071
|
"name": "XFnqVW_name",
|
|
2055
|
-
"
|
|
2056
|
-
"metadata": "XFnqVW_metadata",
|
|
2057
|
-
"readOnly": "XFnqVW_readOnly",
|
|
2058
|
-
"footer": "XFnqVW_footer",
|
|
2059
|
-
"failure": "XFnqVW_failure",
|
|
2060
|
-
"headText": "XFnqVW_headText",
|
|
2061
|
-
"label": "XFnqVW_label"
|
|
2072
|
+
"header": "XFnqVW_header"
|
|
2062
2073
|
};
|
|
2063
2074
|
//#endregion
|
|
2064
2075
|
//#region src/client/ConversationCard.tsx
|
|
@@ -2752,7 +2763,7 @@ window.__ModuleLoader__.load({
|
|
|
2752
2763
|
immer.createDraft.bind(immer);
|
|
2753
2764
|
immer.finishDraft.bind(immer);
|
|
2754
2765
|
//#endregion
|
|
2755
|
-
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.1.7-rc.
|
|
2766
|
+
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.1.7-rc.2_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
|
|
2756
2767
|
/**
|
|
2757
2768
|
* React-free snapshot store engine (zustand vanilla + immer + subscribeWithSelector +
|
|
2758
2769
|
* rafFlush middleware + opt-in persist + dev freeze) plus the declarative
|
|
@@ -2997,7 +3008,7 @@ window.__ModuleLoader__.load({
|
|
|
2997
3008
|
}
|
|
2998
3009
|
};
|
|
2999
3010
|
//#endregion
|
|
3000
|
-
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.1.7-rc.
|
|
3011
|
+
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.1.7-rc.2_@deepseek-ai+cordis@4.0.4_@deepseek-ai+dsh-scope@0._96480dbecf47e43f89b841d272151264/node_modules/@deepseek-ai/dsh-session/lib/types/surface.js
|
|
3001
3012
|
/** Runtime counterpart of the message-producing event union. */
|
|
3002
3013
|
const SURFACE_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
3003
3014
|
"system/message",
|
|
@@ -3279,24 +3290,24 @@ window.__ModuleLoader__.load({
|
|
|
3279
3290
|
tag.textContent = css;
|
|
3280
3291
|
}
|
|
3281
3292
|
var DeliverablesCard_module_css_default = {
|
|
3282
|
-
"list": "sLyncq_list",
|
|
3283
|
-
"header": "sLyncq_header",
|
|
3284
|
-
"fileName": "sLyncq_fileName",
|
|
3285
|
-
"websitePath": "sLyncq_websitePath",
|
|
3286
|
-
"stats": "sLyncq_stats",
|
|
3287
|
-
"moreIcon": "sLyncq_moreIcon",
|
|
3288
|
-
"added": "sLyncq_added",
|
|
3289
|
-
"removed": "sLyncq_removed",
|
|
3290
|
-
"headerIcon": "sLyncq_headerIcon",
|
|
3291
|
-
"parentPath": "sLyncq_parentPath",
|
|
3292
|
-
"filePath": "sLyncq_filePath",
|
|
3293
3293
|
"root": "sLyncq_root",
|
|
3294
|
-
"
|
|
3294
|
+
"list": "sLyncq_list",
|
|
3295
3295
|
"subtitle": "sLyncq_subtitle",
|
|
3296
3296
|
"title": "sLyncq_title",
|
|
3297
|
+
"header": "sLyncq_header",
|
|
3297
3298
|
"item": "sLyncq_item",
|
|
3299
|
+
"more": "sLyncq_more",
|
|
3300
|
+
"filePath": "sLyncq_filePath",
|
|
3301
|
+
"websitePath": "sLyncq_websitePath",
|
|
3302
|
+
"fileName": "sLyncq_fileName",
|
|
3303
|
+
"parentPath": "sLyncq_parentPath",
|
|
3298
3304
|
"heading": "sLyncq_heading",
|
|
3299
|
-
"
|
|
3305
|
+
"added": "sLyncq_added",
|
|
3306
|
+
"external": "sLyncq_external",
|
|
3307
|
+
"headerIcon": "sLyncq_headerIcon",
|
|
3308
|
+
"removed": "sLyncq_removed",
|
|
3309
|
+
"moreIcon": "sLyncq_moreIcon",
|
|
3310
|
+
"stats": "sLyncq_stats"
|
|
3300
3311
|
};
|
|
3301
3312
|
//#endregion
|
|
3302
3313
|
//#region src/client/DeliverablesCard.tsx
|