dsh-zhihu-search 1.2.7 → 1.3.0

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/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
  <h1 align="center">dsh-zhihu-search</h1>
3
3
  </p>
4
4
 
5
+ <p align="center">
6
+ <img src="assets/cover.svg" alt="dsh-zhihu-search:给 DSH 装上知乎搜索" width="600">
7
+ </p>
8
+
5
9
  <div align="center">
6
10
  <p><strong>赋予 DeepSeek Harness 检索知乎社区的能力</strong></p>
7
11
  <p><em>Empowering DeepSeek Harness with Zhihu Insights</em></p>
@@ -9,14 +13,13 @@
9
13
  <p>
10
14
  <a href="https://developer.zhihu.com/"><img src="https://img.shields.io/badge/Zhihu%20Open%20Platform-Official%20API-0084FF?style=flat&logo=zhihu&logoColor=white" alt="知乎开放平台官方 API"></a>
11
15
  <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/DeepSeek%20Harness-Plugin-4176E6?style=flat" alt="DeepSeek Harness Plugin"></a>
12
- <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/dsh--plugin-Auto%20Discovered-orange?style=flat" alt="dsh-plugin"></a>
13
16
  </p>
14
17
 
15
18
  <p>
16
19
  <a href="https://github.com/zlZayn/dsh-zhihu-search/actions/workflows/ci.yml"><img src="https://github.com/zlZayn/dsh-zhihu-search/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
17
20
  <a href="https://www.npmjs.com/package/dsh-zhihu-search"><img src="https://img.shields.io/npm/v/dsh-zhihu-search.svg" alt="npm"></a>
18
21
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT 许可证"></a>
19
- <a href="https://slsa.dev/"><img src="https://img.shields.io/badge/SLSA-Provenance-green?logo=slsa" alt="SLSA Provenance"></a>
22
+ <a href="https://www.npmjs.com/package/dsh-zhihu-search"><img src="https://img.shields.io/badge/SLSA-Build%20L2-green?logo=slsa" alt="SLSA Build L2"></a>
20
23
  </p>
21
24
 
22
25
  <p>
