dsh-messager 0.3.0 → 0.3.3

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/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAA;AA4HjE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC,CAAA;AAE1E,yDAAyD;AACzD,EAAE;AACF,8DAA8D;AAC9D,sEAAsE;AACtE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACtD,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACpD,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;KACjD,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAClD,iCAAiC;QACjC,sDAAsD;QACtD,uDAAuD;QACvD,4BAA4B;QAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACzD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;QACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;QAChE,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC7D,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC5D,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACvC,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAE;KACpE,CAAC;CACH,CAAC,CAAA;AAgBF;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC1E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAiB,EAAE;IAC/C,OAAO,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAU,CAAC,CAAW,CAAA;AACzE,CAAC"}
package/lib/index.d.ts CHANGED
@@ -9,7 +9,24 @@
9
9
  * 的 base 层,设置页可覆盖;两者变更均热生效。
10
10
  */
11
11
  import type { Context } from '@deepseek-ai/cordis';
12
- import { type Config } from './config.js';
12
+ import { type RuntimeConfig } from './config.js';
13
13
  export declare const name = "dsh-messager";
14
- export declare function apply(ctx: Context, config: Config): void;
14
+ /**
15
+ * ⚠️ 必须从**入口模块**导出 `Config` schema。
16
+ *
17
+ * DSH 0.1.7 由 Loader 直接读取插件模块的 `Config` 导出作为 settings 表单 schema
18
+ * (`entry.fiber.runtime.Config`,见 packages/settings/settings/src/index.ts 的
19
+ * `schema(entry)`)。schema 只在 src/config.ts 定义、入口不导出的话,
20
+ * `describe()` 会直接跳过本条目 —— 表现为设置页/配置路由一律 `unavailable`,
21
+ * 且没有任何报错。这是 0.1.7 的硬契约。
22
+ */
23
+ export { Config } from './config.js';
24
+ /**
25
+ * 插件入口。
26
+ *
27
+ * @param ctx - 插件上下文。
28
+ * @param config - Loader 传入的运行时配置:可编辑字段是 volatile 引用
29
+ * (`.volatile()` 的输出形态,见 src/config.ts),由 `resolveConfig` 取值。
30
+ */
31
+ export declare function apply(ctx: Context, config: RuntimeConfig): void;
15
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAYxD,eAAO,MAAM,IAAI,iBAAiB,CAAA;AAgFlC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAqFjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAA6C,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAY3F,eAAO,MAAM,IAAI,iBAAiB,CAAA;AAElC;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAkGpC;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,QAsGxD"}
package/lib/index.js CHANGED
@@ -17,9 +17,36 @@ import { createWecomChannel } from './channels/wecom.js';
17
17
  import { createDiscordChannel } from './channels/discord.js';
18
18
  import { createDingtalkChannel } from './channels/dingtalk.js';
19
19
  import { createTelegramChannel } from './channels/telegram.js';
20
- import { registerMessagerSettings } from './settings.js';
20
+ import { resolveNamespace } from './settings.js';
21
21
  import { mountConfigRoutes } from './config-route.js';
22
22
  export const name = 'dsh-messager';
