dsh-plugin-subagent-director 0.3.0-beta.2 → 0.3.0-beta.4
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/bridge-contract.d.ts +9 -0
- package/lib/bridge-contract.d.ts.map +1 -1
- package/lib/client/RoleCard.d.ts.map +1 -1
- package/lib/client/RoleCard.js +2 -8
- package/lib/client/RoleCard.js.map +1 -1
- package/lib/client/SubagentOptionsSection.d.ts +5 -1
- package/lib/client/SubagentOptionsSection.d.ts.map +1 -1
- package/lib/client/SubagentOptionsSection.js +20 -10
- package/lib/client/SubagentOptionsSection.js.map +1 -1
- package/lib/client/ToolSetPicker.d.ts +23 -0
- package/lib/client/ToolSetPicker.d.ts.map +1 -0
- package/lib/client/ToolSetPicker.js +80 -0
- package/lib/client/ToolSetPicker.js.map +1 -0
- package/lib/client/index.js +245 -109
- package/lib/client/locales.d.ts +1 -1
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +14 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/store.d.ts +3 -1
- package/lib/client/store.d.ts.map +1 -1
- package/lib/client/store.js +10 -2
- package/lib/client/store.js.map +1 -1
- package/lib/client/toolset-logic.d.ts +19 -0
- package/lib/client/toolset-logic.d.ts.map +1 -0
- package/lib/client/toolset-logic.js +34 -0
- package/lib/client/toolset-logic.js.map +1 -0
- package/lib/remote.d.ts +10 -4
- package/lib/remote.d.ts.map +1 -1
- package/lib/remote.js +24 -7
- package/lib/remote.js.map +1 -1
- package/package.json +1 -1
package/lib/client/index.js
CHANGED
|
@@ -81,6 +81,13 @@ window.__ModuleLoader__.load({
|
|
|
81
81
|
"toolFilterHint": "Restrict the subagent to these tools. Leave empty to inherit the parent's full tool set.",
|
|
82
82
|
"toolFilterNone": "Inherit parent tools (no restriction)",
|
|
83
83
|
"toolFilterEmpty": "No tools available",
|
|
84
|
+
"toolFilterSearch": "Search tools…",
|
|
85
|
+
"toolFilterSelectAll": "Select all",
|
|
86
|
+
"toolFilterDeselectAll": "Deselect all",
|
|
87
|
+
"toolFilterCount": "Selected {count} / {total}",
|
|
88
|
+
"toolFilterExpand": "Expand",
|
|
89
|
+
"toolFilterCollapse": "Collapse",
|
|
90
|
+
"toolFilterNoMatch": "No tools match the search.",
|
|
84
91
|
"restoreDone": "Defaults restored",
|
|
85
92
|
"invalidRoleId": "Role id must be kebab-case (lowercase letters, digits, single hyphens).",
|
|
86
93
|
"bridgeUnavailable": "The Subagent Director settings bridge is not available on this server. Please update/restart the web application so it installs the /subagent-director channel.",
|
|
@@ -144,6 +151,13 @@ window.__ModuleLoader__.load({
|
|
|
144
151
|
"toolFilterHint": "将子代理限制为这些工具。留空则继承父代理的完整工具集。",
|
|
145
152
|
"toolFilterNone": "继承父代理工具(不限制)",
|
|
146
153
|
"toolFilterEmpty": "无可用工具",
|
|
154
|
+
"toolFilterSearch": "搜索工具…",
|
|
155
|
+
"toolFilterSelectAll": "全选",
|
|
156
|
+
"toolFilterDeselectAll": "全不选",
|
|
157
|
+
"toolFilterCount": "已选 {count} / 共 {total}",
|
|
158
|
+
"toolFilterExpand": "展开",
|
|
159
|
+
"toolFilterCollapse": "收起",
|
|
160
|
+
"toolFilterNoMatch": "没有匹配搜索的工具。",
|
|
147
161
|
"restoreDone": "已恢复默认",
|
|
148
162
|
"invalidRoleId": "角色 id 必须为 kebab-case(小写字母、数字、单个连字符)。",
|
|
149
163
|
"bridgeUnavailable": "此服务器尚未提供 Subagent Director 设置桥接通道(/subagent-director)。请重启 Web 应用以安装该通道后再试。",
|
|
@@ -378,6 +392,8 @@ window.__ModuleLoader__.load({
|
|
|
378
392
|
store;
|
|
379
393
|
wire;
|
|
380
394
|
generation = 0;
|
|
395
|
+
/** Last session id used for the tool catalog (reused by refreshes). */
|
|
396
|
+
lastSessionId;
|
|
381
397
|
constructor(wire) {
|
|
382
398
|
this.wire = wire;
|
|
383
399
|
this.store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(initialSubagentOptionsState());
|
|
@@ -405,8 +421,10 @@ window.__ModuleLoader__.load({
|
|
|
405
421
|
};
|
|
406
422
|
}
|
|
407
423
|
/** Refresh the whole page snapshot: provider directory + model catalog + own namespace. */
|
|
408
|
-
async load() {
|
|
424
|
+
async load(sessionId) {
|
|
409
425
|
const generation = ++this.generation;
|
|
426
|
+
if (sessionId !== void 0) this.lastSessionId = sessionId;
|
|
427
|
+
const effectiveSessionId = this.lastSessionId;
|
|
410
428
|
this.store.update((s) => {
|
|
411
429
|
s.status = "loading";
|
|
412
430
|
s.error = null;
|
|
@@ -417,7 +435,7 @@ window.__ModuleLoader__.load({
|
|
|
417
435
|
this.wire.llm.providers({}),
|
|
418
436
|
this.wire.llm.models({}),
|
|
419
437
|
this.callBridge(SUBAGENT_DIRECTOR_RPC_VIEW),
|
|
420
|
-
this.callBridge(SUBAGENT_DIRECTOR_RPC_TOOLS).catch(() => ({
|
|
438
|
+
this.callBridge(SUBAGENT_DIRECTOR_RPC_TOOLS, { sessionId: effectiveSessionId }).catch(() => ({
|
|
421
439
|
ok: false,
|
|
422
440
|
error: {
|
|
423
441
|
code: "internal",
|
|
@@ -568,6 +586,39 @@ window.__ModuleLoader__.load({
|
|
|
568
586
|
}
|
|
569
587
|
};
|
|
570
588
|
//#endregion
|
|
589
|
+
//#region src/client/toolset-logic.ts
|
|
590
|
+
/**
|
|
591
|
+
* Pure tool-set picker logic for the role editor (search / select-all /
|
|
592
|
+
* deselect-all). Framework-free so the filtering and set algebra are
|
|
593
|
+
* unit-testable without React.
|
|
594
|
+
*
|
|
595
|
+
* The select-all / deselect-all semantics follow the "filtered scope" rule:
|
|
596
|
+
* they operate ONLY on the currently filtered tool names, never on tools the
|
|
597
|
+
* search has hidden, so a user searching for "web" cannot accidentally select
|
|
598
|
+
* every unrelated tool.
|
|
599
|
+
*/
|
|
600
|
+
/** Case-insensitive substring filter over tool names; empty query keeps all. */
|
|
601
|
+
function filterToolNames(tools, query) {
|
|
602
|
+
const q = query.trim().toLowerCase();
|
|
603
|
+
if (q === "") return [...tools];
|
|
604
|
+
return tools.filter((tool) => tool.toLowerCase().includes(q));
|
|
605
|
+
}
|
|
606
|
+
/** Toggle one tool name in the allow list (order-preserving). */
|
|
607
|
+
function toggleToolName(current, name) {
|
|
608
|
+
return current.includes(name) ? current.filter((n) => n !== name) : [...current, name];
|
|
609
|
+
}
|
|
610
|
+
/** Add every candidate to the allow list (deduplicated, order-preserving). */
|
|
611
|
+
function addToolNames(current, candidates) {
|
|
612
|
+
const set = new Set(current);
|
|
613
|
+
for (const candidate of candidates) set.add(candidate);
|
|
614
|
+
return [...set];
|
|
615
|
+
}
|
|
616
|
+
/** Remove every candidate from the allow list. */
|
|
617
|
+
function removeToolNames(current, candidates) {
|
|
618
|
+
const drop = new Set(candidates);
|
|
619
|
+
return current.filter((name) => !drop.has(name));
|
|
620
|
+
}
|
|
621
|
+
//#endregion
|
|
571
622
|
//#region src/client/ui.ts
|
|
572
623
|
const token = {
|
|
573
624
|
labelPrimary: "var(--dsw-alias-label-primary)",
|
|
@@ -671,6 +722,161 @@ window.__ModuleLoader__.load({
|
|
|
671
722
|
color: token.labelPrimary
|
|
672
723
|
};
|
|
673
724
|
//#endregion
|
|
725
|
+
//#region src/client/ToolSetPicker.tsx
|
|
726
|
+
/**
|
|
727
|
+
* Tool-set picker shared by the role editor and the add-role form.
|
|
728
|
+
*
|
|
729
|
+
* A compact row that expands into: a search box, select-all / deselect-all
|
|
730
|
+
* (scoped to the CURRENT filter — tools hidden by the search are never
|
|
731
|
+
* touched), a live "selected / total" count, and a checkbox grid of the
|
|
732
|
+
* filtered tools. Collapsed, it shows the label, the count, and a
|
|
733
|
+
* chevron toggle so a large catalog (hundreds of MCP tools) stays compact.
|
|
734
|
+
*/
|
|
735
|
+
const style$2 = {
|
|
736
|
+
root: {
|
|
737
|
+
display: "flex",
|
|
738
|
+
flexDirection: "column",
|
|
739
|
+
gap: 6
|
|
740
|
+
},
|
|
741
|
+
head: {
|
|
742
|
+
display: "flex",
|
|
743
|
+
alignItems: "center",
|
|
744
|
+
gap: 8
|
|
745
|
+
},
|
|
746
|
+
count: {
|
|
747
|
+
color: token.labelTertiary,
|
|
748
|
+
fontSize: 11,
|
|
749
|
+
lineHeight: "16px"
|
|
750
|
+
},
|
|
751
|
+
search: {
|
|
752
|
+
...textInputStyle,
|
|
753
|
+
height: 26,
|
|
754
|
+
fontSize: 12
|
|
755
|
+
},
|
|
756
|
+
grid: {
|
|
757
|
+
display: "flex",
|
|
758
|
+
flexDirection: "column",
|
|
759
|
+
gap: 2,
|
|
760
|
+
maxHeight: 260,
|
|
761
|
+
overflowY: "auto",
|
|
762
|
+
border: "1px solid " + token.border,
|
|
763
|
+
borderRadius: 6,
|
|
764
|
+
padding: "6px 8px",
|
|
765
|
+
background: token.bgLayer1
|
|
766
|
+
},
|
|
767
|
+
item: {
|
|
768
|
+
display: "inline-flex",
|
|
769
|
+
alignItems: "center",
|
|
770
|
+
gap: 4,
|
|
771
|
+
fontSize: 12,
|
|
772
|
+
color: token.labelSecondary,
|
|
773
|
+
cursor: "pointer",
|
|
774
|
+
padding: "2px 4px",
|
|
775
|
+
borderRadius: 4
|
|
776
|
+
},
|
|
777
|
+
hint: {
|
|
778
|
+
color: token.labelTertiary,
|
|
779
|
+
fontSize: 11,
|
|
780
|
+
lineHeight: "15px"
|
|
781
|
+
},
|
|
782
|
+
toggle: {
|
|
783
|
+
...ghostButtonStyle,
|
|
784
|
+
height: 24,
|
|
785
|
+
fontSize: 12,
|
|
786
|
+
padding: "0 8px"
|
|
787
|
+
}
|
|
788
|
+
};
|
|
789
|
+
/** Render the searchable, select-all capable tool-set picker. */
|
|
790
|
+
function ToolSetPicker({ tools, selected, onChange, t }) {
|
|
791
|
+
const [query, setQuery] = (0, react.useState)("");
|
|
792
|
+
const [open, setOpen] = (0, react.useState)(true);
|
|
793
|
+
const filtered = (0, react.useMemo)(() => filterToolNames(tools, query), [tools, query]);
|
|
794
|
+
(0, react.useMemo)(() => new Set(filtered), [filtered]);
|
|
795
|
+
const allFilteredSelected = filtered.length > 0 && filtered.every((name) => selected.includes(name));
|
|
796
|
+
if (tools.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
797
|
+
style: style$2.root,
|
|
798
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
799
|
+
style: fieldLabelStyle,
|
|
800
|
+
children: t("toolFilter")
|
|
801
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
802
|
+
style: style$2.hint,
|
|
803
|
+
children: t("toolFilterEmpty")
|
|
804
|
+
})]
|
|
805
|
+
});
|
|
806
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
807
|
+
style: style$2.root,
|
|
808
|
+
children: [
|
|
809
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
810
|
+
style: style$2.head,
|
|
811
|
+
children: [
|
|
812
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
813
|
+
style: fieldLabelStyle,
|
|
814
|
+
children: t("toolFilter")
|
|
815
|
+
}),
|
|
816
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
817
|
+
style: style$2.count,
|
|
818
|
+
children: t("toolFilterCount", {
|
|
819
|
+
count: selected.length,
|
|
820
|
+
total: tools.length
|
|
821
|
+
})
|
|
822
|
+
}),
|
|
823
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
824
|
+
type: "button",
|
|
825
|
+
style: style$2.toggle,
|
|
826
|
+
onClick: () => setOpen((o) => !o),
|
|
827
|
+
children: open ? t("toolFilterCollapse") : t("toolFilterExpand")
|
|
828
|
+
})
|
|
829
|
+
]
|
|
830
|
+
}),
|
|
831
|
+
open ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
832
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
833
|
+
style: style$2.search,
|
|
834
|
+
value: query,
|
|
835
|
+
placeholder: t("toolFilterSearch"),
|
|
836
|
+
onChange: (e) => setQuery(e.target.value)
|
|
837
|
+
}),
|
|
838
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
839
|
+
style: {
|
|
840
|
+
display: "flex",
|
|
841
|
+
gap: 8
|
|
842
|
+
},
|
|
843
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
844
|
+
type: "button",
|
|
845
|
+
style: ghostButtonStyle,
|
|
846
|
+
disabled: filtered.length === 0 || allFilteredSelected,
|
|
847
|
+
onClick: () => onChange(addToolNames(selected, filtered)),
|
|
848
|
+
children: t("toolFilterSelectAll")
|
|
849
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
850
|
+
type: "button",
|
|
851
|
+
style: ghostButtonStyle,
|
|
852
|
+
disabled: filtered.length === 0 || !filtered.some((name) => selected.includes(name)),
|
|
853
|
+
onClick: () => onChange(removeToolNames(selected, filtered)),
|
|
854
|
+
children: t("toolFilterDeselectAll")
|
|
855
|
+
})]
|
|
856
|
+
}),
|
|
857
|
+
filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
858
|
+
style: style$2.hint,
|
|
859
|
+
children: t("toolFilterNoMatch")
|
|
860
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
861
|
+
style: style$2.grid,
|
|
862
|
+
children: filtered.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
863
|
+
style: style$2.item,
|
|
864
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
865
|
+
type: "checkbox",
|
|
866
|
+
checked: selected.includes(name),
|
|
867
|
+
onChange: () => onChange(toggleToolName(selected, name))
|
|
868
|
+
}), name]
|
|
869
|
+
}, name))
|
|
870
|
+
})
|
|
871
|
+
] }) : null,
|
|
872
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
873
|
+
style: style$2.hint,
|
|
874
|
+
children: selected.length === 0 ? t("toolFilterNone") : t("toolFilterHint")
|
|
875
|
+
})
|
|
876
|
+
]
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
//#endregion
|
|
674
880
|
//#region src/client/RoleCard.tsx
|
|
675
881
|
/** One role template card: read-only summary plus an inline editor.
|
|
676
882
|
* Provider/model/effort selects cascade from the model catalog; writes go
|
|
@@ -727,16 +933,6 @@ window.__ModuleLoader__.load({
|
|
|
727
933
|
[field]: value
|
|
728
934
|
}));
|
|
729
935
|
};
|
|
730
|
-
const toggleTool = (name) => {
|
|
731
|
-
setDraft((d) => {
|
|
732
|
-
const allow = d.toolFilter?.allow ?? [];
|
|
733
|
-
const next = allow.includes(name) ? allow.filter((n) => n !== name) : [...allow, name];
|
|
734
|
-
return {
|
|
735
|
-
...d,
|
|
736
|
-
toolFilter: { allow: next }
|
|
737
|
-
};
|
|
738
|
-
});
|
|
739
|
-
};
|
|
740
936
|
const allowList = draft.toolFilter?.allow ?? [];
|
|
741
937
|
if (editing) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
742
938
|
style: cardStyle,
|
|
@@ -863,50 +1059,17 @@ window.__ModuleLoader__.load({
|
|
|
863
1059
|
})
|
|
864
1060
|
]
|
|
865
1061
|
}),
|
|
866
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
1062
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
867
1063
|
style: rowStyle,
|
|
868
|
-
children:
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
},
|
|
878
|
-
children: t("toolFilterEmpty")
|
|
879
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
880
|
-
style: {
|
|
881
|
-
display: "flex",
|
|
882
|
-
flexWrap: "wrap",
|
|
883
|
-
gap: "4px 14px"
|
|
884
|
-
},
|
|
885
|
-
children: tools.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
886
|
-
style: {
|
|
887
|
-
display: "inline-flex",
|
|
888
|
-
alignItems: "center",
|
|
889
|
-
gap: 4,
|
|
890
|
-
fontSize: 12,
|
|
891
|
-
color: token.labelSecondary,
|
|
892
|
-
cursor: "pointer"
|
|
893
|
-
},
|
|
894
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
895
|
-
type: "checkbox",
|
|
896
|
-
checked: allowList.includes(name),
|
|
897
|
-
onChange: () => toggleTool(name)
|
|
898
|
-
}), name]
|
|
899
|
-
}, name))
|
|
900
|
-
}),
|
|
901
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
902
|
-
style: {
|
|
903
|
-
color: token.labelTertiary,
|
|
904
|
-
fontSize: 11,
|
|
905
|
-
lineHeight: "15px"
|
|
906
|
-
},
|
|
907
|
-
children: allowList.length === 0 ? t("toolFilterNone") : t("toolFilterHint")
|
|
908
|
-
})
|
|
909
|
-
]
|
|
1064
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolSetPicker, {
|
|
1065
|
+
tools,
|
|
1066
|
+
selected: allowList,
|
|
1067
|
+
t,
|
|
1068
|
+
onChange: (allow) => setDraft((d) => ({
|
|
1069
|
+
...d,
|
|
1070
|
+
toolFilter: { allow }
|
|
1071
|
+
}))
|
|
1072
|
+
})
|
|
910
1073
|
}),
|
|
911
1074
|
failure !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
912
1075
|
style: {
|
|
@@ -1088,20 +1251,33 @@ window.__ModuleLoader__.load({
|
|
|
1088
1251
|
* @returns the section, or null while the shell has not injected yet.
|
|
1089
1252
|
*/
|
|
1090
1253
|
function SubagentOptionsSection(props) {
|
|
1091
|
-
const { controller, useSnapshot, t } = props;
|
|
1254
|
+
const { controller, useSnapshot, t, useSessions } = props;
|
|
1092
1255
|
if (controller === void 0 || useSnapshot === void 0 || t === void 0) return null;
|
|
1093
1256
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Loaded, { injected: {
|
|
1094
1257
|
controller,
|
|
1095
1258
|
useSnapshot,
|
|
1096
|
-
t
|
|
1259
|
+
t,
|
|
1260
|
+
useSessions
|
|
1097
1261
|
} });
|
|
1098
1262
|
}
|
|
1099
1263
|
function Loaded({ injected }) {
|
|
1100
1264
|
const { controller, t } = injected;
|
|
1101
1265
|
const state = injected.useSnapshot((s) => s);
|
|
1266
|
+
const sessionId = injected.useSessions !== void 0 ? injected.useSessions((s) => s.current) : void 0;
|
|
1267
|
+
const lastSessionRef = (0, react.useRef)(void 0);
|
|
1268
|
+
(0, react.useEffect)(() => {
|
|
1269
|
+
if (state.status === "idle" && !state.loading) controller.load(sessionId);
|
|
1270
|
+
}, [
|
|
1271
|
+
state.status,
|
|
1272
|
+
state.loading,
|
|
1273
|
+
sessionId
|
|
1274
|
+
]);
|
|
1102
1275
|
(0, react.useEffect)(() => {
|
|
1103
|
-
if (state.status === "
|
|
1104
|
-
|
|
1276
|
+
if (state.status === "ready" && sessionId !== lastSessionRef.current) {
|
|
1277
|
+
lastSessionRef.current = sessionId;
|
|
1278
|
+
controller.load(sessionId);
|
|
1279
|
+
}
|
|
1280
|
+
}, [sessionId, state.status]);
|
|
1105
1281
|
if (state.status === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1106
1282
|
style: sectionWidth,
|
|
1107
1283
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
@@ -1482,57 +1658,17 @@ window.__ModuleLoader__.load({
|
|
|
1482
1658
|
}))
|
|
1483
1659
|
})]
|
|
1484
1660
|
}),
|
|
1485
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
1661
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1486
1662
|
style: rowStyle,
|
|
1487
|
-
children:
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
},
|
|
1497
|
-
children: t("toolFilterEmpty")
|
|
1498
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1499
|
-
style: {
|
|
1500
|
-
display: "flex",
|
|
1501
|
-
flexWrap: "wrap",
|
|
1502
|
-
gap: "4px 14px"
|
|
1503
|
-
},
|
|
1504
|
-
children: tools.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
1505
|
-
style: {
|
|
1506
|
-
display: "inline-flex",
|
|
1507
|
-
alignItems: "center",
|
|
1508
|
-
gap: 4,
|
|
1509
|
-
fontSize: 12,
|
|
1510
|
-
color: token.labelSecondary,
|
|
1511
|
-
cursor: "pointer"
|
|
1512
|
-
},
|
|
1513
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
1514
|
-
type: "checkbox",
|
|
1515
|
-
checked: (draft.toolFilter?.allow ?? []).includes(name),
|
|
1516
|
-
onChange: () => setDraft((d) => {
|
|
1517
|
-
const allow = d.toolFilter?.allow ?? [];
|
|
1518
|
-
const next = allow.includes(name) ? allow.filter((n) => n !== name) : [...allow, name];
|
|
1519
|
-
return {
|
|
1520
|
-
...d,
|
|
1521
|
-
toolFilter: { allow: next }
|
|
1522
|
-
};
|
|
1523
|
-
})
|
|
1524
|
-
}), name]
|
|
1525
|
-
}, name))
|
|
1526
|
-
}),
|
|
1527
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1528
|
-
style: {
|
|
1529
|
-
color: token.labelTertiary,
|
|
1530
|
-
fontSize: 11,
|
|
1531
|
-
lineHeight: "15px"
|
|
1532
|
-
},
|
|
1533
|
-
children: (draft.toolFilter?.allow?.length ?? 0) === 0 ? t("toolFilterNone") : t("toolFilterHint")
|
|
1534
|
-
})
|
|
1535
|
-
]
|
|
1663
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolSetPicker, {
|
|
1664
|
+
tools,
|
|
1665
|
+
selected: draft.toolFilter?.allow ?? [],
|
|
1666
|
+
t,
|
|
1667
|
+
onChange: (allow) => setDraft((d) => ({
|
|
1668
|
+
...d,
|
|
1669
|
+
toolFilter: { allow }
|
|
1670
|
+
}))
|
|
1671
|
+
})
|
|
1536
1672
|
}),
|
|
1537
1673
|
failure !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1538
1674
|
style: {
|
package/lib/client/locales.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* ever reaches the runtime's bilingual balance check.
|
|
6
6
|
*/
|
|
7
7
|
/** Keys for the settings.subagentDirector namespace (bilingual, enforced). */
|
|
8
|
-
export type SubagentDirectorKey = 'nav' | 'sectionIntro' | 'defaultsHeading' | 'defaultsHint' | 'defaultProvider' | 'defaultModel' | 'defaultReasoningEffort' | 'restoreDefaults' | 'provider' | 'model' | 'reasoningEffort' | 'persona' | 'rolesHeading' | 'rolesHint' | 'addRole' | 'emptyRoles' | 'roleId' | 'roleDisplayName' | 'roleDescription' | 'rolePersona' | 'setDefaultRole' | 'defaultRoleBadge' | 'deleteRole' | 'confirmDeleteRole' | 'removeRoleDone' | 'addedRole' | 'roleUpdated' | 'conflict' | 'rejected' | 'fatal' | 'loadError' | 'readonly' | 'save' | 'cancel' | 'edit' | 'retry' | 'fallbackOnInvalid' | 'roleIdPlaceholder' | 'displayNamePlaceholder' | 'descriptionPlaceholder' | 'personaPlaceholder' | 'modelOptional' | 'providerMissing' | 'toolFilter' | 'toolFilterHint' | 'toolFilterNone' | 'toolFilterEmpty' | 'restoreDone' | 'invalidRoleId' | 'bridgeUnavailable' | 'modelRanOn' | 'modelNotRecorded' | 'modelQueryFailed' | 'modelRanOnTitle' | 'closeContinuable' | 'closeContinuableTitle' | 'closingContinuable' | 'closedSubagent' | 'confirmCloseContinuable' | 'closeFailed';
|
|
8
|
+
export type SubagentDirectorKey = 'nav' | 'sectionIntro' | 'defaultsHeading' | 'defaultsHint' | 'defaultProvider' | 'defaultModel' | 'defaultReasoningEffort' | 'restoreDefaults' | 'provider' | 'model' | 'reasoningEffort' | 'persona' | 'rolesHeading' | 'rolesHint' | 'addRole' | 'emptyRoles' | 'roleId' | 'roleDisplayName' | 'roleDescription' | 'rolePersona' | 'setDefaultRole' | 'defaultRoleBadge' | 'deleteRole' | 'confirmDeleteRole' | 'removeRoleDone' | 'addedRole' | 'roleUpdated' | 'conflict' | 'rejected' | 'fatal' | 'loadError' | 'readonly' | 'save' | 'cancel' | 'edit' | 'retry' | 'fallbackOnInvalid' | 'roleIdPlaceholder' | 'displayNamePlaceholder' | 'descriptionPlaceholder' | 'personaPlaceholder' | 'modelOptional' | 'providerMissing' | 'toolFilter' | 'toolFilterHint' | 'toolFilterNone' | 'toolFilterEmpty' | 'toolFilterSearch' | 'toolFilterSelectAll' | 'toolFilterDeselectAll' | 'toolFilterCount' | 'toolFilterExpand' | 'toolFilterCollapse' | 'toolFilterNoMatch' | 'restoreDone' | 'invalidRoleId' | 'bridgeUnavailable' | 'modelRanOn' | 'modelNotRecorded' | 'modelQueryFailed' | 'modelRanOnTitle' | 'closeContinuable' | 'closeContinuableTitle' | 'closingContinuable' | 'closedSubagent' | 'confirmCloseContinuable' | 'closeFailed';
|
|
9
9
|
/** English dictionary ($subagentDirector). */
|
|
10
10
|
export declare const en: Record<SubagentDirectorKey, string>;
|
|
11
11
|
/** Chinese dictionary. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAC3B,KAAK,GACL,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,wBAAwB,GACxB,iBAAiB,GACjB,UAAU,GACV,OAAO,GACP,iBAAiB,GACjB,SAAS,GACT,cAAc,GACd,WAAW,GACX,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,iBAAiB,GACjB,aAAa,GACb,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,mBAAmB,GACnB,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,UAAU,GACV,UAAU,GACV,OAAO,GACP,WAAW,GACX,UAAU,GACV,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,uBAAuB,GACvB,oBAAoB,GACpB,gBAAgB,GAChB,yBAAyB,GACzB,aAAa,CAAC;AAElB,8CAA8C;AAC9C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAC3B,KAAK,GACL,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,wBAAwB,GACxB,iBAAiB,GACjB,UAAU,GACV,OAAO,GACP,iBAAiB,GACjB,SAAS,GACT,cAAc,GACd,WAAW,GACX,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,iBAAiB,GACjB,aAAa,GACb,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,mBAAmB,GACnB,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,UAAU,GACV,UAAU,GACV,OAAO,GACP,WAAW,GACX,UAAU,GACV,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,GACrB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,uBAAuB,GACvB,oBAAoB,GACpB,gBAAgB,GAChB,yBAAyB,GACzB,aAAa,CAAC;AAElB,8CAA8C;AAC9C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAoElD,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAoElD,CAAC"}
|
package/lib/client/locales.js
CHANGED
|
@@ -53,6 +53,13 @@ export const en = {
|
|
|
53
53
|
"toolFilterHint": "Restrict the subagent to these tools. Leave empty to inherit the parent's full tool set.",
|
|
54
54
|
"toolFilterNone": "Inherit parent tools (no restriction)",
|
|
55
55
|
"toolFilterEmpty": "No tools available",
|
|
56
|
+
"toolFilterSearch": "Search tools…",
|
|
57
|
+
"toolFilterSelectAll": "Select all",
|
|
58
|
+
"toolFilterDeselectAll": "Deselect all",
|
|
59
|
+
"toolFilterCount": "Selected {count} / {total}",
|
|
60
|
+
"toolFilterExpand": "Expand",
|
|
61
|
+
"toolFilterCollapse": "Collapse",
|
|
62
|
+
"toolFilterNoMatch": "No tools match the search.",
|
|
56
63
|
"restoreDone": "Defaults restored",
|
|
57
64
|
"invalidRoleId": "Role id must be kebab-case (lowercase letters, digits, single hyphens).",
|
|
58
65
|
"bridgeUnavailable": "The Subagent Director settings bridge is not available on this server. Please update/restart the web application so it installs the /subagent-director channel.",
|
|
@@ -116,6 +123,13 @@ export const zh = {
|
|
|
116
123
|
"toolFilterHint": "将子代理限制为这些工具。留空则继承父代理的完整工具集。",
|
|
117
124
|
"toolFilterNone": "继承父代理工具(不限制)",
|
|
118
125
|
"toolFilterEmpty": "无可用工具",
|
|
126
|
+
"toolFilterSearch": "搜索工具…",
|
|
127
|
+
"toolFilterSelectAll": "全选",
|
|
128
|
+
"toolFilterDeselectAll": "全不选",
|
|
129
|
+
"toolFilterCount": "已选 {count} / 共 {total}",
|
|
130
|
+
"toolFilterExpand": "展开",
|
|
131
|
+
"toolFilterCollapse": "收起",
|
|
132
|
+
"toolFilterNoMatch": "没有匹配搜索的工具。",
|
|
119
133
|
"restoreDone": "已恢复默认",
|
|
120
134
|
"invalidRoleId": "角色 id 必须为 kebab-case(小写字母、数字、单个连字符)。",
|
|
121
135
|
"bridgeUnavailable": "此服务器尚未提供 Subagent Director 设置桥接通道(/subagent-director)。请重启 Web 应用以安装该通道后再试。",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"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"}
|
package/lib/client/store.d.ts
CHANGED
|
@@ -68,6 +68,8 @@ export declare class SubagentOptionsStore {
|
|
|
68
68
|
readonly store: SnapshotStore<SubagentOptionsState>;
|
|
69
69
|
private readonly wire;
|
|
70
70
|
private generation;
|
|
71
|
+
/** Last session id used for the tool catalog (reused by refreshes). */
|
|
72
|
+
private lastSessionId;
|
|
71
73
|
constructor(wire: StoreWire);
|
|
72
74
|
/**
|
|
73
75
|
* Call one bridge endpoint over the generic RPC channel. Returns the RpcResult
|
|
@@ -77,7 +79,7 @@ export declare class SubagentOptionsStore {
|
|
|
77
79
|
*/
|
|
78
80
|
private callBridge;
|
|
79
81
|
/** Refresh the whole page snapshot: provider directory + model catalog + own namespace. */
|
|
80
|
-
load(): Promise<void>;
|
|
82
|
+
load(sessionId?: string): Promise<void>;
|
|
81
83
|
/** Human text for a bridge RPC error branch. */
|
|
82
84
|
private errorMessage;
|
|
83
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/client/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,2CAA2C,CAAC;AASnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,wEAAwE;IACxE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,oEAAoE;IACpE,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC;IACnC,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC/C,oEAAoE;IACpE,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACtC,mEAAmE;IACnE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8BAA8B;AAC9B,wBAAgB,2BAA2B,IAAI,oBAAoB,CAalE;AAED,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGhD;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,cAEC;CACF;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED,yFAAyF;AACzF,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,GAAG,EAAE,mBAAmB,CAAC;IACzB,4DAA4D;IAC5D,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACvB,0EAA0E;IAC1E,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,CAAC;CACzC;AAED,+DAA+D;AAC/D,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,UAAU,CAAK;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/client/store.ts"],"names":[],"mappings":"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"}
|
package/lib/client/store.js
CHANGED
|
@@ -44,6 +44,8 @@ export class SubagentOptionsStore {
|
|
|
44
44
|
store;
|
|
45
45
|
wire;
|
|
46
46
|
generation = 0;
|
|
47
|
+
/** Last session id used for the tool catalog (reused by refreshes). */
|
|
48
|
+
lastSessionId;
|
|
47
49
|
constructor(wire) {
|
|
48
50
|
this.wire = wire;
|
|
49
51
|
this.store = createSnapshotStore(initialSubagentOptionsState());
|
|
@@ -68,8 +70,11 @@ export class SubagentOptionsStore {
|
|
|
68
70
|
return { ok: true, value: result.value };
|
|
69
71
|
}
|
|
70
72
|
/** Refresh the whole page snapshot: provider directory + model catalog + own namespace. */
|
|
71
|
-
async load() {
|
|
73
|
+
async load(sessionId) {
|
|
72
74
|
const generation = ++this.generation;
|
|
75
|
+
if (sessionId !== undefined)
|
|
76
|
+
this.lastSessionId = sessionId;
|
|
77
|
+
const effectiveSessionId = this.lastSessionId;
|
|
73
78
|
this.store.update((s) => {
|
|
74
79
|
s.status = 'loading';
|
|
75
80
|
s.error = null;
|
|
@@ -82,7 +87,10 @@ export class SubagentOptionsStore {
|
|
|
82
87
|
this.callBridge(SUBAGENT_DIRECTOR_RPC_VIEW),
|
|
83
88
|
// The tool catalog is best-effort: a bridge without the endpoint (or a
|
|
84
89
|
// registry-less host) degrades to an empty list, never blocks the page.
|
|
85
|
-
|
|
90
|
+
// Passing the current session id lets the Host enumerate the agent's
|
|
91
|
+
// FULL tool view (preset tools like bash/read/write live in the agent
|
|
92
|
+
// scope, not the global registry).
|
|
93
|
+
this.callBridge(SUBAGENT_DIRECTOR_RPC_TOOLS, { sessionId: effectiveSessionId }).catch(() => ({
|
|
86
94
|
ok: false,
|
|
87
95
|
error: { code: 'internal', message: 'tool catalog unavailable' },
|
|
88
96
|
})),
|
package/lib/client/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/client/store.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,GAG5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,wCAAwC,CAAC;AACjG,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GAMd,MAAM,kBAAkB,CAAC;AAE1B,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAyBxD,8BAA8B;AAC9B,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C;QACE,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAClG,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,KAAK,YAAY,sBAAsB,CAAC;AACjD,CAAC;AAYD,+DAA+D;AAC/D,MAAM,OAAO,oBAAoB;IACtB,KAAK,CAAsC;IACnC,IAAI,CAAY;IACzB,UAAU,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/client/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure tool-set picker logic for the role editor (search / select-all /
|
|
3
|
+
* deselect-all). Framework-free so the filtering and set algebra are
|
|
4
|
+
* unit-testable without React.
|
|
5
|
+
*
|
|
6
|
+
* The select-all / deselect-all semantics follow the "filtered scope" rule:
|
|
7
|
+
* they operate ONLY on the currently filtered tool names, never on tools the
|
|
8
|
+
* search has hidden, so a user searching for "web" cannot accidentally select
|
|
9
|
+
* every unrelated tool.
|
|
10
|
+
*/
|
|
11
|
+
/** Case-insensitive substring filter over tool names; empty query keeps all. */
|
|
12
|
+
export declare function filterToolNames(tools: readonly string[], query: string): string[];
|
|
13
|
+
/** Toggle one tool name in the allow list (order-preserving). */
|
|
14
|
+
export declare function toggleToolName(current: readonly string[], name: string): string[];
|
|
15
|
+
/** Add every candidate to the allow list (deduplicated, order-preserving). */
|
|
16
|
+
export declare function addToolNames(current: readonly string[], candidates: readonly string[]): string[];
|
|
17
|
+
/** Remove every candidate from the allow list. */
|
|
18
|
+
export declare function removeToolNames(current: readonly string[], candidates: readonly string[]): string[];
|
|
19
|
+
//# sourceMappingURL=toolset-logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolset-logic.d.ts","sourceRoot":"","sources":["../../src/client/toolset-logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIjF;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjF;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAIhG;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAGnG"}
|