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 +29 -2
- package/lib/index.js +42 -1
- package/package.json +1 -1
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) {
|