23
+ /**
24
+ * ⚠️ 必须从**入口模块**导出 `Config` schema。
25
+ *
26
+ * DSH 0.1.7 由 Loader 直接读取插件模块的 `Config` 导出作为 settings 表单 schema
27
+ * (`entry.fiber.runtime.Config`,见 packages/settings/settings/src/index.ts 的
28
+ * `schema(entry)`)。schema 只在 src/config.ts 定义、入口不导出的话,
29
+ * `describe()` 会直接跳过本条目 —— 表现为设置页/配置路由一律 `unavailable`,
30
+ * 且没有任何报错。这是 0.1.7 的硬契约。
31
+ */
32
+ export { Config } from './config.js';
33
+ /**
34
+ * 通道构建结果的缓存签名:只覆盖**影响通道构造**的字段。
35
+ *
36
+ * `buildChannels` 会做图标存在性校验(同步 fs)等一次性工作,因此按签名缓存;
37
+ * verbosity 不影响构造(投递时才读),故不纳入。
38
+ * ⚠️ 新增通道/字段时必须同步补这里,否则改了配置不会重建通道。
39
+ */
40
+ function channelSignature(config) {
41
+ return JSON.stringify([
42
+ config.system.enabled, config.system.icon,
43
+ config.feishu.enabled, config.feishu.webhookUrl, config.feishu.secret, config.feishu.timeoutMs,
44
+ config.wecom.enabled, config.wecom.webhookUrl, config.wecom.secret, config.wecom.timeoutMs,
45
+ config.discord.enabled, config.discord.webhookUrl, config.discord.timeoutMs,
46
+ config.dingtalk.enabled, config.dingtalk.webhookUrl, config.dingtalk.secret, config.dingtalk.timeoutMs,
47
+ config.telegram.enabled, config.telegram.botToken, config.telegram.chatId, config.telegram.timeoutMs,
48
+ ]);
49
+ }
23
50
  /** 按当前配置构建启用的通道。 */
24
51
  function buildChannels(config) {
25
52
  const channels = [];
@@ -99,36 +126,58 @@ function ensureSessionTitle(dispatcher, session) {
99
126
  }
100
127
  dispatcher.noteSessionTitle(sessionId, title);
101
128
  }
