dsh-plugin-t-expert 0.3.46 → 0.3.66
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 +173 -64
- package/lib/index.js +24 -16
- package/package.json +6 -1
package/lib/client.js
CHANGED
|
@@ -7886,8 +7886,8 @@ var error20 = () => {
|
|
|
7886
7886
|
case "invalid_union":
|
|
7887
7887
|
return "\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF";
|
|
7888
7888
|
case "invalid_element": {
|
|
7889
|
-
const
|
|
7890
|
-
return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${
|
|
7889
|
+
const place2 = withDefinite(issue2.origin ?? "array");
|
|
7890
|
+
return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${place2}`;
|
|
7891
7891
|
}
|
|
7892
7892
|
default:
|
|
7893
7893
|
return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`;
|
|
@@ -20018,7 +20018,7 @@ var scheduleWorkspaceSchema = external_exports.object({
|
|
|
20018
20018
|
|
|
20019
20019
|
// src/client.jsx
|
|
20020
20020
|
var NS = "t-team";
|
|
20021
|
-
var CLIENT_BUILD_VERSION = "0.3.
|
|
20021
|
+
var CLIENT_BUILD_VERSION = "0.3.66";
|
|
20022
20022
|
var uiPrefs = { showTaskBadge: true, showScheduleButton: true, showActivePulse: true };
|
|
20023
20023
|
var UI_PREF_KEYS = Object.keys(uiPrefs);
|
|
20024
20024
|
var uiPrefsListeners = /* @__PURE__ */ new Set();
|
|
@@ -20086,8 +20086,8 @@ var zh = {
|
|
|
20086
20086
|
"filter.statusOn": "\u5DF2\u542F\u7528",
|
|
20087
20087
|
"filter.statusOff": "\u672A\u542F\u7528",
|
|
20088
20088
|
"filter.clear": "\u6E05\u9664\u7B5B\u9009",
|
|
20089
|
-
"filter.summary": "\u663E\u793A {shown} / {total}
|
|
20090
|
-
"settings.enabledCount": "\
|
|
20089
|
+
"filter.summary": "\u663E\u793A {shown} / {total}",
|
|
20090
|
+
"settings.enabledCount": "\u5171 {total} \u4F4D\u4E13\u5BB6",
|
|
20091
20091
|
"settings.empty": "\u6CA1\u6709\u5339\u914D\u7684\u4E13\u5BB6\u3002",
|
|
20092
20092
|
"settings.conflict": "\u540D\u79F0\u51B2\u7A81\uFF0C\u6682\u4E0D\u53EF\u53EC\u5524",
|
|
20093
20093
|
"card.prompt": "\u67E5\u770B\u63D0\u793A\u8BCD",
|
|
@@ -20117,6 +20117,11 @@ var zh = {
|
|
|
20117
20117
|
"tab.teams": "\u56E2\u961F",
|
|
20118
20118
|
"tab.roster": "\u961F\u4F0D",
|
|
20119
20119
|
"tab.tasks": "\u4EFB\u52A1",
|
|
20120
|
+
"tab.skills": "\u6280\u80FD",
|
|
20121
|
+
"pop.skillSearch": "\u641C\u7D22\u6280\u80FD\u540D\u6216\u63CF\u8FF0",
|
|
20122
|
+
"pop.skillEmpty": "\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6280\u80FD\u3002",
|
|
20123
|
+
"pop.skillNoMatch": "\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\u3002",
|
|
20124
|
+
"pop.skillUserOnly": "\u4EC5\u7528\u6237",
|
|
20120
20125
|
"tasks.hint": "\u5F53\u524D\u4F1A\u8BDD\u53CA\u5176\u5B50\u4EE3\u7406\u7684\u540E\u53F0\u4EFB\u52A1\uFF1A\u7531\u5BBF\u4E3B\u7684 session/jobs \u63A8\u9001\u5B9E\u65F6\u5237\u65B0\uFF0C\u53EA\u8BFB\uFF0C\u4E0D\u542B\u8F93\u51FA\u4E0E\u7EC8\u6B62\u3002",
|
|
20121
20126
|
"tasks.empty": "\u5F53\u524D\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u540E\u53F0\u4EFB\u52A1\u3002",
|
|
20122
20127
|
"tasks.count": "{total} \u9879",
|
|
@@ -20366,8 +20371,8 @@ var en = {
|
|
|
20366
20371
|
"filter.statusOn": "Enabled",
|
|
20367
20372
|
"filter.statusOff": "Disabled",
|
|
20368
20373
|
"filter.clear": "Clear filters",
|
|
20369
|
-
"filter.summary": "Showing {shown} / {total}
|
|
20370
|
-
"settings.enabledCount": "
|
|
20374
|
+
"filter.summary": "Showing {shown} / {total}",
|
|
20375
|
+
"settings.enabledCount": "{total} experts",
|
|
20371
20376
|
"settings.empty": "No matching expert.",
|
|
20372
20377
|
"settings.conflict": "Name conflict \u2014 cannot be summoned",
|
|
20373
20378
|
"card.prompt": "View prompt",
|
|
@@ -20397,6 +20402,11 @@ var en = {
|
|
|
20397
20402
|
"tab.teams": "Teams",
|
|
20398
20403
|
"tab.roster": "Roster",
|
|
20399
20404
|
"tab.tasks": "Tasks",
|
|
20405
|
+
"tab.skills": "Skills",
|
|
20406
|
+
"pop.skillSearch": "Search skill name or description",
|
|
20407
|
+
"pop.skillEmpty": "No skills available yet.",
|
|
20408
|
+
"pop.skillNoMatch": "No matching skill.",
|
|
20409
|
+
"pop.skillUserOnly": "user-only",
|
|
20400
20410
|
"tasks.hint": "Background jobs of the current conversation and its subagents, refreshed live from the host session/jobs push \u2014 read-only, no output view, no kill.",
|
|
20401
20411
|
"tasks.empty": "No background jobs in this conversation yet.",
|
|
20402
20412
|
"tasks.count": "{total} total",
|
|
@@ -20648,7 +20658,9 @@ var CSS = `
|
|
|
20648
20658
|
.t-team-squad-actions{display:flex;gap:6px;flex-shrink:0}
|
|
20649
20659
|
.t-team-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
|
|
20650
20660
|
.t-team-label{font-size:12px;color:var(--dsw-alias-label-caption);min-width:52px}
|
|
20651
|
-
|
|
20661
|
+
/* \u5C0F\u961F\u522B\u540D/\u6210\u5458\u82AF\u7247\uFF082026-09-16 \u7528\u6237\uFF1A\u592A\u5927\u4E86\u3001\u8FB9\u8DDD\u592A\u5927\uFF0C\u8981\u975E\u5E38\u7D27\u51D1\uFF09\uFF1A
|
|
20662
|
+
\u9AD8\u5EA6\u5199\u6B7B 18px \u800C\u4E0D\u662F\u9760 padding \u6491\uFF0C\u884C\u9AD8\u624D\u4E0D\u4F1A\u88AB\u5B57\u4F53\u4E0A\u4E0B\u7559\u767D\u9876\u5F00\u3002 */
|
|
20663
|
+
.t-team-member-chip{display:inline-flex;align-items:center;gap:3px;box-sizing:border-box;height:18px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:0 5px;font-size:11px;line-height:1;background:var(--dsw-alias-bg-layer-3)}
|
|
20652
20664
|
.t-team-member-chip[data-unknown="true"]{border-color:var(--dsw-alias-state-error-primary)}
|
|
20653
20665
|
.t-team-emoji{font-size:14px;line-height:1}
|
|
20654
20666
|
.t-team-groups{display:flex;flex-direction:column;gap:10px}
|
|
@@ -20712,7 +20724,7 @@ var CSS = `
|
|
|
20712
20724
|
.t-team-pulse[data-on="true"] path{stroke-dasharray:48 52;animation:t-team-pulse-scan 1.2s linear infinite}
|
|
20713
20725
|
@media (prefers-reduced-motion:reduce){.t-team-pulse[data-on="true"] path{animation:none;stroke-dasharray:none}}
|
|
20714
20726
|
.t-team-team-meta{font-size:12px;color:var(--dsw-alias-label-caption);display:flex;gap:10px;flex-wrap:wrap}
|
|
20715
|
-
.t-team-note{font-size:
|
|
20727
|
+
.t-team-note{font-size:11px;color:var(--dsw-alias-label-caption)}
|
|
20716
20728
|
.t-team-ok{font-size:12px;color:var(--dsw-alias-state-success-primary)}
|
|
20717
20729
|
.t-team-settings{display:flex;flex-direction:column;gap:12px;min-height:0;color:var(--dsw-alias-label-primary)}
|
|
20718
20730
|
.t-team-head{display:flex;flex-direction:column;gap:4px}
|
|
@@ -20780,14 +20792,15 @@ var CSS = `
|
|
|
20780
20792
|
.t-team-error{font-size:12px;color:var(--dsw-alias-state-error-primary)}
|
|
20781
20793
|
.t-team-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;white-space:nowrap;cursor:pointer}
|
|
20782
20794
|
.t-team-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
20783
|
-
.t-team-pop{position:fixed;z-index:60;width:
|
|
20795
|
+
.t-team-pop{position:fixed;z-index:60;width:720px;max-width:calc(100vw - 16px);max-height:min(590px, calc(100vh - 16px));overflow:hidden;box-sizing:border-box;display:flex;flex-direction:column;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3));box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary)}
|
|
20784
20796
|
.t-team-pop .t-team-input{flex:0 0 auto;width:100%;min-width:0}
|
|
20785
20797
|
/* \u5F39\u7A97\u91CC\u7684\u4E09\u4E2A\u6807\u7B7E\uFF1A\u5C0F\u961F/\u56E2\u961F\u5185\u5BB9\u66F4\u5BBD\u66F4\u9AD8\uFF0C\u7528 data-tab \u653E\u5BBD\u5EA6 */
|
|
20786
|
-
.t-team-pop[data-tab="squads"],.t-team-pop[data-tab="teams"]{width:
|
|
20798
|
+
.t-team-pop[data-tab="squads"],.t-team-pop[data-tab="teams"]{width:720px;max-height:min(590px, calc(100vh - 16px))}
|
|
20787
20799
|
.t-team-pop .t-team-tabs{gap:2px;padding-bottom:4px}
|
|
20788
20800
|
.t-team-pop .t-team-tab{font-size:12px;padding:3px 8px}
|
|
20789
20801
|
.t-team-pop .t-team-tabbody{gap:8px;overflow:auto;min-height:0}
|
|
20790
20802
|
.t-team-pop .t-team-squad{padding:8px;gap:6px}
|
|
20803
|
+
.t-team-pop .t-team-squad .t-team-row{gap:4px}
|
|
20791
20804
|
.t-team-pop .t-team-squad-desc{font-size:12px}
|
|
20792
20805
|
.t-team-pop .t-team-team{padding:8px}
|
|
20793
20806
|
.t-team-pop .t-team-job-row{padding:5px 7px}
|
|
@@ -20823,13 +20836,30 @@ var CSS = `
|
|
|
20823
20836
|
.t-team-job-panel-body .t-team-job-row{padding:3px 6px;gap:6px;border-radius:6px;background:color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent)}
|
|
20824
20837
|
.t-team-job-panel-body .t-team-job-meta{gap:2px}
|
|
20825
20838
|
.t-team-job-panel-body .t-team-section-head{margin-top:2px}
|
|
20826
|
-
.t-team-pop[data-tab="tasks"]{width:
|
|
20839
|
+
.t-team-pop[data-tab="tasks"]{width:720px;max-height:min(590px, calc(100vh - 16px))}
|
|
20827
20840
|
.t-team-pop .t-team-picker-list{max-height:150px}
|
|
20828
20841
|
.t-team-pop-list{display:flex;flex-direction:column;gap:6px;overflow:auto;min-height:0}
|
|
20829
|
-
|
|
20830
|
-
|
|
20831
|
-
|
|
20832
|
-
.t-team-pop-
|
|
20842
|
+
/* \u4E13\u5BB6 tab\uFF1A\u4E00\u6392 3 \u4E2A\uFF082026-09-16 \u7528\u6237\u8981\u6C42 \u2014\u2014 \u539F\u6765\u5355\u5217 + 320px \u592A\u7A84\uFF09\u3002
|
|
20843
|
+
\u53EA\u5BF9 experts \u751F\u6548\uFF1Asquads \u7684\u6761\u76EE\u662F\u6574\u5757\u5361\u7247\uFF0C\u6BD4\u4E13\u5BB6\u6761\u76EE\u5BBD\u5F97\u591A\uFF0C\u585E\u8FDB\u4E09\u5217\u4F1A\u6324\u6210\u6761\u3002
|
|
20844
|
+
\u914D\u5957\u4E09\u5904\uFF1A\u5206\u533A\u6807\u9898\u6A2A\u8DE8\u6574\u884C\uFF1Bflex \u5B50\u9879\u9ED8\u8BA4 min-width:auto \u4F1A\u628A\u5217\u6491\u5F00\uFF0C\u6240\u4EE5\u8981\u663E\u5F0F\u6536\u8D77\u3002 */
|
|
20845
|
+
.t-team-pop[data-tab="experts"] .t-team-pop-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px;align-content:start}
|
|
20846
|
+
.t-team-pop[data-tab="experts"] .t-team-division{grid-column:1/-1}
|
|
20847
|
+
.t-team-pop[data-tab="experts"] .t-team-pop-item{min-width:0}
|
|
20848
|
+
/* \u6280\u80FD\u6807\u7B7E\u7528\u540C\u4E00\u5957\u5361\u7247\u7F51\u683C\uFF08\u540C\u6837\u662F\u5934\u50CF + \u540D\u5B57 + \u526F\u6807\u9898 + \u4E09\u884C\u7B80\u4ECB\uFF09\u3002 */
|
|
20849
|
+
.t-team-pop[data-tab="skills"] .t-team-pop-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px;align-content:start}
|
|
20850
|
+
.t-team-pop[data-tab="skills"] .t-team-pop-item{min-width:0}
|
|
20851
|
+
/* \u4E13\u5BB6\u5361\u7247\uFF082026-09-16 \u7528\u6237\u6309\u53C2\u8003\u56FE\u5B9A\u7684\u98CE\u683C\uFF09\uFF1A\u5706\u5F62\u5934\u50CF + \u540D\u5B57/\u5BF9\u7167\u540D + \u591A\u884C\u7B80\u4ECB\uFF0C\u5361\u7247\u63CF\u8FB9\u3002
|
|
20852
|
+
\u53C2\u8003\u56FE\u91CC\u7684\u5E95\u90E8\u6807\u7B7E\u6309\u7528\u6237\u8981\u6C42\u4E0D\u505A\uFF1B\u300C\u53EC\u5524\u300D\u4E5F\u6CA1\u505A\u6210\u6309\u94AE \u2014\u2014 \u6574\u5F20\u5361\u7247\u53EF\u70B9\u5373\u53EC\u5524
|
|
20853
|
+
\uFF08\u4E09\u5217\u4E0B\u6BCF\u5217\u7EA6 190px\uFF0C\u585E\u4E0D\u4E0B\u4E00\u4E2A\u80F6\u56CA\u6309\u94AE\uFF09\u3002 */
|
|
20854
|
+
.t-team-pop-item{display:flex;flex-direction:column;gap:6px;min-width:0;text-align:left;padding:10px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:inherit;font:inherit;cursor:pointer}
|
|
20855
|
+
.t-team-pop-item:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}
|
|
20856
|
+
.t-team-pop-head{display:flex;align-items:center;gap:8px;min-width:0}
|
|
20857
|
+
.t-team-pop-avatar{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);font-size:16px;line-height:1}
|
|
20858
|
+
.t-team-pop-title{display:flex;flex-direction:column;gap:2px;min-width:0}
|
|
20859
|
+
.t-team-pop-name{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
20860
|
+
.t-team-pop-sub{font-size:11px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
20861
|
+
/* \u7B80\u4ECB\u7ED9\u4E09\u884C\uFF1A\u540C\u4E00\u884C\u7684\u5361\u7247\u9AD8\u5EA6\u4E0D\u4F1A\u56E0\u4E3A\u7B80\u4ECB\u957F\u77ED\u53C2\u5DEE\uFF0C\u4E5F\u591F\u770B\u51FA\u8FD9\u4E2A\u4E13\u5BB6\u662F\u5E72\u4EC0\u4E48\u7684\u3002 */
|
|
20862
|
+
.t-team-pop-desc{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;font-size:11px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
|
|
20833
20863
|
.t-team-pop-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 2px}
|
|
20834
20864
|
.t-team-pop-head{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}
|
|
20835
20865
|
/* ---- \u5B9A\u65F6\u4EFB\u52A1\uFF1A\u4FA7\u680F\u5165\u53E3\uFF08\u6CE8\u518C\u4E3A sidebar.panellist \u7684\u4E00\u884C\uFF0C\u4F4D\u4E8E\u300C\u65B0\u4F1A\u8BDD\u300D\u6309\u94AE\u4E0B\u65B9\uFF09 ---- */
|
|
@@ -21552,6 +21582,9 @@ function ExpertPicker({ t, active, experts, disabled, selected, onPick }) {
|
|
|
21552
21582
|
const [index, setIndex] = import_react.default.useState(0);
|
|
21553
21583
|
const wrapRef = import_react.default.useRef(null);
|
|
21554
21584
|
const picked = selected ?? [];
|
|
21585
|
+
import_react.default.useEffect(() => {
|
|
21586
|
+
if (open2) place();
|
|
21587
|
+
}, [open2, popTab]);
|
|
21555
21588
|
import_react.default.useEffect(() => {
|
|
21556
21589
|
if (!open2) return void 0;
|
|
21557
21590
|
const onDown = (event) => {
|
|
@@ -22429,18 +22462,6 @@ function SettingsPanel({ t, ctx, remote, getActive, refreshCatalog, initialTab,
|
|
|
22429
22462
|
const count = experts.filter((expert) => expert.division === item).length;
|
|
22430
22463
|
return /* @__PURE__ */ import_react.default.createElement("option", { key: item, value: item }, `${labelOf(item)} (${count})`);
|
|
22431
22464
|
})
|
|
22432
|
-
), /* @__PURE__ */ import_react.default.createElement(
|
|
22433
|
-
"select",
|
|
22434
|
-
{
|
|
22435
|
-
className: "t-team-select",
|
|
22436
|
-
title: t("filter.status"),
|
|
22437
|
-
"aria-label": t("filter.status"),
|
|
22438
|
-
value: status,
|
|
22439
|
-
onChange: (event) => setStatus(event.target.value)
|
|
22440
|
-
},
|
|
22441
|
-
/* @__PURE__ */ import_react.default.createElement("option", { value: "" }, t("filter.allStatus")),
|
|
22442
|
-
/* @__PURE__ */ import_react.default.createElement("option", { value: "on" }, `${t("filter.statusOn")} (${enabledSet.size})`),
|
|
22443
|
-
/* @__PURE__ */ import_react.default.createElement("option", { value: "off" }, `${t("filter.statusOff")} (${experts.length - enabledSet.size})`)
|
|
22444
22465
|
), filtered && /* @__PURE__ */ import_react.default.createElement(
|
|
22445
22466
|
"button",
|
|
22446
22467
|
{
|
|
@@ -22455,7 +22476,6 @@ function SettingsPanel({ t, ctx, remote, getActive, refreshCatalog, initialTab,
|
|
|
22455
22476
|
t("filter.clear")
|
|
22456
22477
|
), /* @__PURE__ */ import_react.default.createElement("button", { className: "t-team-chip", type: "button", onClick: openEditorNew }, t("custom.new"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-meta" }, t("filter.summary", { shown: visible.length, total: experts.length, enabled: enabledSet.size })), error62 !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-error" }, error62 === "CONFLICT" ? t("settings.conflictRetry") : t("settings.saveFailed", { detail: error62 })), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-groups" }, grouped.map((group) => /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-group", key: group.division }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-division" }, divisionLabel(group.items[0], active), " \xB7 ", group.items.length), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-grid" }, group.items.map((expert) => {
|
|
22457
22478
|
const on = enabledSet.has(expert.slug);
|
|
22458
|
-
const locked = busy || expert.conflict === true;
|
|
22459
22479
|
return /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card", "data-enabled": on, key: expert.slug }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card-body" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-avatar" }, expert.emoji || "\u{1F9E9}"), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-identity" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card-name" }, displayName(expert, active), expert.custom === true && /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-badge-custom" }, t("custom.badge"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card-division" }, divisionLabel(expert, active)), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card-slug" }, expert.slug)), /* @__PURE__ */ import_react.default.createElement("p", { className: "t-team-card-desc" }, displayDescription(expert, active)), expert.conflict === true && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-conflict", style: { gridColumn: "1/-1" } }, t("settings.conflict"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-card-tools" }, /* @__PURE__ */ import_react.default.createElement(
|
|
22460
22480
|
"button",
|
|
22461
22481
|
{
|
|
@@ -22495,21 +22515,7 @@ function SettingsPanel({ t, ctx, remote, getActive, refreshCatalog, initialTab,
|
|
|
22495
22515
|
onClick: () => setPendingDelete(expert.slug)
|
|
22496
22516
|
},
|
|
22497
22517
|
"\u{1F5D1}"
|
|
22498
|
-
))
|
|
22499
|
-
"button",
|
|
22500
|
-
{
|
|
22501
|
-
className: "t-team-card-switch",
|
|
22502
|
-
type: "button",
|
|
22503
|
-
role: "switch",
|
|
22504
|
-
"aria-checked": on,
|
|
22505
|
-
"aria-label": on ? t("settings.disable") : t("settings.enable"),
|
|
22506
|
-
title: on ? t("settings.disable") : t("settings.enable"),
|
|
22507
|
-
"data-enabled": on,
|
|
22508
|
-
disabled: locked,
|
|
22509
|
-
onClick: () => void toggle(expert)
|
|
22510
|
-
},
|
|
22511
|
-
/* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-card-switch-knob" })
|
|
22512
|
-
)));
|
|
22518
|
+
))));
|
|
22513
22519
|
})))), visible.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-meta" }, t("settings.empty"))))), promptView !== null && /* @__PURE__ */ import_react.default.createElement(
|
|
22514
22520
|
"div",
|
|
22515
22521
|
{
|
|
@@ -23443,16 +23449,85 @@ function insertSquadCommand(target, key) {
|
|
|
23443
23449
|
const span = existing === null ? { start: offset, end: offset, draftRev: snapshot.draftRev } : { start: offset, end: offset + existing[0].length, draftRev: snapshot.draftRev };
|
|
23444
23450
|
return target.insertText(text, span) === true;
|
|
23445
23451
|
}
|
|
23452
|
+
var skillsCache = /* @__PURE__ */ new Map();
|
|
23453
|
+
var SKILLS_CACHE_MAX = 20;
|
|
23454
|
+
function cacheSkills(sessionId, list) {
|
|
23455
|
+
if (skillsCache.has(sessionId)) skillsCache.delete(sessionId);
|
|
23456
|
+
skillsCache.set(sessionId, list);
|
|
23457
|
+
while (skillsCache.size > SKILLS_CACHE_MAX) {
|
|
23458
|
+
const oldest = skillsCache.keys().next().value;
|
|
23459
|
+
skillsCache.delete(oldest);
|
|
23460
|
+
}
|
|
23461
|
+
}
|
|
23462
|
+
function insertSkillHint(target, text) {
|
|
23463
|
+
if (target === void 0 || typeof target.insertText !== "function") return false;
|
|
23464
|
+
const snapshot = target.state.getSnapshot();
|
|
23465
|
+
const draft = String(snapshot.draft ?? "");
|
|
23466
|
+
const prefix = draft === "" || /\s$/u.test(draft) ? "" : " ";
|
|
23467
|
+
const at = draft.length;
|
|
23468
|
+
return target.insertText(`${prefix}${text} `, { start: at, end: at, draftRev: snapshot.draftRev }) === true;
|
|
23469
|
+
}
|
|
23446
23470
|
function insertAtTarget(target, reference) {
|
|
23447
23471
|
if (target === void 0 || typeof target.insertReference !== "function") return false;
|
|
23448
23472
|
const snapshot = target.state.getSnapshot();
|
|
23449
23473
|
const offset = referencePrefixEnd(snapshot);
|
|
23450
23474
|
return target.insertReference(reference, { start: offset, end: offset, draftRev: snapshot.draftRev }) === true;
|
|
23451
23475
|
}
|
|
23452
|
-
function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCommand, sessionId, preview }) {
|
|
23476
|
+
function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCommand, insertSkillHint: insertSkillHint2, sessionId, preview, rootRemote }) {
|
|
23453
23477
|
const [open2, setOpen] = import_react.default.useState(preview?.open === true);
|
|
23454
|
-
const [
|
|
23478
|
+
const [popTab2, setPopTab] = import_react.default.useState(preview?.tab ?? "experts");
|
|
23455
23479
|
const [squads, setSquads] = import_react.default.useState(preview?.squads ?? null);
|
|
23480
|
+
const [skills, setSkills] = import_react.default.useState(null);
|
|
23481
|
+
const [skillQuery, setSkillQuery] = import_react.default.useState("");
|
|
23482
|
+
const [skillsDiag, setSkillsDiag] = import_react.default.useState("");
|
|
23483
|
+
import_react.default.useEffect(() => {
|
|
23484
|
+
if (!open2) return void 0;
|
|
23485
|
+
const cached2 = skillsCache.get(sessionId);
|
|
23486
|
+
if (cached2 !== void 0) setSkills(cached2);
|
|
23487
|
+
let alive = true;
|
|
23488
|
+
void (async () => {
|
|
23489
|
+
try {
|
|
23490
|
+
const remoteObj = rootRemote;
|
|
23491
|
+
const skillNs = remoteObj?.skills;
|
|
23492
|
+
if (skillNs === void 0 || skillNs === null) {
|
|
23493
|
+
if (alive && cached2 === void 0) {
|
|
23494
|
+
setSkills([]);
|
|
23495
|
+
setSkillsDiag(`rootRemote.skills \u4E0D\u5B58\u5728\uFF08sessionId=${JSON.stringify(sessionId)}\uFF0CrootRemote=${typeof remoteObj}\uFF0Cskills=${typeof skillNs}\uFF09`);
|
|
23496
|
+
}
|
|
23497
|
+
return;
|
|
23498
|
+
}
|
|
23499
|
+
if (typeof skillNs.list !== "function") {
|
|
23500
|
+
if (alive && cached2 === void 0) {
|
|
23501
|
+
setSkills([]);
|
|
23502
|
+
setSkillsDiag(`skills.list \u4E0D\u662F\u51FD\u6570\uFF08${typeof skillNs.list}\uFF09`);
|
|
23503
|
+
}
|
|
23504
|
+
return;
|
|
23505
|
+
}
|
|
23506
|
+
const result = await skillNs.list({ sessionId });
|
|
23507
|
+
if (result?.ok !== true) {
|
|
23508
|
+
if (alive && cached2 === void 0) {
|
|
23509
|
+
setSkills([]);
|
|
23510
|
+
setSkillsDiag(`skills.list \u8FD4\u56DE !ok\uFF1A${JSON.stringify(result?.error ?? result)}`);
|
|
23511
|
+
}
|
|
23512
|
+
return;
|
|
23513
|
+
}
|
|
23514
|
+
const list = result.value?.skills ?? [];
|
|
23515
|
+
cacheSkills(sessionId, list);
|
|
23516
|
+
if (alive) {
|
|
23517
|
+
setSkills(list);
|
|
23518
|
+
setSkillsDiag(list.length > 0 ? "" : `ok \u4F46 0 \u9879\uFF08value=${JSON.stringify(result.value)}\uFF09`);
|
|
23519
|
+
}
|
|
23520
|
+
} catch (error62) {
|
|
23521
|
+
if (alive && cached2 === void 0) {
|
|
23522
|
+
setSkills([]);
|
|
23523
|
+
setSkillsDiag(`\u5F02\u5E38\uFF1A${error62 instanceof Error ? error62.message || error62.name : String(error62)}`);
|
|
23524
|
+
}
|
|
23525
|
+
}
|
|
23526
|
+
})();
|
|
23527
|
+
return () => {
|
|
23528
|
+
alive = false;
|
|
23529
|
+
};
|
|
23530
|
+
}, [open2, sessionId, rootRemote]);
|
|
23456
23531
|
const [teams, setTeams] = import_react.default.useState(preview?.teams ?? null);
|
|
23457
23532
|
const [squadQuery, setSquadQuery] = import_react.default.useState("");
|
|
23458
23533
|
const [popNote, setPopNote] = import_react.default.useState("");
|
|
@@ -23461,11 +23536,14 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23461
23536
|
const [failed, setFailed] = import_react.default.useState("");
|
|
23462
23537
|
const [position, setPosition] = import_react.default.useState(void 0);
|
|
23463
23538
|
const rootRef = import_react.default.useRef(null);
|
|
23539
|
+
const popRef = import_react.default.useRef(null);
|
|
23464
23540
|
const snap = snapshotOf(remote);
|
|
23465
|
-
function
|
|
23541
|
+
function place2() {
|
|
23466
23542
|
const rect = rootRef.current?.getBoundingClientRect();
|
|
23467
23543
|
if (rect === void 0) return;
|
|
23468
|
-
|
|
23544
|
+
const width = popRef.current?.offsetWidth ?? 0;
|
|
23545
|
+
const maxLeft = width === 0 ? Number.POSITIVE_INFINITY : Math.max(8, window.innerWidth - width - 8);
|
|
23546
|
+
setPosition({ left: Math.min(Math.max(8, rect.left), maxLeft), bottom: Math.max(8, window.innerHeight - rect.top + 6) });
|
|
23469
23547
|
}
|
|
23470
23548
|
import_react.default.useEffect(() => {
|
|
23471
23549
|
if (!open2) return void 0;
|
|
@@ -23477,13 +23555,13 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23477
23555
|
};
|
|
23478
23556
|
document.addEventListener("mousedown", onDown);
|
|
23479
23557
|
document.addEventListener("keydown", onKey);
|
|
23480
|
-
window.addEventListener("resize",
|
|
23481
|
-
window.addEventListener("scroll",
|
|
23558
|
+
window.addEventListener("resize", place2);
|
|
23559
|
+
window.addEventListener("scroll", place2, true);
|
|
23482
23560
|
return () => {
|
|
23483
23561
|
document.removeEventListener("mousedown", onDown);
|
|
23484
23562
|
document.removeEventListener("keydown", onKey);
|
|
23485
|
-
window.removeEventListener("resize",
|
|
23486
|
-
window.removeEventListener("scroll",
|
|
23563
|
+
window.removeEventListener("resize", place2);
|
|
23564
|
+
window.removeEventListener("scroll", place2, true);
|
|
23487
23565
|
};
|
|
23488
23566
|
}, [open2]);
|
|
23489
23567
|
async function toggle() {
|
|
@@ -23502,15 +23580,15 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23502
23580
|
const value = result?.ok === true ? result.value : void 0;
|
|
23503
23581
|
setTeams(value?.teams ?? []);
|
|
23504
23582
|
}).catch(() => setTeams([]));
|
|
23505
|
-
|
|
23583
|
+
place2();
|
|
23506
23584
|
await refresh(remote, true).catch(() => void 0);
|
|
23507
23585
|
}
|
|
23508
23586
|
const active = getActive();
|
|
23509
23587
|
const teamCount = teams?.length ?? 0;
|
|
23510
|
-
const popTabs = [["experts", "tab.experts"], ["squads", "tab.squads"], ...teamCount > 0 ? [["teams", "tab.teams"]] : [], ["tasks", "tab.tasks"]];
|
|
23588
|
+
const popTabs = [["experts", "tab.experts"], ["squads", "tab.squads"], ...teamCount > 0 ? [["teams", "tab.teams"]] : [], ["tasks", "tab.tasks"], ["skills", "tab.skills"]];
|
|
23511
23589
|
import_react.default.useEffect(() => {
|
|
23512
|
-
if (
|
|
23513
|
-
}, [
|
|
23590
|
+
if (popTab2 === "teams" && teamCount === 0) setPopTab("experts");
|
|
23591
|
+
}, [popTab2, teamCount]);
|
|
23514
23592
|
const squadNeedle = squadQuery.trim().toLowerCase();
|
|
23515
23593
|
const visibleSquads = (squads?.squads ?? []).filter((squad) => {
|
|
23516
23594
|
if (squad.enabled === false) return false;
|
|
@@ -23556,22 +23634,37 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23556
23634
|
setFailed(t("button.insertFailed"));
|
|
23557
23635
|
}
|
|
23558
23636
|
}
|
|
23559
|
-
|
|
23637
|
+
const skillNeedle = skillQuery.trim().toLowerCase();
|
|
23638
|
+
const visibleSkills = (skills ?? []).filter((skill) => {
|
|
23639
|
+
if (skillNeedle === "") return true;
|
|
23640
|
+
return `${skill.name} ${skill.description ?? ""} ${skill.whenToUse ?? ""}`.toLowerCase().includes(skillNeedle);
|
|
23641
|
+
});
|
|
23642
|
+
function pickSkill(skill) {
|
|
23643
|
+
const ok = insertSkillHint2?.(`/${skill.name}`) === true;
|
|
23644
|
+
if (ok) {
|
|
23645
|
+
setOpen(false);
|
|
23646
|
+
setSkillQuery("");
|
|
23647
|
+
setFailed("");
|
|
23648
|
+
} else {
|
|
23649
|
+
setFailed(t("button.insertFailed"));
|
|
23650
|
+
}
|
|
23651
|
+
}
|
|
23652
|
+
return /* @__PURE__ */ import_react.default.createElement("span", { ref: rootRef, className: "t-team-btn-wrap" }, /* @__PURE__ */ import_react.default.createElement("button", { className: "t-team-btn", type: "button", title: t("button.title"), onClick: () => void toggle() }, "\u{1F9E9} ", t("button.label")), open2 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop", "data-tab": popTab2, ref: popRef, style: position === void 0 ? void 0 : { left: position.left, bottom: position.bottom } }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react.default.createElement("span", null, t("pop.title")), /* @__PURE__ */ import_react.default.createElement("button", { className: "t-team-chip", type: "button", onClick: () => setOpen(false) }, t("button.close"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-tabs", role: "tablist" }, popTabs.map(([key, label]) => /* @__PURE__ */ import_react.default.createElement(
|
|
23560
23653
|
"button",
|
|
23561
23654
|
{
|
|
23562
23655
|
className: "t-team-tab",
|
|
23563
23656
|
type: "button",
|
|
23564
23657
|
role: "tab",
|
|
23565
23658
|
key,
|
|
23566
|
-
"data-active":
|
|
23567
|
-
"aria-selected":
|
|
23659
|
+
"data-active": popTab2 === key,
|
|
23660
|
+
"aria-selected": popTab2 === key,
|
|
23568
23661
|
onClick: () => {
|
|
23569
23662
|
setPopTab(key);
|
|
23570
23663
|
setFailed("");
|
|
23571
23664
|
}
|
|
23572
23665
|
},
|
|
23573
23666
|
t(label)
|
|
23574
|
-
))), popNote !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-ok" }, popNote), failed !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-error" }, failed),
|
|
23667
|
+
))), popNote !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-ok" }, popNote), failed !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-error" }, failed), popTab2 === "squads" && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-note" }, t("pop.squadsHint")), /* @__PURE__ */ import_react.default.createElement(
|
|
23575
23668
|
"input",
|
|
23576
23669
|
{
|
|
23577
23670
|
className: "t-team-input",
|
|
@@ -23589,7 +23682,7 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23589
23682
|
onClick: () => void fillSquad(squad)
|
|
23590
23683
|
},
|
|
23591
23684
|
starting === squad.key ? t("pop.picking") : t("pop.fill")
|
|
23592
|
-
)), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-row" }, squad.aliases.slice(0, 6).map((alias) => /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-member-chip", key: alias }, alias)), squad.aliases.length > 6 && /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-note" }, "+", squad.aliases.length - 6)), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-row" }, squad.members.map((member) => /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-member-chip", "data-unknown": member.known === false, key: member.slug }, member.nameZh))))), squads !== null && visibleSquads.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-empty" }, squads.squads.length === 0 ? t("pop.emptySquads") : t("pop.squadNoMatch")))),
|
|
23685
|
+
)), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-row" }, squad.aliases.slice(0, 6).map((alias) => /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-member-chip", key: alias }, alias)), squad.aliases.length > 6 && /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-note" }, "+", squad.aliases.length - 6)), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-row" }, squad.members.map((member) => /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-member-chip", "data-unknown": member.known === false, key: member.slug }, member.nameZh))))), squads !== null && visibleSquads.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-empty" }, squads.squads.length === 0 ? t("pop.emptySquads") : t("pop.squadNoMatch")))), popTab2 === "teams" && /* @__PURE__ */ import_react.default.createElement(TeamsTab, { t, remote, compact: true, initialTeams: preview?.teams }), popTab2 === "tasks" && /* @__PURE__ */ import_react.default.createElement(JobsTab, { t, ctx, compact: true }), popTab2 === "experts" && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
|
|
23593
23686
|
"input",
|
|
23594
23687
|
{
|
|
23595
23688
|
className: "t-team-input",
|
|
@@ -23598,11 +23691,26 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, fillSquadCom
|
|
|
23598
23691
|
value: query,
|
|
23599
23692
|
onChange: (event) => setQuery(event.target.value)
|
|
23600
23693
|
}
|
|
23601
|
-
), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-list" }, grouped.map((group) => /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, { key: group.division }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-division" }, divisionLabel(group.items[0], active)), group.items.map((expert) =>
|
|
23694
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-list" }, grouped.map((group) => /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, { key: group.division }, /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-division" }, divisionLabel(group.items[0], active)), group.items.map((expert) => {
|
|
23695
|
+
const alt = active === "en" ? expert.name : expert.nameEn;
|
|
23696
|
+
return /* @__PURE__ */ import_react.default.createElement("button", { className: "t-team-pop-item", type: "button", key: expert.slug, onClick: () => pick2(expert) }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-avatar" }, expert.emoji || "\u{1F9E9}"), /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-title" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-name" }, displayName(expert, active)), alt !== void 0 && alt !== "" && /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-sub" }, alt))), /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-desc" }, displayDescription(expert, active)));
|
|
23697
|
+
}))), experts.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-empty" }, t("button.empty")), experts.length > 0 && visible.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-empty" }, t("button.noMatch")))), popTab2 === "skills" && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
|
|
23698
|
+
"input",
|
|
23699
|
+
{
|
|
23700
|
+
className: "t-team-input",
|
|
23701
|
+
autoFocus: true,
|
|
23702
|
+
placeholder: t("pop.skillSearch"),
|
|
23703
|
+
value: skillQuery,
|
|
23704
|
+
onChange: (event) => setSkillQuery(event.target.value)
|
|
23705
|
+
}
|
|
23706
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-list" }, visibleSkills.map((skill) => /* @__PURE__ */ import_react.default.createElement("button", { className: "t-team-pop-item", type: "button", key: skill.name, onClick: () => pickSkill(skill) }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-avatar" }, "\u{1F9F0}"), /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-title" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-name" }, skill.name), skill.modelInvocable === false && /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-sub" }, t("pop.skillUserOnly")))), /* @__PURE__ */ import_react.default.createElement("span", { className: "t-team-pop-desc" }, skill.description ?? ""))), visibleSkills.length === 0 && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-pop-empty" }, skills === null ? t("pop.skillEmpty") : t("pop.skillNoMatch")), skillsDiag !== "" && /* @__PURE__ */ import_react.default.createElement("div", { className: "t-team-error", style: { fontSize: "11px", whiteSpace: "pre-wrap" } }, "\u8BCA\u65AD\uFF1A", skillsDiag)))));
|
|
23602
23707
|
}
|
|
23603
23708
|
var inject = [
|
|
23604
23709
|
"slots",
|
|
23605
23710
|
"inputTriggers",
|
|
23711
|
+
// 技能标签要读**官方**的 skills/list remote —— 命名空间必须在静态 inject 里声明,
|
|
23712
|
+
// 否则 ctx.remote.skills 是 undefined,可选链会把它静默吃成"没有技能"。
|
|
23713
|
+
"remote.skills",
|
|
23606
23714
|
"locale",
|
|
23607
23715
|
"remote",
|
|
23608
23716
|
"sessions",
|
|
@@ -23768,10 +23876,11 @@ async function apply(ctx) {
|
|
|
23768
23876
|
return {
|
|
23769
23877
|
sessionId,
|
|
23770
23878
|
insertReference: (reference) => insertAtTarget(target(), reference),
|
|
23771
|
-
fillSquadCommand: (key) => insertSquadCommand(target(), key)
|
|
23879
|
+
fillSquadCommand: (key) => insertSquadCommand(target(), key),
|
|
23880
|
+
insertSkillHint: (text) => insertSkillHint(target(), text)
|
|
23772
23881
|
};
|
|
23773
23882
|
}
|
|
23774
|
-
}, (props) => import_react.default.createElement(SummonButton, { ...props, t: ctx.locale.bind(NS), remote, getActive })));
|
|
23883
|
+
}, (props) => import_react.default.createElement(SummonButton, { ...props, t: ctx.locale.bind(NS), remote, getActive, rootRemote: ctx.remote })));
|
|
23775
23884
|
const registerSources = (active, divisions) => {
|
|
23776
23885
|
const disposers = [];
|
|
23777
23886
|
try {
|
package/lib/index.js
CHANGED
|
@@ -158,14 +158,21 @@ export const SETTINGS_NAMESPACE = NS;
|
|
|
158
158
|
export const UNKNOWN_SLUG_ERROR_CODE = "tTeam/unknown-slug";
|
|
159
159
|
|
|
160
160
|
|
|
161
|
+
/** 「默认全部启用」的当前策略版本;把它 +1 即对所有用户重新播种一次(见 seedDefaultEnabled)。 */
|
|
162
|
+
const ENABLED_SEED_VERSION = 1;
|
|
163
|
+
|
|
161
164
|
const settingsSchema = schema.object({
|
|
162
165
|
enabled: schema.array(schema.string()).default([]),
|
|
166
|
+
/** 兼容位:早期实现用的「已播种」布尔标记。幂等判据已改用 enabledSeedVersion,保留它只为不弄坏已写入的旧数据。 */
|
|
167
|
+
enabledSeeded: schema.boolean().default(false),
|
|
163
168
|
/**
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
169
|
+
* 「默认全部启用」已按哪一版策略播种过。见 seedDefaultEnabled。
|
|
170
|
+
*
|
|
171
|
+
* 为什么用版本号而不是布尔:策略本身会演进,而布尔是一次性的。早期实现是「只在 enabled 为空时播种」
|
|
172
|
+
* 且播完就把布尔置 true —— 于是「早就手动启用过一部分」的老用户永远拿不到默认值(用户实测报过),
|
|
173
|
+
* 而且置了 true 之后连改逻辑都救不回来。换成版本号后,+1 就能对所有人重新播种一次。
|
|
167
174
|
*/
|
|
168
|
-
|
|
175
|
+
enabledSeedVersion: schema.number().default(0),
|
|
169
176
|
/** 是否自动显示右上角的任务徽章(界面偏好,关掉后只在输入区浮层里手动查看)。 */
|
|
170
177
|
showTaskBadge: schema.boolean().default(true),
|
|
171
178
|
/**
|
|
@@ -410,7 +417,7 @@ export function apply(ctx, config) {
|
|
|
410
417
|
return;
|
|
411
418
|
}
|
|
412
419
|
scope = settingsService.register(SETTINGS_NAMESPACE, settingsSchema, {
|
|
413
|
-
base: { enabled: [], enabledSeeded: false, showTaskBadge: true, showScheduleButton: true, showActivePulse: true },
|
|
420
|
+
base: { enabled: [], enabledSeeded: false, enabledSeedVersion: 0, showTaskBadge: true, showScheduleButton: true, showActivePulse: true },
|
|
414
421
|
applies: "live",
|
|
415
422
|
validate: (value) => {
|
|
416
423
|
const list = value?.enabled;
|
|
@@ -571,27 +578,28 @@ export function apply(ctx, config) {
|
|
|
571
578
|
}
|
|
572
579
|
}
|
|
573
580
|
/**
|
|
574
|
-
*
|
|
581
|
+
* 按当前策略把「默认全部启用」落到 enabled 名单上(同一策略版本对同一用户只做一次)。
|
|
575
582
|
*
|
|
576
|
-
* enabled 是白名单,缺省 [] 本意是"一个都没启用"
|
|
577
|
-
*
|
|
578
|
-
*
|
|
579
|
-
*
|
|
583
|
+
* enabled 是白名单,缺省 [] 本意是"一个都没启用",这让新装用户得逐个开关 323 个专家。
|
|
584
|
+
* 现在只要还没按当前策略播种过,就把**全部可用专家**写进 enabled —— 不再看 enabled 是否为空:
|
|
585
|
+
* "非空"并不等于用户刻意挑过(早期版本留下的部分记录同样非空),拿它当挡箭牌会让老用户永远
|
|
586
|
+
* 停在部分启用(用户实测报过)。用户之后自己的启用/禁用不会被覆盖 —— 那时版本号已经追上来了。
|
|
580
587
|
*/
|
|
581
588
|
async function seedDefaultEnabled() {
|
|
582
589
|
if (settingsService === undefined) return;
|
|
583
590
|
const state = scope?.get?.();
|
|
584
|
-
if (state === undefined || state.
|
|
585
|
-
const
|
|
586
|
-
//
|
|
587
|
-
|
|
588
|
-
if (nextEnabled.length === 0) return; // 名册残缺(既无名单也无专家),别乱写
|
|
591
|
+
if (state === undefined || (state.enabledSeedVersion ?? 0) >= ENABLED_SEED_VERSION) return;
|
|
592
|
+
const nextEnabled = usable().map((expert) => expert.slug);
|
|
593
|
+
// 名册残缺(例如分区目录暂时读不到)时绝不写:否则等于用一份空名单把用户的启用项抹掉。
|
|
594
|
+
if (nextEnabled.length === 0) return;
|
|
589
595
|
try {
|
|
590
596
|
await settingsService.mutate(SETTINGS_NAMESPACE, [
|
|
591
597
|
{ op: "set", path: ["enabled"], value: nextEnabled },
|
|
598
|
+
// 老键一并置 true:保持它在语义上的"已播种",也免得多版本并存时两边打架。
|
|
592
599
|
{ op: "set", path: ["enabledSeeded"], value: true },
|
|
600
|
+
{ op: "set", path: ["enabledSeedVersion"], value: ENABLED_SEED_VERSION },
|
|
593
601
|
], revision());
|
|
594
|
-
|
|
602
|
+
ctx.logger?.info?.(`[t-team] 已按默认策略 v${ENABLED_SEED_VERSION} 启用全部 ${nextEnabled.length} 位专家`);
|
|
595
603
|
} catch (error) {
|
|
596
604
|
// 写不进(并发 / 服务暂不可用)不致命:下次 ensureReady 还会再试。
|
|
597
605
|
ctx.logger?.warn?.(`[t-team] 默认启用全部专家写入失败:${String(error)}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-t-expert",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.66",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "T Expert — a 323-expert, 22-division roster with full Chinese translations, as a standalone DeepSeek Harness plugin, with a built-in multi-agent team engine (T Team).",
|
|
6
6
|
"license": "MIT",
|
|
@@ -60,6 +60,7 @@
|
|
|
60
60
|
"@deepseek-ai/dsh-client-connection",
|
|
61
61
|
"@deepseek-ai/dsh-client-locale",
|
|
62
62
|
"@deepseek-ai/dsh-api-remotes",
|
|
63
|
+
"@deepseek-ai/dsh-api-session-controller",
|
|
63
64
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
64
65
|
"@deepseek-ai/dsh-client-ui-input-trigger",
|
|
65
66
|
"@deepseek-ai/dsh-client-ui-primitives"
|
|
@@ -80,6 +81,7 @@
|
|
|
80
81
|
"@deepseek-ai/dsh": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
81
82
|
"@deepseek-ai/dsh-agent": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
82
83
|
"@deepseek-ai/dsh-api-remotes": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
84
|
+
"@deepseek-ai/dsh-api-session-controller": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
83
85
|
"@deepseek-ai/dsh-client-connection": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
84
86
|
"@deepseek-ai/dsh-client-locale": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
85
87
|
"@deepseek-ai/dsh-client-ui-input-trigger": "0.1.5-rc.1 || 0.1.5-rc.2",
|
|
@@ -106,6 +108,9 @@
|
|
|
106
108
|
"@deepseek-ai/dsh-api-remotes": {
|
|
107
109
|
"optional": true
|
|
108
110
|
},
|
|
111
|
+
"@deepseek-ai/dsh-api-session-controller": {
|
|
112
|
+
"optional": true
|
|
113
|
+
},
|
|
109
114
|
"@deepseek-ai/dsh-client-connection": {
|
|
110
115
|
"optional": true
|
|
111
116
|
},
|