@@ -136,6 +139,14 @@ Access Secret 在[知乎开放平台个人中心](https://developer.zhihu.com/pr
136
139
 
137
140
  不想把密钥存在设置里时,改用环境变量 `ZHIHU_ACCESS_SECRET`;或在卡片的「凭据引用名」里填别的名字,指向另一个环境变量或凭据记录。
138
141
 
142
+ ### 只用知乎检索
143
+
144
+ 卡片里的「隐藏原生网页搜索(web_search / web_fetch)」开关默认关闭 —— 插件不擅自削宿主能力。打开并保存后,模型看不到 DSH 原生的 `web_search` 与 `web_fetch`,只用知乎的三个工具。
145
+
146
+ - 从**下一次模型请求**起生效,无需重启、无需新窗口。
147
+ - 该 agent 派生的子 agent 一并遵守同一套规则。
148
+ - 只控制模型可见性:tool-web 插件本身照常加载,关掉开关即恢复。
149
+
139
150
  ## 安全与边界
140
151
 
141
152
  - Access Secret 只在设置界面、凭据域与环境变量之间流转:不写日志、不以明文进入缓存键、不进仓库。
package/README_en.md CHANGED
@@ -2,6 +2,10 @@
2
2
  <h1 align="center">dsh-zhihu-search</h1>
3
3
  </p>
4
4
 
5
+ <p align="center">
6
+ <img src="assets/cover.svg" alt="dsh-zhihu-search: Equipping DSH with Zhihu search" width="600">
7
+ </p>
8
+
5
9
  <div align="center">
6
10
  <p><strong>Empowering DeepSeek Harness with Zhihu Insights</strong></p>
7
11
  <p><em>赋予 DeepSeek Harness 检索知乎社区的能力</em></p>
@@ -9,14 +13,13 @@
9
13
  <p>
10
14
  <a href="https://developer.zhihu.com/"><img src="https://img.shields.io/badge/Zhihu%20Open%20Platform-Official%20API-0084FF?style=flat&logo=zhihu&logoColor=white" alt="Zhihu Open Platform Official API"></a>
11
15
  <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/DeepSeek%20Harness-Plugin-4176E6?style=flat" alt="DeepSeek Harness Plugin"></a>
12
- <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/dsh--plugin-Auto%20Discovered-orange?style=flat" alt="dsh-plugin"></a>
13
16
  </p>
14
17
 
15
18
  <p>
16
19
  <a href="https://github.com/zlZayn/dsh-zhihu-search/actions/workflows/ci.yml"><img src="https://github.com/zlZayn/dsh-zhihu-search/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
17
20
  <a href="https://www.npmjs.com/package/dsh-zhihu-search"><img src="https://img.shields.io/npm/v/dsh-zhihu-search.svg" alt="npm"></a>
18
21
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT License"></a>
19
- <a href="https://slsa.dev/"><img src="https://img.shields.io/badge/SLSA-Provenance-green?logo=slsa" alt="SLSA Provenance"></a>
22
+ <a href="https://www.npmjs.com/package/dsh-zhihu-search"><img src="https://img.shields.io/badge/SLSA-Build%20L2-green?logo=slsa" alt="SLSA Build L2"></a>
20
23
  </p>
21
24
 
22
25
  <p>
@@ -136,6 +139,14 @@ Get the Access Secret from the [Zhihu Open Platform profile](https://developer.z
136
139
 
137
140
  If you would rather not keep the secret in settings, use the `ZHIHU_ACCESS_SECRET` environment variable. Or put a different name in the card's "Credential reference" to point at another environment variable or credential record.
138
141
 
142
+ ### Zhihu results only
143
+
144
+ The card's "Hide native web search (web_search / web_fetch)" switch is off by default — the plugin does not quietly remove host capabilities. Turn it on and save, and the model no longer sees DSH's native `web_search` and `web_fetch`, leaving only the three Zhihu tools.
145
+
146
+ - Applies from the **next model request**: no restart, no new window.
147
+ - Agents derived from that one follow the same rule.
148
+ - Visibility only: the tool-web plugin still loads, and switching it back off restores the tools.
149
+
139
150
  ## Security and boundaries
140
151
 
141
152
  - The Access Secret only travels between the settings UI, the credential scope and the environment: never logged, never in a cache key in clear text, never committed.
package/lib/client.js CHANGED
@@ -50,6 +50,8 @@ var zh = {
50
50
  refOverridden: "\u5DF2\u8986\u76D6",
51
51
  reset: "\u91CD\u7F6E",
52
52
  refHint: "\u73AF\u5883\u53D8\u91CF\u6216\u51ED\u636E\u8BB0\u5F55\u7684\u540D\u5B57\uFF1B\u7559\u7A7A\u5E76\u4FDD\u5B58\u4F1A\u6E05\u6389\u8986\u76D6\uFF0C\u56DE\u843D\u5230\u9ED8\u8BA4\u7684 ZHIHU_ACCESS_SECRET\u3002",
53
+ hideNativeWebLabel: "\u9690\u85CF\u539F\u751F\u7F51\u9875\u641C\u7D22\uFF08web_search / web_fetch\uFF09",
54
+ hideNativeWebHint: "\u4EC5\u63A7\u5236\u6A21\u578B\u53EF\u89C1\u6027\uFF0C\u4E0D\u5F71\u54CD tool-web \u63D2\u4EF6\u672C\u8EAB\u72B6\u6001\u3002\u4FDD\u5B58\u540E\u4ECE\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8D77\u751F\u6548\uFF0C\u65E0\u9700\u91CD\u542F\u3002",
53
55
  discard: "\u653E\u5F03",
54
56
  save: "\u4FDD\u5B58",
55
57
  saving: "\u4FDD\u5B58\u4E2D\u2026"
@@ -69,6 +71,8 @@ var en = {
69
71
  refOverridden: "Overridden",
70
72
  reset: "Reset",
71
73
  refHint: "Name of an environment variable or credential record. Saving it blank clears the override and falls back to ZHIHU_ACCESS_SECRET.",
74
+ hideNativeWebLabel: "Hide native web search (web_search / web_fetch)",
75
+ hideNativeWebHint: "Controls model visibility only \u2014 the tool-web plugin itself stays untouched. Applies from the next model request after saving; no restart needed.",
72
76
  discard: "Discard",
73
77
  save: "Save",
74
78
  saving: "Saving\u2026"
@@ -81,6 +85,7 @@ var inject = ["slots", "settingsScope", "locale"];
81
85
  var NAMESPACE = "zhihu-search";
82
86
  var SECRET_FIELD = "accessSecret";
83
87
  var REF_FIELD = "accessSecretRef";
88
+ var HIDE_FIELD = "disableNativeWebSearch";
84
89
  var PROFILE_URL = "https://developer.zhihu.com/profile";
85
90
  function asRecord(value) {
86
91
  return typeof value === "object" && value !== null ? value : void 0;
@@ -158,6 +163,18 @@ var S = {
158
163
  width: "100%"
159
164
  },
160
165
  hint: { margin: 0, fontSize: 12, lineHeight: 1.5, color: "var(--dsw-alias-label-tertiary)" },
166
+ // 开关行:逐条对齐官方 SubagentModelSelectionCard.module.css 的 .toggleRow / .toggleLabel,
167
+ // 右侧放原生 `Switch`(同一个 ui-primitives 包),因此外观与官方卡片一致。
168
+ toggleRow: {
169
+ display: "flex",
170
+ alignItems: "flex-start",
171
+ justifyContent: "space-between",
172
+ gap: 16,
173
+ fontSize: 13,
174
+ lineHeight: 1.5,
175
+ color: "var(--dsw-alias-label-primary)"
176
+ },
177
+ toggleLabel: { flex: 1, minWidth: 0, fontSize: 13, lineHeight: 1.5 },
161
178
  // 说明句里的外链:只用卡片既有的语义令牌,颜色取自 ui-theme 的 --dsw-alias-link。
162
179
  // 卡片是纯内联样式、无法写 :hover,所以常驻下划线作为静态可点提示。
163
180
  link: {
@@ -214,6 +231,7 @@ function ZhihuCard({ scope, mirror, t }) {
214
231
  const [open, setOpen] = (0, import_react.useState)(false);
215
232
  const [secret, setSecret] = (0, import_react.useState)("");
216
233
  const [refDraft, setRefDraft] = (0, import_react.useState)(void 0);
234
+ const [hideDraft, setHideDraft] = (0, import_react.useState)(void 0);
217
235
  const [saving, setSaving] = (0, import_react.useState)(false);
218
236
  const [failed, setFailed] = (0, import_react.useState)("");
219
237
  const writable = snapshot.writable && snapshot.status === "ready";
@@ -222,11 +240,15 @@ function ZhihuCard({ scope, mirror, t }) {
222
240
  const refText = refDraft ?? effectiveRef;
223
241
  const refOverridden = asRecord(snapshot.user)?.[REF_FIELD] !== void 0;
224
242
  const refDirty = refText !== effectiveRef;
225
- const dirty = secret !== "" || refDirty;
243
+ const hideEffective = snapshot.value?.[HIDE_FIELD] === true;
244
+ const hideText = hideDraft ?? hideEffective;
245
+ const hideDirty = hideDraft !== void 0 && hideDraft !== hideEffective;
246
+ const dirty = secret !== "" || refDirty || hideDirty;
226
247
  const blocked = !dirty || disabled;
227
248
  const discard = () => {
228
249
  setSecret("");
229
250
  setRefDraft(void 0);
251
+ setHideDraft(void 0);
230
252
  setFailed("");
231
253
  };
232
254
  const save = async () => {
@@ -238,8 +260,10 @@ function ZhihuCard({ scope, mirror, t }) {
238
260
  if (refText === "") await scope.unset(REF_FIELD);
239
261
  else await scope.set(REF_FIELD, refText);
240
262
  }
263
+ if (hideDirty) await scope.set(HIDE_FIELD, hideText);
241
264
  setSecret("");
242
265
  setRefDraft(void 0);
266
+ setHideDraft(void 0);
243
267
  setOpen(false);
244
268
  } catch (error) {
245
269
  setFailed(error instanceof Error ? error.message : String(error));
@@ -338,6 +362,23 @@ function ZhihuCard({ scope, mirror, t }) {
338
362
  ),
339
363
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: S.hint, children: t("refHint") })
340
364
  ] }),
365
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: S.fieldDivider, children: [
366
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: S.toggleRow, children: [
367
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: S.toggleLabel, children: t("hideNativeWebLabel") }),
368
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
369
+ import_dsh_client_ui_primitives.Switch,
370
+ {
371
+ checked: hideText,
372
+ label: t("hideNativeWebLabel"),
373
+ disabled,
374
+ onChange: (next) => {
375
+ setHideDraft(next);
376
+ }
377
+ }
378
+ )
379
+ ] }),
380
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: S.hint, children: t("hideNativeWebHint") })
381
+ ] }),
341
382
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: S.footer, children: [
342
383
  failed !== "" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: S.failed, role: "status", children: failed }) : null,
