@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 +2 -2
- package/lib/index.js +36 -5
- package/package.json +1 -1
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
|
|
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
|
|
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),
|
|
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),
|
|
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),
|
|
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 :
|
|
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