129
+ /**
130
+ * 插件入口。
131
+ *
132
+ * @param ctx - 插件上下文。
133
+ * @param config - Loader 传入的运行时配置:可编辑字段是 volatile 引用
134
+ * (`.volatile()` 的输出形态,见 src/config.ts),由 `resolveConfig` 取值。
135
+ */
102
136
  export function apply(ctx, config) {
103
- // 配置层:settings 服务可能晚于本插件挂载,必须用 ctx.inject 动态接入;
104
- // 服务未就绪(如 headless profile)期间回退 Loader config 默认值。
137
+ /**
138
+ * 读取当前有效配置。
139
+ *
140
+ * ⚠️ 关键:**每次用时读取 volatile 引用**,绝不缓存配置快照。
141
+ *
142
+ * DSH 0.1.7 的 `settings/document-updated` 事件在 `describe()` 内部、
143
+ * `entry.fiber.config` 提交新值**之前**触发(见 settings/index.ts 的 describe():
144
+ * 先 emit,后 `projectForm(form, plainConfig(entry.fiber.config))`)。因此在事件
145
+ * 回调里快照配置会读到**旧值**,而 `raw` 已更新 → 不会再有第二次事件 →
146
+ * 调度器永久停留在旧配置。这正是「已关闭系统通知却仍弹 SnoreToast」的根因。
147
+ *
148
+ * Loader 会**就地更新** volatile 引用(`Entry._commitVolatile`),所以这里
149
+ * 每次调用都能拿到最新值 —— 这也是 DSH 官方插件(如 pwsh-local)的惯例用法。
150
+ */
151
+ const readConfig = () => resolveConfig(config);
152
+ /** 按签名缓存的通道构建(配置变化时自动重建)。 */
153
+ let channelCache;
154
+ const channelsFor = (current) => {
155
+ const signature = channelSignature(current);
156
+ if (channelCache?.signature !== signature) {
157
+ channelCache = { signature, channels: buildChannels(current) };
158
+ }
159
+ return channelCache.channels;
160
+ };
105
161
  const dispatcher = new NotificationDispatcher({
106
- config: resolveConfig(config),
107
- channels: buildChannels(resolveConfig(config)),
162
+ readConfig,
163
+ buildChannels: channelsFor,
108
164
  hooks: {
109
165
  logWarn: (message) => ctx.logger.warn(`[dsh-messager] ${message}`),
110
166
  logDebug: (message) => ctx.logger.debug(`[dsh-messager] ${message}`),
111
167
  },
112
168
  });
113
- // 配置热更新:settings 就绪后注册命名空间(base = Loader config),
114
- // 用户层/设置文档变更 → watch 重建通道;命名空间随注入 scope 自动卸载。
115
- ctx.inject(['settings'], (settingsCtx) => {
116
- const settings = registerMessagerSettings(settingsCtx, config);
117
- const effective = settings.get();
118
- dispatcher.reconfigure({ config: effective, channels: buildChannels(effective) });
119
- settingsCtx.effect(() => settings.watch((next) => {
120
- dispatcher.reconfigure({ config: next, channels: buildChannels(next) });
121
- }), 'dsh-messager: settings watch');
122
- });
123
- // 配置读写路由(webServer 通道):浏览器端经此读写 messager 命名空间,
169
+ // 配置读写路由(webServer 通道):浏览器端经此读写本插件命名空间,
124
170
  // 不受 Web 设置白名单门控(dsh-market 同款「正门」)。仅 Web 环境挂载;
125
171
  // headless profile 无 webServer 服务时本 inject 不执行,不影响通知功能。
172
+ //
173
+ // 注意:本插件的**自身配置**不需要 settings 服务 —— Loader 已把 volatile 引用
174
+ // 交给我们并就地更新(见 readConfig)。settings 只用于这条浏览器读写路由。
126
175
  ctx.inject(['webServer'], (webCtx) => {
127
176
  webCtx.inject(['settings'], (fullCtx) => {
128
177
  const settingsService = fullCtx.get('settings');
129
178
  if (settingsService === undefined)
130
179
  return;
131
- const disposeRoutes = mountConfigRoutes(fullCtx.webServer, settingsService);
180
+ const disposeRoutes = mountConfigRoutes(fullCtx.webServer, settingsService, resolveNamespace(fullCtx));
132
181
  fullCtx.effect(() => disposeRoutes, 'dsh-messager: config routes');
133
182
  });
134
183
  });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/notify.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * 规则/调度层:过滤(triggers)、冷却、完成防抖、通道限流,
3
3
  * 并把 Signal 渲染后分发给启用的通道。通道失败只记日志,绝不抛出。
4
+ *
5
+ * ⚠️ 配置与通道都在**投递时**求值(`readConfig` / `buildChannels` 注入),
6
+ * 不缓存快照。原因见 src/index.ts 的 readConfig 说明:DSH 0.1.7 的
7
+ * `settings/document-updated` 事件可能在 `entry.fiber.config` 提交新值**之前**触发,
8
+ * 若在事件回调里快照配置,会永久停留在旧值(表现为「关了通知还弹」)。
9
+ * Loader 就地更新 volatile 引用,因此「用时读取」永远是最新的。
4
10
  */
5
11
  import type { Config } from './config.ts';
6
12
  import { type NotificationPayload } from './templates.js';
@@ -17,10 +23,12 @@ export interface DispatcherHooks {
17
23
  logWarn(message: string): void;
18
24
  logDebug?(message: string): void;
19
25
  }
20
- /** 通道配置更新(settings watch 回调时整体替换)。 */
21
- export interface DispatcherConfig {
22
- config: Config;
23
- channels: NotifyChannel[];
26
+ /** 调度器的配置/通道来源:每次投递时求值,保证取到 volatile 引用的最新值。 */
27
+ export interface DispatcherSources {
28
+ /** 读取当前有效配置。 */
29
+ readConfig(): Config;
30
+ /** 依据当前配置构建启用通道(实现方自行决定是否按签名缓存)。 */
31
+ buildChannels(config: Config): NotifyChannel[];
24
32
  }
25
33
  /**
26
34
  * 通知调度器:
@@ -30,8 +38,7 @@ export interface DispatcherConfig {
30
38
  * - 限流:每通道每分钟不超过 `perChannelPerMinute` 条。
31
39
  */
32
40
  export declare class NotificationDispatcher {
33
- private config;
34
- private readonly channels;
41
+ private readonly sources;
35
42
  private readonly hooks;
36
43
  private readonly now;
37
44
  /** sessionId → 会话标题(来自 session/title 事件)。 */
@@ -44,12 +51,10 @@ export declare class NotificationDispatcher {
44
51
  private readonly pendingCompleted;
45
52
  /** channelId → 最近一分钟内的投递时间戳。 */
46
53
  private readonly channelWindows;
47
- constructor(options: DispatcherConfig & {
54
+ constructor(options: DispatcherSources & {
48
55
  hooks: DispatcherHooks;
49
56
  now?: () => number;
50
57
  });
51
- /** 配置热更新(settings watch):替换配置与通道,保留标题/冷却等状态。 */
52
- reconfigure(next: DispatcherConfig): void;
53
58
  /** 记录会话标题(session/title 事件)。 */
54
59
  noteSessionTitle(sessionId: string, title: string): void;
55
60
  /** 是否已记录该会话的标题(缺失时插件可从会话事件日志兜底补取)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,aAAa,CAAA;AACpD,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAe,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtE,4BAA4B;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD;AAED,mBAAmB;AACnB,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,aAAa,EAAE,CAAA;CAC1B;AAOD;;;;;;GAMG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;gBAEjD,OAAO,EAAE,gBAAgB,GAAG;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE;IAOtF,gDAAgD;IAChD,WAAW,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAKzC,gCAAgC;IAChC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxD,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,uCAAuC;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAQ3D,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY9B,OAAO,CAAC,cAAc;IAMtB,iCAAiC;IACjC,OAAO,CAAC,iBAAiB;IAiBzB,yBAAyB;IACzB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,yBAAyB;IACzB,OAAO,CAAC,iBAAiB;IA4BzB,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAYpB,yCAAyC;IACzC,OAAO,CAAC,YAAY;IAYpB,2CAA2C;IAC3C,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,aAAa,CAAA;AACpD,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAe,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtE,4BAA4B;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD;AAED,mBAAmB;AACnB,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,UAAU,IAAI,MAAM,CAAA;IACpB,oCAAoC;IACpC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAAA;CAC/C;AAOD;;;;;;GAMG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;gBAEjD,OAAO,EAAE,iBAAiB,GAAG;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE;IAMvF,gCAAgC;IAChC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxD,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,uCAAuC;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAQ3D,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAa9B,OAAO,CAAC,cAAc;IAMtB,iCAAiC;IACjC,OAAO,CAAC,iBAAiB;IAiBzB,yBAAyB;IACzB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,yBAAyB;IACzB,OAAO,CAAC,iBAAiB;IA6BzB,gBAAgB;IAChB,OAAO,CAAC,YAAY;IAYpB,yCAAyC;IACzC,OAAO,CAAC,YAAY;IAYpB,2CAA2C;IAC3C,OAAO,IAAI,IAAI;CAIhB"}
package/lib/notify.js CHANGED
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * 规则/调度层:过滤(triggers)、冷却、完成防抖、通道限流,
3
3
  * 并把 Signal 渲染后分发给启用的通道。通道失败只记日志,绝不抛出。
4
+ *
5
+ * ⚠️ 配置与通道都在**投递时**求值(`readConfig` / `buildChannels` 注入),
6
+ * 不缓存快照。原因见 src/index.ts 的 readConfig 说明:DSH 0.1.7 的
7
+ * `settings/document-updated` 事件可能在 `entry.fiber.config` 提交新值**之前**触发,
8
+ * 若在事件回调里快照配置,会永久停留在旧值(表现为「关了通知还弹」)。
9
+ * Loader 就地更新 volatile 引用,因此「用时读取」永远是最新的。
4
10
  */
5
11
  import { renderPayload } from './templates.js';
6
12
  /**
@@ -11,8 +17,7 @@ import { renderPayload } from './templates.js';
11
17
  * - 限流:每通道每分钟不超过 `perChannelPerMinute` 条。
12
18
  */
13
19
  export class NotificationDispatcher {
14
- config;
15
- channels;
20
+ sources;
16
21
  hooks;
17
22
  now;
18
23
  /** sessionId → 会话标题(来自 session/title 事件)。 */
@@ -26,16 +31,10 @@ export class NotificationDispatcher {
26
31
  /** channelId → 最近一分钟内的投递时间戳。 */
27
32
  channelWindows = new Map();
28
33
  constructor(options) {
29
- this.config = options.config;
30
- this.channels = options.channels;
34
+ this.sources = { readConfig: options.readConfig, buildChannels: options.buildChannels };
31
35
  this.hooks = options.hooks;
32
36
  this.now = options.now ?? Date.now;
33
37
  }
34
- /** 配置热更新(settings watch):替换配置与通道,保留标题/冷却等状态。 */
35
- reconfigure(next) {
36
- this.config = next.config;
37
- this.channels.splice(0, this.channels.length, ...next.channels);
38
- }
39
38
  /** 记录会话标题(session/title 事件)。 */
40
39
  noteSessionTitle(sessionId, title) {
41
40
  if (title === '')
@@ -56,25 +55,26 @@ export class NotificationDispatcher {
56
55
  }
57
56
  /** 信号入口:interaction/error 立即处理;completed 进入防抖。 */
58
57
  onSignal(signal) {
59
- if (!this.triggerEnabled(signal.kind)) {
58
+ const config = this.sources.readConfig();
59
+ if (!this.triggerEnabled(signal.kind, config)) {
60
60
  this.hooks.logDebug?.(`[dispatcher] trigger disabled: ${signal.kind} ${signal.sessionId}`);
61
61
  return;
62
62
  }
63
63
  if (signal.kind === 'completed') {
64
- this.debounceCompleted(signal);
64
+ this.debounceCompleted(signal, config);
65
65
  return;
66
66
  }
67
67
  this.dispatchIfAllowed(signal);
68
68
  }
69
- triggerEnabled(kind) {
69
+ triggerEnabled(kind, config) {
70
70
  if (kind === 'interaction')
71
- return this.config.triggers.interaction;
71
+ return config.triggers.interaction;
72
72
  if (kind === 'completed')
73
- return this.config.triggers.completed;
74
- return this.config.triggers.error;
73
+ return config.triggers.completed;
74
+ return config.triggers.error;
75
75
  }
76
76
  /** 完成信号防抖:窗口内只保留最新信号,窗口结束才投递。 */
77
- debounceCompleted(signal) {
77
+ debounceCompleted(signal, config) {
78
78
  const sessionId = signal.sessionId;
79
79
  const merged = {
80
80
  ...signal,
@@ -84,10 +84,10 @@ export class NotificationDispatcher {
84
84
  if (existing !== undefined) {
85
85
  existing.signal = merged;
86
86
  clearTimeout(existing.timer);
87
- existing.timer = setTimeout(() => this.flushCompleted(sessionId), this.config.dedup.completedDebounceMs);
87
+ existing.timer = setTimeout(() => this.flushCompleted(sessionId), config.dedup.completedDebounceMs);
88
88
  return;
89
89
  }
90
- const timer = setTimeout(() => this.flushCompleted(sessionId), this.config.dedup.completedDebounceMs);
90
+ const timer = setTimeout(() => this.flushCompleted(sessionId), config.dedup.completedDebounceMs);
91
91
  this.pendingCompleted.set(sessionId, { signal: merged, timer });
92
92
  }
93
93
  /** 防抖窗口结束:投递(若仍满足冷却)。 */
@@ -100,25 +100,26 @@ export class NotificationDispatcher {
100
100
  }
101
101
  /** 冷却检查 + 逐通道渲染 + 分发。 */
102
102
  dispatchIfAllowed(signal) {
103
+ const config = this.sources.readConfig();
103
104
  const now = this.now();
104
105
  const key = `${signal.sessionId}:${signal.kind}`;
105
106
  const last = this.cooldowns.get(key);
106
- if (last !== undefined && now - last < this.config.dedup.interactionCooldownMs) {
107
+ if (last !== undefined && now - last < config.dedup.interactionCooldownMs) {
107
108
  this.hooks.logDebug?.(`[dispatcher] cooldown: skip ${key}`);
108
109
  return;
109
110
  }
110
111
  let dispatched = false;
111
- for (const channel of this.channels) {
112
- if (!this.allowChannel(channel.id, now)) {
112
+ for (const channel of this.sources.buildChannels(config)) {
113
+ if (!this.allowChannel(channel.id, now, config)) {
113
114
  this.hooks.logDebug?.(`[dispatcher] rate limited: ${channel.id}`);
114
115
  continue;
115
116
  }
116
117
  dispatched = true;
117
118
  const payload = renderPayload({
118
119
  signal,
119
- config: this.config,
120
+ config,
120
121
  sessionTitle: this.titles.get(signal.sessionId),
121
- verbosity: this.verbosityFor(channel.id),
122
+ verbosity: this.verbosityFor(channel.id, config),
122
123
  });
123
124
  void channel.send(payload).catch((error) => {
124
125
  this.hooks.logWarn(`channel "${channel.id}" failed: ${error instanceof Error ? error.message : String(error)}`);
@@ -128,10 +129,10 @@ export class NotificationDispatcher {
128
129
  this.cooldowns.set(key, now);
129
130
  }
130
131
  /** 每通道每分钟限流。 */
131
- allowChannel(channelId, now) {
132
+ allowChannel(channelId, now, config) {
132
133
  const windowStart = now - 60_000;
133
134
  const window = (this.channelWindows.get(channelId) ?? []).filter(timestamp => timestamp >= windowStart);
134
- if (window.length >= this.config.dedup.perChannelPerMinute) {
135
+ if (window.length >= config.dedup.perChannelPerMinute) {
135
136
  this.channelWindows.set(channelId, window);
136
137
  return false;
137
138
  }
@@ -140,14 +141,14 @@ export class NotificationDispatcher {
140
141
  return true;
141
142
  }
142
143
  /** 通道 verbosity:各通道独立配置;未知通道取 normal。 */
143
- verbosityFor(channelId) {
144
+ verbosityFor(channelId, config) {
144
145
  const byId = {
145
- system: this.config.system.verbosity,
146
- feishu: this.config.feishu.verbosity,
147
- wecom: this.config.wecom.verbosity,
148
- discord: this.config.discord.verbosity,
149
- dingtalk: this.config.dingtalk.verbosity,
150
- telegram: this.config.telegram.verbosity,
146
+ system: config.system.verbosity,
147
+ feishu: config.feishu.verbosity,
148
+ wecom: config.wecom.verbosity,
149
+ discord: config.discord.verbosity,
150
+ dingtalk: config.dingtalk.verbosity,
151
+ telegram: config.telegram.verbosity,
151
152
  };
152
153
  return byId[channelId] ?? 'normal';
153
154
  }
package/lib/notify.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
package/lib/settings.d.ts CHANGED
@@ -1,23 +1,36 @@
1
1
  /**
2
- * 配置层:把 Loader config(cordis.yml)注册为 settings 命名空间 `messager`
3
- * 的 base 层,设置页可编辑用户层覆盖。
2
+ * settings 命名空间解析。
4
3
  *
5
- * 注意:settings 服务可能晚于本插件加载,必须在 `ctx.inject(['settings'], …)`
6
- * 回调内调用本模块(见 src/index.ts),不能直接 `ctx.get('settings')`。
4
+ * ⚠️ DSH 0.1.7 起,settings 命名空间**不再是插件自己注册的**:
5
+ * - 命名空间 = profile 中该插件条目的**原始行 id**(本仓库 cordis.yml /
6
+ * cordis.patch.yml 均声明为 `messager`);
7
+ * - schema = 插件模块导出的 `Config`(即 src/config.ts),由 Loader 自动接管;
8
+ * - 因此**不存在** `ctx.settings.register(ns, schema, …)` 这种 API(0.1.2 时代的
9
+ * 写法,0.1.7 已移除,调用即崩溃)。
10
+ *
11
+ * 本模块只负责解析命名空间,供浏览器配置路由(src/config-route.ts)使用。
12
+ *
13
+ * 插件**自身的配置读取**不走这里:Loader 会把配置(volatile 引用)直接交给
14
+ * `apply(ctx, config)` 并就地更新,用时读取即可 —— 见 src/index.ts 的 readConfig。
7
15
  */
8
16
  import type { Context } from '@deepseek-ai/cordis';
9
- import { type Config as ConfigShape } from './config.js';
10
- export interface MessagerSettings {
11
- /** 当前有效配置(默认值 → base → 用户层)。 */
12
- get(): ConfigShape;
13
- /** 监听配置变更(提交后按序调用,返回注销函数)。 */
14
- watch(callback: (next: ConfigShape, prev: ConfigShape) => void): () => void;
15
- }
17
+ /** 本插件条目 id 的兜底值(与 cordis.yml / cordis.patch.yml 一致)。 */
18
+ export declare const FALLBACK_ENTRY_ID = "messager";
16
19
  /**
17
- * 在 settings 服务就绪的上下文中注册命名空间。
18
- * @param ctx - 已注入 settings 的上下文(inject 回调的 scope)。
19
- * @param base - Loader config(cordis.yml 的 config 段)。
20
- * @returns 设置句柄(注册本身是 effect,随注入 scope 卸载)。
20
+ * 解析本插件在 profile 中的条目 id(= settings 命名空间)。
21
+ *
22
+ * 沿 fiber 父链找 Loader 条目的**原始行 id**:`ctx.inject` 回调拿到的是**子**
23
+ * fiber,条目挂在上层,因此必须上溯 —— 与 `Loader.locate` 的走法一致。
24
+ *
25
+ * 不用 `Loader.locate()`:它返回的是 `Entry.id`(带父级前缀的复合 id,如
26
+ * `include:messager`),而 settings 要的是原始行 id(见 entryIdOfFiber 说明)。
27
+ *
28
+ * 解析不出来时退回条目名 `messager`,不抛错 —— 解析失败不应阻断通知功能。
29
+ * 之所以不硬编码:不同装载方式(bundle 的 cordis.patch.yml / dev 的 cordis.yml /
30
+ * marketplace 安装)可能给出不同的条目 id。
31
+ *
32
+ * @param ctx - 插件上下文(apply 的 ctx,或其 inject 子上下文)。
33
+ * @returns 条目 id。
21
34
  */
22
- export declare function registerMessagerSettings(ctx: Context, base: ConfigShape): MessagerSettings;
35
+ export declare function resolveNamespace(ctx: Context): string;
23
36
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAU,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,GAAG,IAAI,WAAW,CAAA;IAClB,8BAA8B;IAC9B,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAM1F"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,aAAa,CAAA;AA4B3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAErD"}
package/lib/settings.js CHANGED
@@ -1,22 +1,62 @@
1
1
  /**
2
- * 配置层:把 Loader config(cordis.yml)注册为 settings 命名空间 `messager`
3
- * 的 base 层,设置页可编辑用户层覆盖。
2
+ * settings 命名空间解析。
4
3
  *
5
- * 注意:settings 服务可能晚于本插件加载,必须在 `ctx.inject(['settings'], …)`
6
- * 回调内调用本模块(见 src/index.ts),不能直接 `ctx.get('settings')`。
4
+ * ⚠️ DSH 0.1.7 起,settings 命名空间**不再是插件自己注册的**:
5
+ * - 命名空间 = profile 中该插件条目的**原始行 id**(本仓库 cordis.yml /
6
+ * cordis.patch.yml 均声明为 `messager`);
7
+ * - schema = 插件模块导出的 `Config`(即 src/config.ts),由 Loader 自动接管;
8
+ * - 因此**不存在** `ctx.settings.register(ns, schema, …)` 这种 API(0.1.2 时代的
9
+ * 写法,0.1.7 已移除,调用即崩溃)。
10
+ *
11
+ * 本模块只负责解析命名空间,供浏览器配置路由(src/config-route.ts)使用。
12
+ *
13
+ * 插件**自身的配置读取**不走这里:Loader 会把配置(volatile 引用)直接交给
14
+ * `apply(ctx, config)` 并就地更新,用时读取即可 —— 见 src/index.ts 的 readConfig。
15
+ */
16
+ /** 本插件条目 id 的兜底值(与 cordis.yml / cordis.patch.yml 一致)。 */
17
+ export const FALLBACK_ENTRY_ID = 'messager';
18
+ /**
19
+ * 沿 fiber 父链上溯,找挂着 Loader 条目的那一层,取其**原始行 id**。
20
+ *
21
+ * ⚠️ 必须用 `entry.options.id`,**不能**用 `entry.id`:
22
+ * `Entry.id` 是带父级前缀的复合 id(profile 的行都挂在根 include 下,
23
+ * 形如 `include:messager`),而 settings 命名空间用的是原始行 id
24
+ * (`settings.describe()` 返回的 `ns` 即 `entry.options.id`,见
25
+ * packages/settings/settings/src/index.ts)。用错会导致命名空间永远匹配不上,
26
+ * 表现为设置页与配置路由一律 `unavailable` 且无任何报错。
7
27
  */
8
- import { Config } from './config.js';
28
+ function entryIdOfFiber(fiber) {
29
+ let current = fiber;
30
+ const visited = new Set();
31
+ while (current !== undefined && current !== null && !visited.has(current)) {
32
+ visited.add(current);
33
+ const id = current.entry?.options?.id;
34
+ if (typeof id === 'string' && id !== '')
35
+ return id;
36
+ const parent = current.parent?.fiber;
37
+ if (parent === current)
38
+ return undefined;
39
+ current = parent;
40
+ }
41
+ return undefined;
42
+ }
9
43
  /**
10
- * 在 settings 服务就绪的上下文中注册命名空间。
11
- * @param ctx - 已注入 settings 的上下文(inject 回调的 scope)。
12
- * @param base - Loader config(cordis.yml 的 config 段)。
13
- * @returns 设置句柄(注册本身是 effect,随注入 scope 卸载)。
44
+ * 解析本插件在 profile 中的条目 id(= settings 命名空间)。
45
+ *
46
+ * 沿 fiber 父链找 Loader 条目的**原始行 id**:`ctx.inject` 回调拿到的是**子**
47
+ * fiber,条目挂在上层,因此必须上溯 —— 与 `Loader.locate` 的走法一致。
48
+ *
49
+ * 不用 `Loader.locate()`:它返回的是 `Entry.id`(带父级前缀的复合 id,如
50
+ * `include:messager`),而 settings 要的是原始行 id(见 entryIdOfFiber 说明)。
51
+ *
52
+ * 解析不出来时退回条目名 `messager`,不抛错 —— 解析失败不应阻断通知功能。
53
+ * 之所以不硬编码:不同装载方式(bundle 的 cordis.patch.yml / dev 的 cordis.yml /
54
+ * marketplace 安装)可能给出不同的条目 id。
55
+ *
56
+ * @param ctx - 插件上下文(apply 的 ctx,或其 inject 子上下文)。
57
+ * @returns 条目 id。
14
58
  */
15
- export function registerMessagerSettings(ctx, base) {
16
- const scope = ctx.settings.register('messager', Config, { base, applies: 'live' });
17
- return {
18
- get: () => scope.get(),
19
- watch: (callback) => scope.watch(callback),
20
- };
59
+ export function resolveNamespace(ctx) {
60
+ return entryIdOfFiber(ctx.fiber) ?? FALLBACK_ENTRY_ID;
21
61
  }
22
62
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAShE;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY,EAAE,IAAiB;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAClF,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QACtB,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC3C,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAE3C;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,GAAG,KAED,CAAA;IACb,MAAM,OAAO,GAAG,IAAI,GAAG,EAAW,CAAA;IAClC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAA;QACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,CAAA;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAA;QACpC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAA;QACxC,OAAO,GAAG,MAAwB,CAAA;IACpC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAA;AACvD,CAAC"}
@@ -59,6 +59,8 @@ export interface MessagerCardState {
59
59
  writable: boolean;
60
60
  /** 是否存在待保存的编辑。 */
61
61
  dirty: boolean;
62
+ /** 未保存项数(保存计划里的 ops 条数;0 表示无变更)。 */
63
+ dirtyCount: number;
62
64
  /** 是否有非法草稿。 */
63
65
  invalid: boolean;
64
66
  saving: boolean;