dsh-kaomoji 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.4] - 2026-09-25
11
+
12
+ ### Changed
13
+
14
+ - 设置卡片在保存失败时直接显示 Host 返回的真实原因(例如文件不可写、来源不受信任),
15
+ 不再只显示通用的“保存失败”,便于定位服务器端问题。
16
+
10
17
  ## [0.1.3] - 2026-09-13
11
18
 
12
19
  ### Fixed
package/lib/client.js CHANGED
@@ -230,7 +230,9 @@ window.__ModuleLoader__.load({
230
230
  };
231
231
 
232
232
  const publish = (patch) => {
233
- snapshot = { ...snapshot, ...patch };
233
+ snapshot = patch.saveError === null
234
+ ? { ...snapshot, ...patch, saveErrorMessage: null }
235
+ : { ...snapshot, ...patch };
234
236
  emit();
235
237
  };
236
238
 
@@ -240,11 +242,12 @@ window.__ModuleLoader__.load({
240
242
  return task;
241
243
  };
242
244
 
243
- const fail = (code) => {
245
+ const fail = (code, message) => {
244
246
  publish({
245
247
  status: "unavailable",
246
248
  writable: false,
247
249
  saveError: code,
250
+ saveErrorMessage: message || null,
248
251
  justSaved: false,
249
252
  });
250
253
  };
@@ -253,11 +256,17 @@ window.__ModuleLoader__.load({
253
256
  try {
254
257
  const result = await rpc.call(RPC_CHANNEL, endpoint, payload);
255
258
  if (result && result.ok === true) return { value: result.value };
256
- const code = result && result.error && result.error.code;
257
- return { error: code === "forbidden" ? "forbidden" : "rejected" };
259
+ const error = (result && result.error) || {};
260
+ return {
261
+ error: error.code === "forbidden" ? "forbidden" : "rejected",
262
+ message: typeof error.message === "string" ? error.message : undefined,
263
+ };
258
264
  } catch (error) {
259
265
  const message = String((error && error.message) || error || "");
260
- return { error: /403|forbidden/i.test(message) ? "forbidden" : "unreachable" };
266
+ return {
267
+ error: /403|forbidden/i.test(message) ? "forbidden" : "unreachable",
268
+ message,
269
+ };
261
270
  }
262
271
  };
263
272
 
@@ -270,7 +279,7 @@ window.__ModuleLoader__.load({
270
279
  async refresh() {
271
280
  const result = await callRpc("get", {});
272
281
  if (result.error !== undefined) {
273
- fail(result.error === "forbidden" ? "forbidden" : "load");
282
+ fail(result.error === "forbidden" ? "forbidden" : "load", result.message);
274
283
  return;
275
284
  }
276
285
  const value = result.value;
@@ -297,7 +306,7 @@ window.__ModuleLoader__.load({
297
306
  expectedRevision: snapshot.revision,
298
307
  });
299
308
  if (result.error !== undefined) {
300
- fail(result.error === "forbidden" ? "forbidden" : "save");
309
+ fail(result.error === "forbidden" ? "forbidden" : "save", result.message);
301
310
  return;
302
311
  }
303
312
  const value = result.value;
@@ -316,7 +325,7 @@ window.__ModuleLoader__.load({
316
325
  publish({ saveError: null, justSaved: false });
317
326
  const result = await callRpc("reset", { expectedRevision: snapshot.revision });
318
327
  if (result.error !== undefined) {
319
- fail(result.error === "forbidden" ? "forbidden" : "save");
328
+ fail(result.error === "forbidden" ? "forbidden" : "save", result.message);
320
329
  return;
321
330
  }
322
331
  const value = result.value;
@@ -348,7 +357,9 @@ window.__ModuleLoader__.load({
348
357
  const statusText = state.saveError
349
358
  ? state.saveError === "forbidden"
350
359
  ? t("status.forbidden")
351
- : t("status.error")
360
+ : state.saveErrorMessage
361
+ ? `${t("status.error")} ${state.saveErrorMessage}`
362
+ : t("status.error")
352
363
  : state.status === "loading"
353
364
  ? t("status.loading")
354
365
  : !state.writable
package/lib/index.js CHANGED
@@ -372,10 +372,9 @@ function createSettingsRpcHandler(ctx, settingsFile, getState, commit) {
372
372
  return rpcError("bad-request", `Unknown dsh-kaomoji settings operation: ${endpoint}`);
373
373
  });
374
374
  } catch (error) {
375
- ctx.logger?.warn?.(
376
- `[dsh-kaomoji] settings rpc failed: ${error instanceof Error ? error.message : String(error)}`,
377
- );
378
- return rpcError("settings-rejected", "The Host rejected the kaomoji settings.");
375
+ const reason = error instanceof Error ? error.message : String(error);
376
+ console.warn(`[dsh-kaomoji] settings rpc failed: ${reason}`);
377
+ return rpcError("settings-rejected", `The Host rejected the kaomoji settings: ${reason}`);
379
378
  }
380
379
  };
381
380
  }
@@ -423,7 +422,7 @@ export function apply(ctx, config = {}) {
423
422
 
424
423
  // 设置卡片通过 loopback RPC 读写 ~/.dsh/dsh-kaomoji.json;写入后立即
425
424
  // 更新提示词段(emit system-prompt/change),无需重启。
426
- ctx.inject(["connection"], (connectionCtx) => {
425
+ const registerSettingsRpc = (connectionCtx) => {
427
426
  const handler = createSettingsRpcHandler(ctx, settingsFile, getState, adoptSettings);
428
427
  connectionCtx.effect(
429
428
  () =>
@@ -432,9 +431,18 @@ export function apply(ctx, config = {}) {
432
431
  }),
433
432
  "dsh-kaomoji: settings rpc",
434
433
  );
435
- });
434
+ console.log(
435
+ `[dsh-kaomoji] settings rpc 已注册(channel=${SETTINGS_RPC_CHANNEL}, authority=${authority})`,
436
+ );
437
+ };
438
+ // connection 服务在多数部署里此刻已可用;拿不到再等 inject(旧版行为)。
439
+ if (typeof ctx.get === "function" && ctx.get("connection") !== undefined) {
440
+ registerSettingsRpc(ctx);
441
+ } else {
442
+ ctx.inject(["connection"], registerSettingsRpc);
443
+ }
436
444
 
437
- ctx.logger?.info?.(
445
+ console.log(
438
446
  `[dsh-kaomoji] 已挂载(mode=${currentSettings.mode}, placement=${currentSettings.placement}, authority=${authority}, settingsFile=${settingsFile})`,
439
447
  );
440
448
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-kaomoji",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Add mood-aware Japanese kaomoji to DeepSeek Harness (dsh) replies; prompt-injection plugin with a curated library from kaomojiya.org.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",