@michengai/dsh-skills-manager 0.1.11 → 0.1.13

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
@@ -192,9 +192,9 @@ window.__ModuleLoader__.load({
192
192
  .dssm-summary-count{font-size:18px;font-weight:650}.dssm-summary-label{color:var(--dsw-alias-label-secondary);font-size:12px}.dssm-summary-separator{width:1px;height:24px;background:var(--dsw-alias-border-l2)}
193
193
  .dssm-group{display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-2)}.dssm-group-head{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--dsw-alias-border-l1)}.dssm-group-title{margin:0;font-size:14px;font-weight:600}.dssm-count{color:var(--dsw-alias-label-tertiary);font-size:12px}.dssm-path{margin-left:auto;max-width:48%;overflow:hidden;color:var(--dsw-alias-label-tertiary);font-size:12px;text-overflow:ellipsis;white-space:nowrap}
194
194
  .dssm-row{display:flex;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid var(--dsw-alias-border-l1)}.dssm-row:last-child{border-bottom:0}.dssm-row-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:3px}.dssm-row-id{display:flex;align-items:center;gap:7px;min-width:0}.dssm-row-name{overflow:hidden;font-size:14px;font-weight:560;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.dssm-tag{flex:none;padding:1px 6px;border:1px solid var(--dsw-alias-border-l3);border-radius:4px;color:var(--dsw-alias-label-secondary);font-size:11px;line-height:16px}.dssm-tag-on{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.dssm-tag-off{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.dssm-note{overflow:hidden;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.dssm-empty{padding:28px 16px;color:var(--dsw-alias-label-tertiary);font-size:13px;text-align:center}.dssm-error{color:var(--dsw-alias-state-error-primary);font-size:13px;line-height:20px}
195
- .dssm-mask{position:fixed;z-index:1100;inset:0;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:100%;height:100%;padding:24px;background:rgba(0,0,0,.58)}.dssm-modal{box-sizing:border-box;display:flex;width:min(480px,100%);max-width:100%;max-height:100%;min-width:0;min-height:0;flex:0 1 auto;align-self:center;flex-direction:column;gap:18px;padding:24px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:16px;background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv3)}.dssm-modal-upload{width:min(480px,100%)!important;height:auto!important;max-width:100%;max-height:100%;align-self:center!important;flex:0 0 auto!important;overflow:auto}.dssm-modal-head{display:flex;align-items:center;gap:12px}.dssm-modal-title{margin:0;flex:1;font-size:17px;line-height:24px;font-weight:650}.dssm-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:0;border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:20px;line-height:1;cursor:pointer}.dssm-icon-btn:hover{background:var(--dsw-alias-interactive-bg-hover)}
195
+ .dssm-mask{position:fixed;z-index:1100;inset:0;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:100%;height:100%;padding:24px;background:rgba(0,0,0,.58)}.dssm-modal{box-sizing:border-box;display:flex;width:min(480px,100%)!important;height:auto!important;max-width:100%;max-height:100%;min-width:0;min-height:0;flex:0 0 auto!important;align-self:center!important;flex-direction:column;gap:18px;padding:24px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:16px;background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv3)}.dssm-modal-upload{width:min(480px,100%)!important;height:auto!important;max-width:100%;max-height:100%;align-self:center!important;flex:0 0 auto!important;overflow:auto}.dssm-modal-head{display:flex;align-items:center;gap:12px}.dssm-modal-title{margin:0;flex:1;font-size:17px;line-height:24px;font-weight:650}.dssm-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:0;border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:20px;line-height:1;cursor:pointer}.dssm-icon-btn:hover{background:var(--dsw-alias-interactive-bg-hover)}
196
196
  .dssm-dropzone{box-sizing:border-box;display:flex;width:100%;min-height:144px;flex:none;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:18px;border:1px dashed var(--dsw-alias-border-l3);border-radius:12px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);cursor:pointer;transition:border-color 180ms ease,background 180ms ease}.dssm-dropzone:hover,.dssm-dropzone-active{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-interactive-bg-hover)}.dssm-dropzone-title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:560}.dssm-dropzone-copy{font-size:12px;line-height:18px;text-align:center}.dssm-file{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-primary);font-size:13px}.dssm-file-name{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}.dssm-modal-head,.dssm-file,.dssm-modal-actions{flex:none}.dssm-modal-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px}.dssm-hidden-input{display:none}
