dsh-everything-search 1.0.0 → 1.0.1

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
@@ -38,7 +38,7 @@ window.__ModuleLoader__.load({
38
38
  function commit(paths) { if (commitHandler) commitHandler(paths) }
39
39
 
40
40
  // ---- 插件设置(localStorage 落盘) ----
41
- var settings = { limit: 50, kind: 'all', path: '' }
41
+ var settings = { limit: 50, kind: 'all', path: '', prefer: true }
42
42
  var settingsListeners = new Set()
43
43
  function getSettings() { return settings }
44
44
  function updateSettings(patch) {
@@ -56,23 +56,34 @@ window.__ModuleLoader__.load({
56
56
  limit: Number(p.limit) > 0 ? Math.min(Number(p.limit), 200) : 50,
57
57
  kind: (p.kind === 'folder' || p.kind === 'file' || p.kind === 'all') ? p.kind : 'all',
58
58
  path: (typeof p.path === 'string' && p.path.trim()) ? p.path : '',
59
+ prefer: p.prefer !== false,
59
60
  }
60
61
  } catch (e) { return null }
61
62
  }
62
63
  function saveStorage() {
63
64
  try {
64
65
  if (typeof localStorage === 'undefined') return
65
- localStorage.setItem('evsr-settings', JSON.stringify({ limit: settings.limit, kind: settings.kind, path: settings.path }))
66
+ localStorage.setItem('evsr-settings', JSON.stringify({ limit: settings.limit, kind: settings.kind, path: settings.path, prefer: settings.prefer }))
66
67
  } catch (e) { /* ignore */ }
67
68
  }
68
69
  function reloadSettings() { const p = loadStorage(); if (p) updateSettings(p) }
69
70
  function saveSettings(patch) { updateSettings(patch); saveStorage() }
70
71
 
72
+ // 优先开关:保存到本地 + 同步到 Host(Host 据此加/移除系统提示)
73
+ function setPrefer(v) {
74
+ saveSettings({ prefer: Boolean(v) })
75
+ try { apiCall('set-preference', { prefer: Boolean(v) }) } catch (e) { /* ignore */ }
76
+ }
77
+
71
78
  // 拉取插件默认 es.exe 路径(打包在插件 lib 里的),作为路径默认值
72
79
  apiCall('default-path').then(function (p) {
73
80
  if (typeof p === 'string' && p.trim()) { if (!getSettings().path) saveSettings({ path: p }) }
74
81
  }, function () { /* ignore */ })
75
82
 
83
+ // 加载本地设置并同步"优先开关"到 Host(Host 据此加/移除系统提示)
84
+ reloadSettings()
85
+ try { apiCall('set-preference', { prefer: getSettings().prefer }) } catch (e) { /* ignore */ }
86
+
76
87
  function toMention(path) {
77
88
  const p = String(path || '').replace(/\\/g, '/')
78
89
  if (/[\u0000-\u001f\u007f-\u009f"]/.test(p)) return null
@@ -343,6 +354,22 @@ window.__ModuleLoader__.load({
343
354
  }),
344
355
  ),
345
356
  ),
357
+ React.createElement('div', { className: 'evs-set-row' },
358
+ React.createElement('div', { className: 'evs-set-info' },
359
+ React.createElement('div', { className: 'evs-set-label' }, '默认用 Everything 优先搜索'),
360
+ React.createElement('div', { className: 'evs-set-desc' }, '开启后 AI 找文件时优先用全盘索引搜索(推荐)'),
361
+ ),
362
+ React.createElement('div', { className: 'evs-seg' },
363
+ React.createElement('button', {
364
+ className: s.prefer ? 'evs-seg-btn active' : 'evs-seg-btn',
365
+ onClick: function () { setPrefer(true) },
366
+ }, '开启'),
367
+ React.createElement('button', {
368
+ className: !s.prefer ? 'evs-seg-btn active' : 'evs-seg-btn',
369
+ onClick: function () { setPrefer(false) },
370
+ }, '关闭'),
371
+ ),
372
+ ),
346
373
  React.createElement('div', { className: 'evs-set-row' },
347
374
  React.createElement('div', { className: 'evs-set-info' },
348
375
  React.createElement('div', { className: 'evs-set-label' }, '搜索引擎路径'),
package/lib/index.js CHANGED
@@ -10,11 +10,30 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
10
10
  const ES = join(__dirname, 'es.exe')
11
11
  const TEMP = tmpdir()
12
12
 
13
- export const inject = ['webServer', 'tools']
13
+ export const inject = ['webServer', 'tools', 'systemPrompt']
14
14
 
15
15
  export function apply(ctx) {
16
16
  const webServer = ctx.get('webServer')
17
17
  const tools = ctx.get('tools')
18
+ const systemPrompt = ctx.get('systemPrompt')
19
+
20
+ // 是否默认用 Everything 优先搜索(可被客户端设置开关切换)
21
+ let prefer = true
22
+ let sectionDisposer = null
23
+ function applyPreference() {
24
+ if (sectionDisposer) {
25
+ sectionDisposer()
26
+ sectionDisposer = null
27
+ }
28
+ if (prefer && systemPrompt) {
29
+ sectionDisposer = systemPrompt.section({
30
+ name: 'evs-prefer-everything-search',
31
+ order: 118,
32
+ text: '【插件提示 · Everything 全盘搜索】当用户要求查找 / 搜索 / 找到某个文件或文件夹时,请优先调用 `everything_search` 工具(基于 Everything 全盘索引,实时返回全盘结果,支持 *.ext、ext: 类型、scope 限定文件夹等语法)。只有当你确认当前任务限定在工作区 / 项目内、或 everything_search 明显不可用时,才回退到 glob / grep 等工具。',
33
+ })
34
+ }
35
+ }
36
+ applyPreference()
18
37
 
19
38
  async function runSearch(args) {
20
39
  const query = String((args && args.query) || '').trim()
@@ -87,6 +106,28 @@ export function apply(ctx) {
87
106
  res.end(JSON.stringify(ES))
88
107
  },
89
108
  })
109
+ webServer.register({
110
+ kind: 'exact',
111
+ path: '/evs/api/get-preference',
112
+ handler: async (req, res) => {
113
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' })
114
+ res.end(JSON.stringify({ prefer }))
115
+ },
116
+ })
117
+ webServer.register({
118
+ kind: 'exact',
119
+ path: '/evs/api/set-preference',
120
+ handler: async (req, res) => {
121
+ let body = ''
122
+ try { for await (const chunk of req) body += chunk } catch (e) { /* ignore */ }
123
+ let args = {}
124
+ try { args = body ? JSON.parse(body) : {} } catch (e) { args = {} }
125
+ prefer = Boolean(args && args.prefer)
126
+ applyPreference()
127
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' })
128
+ res.end(JSON.stringify({ prefer }))
129
+ },
130
+ })
90
131
  }
91
132
 
92
133
  if (tools) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-everything-search",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Everything 文件搜索插件(DeepSeek Harness / DSH):全盘极速搜索文件与文件夹,多选后一键加入对话上下文,设置可自定义,es.exe 随插件打包。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",