343
384
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", style: dimStyle(S.discard, !dirty || saving), disabled: !dirty || saving, onClick: discard, children: t("discard") }),
package/lib/index.d.ts CHANGED
@@ -53,6 +53,13 @@ export interface Config {
53
53
  enableGlobalSearch?: boolean;
54
54
  /** 是否注册直答工具。 */
55
55
  enableZhida?: boolean;
56
+ /**
57
+ * 是否对模型隐藏 DSH 原生的 `web_search` / `web_fetch`。
58
+ *
59
+ * 默认 `false`:插件不擅自削宿主能力。打开后按 agent 生效,
60
+ * 且作用于该 agent 派生的子 agent(restriction 沿 scope 链继承)。
61
+ */
62
+ disableNativeWebSearch?: boolean;
56
63
  }
57
64
  /** 配置的运行时校验 schema;默认值同时是文档。 */
58
65
  export declare const Config: z<Schemastery.ObjectS<{
@@ -67,6 +74,7 @@ export declare const Config: z<Schemastery.ObjectS<{
67
74
  enableSearch: z<boolean, boolean>;
68
75
  enableGlobalSearch: z<boolean, boolean>;
69
76
  enableZhida: z<boolean, boolean>;
77
+ disableNativeWebSearch: z<boolean, boolean>;
70
78
  }>, Schemastery.ObjectT<{
71
79
  accessSecret: z<string, string>;
72
80
  accessSecretRef: z<string, string>;
@@ -79,6 +87,7 @@ export declare const Config: z<Schemastery.ObjectS<{
79
87
  enableSearch: z<boolean, boolean>;
80
88
  enableGlobalSearch: z<boolean, boolean>;
81
89
  enableZhida: z<boolean, boolean>;
90
+ disableNativeWebSearch: z<boolean, boolean>;
82
91
  }>>;
83
92
  /**
84
93
  * 注册插件:创建状态与客户端,注册设置命名空间,并按配置注册各工具。
package/lib/index.js CHANGED
@@ -30,6 +30,13 @@ export const inject = ['tools'];
30
30
  export const ZHIHU_SETTINGS_NAMESPACE = 'zhihu-search';
31
31
  /** 凭据引用的默认名,按 DSH 约定取环境变量名。 */
32
32
  export const DEFAULT_ACCESS_SECRET_REF = 'ZHIHU_ACCESS_SECRET';
33
+ /**
34
+ * DSH 原生网页工具名(由 `@deepseek-ai/dsh-tool-web` 注册)。
35
+ *
36
+ * `tools.restrict()` 会按名字校验并**抛错**,而 `agent/created` 监听器里的同步异常
37
+ * 会否决 agent 创建(DSH `core/agent` 的注册表语义),所以使用前必须按真实注册表过滤。
38
+ */
39
+ const NATIVE_WEB_TOOLS = ['web_search', 'web_fetch'];
33
40
  /** 配置的运行时校验 schema;默认值同时是文档。 */
34
41
  export const Config = z.object({
35
42
  // 与官方 web 搜索提供者同构:secret 角色负责「掩码显示 + 不下发明文」,
@@ -45,6 +52,7 @@ export const Config = z.object({
45
52
  enableSearch: z.boolean().default(true),
46
53
  enableGlobalSearch: z.boolean().default(true),
47
54
  enableZhida: z.boolean().default(true),
55
+ disableNativeWebSearch: z.boolean().default(false),
48
56
  });
49
57
  /**
50
58
  * 断言配置项是正整数。
@@ -110,11 +118,84 @@ export function apply(ctx, config) {
110
118
  return literal;
111
119
  return `ref:${section.accessSecretRef ?? DEFAULT_ACCESS_SECRET_REF}`;
112
120
  };
121
+ /** 一条告警通道;宿主 logger 缺失时静默 —— 诊断本身不该成为故障源。 */
122
+ const logger = ctx.logger;
123
+ const warn = (message) => {
124
+ logger?.warn?.(message);
125
+ };
113
126
  if ((config.accessSecret ?? '').trim() === '') {
114
127
  // 只告警不阻断:profile 必须能正常启动。
115
- const logger = ctx.logger;
116
- logger?.warn?.('[zhihu-search] 未配置 accessSecret,工具会注册但调用时返回鉴权错误。可在 DSH 设置 → 插件 → 知乎搜索 中填写。');
128
+ warn('[zhihu-search] 未配置 accessSecret,工具会注册但调用时返回鉴权错误。可在 DSH 设置 → 插件 → 知乎搜索 中填写。');
117
129
  }
130
+ // ── 隐藏 DSH 原生网页工具 ──────────────────────────────────────────────
131
+ // restriction 挂在**agent 的 scope** 上,`tools.restrict()` 返回的正是撤销它自己
132
+ // 那一个;想撤销就必须持有它,所以这张表省不掉。restriction 本身随 agent scope
133
+ // 自动撤销,这里只是我们这一侧的账,用于「拨回开关」与「插件卸载」两个时机。
134
+ const restrictions = new Map();
135
+ /** 本刻真实存在、可被 deny 的原生工具名 —— 名字不存在时 deny 会让 restrict 抛错。 */
136
+ const restrictableNativeTools = () => NATIVE_WEB_TOOLS.filter((toolName) => ctx.tools.get(toolName) !== undefined);
137
+ /**
138
+ * 给一个 agent 装上 restriction(已装或不需要装时是空操作)。
139
+ *
140
+ * 刻意吞掉异常:`agent/created` 监听器同步抛错会**否决 agent 创建并回滚**,
141
+ * 一个可选的界面开关不该有这种权力。
142
+ */
143
+ const installOn = (agent) => {
144
+ if (current().disableNativeWebSearch !== true || restrictions.has(agent.id))
145
+ return;
146
+ const deny = restrictableNativeTools();
147
+ if (deny.length === 0)
148
+ return;
149
+ try {
150
+ restrictions.set(agent.id, agent.ctx.tools.restrict({ deny }));
151
+ }
152
+ catch (error) {
153
+ warn(`[zhihu-search] 隐藏原生网页工具失败(不影响其他功能):${String(error)}`);
154
+ }
155
+ };
156
+ /** 摘掉一个 agent 上的 restriction。 */
157
+ const liftFrom = (agentId) => {
158
+ const dispose = restrictions.get(agentId);
159
+ if (dispose === undefined)
160
+ return;
161
+ restrictions.delete(agentId);
162
+ try {
163
+ dispose();
164
+ }
165
+ catch {
166
+ // 撤销失败不该波及别处:账已经销了,scope 销毁时也会兜底清理。
167
+ }
168
+ };
169
+ /**
170
+ * 幂等对账:让每个 live agent 的 restriction 与当前配置一致。
171
+ *
172
+ * 三个时机共用它 —— agent 服务就绪、设置写入、以及新 agent 出现。
173
+ * 幂等是硬要求:保存 Access Secret 同样会触发 `onChange`。
174
+ */
175
+ const syncNativeWebTools = () => {
176
+ const registry = ctx.get('agents');
177
+ if (registry === undefined)
178
+ return;
179
+ const wanted = current().disableNativeWebSearch === true;
180
+ for (const agent of registry.list()) {
181
+ if (wanted)
182
+ installOn(agent);
183
+ else
184
+ liftFrom(agent.id);
185
+ }
186
+ };
187
+ // 新 agent 补装;销毁时销账(它的 scope 已随之撤销)。
188
+ ctx.on('agent/created', ({ agent }) => {
189
+ installOn(agent);
190
+ });
191
+ ctx.on('agent/disposed', ({ agent }) => {
192
+ restrictions.delete(agent.id);
193
+ });
194
+ // agent 服务就绪时补一次对账:正常启动顺序下 agent 晚于插件出现,
195
+ // HMR 换装时则可能已经有 live agent。
196
+ ctx.inject(['agents'], () => {
197
+ syncNativeWebTools();
198
+ });
118
199
  // 设置命名空间:让 Host 把这个 section 暴露给浏览器端的描述镜像,
119
200
  // 否则自带的「插件」设置页不会分派我们的卡片。
120
201
  ctx.inject(['settings'], (settingsCtx) => {
@@ -122,9 +203,26 @@ export function apply(ctx, config) {
122
203
  setSource: (source) => {
123
204
  current = source;
124
205
  },
125
- onChange: () => { },
206
+ // 写入后就地生效:可见集在**每次模型请求**时重算,因此下一次请求即采用新集合,
207
+ // 不需要新窗口。DSH 在 section attach/detach 时也会调它,所以这里必须幂等。
208
+ onChange: () => {
209
+ syncNativeWebTools();
210
+ },
126
211
  });
127
212
  });
213
+ // 插件卸载(含 HMR 换装):撤掉我们装过的 restriction ——
214
+ // 它们挂在 agent 的 scope 上,不会随本插件卸载自动消失。
215
+ ctx.effect(() => () => {
216
+ for (const dispose of restrictions.values()) {
217
+ try {
218
+ dispose();
219
+ }
220
+ catch {
221
+ // 同上:卸载路径不因单个撤销失败而中断。
222
+ }
223
+ }
224
+ restrictions.clear();
225
+ }, 'zhihu-search: native web tool restrictions');
128
226
  ctx.effect(() => {
129
227
  // 全部可变状态在此创建,随 effect 一起销毁。
130
228
  const state = createState({
@@ -18,7 +18,7 @@ import type { LocaleNamespaceMap } from '@deepseek-ai/dsh-client-ui-slots';
18
18
  */
19
19
  export declare const LOCALE_NS = "zhihu-search";
20
20
  /** 本卡片全部文案的 key。 */
21
- export type ZhihuLocaleKey = 'title' | 'description' | 'unsaved' | 'readOnly' | 'secretLabel' | 'secretConfigured' | 'secretMissing' | 'secretHintBefore' | 'secretHintLink' | 'secretHintAfter' | 'refLabel' | 'refOverridden' | 'reset' | 'refHint' | 'discard' | 'save' | 'saving';
21
+ export type ZhihuLocaleKey = 'title' | 'description' | 'unsaved' | 'readOnly' | 'secretLabel' | 'secretConfigured' | 'secretMissing' | 'secretHintBefore' | 'secretHintLink' | 'secretHintAfter' | 'refLabel' | 'refOverridden' | 'reset' | 'refHint' | 'hideNativeWebLabel' | 'hideNativeWebHint' | 'discard' | 'save' | 'saving';
22
22
  declare module '@deepseek-ai/dsh-client-ui-slots' {
23
23
  interface LocaleNamespaceMap {
24
24
  'zhihu-search': ZhihuLocaleKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-zhihu-search",
3
- "version": "1.2.7",
3
+ "version": "1.3.0",
4
4
  "description": "DSH plugin: Zhihu in-site search, global web search, and Zhida over the official Zhihu Open Platform API — with a native settings card and source-cited results.",
5
5
  "keywords": [
6
6
  "dsh",