197
- @media (max-width:560px){.dssm-mask{padding:12px;align-items:center}.dssm-modal{width:100%;padding:16px;gap:12px}.dssm-modal-upload{width:100%!important;align-self:center!important}.dssm-toolbar{flex-wrap:wrap}.dssm-actions{margin-left:0}.dssm-path{display:none}.dssm-row{align-items:flex-start;flex-wrap:wrap}.dssm-row>.dssm-btn{margin-left:auto}.dssm-modal-actions{justify-content:stretch}.dssm-modal-actions .dssm-btn{flex:1 1 auto}}@media (prefers-reduced-motion:reduce){.dssm-btn,.dssm-dropzone{transition:none}}
197
+ @media (max-width:560px){.dssm-mask{padding:12px;align-items:center}.dssm-modal{width:100%!important;height:auto!important;padding:16px;gap:12px;align-self:center!important}.dssm-modal-upload{width:100%!important;align-self:center!important}.dssm-toolbar{flex-wrap:wrap}.dssm-actions{margin-left:0}.dssm-path{display:none}.dssm-row{align-items:flex-start;flex-wrap:wrap}.dssm-row>.dssm-btn{margin-left:auto}.dssm-modal-actions{justify-content:stretch}.dssm-modal-actions .dssm-btn{flex:1 1 auto}}@media (prefers-reduced-motion:reduce){.dssm-btn,.dssm-dropzone{transition:none}}
198
198
  `;
199
199
 
200
200
  function callApi(path, options) {
package/lib/index.js CHANGED
@@ -116,11 +116,42 @@ function run(res, task, afterSuccess) {
116
116
  });
117
117
  }
118
118
 
119
+ /** 文件写入后刷新宿主技能目录,并通知 Web 端重拉 `/` 菜单缓存。 */
120
+ function notifyChatCatalog(ctx, invalidateSkills) {
121
+ try {
122
+ if (typeof invalidateSkills === "function") invalidateSkills();
123
+ } catch {
124
+ /* 目录缓存失效失败不影响已完成的文件操作 */
125
+ }
126
+ try {
127
+ if (typeof ctx.emit === "function") ctx.emit("commands/change");
128
+ } catch {
129
+ /* 命令目录刷新失败不影响已完成的文件操作 */
130
+ }
131
+ try {
132
+ const sessions = typeof ctx.get === "function" ? ctx.get("sessions") : undefined;
133
+ const list = sessions && typeof sessions.list === "function" ? sessions.list() : [];
134
+ for (const session of list) {
135
+ const id = session && (session.id ?? session.header?.id);
136
+ const preset = session && session.header && typeof session.header.agentPreset === "string"
137
+ ? session.header.agentPreset
138
+ : undefined;
139
+ if (id == null || !preset || typeof ctx.emit !== "function") continue;
140
+ // Web `/` 技能菜单缓存在 dsh-client-ui-skill,只在 agent-preset/selected 时失效;
141
+ // skills/change 未进入官方转发白名单,只能借用这条已转发事件。
142
+ ctx.emit("agent-preset/selected", id, preset);
143
+ }
144
+ } catch {
145
+ /* 斜杠菜单刷新失败不影响已完成的文件操作 */
146
+ }
147
+ }
148
+
119
149
  function apply(ctx) {
120
150
  const log = makeLog();
121
151
  const roots = userRoots();
122
152
  const rootByKey = Object.fromEntries(roots.map((r) => [r.key, r.path]));
123
153
  let invalidateSkills = () => {};
154
+ const afterWrite = () => notifyChatCatalog(ctx, invalidateSkills);
124
155
  let mutationQueue = Promise.resolve();
125
156
  const enqueueMutation = (task) => {
126
157
  const queued = mutationQueue.then(task, task);
@@ -159,16 +190,16 @@ function apply(ctx) {
159
190
  return enqueueMutation(() => {
160
191
  switch (path) {
161
192
  case "/api/dsh-skills-manager/enable":
162
- return run(res, () => setSkillEnabled(rootByKey[String(body.root || "dsh")], String(body.name || ""), true), invalidateSkills);
193
+ return run(res, () => setSkillEnabled(rootByKey[String(body.root || "dsh")], String(body.name || ""), true), afterWrite);
163
194
  case "/api/dsh-skills-manager/disable":
164
- return run(res, () => setSkillEnabled(rootByKey[String(body.root || "dsh")], String(body.name || ""), false), invalidateSkills);
195
+ return run(res, () => setSkillEnabled(rootByKey[String(body.root || "dsh")], String(body.name || ""), false), afterWrite);
165
196
  case "/api/dsh-skills-manager/delete":
166
- return run(res, () => deleteSkill(rootByKey.dsh, String(body.name || ""), log), invalidateSkills);
197
+ return run(res, () => deleteSkill(rootByKey.dsh, String(body.name || ""), log), afterWrite);
167
198
  case "/api/dsh-skills-manager/import":
168
199
  return run(res, () => importSkill(String(body.source || ""), log, {
169
200
  conflict: body.conflict === "overwrite" ? "overwrite" : "skip",
170
201
  dryRun: body.dryRun === true,
171
- }), body.dryRun === true ? undefined : invalidateSkills);
202
+ }), body.dryRun === true ? undefined : afterWrite);
172
203
  default:
173
204
  json(res, 404, { ok: false, code: "error.proto.unknownAction", error: `unknown action: ${path}` });
174
205
  }
@@ -185,4 +216,4 @@ function apply(ctx) {
185
216
  return route;
186
217
  }
187
218
 
188
- export { apply, inject, name };
219
+ export { apply, inject, name, notifyChatCatalog };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michengai/dsh-skills-manager",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "NPM-installable DSH Web plugin for managing local skills and viewing shared Agent skills safely.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {