@sparkelf/dsh-dataops-managed 0.3.17 → 0.3.19

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
@@ -230,8 +230,8 @@ window.__ModuleLoader__.load({
230
230
  return asTimeout(await response.json());
231
231
  }
232
232
  //#endregion
233
- //#region \0dsh-css:/root/projects/dsh-plugins-plus/packages/dataops-managed/src/client/ManagedDataOpsSection.module.css.mjs
234
- const css$2 = "._2dqzjG_section{max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:12px;display:flex}._2dqzjG_title{margin:0;font-size:18px;font-weight:600;line-height:28px}._2dqzjG_status{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:13px;line-height:22px;display:flex}._2dqzjG_card{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-xl);background:var(--dsw-alias-settings-card-fill);flex-direction:column;gap:12px;padding:12px 16px;display:flex}._2dqzjG_heading{margin:0;font-size:13px;font-weight:600;line-height:22px}._2dqzjG_row{justify-content:space-between;align-items:center;gap:16px;display:flex}._2dqzjG_copy{flex-direction:column;min-width:0;display:flex}._2dqzjG_label{font-size:13px;line-height:22px}._2dqzjG_meta{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._2dqzjG_fields{grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:0 16px;display:grid}._2dqzjG_fields>div{min-width:0}._2dqzjG_fields input{font-variant-numeric:tabular-nums;min-width:0}._2dqzjG_actions{justify-content:flex-end;align-items:center;gap:12px;display:flex}._2dqzjG_refusal{color:var(--dsw-alias-state-error-primary);align-items:flex-start;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}";
233
+ //#region \0dsh-css:/tmp/wt-rebase/packages/dataops-managed/src/client/ManagedDataOpsSection.module.css.mjs
234
+ const css$2 = ".dcEWUa_section{max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:12px;display:flex}.dcEWUa_title{margin:0;font-size:18px;font-weight:600;line-height:28px}.dcEWUa_status{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:13px;line-height:22px;display:flex}.dcEWUa_card{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-xl);background:var(--dsw-alias-settings-card-fill);flex-direction:column;gap:12px;padding:12px 16px;display:flex}.dcEWUa_heading{margin:0;font-size:13px;font-weight:600;line-height:22px}.dcEWUa_row{justify-content:space-between;align-items:center;gap:16px;display:flex}.dcEWUa_copy{flex-direction:column;min-width:0;display:flex}.dcEWUa_label{font-size:13px;line-height:22px}.dcEWUa_meta{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.dcEWUa_fields{grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:0 16px;display:grid}.dcEWUa_fields>div{min-width:0}.dcEWUa_fields input{font-variant-numeric:tabular-nums;min-width:0}.dcEWUa_actions{justify-content:flex-end;align-items:center;gap:12px;display:flex}.dcEWUa_refusal{color:var(--dsw-alias-state-error-primary);align-items:flex-start;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}";
235
235
  const tagId$2 = "@sparkelf/dsh-dataops-managed/ManagedDataOpsSection.module.css";
236
236
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
237
237
  const tag = document.createElement("style");
@@ -241,18 +241,18 @@ window.__ModuleLoader__.load({
241
241
  document.head.appendChild(tag);
242
242
  }
243
243
  var ManagedDataOpsSection_module_css_default = {
244
- "meta": "_2dqzjG_meta",
245
- "card": "_2dqzjG_card",
246
- "fields": "_2dqzjG_fields",
247
- "row": "_2dqzjG_row",
248
- "actions": "_2dqzjG_actions",
249
- "section": "_2dqzjG_section",
250
- "status": "_2dqzjG_status",
251
- "label": "_2dqzjG_label",
252
- "heading": "_2dqzjG_heading",
253
- "refusal": "_2dqzjG_refusal",
254
- "title": "_2dqzjG_title",
255
- "copy": "_2dqzjG_copy"
244
+ "status": "dcEWUa_status",
245
+ "card": "dcEWUa_card",
246
+ "copy": "dcEWUa_copy",
247
+ "actions": "dcEWUa_actions",
248
+ "refusal": "dcEWUa_refusal",
249
+ "title": "dcEWUa_title",
250
+ "row": "dcEWUa_row",
251
+ "heading": "dcEWUa_heading",
252
+ "label": "dcEWUa_label",
253
+ "meta": "dcEWUa_meta",
254
+ "section": "dcEWUa_section",
255
+ "fields": "dcEWUa_fields"
256
256
  };
257
257
  //#endregion
258
258
  //#region src/client/ManagedDataOpsSection.tsx
@@ -729,8 +729,8 @@ window.__ModuleLoader__.load({
729
729
  return await response.json();
730
730
  }
731
731
  //#endregion
732
- //#region \0dsh-css:/root/projects/dsh-plugins-plus/packages/dataops-managed/src/client/SkillPlazaSection.module.css.mjs
733
- const css$1 = "._9FdZvq_section{box-sizing:border-box;flex-direction:column;width:100%;max-width:960px;margin:40px auto 0;display:flex}._9FdZvq_head{flex-direction:column;gap:4px;margin-bottom:12px;display:flex}._9FdZvq_title{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;margin:0;font-size:15px;font-weight:500;line-height:22px;display:flex}._9FdZvq_titleIcon{color:var(--dsw-alias-brand-primary);display:inline-flex}._9FdZvq_intro{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:20px}._9FdZvq_toolbar{margin-bottom:12px}._9FdZvq_search{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l3);width:100%;height:36px;color:var(--dsw-alias-label-primary);background:0 0;border-radius:10px;outline:none;padding:0 12px;font-size:13px}._9FdZvq_search::placeholder{color:var(--dsw-alias-label-tertiary)}._9FdZvq_tagBar{flex-wrap:wrap;gap:6px;margin-bottom:4px;display:flex}._9FdZvq_notice{color:var(--dsw-alias-state-business-primary);margin:4px 0 0;font-size:12px;line-height:18px}._9FdZvq_cards{margin:0;padding:0;list-style:none}._9FdZvq_card{border-radius:12px;min-width:0;margin:0 -8px}._9FdZvq_card:hover{background:var(--dsw-alias-interactive-bg-hover)}._9FdZvq_cardHead{align-items:center;gap:14px;padding:8px;display:flex}._9FdZvq_cardIcon{border:.5px solid var(--dsw-alias-border-l3);width:48px;height:48px;color:var(--dsw-alias-label-secondary);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}._9FdZvq_cardMain{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}._9FdZvq_cardTitle{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:8px;font-size:14px;font-weight:500;line-height:20px;display:flex;overflow:hidden}._9FdZvq_mine{flex:none}._9FdZvq_cardDesc{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13px;line-height:18px;display:-webkit-box;overflow:hidden}._9FdZvq_cardMarks{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}._9FdZvq_cardEnd{flex:none;align-items:center;gap:4px;display:flex}._9FdZvq_empty{text-align:center;flex-direction:column;align-items:center;gap:10px;padding:28px 16px 32px;display:flex}._9FdZvq_emptyIcon{border:.5px solid var(--dsw-alias-border-l3);width:56px;height:56px;color:var(--dsw-alias-label-tertiary);border-radius:14px;justify-content:center;align-items:center;display:inline-flex}._9FdZvq_emptyText{color:var(--dsw-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}";
732
+ //#region \0dsh-css:/tmp/wt-rebase/packages/dataops-managed/src/client/SkillPlazaSection.module.css.mjs
733
+ const css$1 = ".pN-avG_section{box-sizing:border-box;flex-direction:column;width:100%;max-width:960px;margin:0 auto;display:flex}.pN-avG_head{flex-direction:column;margin-bottom:8px;display:flex}.pN-avG_title{color:var(--dsw-alias-label-primary);align-items:baseline;gap:8px;margin:0;font-size:14px;font-weight:500;line-height:20px;display:flex}.pN-avG_titleCount{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400}.pN-avG_status{text-align:center;color:var(--dsw-alias-label-tertiary);margin:0;padding:20px 0;font-size:13px;line-height:20px}.pN-avG_tagBar{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.pN-avG_chip{background:var(--dsw-alias-bg-module-platform);height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;border:0;border-radius:12px;align-items:center;padding:0 10px;font-size:12px;line-height:18px;transition:background .12s;display:inline-flex}.pN-avG_chip:hover{background:var(--dsw-alias-interactive-bg-hover)}.pN-avG_chip:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.pN-avG_chipOn{color:var(--dsw-alias-state-business-primary);background:#ecf1fc;font-weight:500}.pN-avG_notice{color:var(--dsw-alias-state-business-primary);margin:4px 0 0;font-size:12px;line-height:18px}.pN-avG_cards{grid-template-columns:repeat(auto-fill,minmax(272px,1fr));align-items:start;gap:12px;margin:0;padding:0;list-style:none;display:grid}.pN-avG_card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;align-self:start;gap:10px;min-width:0;padding:12px;display:flex}.pN-avG_cardTop{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.pN-avG_cardIcon{background:var(--dsw-alias-bg-layer-2);width:28px;height:28px;color:var(--dsw-alias-label-secondary);border-radius:50%;flex:none;place-items:center;display:grid}.pN-avG_cardTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:14px;font-weight:600;line-height:20px;overflow:hidden}.pN-avG_mine{flex:none}.pN-avG_cardDesc{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.pN-avG_cardMarks{flex-wrap:wrap;gap:6px;display:flex}.pN-avG_mark{color:var(--dsw-alias-state-business-primary);white-space:nowrap;background:#ecf1fc;border:0;border-radius:4px;padding:2px 7px;font-size:11px;font-weight:500;line-height:16px}.pN-avG_cardEnd{flex:none;align-items:center;gap:4px;margin-top:auto;padding-top:4px;display:flex}.pN-avG_detailButton{margin-left:auto}.pN-avG_detail{flex-direction:column;gap:12px;margin:0;display:flex}.pN-avG_dialog{width:min(560px,100%)}.pN-avG_detailRow{flex-direction:column;gap:2px;display:flex}.pN-avG_detailLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.pN-avG_detailValue{max-height:160px;color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px;overflow:auto}.pN-avG_empty{text-align:center;flex-direction:column;align-items:center;gap:10px;padding:28px 16px 32px;display:flex}.pN-avG_emptyIcon{border:.5px solid var(--dsw-alias-border-l3);width:56px;height:56px;color:var(--dsw-alias-label-tertiary);border-radius:14px;justify-content:center;align-items:center;display:inline-flex}.pN-avG_emptyText{color:var(--dsw-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}";
734
734
  const tagId$1 = "@sparkelf/dsh-dataops-managed/SkillPlazaSection.module.css";
735
735
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
736
736
  const tag = document.createElement("style");
@@ -740,91 +740,150 @@ window.__ModuleLoader__.load({
740
740
  document.head.appendChild(tag);
741
741
  }
742
742
  var SkillPlazaSection_module_css_default = {
743
- "cardMain": "_9FdZvq_cardMain",
744
- "section": "_9FdZvq_section",
745
- "toolbar": "_9FdZvq_toolbar",
746
- "cardMarks": "_9FdZvq_cardMarks",
747
- "cardEnd": "_9FdZvq_cardEnd",
748
- "emptyIcon": "_9FdZvq_emptyIcon",
749
- "search": "_9FdZvq_search",
750
- "cardHead": "_9FdZvq_cardHead",
751
- "notice": "_9FdZvq_notice",
752
- "intro": "_9FdZvq_intro",
753
- "head": "_9FdZvq_head",
754
- "card": "_9FdZvq_card",
755
- "cards": "_9FdZvq_cards",
756
- "titleIcon": "_9FdZvq_titleIcon",
757
- "title": "_9FdZvq_title",
758
- "cardTitle": "_9FdZvq_cardTitle",
759
- "empty": "_9FdZvq_empty",
760
- "cardDesc": "_9FdZvq_cardDesc",
761
- "emptyText": "_9FdZvq_emptyText",
762
- "mine": "_9FdZvq_mine",
763
- "tagBar": "_9FdZvq_tagBar",
764
- "cardIcon": "_9FdZvq_cardIcon"
743
+ "mark": "pN-avG_mark",
744
+ "titleCount": "pN-avG_titleCount",
745
+ "detailButton": "pN-avG_detailButton",
746
+ "cardIcon": "pN-avG_cardIcon",
747
+ "mine": "pN-avG_mine",
748
+ "status": "pN-avG_status",
749
+ "head": "pN-avG_head",
750
+ "cardTop": "pN-avG_cardTop",
751
+ "cardTitle": "pN-avG_cardTitle",
752
+ "emptyIcon": "pN-avG_emptyIcon",
753
+ "detailValue": "pN-avG_detailValue",
754
+ "cards": "pN-avG_cards",
755
+ "notice": "pN-avG_notice",
756
+ "dialog": "pN-avG_dialog",
757
+ "tagBar": "pN-avG_tagBar",
758
+ "cardEnd": "pN-avG_cardEnd",
759
+ "detail": "pN-avG_detail",
760
+ "card": "pN-avG_card",
761
+ "detailRow": "pN-avG_detailRow",
762
+ "chip": "pN-avG_chip",
763
+ "section": "pN-avG_section",
764
+ "cardMarks": "pN-avG_cardMarks",
765
+ "detailLabel": "pN-avG_detailLabel",
766
+ "chipOn": "pN-avG_chipOn",
767
+ "cardDesc": "pN-avG_cardDesc",
768
+ "empty": "pN-avG_empty",
769
+ "title": "pN-avG_title",
770
+ "emptyText": "pN-avG_emptyText"
765
771
  };
766
772
  //#endregion
767
773
  //#region src/client/SkillPlazaSection.tsx
768
774
  /**
769
- * One plaza row, laid out like the skill center's own rows so the section reads as part of the
770
- * page rather than a panel bolted onto it.
771
- * @param props - the row's skill, its actions, and the dictionary resolver.
772
- * @returns the rendered row.
775
+ * One skill as a card in the plaza grid.
776
+ *
777
+ * A plaza entry carries a name, a description, tags, and its own actions; a full-width row left
778
+ * most of that width empty and forced every entry onto its own line. The card stacks the same
779
+ * parts vertically, so a grid column count can change without the content reflowing into a
780
+ * different shape.
781
+ *
782
+ * @param props - the card's skill, its actions, and the dictionary resolver.
783
+ * @returns the rendered card.
773
784
  */
774
- function PlazaRow({ skill, busy, onInstall, onUnshare, t }) {
775
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
785
+ function PlazaCard({ skill, busy, onInstall, onUnshare, t }) {
786
+ const [open, setOpen] = (0, react.useState)(false);
787
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
776
788
  className: SkillPlazaSection_module_css_default.card,
777
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
778
- className: SkillPlazaSection_module_css_default.cardHead,
779
- children: [
780
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
781
- className: SkillPlazaSection_module_css_default.cardIcon,
782
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSkillOutlineRegular, { size: 22 })
783
- }),
784
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
785
- className: SkillPlazaSection_module_css_default.cardMain,
786
- children: [
787
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
788
- className: SkillPlazaSection_module_css_default.cardTitle,
789
- children: [skill.name, skill.sharedByMe ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
790
- tone: "info",
791
- className: SkillPlazaSection_module_css_default.mine,
792
- children: t("plazaMine")
793
- }) : null]
794
- }),
795
- skill.description === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
796
- className: SkillPlazaSection_module_css_default.cardDesc,
797
- children: skill.description
798
- }),
799
- skill.tags.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
800
- className: SkillPlazaSection_module_css_default.cardMarks,
801
- children: skill.tags.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
802
- tone: "quiet",
803
- children: item
804
- }, item))
805
- })
806
- ]
807
- }),
808
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
809
- className: SkillPlazaSection_module_css_default.cardEnd,
810
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
789
+ children: [
790
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
791
+ className: SkillPlazaSection_module_css_default.cardTop,
792
+ children: [
793
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
794
+ className: SkillPlazaSection_module_css_default.cardIcon,
795
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSkillOutlineRegular, { size: 16 })
796
+ }),
797
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
798
+ className: SkillPlazaSection_module_css_default.cardTitle,
799
+ children: skill.name
800
+ }),
801
+ skill.sharedByMe ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
802
+ className: SkillPlazaSection_module_css_default.mark,
803
+ children: t("plazaMine")
804
+ }) : null
805
+ ]
806
+ }),
807
+ skill.description === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
808
+ className: SkillPlazaSection_module_css_default.cardDesc,
809
+ children: skill.description
810
+ }),
811
+ skill.tags.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
812
+ className: SkillPlazaSection_module_css_default.cardMarks,
813
+ children: skill.tags.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
814
+ className: SkillPlazaSection_module_css_default.mark,
815
+ children: item
816
+ }, item))
817
+ }),
818
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
819
+ className: SkillPlazaSection_module_css_default.cardEnd,
820
+ children: [
821
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
811
822
  variant: "outline",
812
823
  size: "sm",
813
824
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutlineRegular, { size: 16 }),
814
825
  disabled: busy,
815
826
  onClick: onInstall,
816
827
  children: t("plazaInstall")
817
- }), skill.sharedByMe ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
828
+ }),
829
+ skill.sharedByMe ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
818
830
  variant: "ghost",
819
831
  size: "sm",
820
832
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 16 }),
821
833
  disabled: busy,
822
834
  onClick: onUnshare,
823
835
  children: t("plazaUnshare")
824
- }) : null]
836
+ }) : null,
837
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
838
+ variant: "outline",
839
+ size: "sm",
840
+ className: SkillPlazaSection_module_css_default.detailButton,
841
+ onClick: () => {
842
+ setOpen(true);
843
+ },
844
+ children: t("plazaShowDetail")
845
+ })
846
+ ]
847
+ }),
848
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
849
+ open,
850
+ onClose: () => {
851
+ setOpen(false);
852
+ },
853
+ title: skill.name,
854
+ closeLabel: t("plazaClose"),
855
+ className: SkillPlazaSection_module_css_default.dialog,
856
+ footer: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
857
+ variant: "outline",
858
+ onClick: () => {
859
+ setOpen(false);
860
+ },
861
+ children: t("plazaClose")
862
+ }),
863
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
864
+ className: SkillPlazaSection_module_css_default.detail,
865
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
866
+ className: SkillPlazaSection_module_css_default.detailRow,
867
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
868
+ className: SkillPlazaSection_module_css_default.detailLabel,
869
+ children: t("plazaDetailUpdated")
870
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", {
871
+ className: SkillPlazaSection_module_css_default.detailValue,
872
+ children: skill.updatedAt
873
+ })]
874
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
875
+ className: SkillPlazaSection_module_css_default.detailRow,
876
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
877
+ className: SkillPlazaSection_module_css_default.detailLabel,
878
+ children: t("plazaDetailBody")
879
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", {
880
+ className: SkillPlazaSection_module_css_default.detailValue,
881
+ children: skill.instruction
882
+ })]
883
+ })]
825
884
  })
826
- ]
827
- })
885
+ })
886
+ ]
828
887
  });
829
888
  }
830
889
  /**
@@ -840,8 +899,8 @@ window.__ModuleLoader__.load({
840
899
  const { t } = props;
841
900
  const [state, setState] = (0, react.useState)({ kind: "loading" });
842
901
  const [tag, setTag] = (0, react.useState)("");
843
- const [query, setQuery] = (0, react.useState)("");
844
902
  const [busy, setBusy] = (0, react.useState)(false);
903
+ const query = props.query ?? "";
845
904
  const [notice, setNotice] = (0, react.useState)(null);
846
905
  const load = (0, react.useCallback)(async (filter) => {
847
906
  try {
@@ -855,8 +914,8 @@ window.__ModuleLoader__.load({
855
914
  }
856
915
  }, []);
857
916
  (0, react.useEffect)(() => {
858
- load({});
859
- }, [load]);
917
+ load({ query });
918
+ }, [load, query]);
860
919
  const refresh = (0, react.useCallback)(async (nextTag = tag, nextQuery = query) => {
861
920
  await load({
862
921
  tag: nextTag,
@@ -882,29 +941,26 @@ window.__ModuleLoader__.load({
882
941
  }, [refresh, t]);
883
942
  if (t === void 0) return null;
884
943
  if (state.kind === "loading") return null;
885
- const head = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
944
+ const head = (count) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
886
945
  className: SkillPlazaSection_module_css_default.head,
887
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
946
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
888
947
  className: SkillPlazaSection_module_css_default.title,
889
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
890
- className: SkillPlazaSection_module_css_default.titleIcon,
891
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSparkleRegular, { size: 18 })
892
- }), t("plazaTitle")]
893
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
894
- className: SkillPlazaSection_module_css_default.intro,
895
- children: t("plazaIntro")
896
- })]
948
+ children: [t("plazaTitle"), count === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
949
+ className: SkillPlazaSection_module_css_default.titleCount,
950
+ children: count
951
+ })]
952
+ })
897
953
  });
898
954
  if (state.kind === "unavailable") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
899
955
  className: SkillPlazaSection_module_css_default.section,
900
- children: [head, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
901
- className: SkillPlazaSection_module_css_default.intro,
956
+ children: [head(null), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
957
+ className: SkillPlazaSection_module_css_default.status,
902
958
  children: t("plazaUnavailable")
903
959
  })]
904
960
  });
905
961
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
906
962
  className: SkillPlazaSection_module_css_default.section,
907
- children: [head, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
963
+ children: [head(null), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
908
964
  className: SkillPlazaSection_module_css_default.empty,
909
965
  role: "alert",
910
966
  children: [
@@ -932,31 +988,20 @@ window.__ModuleLoader__.load({
932
988
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
933
989
  className: SkillPlazaSection_module_css_default.section,
934
990
  children: [
935
- head,
936
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
937
- className: SkillPlazaSection_module_css_default.toolbar,
938
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
939
- className: SkillPlazaSection_module_css_default.search,
940
- placeholder: t("plazaSearch"),
941
- value: query,
942
- onChange: (event) => {
943
- const next = event.target.value;
944
- setQuery(next);
945
- refresh(tag, next);
946
- }
947
- })
948
- }),
991
+ head(listing.skills.length),
949
992
  listing.tags.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
950
993
  className: SkillPlazaSection_module_css_default.tagBar,
951
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
952
- active: tag === "",
994
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
995
+ type: "button",
996
+ className: tag === "" ? SkillPlazaSection_module_css_default.chip + " " + SkillPlazaSection_module_css_default.chipOn : SkillPlazaSection_module_css_default.chip,
953
997
  onClick: () => {
954
998
  setTag("");
955
999
  refresh("", query);
956
1000
  },
957
1001
  children: t("plazaAllTags")
958
- }), listing.tags.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Pill, {
959
- active: tag === item,
1002
+ }), listing.tags.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1003
+ type: "button",
1004
+ className: tag === item ? SkillPlazaSection_module_css_default.chip + " " + SkillPlazaSection_module_css_default.chipOn : SkillPlazaSection_module_css_default.chip,
960
1005
  onClick: () => {
961
1006
  setTag(item);
962
1007
  refresh(item, query);
@@ -980,7 +1025,7 @@ window.__ModuleLoader__.load({
980
1025
  }) : null,
981
1026
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
982
1027
  className: SkillPlazaSection_module_css_default.cards,
983
- children: listing.skills.map((skill) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlazaRow, {
1028
+ children: listing.skills.map((skill) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlazaCard, {
984
1029
  skill,
985
1030
  busy,
986
1031
  t,
@@ -1002,8 +1047,8 @@ window.__ModuleLoader__.load({
1002
1047
  });
1003
1048
  }
1004
1049
  //#endregion
1005
- //#region \0dsh-css:/root/projects/dsh-plugins-plus/packages/dataops-managed/src/client/WanxiangBrand.module.css.mjs
1006
- const css = ".s0HPxG_mark{color:inherit;flex:none;display:block;overflow:visible}.s0HPxG_animatedMark{cursor:pointer}.s0HPxG_mark g{transform-box:fill-box;transform-origin:50%}.s0HPxG_sidebarName{min-width:0;height:24px;color:inherit;align-items:center;gap:6px;display:inline-flex}.s0HPxG_sidebarName>svg:first-child{flex:0 auto;min-width:0;max-width:102px}.s0HPxG_harness{flex:none;display:block;overflow:visible}@keyframes s0HPxG_unit-top{0%,to{transform:translate(0)}50%{transform:translateY(-2px)}}@keyframes s0HPxG_unit-left{0%,to{transform:translate(0)}50%{transform:translate(-2px,1px)}}@keyframes s0HPxG_unit-right{0%,to{transform:translate(0)}50%{transform:translate(2px,1px)}}@keyframes s0HPxG_unit-core{0%,to{transform:translate(0)}50%{transform:translateY(2px)}}@media (hover:hover) and (prefers-reduced-motion:no-preference){.s0HPxG_animatedMark:hover .s0HPxG_unitTop{animation:1.6s ease-in-out infinite s0HPxG_unit-top}.s0HPxG_animatedMark:hover .s0HPxG_unitLeft{animation:1.6s ease-in-out infinite s0HPxG_unit-left}.s0HPxG_animatedMark:hover .s0HPxG_unitRight{animation:1.6s ease-in-out infinite s0HPxG_unit-right}.s0HPxG_animatedMark:hover .s0HPxG_unitCore{animation:1.6s ease-in-out infinite s0HPxG_unit-core}}@media (prefers-reduced-motion:reduce){.s0HPxG_animatedMark,.s0HPxG_animatedMark g{animation:none!important;transform:none!important}}";
1050
+ //#region \0dsh-css:/tmp/wt-rebase/packages/dataops-managed/src/client/WanxiangBrand.module.css.mjs
1051
+ const css = ".kO6bEq_mark{color:inherit;flex:none;display:block;overflow:visible}.kO6bEq_animatedMark{cursor:pointer}.kO6bEq_mark g{transform-box:fill-box;transform-origin:50%}.kO6bEq_sidebarName{min-width:0;height:24px;color:inherit;align-items:center;gap:6px;display:inline-flex}.kO6bEq_sidebarName>svg:first-child{flex:0 auto;min-width:0;max-width:102px}.kO6bEq_harness{flex:none;display:block;overflow:visible}@keyframes kO6bEq_unit-top{0%,to{transform:translate(0)}50%{transform:translateY(-2px)}}@keyframes kO6bEq_unit-left{0%,to{transform:translate(0)}50%{transform:translate(-2px,1px)}}@keyframes kO6bEq_unit-right{0%,to{transform:translate(0)}50%{transform:translate(2px,1px)}}@keyframes kO6bEq_unit-core{0%,to{transform:translate(0)}50%{transform:translateY(2px)}}@media (hover:hover) and (prefers-reduced-motion:no-preference){.kO6bEq_animatedMark:hover .kO6bEq_unitTop{animation:1.6s ease-in-out infinite kO6bEq_unit-top}.kO6bEq_animatedMark:hover .kO6bEq_unitLeft{animation:1.6s ease-in-out infinite kO6bEq_unit-left}.kO6bEq_animatedMark:hover .kO6bEq_unitRight{animation:1.6s ease-in-out infinite kO6bEq_unit-right}.kO6bEq_animatedMark:hover .kO6bEq_unitCore{animation:1.6s ease-in-out infinite kO6bEq_unit-core}}@media (prefers-reduced-motion:reduce){.kO6bEq_animatedMark,.kO6bEq_animatedMark g{animation:none!important;transform:none!important}}";
1007
1052
  const tagId = "@sparkelf/dsh-dataops-managed/WanxiangBrand.module.css";
1008
1053
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
1009
1054
  const tag = document.createElement("style");
@@ -1013,18 +1058,18 @@ window.__ModuleLoader__.load({
1013
1058
  document.head.appendChild(tag);
1014
1059
  }
1015
1060
  var WanxiangBrand_module_css_default = {
1016
- "unitTop": "s0HPxG_unitTop",
1017
- "unit-core": "s0HPxG_unit-core",
1018
- "unitLeft": "s0HPxG_unitLeft",
1019
- "unitRight": "s0HPxG_unitRight",
1020
- "unitCore": "s0HPxG_unitCore",
1021
- "unit-right": "s0HPxG_unit-right",
1022
- "mark": "s0HPxG_mark",
1023
- "sidebarName": "s0HPxG_sidebarName",
1024
- "animatedMark": "s0HPxG_animatedMark",
1025
- "unit-top": "s0HPxG_unit-top",
1026
- "harness": "s0HPxG_harness",
1027
- "unit-left": "s0HPxG_unit-left"
1061
+ "sidebarName": "kO6bEq_sidebarName",
1062
+ "mark": "kO6bEq_mark",
1063
+ "unit-right": "kO6bEq_unit-right",
1064
+ "harness": "kO6bEq_harness",
1065
+ "unit-top": "kO6bEq_unit-top",
1066
+ "unit-core": "kO6bEq_unit-core",
1067
+ "unitLeft": "kO6bEq_unitLeft",
1068
+ "unit-left": "kO6bEq_unit-left",
1069
+ "unitTop": "kO6bEq_unitTop",
1070
+ "unitCore": "kO6bEq_unitCore",
1071
+ "animatedMark": "kO6bEq_animatedMark",
1072
+ "unitRight": "kO6bEq_unitRight"
1028
1073
  };
1029
1074
  //#endregion
1030
1075
  //#region src/client/WanxiangBrand.tsx
@@ -1321,11 +1366,12 @@ window.__ModuleLoader__.load({
1321
1366
  defaultsNeverPublished: "Not published yet",
1322
1367
  defaultsNotAdmin: "Administrators only",
1323
1368
  plazaTitle: "Skill plaza",
1324
- plazaIntro: "Skills other users shared. Install one to use it in this workspace, or share a skill of your own.",
1325
- plazaSearch: "Search skills",
1326
- plazaTagFilter: "Filter by tag",
1327
1369
  plazaAllTags: "All tags",
1328
1370
  plazaMine: "Shared by me",
1371
+ plazaShowDetail: "Details",
1372
+ plazaClose: "Close",
1373
+ plazaDetailUpdated: "Updated",
1374
+ plazaDetailBody: "Skill body",
1329
1375
  plazaInstall: "Install",
1330
1376
  plazaInstalled: "Installed. It is now in your skill list.",
1331
1377
  plazaUnshare: "Stop sharing",
@@ -1334,8 +1380,7 @@ window.__ModuleLoader__.load({
1334
1380
  plazaUnavailable: "The skill plaza is available once this workspace is connected to DataOps.",
1335
1381
  plazaLoadFailed: "The skill plaza could not be loaded. Try again.",
1336
1382
  plazaActionFailed: "The action could not be completed. Try again.",
1337
- plazaRetry: "Try again",
1338
- plazaRefresh: "Refresh"
1383
+ plazaRetry: "Try again"
1339
1384
  };
1340
1385
  /** Chinese managed DataOps Settings copy. */
1341
1386
  const zh = {
@@ -1362,11 +1407,12 @@ window.__ModuleLoader__.load({
1362
1407
  defaultsNeverPublished: "尚未发布",
1363
1408
  defaultsNotAdmin: "仅管理员可发布",
1364
1409
  plazaTitle: "技能广场",
1365
- plazaIntro: "其他用户共享的技能。装载后即可在本工作区使用,也可以把自己的技能共享出去。",
1366
- plazaSearch: "搜索技能",
1367
- plazaTagFilter: "按标签筛选",
1368
1410
  plazaAllTags: "全部标签",
1369
1411
  plazaMine: "我共享的",
1412
+ plazaShowDetail: "详情",
1413
+ plazaClose: "关闭",
1414
+ plazaDetailUpdated: "更新时间",
1415
+ plazaDetailBody: "技能内容",
1370
1416
  plazaInstall: "装载",
1371
1417
  plazaInstalled: "已装载,可在技能列表中使用。",
1372
1418
  plazaUnshare: "取消共享",
@@ -1375,8 +1421,7 @@ window.__ModuleLoader__.load({
1375
1421
  plazaUnavailable: "工作区接入 DataOps 后即可使用技能广场。",
1376
1422
  plazaLoadFailed: "技能广场加载失败,请重试。",
1377
1423
  plazaActionFailed: "操作未完成,请重试。",
1378
- plazaRetry: "重试",
1379
- plazaRefresh: "刷新"
1424
+ plazaRetry: "重试"
1380
1425
  };
1381
1426
  //#endregion
1382
1427
  //#region src/client/index.ts
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["asStatus","refusalReason","useSyncExternalStore","styles","StateDot","Switch","useState","useId","useCallback","SettingsValueField","Button","styles","IconSkillOutlineRegular","Tag","Button","IconDownloadOutlineRegular","IconTrashOutlineRegular","useState","useCallback","IconSparkleRegular","IconRefreshOutlineRegular","Pill","IconShareOutlineRegular","css"],"sources":["../src/client/brand-store.ts","../src/client/model-sync-client.ts","../src/client/workspace-limits-client.ts","../src/client/tool-timeout-client.ts","../src/client/ManagedDataOpsSection.tsx","../src/client/skill-plaza-client.ts","../src/client/SkillPlazaSection.tsx","../src/client/WanxiangBrand.tsx","../src/client/install-branding.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/** Persisted client preference for the managed DataOps shell identity. */\nexport interface WanxiangBrandPreference {\n enabled: boolean\n}\n\n/** Stable local preference key shared by Settings and brand-slot registration. */\nexport const WANXIANG_BRAND_PREFERENCE_KEY = 'dsh.dataops.wanxiangBrand'\n\nfunction initialPreference(): WanxiangBrandPreference {\n if (typeof localStorage === 'undefined') return { enabled: true }\n try {\n const value = JSON.parse(localStorage.getItem(WANXIANG_BRAND_PREFERENCE_KEY) ?? 'null') as unknown\n return typeof value === 'object' && value !== null && 'enabled' in value\n && typeof (value as { enabled?: unknown }).enabled === 'boolean'\n ? { enabled: (value as { enabled: boolean }).enabled }\n : { enabled: true }\n } catch {\n return { enabled: true }\n }\n}\n\nlet preference = initialPreference()\nconst listeners = new Set<() => void>()\n\n/** Observable preference compatible with React's useSyncExternalStore. */\nexport const wanxiangBrandPreference = {\n getSnapshot: (): WanxiangBrandPreference => preference,\n subscribe: (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n}\n\n/** Toggle the Wanxiang shell identity from the DataOps Settings section. */\nexport function setWanxiangBrandEnabled(enabled: boolean): void {\n if (preference.enabled === enabled) return\n preference = { enabled }\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(WANXIANG_BRAND_PREFERENCE_KEY, JSON.stringify(preference))\n } catch {\n // Storage failure must not block an in-memory preference change.\n }\n }\n for (const listener of listeners) listener()\n}\n","/** Same-origin model-sync calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for model sharing. */\nexport const MODEL_SYNC_PATH = '/integrations/dataops/model-sync'\n\n/** One model this workspace holds, and whether it is offered to other users. */\nexport interface ModelSyncModel {\n /** Model id as the settings document stores it. */\n id: string\n /** Whether other users may use it. */\n shared: boolean\n}\n\n/** Model sharing as this workspace currently stands. */\nexport interface ModelSyncStatus {\n /** Whether this workspace follows a publisher. */\n followState: 'following' | 'detached'\n /** Whether an administrator currently shares models. */\n publisherSharing: boolean\n /** How many models this workspace adopts from the publisher. */\n adoptedCount: number\n /** Model ids kept private. */\n privateModelIds: string[]\n /** Publication time, when one is sharing. */\n publishedAt: string | null\n /** Whether the current user may change what this workspace shares. */\n canPublish: boolean\n /** Models this workspace holds. */\n models: ModelSyncModel[]\n /**\n * Settings namespaces this deployment distributes.\n *\n * Present with the models in one response, so the two rows describe the same publication.\n */\n sections: DistributedSection[]\n}\n\n/** One settings namespace the deployment distributes. */\nexport interface DistributedSection {\n /** DSH settings namespace, such as `permission`. */\n ns: string\n /** Whether this workspace still takes the publisher's values for it. */\n followState: 'following' | 'detached'\n /** Whether adoption has applied values for it. */\n applied: boolean\n /** Whether a plugin here owns the namespace, so stopping would affect this workspace. */\n mounted: boolean\n}\n\n/** Narrow a response body to the status shape, rejecting anything else. */\nfunction asStatus(value: unknown): ModelSyncStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n if (record.followState !== 'following' && record.followState !== 'detached') return null\n return {\n followState: record.followState,\n publisherSharing: record.publisherSharing === true,\n adoptedCount: typeof record.adoptedCount === 'number' ? record.adoptedCount : 0,\n privateModelIds: Array.isArray(record.privateModelIds)\n ? record.privateModelIds.filter((id): id is string => typeof id === 'string')\n : [],\n publishedAt: typeof record.publishedAt === 'string' ? record.publishedAt : null,\n canPublish: record.canPublish === true,\n models: Array.isArray(record.models)\n ? record.models.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const model = entry as Record<string, unknown>\n return typeof model.id === 'string' ? [{ id: model.id, shared: model.shared === true }] : []\n })\n : [],\n sections: Array.isArray(record.sections)\n ? record.sections.flatMap((entry): DistributedSection[] => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const section = entry as Record<string, unknown>\n if (typeof section.ns !== 'string' || section.ns === '') return []\n return [{\n ns: section.ns,\n followState: section.followState === 'detached' ? 'detached' : 'following',\n applied: section.applied === true,\n mounted: section.mounted === true,\n }]\n })\n : [],\n }\n}\n\n/**\n * Read the current model sharing state.\n * @returns The status, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchModelSyncStatus(): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync status failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n\n/**\n * Change what this workspace shares.\n * @param body - Action and its parameters.\n * @returns The status after the change, or null when the plugin is not active.\n */\nexport async function postModelSyncAction(body: Record<string, unknown>): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync action failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n","/** Same-origin workspace-limits calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for workspace limits. */\nexport const WORKSPACE_LIMITS_PATH = '/integrations/dataops/workspace-limits'\n\n/** The two byte ceilings, as the panel edits them. */\nexport interface WorkspaceLimits {\n /** Largest file a sidebar download or agent read may carry. */\n fileReadMaxBytes: number\n /** Largest file an upload may carry. */\n uploadMaxBytes: number\n}\n\n/** Limits as this workspace currently holds them. */\nexport interface WorkspaceLimitsStatus {\n limits: WorkspaceLimits\n canWrite: boolean\n readOnlyReason: string | null\n}\n\n/** Narrow a response body to the status, rejecting anything else. */\nfunction asStatus(value: unknown): WorkspaceLimitsStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const limits = record.limits as Record<string, unknown> | undefined\n if (typeof limits !== 'object' || limits === null) return null\n const fileReadMaxBytes = limits.fileReadMaxBytes\n const uploadMaxBytes = limits.uploadMaxBytes\n if (typeof fileReadMaxBytes !== 'number' || typeof uploadMaxBytes !== 'number') return null\n return {\n limits: { fileReadMaxBytes, uploadMaxBytes },\n canWrite: record.canWrite === true,\n readOnlyReason: typeof record.readOnlyReason === 'string' ? record.readOnlyReason : null,\n }\n}\n\nfunction readJson(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null\n}\n\n/**\n * A write DataOps refused, carrying the reason it gave.\n *\n * The message is written for the person who set the value, so the panel shows it as-is rather\n * than replacing it with a generic failure notice.\n */\nexport class WorkspaceLimitsRejection extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkspaceLimitsRejection'\n }\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = readJson(await response.json())\n const error = body?.error\n if (typeof error === 'string' && error.trim() !== '') return error\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return `${fallback} with HTTP ${String(response.status)}`\n}\n\n/**\n * Read the workspace limits the panel shows.\n * @returns The status, or null when the workspace is not connected to DataOps.\n */\nexport async function fetchWorkspaceLimits(): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error(`Workspace limits read failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Store new workspace limits.\n * @param limits - The ceilings to store.\n * @returns The stored status.\n */\nexport async function saveWorkspaceLimits(limits: WorkspaceLimits): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(limits),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) {\n throw new WorkspaceLimitsRejection(await refusalReason(response, 'Workspace limits write refused'))\n }\n if (!response.ok) throw new Error(await refusalReason(response, 'Workspace limits write failed'))\n const body = readJson(await response.json())\n return body === null ? null : asStatus(body)\n}","/** Same-origin tool-call timeout calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for the tool-call timeout. */\nexport const TOOL_TIMEOUT_PATH = '/integrations/dataops/tool-timeout'\n\n/** The two ends a timeout may take, in seconds, matching what the Host enforces. */\nexport const TOOL_TIMEOUT_MIN_SECONDS = 1\nexport const TOOL_TIMEOUT_MAX_SECONDS = 3600\n\n/** The timeout as this workspace currently holds it. */\nexport interface ToolTimeout {\n /** How long one tool call may run before it is abandoned. */\n toolCallTimeoutMs: number\n}\n\n/** Narrow a response body to the timeout, rejecting anything else. */\nfunction asTimeout(value: unknown): ToolTimeout | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const ms = (value as Record<string, unknown>).toolCallTimeoutMs\n return typeof ms === 'number' && Number.isSafeInteger(ms) && ms > 0 ? { toolCallTimeoutMs: ms } : null\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = await response.json() as unknown\n if (typeof body === 'object' && body !== null && !Array.isArray(body)) {\n const error = (body as Record<string, unknown>).error\n if (typeof error === 'string' && error.trim() !== '') return error\n }\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return fallback + ' with HTTP ' + String(response.status)\n}\n\n/**\n * Read the tool-call timeout the panel shows.\n * @returns The timeout, or null when the workspace is not connected.\n */\nexport async function fetchToolTimeout(): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('Tool timeout read failed with HTTP ' + String(response.status))\n return asTimeout(await response.json())\n}\n\n/**\n * Store a new tool-call timeout.\n * @param milliseconds - How long one tool call may run.\n * @returns The stored timeout, or null when the workspace is not connected.\n */\nexport async function saveToolTimeout(milliseconds: number): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toolCallTimeoutMs: milliseconds }),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) throw new Error(await refusalReason(response, 'Tool timeout write refused'))\n if (!response.ok) throw new Error(await refusalReason(response, 'Tool timeout write failed'))\n return asTimeout(await response.json())\n}\n","import { useCallback, useEffect, useId, useState, useSyncExternalStore } from 'react'\nimport { Button, SettingsValueField, StateDot, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { setWanxiangBrandEnabled, wanxiangBrandPreference } from './brand-store.ts'\nimport { fetchModelSyncStatus, postModelSyncAction } from './model-sync-client.ts'\nimport type { ModelSyncStatus } from './model-sync-client.ts'\nimport {\n WorkspaceLimitsRejection,\n fetchWorkspaceLimits,\n saveWorkspaceLimits,\n} from './workspace-limits-client.ts'\nimport type { WorkspaceLimits, WorkspaceLimitsStatus } from './workspace-limits-client.ts'\nimport {\n TOOL_TIMEOUT_MAX_SECONDS,\n TOOL_TIMEOUT_MIN_SECONDS,\n fetchToolTimeout,\n saveToolTimeout,\n} from './tool-timeout-client.ts'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/** Values injected by the DSH Settings slot. */\nexport interface ManagedDataOpsSectionInjected {\n /** Translate one managed DataOps Settings message key. */\n t: (key: keyof typeof en) => string\n}\n\n/** Props accepted by the managed DataOps Settings section. */\nexport type ManagedDataOpsSectionProps = Partial<InjectFace<ManagedDataOpsSectionInjected>>\n\n/** The panel's unit, so a stored byte count survives a round trip through the input. */\nconst BYTES_PER_MIB = 1024 * 1024\n\n/** Render a byte ceiling as the whole MiB the input shows. */\nfunction toMib(bytes: number): string {\n return String(Math.round((bytes / BYTES_PER_MIB) * 100) / 100)\n}\n\n/** Parse a MiB draft into a byte ceiling, or null when it is not a positive count. */\nfunction toBytes(text: string): number | null {\n if (text.trim() === '') return null\n const mib = Number(text)\n if (!Number.isFinite(mib) || mib <= 0) return null\n const bytes = Math.round(mib * BYTES_PER_MIB)\n return Number.isSafeInteger(bytes) && bytes > 0 ? bytes : null\n}\n\n/** Format a stored publication time for the row, or nothing when it never published. */\nfunction publishedText(publishedAt: string): string | null {\n const at = new Date(publishedAt)\n return Number.isNaN(at.getTime()) ? null : at.toLocaleString()\n}\n\n/**\n * The DataOps settings this workspace owns: its connection state, its branding, its file ceilings,\n * and the default configuration it publishes to other workspaces.\n * @param props - Settings slot injection values.\n * @returns The localized managed DataOps section, or nothing before injection.\n */\nexport function ManagedDataOpsSection(props: ManagedDataOpsSectionProps) {\n const { t } = props\n const branding = useSyncExternalStore(\n wanxiangBrandPreference.subscribe,\n wanxiangBrandPreference.getSnapshot,\n wanxiangBrandPreference.getSnapshot,\n )\n if (t === undefined) return null\n\n return (\n <section className={styles.section}>\n <h2 className={styles.title}>{t('title')}</h2>\n <div className={styles.status}>\n <StateDot state=\"done\" />\n <span>{t('managed')}</span>\n </div>\n <BrandingRow t={t} enabled={branding.enabled} />\n <LimitsCard t={t} />\n <TimeoutCard t={t} />\n <DefaultsCard t={t} />\n </section>\n )\n}\n\n/** The branding toggle as one settings row. */\nfunction BrandingRow({ t, enabled }: { t: (key: keyof typeof en) => string; enabled: boolean }) {\n return (\n <div className={styles.card}>\n <div className={styles.row}>\n <span className={styles.label}>{t('brandingTitle')}</span>\n <Switch\n checked={enabled}\n label={t('brandingToggle')}\n onChange={(next) => { setWanxiangBrandEnabled(next) }}\n />\n </div>\n </div>\n )\n}\n\n/** What either card knows about its remote document. */\ntype LoadState<T> =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; status: T }\n | { kind: 'failed' }\n\n/** The one row a card renders while it cannot offer its controls. */\nfunction UnavailableCard({ title, t, state }: {\n title: string\n t: (key: keyof typeof en) => string\n state: 'unavailable' | 'failed'\n}) {\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{title}</h3>\n <div className={styles.status} role={state === 'failed' ? 'alert' : undefined}>\n <StateDot state={state === 'failed' ? 'error' : 'idle'} />\n <span>{state === 'failed' ? t('loadFailed') : t('unavailable')}</span>\n </div>\n </section>\n )\n}\n\n/**\n * The file ceilings DataOps enforces on this workspace.\n *\n * The values live in DataOps and are read through the plugin, which holds the JWT; the panel only\n * ever holds what the administrator is allowed to see.\n * @param props - Translate function from the section.\n * @returns The limits card.\n */\nfunction LimitsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<WorkspaceLimitsStatus>>({ kind: 'loading' })\n const [fileReadMib, setFileReadMib] = useState('')\n const [uploadMib, setUploadMib] = useState('')\n /** The ceilings the draft started from, so Save stays off until one of them changes. */\n const [saved, setSaved] = useState('')\n /** Why DataOps refused the last save, kept beside the draft it refused. */\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const fileReadId = useId()\n const uploadId = useId()\n\n const apply = useCallback((status: WorkspaceLimitsStatus) => {\n setState({ kind: 'ready', status })\n const file = toMib(status.limits.fileReadMaxBytes)\n const upload = toMib(status.limits.uploadMaxBytes)\n setFileReadMib(file)\n setUploadMib(upload)\n setSaved(file + '|' + upload)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchWorkspaceLimits()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const fileReadBytes = toBytes(fileReadMib)\n const uploadBytes = toBytes(uploadMib)\n const writable = state.kind === 'ready' && state.status.canWrite\n const dirty = fileReadMib + '|' + uploadMib !== saved\n const ready = fileReadBytes !== null && uploadBytes !== null && dirty\n\n /** Edit one ceiling, dropping a refusal that no longer describes what is in the field. */\n const edit = useCallback((set: (text: string) => void) => (text: string) => {\n set(text)\n setRefusal(null)\n }, [])\n\n const submit = useCallback(async () => {\n if (fileReadBytes === null || uploadBytes === null) return\n setBusy(true)\n setRefusal(null)\n try {\n const limits: WorkspaceLimits = { fileReadMaxBytes: fileReadBytes, uploadMaxBytes: uploadBytes }\n const status = await saveWorkspaceLimits(limits)\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch (error) {\n // A refused value keeps the fields and the draft, so the user can correct it in place.\n // Anything else left the card unable to describe its own state, so it reports the read.\n if (error instanceof WorkspaceLimitsRejection) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [fileReadBytes, uploadBytes, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('limitsTitle')} t={t} state={state.kind} />\n }\n\n const disabled = busy || !writable\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('limitsTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={fileReadId}\n label={t('limitsFileReadLabel')}\n text={fileReadMib}\n numeric\n invalid={fileReadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setFileReadMib)}\n onReset={() => undefined}\n />\n </div>\n <div>\n <SettingsValueField\n id={uploadId}\n label={t('limitsUploadLabel')}\n text={uploadMib}\n numeric\n invalid={uploadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setUploadMib)}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button variant=\"primary\" size=\"sm\" disabled={disabled || !ready} onClick={() => { void submit() }}>\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * How long one tool call may run before it is abandoned.\n *\n * The value lives in this plugin's own configuration, so it is per workspace and survives a\n * restart. It is edited in seconds because that is the unit an operator reasons in; the plugin\n * stores milliseconds and converts on the way through.\n * @param props - Translate function from the section.\n * @returns The tool-call timeout card.\n */\nfunction TimeoutCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<number>>({ kind: 'loading' })\n const [seconds, setSeconds] = useState('')\n /** The value the draft started from, so Save stays off until it changes. */\n const [saved, setSaved] = useState('')\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const id = useId()\n\n const apply = useCallback((milliseconds: number) => {\n setState({ kind: 'ready', status: milliseconds })\n const text = String(Math.round(milliseconds / 1000))\n setSeconds(text)\n setSaved(text)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchToolTimeout()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const parsed = Number(seconds)\n const valid = seconds.trim() !== '' && Number.isFinite(parsed)\n && parsed >= TOOL_TIMEOUT_MIN_SECONDS && parsed <= TOOL_TIMEOUT_MAX_SECONDS\n const dirty = seconds !== saved\n const disabled = busy\n\n const submit = useCallback(async () => {\n if (!valid) return\n setBusy(true)\n setRefusal(null)\n try {\n const status = await saveToolTimeout(Math.round(parsed * 1000))\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch (error) {\n // A refused value keeps the field and the draft, so the user can correct it in place.\n if (error instanceof Error) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [valid, parsed, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('timeoutTitle')} t={t} state={state.kind} />\n }\n\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('timeoutTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={id}\n label={t('timeoutLabel')}\n text={seconds}\n numeric\n invalid={!valid}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('timeoutInvalid')}\n disabled={disabled}\n onEdit={(text) => { setSeconds(text); setRefusal(null) }}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={disabled || !valid || !dirty}\n onClick={() => { void submit() }}\n >\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * Publish this workspace's configuration as the default other users start from.\n\n * One action rather than a set of controls: the configuration is whatever this workspace already\n * holds, and the button copies it to DataOps.\n * @param props - Translate function from the section.\n * @returns The default-configuration card.\n */\nfunction DefaultsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<ModelSyncStatus>>({ kind: 'loading' })\n const [busy, setBusy] = useState(false)\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchModelSyncStatus()\n setState(status === null ? { kind: 'unavailable' } : { kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const publish = useCallback(async () => {\n setBusy(true)\n try {\n const status = await postModelSyncAction({ action: 'publish-defaults' })\n if (status === null) setState({ kind: 'unavailable' })\n else setState({ kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('defaultsTitle')} t={t} state={state.kind} />\n }\n\n const published = state.status.publishedAt === null\n ? null\n : publishedText(state.status.publishedAt)\n\n // A viewer DataOps does not authorize to publish sees the state without the action, because the\n // permission rule lives in DataOps and the browser must not restate it.\n return (\n <section className={styles.card}>\n <div className={styles.row}>\n <div className={styles.copy}>\n <span className={styles.label}>{t('defaultsTitle')}</span>\n <span className={styles.meta}>\n {published === null\n ? t('defaultsNeverPublished')\n : t('defaultsPublishedAt') + ' · ' + published}\n </span>\n </div>\n {state.status.canPublish\n ? (\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={() => { void publish() }}>\n {busy ? t('defaultsPublishing') : t('defaultsPublish')}\n </Button>\n )\n : <span className={styles.meta}>{t('defaultsNotAdmin')}</span>}\n </div>\n </section>\n )\n}\n","/** Same-origin skill plaza calls from the DataOps skill center section. */\n\n/** Route the plugin's Host half serves for the plaza. */\nexport const SKILL_PLAZA_PATH = '/integrations/dataops/skill-plaza'\n\n/** One plaza entry as the section reads it. */\nexport interface PlazaSkill {\n id: number\n name: string\n description?: string\n instruction: string\n tags: string[]\n sharedByMe: boolean\n updatedAt: string\n}\n\n/** The plaza listing and the tags in use. */\nexport interface PlazaListing {\n skills: PlazaSkill[]\n tags: string[]\n}\n\n/** Narrow an unknown value to a plaza entry. */\nfunction asSkill(value: unknown): PlazaSkill | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n if (typeof row.id !== 'number' || typeof row.name !== 'string') return null\n return {\n id: row.id,\n name: row.name,\n description: typeof row.description === 'string' ? row.description : undefined,\n instruction: typeof row.instruction === 'string' ? row.instruction : '',\n tags: Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : [],\n sharedByMe: row.sharedByMe === true,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }\n}\n\n/** Narrow an unknown value to the listing. */\nfunction asListing(value: unknown): PlazaListing | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n const skills = Array.isArray(row.skills) ? row.skills.flatMap((entry) => asSkill(entry) ?? []) : []\n const tags = Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : []\n return { skills, tags }\n}\n\n/**\n * Read the plaza.\n * @param filter - Optional tag and text filters.\n * @returns The listing, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchPlaza(filter: { tag?: string; query?: string } = {}): Promise<PlazaListing | null> {\n const params = new URLSearchParams()\n if (filter.tag !== undefined && filter.tag !== '') params.set('tag', filter.tag)\n if (filter.query !== undefined && filter.query !== '') params.set('q', filter.query)\n const suffix = params.size === 0 ? '' : '?' + params.toString()\n const response = await fetch(SKILL_PLAZA_PATH + suffix, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza read failed with HTTP ' + String(response.status))\n return asListing(await response.json())\n}\n\n/**\n * Change the plaza.\n * @param body - Action and its parameters.\n * @returns The parsed reply, or null when the plugin is not active.\n */\nexport async function postPlazaAction(body: Record<string, unknown>): Promise<unknown> {\n const response = await fetch(SKILL_PLAZA_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza action failed with HTTP ' + String(response.status))\n return await response.json()\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n Button,\n IconDownloadOutlineRegular,\n IconRefreshOutlineRegular,\n IconShareOutlineRegular,\n IconSkillOutlineRegular,\n IconSparkleRegular,\n IconTrashOutlineRegular,\n Pill,\n Tag,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { fetchPlaza, postPlazaAction, type PlazaListing, type PlazaSkill } from './skill-plaza-client.ts'\nimport styles from './SkillPlazaSection.module.css'\n\n/** Values the skill center passes to a contributed section. */\nexport interface SkillPlazaSectionInjected {\n /** Translate one DataOps plaza message key. */\n t: (key: keyof typeof en) => string\n}\n\n/** Props accepted by the plaza section. */\nexport type SkillPlazaSectionProps = Partial<InjectFace<SkillPlazaSectionInjected>>\n\n/** What the section currently knows. */\ntype PlazaState =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; listing: PlazaListing }\n | { kind: 'failed' }\n\n/**\n * One plaza row, laid out like the skill center's own rows so the section reads as part of the\n * page rather than a panel bolted onto it.\n * @param props - the row's skill, its actions, and the dictionary resolver.\n * @returns the rendered row.\n */\nfunction PlazaRow({ skill, busy, onInstall, onUnshare, t }: {\n skill: PlazaSkill\n busy: boolean\n onInstall: () => void\n onUnshare: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n return (\n <li className={styles.card}>\n <div className={styles.cardHead}>\n <span className={styles.cardIcon}><IconSkillOutlineRegular size={22} /></span>\n <div className={styles.cardMain}>\n <div className={styles.cardTitle}>\n {skill.name}\n {skill.sharedByMe ? <Tag tone=\"info\" className={styles.mine}>{t('plazaMine')}</Tag> : null}\n </div>\n {skill.description === undefined ? null : (\n <div className={styles.cardDesc}>{skill.description}</div>\n )}\n {skill.tags.length === 0 ? null : (\n <div className={styles.cardMarks}>\n {skill.tags.map((item) => <Tag tone=\"quiet\" key={item}>{item}</Tag>)}\n </div>\n )}\n </div>\n <div className={styles.cardEnd}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<IconDownloadOutlineRegular size={16} />}\n disabled={busy}\n onClick={onInstall}\n >\n {t('plazaInstall')}\n </Button>\n {skill.sharedByMe ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<IconTrashOutlineRegular size={16} />}\n disabled={busy}\n onClick={onUnshare}\n >\n {t('plazaUnshare')}\n </Button>\n ) : null}\n </div>\n </div>\n </li>\n )\n}\n\n/**\n * Browse, share, and install skills other users published.\n *\n * The section appears only where this plugin is installed: the skill center renders the slot,\n * and an empty slot renders nothing. Every action goes through this plugin's Host route, so a\n * workspace without DataOps never reaches these calls.\n * @param props - Skill center injection values.\n * @returns The plaza section, or nothing before injection.\n */\nexport function SkillPlazaSection(props: SkillPlazaSectionProps): ReactNode {\n const { t } = props\n const [state, setState] = useState<PlazaState>({ kind: 'loading' })\n const [tag, setTag] = useState('')\n const [query, setQuery] = useState('')\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n\n const load = useCallback(async (filter: { tag?: string; query?: string }) => {\n try {\n const listing = await fetchPlaza(filter)\n setState(listing === null ? { kind: 'unavailable' } : { kind: 'ready', listing })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n useEffect(() => { void load({}) }, [load])\n\n const refresh = useCallback(async (nextTag = tag, nextQuery = query) => {\n await load({ tag: nextTag, query: nextQuery })\n }, [load, tag, query])\n\n const act = useCallback(async (body: Record<string, unknown>, message: string) => {\n setBusy(true)\n setNotice(null)\n try {\n await postPlazaAction(body)\n setNotice(message)\n await refresh()\n } catch {\n setNotice(t === undefined ? null : t('plazaActionFailed'))\n } finally {\n setBusy(false)\n }\n }, [refresh, t])\n\n if (t === undefined) return null\n if (state.kind === 'loading') return null\n\n // The section names itself once; the states below swap only what sits under the heading.\n const head = (\n <div className={styles.head}>\n <h2 className={styles.title}>\n <span className={styles.titleIcon}><IconSparkleRegular size={18} /></span>\n {t('plazaTitle')}\n </h2>\n <p className={styles.intro}>{t('plazaIntro')}</p>\n </div>\n )\n\n if (state.kind === 'unavailable') {\n return <section className={styles.section}>{head}<p className={styles.intro}>{t('plazaUnavailable')}</p></section>\n }\n if (state.kind === 'failed') {\n return (\n <section className={styles.section}>\n {head}\n <div className={styles.empty} role=\"alert\">\n <span className={styles.emptyIcon}><IconSkillOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaLoadFailed')}</p>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void refresh() }}>\n {t('plazaRetry')}\n </Button>\n </div>\n </section>\n )\n }\n\n const { listing } = state\n return (\n <section className={styles.section}>\n {head}\n\n <div className={styles.toolbar}>\n <input\n className={styles.search}\n placeholder={t('plazaSearch')}\n value={query}\n onChange={(event) => {\n const next = event.target.value\n setQuery(next)\n void refresh(tag, next)\n }}\n />\n </div>\n\n {listing.tags.length === 0 ? null : (\n <div className={styles.tagBar}>\n <Pill active={tag === ''} onClick={() => { setTag(''); void refresh('', query) }}>{t('plazaAllTags')}</Pill>\n {listing.tags.map((item) => (\n <Pill key={item} active={tag === item} onClick={() => { setTag(item); void refresh(item, query) }}>\n {item}\n </Pill>\n ))}\n </div>\n )}\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n\n {listing.skills.length === 0 ? (\n <div className={styles.empty}>\n <span className={styles.emptyIcon}><IconShareOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaEmpty')}</p>\n </div>\n ) : null}\n\n <ul className={styles.cards}>\n {listing.skills.map((skill) => (\n <PlazaRow\n key={skill.id}\n skill={skill}\n busy={busy}\n t={t}\n onInstall={() => { void act({ action: 'install', id: skill.id }, t('plazaInstalled')) }}\n onUnshare={() => { void act({ action: 'unshare', id: skill.id }, t('plazaUnshared')) }}\n />\n ))}\n </ul>\n </section>\n )\n}\n\n/** Re-exported so the registration site reads the route from one place. */\nexport { SKILL_PLAZA_PATH } from './skill-plaza-client.ts'\n","import type { CSSProperties } from 'react'\nimport css from './WanxiangBrand.module.css'\n\nconst WORDMARK_VIEWBOX = \"1.64 115.64 5927.36 933.38\"\nconst WORDMARK_RATIO = 5927.36 / 933.38\nconst WORDMARK_PATHS = [\n {\n \"d\": \"M62 765V691H333C326 434 312 123 34 -24C53 -38 77 -62 89 -82C287 28 361 217 390 414H767C752 147 735 37 705 9C693 -2 681 -4 657 -3C631 -3 558 -3 483 4C498 -17 508 -48 509 -70C578 -74 648 -75 686 -72C724 -70 749 -62 772 -36C811 5 829 126 846 450C847 460 847 487 847 487H399C406 556 409 625 411 691H939V765Z\",\n \"transform\": \"translate(0.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M546 474H850V300H546ZM546 542V710H850V542ZM546 231H850V57H546ZM473 781V-73H546V-12H850V-70H926V781ZM214 840V626H52V554H205C170 416 99 258 29 175C41 157 60 127 68 107C122 176 175 287 214 402V-79H287V378C325 329 370 267 389 234L435 295C413 322 322 429 287 464V554H430V626H287V840Z\",\n \"transform\": \"translate(1002.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M443 821C425 782 393 723 368 688L417 664C443 697 477 747 506 793ZM88 793C114 751 141 696 150 661L207 686C198 722 171 776 143 815ZM410 260C387 208 355 164 317 126C279 145 240 164 203 180C217 204 233 231 247 260ZM110 153C159 134 214 109 264 83C200 37 123 5 41 -14C54 -28 70 -54 77 -72C169 -47 254 -8 326 50C359 30 389 11 412 -6L460 43C437 59 408 77 375 95C428 152 470 222 495 309L454 326L442 323H278L300 375L233 387C226 367 216 345 206 323H70V260H175C154 220 131 183 110 153ZM257 841V654H50V592H234C186 527 109 465 39 435C54 421 71 395 80 378C141 411 207 467 257 526V404H327V540C375 505 436 458 461 435L503 489C479 506 391 562 342 592H531V654H327V841ZM629 832C604 656 559 488 481 383C497 373 526 349 538 337C564 374 586 418 606 467C628 369 657 278 694 199C638 104 560 31 451 -22C465 -37 486 -67 493 -83C595 -28 672 41 731 129C781 44 843 -24 921 -71C933 -52 955 -26 972 -12C888 33 822 106 771 198C824 301 858 426 880 576H948V646H663C677 702 689 761 698 821ZM809 576C793 461 769 361 733 276C695 366 667 468 648 576Z\",\n \"transform\": \"translate(2004.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M484 238V-81H550V-40H858V-77H927V238H734V362H958V427H734V537H923V796H395V494C395 335 386 117 282 -37C299 -45 330 -67 344 -79C427 43 455 213 464 362H663V238ZM468 731H851V603H468ZM468 537H663V427H467L468 494ZM550 22V174H858V22ZM167 839V638H42V568H167V349C115 333 67 319 29 309L49 235L167 273V14C167 0 162 -4 150 -4C138 -5 99 -5 56 -4C65 -24 75 -55 77 -73C140 -74 179 -71 203 -59C228 -48 237 -27 237 14V296L352 334L341 403L237 370V568H350V638H237V839Z\",\n \"transform\": \"translate(3006.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M174 630C213 556 252 459 266 399L337 424C323 482 282 578 242 650ZM755 655C730 582 684 480 646 417L711 396C750 456 797 552 834 633ZM52 348V273H459V-79H537V273H949V348H537V698H893V773H105V698H459V348Z\",\n \"transform\": \"translate(4008.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M179 342V-79H255V-25H741V-77H821V342ZM255 48V270H741V48ZM126 426C165 441 224 443 800 474C825 443 846 414 861 388L925 434C873 518 756 641 658 727L599 687C647 644 699 591 745 540L231 516C320 598 410 701 490 811L415 844C336 720 219 593 183 559C149 526 124 505 101 500C110 480 122 442 126 426Z\",\n \"transform\": \"translate(5010.00 940.00) scale(0.96000 -0.94000)\"\n }\n] as const\nconst HARNESS_PATHS = [\n {\n \"d\": \"M132.848 8.93205H134.08V16.137H132.848V8.93205ZM136.5 8.93205H137.732V16.137H136.5V8.93205ZM133.365 13.024V11.99H137.193V13.024H133.365Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M140.397 14.432L140.672 13.453H143.202L143.532 14.432H140.397ZM140.287 16.137H139.055L141.277 8.93205H142.201L142.146 9.74605L140.947 13.915H140.969L140.287 16.137ZM145.039 16.137H143.741L143.07 13.948L143.081 13.937L141.871 9.74605L141.926 8.93205H142.817L145.039 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M146.846 8.93205H149.068C149.852 8.93205 150.443 9.11538 150.839 9.48205C151.235 9.84138 151.433 10.3327 151.433 10.956C151.433 11.22 151.396 11.4657 151.323 11.693C151.249 11.9204 151.125 12.1257 150.949 12.309C150.773 12.4924 150.531 12.65 150.223 12.782C149.922 12.9067 149.541 13.0057 149.079 13.079V13.321H146.846V12.639L148.023 12.485C148.631 12.4044 149.09 12.298 149.398 12.166C149.706 12.034 149.915 11.8764 150.025 11.693C150.135 11.5024 150.19 11.2934 150.19 11.066C150.19 10.6994 150.083 10.417 149.871 10.219C149.658 10.021 149.324 9.92205 148.87 9.92205H146.846V8.93205ZM146.395 8.93205H147.627V16.137H146.395V8.93205ZM151.917 16.093V16.137H150.366L149.024 14.322C148.87 14.1094 148.73 13.9407 148.606 13.816C148.481 13.684 148.345 13.5887 148.199 13.53C148.052 13.464 147.872 13.42 147.66 13.398C147.447 13.3687 147.176 13.3504 146.846 13.343V13.145H149.079C149.233 13.211 149.368 13.2844 149.486 13.365C149.61 13.4457 149.735 13.5447 149.86 13.662C149.992 13.7794 150.138 13.937 150.3 14.135L151.917 16.093Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M153.58 9.57005L153.591 8.93205H154.46L157.584 15.51V16.137H156.704L153.58 9.57005ZM158.024 16.137H156.968L156.88 8.93205H158.024V16.137ZM154.24 16.137H153.096V8.93205H154.152L154.24 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M159.963 8.93205H161.206V16.137H159.963V8.93205ZM160.095 9.96605V8.93205H164.858V9.96605H160.095ZM160.095 16.137V15.103H164.902V16.137H160.095ZM160.095 13.013V11.99H164.374V13.013H160.095Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M169.052 15.257C169.543 15.257 169.895 15.1654 170.108 14.982C170.328 14.7987 170.438 14.5457 170.438 14.223C170.438 14.047 170.405 13.8967 170.339 13.772C170.273 13.6474 170.152 13.5337 169.976 13.431C169.807 13.321 169.558 13.2147 169.228 13.112L168.491 12.881C167.846 12.6757 167.38 12.4044 167.094 12.067C166.808 11.7297 166.665 11.3007 166.665 10.78C166.665 10.428 166.76 10.1017 166.951 9.80105C167.142 9.50038 167.428 9.25838 167.809 9.07505C168.19 8.89172 168.663 8.80005 169.228 8.80005C169.631 8.80005 169.998 8.82938 170.328 8.88805C170.665 8.93938 171.039 9.01638 171.45 9.11905L171.274 10.175C170.834 10.0504 170.442 9.96238 170.097 9.91105C169.76 9.85238 169.463 9.82305 169.206 9.82305C168.737 9.82305 168.403 9.90738 168.205 10.076C168.007 10.2374 167.908 10.439 167.908 10.681C167.908 10.857 167.941 11.0147 168.007 11.154C168.073 11.286 168.19 11.407 168.359 11.517C168.535 11.627 168.784 11.7334 169.107 11.836L169.866 12.078C170.526 12.276 170.995 12.5327 171.274 12.848C171.553 13.156 171.692 13.585 171.692 14.135C171.692 14.5604 171.589 14.9344 171.384 15.257C171.179 15.5797 170.878 15.8327 170.482 16.016C170.093 16.1994 169.609 16.291 169.03 16.291C168.627 16.291 168.212 16.247 167.787 16.159C167.362 16.071 166.9 15.9427 166.401 15.774L166.665 14.718C167.156 14.894 167.6 15.0297 167.996 15.125C168.399 15.213 168.751 15.257 169.052 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M175.809 15.257C176.3 15.257 176.652 15.1654 176.865 14.982C177.085 14.7987 177.195 14.5457 177.195 14.223C177.195 14.047 177.162 13.8967 177.096 13.772C177.03 13.6474 176.909 13.5337 176.733 13.431C176.564 13.321 176.315 13.2147 175.985 13.112L175.248 12.881C174.603 12.6757 174.137 12.4044 173.851 12.067C173.565 11.7297 173.422 11.3007 173.422 10.78C173.422 10.428 173.517 10.1017 173.708 9.80105C173.899 9.50038 174.185 9.25838 174.566 9.07505C174.947 8.89172 175.42 8.80005 175.985 8.80005C176.388 8.80005 176.755 8.82938 177.085 8.88805C177.422 8.93938 177.796 9.01638 178.207 9.11905L178.031 10.175C177.591 10.0504 177.199 9.96238 176.854 9.91105C176.517 9.85238 176.22 9.82305 175.963 9.82305C175.494 9.82305 175.16 9.90738 174.962 10.076C174.764 10.2374 174.665 10.439 174.665 10.681C174.665 10.857 174.698 11.0147 174.764 11.154C174.83 11.286 174.947 11.407 175.116 11.517C175.292 11.627 175.541 11.7334 175.864 11.836L176.623 12.078C177.283 12.276 177.752 12.5327 178.031 12.848C178.31 13.156 178.449 13.585 178.449 14.135C178.449 14.5604 178.346 14.9344 178.141 15.257C177.936 15.5797 177.635 15.8327 177.239 16.016C176.85 16.1994 176.366 16.291 175.787 16.291C175.384 16.291 174.969 16.247 174.544 16.159C174.119 16.071 173.657 15.9427 173.158 15.774L173.422 14.718C173.913 14.894 174.357 15.0297 174.753 15.125C175.156 15.213 175.508 15.257 175.809 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n }\n] as const\n\ninterface MarkProps {\n size: number\n className?: string | undefined\n}\n\nfunction classes(...values: Array<string | undefined>): string {\n return values.filter(Boolean).join(' ')\n}\n\nfunction Cube({ transform, className }: { transform: string; className: string }) {\n return (\n <g transform={transform}>\n <g className={className} stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinejoin=\"round\">\n <path d=\"M12 0 24 7 12 14 0 7 12 0Z\" fill=\"none\" />\n <path d=\"M0 7 12 14v16L0 23V7Z\" fill=\"currentColor\" />\n <path d=\"M12 14 24 7v16L12 30V14Z\" fill=\"currentColor\" fillOpacity=\".18\" />\n </g>\n </g>\n )\n}\n\n/** Four linked data units; its ink follows the host surface through currentColor. */\nexport function WanxiangMark({ size, className, animated = false }: MarkProps & { animated?: boolean }) {\n return (\n <svg\n width={size}\n height={(size * 58) / 54}\n className={classes(css.mark, animated ? css.animatedMark : undefined, className)}\n viewBox=\"0 0 54 58\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <Cube className={css.unitTop} transform=\"translate(15 0)\" />\n <Cube className={css.unitLeft} transform=\"translate(0 16)\" />\n <Cube className={css.unitRight} transform=\"translate(30 16)\" />\n <Cube className={css.unitCore} transform=\"translate(15 27)\" />\n </svg>\n )\n}\n\n/** Approved rounded-Heiti artwork, stored as paths with no runtime font dependency. */\nexport function WanxiangWordmark({ height, accessible = false, className }: {\n height: number\n accessible?: boolean\n className?: string | undefined\n}) {\n const accessibility = accessible\n ? { role: 'img', 'aria-label': '万相数据平台' }\n : { 'aria-hidden': true }\n return (\n <svg\n width={height * WORDMARK_RATIO}\n height={height}\n className={className}\n viewBox={WORDMARK_VIEWBOX}\n {...accessibility}\n >\n <g\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"42\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n paintOrder=\"stroke fill\"\n >\n {WORDMARK_PATHS.map(path => <path key={path.transform} d={path.d} transform={path.transform} />)}\n </g>\n </svg>\n )\n}\n\n/** Exact HARNESS badge artwork extracted from the current DSH BrandWordmark. */\nexport function HarnessBadge({ height = 14 }: { height?: number }) {\n const style = { '--dsw-alias-label-primary-inverted': 'var(--dsw-alias-bg-base)' } as CSSProperties\n return (\n <svg\n width={(height * 53) / 15.5}\n height={height}\n className={css.harness}\n viewBox=\"129 5 53 15.5\"\n style={style}\n aria-hidden=\"true\"\n >\n <rect x=\"129.348\" y=\"5.5\" width=\"52\" height=\"14\" rx=\"2\" fill=\"currentColor\" />\n {HARNESS_PATHS.map((path, index) => <path key={index} d={path.d} fill={path.fill} />)}\n </svg>\n )\n}\n\n/** Expanded-sidebar brand name plus the unchanged official HARNESS badge. */\nexport function WanxiangSidebarName() {\n return <span className={css.sidebarName}><WanxiangWordmark height={16} /><HarnessBadge height={14} /></span>\n}\n\n/** Welcome-page logo with four-unit hover motion. */\nexport function WanxiangHeroMark({ size, className }: MarkProps) {\n return <WanxiangMark size={size} className={className} animated />\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { wanxiangBrandPreference } from './brand-store.ts'\nimport {\n WanxiangHeroMark,\n WanxiangMark,\n WanxiangSidebarName,\n} from './WanxiangBrand.tsx'\n\nconst BRAND_TITLE = '万相数据平台 Harness'\nconst SLOT_PRIORITY = -100\nconst FAVICON_ID = 'dataops-wanxiang-favicon'\nconst FAVICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 54 58\"><style>:root{color:#1b1b1d}@media(prefers-color-scheme:dark){:root{color:#f7f7f8}}</style><g transform=\"translate(15 0)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(0 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(30 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(15 27)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g></svg>`\n\n\nfunction registerWanxiangSlots(ctx: ClientContext): () => void {\n return ctx.slots.inject('sidebar.brand.mark', () =>\n ctx.slots.inject('sidebar.brand.name', () =>\n ctx.slots.inject('conversation.hero.brand.mark', function* () {\n yield ctx.slots.register({\n name: 'sidebar.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangMark)\n yield ctx.slots.register({\n name: 'sidebar.brand.name',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangSidebarName)\n yield ctx.slots.register({\n name: 'conversation.hero.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangHeroMark)\n })))\n}\n\nfunction installFavicon(): HTMLLinkElement {\n const existing = document.getElementById(FAVICON_ID)\n if (existing instanceof HTMLLinkElement) return existing\n const link = document.createElement('link')\n link.id = FAVICON_ID\n link.rel = 'icon'\n link.type = 'image/svg+xml'\n link.href = `data:image/svg+xml,${encodeURIComponent(FAVICON_SVG)}`\n document.head.append(link)\n return link\n}\n\n/** Keep shell slots, browser title, and favicon on the same persisted preference. */\nexport function installWanxiangBranding(ctx: ClientContext): void {\n const originalTitle = document.title\n let disposeSlots: (() => void) | undefined\n let favicon: HTMLLinkElement | undefined\n let titleObserver: MutationObserver | undefined\n\n const stopTitleObserver = (): void => {\n titleObserver?.disconnect()\n titleObserver = undefined\n }\n const keepBrandTitle = (): void => {\n if (document.title !== BRAND_TITLE) document.title = BRAND_TITLE\n if (titleObserver !== undefined) return\n titleObserver = new MutationObserver(() => {\n if (wanxiangBrandPreference.getSnapshot().enabled && document.title !== BRAND_TITLE) {\n document.title = BRAND_TITLE\n }\n })\n titleObserver.observe(document.head, { childList: true, subtree: true, characterData: true })\n }\n\n const synchronize = (): void => {\n const enabled = wanxiangBrandPreference.getSnapshot().enabled\n if (enabled) {\n disposeSlots ??= registerWanxiangSlots(ctx)\n favicon ??= installFavicon()\n keepBrandTitle()\n document.documentElement.dataset.dataopsBrand = 'wanxiang'\n return\n }\n disposeSlots?.()\n disposeSlots = undefined\n favicon?.remove()\n favicon = undefined\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n\n ctx.effect(() => {\n synchronize()\n const unsubscribe = wanxiangBrandPreference.subscribe(synchronize)\n return () => {\n unsubscribe()\n disposeSlots?.()\n favicon?.remove()\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n }, 'dataops-managed: Wanxiang shell branding')\n}\n","/** English managed DataOps Settings copy. */\nexport const en = {\n nav: 'DataOps',\n title: 'DataOps',\n managed: 'Connected to DataOps',\n unavailable: 'DataOps is not connected.',\n loadFailed: 'Loading failed. Try again.',\n brandingTitle: 'Wanxiang branding',\n brandingToggle: 'Wanxiang branding',\n limitsTitle: 'File size limits',\n limitsFileReadLabel: 'Largest file to read (MiB)',\n limitsUploadLabel: 'Largest file to upload (MiB)',\n limitsInvalid: 'Enter a size in MiB.',\n limitsSave: 'Save',\n limitsSaving: 'Saving…',\n timeoutTitle: 'DataOps query timeout',\n timeoutLabel: 'Longest single query (seconds)',\n timeoutInvalid: 'Enter 1 to 3600 seconds.',\n defaultsTitle: 'Default configuration',\n defaultsPublish: 'Publish',\n defaultsPublishing: 'Publishing…',\n defaultsPublishedAt: 'Last published',\n defaultsNeverPublished: 'Not published yet',\n defaultsNotAdmin: 'Administrators only',\n plazaTitle: 'Skill plaza',\n plazaIntro: 'Skills other users shared. Install one to use it in this workspace, or share a skill of your own.',\n plazaSearch: 'Search skills',\n plazaTagFilter: 'Filter by tag',\n plazaAllTags: 'All tags',\n plazaMine: 'Shared by me',\n plazaInstall: 'Install',\n plazaInstalled: 'Installed. It is now in your skill list.',\n plazaUnshare: 'Stop sharing',\n plazaUnshared: 'Removed from the plaza. Users who installed it keep their copy.',\n plazaEmpty: 'No skills have been shared yet.',\n plazaUnavailable: 'The skill plaza is available once this workspace is connected to DataOps.',\n plazaLoadFailed: 'The skill plaza could not be loaded. Try again.',\n plazaActionFailed: 'The action could not be completed. Try again.',\n plazaRetry: 'Try again',\n plazaRefresh: 'Refresh',\n} as const\n\n/** Stable key set shared by every managed DataOps locale. */\nexport type ManagedDataOpsKey = keyof typeof en\n\n/** Chinese managed DataOps Settings copy. */\nexport const zh: Record<ManagedDataOpsKey, string> = {\n nav: 'DataOps',\n title: 'DataOps',\n managed: '已连接 DataOps',\n unavailable: '未连接 DataOps。',\n loadFailed: '加载失败,请重试。',\n brandingTitle: '应用万相品牌',\n brandingToggle: '应用万相品牌',\n limitsTitle: '文件大小限制',\n limitsFileReadLabel: '最大读取文件(MiB)',\n limitsUploadLabel: '最大上传文件(MiB)',\n limitsInvalid: '请输入以 MiB 为单位的大小。',\n limitsSave: '保存',\n timeoutTitle: 'DataOps 查询超时',\n timeoutLabel: '单次查询上限(秒)',\n timeoutInvalid: '请输入 1 到 3600 秒。',\n limitsSaving: '保存中…',\n defaultsTitle: '默认配置',\n defaultsPublish: '发布',\n defaultsPublishing: '发布中…',\n defaultsPublishedAt: '上次发布',\n defaultsNeverPublished: '尚未发布',\n defaultsNotAdmin: '仅管理员可发布',\n plazaTitle: '技能广场',\n plazaIntro: '其他用户共享的技能。装载后即可在本工作区使用,也可以把自己的技能共享出去。',\n plazaSearch: '搜索技能',\n plazaTagFilter: '按标签筛选',\n plazaAllTags: '全部标签',\n plazaMine: '我共享的',\n plazaInstall: '装载',\n plazaInstalled: '已装载,可在技能列表中使用。',\n plazaUnshare: '取消共享',\n plazaUnshared: '已从广场移除;已装载的用户保留其副本。',\n plazaEmpty: '还没有人共享技能。',\n plazaUnavailable: '工作区接入 DataOps 后即可使用技能广场。',\n plazaLoadFailed: '技能广场加载失败,请重试。',\n plazaActionFailed: '操作未完成,请重试。',\n plazaRetry: '重试',\n plazaRefresh: '刷新',\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the skill center's slot declaration so this plugin can contribute to it.\nimport type {} from '@sparkelf/dsh-client-ui-skill-center/client'\nimport { ManagedDataOpsSection } from './ManagedDataOpsSection.tsx'\nimport { SkillPlazaSection } from './SkillPlazaSection.tsx'\nimport { installWanxiangBranding } from './install-branding.tsx'\nimport type { ManagedDataOpsSectionInjected } from './ManagedDataOpsSection.tsx'\nimport { en, zh, type ManagedDataOpsKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'settings.dataops-managed': ManagedDataOpsKey\n }\n}\n\nconst NS = 'settings.dataops-managed'\nconst AUTH_UPDATED_MESSAGE = 'dataops-auth-updated'\nconst MANAGED_AUTH_PATH = '/integrations/dataops/managed-auth'\n\n/** Required client services for the managed DataOps Settings section. */\nexport const inject = ['slots', 'locale']\n\n/**\n * Register localized managed DataOps Settings navigation and content.\n * @param ctx - DSH client context with locale and settings slots.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dataops-managed: settings copy')\n installWanxiangBranding(ctx)\n const t = ctx.locale.bind(NS) as ManagedDataOpsSectionInjected['t']\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'dataops',\n order: 25,\n label: () => t('nav'),\n inject: () => ({ t }),\n }, ManagedDataOpsSection))\n\n /**\n * The skill plaza, contributed to the skill center page.\n *\n * The skill center declares the slot and renders whatever it holds; a profile without this\n * plugin leaves it empty, which is what keeps the plaza out of a deployment that never\n * installed DataOps.\n */\n ctx.slots.inject('skill-center.section', () => ctx.slots.register({\n name: 'skill-center.section',\n id: 'dataops-plaza',\n order: 10,\n inject: () => ({ t }),\n }, SkillPlazaSection))\n\n const synchronizeJwt = async (): Promise<void> => {\n const response = await fetch(new URL(MANAGED_AUTH_PATH, window.location.origin), {\n method: 'POST',\n credentials: 'same-origin',\n })\n if (!response.ok) throw new Error(`DataOps managed JWT synchronization failed with HTTP ${String(response.status)}`)\n }\n const onMessage = (event: MessageEvent<unknown>): void => {\n if (event.source !== window.parent\n || (event.data as { type?: unknown } | null)?.type !== AUTH_UPDATED_MESSAGE) return\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n }\n ctx.effect(() => {\n window.addEventListener('message', onMessage)\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n return () => window.removeEventListener('message', onMessage)\n }, 'dataops-managed: JWT synchronization')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["asStatus","refusalReason","useSyncExternalStore","styles","StateDot","Switch","useState","useId","useCallback","SettingsValueField","Button","useState","styles","IconSkillOutlineRegular","Button","IconDownloadOutlineRegular","IconTrashOutlineRegular","Modal","useCallback","IconRefreshOutlineRegular","IconShareOutlineRegular","css"],"sources":["../src/client/brand-store.ts","../src/client/model-sync-client.ts","../src/client/workspace-limits-client.ts","../src/client/tool-timeout-client.ts","../src/client/ManagedDataOpsSection.tsx","../src/client/skill-plaza-client.ts","../src/client/SkillPlazaSection.tsx","../src/client/WanxiangBrand.tsx","../src/client/install-branding.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/** Persisted client preference for the managed DataOps shell identity. */\nexport interface WanxiangBrandPreference {\n enabled: boolean\n}\n\n/** Stable local preference key shared by Settings and brand-slot registration. */\nexport const WANXIANG_BRAND_PREFERENCE_KEY = 'dsh.dataops.wanxiangBrand'\n\nfunction initialPreference(): WanxiangBrandPreference {\n if (typeof localStorage === 'undefined') return { enabled: true }\n try {\n const value = JSON.parse(localStorage.getItem(WANXIANG_BRAND_PREFERENCE_KEY) ?? 'null') as unknown\n return typeof value === 'object' && value !== null && 'enabled' in value\n && typeof (value as { enabled?: unknown }).enabled === 'boolean'\n ? { enabled: (value as { enabled: boolean }).enabled }\n : { enabled: true }\n } catch {\n return { enabled: true }\n }\n}\n\nlet preference = initialPreference()\nconst listeners = new Set<() => void>()\n\n/** Observable preference compatible with React's useSyncExternalStore. */\nexport const wanxiangBrandPreference = {\n getSnapshot: (): WanxiangBrandPreference => preference,\n subscribe: (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n}\n\n/** Toggle the Wanxiang shell identity from the DataOps Settings section. */\nexport function setWanxiangBrandEnabled(enabled: boolean): void {\n if (preference.enabled === enabled) return\n preference = { enabled }\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(WANXIANG_BRAND_PREFERENCE_KEY, JSON.stringify(preference))\n } catch {\n // Storage failure must not block an in-memory preference change.\n }\n }\n for (const listener of listeners) listener()\n}\n","/** Same-origin model-sync calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for model sharing. */\nexport const MODEL_SYNC_PATH = '/integrations/dataops/model-sync'\n\n/** One model this workspace holds, and whether it is offered to other users. */\nexport interface ModelSyncModel {\n /** Model id as the settings document stores it. */\n id: string\n /** Whether other users may use it. */\n shared: boolean\n}\n\n/** Model sharing as this workspace currently stands. */\nexport interface ModelSyncStatus {\n /** Whether this workspace follows a publisher. */\n followState: 'following' | 'detached'\n /** Whether an administrator currently shares models. */\n publisherSharing: boolean\n /** How many models this workspace adopts from the publisher. */\n adoptedCount: number\n /** Model ids kept private. */\n privateModelIds: string[]\n /** Publication time, when one is sharing. */\n publishedAt: string | null\n /** Whether the current user may change what this workspace shares. */\n canPublish: boolean\n /** Models this workspace holds. */\n models: ModelSyncModel[]\n /**\n * Settings namespaces this deployment distributes.\n *\n * Present with the models in one response, so the two rows describe the same publication.\n */\n sections: DistributedSection[]\n}\n\n/** One settings namespace the deployment distributes. */\nexport interface DistributedSection {\n /** DSH settings namespace, such as `permission`. */\n ns: string\n /** Whether this workspace still takes the publisher's values for it. */\n followState: 'following' | 'detached'\n /** Whether adoption has applied values for it. */\n applied: boolean\n /** Whether a plugin here owns the namespace, so stopping would affect this workspace. */\n mounted: boolean\n}\n\n/** Narrow a response body to the status shape, rejecting anything else. */\nfunction asStatus(value: unknown): ModelSyncStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n if (record.followState !== 'following' && record.followState !== 'detached') return null\n return {\n followState: record.followState,\n publisherSharing: record.publisherSharing === true,\n adoptedCount: typeof record.adoptedCount === 'number' ? record.adoptedCount : 0,\n privateModelIds: Array.isArray(record.privateModelIds)\n ? record.privateModelIds.filter((id): id is string => typeof id === 'string')\n : [],\n publishedAt: typeof record.publishedAt === 'string' ? record.publishedAt : null,\n canPublish: record.canPublish === true,\n models: Array.isArray(record.models)\n ? record.models.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const model = entry as Record<string, unknown>\n return typeof model.id === 'string' ? [{ id: model.id, shared: model.shared === true }] : []\n })\n : [],\n sections: Array.isArray(record.sections)\n ? record.sections.flatMap((entry): DistributedSection[] => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const section = entry as Record<string, unknown>\n if (typeof section.ns !== 'string' || section.ns === '') return []\n return [{\n ns: section.ns,\n followState: section.followState === 'detached' ? 'detached' : 'following',\n applied: section.applied === true,\n mounted: section.mounted === true,\n }]\n })\n : [],\n }\n}\n\n/**\n * Read the current model sharing state.\n * @returns The status, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchModelSyncStatus(): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync status failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n\n/**\n * Change what this workspace shares.\n * @param body - Action and its parameters.\n * @returns The status after the change, or null when the plugin is not active.\n */\nexport async function postModelSyncAction(body: Record<string, unknown>): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync action failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n","/** Same-origin workspace-limits calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for workspace limits. */\nexport const WORKSPACE_LIMITS_PATH = '/integrations/dataops/workspace-limits'\n\n/** The two byte ceilings, as the panel edits them. */\nexport interface WorkspaceLimits {\n /** Largest file a sidebar download or agent read may carry. */\n fileReadMaxBytes: number\n /** Largest file an upload may carry. */\n uploadMaxBytes: number\n}\n\n/** Limits as this workspace currently holds them. */\nexport interface WorkspaceLimitsStatus {\n limits: WorkspaceLimits\n canWrite: boolean\n readOnlyReason: string | null\n}\n\n/** Narrow a response body to the status, rejecting anything else. */\nfunction asStatus(value: unknown): WorkspaceLimitsStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const limits = record.limits as Record<string, unknown> | undefined\n if (typeof limits !== 'object' || limits === null) return null\n const fileReadMaxBytes = limits.fileReadMaxBytes\n const uploadMaxBytes = limits.uploadMaxBytes\n if (typeof fileReadMaxBytes !== 'number' || typeof uploadMaxBytes !== 'number') return null\n return {\n limits: { fileReadMaxBytes, uploadMaxBytes },\n canWrite: record.canWrite === true,\n readOnlyReason: typeof record.readOnlyReason === 'string' ? record.readOnlyReason : null,\n }\n}\n\nfunction readJson(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null\n}\n\n/**\n * A write DataOps refused, carrying the reason it gave.\n *\n * The message is written for the person who set the value, so the panel shows it as-is rather\n * than replacing it with a generic failure notice.\n */\nexport class WorkspaceLimitsRejection extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkspaceLimitsRejection'\n }\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = readJson(await response.json())\n const error = body?.error\n if (typeof error === 'string' && error.trim() !== '') return error\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return `${fallback} with HTTP ${String(response.status)}`\n}\n\n/**\n * Read the workspace limits the panel shows.\n * @returns The status, or null when the workspace is not connected to DataOps.\n */\nexport async function fetchWorkspaceLimits(): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error(`Workspace limits read failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Store new workspace limits.\n * @param limits - The ceilings to store.\n * @returns The stored status.\n */\nexport async function saveWorkspaceLimits(limits: WorkspaceLimits): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(limits),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) {\n throw new WorkspaceLimitsRejection(await refusalReason(response, 'Workspace limits write refused'))\n }\n if (!response.ok) throw new Error(await refusalReason(response, 'Workspace limits write failed'))\n const body = readJson(await response.json())\n return body === null ? null : asStatus(body)\n}","/** Same-origin tool-call timeout calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for the tool-call timeout. */\nexport const TOOL_TIMEOUT_PATH = '/integrations/dataops/tool-timeout'\n\n/** The two ends a timeout may take, in seconds, matching what the Host enforces. */\nexport const TOOL_TIMEOUT_MIN_SECONDS = 1\nexport const TOOL_TIMEOUT_MAX_SECONDS = 3600\n\n/** The timeout as this workspace currently holds it. */\nexport interface ToolTimeout {\n /** How long one tool call may run before it is abandoned. */\n toolCallTimeoutMs: number\n}\n\n/** Narrow a response body to the timeout, rejecting anything else. */\nfunction asTimeout(value: unknown): ToolTimeout | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const ms = (value as Record<string, unknown>).toolCallTimeoutMs\n return typeof ms === 'number' && Number.isSafeInteger(ms) && ms > 0 ? { toolCallTimeoutMs: ms } : null\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = await response.json() as unknown\n if (typeof body === 'object' && body !== null && !Array.isArray(body)) {\n const error = (body as Record<string, unknown>).error\n if (typeof error === 'string' && error.trim() !== '') return error\n }\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return fallback + ' with HTTP ' + String(response.status)\n}\n\n/**\n * Read the tool-call timeout the panel shows.\n * @returns The timeout, or null when the workspace is not connected.\n */\nexport async function fetchToolTimeout(): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('Tool timeout read failed with HTTP ' + String(response.status))\n return asTimeout(await response.json())\n}\n\n/**\n * Store a new tool-call timeout.\n * @param milliseconds - How long one tool call may run.\n * @returns The stored timeout, or null when the workspace is not connected.\n */\nexport async function saveToolTimeout(milliseconds: number): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toolCallTimeoutMs: milliseconds }),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) throw new Error(await refusalReason(response, 'Tool timeout write refused'))\n if (!response.ok) throw new Error(await refusalReason(response, 'Tool timeout write failed'))\n return asTimeout(await response.json())\n}\n","import { useCallback, useEffect, useId, useState, useSyncExternalStore } from 'react'\nimport { Button, SettingsValueField, StateDot, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { setWanxiangBrandEnabled, wanxiangBrandPreference } from './brand-store.ts'\nimport { fetchModelSyncStatus, postModelSyncAction } from './model-sync-client.ts'\nimport type { ModelSyncStatus } from './model-sync-client.ts'\nimport {\n WorkspaceLimitsRejection,\n fetchWorkspaceLimits,\n saveWorkspaceLimits,\n} from './workspace-limits-client.ts'\nimport type { WorkspaceLimits, WorkspaceLimitsStatus } from './workspace-limits-client.ts'\nimport {\n TOOL_TIMEOUT_MAX_SECONDS,\n TOOL_TIMEOUT_MIN_SECONDS,\n fetchToolTimeout,\n saveToolTimeout,\n} from './tool-timeout-client.ts'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/** Values injected by the DSH Settings slot. */\nexport interface ManagedDataOpsSectionInjected {\n /** Translate one managed DataOps Settings message key. */\n t: (key: keyof typeof en) => string\n}\n\n/** Props accepted by the managed DataOps Settings section. */\nexport type ManagedDataOpsSectionProps = Partial<InjectFace<ManagedDataOpsSectionInjected>>\n\n/** The panel's unit, so a stored byte count survives a round trip through the input. */\nconst BYTES_PER_MIB = 1024 * 1024\n\n/** Render a byte ceiling as the whole MiB the input shows. */\nfunction toMib(bytes: number): string {\n return String(Math.round((bytes / BYTES_PER_MIB) * 100) / 100)\n}\n\n/** Parse a MiB draft into a byte ceiling, or null when it is not a positive count. */\nfunction toBytes(text: string): number | null {\n if (text.trim() === '') return null\n const mib = Number(text)\n if (!Number.isFinite(mib) || mib <= 0) return null\n const bytes = Math.round(mib * BYTES_PER_MIB)\n return Number.isSafeInteger(bytes) && bytes > 0 ? bytes : null\n}\n\n/** Format a stored publication time for the row, or nothing when it never published. */\nfunction publishedText(publishedAt: string): string | null {\n const at = new Date(publishedAt)\n return Number.isNaN(at.getTime()) ? null : at.toLocaleString()\n}\n\n/**\n * The DataOps settings this workspace owns: its connection state, its branding, its file ceilings,\n * and the default configuration it publishes to other workspaces.\n * @param props - Settings slot injection values.\n * @returns The localized managed DataOps section, or nothing before injection.\n */\nexport function ManagedDataOpsSection(props: ManagedDataOpsSectionProps) {\n const { t } = props\n const branding = useSyncExternalStore(\n wanxiangBrandPreference.subscribe,\n wanxiangBrandPreference.getSnapshot,\n wanxiangBrandPreference.getSnapshot,\n )\n if (t === undefined) return null\n\n return (\n <section className={styles.section}>\n <h2 className={styles.title}>{t('title')}</h2>\n <div className={styles.status}>\n <StateDot state=\"done\" />\n <span>{t('managed')}</span>\n </div>\n <BrandingRow t={t} enabled={branding.enabled} />\n <LimitsCard t={t} />\n <TimeoutCard t={t} />\n <DefaultsCard t={t} />\n </section>\n )\n}\n\n/** The branding toggle as one settings row. */\nfunction BrandingRow({ t, enabled }: { t: (key: keyof typeof en) => string; enabled: boolean }) {\n return (\n <div className={styles.card}>\n <div className={styles.row}>\n <span className={styles.label}>{t('brandingTitle')}</span>\n <Switch\n checked={enabled}\n label={t('brandingToggle')}\n onChange={(next) => { setWanxiangBrandEnabled(next) }}\n />\n </div>\n </div>\n )\n}\n\n/** What either card knows about its remote document. */\ntype LoadState<T> =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; status: T }\n | { kind: 'failed' }\n\n/** The one row a card renders while it cannot offer its controls. */\nfunction UnavailableCard({ title, t, state }: {\n title: string\n t: (key: keyof typeof en) => string\n state: 'unavailable' | 'failed'\n}) {\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{title}</h3>\n <div className={styles.status} role={state === 'failed' ? 'alert' : undefined}>\n <StateDot state={state === 'failed' ? 'error' : 'idle'} />\n <span>{state === 'failed' ? t('loadFailed') : t('unavailable')}</span>\n </div>\n </section>\n )\n}\n\n/**\n * The file ceilings DataOps enforces on this workspace.\n *\n * The values live in DataOps and are read through the plugin, which holds the JWT; the panel only\n * ever holds what the administrator is allowed to see.\n * @param props - Translate function from the section.\n * @returns The limits card.\n */\nfunction LimitsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<WorkspaceLimitsStatus>>({ kind: 'loading' })\n const [fileReadMib, setFileReadMib] = useState('')\n const [uploadMib, setUploadMib] = useState('')\n /** The ceilings the draft started from, so Save stays off until one of them changes. */\n const [saved, setSaved] = useState('')\n /** Why DataOps refused the last save, kept beside the draft it refused. */\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const fileReadId = useId()\n const uploadId = useId()\n\n const apply = useCallback((status: WorkspaceLimitsStatus) => {\n setState({ kind: 'ready', status })\n const file = toMib(status.limits.fileReadMaxBytes)\n const upload = toMib(status.limits.uploadMaxBytes)\n setFileReadMib(file)\n setUploadMib(upload)\n setSaved(file + '|' + upload)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchWorkspaceLimits()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const fileReadBytes = toBytes(fileReadMib)\n const uploadBytes = toBytes(uploadMib)\n const writable = state.kind === 'ready' && state.status.canWrite\n const dirty = fileReadMib + '|' + uploadMib !== saved\n const ready = fileReadBytes !== null && uploadBytes !== null && dirty\n\n /** Edit one ceiling, dropping a refusal that no longer describes what is in the field. */\n const edit = useCallback((set: (text: string) => void) => (text: string) => {\n set(text)\n setRefusal(null)\n }, [])\n\n const submit = useCallback(async () => {\n if (fileReadBytes === null || uploadBytes === null) return\n setBusy(true)\n setRefusal(null)\n try {\n const limits: WorkspaceLimits = { fileReadMaxBytes: fileReadBytes, uploadMaxBytes: uploadBytes }\n const status = await saveWorkspaceLimits(limits)\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch (error) {\n // A refused value keeps the fields and the draft, so the user can correct it in place.\n // Anything else left the card unable to describe its own state, so it reports the read.\n if (error instanceof WorkspaceLimitsRejection) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [fileReadBytes, uploadBytes, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('limitsTitle')} t={t} state={state.kind} />\n }\n\n const disabled = busy || !writable\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('limitsTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={fileReadId}\n label={t('limitsFileReadLabel')}\n text={fileReadMib}\n numeric\n invalid={fileReadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setFileReadMib)}\n onReset={() => undefined}\n />\n </div>\n <div>\n <SettingsValueField\n id={uploadId}\n label={t('limitsUploadLabel')}\n text={uploadMib}\n numeric\n invalid={uploadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setUploadMib)}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button variant=\"primary\" size=\"sm\" disabled={disabled || !ready} onClick={() => { void submit() }}>\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * How long one tool call may run before it is abandoned.\n *\n * The value lives in this plugin's own configuration, so it is per workspace and survives a\n * restart. It is edited in seconds because that is the unit an operator reasons in; the plugin\n * stores milliseconds and converts on the way through.\n * @param props - Translate function from the section.\n * @returns The tool-call timeout card.\n */\nfunction TimeoutCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<number>>({ kind: 'loading' })\n const [seconds, setSeconds] = useState('')\n /** The value the draft started from, so Save stays off until it changes. */\n const [saved, setSaved] = useState('')\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const id = useId()\n\n const apply = useCallback((milliseconds: number) => {\n setState({ kind: 'ready', status: milliseconds })\n const text = String(Math.round(milliseconds / 1000))\n setSeconds(text)\n setSaved(text)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchToolTimeout()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const parsed = Number(seconds)\n const valid = seconds.trim() !== '' && Number.isFinite(parsed)\n && parsed >= TOOL_TIMEOUT_MIN_SECONDS && parsed <= TOOL_TIMEOUT_MAX_SECONDS\n const dirty = seconds !== saved\n const disabled = busy\n\n const submit = useCallback(async () => {\n if (!valid) return\n setBusy(true)\n setRefusal(null)\n try {\n const status = await saveToolTimeout(Math.round(parsed * 1000))\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch (error) {\n // A refused value keeps the field and the draft, so the user can correct it in place.\n if (error instanceof Error) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [valid, parsed, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('timeoutTitle')} t={t} state={state.kind} />\n }\n\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('timeoutTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={id}\n label={t('timeoutLabel')}\n text={seconds}\n numeric\n invalid={!valid}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('timeoutInvalid')}\n disabled={disabled}\n onEdit={(text) => { setSeconds(text); setRefusal(null) }}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={disabled || !valid || !dirty}\n onClick={() => { void submit() }}\n >\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * Publish this workspace's configuration as the default other users start from.\n\n * One action rather than a set of controls: the configuration is whatever this workspace already\n * holds, and the button copies it to DataOps.\n * @param props - Translate function from the section.\n * @returns The default-configuration card.\n */\nfunction DefaultsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<ModelSyncStatus>>({ kind: 'loading' })\n const [busy, setBusy] = useState(false)\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchModelSyncStatus()\n setState(status === null ? { kind: 'unavailable' } : { kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const publish = useCallback(async () => {\n setBusy(true)\n try {\n const status = await postModelSyncAction({ action: 'publish-defaults' })\n if (status === null) setState({ kind: 'unavailable' })\n else setState({ kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('defaultsTitle')} t={t} state={state.kind} />\n }\n\n const published = state.status.publishedAt === null\n ? null\n : publishedText(state.status.publishedAt)\n\n // A viewer DataOps does not authorize to publish sees the state without the action, because the\n // permission rule lives in DataOps and the browser must not restate it.\n return (\n <section className={styles.card}>\n <div className={styles.row}>\n <div className={styles.copy}>\n <span className={styles.label}>{t('defaultsTitle')}</span>\n <span className={styles.meta}>\n {published === null\n ? t('defaultsNeverPublished')\n : t('defaultsPublishedAt') + ' · ' + published}\n </span>\n </div>\n {state.status.canPublish\n ? (\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={() => { void publish() }}>\n {busy ? t('defaultsPublishing') : t('defaultsPublish')}\n </Button>\n )\n : <span className={styles.meta}>{t('defaultsNotAdmin')}</span>}\n </div>\n </section>\n )\n}\n","/** Same-origin skill plaza calls from the DataOps skill center section. */\n\n/** Route the plugin's Host half serves for the plaza. */\nexport const SKILL_PLAZA_PATH = '/integrations/dataops/skill-plaza'\n\n/** One plaza entry as the section reads it. */\nexport interface PlazaSkill {\n id: number\n name: string\n description?: string\n instruction: string\n tags: string[]\n sharedByMe: boolean\n updatedAt: string\n}\n\n/** The plaza listing and the tags in use. */\nexport interface PlazaListing {\n skills: PlazaSkill[]\n tags: string[]\n}\n\n/** Narrow an unknown value to a plaza entry. */\nfunction asSkill(value: unknown): PlazaSkill | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n if (typeof row.id !== 'number' || typeof row.name !== 'string') return null\n return {\n id: row.id,\n name: row.name,\n description: typeof row.description === 'string' ? row.description : undefined,\n instruction: typeof row.instruction === 'string' ? row.instruction : '',\n tags: Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : [],\n sharedByMe: row.sharedByMe === true,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }\n}\n\n/** Narrow an unknown value to the listing. */\nfunction asListing(value: unknown): PlazaListing | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n const skills = Array.isArray(row.skills) ? row.skills.flatMap((entry) => asSkill(entry) ?? []) : []\n const tags = Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : []\n return { skills, tags }\n}\n\n/**\n * Read the plaza.\n * @param filter - Optional tag and text filters.\n * @returns The listing, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchPlaza(filter: { tag?: string; query?: string } = {}): Promise<PlazaListing | null> {\n const params = new URLSearchParams()\n if (filter.tag !== undefined && filter.tag !== '') params.set('tag', filter.tag)\n if (filter.query !== undefined && filter.query !== '') params.set('q', filter.query)\n const suffix = params.size === 0 ? '' : '?' + params.toString()\n const response = await fetch(SKILL_PLAZA_PATH + suffix, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza read failed with HTTP ' + String(response.status))\n return asListing(await response.json())\n}\n\n/**\n * Change the plaza.\n * @param body - Action and its parameters.\n * @returns The parsed reply, or null when the plugin is not active.\n */\nexport async function postPlazaAction(body: Record<string, unknown>): Promise<unknown> {\n const response = await fetch(SKILL_PLAZA_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza action failed with HTTP ' + String(response.status))\n return await response.json()\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n Button,\n IconDownloadOutlineRegular,\n IconRefreshOutlineRegular,\n IconShareOutlineRegular,\n IconSkillOutlineRegular,\n IconTrashOutlineRegular,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { fetchPlaza, postPlazaAction, type PlazaListing, type PlazaSkill } from './skill-plaza-client.ts'\nimport styles from './SkillPlazaSection.module.css'\n\n/** Values the skill center passes to a contributed section. */\nexport interface SkillPlazaSectionInjected {\n /** Translate one DataOps plaza message key. */\n t: (key: keyof typeof en) => string\n /**\n * The page's current search text.\n *\n * The page draws one search field for every skill it shows, and this section is part of that\n * page. Filtering here with the same text keeps the visible result consistent with the field;\n * drawing a second field would offer the same control twice and filter only half the page.\n */\n query: string\n}\n\n/** Props accepted by the plaza section. */\nexport type SkillPlazaSectionProps = Partial<InjectFace<SkillPlazaSectionInjected>>\n\n/** What the section currently knows. */\ntype PlazaState =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; listing: PlazaListing }\n | { kind: 'failed' }\n\n/**\n * One skill as a card in the plaza grid.\n *\n * A plaza entry carries a name, a description, tags, and its own actions; a full-width row left\n * most of that width empty and forced every entry onto its own line. The card stacks the same\n * parts vertically, so a grid column count can change without the content reflowing into a\n * different shape.\n *\n * @param props - the card's skill, its actions, and the dictionary resolver.\n * @returns the rendered card.\n */\nfunction PlazaCard({ skill, busy, onInstall, onUnshare, t }: {\n skill: PlazaSkill\n busy: boolean\n onInstall: () => void\n onUnshare: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n const [open, setOpen] = useState(false)\n return (\n <li className={styles.card}>\n <div className={styles.cardTop}>\n <span className={styles.cardIcon}><IconSkillOutlineRegular size={16} /></span>\n <div className={styles.cardTitle}>{skill.name}</div>\n {skill.sharedByMe ? <span className={styles.mark}>{t('plazaMine')}</span> : null}\n </div>\n {skill.description === undefined ? null : (\n <div className={styles.cardDesc}>{skill.description}</div>\n )}\n {skill.tags.length === 0 ? null : (\n <div className={styles.cardMarks}>\n {skill.tags.map((item) => <span className={styles.mark} key={item}>{item}</span>)}\n </div>\n )}\n <div className={styles.cardEnd}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<IconDownloadOutlineRegular size={16} />}\n disabled={busy}\n onClick={onInstall}\n >\n {t('plazaInstall')}\n </Button>\n {skill.sharedByMe ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<IconTrashOutlineRegular size={16} />}\n disabled={busy}\n onClick={onUnshare}\n >\n {t('plazaUnshare')}\n </Button>\n ) : null}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className={styles.detailButton}\n onClick={() => { setOpen(true) }}\n >\n {t('plazaShowDetail')}\n </Button>\n </div>\n <Modal\n open={open}\n onClose={() => { setOpen(false) }}\n title={skill.name}\n closeLabel={t('plazaClose')}\n className={styles.dialog as string}\n footer={(\n <Button variant=\"outline\" onClick={() => { setOpen(false) }}>{t('plazaClose')}</Button>\n )}\n >\n <dl className={styles.detail}>\n <div className={styles.detailRow}>\n <dt className={styles.detailLabel}>{t('plazaDetailUpdated')}</dt>\n <dd className={styles.detailValue}>{skill.updatedAt}</dd>\n </div>\n <div className={styles.detailRow}>\n <dt className={styles.detailLabel}>{t('plazaDetailBody')}</dt>\n <dd className={styles.detailValue}>{skill.instruction}</dd>\n </div>\n </dl>\n </Modal>\n </li>\n )\n}\n\n/**\n * Browse, share, and install skills other users published.\n *\n * The section appears only where this plugin is installed: the skill center renders the slot,\n * and an empty slot renders nothing. Every action goes through this plugin's Host route, so a\n * workspace without DataOps never reaches these calls.\n * @param props - Skill center injection values.\n * @returns The plaza section, or nothing before injection.\n */\nexport function SkillPlazaSection(props: SkillPlazaSectionProps): ReactNode {\n const { t } = props\n const [state, setState] = useState<PlazaState>({ kind: 'loading' })\n const [tag, setTag] = useState('')\n const [busy, setBusy] = useState(false)\n // The page owns the search text and filters its own list with it, so this section reads the\n // same value rather than keeping a second copy that could disagree.\n const query = props.query ?? ''\n const [notice, setNotice] = useState<string | null>(null)\n\n const load = useCallback(async (filter: { tag?: string; query?: string }) => {\n try {\n const listing = await fetchPlaza(filter)\n setState(listing === null ? { kind: 'unavailable' } : { kind: 'ready', listing })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n // The page's search text arrives as a prop, so a change to it is what reloads the listing:\n // the plaza filters on the Host, where the whole catalogue is known.\n useEffect(() => { void load({ query }) }, [load, query])\n\n const refresh = useCallback(async (nextTag = tag, nextQuery = query) => {\n await load({ tag: nextTag, query: nextQuery })\n }, [load, tag, query])\n\n const act = useCallback(async (body: Record<string, unknown>, message: string) => {\n setBusy(true)\n setNotice(null)\n try {\n await postPlazaAction(body)\n setNotice(message)\n await refresh()\n } catch {\n setNotice(t === undefined ? null : t('plazaActionFailed'))\n } finally {\n setBusy(false)\n }\n }, [refresh, t])\n\n if (t === undefined) return null\n if (state.kind === 'loading') return null\n\n // The section names itself once; the states below swap only what sits under the heading. The\n // count sits beside the title as the skill center's own group headings carry theirs, so both\n // halves of the page announce a group the same way.\n const head = (count: number | null): ReactNode => (\n <div className={styles.head}>\n <h2 className={styles.title}>\n {t('plazaTitle')}\n {count === null ? null : <span className={styles.titleCount}>{count}</span>}\n </h2>\n </div>\n )\n\n if (state.kind === 'unavailable') {\n return <section className={styles.section}>{head(null)}<p className={styles.status}>{t('plazaUnavailable')}</p></section>\n }\n if (state.kind === 'failed') {\n return (\n <section className={styles.section}>\n {head(null)}\n <div className={styles.empty} role=\"alert\">\n <span className={styles.emptyIcon}><IconSkillOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaLoadFailed')}</p>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void refresh() }}>\n {t('plazaRetry')}\n </Button>\n </div>\n </section>\n )\n }\n\n const { listing } = state\n return (\n <section className={styles.section}>\n {head(listing.skills.length)}\n\n {listing.tags.length === 0 ? null : (\n <div className={styles.tagBar}>\n <button\n type=\"button\"\n className={tag === '' ? styles.chip + ' ' + styles.chipOn : styles.chip}\n onClick={() => { setTag(''); void refresh('', query) }}\n >\n {t('plazaAllTags')}\n </button>\n {listing.tags.map((item) => (\n <button\n type=\"button\"\n key={item}\n className={tag === item ? styles.chip + ' ' + styles.chipOn : styles.chip}\n onClick={() => { setTag(item); void refresh(item, query) }}\n >\n {item}\n </button>\n ))}\n </div>\n )}\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n\n {listing.skills.length === 0 ? (\n <div className={styles.empty}>\n <span className={styles.emptyIcon}><IconShareOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaEmpty')}</p>\n </div>\n ) : null}\n\n <ul className={styles.cards}>\n {listing.skills.map((skill) => (\n <PlazaCard\n key={skill.id}\n skill={skill}\n busy={busy}\n t={t}\n onInstall={() => { void act({ action: 'install', id: skill.id }, t('plazaInstalled')) }}\n onUnshare={() => { void act({ action: 'unshare', id: skill.id }, t('plazaUnshared')) }}\n />\n ))}\n </ul>\n </section>\n )\n}\n\n/** Re-exported so the registration site reads the route from one place. */\nexport { SKILL_PLAZA_PATH } from './skill-plaza-client.ts'\n","import type { CSSProperties } from 'react'\nimport css from './WanxiangBrand.module.css'\n\nconst WORDMARK_VIEWBOX = \"1.64 115.64 5927.36 933.38\"\nconst WORDMARK_RATIO = 5927.36 / 933.38\nconst WORDMARK_PATHS = [\n {\n \"d\": \"M62 765V691H333C326 434 312 123 34 -24C53 -38 77 -62 89 -82C287 28 361 217 390 414H767C752 147 735 37 705 9C693 -2 681 -4 657 -3C631 -3 558 -3 483 4C498 -17 508 -48 509 -70C578 -74 648 -75 686 -72C724 -70 749 -62 772 -36C811 5 829 126 846 450C847 460 847 487 847 487H399C406 556 409 625 411 691H939V765Z\",\n \"transform\": \"translate(0.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M546 474H850V300H546ZM546 542V710H850V542ZM546 231H850V57H546ZM473 781V-73H546V-12H850V-70H926V781ZM214 840V626H52V554H205C170 416 99 258 29 175C41 157 60 127 68 107C122 176 175 287 214 402V-79H287V378C325 329 370 267 389 234L435 295C413 322 322 429 287 464V554H430V626H287V840Z\",\n \"transform\": \"translate(1002.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M443 821C425 782 393 723 368 688L417 664C443 697 477 747 506 793ZM88 793C114 751 141 696 150 661L207 686C198 722 171 776 143 815ZM410 260C387 208 355 164 317 126C279 145 240 164 203 180C217 204 233 231 247 260ZM110 153C159 134 214 109 264 83C200 37 123 5 41 -14C54 -28 70 -54 77 -72C169 -47 254 -8 326 50C359 30 389 11 412 -6L460 43C437 59 408 77 375 95C428 152 470 222 495 309L454 326L442 323H278L300 375L233 387C226 367 216 345 206 323H70V260H175C154 220 131 183 110 153ZM257 841V654H50V592H234C186 527 109 465 39 435C54 421 71 395 80 378C141 411 207 467 257 526V404H327V540C375 505 436 458 461 435L503 489C479 506 391 562 342 592H531V654H327V841ZM629 832C604 656 559 488 481 383C497 373 526 349 538 337C564 374 586 418 606 467C628 369 657 278 694 199C638 104 560 31 451 -22C465 -37 486 -67 493 -83C595 -28 672 41 731 129C781 44 843 -24 921 -71C933 -52 955 -26 972 -12C888 33 822 106 771 198C824 301 858 426 880 576H948V646H663C677 702 689 761 698 821ZM809 576C793 461 769 361 733 276C695 366 667 468 648 576Z\",\n \"transform\": \"translate(2004.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M484 238V-81H550V-40H858V-77H927V238H734V362H958V427H734V537H923V796H395V494C395 335 386 117 282 -37C299 -45 330 -67 344 -79C427 43 455 213 464 362H663V238ZM468 731H851V603H468ZM468 537H663V427H467L468 494ZM550 22V174H858V22ZM167 839V638H42V568H167V349C115 333 67 319 29 309L49 235L167 273V14C167 0 162 -4 150 -4C138 -5 99 -5 56 -4C65 -24 75 -55 77 -73C140 -74 179 -71 203 -59C228 -48 237 -27 237 14V296L352 334L341 403L237 370V568H350V638H237V839Z\",\n \"transform\": \"translate(3006.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M174 630C213 556 252 459 266 399L337 424C323 482 282 578 242 650ZM755 655C730 582 684 480 646 417L711 396C750 456 797 552 834 633ZM52 348V273H459V-79H537V273H949V348H537V698H893V773H105V698H459V348Z\",\n \"transform\": \"translate(4008.00 940.00) scale(0.96000 -0.94000)\"\n },\n {\n \"d\": \"M179 342V-79H255V-25H741V-77H821V342ZM255 48V270H741V48ZM126 426C165 441 224 443 800 474C825 443 846 414 861 388L925 434C873 518 756 641 658 727L599 687C647 644 699 591 745 540L231 516C320 598 410 701 490 811L415 844C336 720 219 593 183 559C149 526 124 505 101 500C110 480 122 442 126 426Z\",\n \"transform\": \"translate(5010.00 940.00) scale(0.96000 -0.94000)\"\n }\n] as const\nconst HARNESS_PATHS = [\n {\n \"d\": \"M132.848 8.93205H134.08V16.137H132.848V8.93205ZM136.5 8.93205H137.732V16.137H136.5V8.93205ZM133.365 13.024V11.99H137.193V13.024H133.365Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M140.397 14.432L140.672 13.453H143.202L143.532 14.432H140.397ZM140.287 16.137H139.055L141.277 8.93205H142.201L142.146 9.74605L140.947 13.915H140.969L140.287 16.137ZM145.039 16.137H143.741L143.07 13.948L143.081 13.937L141.871 9.74605L141.926 8.93205H142.817L145.039 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M146.846 8.93205H149.068C149.852 8.93205 150.443 9.11538 150.839 9.48205C151.235 9.84138 151.433 10.3327 151.433 10.956C151.433 11.22 151.396 11.4657 151.323 11.693C151.249 11.9204 151.125 12.1257 150.949 12.309C150.773 12.4924 150.531 12.65 150.223 12.782C149.922 12.9067 149.541 13.0057 149.079 13.079V13.321H146.846V12.639L148.023 12.485C148.631 12.4044 149.09 12.298 149.398 12.166C149.706 12.034 149.915 11.8764 150.025 11.693C150.135 11.5024 150.19 11.2934 150.19 11.066C150.19 10.6994 150.083 10.417 149.871 10.219C149.658 10.021 149.324 9.92205 148.87 9.92205H146.846V8.93205ZM146.395 8.93205H147.627V16.137H146.395V8.93205ZM151.917 16.093V16.137H150.366L149.024 14.322C148.87 14.1094 148.73 13.9407 148.606 13.816C148.481 13.684 148.345 13.5887 148.199 13.53C148.052 13.464 147.872 13.42 147.66 13.398C147.447 13.3687 147.176 13.3504 146.846 13.343V13.145H149.079C149.233 13.211 149.368 13.2844 149.486 13.365C149.61 13.4457 149.735 13.5447 149.86 13.662C149.992 13.7794 150.138 13.937 150.3 14.135L151.917 16.093Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M153.58 9.57005L153.591 8.93205H154.46L157.584 15.51V16.137H156.704L153.58 9.57005ZM158.024 16.137H156.968L156.88 8.93205H158.024V16.137ZM154.24 16.137H153.096V8.93205H154.152L154.24 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M159.963 8.93205H161.206V16.137H159.963V8.93205ZM160.095 9.96605V8.93205H164.858V9.96605H160.095ZM160.095 16.137V15.103H164.902V16.137H160.095ZM160.095 13.013V11.99H164.374V13.013H160.095Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M169.052 15.257C169.543 15.257 169.895 15.1654 170.108 14.982C170.328 14.7987 170.438 14.5457 170.438 14.223C170.438 14.047 170.405 13.8967 170.339 13.772C170.273 13.6474 170.152 13.5337 169.976 13.431C169.807 13.321 169.558 13.2147 169.228 13.112L168.491 12.881C167.846 12.6757 167.38 12.4044 167.094 12.067C166.808 11.7297 166.665 11.3007 166.665 10.78C166.665 10.428 166.76 10.1017 166.951 9.80105C167.142 9.50038 167.428 9.25838 167.809 9.07505C168.19 8.89172 168.663 8.80005 169.228 8.80005C169.631 8.80005 169.998 8.82938 170.328 8.88805C170.665 8.93938 171.039 9.01638 171.45 9.11905L171.274 10.175C170.834 10.0504 170.442 9.96238 170.097 9.91105C169.76 9.85238 169.463 9.82305 169.206 9.82305C168.737 9.82305 168.403 9.90738 168.205 10.076C168.007 10.2374 167.908 10.439 167.908 10.681C167.908 10.857 167.941 11.0147 168.007 11.154C168.073 11.286 168.19 11.407 168.359 11.517C168.535 11.627 168.784 11.7334 169.107 11.836L169.866 12.078C170.526 12.276 170.995 12.5327 171.274 12.848C171.553 13.156 171.692 13.585 171.692 14.135C171.692 14.5604 171.589 14.9344 171.384 15.257C171.179 15.5797 170.878 15.8327 170.482 16.016C170.093 16.1994 169.609 16.291 169.03 16.291C168.627 16.291 168.212 16.247 167.787 16.159C167.362 16.071 166.9 15.9427 166.401 15.774L166.665 14.718C167.156 14.894 167.6 15.0297 167.996 15.125C168.399 15.213 168.751 15.257 169.052 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M175.809 15.257C176.3 15.257 176.652 15.1654 176.865 14.982C177.085 14.7987 177.195 14.5457 177.195 14.223C177.195 14.047 177.162 13.8967 177.096 13.772C177.03 13.6474 176.909 13.5337 176.733 13.431C176.564 13.321 176.315 13.2147 175.985 13.112L175.248 12.881C174.603 12.6757 174.137 12.4044 173.851 12.067C173.565 11.7297 173.422 11.3007 173.422 10.78C173.422 10.428 173.517 10.1017 173.708 9.80105C173.899 9.50038 174.185 9.25838 174.566 9.07505C174.947 8.89172 175.42 8.80005 175.985 8.80005C176.388 8.80005 176.755 8.82938 177.085 8.88805C177.422 8.93938 177.796 9.01638 178.207 9.11905L178.031 10.175C177.591 10.0504 177.199 9.96238 176.854 9.91105C176.517 9.85238 176.22 9.82305 175.963 9.82305C175.494 9.82305 175.16 9.90738 174.962 10.076C174.764 10.2374 174.665 10.439 174.665 10.681C174.665 10.857 174.698 11.0147 174.764 11.154C174.83 11.286 174.947 11.407 175.116 11.517C175.292 11.627 175.541 11.7334 175.864 11.836L176.623 12.078C177.283 12.276 177.752 12.5327 178.031 12.848C178.31 13.156 178.449 13.585 178.449 14.135C178.449 14.5604 178.346 14.9344 178.141 15.257C177.936 15.5797 177.635 15.8327 177.239 16.016C176.85 16.1994 176.366 16.291 175.787 16.291C175.384 16.291 174.969 16.247 174.544 16.159C174.119 16.071 173.657 15.9427 173.158 15.774L173.422 14.718C173.913 14.894 174.357 15.0297 174.753 15.125C175.156 15.213 175.508 15.257 175.809 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n }\n] as const\n\ninterface MarkProps {\n size: number\n className?: string | undefined\n}\n\nfunction classes(...values: Array<string | undefined>): string {\n return values.filter(Boolean).join(' ')\n}\n\nfunction Cube({ transform, className }: { transform: string; className: string }) {\n return (\n <g transform={transform}>\n <g className={className} stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinejoin=\"round\">\n <path d=\"M12 0 24 7 12 14 0 7 12 0Z\" fill=\"none\" />\n <path d=\"M0 7 12 14v16L0 23V7Z\" fill=\"currentColor\" />\n <path d=\"M12 14 24 7v16L12 30V14Z\" fill=\"currentColor\" fillOpacity=\".18\" />\n </g>\n </g>\n )\n}\n\n/** Four linked data units; its ink follows the host surface through currentColor. */\nexport function WanxiangMark({ size, className, animated = false }: MarkProps & { animated?: boolean }) {\n return (\n <svg\n width={size}\n height={(size * 58) / 54}\n className={classes(css.mark, animated ? css.animatedMark : undefined, className)}\n viewBox=\"0 0 54 58\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <Cube className={css.unitTop} transform=\"translate(15 0)\" />\n <Cube className={css.unitLeft} transform=\"translate(0 16)\" />\n <Cube className={css.unitRight} transform=\"translate(30 16)\" />\n <Cube className={css.unitCore} transform=\"translate(15 27)\" />\n </svg>\n )\n}\n\n/** Approved rounded-Heiti artwork, stored as paths with no runtime font dependency. */\nexport function WanxiangWordmark({ height, accessible = false, className }: {\n height: number\n accessible?: boolean\n className?: string | undefined\n}) {\n const accessibility = accessible\n ? { role: 'img', 'aria-label': '万相数据平台' }\n : { 'aria-hidden': true }\n return (\n <svg\n width={height * WORDMARK_RATIO}\n height={height}\n className={className}\n viewBox={WORDMARK_VIEWBOX}\n {...accessibility}\n >\n <g\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"42\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n paintOrder=\"stroke fill\"\n >\n {WORDMARK_PATHS.map(path => <path key={path.transform} d={path.d} transform={path.transform} />)}\n </g>\n </svg>\n )\n}\n\n/** Exact HARNESS badge artwork extracted from the current DSH BrandWordmark. */\nexport function HarnessBadge({ height = 14 }: { height?: number }) {\n const style = { '--dsw-alias-label-primary-inverted': 'var(--dsw-alias-bg-base)' } as CSSProperties\n return (\n <svg\n width={(height * 53) / 15.5}\n height={height}\n className={css.harness}\n viewBox=\"129 5 53 15.5\"\n style={style}\n aria-hidden=\"true\"\n >\n <rect x=\"129.348\" y=\"5.5\" width=\"52\" height=\"14\" rx=\"2\" fill=\"currentColor\" />\n {HARNESS_PATHS.map((path, index) => <path key={index} d={path.d} fill={path.fill} />)}\n </svg>\n )\n}\n\n/** Expanded-sidebar brand name plus the unchanged official HARNESS badge. */\nexport function WanxiangSidebarName() {\n return <span className={css.sidebarName}><WanxiangWordmark height={16} /><HarnessBadge height={14} /></span>\n}\n\n/** Welcome-page logo with four-unit hover motion. */\nexport function WanxiangHeroMark({ size, className }: MarkProps) {\n return <WanxiangMark size={size} className={className} animated />\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { wanxiangBrandPreference } from './brand-store.ts'\nimport {\n WanxiangHeroMark,\n WanxiangMark,\n WanxiangSidebarName,\n} from './WanxiangBrand.tsx'\n\nconst BRAND_TITLE = '万相数据平台 Harness'\nconst SLOT_PRIORITY = -100\nconst FAVICON_ID = 'dataops-wanxiang-favicon'\nconst FAVICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 54 58\"><style>:root{color:#1b1b1d}@media(prefers-color-scheme:dark){:root{color:#f7f7f8}}</style><g transform=\"translate(15 0)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(0 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(30 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(15 27)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g></svg>`\n\n\nfunction registerWanxiangSlots(ctx: ClientContext): () => void {\n return ctx.slots.inject('sidebar.brand.mark', () =>\n ctx.slots.inject('sidebar.brand.name', () =>\n ctx.slots.inject('conversation.hero.brand.mark', function* () {\n yield ctx.slots.register({\n name: 'sidebar.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangMark)\n yield ctx.slots.register({\n name: 'sidebar.brand.name',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangSidebarName)\n yield ctx.slots.register({\n name: 'conversation.hero.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangHeroMark)\n })))\n}\n\nfunction installFavicon(): HTMLLinkElement {\n const existing = document.getElementById(FAVICON_ID)\n if (existing instanceof HTMLLinkElement) return existing\n const link = document.createElement('link')\n link.id = FAVICON_ID\n link.rel = 'icon'\n link.type = 'image/svg+xml'\n link.href = `data:image/svg+xml,${encodeURIComponent(FAVICON_SVG)}`\n document.head.append(link)\n return link\n}\n\n/** Keep shell slots, browser title, and favicon on the same persisted preference. */\nexport function installWanxiangBranding(ctx: ClientContext): void {\n const originalTitle = document.title\n let disposeSlots: (() => void) | undefined\n let favicon: HTMLLinkElement | undefined\n let titleObserver: MutationObserver | undefined\n\n const stopTitleObserver = (): void => {\n titleObserver?.disconnect()\n titleObserver = undefined\n }\n const keepBrandTitle = (): void => {\n if (document.title !== BRAND_TITLE) document.title = BRAND_TITLE\n if (titleObserver !== undefined) return\n titleObserver = new MutationObserver(() => {\n if (wanxiangBrandPreference.getSnapshot().enabled && document.title !== BRAND_TITLE) {\n document.title = BRAND_TITLE\n }\n })\n titleObserver.observe(document.head, { childList: true, subtree: true, characterData: true })\n }\n\n const synchronize = (): void => {\n const enabled = wanxiangBrandPreference.getSnapshot().enabled\n if (enabled) {\n disposeSlots ??= registerWanxiangSlots(ctx)\n favicon ??= installFavicon()\n keepBrandTitle()\n document.documentElement.dataset.dataopsBrand = 'wanxiang'\n return\n }\n disposeSlots?.()\n disposeSlots = undefined\n favicon?.remove()\n favicon = undefined\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n\n ctx.effect(() => {\n synchronize()\n const unsubscribe = wanxiangBrandPreference.subscribe(synchronize)\n return () => {\n unsubscribe()\n disposeSlots?.()\n favicon?.remove()\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n }, 'dataops-managed: Wanxiang shell branding')\n}\n","/** English managed DataOps Settings copy. */\nexport const en = {\n nav: 'DataOps',\n title: 'DataOps',\n managed: 'Connected to DataOps',\n unavailable: 'DataOps is not connected.',\n loadFailed: 'Loading failed. Try again.',\n brandingTitle: 'Wanxiang branding',\n brandingToggle: 'Wanxiang branding',\n limitsTitle: 'File size limits',\n limitsFileReadLabel: 'Largest file to read (MiB)',\n limitsUploadLabel: 'Largest file to upload (MiB)',\n limitsInvalid: 'Enter a size in MiB.',\n limitsSave: 'Save',\n limitsSaving: 'Saving…',\n timeoutTitle: 'DataOps query timeout',\n timeoutLabel: 'Longest single query (seconds)',\n timeoutInvalid: 'Enter 1 to 3600 seconds.',\n defaultsTitle: 'Default configuration',\n defaultsPublish: 'Publish',\n defaultsPublishing: 'Publishing…',\n defaultsPublishedAt: 'Last published',\n defaultsNeverPublished: 'Not published yet',\n defaultsNotAdmin: 'Administrators only',\n plazaTitle: 'Skill plaza',\n plazaAllTags: 'All tags',\n plazaMine: 'Shared by me',\n plazaShowDetail: 'Details',\n plazaClose: 'Close',\n plazaDetailUpdated: 'Updated',\n plazaDetailBody: 'Skill body',\n plazaInstall: 'Install',\n plazaInstalled: 'Installed. It is now in your skill list.',\n plazaUnshare: 'Stop sharing',\n plazaUnshared: 'Removed from the plaza. Users who installed it keep their copy.',\n plazaEmpty: 'No skills have been shared yet.',\n plazaUnavailable: 'The skill plaza is available once this workspace is connected to DataOps.',\n plazaLoadFailed: 'The skill plaza could not be loaded. Try again.',\n plazaActionFailed: 'The action could not be completed. Try again.',\n plazaRetry: 'Try again',\n} as const\n\n/** Stable key set shared by every managed DataOps locale. */\nexport type ManagedDataOpsKey = keyof typeof en\n\n/** Chinese managed DataOps Settings copy. */\nexport const zh: Record<ManagedDataOpsKey, string> = {\n nav: 'DataOps',\n title: 'DataOps',\n managed: '已连接 DataOps',\n unavailable: '未连接 DataOps。',\n loadFailed: '加载失败,请重试。',\n brandingTitle: '应用万相品牌',\n brandingToggle: '应用万相品牌',\n limitsTitle: '文件大小限制',\n limitsFileReadLabel: '最大读取文件(MiB)',\n limitsUploadLabel: '最大上传文件(MiB)',\n limitsInvalid: '请输入以 MiB 为单位的大小。',\n limitsSave: '保存',\n timeoutTitle: 'DataOps 查询超时',\n timeoutLabel: '单次查询上限(秒)',\n timeoutInvalid: '请输入 1 到 3600 秒。',\n limitsSaving: '保存中…',\n defaultsTitle: '默认配置',\n defaultsPublish: '发布',\n defaultsPublishing: '发布中…',\n defaultsPublishedAt: '上次发布',\n defaultsNeverPublished: '尚未发布',\n defaultsNotAdmin: '仅管理员可发布',\n plazaTitle: '技能广场',\n plazaAllTags: '全部标签',\n plazaMine: '我共享的',\n plazaShowDetail: '详情',\n plazaClose: '关闭',\n plazaDetailUpdated: '更新时间',\n plazaDetailBody: '技能内容',\n plazaInstall: '装载',\n plazaInstalled: '已装载,可在技能列表中使用。',\n plazaUnshare: '取消共享',\n plazaUnshared: '已从广场移除;已装载的用户保留其副本。',\n plazaEmpty: '还没有人共享技能。',\n plazaUnavailable: '工作区接入 DataOps 后即可使用技能广场。',\n plazaLoadFailed: '技能广场加载失败,请重试。',\n plazaActionFailed: '操作未完成,请重试。',\n plazaRetry: '重试',\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the skill center's slot declaration so this plugin can contribute to it.\nimport type {} from '@sparkelf/dsh-client-ui-skill-center/client'\nimport { ManagedDataOpsSection } from './ManagedDataOpsSection.tsx'\nimport { SkillPlazaSection } from './SkillPlazaSection.tsx'\nimport { installWanxiangBranding } from './install-branding.tsx'\nimport type { ManagedDataOpsSectionInjected } from './ManagedDataOpsSection.tsx'\nimport { en, zh, type ManagedDataOpsKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'settings.dataops-managed': ManagedDataOpsKey\n }\n}\n\nconst NS = 'settings.dataops-managed'\nconst AUTH_UPDATED_MESSAGE = 'dataops-auth-updated'\nconst MANAGED_AUTH_PATH = '/integrations/dataops/managed-auth'\n\n/** Required client services for the managed DataOps Settings section. */\nexport const inject = ['slots', 'locale']\n\n/**\n * Register localized managed DataOps Settings navigation and content.\n * @param ctx - DSH client context with locale and settings slots.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dataops-managed: settings copy')\n installWanxiangBranding(ctx)\n const t = ctx.locale.bind(NS) as ManagedDataOpsSectionInjected['t']\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'dataops',\n order: 25,\n label: () => t('nav'),\n inject: () => ({ t }),\n }, ManagedDataOpsSection))\n\n /**\n * The skill plaza, contributed to the skill center page.\n *\n * The skill center declares the slot and renders whatever it holds; a profile without this\n * plugin leaves it empty, which is what keeps the plaza out of a deployment that never\n * installed DataOps.\n */\n ctx.slots.inject('skill-center.section', () => ctx.slots.register({\n name: 'skill-center.section',\n id: 'dataops-plaza',\n order: 10,\n inject: () => ({ t }),\n }, SkillPlazaSection))\n\n const synchronizeJwt = async (): Promise<void> => {\n const response = await fetch(new URL(MANAGED_AUTH_PATH, window.location.origin), {\n method: 'POST',\n credentials: 'same-origin',\n })\n if (!response.ok) throw new Error(`DataOps managed JWT synchronization failed with HTTP ${String(response.status)}`)\n }\n const onMessage = (event: MessageEvent<unknown>): void => {\n if (event.source !== window.parent\n || (event.data as { type?: unknown } | null)?.type !== AUTH_UPDATED_MESSAGE) return\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n }\n ctx.effect(() => {\n window.addEventListener('message', onMessage)\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n return () => window.removeEventListener('message', onMessage)\n }, 'dataops-managed: JWT synchronization')\n}\n"],"mappings":";;;;;;;;;;;EAMA,MAAa,gCAAgC;EAE7C,SAAS,oBAA6C;GACpD,IAAI,OAAO,iBAAiB,aAAa,OAAO,EAAE,SAAS,KAAK;GAChE,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,aAAa,QAAA,2BAAqC,KAAK,MAAM;IACtF,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,SAC9D,OAAQ,MAAgC,YAAY,YACrD,EAAE,SAAU,MAA+B,QAAQ,IACnD,EAAE,SAAS,KAAK;GACtB,QAAQ;IACN,OAAO,EAAE,SAAS,KAAK;GACzB;EACF;EAEA,IAAI,aAAa,kBAAkB;EACnC,MAAM,4BAAY,IAAI,IAAgB;;EAGtC,MAAa,0BAA0B;GACrC,mBAA4C;GAC5C,YAAY,aAAuC;IACjD,UAAU,IAAI,QAAQ;IACtB,aAAa;KAAE,UAAU,OAAO,QAAQ;IAAE;GAC5C;EACF;;EAGA,SAAgB,wBAAwB,SAAwB;GAC9D,IAAI,WAAW,YAAY,SAAS;GACpC,aAAa,EAAE,QAAQ;GACvB,IAAI,OAAO,iBAAiB,aAC1B,IAAI;IACF,aAAa,QAAQ,+BAA+B,KAAK,UAAU,UAAU,CAAC;GAChF,QAAQ,CAER;GAEF,KAAK,MAAM,YAAY,WAAW,SAAS;EAC7C;;;;;EC1CA,MAAa,kBAAkB;;EA+C/B,SAASA,WAAS,OAAwC;GACxD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO;GAChF,MAAM,SAAS;GACf,IAAI,OAAO,gBAAgB,eAAe,OAAO,gBAAgB,YAAY,OAAO;GACpF,OAAO;IACL,aAAa,OAAO;IACpB,kBAAkB,OAAO,qBAAqB;IAC9C,cAAc,OAAO,OAAO,iBAAiB,WAAW,OAAO,eAAe;IAC9E,iBAAiB,MAAM,QAAQ,OAAO,eAAe,IACjD,OAAO,gBAAgB,QAAQ,OAAqB,OAAO,OAAO,QAAQ,IAC1E,CAAC;IACL,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;IAC3E,YAAY,OAAO,eAAe;IAClC,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAC/B,OAAO,OAAO,SAAS,UAAU;KAC/B,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,CAAC;KACzD,MAAM,QAAQ;KACd,OAAO,OAAO,MAAM,OAAO,WAAW,CAAC;MAAE,IAAI,MAAM;MAAI,QAAQ,MAAM,WAAW;KAAK,CAAC,IAAI,CAAC;IAC7F,CAAC,IACD,CAAC;IACL,UAAU,MAAM,QAAQ,OAAO,QAAQ,IACnC,OAAO,SAAS,SAAS,UAAgC;KACvD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC;KACjF,MAAM,UAAU;KAChB,IAAI,OAAO,QAAQ,OAAO,YAAY,QAAQ,OAAO,IAAI,OAAO,CAAC;KACjE,OAAO,CAAC;MACN,IAAI,QAAQ;MACZ,aAAa,QAAQ,gBAAgB,aAAa,aAAa;MAC/D,SAAS,QAAQ,YAAY;MAC7B,SAAS,QAAQ,YAAY;KAC/B,CAAC;IACH,CAAC,IACD,CAAC;GACP;EACF;;;;;EAMA,eAAsB,uBAAwD;GAC5E,MAAM,WAAW,MAAM,MAAM,iBAAiB,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;GACzF,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,wCAAwC,OAAO,SAAS,MAAM,CAAC;GACjG,OAAOA,WAAS,MAAM,SAAS,KAAK,CAAC;EACvC;;;;;;EAOA,eAAsB,oBAAoB,MAAgE;GACxG,MAAM,WAAW,MAAM,MAAM,iBAAiB;IAC5C,QAAQ;IACR,SAAS;KAAE,gBAAgB;KAAoB,QAAQ;IAAmB;IAC1E,MAAM,KAAK,UAAU,IAAI;GAC3B,CAAC;GACD,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,wCAAwC,OAAO,SAAS,MAAM,CAAC;GACjG,OAAOA,WAAS,MAAM,SAAS,KAAK,CAAC;EACvC;;;;;EC5GA,MAAa,wBAAwB;;EAkBrC,SAAS,SAAS,OAA8C;GAC9D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO;GAChF,MAAM,SAAS;GACf,MAAM,SAAS,OAAO;GACtB,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM,OAAO;GAC1D,MAAM,mBAAmB,OAAO;GAChC,MAAM,iBAAiB,OAAO;GAC9B,IAAI,OAAO,qBAAqB,YAAY,OAAO,mBAAmB,UAAU,OAAO;GACvF,OAAO;IACL,QAAQ;KAAE;KAAkB;IAAe;IAC3C,UAAU,OAAO,aAAa;IAC9B,gBAAgB,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;GACtF;EACF;EAEA,SAAS,SAAS,OAAgD;GAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IACtE,QACA;EACN;;;;;;;EAQA,IAAa,2BAAb,cAA8C,MAAM;GAClD,YAAY,SAAiB;IAC3B,MAAM,OAAO;IACb,KAAK,OAAO;GACd;EACF;;EAGA,eAAeC,gBAAc,UAAoB,UAAmC;GAClF,IAAI;IAEF,MAAM,QADO,SAAS,MAAM,SAAS,KAAK,CACzB,CAAC,EAAE;IACpB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;GAC/D,QAAQ,CAER;GACA,OAAO,GAAG,SAAS,aAAa,OAAO,SAAS,MAAM;EACxD;;;;;EAMA,eAAsB,uBAA8D;GAClF,MAAM,WAAW,MAAM,MAAM,uBAAuB,EAAE,aAAa,cAAc,CAAC;GAClF,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,0CAA0C,OAAO,SAAS,MAAM,GAAG;GACrG,OAAO,SAAS,MAAM,SAAS,KAAK,CAAC;EACvC;;;;;;EAOA,eAAsB,oBAAoB,QAAgE;GACxG,MAAM,WAAW,MAAM,MAAM,uBAAuB;IAClD,QAAQ;IACR,aAAa;IACb,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU,MAAM;GAC7B,CAAC;GACD,IAAI,SAAS,WAAW,KAAK,OAAO;GAEpC,IAAI,SAAS,WAAW,KACtB,MAAM,IAAI,yBAAyB,MAAMA,gBAAc,UAAU,gCAAgC,CAAC;GAEpG,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,MAAMA,gBAAc,UAAU,+BAA+B,CAAC;GAChG,MAAM,OAAO,SAAS,MAAM,SAAS,KAAK,CAAC;GAC3C,OAAO,SAAS,OAAO,OAAO,SAAS,IAAI;EAC7C;;;;;EC/FA,MAAa,oBAAoB;;EAajC,SAAS,UAAU,OAAoC;GACrD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO;GAChF,MAAM,KAAM,MAAkC;GAC9C,OAAO,OAAO,OAAO,YAAY,OAAO,cAAc,EAAE,KAAK,KAAK,IAAI,EAAE,mBAAmB,GAAG,IAAI;EACpG;;EAGA,eAAe,cAAc,UAAoB,UAAmC;GAClF,IAAI;IACF,MAAM,OAAO,MAAM,SAAS,KAAK;IACjC,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAQ,IAAI,GAAG;KACrE,MAAM,QAAS,KAAiC;KAChD,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;IAC/D;GACF,QAAQ,CAER;GACA,OAAO,WAAW,gBAAgB,OAAO,SAAS,MAAM;EAC1D;;;;;EAMA,eAAsB,mBAAgD;GACpE,MAAM,WAAW,MAAM,MAAM,mBAAmB,EAAE,aAAa,cAAc,CAAC;GAC9E,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,wCAAwC,OAAO,SAAS,MAAM,CAAC;GACjG,OAAO,UAAU,MAAM,SAAS,KAAK,CAAC;EACxC;;;;;;EAOA,eAAsB,gBAAgB,cAAmD;GACvF,MAAM,WAAW,MAAM,MAAM,mBAAmB;IAC9C,QAAQ;IACR,aAAa;IACb,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU,EAAE,mBAAmB,aAAa,CAAC;GAC1D,CAAC;GACD,IAAI,SAAS,WAAW,KAAK,OAAO;GAEpC,IAAI,SAAS,WAAW,KAAK,MAAM,IAAI,MAAM,MAAM,cAAc,UAAU,4BAA4B,CAAC;GACxG,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,MAAM,cAAc,UAAU,2BAA2B,CAAC;GAC5F,OAAO,UAAU,MAAM,SAAS,KAAK,CAAC;EACxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECjCA,MAAM,gBAAgB;;EAGtB,SAAS,MAAM,OAAuB;GACpC,OAAO,OAAO,KAAK,MAAO,QAAQ,gBAAiB,GAAG,IAAI,GAAG;EAC/D;;EAGA,SAAS,QAAQ,MAA6B;GAC5C,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO;GAC/B,MAAM,MAAM,OAAO,IAAI;GACvB,IAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,GAAG,OAAO;GAC9C,MAAM,QAAQ,KAAK,MAAM,MAAM,aAAa;GAC5C,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,QAAQ;EAC5D;;EAGA,SAAS,cAAc,aAAoC;GACzD,MAAM,KAAK,IAAI,KAAK,WAAW;GAC/B,OAAO,OAAO,MAAM,GAAG,QAAQ,CAAC,IAAI,OAAO,GAAG,eAAe;EAC/D;;;;;;;EAQA,SAAgB,sBAAsB,OAAmC;GACvE,MAAM,EAAE,MAAM;GACd,MAAM,YAAA,GAAWC,MAAAA,qBAAAA,CACf,wBAAwB,WACxB,wBAAwB,aACxB,wBAAwB,WAC1B;GACA,IAAI,MAAM,KAAA,GAAW,OAAO;GAE5B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,yCAAO;IAA3B,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAWA,yCAAO;MAAQ,UAAA,EAAE,OAAO;KAAM,CAAA;KAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yCAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,UAAD,EAAU,OAAM,OAAQ,CAAA,GACxB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,SAAS,EAAQ,CAAA,CACvB;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAgB;MAAG,SAAS,SAAS;KAAU,CAAA;KAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD,EAAe,EAAI,CAAA;KACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD,EAAgB,EAAI,CAAA;KACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD,EAAiB,EAAI,CAAA;IACd;;EAEb;;EAGA,SAAS,YAAY,EAAE,GAAG,WAAsE;GAC9F,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWD,yCAAO;IACrB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,yCAAO;KAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,yCAAO;MAAQ,UAAA,EAAE,eAAe;KAAQ,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;MACE,SAAS;MACT,OAAO,EAAE,gBAAgB;MACzB,WAAW,SAAS;OAAE,wBAAwB,IAAI;MAAE;KACrD,CAAA,CACE;;GACF,CAAA;EAET;;EAUA,SAAS,gBAAgB,EAAE,OAAO,GAAG,SAIlC;GACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWF,yCAAO;IAA3B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;KAAI,WAAWA,yCAAO;KAAU,UAAA;IAAU,CAAA,GAC1C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,yCAAO;KAAQ,MAAM,UAAU,WAAW,UAAU,KAAA;KAApE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,UAAD,EAAU,OAAO,UAAU,WAAW,UAAU,OAAS,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,UAAU,WAAW,EAAE,YAAY,IAAI,EAAE,aAAa,EAAQ,CAAA,CAClE;IACE,CAAA,CAAA;;EAEb;;;;;;;;;EAUA,SAAS,WAAW,EAAE,KAA8C;GAClE,MAAM,CAAC,OAAO,aAAA,GAAYE,MAAAA,SAAAA,CAA2C,EAAE,MAAM,UAAU,CAAC;GACxF,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,EAAE;GACjD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,EAAE;;GAE7C,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;;GAErC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAwB,IAAI;GAC1D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,cAAA,GAAaC,MAAAA,MAAAA,CAAM;GACzB,MAAM,YAAA,GAAWA,MAAAA,MAAAA,CAAM;GAEvB,MAAM,SAAA,GAAQC,MAAAA,YAAAA,EAAa,WAAkC;IAC3D,SAAS;KAAE,MAAM;KAAS;IAAO,CAAC;IAClC,MAAM,OAAO,MAAM,OAAO,OAAO,gBAAgB;IACjD,MAAM,SAAS,MAAM,OAAO,OAAO,cAAc;IACjD,eAAe,IAAI;IACnB,aAAa,MAAM;IACnB,SAAS,OAAO,MAAM,MAAM;IAC5B,WAAW,IAAI;GACjB,GAAG,CAAC,CAAC;GAEL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAAY;IACtC,IAAI;KACF,MAAM,SAAS,MAAM,qBAAqB;KAC1C,IAAI,WAAW,MAAM,SAAS,EAAE,MAAM,cAAc,CAAC;UAChD,MAAM,MAAM;IACnB,QAAQ;KACN,SAAS,EAAE,MAAM,SAAS,CAAC;IAC7B;GACF,GAAG,CAAC,KAAK,CAAC;GAEV,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,QAAa;GAAE,GAAG,CAAC,OAAO,CAAC;GAE7C,MAAM,gBAAgB,QAAQ,WAAW;GACzC,MAAM,cAAc,QAAQ,SAAS;GACrC,MAAM,WAAW,MAAM,SAAS,WAAW,MAAM,OAAO;GACxD,MAAM,QAAQ,cAAc,MAAM,cAAc;GAChD,MAAM,QAAQ,kBAAkB,QAAQ,gBAAgB,QAAQ;;GAGhE,MAAM,QAAA,GAAOA,MAAAA,YAAAA,EAAa,SAAiC,SAAiB;IAC1E,IAAI,IAAI;IACR,WAAW,IAAI;GACjB,GAAG,CAAC,CAAC;GAEL,MAAM,UAAA,GAASA,MAAAA,YAAAA,CAAY,YAAY;IACrC,IAAI,kBAAkB,QAAQ,gBAAgB,MAAM;IACpD,QAAQ,IAAI;IACZ,WAAW,IAAI;IACf,IAAI;KAEF,MAAM,SAAS,MAAM,oBAAoB;MADP,kBAAkB;MAAe,gBAAgB;KACrC,CAAC;KAC/C,IAAI,WAAW,MAAM,SAAS,EAAE,MAAM,cAAc,CAAC;UAChD,MAAM,MAAM;IACnB,SAAS,OAAO;KAGd,IAAI,iBAAiB,0BAA0B,WAAW,MAAM,OAAO;UAClE,SAAS,EAAE,MAAM,SAAS,CAAC;IAClC,UAAU;KACR,QAAQ,KAAK;IACf;GACF,GAAG;IAAC;IAAe;IAAa;GAAK,CAAC;GAEtC,IAAI,MAAM,SAAS,WAAW,OAAO;GACrC,IAAI,MAAM,SAAS,SACjB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;IAAiB,OAAO,EAAE,aAAa;IAAM;IAAG,OAAO,MAAM;GAAO,CAAA;GAG7E,MAAM,WAAW,QAAQ,CAAC;GAC1B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWL,yCAAO;IAA3B,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAWA,yCAAO;MAAU,UAAA,EAAE,aAAa;KAAM,CAAA;KACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yCAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,oBAAD;OACE,IAAI;OACJ,OAAO,EAAE,qBAAqB;OAC9B,MAAM;OACN,SAAA;OACA,SAAS,kBAAkB;OAC3B,YAAY;OACZ,iBAAgB;OAChB,YAAW;OACX,cAAc,EAAE,eAAe;OACrB;OACV,QAAQ,KAAK,cAAc;OAC3B,eAAe,KAAA;MAChB,CAAA,EACE,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,oBAAD;OACE,IAAI;OACJ,OAAO,EAAE,mBAAmB;OAC5B,MAAM;OACN,SAAA;OACA,SAAS,gBAAgB;OACzB,YAAY;OACZ,iBAAgB;OAChB,YAAW;OACX,cAAc,EAAE,eAAe;OACrB;OACV,QAAQ,KAAK,YAAY;OACzB,eAAe,KAAA;MAChB,CAAA,EACE,CAAA,CACF;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWN,yCAAO;MAAvB,UAAA,CACG,YAAY,OACT,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,yCAAO;OAAS,MAAK;OAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,UAAD,EAAU,OAAM,QAAS,CAAA,GACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAc,CAAA,CACjB;MAEV,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,QAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,UAAU,YAAY,CAAC;OAAO,eAAe;QAAE,OAAY;OAAE;OAC9F,UAAA,OAAO,EAAE,cAAc,IAAI,EAAE,YAAY;MACpC,CAAA,CACL;;IACE;;EAEb;;;;;;;;;;EAWA,SAAS,YAAY,EAAE,KAA8C;GACnE,MAAM,CAAC,OAAO,aAAA,GAAYJ,MAAAA,SAAAA,CAA4B,EAAE,MAAM,UAAU,CAAC;GACzE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE;;GAEzC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAwB,IAAI;GAC1D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,MAAA,GAAKC,MAAAA,MAAAA,CAAM;GAEjB,MAAM,SAAA,GAAQC,MAAAA,YAAAA,EAAa,iBAAyB;IAClD,SAAS;KAAE,MAAM;KAAS,QAAQ;IAAa,CAAC;IAChD,MAAM,OAAO,OAAO,KAAK,MAAM,eAAe,GAAI,CAAC;IACnD,WAAW,IAAI;IACf,SAAS,IAAI;IACb,WAAW,IAAI;GACjB,GAAG,CAAC,CAAC;GAEL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAAY;IACtC,IAAI;KACF,MAAM,SAAS,MAAM,iBAAiB;KACtC,IAAI,WAAW,MAAM,SAAS,EAAE,MAAM,cAAc,CAAC;UAChD,MAAM,OAAO,iBAAiB;IACrC,QAAQ;KACN,SAAS,EAAE,MAAM,SAAS,CAAC;IAC7B;GACF,GAAG,CAAC,KAAK,CAAC;GAEV,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,QAAa;GAAE,GAAG,CAAC,OAAO,CAAC;GAE7C,MAAM,SAAS,OAAO,OAAO;GAC7B,MAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM,OAAO,SAAS,MAAM,KACxD,UAAA,KAAsC,UAAA;GAC3C,MAAM,QAAQ,YAAY;GAC1B,MAAM,WAAW;GAEjB,MAAM,UAAA,GAASA,MAAAA,YAAAA,CAAY,YAAY;IACrC,IAAI,CAAC,OAAO;IACZ,QAAQ,IAAI;IACZ,WAAW,IAAI;IACf,IAAI;KACF,MAAM,SAAS,MAAM,gBAAgB,KAAK,MAAM,SAAS,GAAI,CAAC;KAC9D,IAAI,WAAW,MAAM,SAAS,EAAE,MAAM,cAAc,CAAC;UAChD,MAAM,OAAO,iBAAiB;IACrC,SAAS,OAAO;KAEd,IAAI,iBAAiB,OAAO,WAAW,MAAM,OAAO;UAC/C,SAAS,EAAE,MAAM,SAAS,CAAC;IAClC,UAAU;KACR,QAAQ,KAAK;IACf;GACF,GAAG;IAAC;IAAO;IAAQ;GAAK,CAAC;GAEzB,IAAI,MAAM,SAAS,WAAW,OAAO;GACrC,IAAI,MAAM,SAAS,SACjB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;IAAiB,OAAO,EAAE,cAAc;IAAM;IAAG,OAAO,MAAM;GAAO,CAAA;GAG9E,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWL,yCAAO;IAA3B,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAWA,yCAAO;MAAU,UAAA,EAAE,cAAc;KAAM,CAAA;KACtD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,yCAAO;MACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,oBAAD;OACM;OACJ,OAAO,EAAE,cAAc;OACvB,MAAM;OACN,SAAA;OACA,SAAS,CAAC;OACV,YAAY;OACZ,iBAAgB;OAChB,YAAW;OACX,cAAc,EAAE,gBAAgB;OACtB;OACV,SAAS,SAAS;QAAE,WAAW,IAAI;QAAG,WAAW,IAAI;OAAE;OACvD,eAAe,KAAA;MAChB,CAAA,EACE,CAAA;KACF,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWN,yCAAO;MAAvB,UAAA,CACG,YAAY,OACT,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,yCAAO;OAAS,MAAK;OAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,UAAD,EAAU,OAAM,QAAS,CAAA,GACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAc,CAAA,CACjB;MAEV,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,UAAU,YAAY,CAAC,SAAS,CAAC;OACjC,eAAe;QAAE,OAAY;OAAE;OAE9B,UAAA,OAAO,EAAE,cAAc,IAAI,EAAE,YAAY;MACpC,CAAA,CACL;;IACE;;EAEb;;;;;;;;;EAUA,SAAS,aAAa,EAAE,KAA8C;GACpE,MAAM,CAAC,OAAO,aAAA,GAAYJ,MAAAA,SAAAA,CAAqC,EAAE,MAAM,UAAU,CAAC;GAClF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GAEtC,MAAM,WAAA,GAAUE,MAAAA,YAAAA,CAAY,YAAY;IACtC,IAAI;KACF,MAAM,SAAS,MAAM,qBAAqB;KAC1C,SAAS,WAAW,OAAO,EAAE,MAAM,cAAc,IAAI;MAAE,MAAM;MAAS;KAAO,CAAC;IAChF,QAAQ;KACN,SAAS,EAAE,MAAM,SAAS,CAAC;IAC7B;GACF,GAAG,CAAC,CAAC;GAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,QAAa;GAAE,GAAG,CAAC,OAAO,CAAC;GAE7C,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAAY;IACtC,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,SAAS,MAAM,oBAAoB,EAAE,QAAQ,mBAAmB,CAAC;KACvE,IAAI,WAAW,MAAM,SAAS,EAAE,MAAM,cAAc,CAAC;UAChD,SAAS;MAAE,MAAM;MAAS;KAAO,CAAC;IACzC,QAAQ;KACN,SAAS,EAAE,MAAM,SAAS,CAAC;IAC7B,UAAU;KACR,QAAQ,KAAK;IACf;GACF,GAAG,CAAC,CAAC;GAEL,IAAI,MAAM,SAAS,WAAW,OAAO;GACrC,IAAI,MAAM,SAAS,SACjB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;IAAiB,OAAO,EAAE,eAAe;IAAM;IAAG,OAAO,MAAM;GAAO,CAAA;GAG/E,MAAM,YAAY,MAAM,OAAO,gBAAgB,OAC3C,OACA,cAAc,MAAM,OAAO,WAAW;GAI1C,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAS,WAAWL,yCAAO;IACzB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,yCAAO;KAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yCAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,yCAAO;OAAQ,UAAA,EAAE,eAAe;MAAQ,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,yCAAO;OACrB,UAAA,cAAc,OACX,EAAE,wBAAwB,IAC1B,EAAE,qBAAqB,IAAI,QAAQ;MACnC,CAAA,CACH;KACJ,CAAA,GAAA,MAAM,OAAO,aAEV,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,QAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,UAAU;MAAM,eAAe;OAAE,QAAa;MAAE;MACjF,UAAA,OAAO,EAAE,oBAAoB,IAAI,EAAE,iBAAiB;KAC/C,CAAA,IAER,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWP,yCAAO;MAAO,UAAA,EAAE,kBAAkB;KAAQ,CAAA,CAC5D;;GACE,CAAA;EAEb;;;;;EC9aA,MAAa,mBAAmB;;EAoBhC,SAAS,QAAQ,OAAmC;GAClD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO;GAChF,MAAM,MAAM;GACZ,IAAI,OAAO,IAAI,OAAO,YAAY,OAAO,IAAI,SAAS,UAAU,OAAO;GACvE,OAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,KAAA;IACrE,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;IACrE,MAAM,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC;IACpG,YAAY,IAAI,eAAe;IAC/B,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;GACjE;EACF;;EAGA,SAAS,UAAU,OAAqC;GACtD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG,OAAO;GAChF,MAAM,MAAM;GAGZ,OAAO;IAAE,QAFM,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,OAAO,SAAS,UAAU,QAAQ,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC;IAEjF,MADJ,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC;GACrF;EACxB;;;;;;EAOA,eAAsB,WAAW,SAA2C,CAAC,GAAiC;GAC5G,MAAM,SAAS,IAAI,gBAAgB;GACnC,IAAI,OAAO,QAAQ,KAAA,KAAa,OAAO,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,GAAG;GAC/E,IAAI,OAAO,UAAU,KAAA,KAAa,OAAO,UAAU,IAAI,OAAO,IAAI,KAAK,OAAO,KAAK;GACnF,MAAM,SAAS,OAAO,SAAS,IAAI,KAAK,MAAM,OAAO,SAAS;GAC9D,MAAM,WAAW,MAAM,MAAM,mBAAmB,QAAQ,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;GACnG,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,uCAAuC,OAAO,SAAS,MAAM,CAAC;GAChG,OAAO,UAAU,MAAM,SAAS,KAAK,CAAC;EACxC;;;;;;EAOA,eAAsB,gBAAgB,MAAiD;GACrF,MAAM,WAAW,MAAM,MAAM,kBAAkB;IAC7C,QAAQ;IACR,SAAS;KAAE,gBAAgB;KAAoB,QAAQ;IAAmB;IAC1E,MAAM,KAAK,UAAU,IAAI;GAC3B,CAAC;GACD,IAAI,SAAS,WAAW,KAAK,OAAO;GACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,yCAAyC,OAAO,SAAS,MAAM,CAAC;GAClG,OAAO,MAAM,SAAS,KAAK;EAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC1BA,SAAS,UAAU,EAAE,OAAO,MAAM,WAAW,WAAW,KAM1C;GACZ,MAAM,CAAC,MAAM,YAAA,GAAWQ,MAAAA,SAAAA,CAAS,KAAK;GACtC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;IAAI,WAAWC,qCAAO;IAAtB,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,qCAAO;QAAU,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,yBAAD,EAAyB,MAAM,GAAK,CAAA;OAAO,CAAA;OAC7E,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWD,qCAAO;QAAY,UAAA,MAAM;OAAU,CAAA;OAClD,MAAM,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,qCAAO;QAAO,UAAA,EAAE,WAAW;OAAQ,CAAA,IAAI;MACzE;;KACJ,MAAM,gBAAgB,KAAA,IAAY,OACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MAAW,UAAA,MAAM;KAAiB,CAAA;KAE1D,MAAM,KAAK,WAAW,IAAI,OACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MACpB,UAAA,MAAM,KAAK,KAAK,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,qCAAO;OAAkB,UAAA;MAAW,GAAlB,IAAkB,CAAC;KAC7E,CAAA;KAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;QACE,SAAQ;QACR,MAAK;QACL,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,4BAAD,EAA4B,MAAM,GAAK,CAAA;QAC7C,UAAU;QACV,SAAS;QAER,UAAA,EAAE,cAAc;OACX,CAAA;OACP,MAAM,aACL,iBAAA,GAAA,kBAAA,IAAA,CAACD,sCAAAA,QAAD;QACE,SAAQ;QACR,MAAK;QACL,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,yBAAD,EAAyB,MAAM,GAAK,CAAA;QAC1C,UAAU;QACV,SAAS;QAER,UAAA,EAAE,cAAc;OACX,CAAA,IACN;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,QAAD;QACE,SAAQ;QACR,MAAK;QACL,WAAWF,qCAAO;QAClB,eAAe;SAAE,QAAQ,IAAI;QAAE;QAE9B,UAAA,EAAE,iBAAiB;OACd,CAAA;MACL;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,OAAD;MACQ;MACN,eAAe;OAAE,QAAQ,KAAK;MAAE;MAChC,OAAO,MAAM;MACb,YAAY,EAAE,YAAY;MAC1B,WAAWL,qCAAO;MAClB,QACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;OAAQ,SAAQ;OAAU,eAAe;QAAE,QAAQ,KAAK;OAAE;OAAI,UAAA,EAAE,YAAY;MAAU,CAAA;MAGxF,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;OAAI,WAAWF,qCAAO;OAAtB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,qCAAO;QAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,qCAAO;SAAc,UAAA,EAAE,oBAAoB;QAAM,CAAA,GAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,qCAAO;SAAc,UAAA,MAAM;QAAc,CAAA,CACrD;OACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,qCAAO;QAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,qCAAO;SAAc,UAAA,EAAE,iBAAiB;QAAM,CAAA,GAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,qCAAO;SAAc,UAAA,MAAM;QAAgB,CAAA,CACvD;OACH,CAAA,CAAA;;KACC,CAAA;IACL;;EAER;;;;;;;;;;EAWA,SAAgB,kBAAkB,OAA0C;GAC1E,MAAM,EAAE,MAAM;GACd,MAAM,CAAC,OAAO,aAAA,GAAYD,MAAAA,SAAAA,CAAqB,EAAE,MAAM,UAAU,CAAC;GAClE,MAAM,CAAC,KAAK,WAAA,GAAUA,MAAAA,SAAAA,CAAS,EAAE;GACjC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GAGtC,MAAM,QAAQ,MAAM,SAAS;GAC7B,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAwB,IAAI;GAExD,MAAM,QAAA,GAAOO,MAAAA,YAAAA,CAAY,OAAO,WAA6C;IAC3E,IAAI;KACF,MAAM,UAAU,MAAM,WAAW,MAAM;KACvC,SAAS,YAAY,OAAO,EAAE,MAAM,cAAc,IAAI;MAAE,MAAM;MAAS;KAAQ,CAAC;IAClF,QAAQ;KACN,SAAS,EAAE,MAAM,SAAS,CAAC;IAC7B;GACF,GAAG,CAAC,CAAC;GAIL,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,KAAU,EAAE,MAAM,CAAC;GAAE,GAAG,CAAC,MAAM,KAAK,CAAC;GAEvD,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,OAAO,UAAU,KAAK,YAAY,UAAU;IACtE,MAAM,KAAK;KAAE,KAAK;KAAS,OAAO;IAAU,CAAC;GAC/C,GAAG;IAAC;IAAM;IAAK;GAAK,CAAC;GAErB,MAAM,OAAA,GAAMA,MAAAA,YAAAA,CAAY,OAAO,MAA+B,YAAoB;IAChF,QAAQ,IAAI;IACZ,UAAU,IAAI;IACd,IAAI;KACF,MAAM,gBAAgB,IAAI;KAC1B,UAAU,OAAO;KACjB,MAAM,QAAQ;IAChB,QAAQ;KACN,UAAU,MAAM,KAAA,IAAY,OAAO,EAAE,mBAAmB,CAAC;IAC3D,UAAU;KACR,QAAQ,KAAK;IACf;GACF,GAAG,CAAC,SAAS,CAAC,CAAC;GAEf,IAAI,MAAM,KAAA,GAAW,OAAO;GAC5B,IAAI,MAAM,SAAS,WAAW,OAAO;GAKrC,MAAM,QAAQ,UACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWN,qCAAO;IACrB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;KAAI,WAAWA,qCAAO;KAAtB,UAAA,CACG,EAAE,YAAY,GACd,UAAU,OAAO,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,qCAAO;MAAa,UAAA;KAAY,CAAA,CACxE;;GACD,CAAA;GAGP,IAAI,MAAM,SAAS,eACjB,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWA,qCAAO;IAA3B,UAAA,CAAqC,KAAK,IAAI,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,qCAAO;KAAS,UAAA,EAAE,kBAAkB;IAAK,CAAA,CAAU;;GAE1H,IAAI,MAAM,SAAS,UACjB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWA,qCAAO;IAA3B,UAAA,CACG,KAAK,IAAI,GACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,qCAAO;KAAO,MAAK;KAAnC,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,qCAAO;OAAW,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,yBAAD,EAAyB,MAAM,GAAK,CAAA;MAAO,CAAA;MAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWD,qCAAO;OAAY,UAAA,EAAE,iBAAiB;MAAK,CAAA;MACzD,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,2BAAD,EAA2B,MAAM,GAAK,CAAA;OAAG,eAAe;QAAE,QAAa;OAAE;OAChH,UAAA,EAAE,YAAY;MACT,CAAA;KACL;IACE,CAAA,CAAA;;GAIb,MAAM,EAAE,YAAY;GACpB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWP,qCAAO;IAA3B,UAAA;KACG,KAAK,QAAQ,OAAO,MAAM;KAE1B,QAAQ,KAAK,WAAW,IAAI,OAC3B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,MAAK;OACL,WAAW,QAAQ,KAAKA,qCAAO,OAAO,MAAMA,qCAAO,SAASA,qCAAO;OACnE,eAAe;QAAE,OAAO,EAAE;QAAG,QAAa,IAAI,KAAK;OAAE;OAEpD,UAAA,EAAE,cAAc;MACX,CAAA,GACP,QAAQ,KAAK,KAAK,SACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,MAAK;OAEL,WAAW,QAAQ,OAAOA,qCAAO,OAAO,MAAMA,qCAAO,SAASA,qCAAO;OACrE,eAAe;QAAE,OAAO,IAAI;QAAG,QAAa,MAAM,KAAK;OAAE;OAExD,UAAA;MACK,GALD,IAKC,CACT,CACE;;KAGN,WAAW,OAAO,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,qCAAO;MAAS,UAAA;KAAU,CAAA;KAEjE,QAAQ,OAAO,WAAW,IACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,qCAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,qCAAO;OAAW,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,yBAAD,EAAyB,MAAM,GAAK,CAAA;MAAO,CAAA,GAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWR,qCAAO;OAAY,UAAA,EAAE,YAAY;MAAK,CAAA,CACjD;KACH,CAAA,IAAA;KAEJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAWA,qCAAO;MACnB,UAAA,QAAQ,OAAO,KAAK,UACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAES;OACD;OACH;OACH,iBAAiB;QAAE,IAAS;SAAE,QAAQ;SAAW,IAAI,MAAM;QAAG,GAAG,EAAE,gBAAgB,CAAC;OAAE;OACtF,iBAAiB;QAAE,IAAS;SAAE,QAAQ;SAAW,IAAI,MAAM;QAAG,GAAG,EAAE,eAAe,CAAC;OAAE;MACtF,GANM,MAAM,EAMZ,CACF;KACC,CAAA;IACG;;EAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECnQA,MAAM,mBAAmB;EACzB,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB;GACrB;IACE,KAAK;IACL,aAAa;GACf;GACA;IACE,KAAK;IACL,aAAa;GACf;GACA;IACE,KAAK;IACL,aAAa;GACf;GACA;IACE,KAAK;IACL,aAAa;GACf;GACA;IACE,KAAK;IACL,aAAa;GACf;GACA;IACE,KAAK;IACL,aAAa;GACf;EACF;EACA,MAAM,gBAAgB;GACpB;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;GACA;IACE,KAAK;IACL,QAAQ;GACV;EACF;EAOA,SAAS,QAAQ,GAAG,QAA2C;GAC7D,OAAO,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACxC;EAEA,SAAS,KAAK,EAAE,WAAW,aAAuD;GAChF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAc;IACZ,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;KAAc;KAAW,QAAO;KAAe,aAAY;KAAM,gBAAe;KAAhF,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,GAAE;OAA6B,MAAK;MAAQ,CAAA;MAClD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,GAAE;OAAwB,MAAK;MAAgB,CAAA;MACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,GAAE;OAA2B,MAAK;OAAe,aAAY;MAAO,CAAA;KACzE;;GACF,CAAA;EAEP;;EAGA,SAAgB,aAAa,EAAE,MAAM,WAAW,WAAW,SAA6C;GACtG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,OAAO;IACP,QAAS,OAAO,KAAM;IACtB,WAAW,QAAQS,iCAAI,MAAM,WAAWA,iCAAI,eAAe,KAAA,GAAW,SAAS;IAC/E,SAAQ;IACR,MAAK;IACL,eAAY;IANd,UAAA;KAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAM,WAAWA,iCAAI;MAAS,WAAU;KAAmB,CAAA;KAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAM,WAAWA,iCAAI;MAAU,WAAU;KAAmB,CAAA;KAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAM,WAAWA,iCAAI;MAAW,WAAU;KAAoB,CAAA;KAC9D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAM,WAAWA,iCAAI;MAAU,WAAU;KAAoB,CAAA;IAC1D;;EAET;;EAGA,SAAgB,iBAAiB,EAAE,QAAQ,aAAa,OAAO,aAI5D;GACD,MAAM,gBAAgB,aAClB;IAAE,MAAM;IAAO,cAAc;GAAS,IACtC,EAAE,eAAe,KAAK;GAC1B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IACE,OAAO,SAAS;IACR;IACG;IACX,SAAS;IACT,GAAI;IAEJ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KACE,MAAK;KACL,QAAO;KACP,aAAY;KACZ,gBAAe;KACf,eAAc;KACd,YAAW;KAEV,UAAA,eAAe,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAA2B,GAAG,KAAK;MAAG,WAAW,KAAK;KAAY,GAAvD,KAAK,SAAkD,CAAC;IAC9F,CAAA;GACA,CAAA;EAET;;EAGA,SAAgB,aAAa,EAAE,SAAS,MAA2B;GAEjE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,OAAQ,SAAS,KAAM;IACf;IACR,WAAWA,iCAAI;IACf,SAAQ;IACR,OAAO,EAPK,sCAAsC,2BAOvC;IACX,eAAY;IANd,UAAA,CAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,GAAE;KAAU,GAAE;KAAM,OAAM;KAAK,QAAO;KAAK,IAAG;KAAI,MAAK;IAAgB,CAAA,GAC5E,cAAc,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAkB,GAAG,KAAK;KAAG,MAAM,KAAK;IAAO,GAApC,KAAoC,CAAC,CACjF;;EAET;;EAGA,SAAgB,sBAAsB;GACpC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAWA,iCAAI;IAArB,UAAA,CAAkC,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD,EAAkB,QAAQ,GAAK,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD,EAAc,QAAQ,GAAK,CAAA,CAAO;;EAC7G;;EAGA,SAAgB,iBAAiB,EAAE,MAAM,aAAwB;GAC/D,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAoB;IAAiB;IAAW,UAAA;GAAU,CAAA;EACnE;;;ECpJA,MAAM,cAAc;EACpB,MAAM,gBAAgB;EACtB,MAAM,aAAa;EACnB,MAAM,cAAc;EAGpB,SAAS,sBAAsB,KAAgC;GAC7D,OAAO,IAAI,MAAM,OAAO,4BACtB,IAAI,MAAM,OAAO,4BACf,IAAI,MAAM,OAAO,gCAAgC,aAAa;IAC5D,MAAM,IAAI,MAAM,SAAS;KACvB,MAAM;KACN,UAAU;KACV,YAAY;IACd,GAAG,YAAY;IACf,MAAM,IAAI,MAAM,SAAS;KACvB,MAAM;KACN,UAAU;KACV,YAAY;IACd,GAAG,mBAAmB;IACtB,MAAM,IAAI,MAAM,SAAS;KACvB,MAAM;KACN,UAAU;KACV,YAAY;IACd,GAAG,gBAAgB;GACrB,CAAC,CAAC,CAAC;EACT;EAEA,SAAS,iBAAkC;GACzC,MAAM,WAAW,SAAS,eAAe,UAAU;GACnD,IAAI,oBAAoB,iBAAiB,OAAO;GAChD,MAAM,OAAO,SAAS,cAAc,MAAM;GAC1C,KAAK,KAAK;GACV,KAAK,MAAM;GACX,KAAK,OAAO;GACZ,KAAK,OAAO,sBAAsB,mBAAmB,WAAW;GAChE,SAAS,KAAK,OAAO,IAAI;GACzB,OAAO;EACT;;EAGA,SAAgB,wBAAwB,KAA0B;GAChE,MAAM,gBAAgB,SAAS;GAC/B,IAAI;GACJ,IAAI;GACJ,IAAI;GAEJ,MAAM,0BAAgC;IACpC,eAAe,WAAW;IAC1B,gBAAgB,KAAA;GAClB;GACA,MAAM,uBAA6B;IACjC,IAAI,SAAS,UAAU,aAAa,SAAS,QAAQ;IACrD,IAAI,kBAAkB,KAAA,GAAW;IACjC,gBAAgB,IAAI,uBAAuB;KACzC,IAAI,wBAAwB,YAAY,CAAC,CAAC,WAAW,SAAS,UAAU,aACtE,SAAS,QAAQ;IAErB,CAAC;IACD,cAAc,QAAQ,SAAS,MAAM;KAAE,WAAW;KAAM,SAAS;KAAM,eAAe;IAAK,CAAC;GAC9F;GAEA,MAAM,oBAA0B;IAE9B,IADgB,wBAAwB,YAAY,CAAC,CAAC,SACzC;KACX,iBAAiB,sBAAsB,GAAG;KAC1C,YAAY,eAAe;KAC3B,eAAe;KACf,SAAS,gBAAgB,QAAQ,eAAe;KAChD;IACF;IACA,eAAe;IACf,eAAe,KAAA;IACf,SAAS,OAAO;IAChB,UAAU,KAAA;IACV,kBAAkB;IAClB,SAAS,QAAQ;IACjB,OAAO,SAAS,gBAAgB,QAAQ;GAC1C;GAEA,IAAI,aAAa;IACf,YAAY;IACZ,MAAM,cAAc,wBAAwB,UAAU,WAAW;IACjE,aAAa;KACX,YAAY;KACZ,eAAe;KACf,SAAS,OAAO;KAChB,kBAAkB;KAClB,SAAS,QAAQ;KACjB,OAAO,SAAS,gBAAgB,QAAQ;IAC1C;GACF,GAAG,0CAA0C;EAC/C;;;;ECtGA,MAAa,KAAK;GAChB,KAAK;GACL,OAAO;GACP,SAAS;GACT,aAAa;GACb,YAAY;GACZ,eAAe;GACf,gBAAgB;GAChB,aAAa;GACb,qBAAqB;GACrB,mBAAmB;GACnB,eAAe;GACf,YAAY;GACZ,cAAc;GACd,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,eAAe;GACf,iBAAiB;GACjB,oBAAoB;GACpB,qBAAqB;GACrB,wBAAwB;GACxB,kBAAkB;GAClB,YAAY;GACZ,cAAc;GACd,WAAW;GACX,iBAAiB;GACjB,YAAY;GACZ,oBAAoB;GACpB,iBAAiB;GACjB,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,eAAe;GACf,YAAY;GACZ,kBAAkB;GAClB,iBAAiB;GACjB,mBAAmB;GACnB,YAAY;EACd;;EAMA,MAAa,KAAwC;GACnD,KAAK;GACL,OAAO;GACP,SAAS;GACT,aAAa;GACb,YAAY;GACZ,eAAe;GACf,gBAAgB;GAChB,aAAa;GACb,qBAAqB;GACrB,mBAAmB;GACnB,eAAe;GACf,YAAY;GACZ,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,eAAe;GACf,iBAAiB;GACjB,oBAAoB;GACpB,qBAAqB;GACrB,wBAAwB;GACxB,kBAAkB;GAClB,YAAY;GACZ,cAAc;GACd,WAAW;GACX,iBAAiB;GACjB,YAAY;GACZ,oBAAoB;GACpB,iBAAiB;GACjB,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,eAAe;GACf,YAAY;GACZ,kBAAkB;GAClB,iBAAiB;GACjB,mBAAmB;GACnB,YAAY;EACd;;;ECnEA,MAAM,KAAK;EACX,MAAM,uBAAuB;EAC7B,MAAM,oBAAoB;;EAG1B,MAAa,SAAS,CAAC,SAAS,QAAQ;;;;;EAMxC,SAAgB,MAAM,KAA0B;GAC9C,IAAI,aAAa,IAAI,OAAO,SAAS,IAAI;IAAE;IAAI;GAAG,CAAC,GAAG,gCAAgC;GACtF,wBAAwB,GAAG;GAC3B,MAAM,IAAI,IAAI,OAAO,KAAK,EAAE;GAC5B,IAAI,MAAM,OAAO,0BAA0B,IAAI,MAAM,SAAS;IAC5D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,EAAE;GACrB,GAAG,qBAAqB,CAAC;;;;;;;;GASzB,IAAI,MAAM,OAAO,8BAA8B,IAAI,MAAM,SAAS;IAChE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,eAAe,EAAE,EAAE;GACrB,GAAG,iBAAiB,CAAC;GAErB,MAAM,iBAAiB,YAA2B;IAChD,MAAM,WAAW,MAAM,MAAM,IAAI,IAAI,mBAAmB,OAAO,SAAS,MAAM,GAAG;KAC/E,QAAQ;KACR,aAAa;IACf,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,wDAAwD,OAAO,SAAS,MAAM,GAAG;GACrH;GACA,MAAM,aAAa,UAAuC;IACxD,IAAI,MAAM,WAAW,OAAO,UACtB,MAAM,MAAoC,SAAS,sBAAsB;IAC/E,eAAoB,CAAC,CAAC,OAAM,UAAS,QAAQ,MAAM,mCAAmC,KAAK,CAAC;GAC9F;GACA,IAAI,aAAa;IACf,OAAO,iBAAiB,WAAW,SAAS;IAC5C,eAAoB,CAAC,CAAC,OAAM,UAAS,QAAQ,MAAM,mCAAmC,KAAK,CAAC;IAC5F,aAAa,OAAO,oBAAoB,WAAW,SAAS;GAC9D,GAAG,sCAAsC;EAC3C"}
package/lib/index.js CHANGED
@@ -1,5 +1,8 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { fileURLToPath } from "node:url";
1
3
  import { credentialRef } from "@deepseek-ai/dsh-credentials";
2
4
  import * as McpClient from "@sparkelf/dsh-plugin-mcp-credentials";
5
+ import { BUNDLED_SKILL_RANK } from "@deepseek-ai/dsh-skill";
3
6
  import z from "@deepseek-ai/schemastery";
4
7
  //#region src/model-settings.ts
5
8
  /** Profile entry id whose Config holds the model providers. */
@@ -900,6 +903,43 @@ function bearerToken(request) {
900
903
  const token = authorization.slice(7).trim();
901
904
  return token === "" ? null : token;
902
905
  }
906
+ /** The skill this plugin contributes: how to answer a DataOps data question. */
907
+ const QUERY_SKILL_NAME = "dataops-query";
908
+ /** Location of the skill document inside the published package. */
909
+ const QUERY_SKILL_FILE = new URL("../skills/dataops-query/SKILL.md", import.meta.url);
910
+ /**
911
+ * Describe the query skill to the catalog without reading it.
912
+ *
913
+ * The description repeats what the skill file declares, because a catalog listing must
914
+ * answer whether the skill applies before its content is loaded.
915
+ */
916
+ const QUERY_SKILL = {
917
+ name: QUERY_SKILL_NAME,
918
+ description: "用户问数、取数、查数据、要报表时使用。包含选表策略(优先总表;有地域区分时先大后小)、取数前与用户确认资源清单、以及超时时主动分批次。",
919
+ invocation: {
920
+ modelInvocable: true,
921
+ userInvocable: true
922
+ },
923
+ provider: QUERY_SKILL_NAME,
924
+ source: "bundled",
925
+ resourceBase: {
926
+ kind: "directory",
927
+ path: fileURLToPath(new URL("../", import.meta.url))
928
+ },
929
+ rank: BUNDLED_SKILL_RANK,
930
+ locator: QUERY_SKILL_FILE
931
+ };
932
+ /** Serve the query skill to the catalog. */
933
+ const querySkillProvider = {
934
+ name: QUERY_SKILL_NAME,
935
+ list: () => Promise.resolve([QUERY_SKILL]),
936
+ async get() {
937
+ return {
938
+ ...QUERY_SKILL,
939
+ content: await readFile(QUERY_SKILL_FILE, "utf8")
940
+ };
941
+ }
942
+ };
903
943
  /**
904
944
  * Accept the current DataOps JWT and expose DataOps MCP tools through its credential.
905
945
  * @param ctx - DSH Host context with credentials, Web routes, and tools.
@@ -910,6 +950,7 @@ async function apply(ctx, config) {
910
950
  const baseUrl = new URL(config.baseUrl).origin;
911
951
  const accessRef = credentialRef(config.credentialRef);
912
952
  let mcpFiber;
953
+ ctx.skills.registerProvider(() => querySkillProvider);
913
954
  const ensureMcp = async () => {
914
955
  if (mcpFiber !== void 0 && mcpFiber.uid !== null) return;
915
956
  const fiber = ctx.plugin(McpClient, {
@@ -5,6 +5,14 @@ import type { en } from './locales.ts';
5
5
  export interface SkillPlazaSectionInjected {
6
6
  /** Translate one DataOps plaza message key. */
7
7
  t: (key: keyof typeof en) => string;
8
+ /**
9
+ * The page's current search text.
10
+ *
11
+ * The page draws one search field for every skill it shows, and this section is part of that
12
+ * page. Filtering here with the same text keeps the visible result consistent with the field;
13
+ * drawing a second field would offer the same control twice and filter only half the page.
14
+ */
15
+ query: string;
8
16
  }
9
17
  /** Props accepted by the plaza section. */
10
18
  export type SkillPlazaSectionProps = Partial<InjectFace<SkillPlazaSectionInjected>>;
@@ -23,11 +23,12 @@ export declare const en: {
23
23
  readonly defaultsNeverPublished: "Not published yet";
24
24
  readonly defaultsNotAdmin: "Administrators only";
25
25
  readonly plazaTitle: "Skill plaza";
26
- readonly plazaIntro: "Skills other users shared. Install one to use it in this workspace, or share a skill of your own.";
27
- readonly plazaSearch: "Search skills";
28
- readonly plazaTagFilter: "Filter by tag";
29
26
  readonly plazaAllTags: "All tags";
30
27
  readonly plazaMine: "Shared by me";
28
+ readonly plazaShowDetail: "Details";
29
+ readonly plazaClose: "Close";
30
+ readonly plazaDetailUpdated: "Updated";
31
+ readonly plazaDetailBody: "Skill body";
31
32
  readonly plazaInstall: "Install";
32
33
  readonly plazaInstalled: "Installed. It is now in your skill list.";
33
34
  readonly plazaUnshare: "Stop sharing";
@@ -37,7 +38,6 @@ export declare const en: {
37
38
  readonly plazaLoadFailed: "The skill plaza could not be loaded. Try again.";
38
39
  readonly plazaActionFailed: "The action could not be completed. Try again.";
39
40
  readonly plazaRetry: "Try again";
40
- readonly plazaRefresh: "Refresh";
41
41
  };
42
42
  /** Stable key set shared by every managed DataOps locale. */
43
43
  export type ManagedDataOpsKey = keyof typeof en;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sparkelf/dsh-dataops-managed",
3
- "version": "0.3.17",
3
+ "version": "0.3.19",
4
4
  "description": "DataOps JWT intake and credential-backed MCP tools for managed DeepSeek Harness workspaces.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -39,6 +39,7 @@
39
39
  "lib/client.js.map",
40
40
  "lib/types/**/*.d.ts",
41
41
  "cordis.patch.yml",
42
+ "skills/dataops-query/SKILL.md",
42
43
  "README.md",
43
44
  "LICENSE"
44
45
  ],
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: dataops-query
3
+ description: 用户问数、取数、查数据、要报表时使用。包含选表策略(优先总表;有地域区分时先大后小,如广西优先于南宁;字段不足才下探分表)、取数前与用户确认资源清单(表与接口,补缺剔冗)、以及查询超时时主动分批次执行。
4
+ ---
5
+
6
+ # 问数
7
+
8
+ 用户要「查数」「取数」「看数据」「出报表」时,按本技能执行。
9
+
10
+ ## 触发
11
+
12
+ 用户表达任何取数意图时**自动**使用,包括:查一下、统计、有多少、最近情况、拉个数据、出个报表。
13
+
14
+ ## 一、取数前:先确认资源清单
15
+
16
+ **在真正执行取数前**,根据用户需求整理出这次要用的资源清单,并向用户确认。清单包含**两类**:
17
+
18
+ - **表**:数据来自哪些表(含库或 schema)
19
+ - **接口**:需要调用哪些 API 或 MCP 工具
20
+
21
+ 确认时要做到两件事:
22
+
23
+ 1. **补足缺失** —— 需求里隐含但你没列的资源(例如按地域筛选需要地域维表、按时间聚合需要日期口径)
24
+ 2. **剔除冗余** —— 列了但这次用不上的资源
25
+
26
+ 呈现用一张表,让用户能一眼核对:
27
+
28
+ | 资源 | 类型 | 用途 | 是否必需 |
29
+ | --- | --- | --- | --- |
30
+ | dwd_order | 表 | 订单明细 | 必需 |
31
+ | dim_region | 表 | 地域归属 | 必需 |
32
+ | query_api | 接口 | 调用取数 | 必需 |
33
+ | dwd_user | 表 | 本次不需要 | 建议剔除 |
34
+
35
+ 用户确认前不要开始取数;用户补充或删减后,以确认后的清单为准。
36
+
37
+ ## 二、选表策略
38
+
39
+ 选表遵循三条规则,按顺序判断。
40
+
41
+ ### 规则 1:有总表先用总表
42
+
43
+ 存在覆盖完整范围的**总表**时,优先用总表,不要一开始就去翻分表。
44
+
45
+ ### 规则 2:有地域区分时,先大后小
46
+
47
+ 总表之外若按地域拆成多张表,**先用管辖范围大的,再用小的**,举一反三:
48
+
49
+ - 广西 与 南宁 → 先选广西
50
+ - 广西、南宁、青秀区 → 先选广西,不够再南宁,再不够再青秀区
51
+ - 全国 与 广西 → 先选全国
52
+
53
+ 即:**层级浅的先选**,不要一上来就落到最细粒度。
54
+
55
+ ### 规则 3:字段不满足才下探分表
56
+
57
+ 只有当上一级表的**字段无法满足本次需求**时,才往下一级分表找。
58
+
59
+ 需要下探的典型情形:
60
+
61
+ - 上一级表没有本次要的字段
62
+ - 上一级表该字段为空或不完整
63
+ - 需求明确要求了更细粒度的口径
64
+
65
+ **下探前要说明**:为什么上一级表不够,这次要落到哪一级。
66
+
67
+ ## 三、查询超时:主动分批次
68
+
69
+ 单次查询**超时**时,不要直接把失败抛给用户,而是**主动分批次**继续取:
70
+
71
+ 1. 换一个更小的切分维度(时间区间、地域范围、ID 区间都可以)
72
+ 2. 逐批执行,把结果合并
73
+ 3. 完成后说明「因单次查询超时,已按某维度分 N 批取回」
74
+
75
+ 分批时每批的规模要收敛到能完成的量;连续两批都超时,就把批次再拆细。
76
+
77
+ ## 输出
78
+
79
+ 取数完成后说明:
80
+
81
+ - 实际用了哪些资源(与确认清单对照)
82
+ - 从哪一级表取的数据
83
+ - 是否发生了分批,怎么分的