@xiaoso/dsh-tool-plus 0.1.0-beta.6 → 0.1.0-beta.7
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
CHANGED
|
@@ -726,57 +726,84 @@ window.__ModuleLoader__.load({
|
|
|
726
726
|
TOOL_PLUS_FIELDS.map((field) => field.name);
|
|
727
727
|
//#endregion
|
|
728
728
|
//#region src/client/rows.tsx
|
|
729
|
-
/**
|
|
729
|
+
/**
|
|
730
|
+
* Shared settings-row controls for the tool-plus settings surfaces: number
|
|
731
|
+
* input, select pill, and toggle switch rows, styled against the app's
|
|
732
|
+
* `--dsw-alias-*` design tokens. Extracted from the Bash card so the Plugins
|
|
733
|
+
* card and the Tool Plus settings section render identical controls.
|
|
734
|
+
* @module @xiaoso/dsh-tool-plus/client
|
|
735
|
+
*/
|
|
736
|
+
/**
|
|
737
|
+
* Shared row control CSS, keyed by `data-plugin-css` and injected once.
|
|
738
|
+
*
|
|
739
|
+
* Motion discipline: every moving control animates transform/opacity only
|
|
740
|
+
* (GPU-composited); color transitions fire on hover/focus state changes
|
|
741
|
+
* only. Everything is disabled under prefers-reduced-motion. All colors are
|
|
742
|
+
* `--dsw-alias-*` host tokens (or color-mix of them), so light/dark themes
|
|
743
|
+
* adapt automatically.
|
|
744
|
+
*/
|
|
730
745
|
const SETTINGS_ROWS_CSS = `
|
|
731
|
-
.tp-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-
|
|
746
|
+
.tp-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-l1);transition:background .16s ease}
|
|
732
747
|
.tp-row:last-child{border-bottom:none}
|
|
748
|
+
.tp-rowClickable{cursor:pointer}
|
|
733
749
|
.tp-rowText{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;padding-right:24px}
|
|
734
750
|
.tp-rowTitle{font-size:14px;font-weight:400;line-height:22px;color:var(--dsw-alias-label-primary)}
|
|
735
751
|
.tp-rowDesc{font-size:12px;font-weight:400;line-height:18px;color:var(--dsw-alias-label-tertiary)}
|
|
736
752
|
.tp-badges{display:inline-flex;align-items:center;gap:8px}
|
|
737
|
-
.tp-badge{
|
|
738
|
-
.tp-
|
|
753
|
+
.tp-badge{display:inline-flex;align-items:center;gap:6px;padding:1px 0;font-size:11px;line-height:17px;white-space:nowrap;font-weight:500;color:var(--dsw-alias-label-tertiary)}
|
|
754
|
+
.tp-badge::before{content:'';flex:none;width:5px;height:5px;border-radius:999px;background:var(--dsw-alias-state-business-primary)}
|
|
755
|
+
.tp-reset{position:relative;border:none;background:none;padding:2px 0;font:inherit;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-secondary);cursor:pointer;transition:color .16s ease}
|
|
756
|
+
.tp-reset::after{content:'';position:absolute;left:0;right:0;bottom:0;height:1px;border-radius:1px;background:currentColor;opacity:0;transform:scaleX(.6);transform-origin:left center;transition:opacity .16s ease,transform .2s cubic-bezier(.22,1,.36,1)}
|
|
739
757
|
.tp-reset:hover:not(:disabled){color:var(--dsw-alias-label-primary)}
|
|
758
|
+
.tp-reset:hover:not(:disabled)::after{opacity:.6;transform:scaleX(1)}
|
|
740
759
|
.tp-reset:disabled{cursor:default}
|
|
741
|
-
.tp-
|
|
742
|
-
.tp-
|
|
743
|
-
.tp-
|
|
744
|
-
.tp-
|
|
745
|
-
.tp-input{height:34px;padding:0 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-3);font:inherit;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-primary);width:100%;box-sizing:border-box}
|
|
746
|
-
.tp-input:focus-visible{outline:none;border-color:var(--dsw-alias-brand-primary)}
|
|
760
|
+
.tp-reset:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}
|
|
761
|
+
.tp-input{flex:none;width:128px;height:34px;padding:0 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1);font:inherit;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-primary);box-sizing:border-box;transition:border-color .16s ease}
|
|
762
|
+
.tp-input:hover:not(:disabled):not(:focus-visible){border-color:var(--dsw-alias-border-l3)}
|
|
763
|
+
.tp-input:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px;border-color:var(--dsw-alias-border-l3)}
|
|
747
764
|
.tp-input:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}
|
|
748
765
|
.tp-input.tp-invalid{border-color:var(--dsw-alias-label-error)}
|
|
749
|
-
.tp-
|
|
750
|
-
.tp-
|
|
751
|
-
.tp-selectTrigger{display:inline-flex;align-items:center;gap:12px;height:36px;padding:0 14px;border:none;border-radius:18px;background:var(--dsw-alias-bg-module-platform);font:inherit;font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary);cursor:pointer;flex-shrink:0}
|
|
766
|
+
.tp-input.tp-invalid:focus-visible{outline-color:var(--dsw-alias-state-error-primary)}
|
|
767
|
+
.tp-invalidText{color:var(--dsw-alias-label-error);animation:tp-soft-in .18s ease both}
|
|
752
768
|
.tp-selectAnchor{display:inline-flex;flex-shrink:0}
|
|
753
|
-
.tp-selectTrigger:
|
|
754
|
-
.tp-selectTrigger:disabled{
|
|
755
|
-
.tp-selectTrigger:
|
|
756
|
-
.tp-
|
|
769
|
+
.tp-selectTrigger{display:inline-flex;align-items:center;gap:8px;height:34px;padding:0 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;background:var(--dsw-alias-bg-module-platform);font:inherit;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary);cursor:pointer;flex-shrink:0;transition:background .16s ease,border-color .16s ease,transform .1s ease}
|
|
770
|
+
.tp-selectTrigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}
|
|
771
|
+
.tp-selectTrigger:active:not(:disabled){transform:scale(.97)}
|
|
772
|
+
.tp-selectTrigger:disabled{opacity:.55;cursor:default}
|
|
773
|
+
.tp-selectTrigger:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}
|
|
774
|
+
.tp-selectChevron{flex:none;color:var(--dsw-alias-label-tertiary);display:inline-flex;transition:transform .2s cubic-bezier(.22,1,.36,1)}
|
|
757
775
|
.tp-selectTrigger[aria-expanded="true"] .tp-selectChevron{transform:rotate(180deg)}
|
|
758
|
-
.tp-switch{position:relative;width:
|
|
759
|
-
.tp-switch input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}
|
|
760
|
-
.tp-switchTrack{position:absolute;inset:0;border-radius:999px;background:var(--dsw-alias-border-l2);transition:background .
|
|
776
|
+
.tp-switch{position:relative;width:40px;height:24px;flex:none}
|
|
777
|
+
.tp-switch input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer;z-index:1}
|
|
778
|
+
.tp-switchTrack{position:absolute;inset:0;border-radius:999px;background:var(--dsw-alias-border-l2);transition:background .18s ease;pointer-events:none}
|
|
779
|
+
.tp-row:hover .tp-switchTrack{background:var(--dsw-alias-border-l3)}
|
|
761
780
|
.tp-switch input:checked+.tp-switchTrack{background:var(--dsw-alias-brand-primary)}
|
|
762
|
-
.tp-switch input:
|
|
763
|
-
.tp-
|
|
764
|
-
.tp-
|
|
765
|
-
.tp-
|
|
781
|
+
.tp-row:hover .tp-switch input:checked+.tp-switchTrack{background:var(--dsw-alias-brand-primary)}
|
|
782
|
+
.tp-switch input:focus-visible+.tp-switchTrack{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}
|
|
783
|
+
.tp-thumb{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);box-shadow:0 1px 3px rgba(0,0,0,.14),0 1px 1px rgba(0,0,0,.08);transition:transform .2s cubic-bezier(.34,1.3,.5,1);transform-origin:left center;pointer-events:none}
|
|
784
|
+
.tp-switch input:checked~.tp-thumb{transform:translateX(16px);transform-origin:right center}
|
|
785
|
+
.tp-switch input:active:not(:disabled)~.tp-thumb{transform:scaleX(1.2)}
|
|
786
|
+
.tp-switch input:checked:active:not(:disabled)~.tp-thumb{transform:translateX(16px) scaleX(1.2)}
|
|
787
|
+
.tp-switch input:disabled{cursor:default}
|
|
788
|
+
.tp-switch input:disabled~.tp-switchTrack,.tp-switch input:disabled~.tp-thumb{opacity:.45}
|
|
789
|
+
.tp-actionField{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-l1)}
|
|
766
790
|
.tp-actionField:last-child{border-bottom:none}
|
|
767
791
|
.tp-actionHead{display:flex;align-items:center;gap:12px}
|
|
768
792
|
.tp-actionInfo{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
|
769
793
|
.tp-actionTitle{font-size:14px;font-weight:400;line-height:22px;color:var(--dsw-alias-label-primary)}
|
|
770
794
|
.tp-actionDesc{font-size:12px;font-weight:400;line-height:18px;color:var(--dsw-alias-label-tertiary)}
|
|
771
|
-
.tp-actionButton{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-
|
|
772
|
-
.tp-actionButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}
|
|
795
|
+
.tp-actionButton{appearance:none;flex:none;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1);padding:5px 14px;font:inherit;font-size:13px;line-height:1.5;color:var(--dsw-alias-label-primary);cursor:pointer;transition:background .16s ease,border-color .16s ease,transform .1s ease}
|
|
796
|
+
.tp-actionButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}
|
|
797
|
+
.tp-actionButton:active:not(:disabled){transform:scale(.97)}
|
|
773
798
|
.tp-actionButton:disabled{opacity:.55;cursor:default}
|
|
774
|
-
.tp-actionButton:focus-visible{outline:2px solid var(--dsw-alias-
|
|
775
|
-
.tp-actionResult{margin:0;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
799
|
+
.tp-actionButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}
|
|
800
|
+
.tp-actionResult{margin:0;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;animation:tp-soft-in .22s cubic-bezier(.22,1,.36,1) both}
|
|
776
801
|
.tp-actionResult[data-state="ok"]{color:var(--dsw-alias-label-secondary)}
|
|
777
802
|
.tp-actionResult[data-state="error"]{color:var(--dsw-alias-label-error)}
|
|
803
|
+
@keyframes tp-soft-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
|
|
778
804
|
@media (prefers-reduced-motion: reduce){
|
|
779
|
-
.tp-
|
|
805
|
+
.tp-row,.tp-reset,.tp-reset::after,.tp-input,.tp-selectTrigger,.tp-selectChevron,.tp-switchTrack,.tp-thumb,.tp-actionButton{transition:none}
|
|
806
|
+
.tp-invalidText,.tp-actionResult{animation:none}
|
|
780
807
|
}
|
|
781
808
|
`;
|
|
782
809
|
/** Inject the shared row stylesheet once per page. */
|
|
@@ -795,46 +822,53 @@ window.__ModuleLoader__.load({
|
|
|
795
822
|
function hasOwn(obj, key) {
|
|
796
823
|
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, key);
|
|
797
824
|
}
|
|
798
|
-
/**
|
|
825
|
+
/**
|
|
826
|
+
* Number row: same left-text / right-control anatomy as toggle and select
|
|
827
|
+
* rows, with the input right-aligned at a fixed width. The label is wired to
|
|
828
|
+
* the input (htmlFor) and clicking anywhere on the row focuses the input.
|
|
829
|
+
*/
|
|
799
830
|
function NumberRow(props) {
|
|
800
831
|
const { t, control, disabled, onEdit, onReset } = props;
|
|
832
|
+
const inputId = (0, react.useId)();
|
|
801
833
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
802
|
-
className: "tp-
|
|
834
|
+
className: "tp-row" + (disabled ? "" : " tp-rowClickable"),
|
|
835
|
+
onClick: (event) => {
|
|
836
|
+
if (event.target.closest("input,button,select,textarea,a")) return;
|
|
837
|
+
event.currentTarget.querySelector(".tp-input")?.focus();
|
|
838
|
+
},
|
|
803
839
|
children: [
|
|
804
840
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
805
|
-
className: "tp-
|
|
841
|
+
className: "tp-rowText",
|
|
806
842
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
807
|
-
className: "tp-
|
|
843
|
+
className: "tp-rowTitle",
|
|
844
|
+
htmlFor: inputId,
|
|
808
845
|
children: t(control.labelKey)
|
|
809
|
-
}),
|
|
810
|
-
className: "tp-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
815
|
-
type: "button",
|
|
816
|
-
className: "tp-reset",
|
|
817
|
-
disabled,
|
|
818
|
-
onClick: () => onReset(control.field),
|
|
819
|
-
children: t("reset")
|
|
820
|
-
})]
|
|
821
|
-
}) : null]
|
|
846
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
847
|
+
className: "tp-rowDesc" + (control.invalid ? " tp-invalidText" : ""),
|
|
848
|
+
role: control.invalid ? "status" : void 0,
|
|
849
|
+
children: control.invalid ? t("invalidNumber") : t(control.hintKey)
|
|
850
|
+
})]
|
|
822
851
|
}),
|
|
852
|
+
control.overridden ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
853
|
+
className: "tp-badges",
|
|
854
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
855
|
+
className: "tp-badge",
|
|
856
|
+
children: t("overridden")
|
|
857
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
858
|
+
type: "button",
|
|
859
|
+
className: "tp-reset",
|
|
860
|
+
disabled,
|
|
861
|
+
onClick: () => onReset(control.field),
|
|
862
|
+
children: t("reset")
|
|
863
|
+
})]
|
|
864
|
+
}) : null,
|
|
823
865
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
866
|
+
id: inputId,
|
|
824
867
|
type: "number",
|
|
825
|
-
"aria-label": t(control.labelKey),
|
|
826
868
|
className: "tp-input" + (control.invalid ? " tp-invalid" : ""),
|
|
827
869
|
disabled,
|
|
828
870
|
value: control.text,
|
|
829
871
|
onChange: (e) => onEdit(control.field, e.target.value)
|
|
830
|
-
}),
|
|
831
|
-
control.invalid ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
832
|
-
className: "tp-invalidMsg",
|
|
833
|
-
role: "status",
|
|
834
|
-
children: t("invalidNumber")
|
|
835
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
836
|
-
className: "tp-hint",
|
|
837
|
-
children: t(control.hintKey)
|
|
838
872
|
})
|
|
839
873
|
]
|
|
840
874
|
});
|
|
@@ -849,7 +883,11 @@ window.__ModuleLoader__.load({
|
|
|
849
883
|
}));
|
|
850
884
|
const close = () => onOpenChange(null);
|
|
851
885
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
852
|
-
className: "tp-row",
|
|
886
|
+
className: "tp-row" + (disabled ? "" : " tp-rowClickable"),
|
|
887
|
+
onClick: (event) => {
|
|
888
|
+
if (event.target.closest("input,button,select,textarea,a")) return;
|
|
889
|
+
event.currentTarget.querySelector(".tp-selectTrigger")?.click();
|
|
890
|
+
},
|
|
853
891
|
children: [
|
|
854
892
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
855
893
|
className: "tp-rowText",
|
|
@@ -903,7 +941,11 @@ window.__ModuleLoader__.load({
|
|
|
903
941
|
function ToggleRow(props) {
|
|
904
942
|
const { t, control, disabled, onToggle, onReset } = props;
|
|
905
943
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
906
|
-
className: "tp-row",
|
|
944
|
+
className: "tp-row" + (disabled ? "" : " tp-rowClickable"),
|
|
945
|
+
onClick: (event) => {
|
|
946
|
+
if (event.target.closest("input,button,select,textarea,a")) return;
|
|
947
|
+
event.currentTarget.querySelector(".tp-switch input")?.click();
|
|
948
|
+
},
|
|
907
949
|
children: [
|
|
908
950
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
909
951
|
className: "tp-rowText",
|
|
@@ -1060,11 +1102,13 @@ window.__ModuleLoader__.load({
|
|
|
1060
1102
|
.tp-card.tp-open{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}
|
|
1061
1103
|
.tp-header{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:12px}
|
|
1062
1104
|
.tp-header:active{background:var(--dsw-alias-bg-layer-2)}
|
|
1063
|
-
.tp-header:focus-visible{outline:2px solid var(--dsw-alias-
|
|
1105
|
+
.tp-header:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}
|
|
1064
1106
|
.tp-headText{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
|
|
1065
1107
|
.tp-name{font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary)}
|
|
1066
1108
|
.tp-desc{font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}
|
|
1067
|
-
.tp-pending{flex:none;border-radius:999px;padding:
|
|
1109
|
+
.tp-pending{display:inline-flex;align-items:center;gap:6px;flex:none;border-radius:999px;padding:2px 10px;font-size:11px;line-height:17px;font-weight:500;white-space:nowrap;background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-state-business-primary)}
|
|
1110
|
+
.tp-pending::before{content:'';flex:none;width:6px;height:6px;border-radius:999px;background:var(--dsw-alias-state-business-primary);animation:tp-pulse 1.8s ease-in-out infinite}
|
|
1111
|
+
@keyframes tp-pulse{0%,100%{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1)}}
|
|
1068
1112
|
.tp-chevron{flex:none;color:var(--dsw-alias-label-tertiary);transition:transform .16s;display:inline-flex}
|
|
1069
1113
|
.tp-chevron.tp-open{transform:rotate(180deg)}
|
|
1070
1114
|
.tp-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-top:4px;display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .22s cubic-bezier(.22,.61,.36,1),opacity .16s ease}
|
|
@@ -1082,10 +1126,12 @@ window.__ModuleLoader__.load({
|
|
|
1082
1126
|
.tp-discard{border-color:var(--dsw-alias-border-l2);background:none;color:var(--dsw-alias-label-secondary)}
|
|
1083
1127
|
.tp-discard:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}
|
|
1084
1128
|
.tp-save{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}
|
|
1129
|
+
.tp-save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}
|
|
1085
1130
|
.tp-discard:disabled,.tp-save:disabled{opacity:.4;cursor:default}
|
|
1086
|
-
.tp-discard:focus-visible,.tp-save:focus-visible{outline:2px solid var(--dsw-alias-
|
|
1131
|
+
.tp-discard:focus-visible,.tp-save:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}
|
|
1087
1132
|
@media (prefers-reduced-motion: reduce){
|
|
1088
1133
|
.tp-card,.tp-header,.tp-chevron,.tp-body,.tp-thumb,.tp-switchTrack,.tp-discard,.tp-save{transition:none}
|
|
1134
|
+
.tp-pending::before{animation:none}
|
|
1089
1135
|
}
|
|
1090
1136
|
`;
|
|
1091
1137
|
/** Inject the card stylesheet once per page; the loader removes plugin-owned style tags on unload. */
|
|
@@ -2002,37 +2048,69 @@ window.__ModuleLoader__.load({
|
|
|
2002
2048
|
* Tab chrome mirrors the official Plugins settings section
|
|
2003
2049
|
* (ui-settings-plugins): `role="tablist"` + tab/panel roles, aria wiring,
|
|
2004
2050
|
* and arrow/Home/End keyboard roaming.
|
|
2051
|
+
*
|
|
2052
|
+
* The page is pinned to the host settings pane: the heading, intro and tablist
|
|
2053
|
+
* stay put, the save bar sits at the bottom, and the tab panel is the only
|
|
2054
|
+
* scroller — so the scrollbar spans just the band between them.
|
|
2005
2055
|
* @module @xiaoso/dsh-tool-plus/client
|
|
2006
2056
|
*/
|
|
2007
|
-
/**
|
|
2057
|
+
/**
|
|
2058
|
+
* Page CSS, keyed by `data-plugin-css` and injected once.
|
|
2059
|
+
*
|
|
2060
|
+
* Design language: official settings-section rhythm (18/600 heading, 13px
|
|
2061
|
+
* tertiary intro, 760px content column) on the host's `--dsw-alias-*`
|
|
2062
|
+
* tokens, so both themes adapt automatically. Tab chrome is the official
|
|
2063
|
+
* underline tablist (like the Plugins section), upgraded with a single
|
|
2064
|
+
* sliding brand-blue underline; group cards float above the modal surface
|
|
2065
|
+
* (layer-3). No backdrop-filter anywhere — solid token colors only.
|
|
2066
|
+
* All motion is transform/opacity only (GPU-composited): the underline
|
|
2067
|
+
* FLIP is driven from JS, entrance stagger and panel fades are CSS
|
|
2068
|
+
* keyframes, and the unsaved dot pulses opacity/scale. Everything shuts
|
|
2069
|
+
* off under prefers-reduced-motion (CSS here, matchMedia for the
|
|
2070
|
+
* JS-driven underline).
|
|
2071
|
+
*/
|
|
2008
2072
|
const CSS = `
|
|
2009
|
-
.tps{display:flex;flex-direction:column;gap:16px;padding:
|
|
2010
|
-
.tps-heading{margin:0;font-size:18px;font-weight:600;line-height:26px;color:var(--dsw-alias-label-primary)}
|
|
2011
|
-
.tps-intro{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}
|
|
2012
|
-
.tps-tabs{display:flex;flex-
|
|
2013
|
-
.tps-tab{appearance:none;border:none;background:none;font:inherit;font-size:13px;line-height:20px;color:var(--dsw-alias-label-
|
|
2014
|
-
.tps-tab:hover:not([data-active="true"]){
|
|
2015
|
-
.tps-tab[data-active="true"]{
|
|
2016
|
-
.tps-tab:focus-visible{outline:2px solid var(--dsw-alias-
|
|
2017
|
-
.tps-
|
|
2018
|
-
.tps-
|
|
2019
|
-
.tps-
|
|
2020
|
-
.tps-
|
|
2073
|
+
.tps-section{box-sizing:border-box;display:flex;flex-direction:column;gap:16px;padding-top:2px}
|
|
2074
|
+
.tps-heading{margin:0;font-size:18px;font-weight:600;line-height:26px;color:var(--dsw-alias-label-primary);animation:tps-rise .38s cubic-bezier(.22,1,.36,1) both}
|
|
2075
|
+
.tps-intro{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary);max-width:64ch;animation:tps-rise .38s cubic-bezier(.22,1,.36,1) .05s both}
|
|
2076
|
+
.tps-tabs{position:relative;display:flex;align-items:flex-end;gap:22px;border-bottom:1px solid var(--dsw-alias-border-l2);margin-top:2px;animation:tps-rise .38s cubic-bezier(.22,1,.36,1) .1s both}
|
|
2077
|
+
.tps-tab{position:relative;appearance:none;border:none;background:none;font:inherit;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary);padding:7px 1px 9px;cursor:pointer;white-space:nowrap;transition:color .16s ease}
|
|
2078
|
+
.tps-tab:hover:not([data-active="true"]){color:var(--dsw-alias-label-primary)}
|
|
2079
|
+
.tps-tab[data-active="true"]{color:var(--dsw-alias-label-primary)}
|
|
2080
|
+
.tps-tab:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}
|
|
2081
|
+
.tps-tabIndicator{position:absolute;bottom:-1px;left:0;height:2px;border-radius:2px 2px 0 0;background:var(--dsw-alias-state-business-primary);pointer-events:none;transform-origin:left center;will-change:transform}
|
|
2082
|
+
.tps-panel{display:flex;flex:1 1 auto;flex-direction:column;gap:14px;min-width:0;min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable;scrollbar-width:thin;animation:tps-panel-in .24s cubic-bezier(.22,1,.36,1) both}
|
|
2083
|
+
.tps-panel::-webkit-scrollbar{width:10px}
|
|
2084
|
+
.tps-panel::-webkit-scrollbar-track{background:transparent}
|
|
2085
|
+
.tps-panel::-webkit-scrollbar-thumb{border:3px solid transparent;border-radius:999px;background-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 45%, transparent);background-clip:content-box}
|
|
2086
|
+
.tps-panel::-webkit-scrollbar-thumb:hover{background-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 75%, transparent)}
|
|
2087
|
+
.tps-group{display:flex;flex-direction:column}
|
|
2088
|
+
.tps-groupTitle{font-size:13px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary);margin:0 0 6px;padding:0 2px}
|
|
2089
|
+
.tps-card{display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-3);padding:0 16px}
|
|
2090
|
+
.tps-empty{border:1px dashed var(--dsw-alias-border-l3);border-radius:12px;padding:24px 16px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:4px}
|
|
2021
2091
|
.tps-emptyTitle{margin:0;font-size:14px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary)}
|
|
2022
2092
|
.tps-emptyHint{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
|
|
2023
|
-
.tps-readOnly{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
|
|
2024
|
-
.tps-footer{display:flex;align-items:center;justify-content:flex-end;gap:
|
|
2093
|
+
.tps-readOnly{margin:0;padding:8px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-3);font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}
|
|
2094
|
+
.tps-footer{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 0;border-top:1px solid var(--dsw-alias-border-l2)}
|
|
2025
2095
|
.tps-failed{flex:1;min-width:0;margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-error)}
|
|
2026
2096
|
.tps-applies{flex:1;min-width:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}
|
|
2027
|
-
.tps-
|
|
2097
|
+
.tps-unsaved{display:inline-flex;align-items:center;gap:6px;flex:none;border-radius:999px;padding:2px 10px;font-size:11px;line-height:17px;font-weight:500;color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-tertiary)}
|
|
2098
|
+
.tps-unsavedDot{flex:none;width:6px;height:6px;border-radius:999px;background:var(--dsw-alias-state-business-primary);animation:tps-pulse 1.8s ease-in-out infinite}
|
|
2099
|
+
.tps-discard,.tps-save{appearance:none;border:1px solid transparent;border-radius:8px;padding:5px 14px;font:inherit;font-size:13px;line-height:1.5;cursor:pointer;transition:transform .1s ease,background .16s ease,border-color .16s ease,color .16s ease}
|
|
2028
2100
|
.tps-discard:active:not(:disabled),.tps-save:active:not(:disabled){transform:scale(.97)}
|
|
2029
2101
|
.tps-discard{border-color:var(--dsw-alias-border-l2);background:none;color:var(--dsw-alias-label-secondary)}
|
|
2030
|
-
.tps-discard:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-
|
|
2102
|
+
.tps-discard:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l4)}
|
|
2031
2103
|
.tps-save{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}
|
|
2104
|
+
.tps-save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}
|
|
2032
2105
|
.tps-discard:disabled,.tps-save:disabled{opacity:.4;cursor:default}
|
|
2033
|
-
.tps-discard:focus-visible,.tps-save:focus-visible{outline:2px solid var(--dsw-alias-
|
|
2106
|
+
.tps-discard:focus-visible,.tps-save:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}
|
|
2107
|
+
@keyframes tps-rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
|
|
2108
|
+
@keyframes tps-panel-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
|
|
2109
|
+
@keyframes tps-pulse{0%,100%{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1)}}
|
|
2034
2110
|
@media (prefers-reduced-motion: reduce){
|
|
2111
|
+
.tps-heading,.tps-intro,.tps-tabs,.tps-panel,.tps-unsavedDot{animation:none}
|
|
2035
2112
|
.tps-tab,.tps-discard,.tps-save{transition:none}
|
|
2113
|
+
.tps-tabIndicator{will-change:auto}
|
|
2036
2114
|
}
|
|
2037
2115
|
`;
|
|
2038
2116
|
/** Inject the section stylesheet once per page. */
|
|
@@ -2052,6 +2130,17 @@ window.__ModuleLoader__.load({
|
|
|
2052
2130
|
const TOOL_TABS = TOOL_PLUS_TABS;
|
|
2053
2131
|
/** All fields the page edits (one shared form). */
|
|
2054
2132
|
const ALL_FIELDS = TOOL_PLUS_FIELDS;
|
|
2133
|
+
/** Floor for the pinned page height, so an unusually short pane never collapses the panel. */
|
|
2134
|
+
const MIN_PAGE_HEIGHT = 240;
|
|
2135
|
+
/**
|
|
2136
|
+
* Nearest ancestor that scrolls vertically — the host settings pane hosting
|
|
2137
|
+
* this section. The pane is app chrome with no stable class, so it is found by
|
|
2138
|
+
* walking up from the section root.
|
|
2139
|
+
*/
|
|
2140
|
+
function scrollPaneOf(element) {
|
|
2141
|
+
for (let node = element.parentElement; node !== null; node = node.parentElement) if (/(auto|scroll|overlay)/.test(getComputedStyle(node).overflowY)) return node;
|
|
2142
|
+
return null;
|
|
2143
|
+
}
|
|
2055
2144
|
/** Current effective value of a boolean/select control (staged or resolved). */
|
|
2056
2145
|
function controlValue(form, field) {
|
|
2057
2146
|
for (const group of form.groups) {
|
|
@@ -2124,48 +2213,51 @@ window.__ModuleLoader__.load({
|
|
|
2124
2213
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
|
|
2125
2214
|
className: "tps-groupTitle",
|
|
2126
2215
|
children: t(TOOL_PLUS_GROUP_LABELS[group.group] ?? "title")
|
|
2127
|
-
}),
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2216
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
2217
|
+
className: "tps-card",
|
|
2218
|
+
children: group.fields.map((field) => {
|
|
2219
|
+
if (field.kind === "action") {
|
|
2220
|
+
const actionControl = {
|
|
2221
|
+
field: field.name,
|
|
2222
|
+
labelKey: field.labelKey,
|
|
2223
|
+
hintKey: field.hintKey,
|
|
2224
|
+
actionKey: field.actionKey ?? ""
|
|
2225
|
+
};
|
|
2226
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ActionRow, {
|
|
2227
|
+
t,
|
|
2228
|
+
control: actionControl,
|
|
2229
|
+
disabled: !writable,
|
|
2230
|
+
running: actionState[field.name] === "running",
|
|
2231
|
+
result: actionResults[field.name] ?? null,
|
|
2232
|
+
onRun: (_actionKey) => runAction(field)
|
|
2233
|
+
}, field.name);
|
|
2234
|
+
}
|
|
2235
|
+
const entry = controlOf(field);
|
|
2236
|
+
if (entry === void 0) return null;
|
|
2237
|
+
if (entry.kind === "number") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NumberRow, {
|
|
2136
2238
|
t,
|
|
2137
|
-
control:
|
|
2239
|
+
control: entry.control,
|
|
2138
2240
|
disabled: !writable,
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
onRun: (_actionKey) => runAction(field)
|
|
2241
|
+
onEdit: form.actions.edit,
|
|
2242
|
+
onReset: form.actions.resetField
|
|
2142
2243
|
}, field.name);
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
onReset: form.actions.resetField
|
|
2161
|
-
}, field.name);
|
|
2162
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
|
|
2163
|
-
t,
|
|
2164
|
-
control: entry.control,
|
|
2165
|
-
disabled: !writable,
|
|
2166
|
-
onToggle: form.onToggle,
|
|
2167
|
-
onReset: form.actions.resetField
|
|
2168
|
-
}, field.name);
|
|
2244
|
+
if (entry.kind === "select") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectRow, {
|
|
2245
|
+
t,
|
|
2246
|
+
control: entry.control,
|
|
2247
|
+
disabled: !writable,
|
|
2248
|
+
open: openSelect === field.name,
|
|
2249
|
+
onOpenChange,
|
|
2250
|
+
onEdit: form.editSelect,
|
|
2251
|
+
onReset: form.actions.resetField
|
|
2252
|
+
}, field.name);
|
|
2253
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
|
|
2254
|
+
t,
|
|
2255
|
+
control: entry.control,
|
|
2256
|
+
disabled: !writable,
|
|
2257
|
+
onToggle: form.onToggle,
|
|
2258
|
+
onReset: form.actions.resetField
|
|
2259
|
+
}, field.name);
|
|
2260
|
+
})
|
|
2169
2261
|
})]
|
|
2170
2262
|
}, group.group)) });
|
|
2171
2263
|
}
|
|
@@ -2173,6 +2265,7 @@ window.__ModuleLoader__.load({
|
|
|
2173
2265
|
function ToolPlusSection(props) {
|
|
2174
2266
|
const { t, scope } = props;
|
|
2175
2267
|
const form = useToolForm(scope, ALL_FIELDS);
|
|
2268
|
+
const sectionRef = (0, react.useRef)(null);
|
|
2176
2269
|
const tabsId = (0, react.useRef)(`tps-${Math.random().toString(36).slice(2, 8)}`);
|
|
2177
2270
|
const tabRefs = (0, react.useRef)([]);
|
|
2178
2271
|
const [activeId, setActiveId] = (0, react.useState)();
|
|
@@ -2231,12 +2324,88 @@ window.__ModuleLoader__.load({
|
|
|
2231
2324
|
injectSectionCss();
|
|
2232
2325
|
injectSettingsRowsCss();
|
|
2233
2326
|
}, []);
|
|
2234
|
-
if (!form.shell.available) return null;
|
|
2235
2327
|
const active = TOOL_TABS.find((row) => row.id === activeId)?.id ?? TOOL_TABS[0]?.id;
|
|
2328
|
+
const tabsRef = (0, react.useRef)(null);
|
|
2329
|
+
const indicatorRef = (0, react.useRef)(null);
|
|
2330
|
+
const committedRect = (0, react.useRef)(null);
|
|
2331
|
+
const commitIndicator = (0, react.useCallback)((animate) => {
|
|
2332
|
+
const tabs = tabsRef.current;
|
|
2333
|
+
const indicator = indicatorRef.current;
|
|
2334
|
+
if (tabs === null || indicator === null || active === void 0) return;
|
|
2335
|
+
const tab = tabs.querySelector(`[data-tps-tab="${active}"]`);
|
|
2336
|
+
if (tab === null) return;
|
|
2337
|
+
const left = tab.offsetLeft;
|
|
2338
|
+
const width = tab.offsetWidth;
|
|
2339
|
+
const previous = committedRect.current;
|
|
2340
|
+
committedRect.current = {
|
|
2341
|
+
left,
|
|
2342
|
+
width
|
|
2343
|
+
};
|
|
2344
|
+
if (previous !== null && previous.left === left && previous.width === width) return;
|
|
2345
|
+
const reduce = typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
2346
|
+
if (!animate || reduce || previous === null) {
|
|
2347
|
+
indicator.style.transition = "none";
|
|
2348
|
+
indicator.style.width = `${width}px`;
|
|
2349
|
+
indicator.style.transform = `translateX(${left}px)`;
|
|
2350
|
+
return;
|
|
2351
|
+
}
|
|
2352
|
+
indicator.style.transition = "none";
|
|
2353
|
+
indicator.style.width = `${width}px`;
|
|
2354
|
+
indicator.style.transform = `translateX(${previous.left}px) scaleX(${previous.width / width})`;
|
|
2355
|
+
indicator.offsetWidth;
|
|
2356
|
+
indicator.style.transition = "transform .24s cubic-bezier(.22,1,.36,1)";
|
|
2357
|
+
indicator.style.transform = `translateX(${left}px) scaleX(1)`;
|
|
2358
|
+
}, [active]);
|
|
2359
|
+
(0, react.useLayoutEffect)(() => {
|
|
2360
|
+
commitIndicator(true);
|
|
2361
|
+
}, [commitIndicator]);
|
|
2362
|
+
const commitRef = (0, react.useRef)(commitIndicator);
|
|
2363
|
+
commitRef.current = commitIndicator;
|
|
2364
|
+
(0, react.useEffect)(() => {
|
|
2365
|
+
const tabs = tabsRef.current;
|
|
2366
|
+
if (tabs === null || typeof ResizeObserver === "undefined") return;
|
|
2367
|
+
const observer = new ResizeObserver(() => commitRef.current(false));
|
|
2368
|
+
observer.observe(tabs);
|
|
2369
|
+
for (const tab of Array.from(tabs.querySelectorAll("[data-tps-tab]"))) observer.observe(tab);
|
|
2370
|
+
return () => {
|
|
2371
|
+
observer.disconnect();
|
|
2372
|
+
};
|
|
2373
|
+
}, []);
|
|
2374
|
+
(0, react.useLayoutEffect)(() => {
|
|
2375
|
+
const root = sectionRef.current;
|
|
2376
|
+
if (root === null || typeof ResizeObserver === "undefined") return;
|
|
2377
|
+
const pane = scrollPaneOf(root);
|
|
2378
|
+
if (pane === null) return;
|
|
2379
|
+
let frame = 0;
|
|
2380
|
+
const measure = () => {
|
|
2381
|
+
frame = 0;
|
|
2382
|
+
const style = getComputedStyle(pane);
|
|
2383
|
+
const paddingTop = parseFloat(style.paddingTop) || 0;
|
|
2384
|
+
const contentHeight = pane.clientHeight - paddingTop - (parseFloat(style.paddingBottom) || 0);
|
|
2385
|
+
const offset = root.getBoundingClientRect().top - pane.getBoundingClientRect().top - (parseFloat(style.borderTopWidth) || 0) - paddingTop + pane.scrollTop;
|
|
2386
|
+
const next = `${Math.max(MIN_PAGE_HEIGHT, Math.round(contentHeight - offset))}px`;
|
|
2387
|
+
if (root.style.height !== next) root.style.height = next;
|
|
2388
|
+
};
|
|
2389
|
+
const schedule = () => {
|
|
2390
|
+
if (frame === 0) frame = requestAnimationFrame(measure);
|
|
2391
|
+
};
|
|
2392
|
+
measure();
|
|
2393
|
+
const observer = new ResizeObserver(schedule);
|
|
2394
|
+
observer.observe(pane);
|
|
2395
|
+
window.addEventListener("resize", schedule);
|
|
2396
|
+
return () => {
|
|
2397
|
+
if (frame !== 0) cancelAnimationFrame(frame);
|
|
2398
|
+
observer.disconnect();
|
|
2399
|
+
window.removeEventListener("resize", schedule);
|
|
2400
|
+
root.style.height = "";
|
|
2401
|
+
};
|
|
2402
|
+
}, [form.shell.available]);
|
|
2403
|
+
if (!form.shell.available) return null;
|
|
2236
2404
|
const selectTab = (id) => setActiveId(id);
|
|
2237
2405
|
const blocked = !form.shell.dirty || form.shell.invalid || form.shell.saving;
|
|
2238
2406
|
const writable = form.shell.writable;
|
|
2239
2407
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2408
|
+
ref: sectionRef,
|
|
2240
2409
|
className: "tps-section",
|
|
2241
2410
|
children: [
|
|
2242
2411
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
|
|
@@ -2247,11 +2416,16 @@ window.__ModuleLoader__.load({
|
|
|
2247
2416
|
className: "tps-intro",
|
|
2248
2417
|
children: t("pageDescription")
|
|
2249
2418
|
}),
|
|
2250
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
2419
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2420
|
+
ref: tabsRef,
|
|
2251
2421
|
className: "tps-tabs",
|
|
2252
2422
|
role: "tablist",
|
|
2253
2423
|
"aria-label": t("pageTitle"),
|
|
2254
|
-
children:
|
|
2424
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2425
|
+
ref: indicatorRef,
|
|
2426
|
+
className: "tps-tabIndicator",
|
|
2427
|
+
"aria-hidden": "true"
|
|
2428
|
+
}), TOOL_TABS.map((row, index) => {
|
|
2255
2429
|
const selected = row.id === active;
|
|
2256
2430
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
2257
2431
|
ref: (element) => {
|
|
@@ -2264,6 +2438,7 @@ window.__ModuleLoader__.load({
|
|
|
2264
2438
|
"aria-selected": selected,
|
|
2265
2439
|
"aria-controls": `${tabsId.current}-panel-${row.id}`,
|
|
2266
2440
|
"data-active": selected ? "true" : void 0,
|
|
2441
|
+
"data-tps-tab": row.id,
|
|
2267
2442
|
tabIndex: selected ? 0 : -1,
|
|
2268
2443
|
onClick: () => selectTab(row.id),
|
|
2269
2444
|
onKeyDown: (event) => {
|
|
@@ -2291,7 +2466,7 @@ window.__ModuleLoader__.load({
|
|
|
2291
2466
|
},
|
|
2292
2467
|
children: t(row.labelKey)
|
|
2293
2468
|
}, row.id);
|
|
2294
|
-
})
|
|
2469
|
+
})]
|
|
2295
2470
|
}),
|
|
2296
2471
|
TOOL_TABS.filter((row) => row.id === active).map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2297
2472
|
id: `${tabsId.current}-panel-${row.id}`,
|
|
@@ -2326,6 +2501,14 @@ window.__ModuleLoader__.load({
|
|
|
2326
2501
|
className: "tps-applies",
|
|
2327
2502
|
children: t("appliesTo")
|
|
2328
2503
|
}) : null,
|
|
2504
|
+
!form.shell.failed && form.shell.dirty ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
2505
|
+
className: "tps-unsaved",
|
|
2506
|
+
role: "status",
|
|
2507
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2508
|
+
className: "tps-unsavedDot",
|
|
2509
|
+
"aria-hidden": "true"
|
|
2510
|
+
}), t("unsaved")]
|
|
2511
|
+
}) : null,
|
|
2329
2512
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
2330
2513
|
type: "button",
|
|
2331
2514
|
className: "tps-discard",
|
package/lib/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ __installBunShim();
|
|
|
3
3
|
import { n as fs_promises_shim_exports, t as exists } from "./fs-promises-shim-Bx0fpxuk.mjs";
|
|
4
4
|
import { i as setRuntimeLogger, n as systemChromiumCandidatesForTest, r as runtimeLogger } from "./launch-DwpE70Pv.mjs";
|
|
5
5
|
import { $ as peekFile, A as formatAge, C as error, F as $envpos, I as $flag, M as formatCount, P as $env, Q as isProbablyBinary, S as debug, T as warn, U as getAutoQaDbPath, V as VERSION, X as getRemoteDir, Y as getPuppeteerDir, b as isEnotdir, c as combineSignals, d as $which, j as formatBytes$1, k as installBunShim, l as exec, p as readImageMetadata, q as getInstallId, tt as untilAborted, u as render, v as hasFsCode, y as isEnoent } from "./src-D_e1qMwi.mjs";
|
|
6
|
-
import { C as truncateToWidth$1, S as replaceTabs, _ as formatCodeFrameLine, a as fetchBinary, b as LRUCache, c as getParallelExtractContent, d as convertFileWithMarkit, f as Settings, g as capParseErrors, h as OMP_DEFAULTS, i as convertWithMarkit, l as ensureTool, m as settings, o as extractWithParallel, p as isSettingsInitialized, s as findParallelApiKey, u as CONVERTIBLE_EXTENSIONS, v as formatParseErrors, x as padding, y as shortenPath } from "./utils-
|
|
6
|
+
import { C as truncateToWidth$1, S as replaceTabs, _ as formatCodeFrameLine, a as fetchBinary, b as LRUCache, c as getParallelExtractContent, d as convertFileWithMarkit, f as Settings, g as capParseErrors, h as OMP_DEFAULTS, i as convertWithMarkit, l as ensureTool, m as settings, o as extractWithParallel, p as isSettingsInitialized, s as findParallelApiKey, u as CONVERTIBLE_EXTENSIONS, v as formatParseErrors, x as padding, y as shortenPath } from "./utils-DSEEKy3G.mjs";
|
|
7
7
|
import { t as sanitizeText } from "./sanitize-text-CfcXzw5X.mjs";
|
|
8
8
|
import { n as isRecord$2 } from "./type-guards-B9VVjRDK.mjs";
|
|
9
9
|
import { n as ToolError, r as throwIfAborted, t as ToolAbortError } from "./tool-errors-DoyxivAR.mjs";
|
|
@@ -14555,7 +14555,7 @@ let specialHandlersPromise;
|
|
|
14555
14555
|
* requires a special handler, so we keep them out of the cold-startup graph.
|
|
14556
14556
|
*/
|
|
14557
14557
|
function loadSpecialHandlers() {
|
|
14558
|
-
specialHandlersPromise ??= import("./scrapers-
|
|
14558
|
+
specialHandlersPromise ??= import("./scrapers-DrSYgPyf.mjs").then((m) => m.specialHandlers);
|
|
14559
14559
|
return specialHandlersPromise;
|
|
14560
14560
|
}
|
|
14561
14561
|
/**
|
|
@@ -3,7 +3,7 @@ __installBunShim();
|
|
|
3
3
|
import { n as fs_promises_shim_exports } from "./fs-promises-shim-Bx0fpxuk.mjs";
|
|
4
4
|
import { B as USER_AGENT, G as getDocsRsCacheDir, N as formatNumber, P as $env, T as warn, c as combineSignals, j as formatBytes, l as exec, s as Snowflake, x as parseFrontmatter, y as isEnoent } from "./src-D_e1qMwi.mjs";
|
|
5
5
|
import { V as tryParseJson } from "./utils-fnV2zzp3.mjs";
|
|
6
|
-
import { a as fetchBinary, c as getParallelExtractContent, i as convertWithMarkit, l as ensureTool, m as settings, n as asRecord, o as extractWithParallel, r as asString, s as findParallelApiKey, t as asNumber } from "./utils-
|
|
6
|
+
import { a as fetchBinary, c as getParallelExtractContent, i as convertWithMarkit, l as ensureTool, m as settings, n as asRecord, o as extractWithParallel, r as asString, s as findParallelApiKey, t as asNumber } from "./utils-DSEEKy3G.mjs";
|
|
7
7
|
import { n as isRecord } from "./type-guards-B9VVjRDK.mjs";
|
|
8
8
|
import { r as throwIfAborted, t as ToolAbortError } from "./tool-errors-DoyxivAR.mjs";
|
|
9
9
|
import { c as getLocalizedText, d as looksLikeHtml, i as decodeHtmlEntities, l as htmlToBasicMarkdown, o as formatIsoDate, r as buildResult, s as formatMediaDuration, u as loadPage } from "./types-BUO0JXO-.mjs";
|
|
@@ -7202,7 +7202,7 @@ const settings = {
|
|
|
7202
7202
|
};
|
|
7203
7203
|
//#endregion
|
|
7204
7204
|
//#region package.json
|
|
7205
|
-
var version = "0.1.0-beta.
|
|
7205
|
+
var version = "0.1.0-beta.7";
|
|
7206
7206
|
/** `.tmp` files older than this are treated as orphaned writes and swept. */
|
|
7207
7207
|
const TMP_ORPHAN_MAX_AGE_MS = 3e5;
|
|
7208
7208
|
function markitConversionCacheKey(bytes, extension) {
|
package/package.json
CHANGED
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@xiaoso/dsh-tool-plus",
|
|
3
|
-
"description": "Oh My Pi bash runtime ported as a deepseek-harness tool plugin: persistent shell session, output minimizer, managed background jobs, command interception",
|
|
4
|
-
"version": "0.1.0-beta.
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"deepseek-harness",
|
|
8
|
-
"dsh",
|
|
9
|
-
"dsh-plugin",
|
|
10
|
-
"cli",
|
|
11
|
-
"coding-agent",
|
|
12
|
-
"agent-tools",
|
|
13
|
-
"bash",
|
|
14
|
-
"persistent-shell",
|
|
15
|
-
"file-tools",
|
|
16
|
-
"code-search",
|
|
17
|
-
"code-editing",
|
|
18
|
-
"ast-grep",
|
|
19
|
-
"tool-enhancement",
|
|
20
|
-
"oh-my-pi"
|
|
21
|
-
],
|
|
22
|
-
"repository": {
|
|
23
|
-
"type": "git",
|
|
24
|
-
"url": "git+https://github.com/xiaoso456/dsh-tool-plus.git"
|
|
25
|
-
},
|
|
26
|
-
"homepage": "https://github.com/xiaoso456/dsh-tool-plus#readme",
|
|
27
|
-
"bugs": {
|
|
28
|
-
"url": "https://github.com/xiaoso456/dsh-tool-plus/issues"
|
|
29
|
-
},
|
|
30
|
-
"type": "module",
|
|
31
|
-
"publishConfig": {
|
|
32
|
-
"access": "public",
|
|
33
|
-
"tag": "beta"
|
|
34
|
-
},
|
|
35
|
-
"engines": {
|
|
36
|
-
"node": "^22.19.0 || >=24.0.0"
|
|
37
|
-
},
|
|
38
|
-
"main": "lib/index.mjs",
|
|
39
|
-
"types": "lib/types/index.d.ts",
|
|
40
|
-
"exports": {
|
|
41
|
-
".": {
|
|
42
|
-
"types": "./lib/types/index.d.ts",
|
|
43
|
-
"default": "./lib/index.mjs"
|
|
44
|
-
},
|
|
45
|
-
"./client": {
|
|
46
|
-
"types": "./lib/types/client/index.d.ts",
|
|
47
|
-
"default": "./lib/client.js"
|
|
48
|
-
},
|
|
49
|
-
"./package.json": "./package.json"
|
|
50
|
-
},
|
|
51
|
-
"files": [
|
|
52
|
-
"lib",
|
|
53
|
-
"presets",
|
|
54
|
-
"scripts/patch-pi-natives.mjs",
|
|
55
|
-
"src/bash-runtime/shell-snapshot-fn-env.sh",
|
|
56
|
-
"cordis.patch.yml",
|
|
57
|
-
"README.md",
|
|
58
|
-
"LICENSE",
|
|
59
|
-
"THIRD_PARTY_NOTICES.md"
|
|
60
|
-
],
|
|
61
|
-
"dsh": {
|
|
62
|
-
"bundle": {
|
|
63
|
-
"patch": "./cordis.patch.yml"
|
|
64
|
-
},
|
|
65
|
-
"client": {
|
|
66
|
-
"inject": [
|
|
67
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
68
|
-
"@deepseek-ai/dsh-client-locale",
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-settings"
|
|
70
|
-
],
|
|
71
|
-
"platform": "web"
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
"scripts": {
|
|
75
|
-
"build": "tsc -p tsconfig.json && tsdown -c tsdown.config.ts && node scripts/copy-assets.mjs",
|
|
76
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
77
|
-
"test": "vitest run --config vitest.config.ts",
|
|
78
|
-
"presets:install": "node presets/install-presets.mjs",
|
|
79
|
-
"presets:install:force": "node presets/install-presets.mjs --force",
|
|
80
|
-
"postinstall": "node scripts/patch-pi-natives.mjs"
|
|
81
|
-
},
|
|
82
|
-
"peerDependencies": {
|
|
83
|
-
"@deepseek-ai/cordis": "^4.0.1",
|
|
84
|
-
"@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
|
|
85
|
-
"@deepseek-ai/dsh-attachment": "^0.1.1-rc.2",
|
|
86
|
-
"@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
|
|
87
|
-
"@deepseek-ai/dsh-fs": "^0.1.1-rc.2",
|
|
88
|
-
"@deepseek-ai/dsh-jobs": "^0.1.1-rc.2",
|
|
89
|
-
"@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
|
|
90
|
-
"@deepseek-ai/dsh-sandbox": "^0.1.1-rc.2",
|
|
91
|
-
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
|
|
92
|
-
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
93
|
-
"@deepseek-ai/dsh-shell": "^0.1.1-rc.2",
|
|
94
|
-
"@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
|
|
95
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
96
|
-
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2"
|
|
97
|
-
},
|
|
98
|
-
"optionalPeerDependencies": {
|
|
99
|
-
"sharp": ">=0.33"
|
|
100
|
-
},
|
|
101
|
-
"dependencies": {
|
|
102
|
-
"@deepseek-ai/schemastery": "^3.18.1",
|
|
103
|
-
"@oh-my-pi/omptype": "17.3.5",
|
|
104
|
-
"@oh-my-pi/pi-agent-core": "17.3.5",
|
|
105
|
-
"@oh-my-pi/pi-ai": "17.3.5",
|
|
106
|
-
"@oh-my-pi/pi-catalog": "17.3.5",
|
|
107
|
-
"@oh-my-pi/pi-natives": "17.3.5",
|
|
108
|
-
"@oh-my-pi/pi-tui": "17.3.5",
|
|
109
|
-
"@oh-my-pi/pi-utils": "17.3.5",
|
|
110
|
-
"json5": "^2.2.3",
|
|
111
|
-
"puppeteer-core": "^25.3.0",
|
|
112
|
-
"yaml": "^2.9.0"
|
|
113
|
-
},
|
|
114
|
-
"devDependencies": {
|
|
115
|
-
"@deepseek-ai/cordis": "^4.0.1",
|
|
116
|
-
"@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
|
|
117
|
-
"@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
|
|
118
|
-
"@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
|
|
119
|
-
"@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
|
|
120
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.1-rc.2",
|
|
121
|
-
"@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
|
|
122
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.1-rc.2",
|
|
123
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
|
|
124
|
-
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
125
|
-
"@deepseek-ai/dsh-jobs": "^0.1.1-rc.2",
|
|
126
|
-
"@deepseek-ai/dsh-jobs-local": "^0.1.1-rc.2",
|
|
127
|
-
"@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
|
|
128
|
-
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
|
|
129
|
-
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
130
|
-
"@deepseek-ai/dsh-shell": "^0.1.1-rc.2",
|
|
131
|
-
"@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
|
|
132
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
133
|
-
"@deepseek-ai/dsh-tool-jobs": "^0.1.1-rc.2",
|
|
134
|
-
"@deepseek-ai/dsh-tool-str-replace-editor": "0.1.1-rc.2",
|
|
135
|
-
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
|
|
136
|
-
"@types/node": "^22.19.0",
|
|
137
|
-
"@types/react": "^19.0.0",
|
|
138
|
-
"@types/react-dom": "^19.0.0",
|
|
139
|
-
"react": "^19.0.0",
|
|
140
|
-
"react-dom": "^19.0.0",
|
|
141
|
-
"sharp": "^0.35.4",
|
|
142
|
-
"tsdown": "^0.22.2",
|
|
143
|
-
"tsx": "^4.22.4",
|
|
144
|
-
"typescript": "^6.0.3",
|
|
145
|
-
"vitest": "^4.1.8"
|
|
146
|
-
}
|
|
147
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@xiaoso/dsh-tool-plus",
|
|
3
|
+
"description": "Oh My Pi bash runtime ported as a deepseek-harness tool plugin: persistent shell session, output minimizer, managed background jobs, command interception",
|
|
4
|
+
"version": "0.1.0-beta.7",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"deepseek-harness",
|
|
8
|
+
"dsh",
|
|
9
|
+
"dsh-plugin",
|
|
10
|
+
"cli",
|
|
11
|
+
"coding-agent",
|
|
12
|
+
"agent-tools",
|
|
13
|
+
"bash",
|
|
14
|
+
"persistent-shell",
|
|
15
|
+
"file-tools",
|
|
16
|
+
"code-search",
|
|
17
|
+
"code-editing",
|
|
18
|
+
"ast-grep",
|
|
19
|
+
"tool-enhancement",
|
|
20
|
+
"oh-my-pi"
|
|
21
|
+
],
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/xiaoso456/dsh-tool-plus.git"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/xiaoso456/dsh-tool-plus#readme",
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/xiaoso456/dsh-tool-plus/issues"
|
|
29
|
+
},
|
|
30
|
+
"type": "module",
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public",
|
|
33
|
+
"tag": "beta"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
37
|
+
},
|
|
38
|
+
"main": "lib/index.mjs",
|
|
39
|
+
"types": "lib/types/index.d.ts",
|
|
40
|
+
"exports": {
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./lib/types/index.d.ts",
|
|
43
|
+
"default": "./lib/index.mjs"
|
|
44
|
+
},
|
|
45
|
+
"./client": {
|
|
46
|
+
"types": "./lib/types/client/index.d.ts",
|
|
47
|
+
"default": "./lib/client.js"
|
|
48
|
+
},
|
|
49
|
+
"./package.json": "./package.json"
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"lib",
|
|
53
|
+
"presets",
|
|
54
|
+
"scripts/patch-pi-natives.mjs",
|
|
55
|
+
"src/bash-runtime/shell-snapshot-fn-env.sh",
|
|
56
|
+
"cordis.patch.yml",
|
|
57
|
+
"README.md",
|
|
58
|
+
"LICENSE",
|
|
59
|
+
"THIRD_PARTY_NOTICES.md"
|
|
60
|
+
],
|
|
61
|
+
"dsh": {
|
|
62
|
+
"bundle": {
|
|
63
|
+
"patch": "./cordis.patch.yml"
|
|
64
|
+
},
|
|
65
|
+
"client": {
|
|
66
|
+
"inject": [
|
|
67
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
68
|
+
"@deepseek-ai/dsh-client-locale",
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-settings"
|
|
70
|
+
],
|
|
71
|
+
"platform": "web"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"scripts": {
|
|
75
|
+
"build": "tsc -p tsconfig.json && tsdown -c tsdown.config.ts && node scripts/copy-assets.mjs",
|
|
76
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
77
|
+
"test": "vitest run --config vitest.config.ts",
|
|
78
|
+
"presets:install": "node presets/install-presets.mjs",
|
|
79
|
+
"presets:install:force": "node presets/install-presets.mjs --force",
|
|
80
|
+
"postinstall": "node scripts/patch-pi-natives.mjs"
|
|
81
|
+
},
|
|
82
|
+
"peerDependencies": {
|
|
83
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
84
|
+
"@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
|
|
85
|
+
"@deepseek-ai/dsh-attachment": "^0.1.1-rc.2",
|
|
86
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
|
|
87
|
+
"@deepseek-ai/dsh-fs": "^0.1.1-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-jobs": "^0.1.1-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-sandbox": "^0.1.1-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-shell": "^0.1.1-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2"
|
|
97
|
+
},
|
|
98
|
+
"optionalPeerDependencies": {
|
|
99
|
+
"sharp": ">=0.33"
|
|
100
|
+
},
|
|
101
|
+
"dependencies": {
|
|
102
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
103
|
+
"@oh-my-pi/omptype": "17.3.5",
|
|
104
|
+
"@oh-my-pi/pi-agent-core": "17.3.5",
|
|
105
|
+
"@oh-my-pi/pi-ai": "17.3.5",
|
|
106
|
+
"@oh-my-pi/pi-catalog": "17.3.5",
|
|
107
|
+
"@oh-my-pi/pi-natives": "17.3.5",
|
|
108
|
+
"@oh-my-pi/pi-tui": "17.3.5",
|
|
109
|
+
"@oh-my-pi/pi-utils": "17.3.5",
|
|
110
|
+
"json5": "^2.2.3",
|
|
111
|
+
"puppeteer-core": "^25.3.0",
|
|
112
|
+
"yaml": "^2.9.0"
|
|
113
|
+
},
|
|
114
|
+
"devDependencies": {
|
|
115
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
116
|
+
"@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
|
|
118
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
|
|
119
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.1-rc.2",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
|
|
122
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.1-rc.2",
|
|
123
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
|
|
124
|
+
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
125
|
+
"@deepseek-ai/dsh-jobs": "^0.1.1-rc.2",
|
|
126
|
+
"@deepseek-ai/dsh-jobs-local": "^0.1.1-rc.2",
|
|
127
|
+
"@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
|
|
128
|
+
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
|
|
129
|
+
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
130
|
+
"@deepseek-ai/dsh-shell": "^0.1.1-rc.2",
|
|
131
|
+
"@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
|
|
132
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
|
|
133
|
+
"@deepseek-ai/dsh-tool-jobs": "^0.1.1-rc.2",
|
|
134
|
+
"@deepseek-ai/dsh-tool-str-replace-editor": "0.1.1-rc.2",
|
|
135
|
+
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
|
|
136
|
+
"@types/node": "^22.19.0",
|
|
137
|
+
"@types/react": "^19.0.0",
|
|
138
|
+
"@types/react-dom": "^19.0.0",
|
|
139
|
+
"react": "^19.0.0",
|
|
140
|
+
"react-dom": "^19.0.0",
|
|
141
|
+
"sharp": "^0.35.4",
|
|
142
|
+
"tsdown": "^0.22.2",
|
|
143
|
+
"tsx": "^4.22.4",
|
|
144
|
+
"typescript": "^6.0.3",
|
|
145
|
+
"vitest": "^4.1.8"
|
|
146
|
+
}
|
|
147
|
+
}
|
package/presets/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xiaoso/dsh-tool-plus-presets",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.7",
|
|
4
4
|
"description": "Agent-preset installer for dsh-tool-plus: installs the standard / PTC enhanced preset templates into a DeepSeek Harness home.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|