dsh-locator 0.7.7 → 0.8.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/find.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"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"}
package/lib/http.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,cAAc,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AA+BhD,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAmDhH"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,cAAc,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAgChD,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAwDhH"}
package/lib/http.js CHANGED
@@ -11,6 +11,7 @@
11
11
  * service, and the plugin still works there through its tools.
12
12
  * @module dsh-locator/http
13
13
  */
14
+ import { readCombinedRequest, runCombinedSearch } from "./combined.js";
14
15
  import { openWithDefaultApp, revealInFileManager, withinRoots } from "./reveal.js";
15
16
  import { statSync } from 'node:fs';
16
17
  const BODY_LIMIT = 64 * 1024;
@@ -31,13 +32,18 @@ export function registerHttp(ctx, rt, content, ensure) {
31
32
  scoped.effect(() => server.register({
32
33
  kind: 'exact',
33
34
  path: '/dsh-locator/status',
34
- handler: handler(scoped, async () => await status(rt)),
35
+ handler: handler(scoped, async () => await status(rt, content)),
35
36
  }));
36
37
  scoped.effect(() => server.register({
37
38
  kind: 'exact',
38
39
  path: '/dsh-locator/reveal',
39
40
  handler: handler(scoped, async (body) => await reveal(rt, body)),
40
41
  }));
42
+ scoped.effect(() => server.register({
43
+ kind: 'exact',
44
+ path: '/dsh-locator/combined',
45
+ handler: handler(scoped, async (body) => await combined(rt, content, ensure, body)),
46
+ }));
41
47
  if (content !== undefined) {
42
48
  scoped.effect(() => server.register({
43
49
  kind: 'exact',
@@ -117,6 +123,26 @@ async function search(rt, raw) {
117
123
  hits: result.hits,
118
124
  };
119
125
  }
126
+ /**
127
+ * One panel search across all enabled scopes. The stores are injected so the
128
+ * orchestration (scope gating, lazy-build guard, de-duplication) stays testable
129
+ * without an HTTP request or an engine process.
130
+ */
131
+ async function combined(rt, content, ensure, raw) {
132
+ rt.start();
133
+ const deps = {
134
+ search: async (args) => await rt.search(args),
135
+ maxResults: rt.config.maxResults,
136
+ ...(content === undefined ? {} : {
137
+ contentSearch: async (query, limit) => await content.search(query, limit),
138
+ contentStatus: () => content.status(),
139
+ ...(ensure === undefined ? {} : { ensure }),
140
+ }),
141
+ };
142
+ const request = readCombinedRequest(raw, rt.config.maxResults);
143
+ const result = await runCombinedSearch(deps, request);
144
+ return { query: request.query, ...result };
145
+ }
120
146
  async function reveal(rt, raw) {
121
147
  const path = typeof raw.path === 'string' ? raw.path : '';
122
148
  if (path === '' || !withinRoots(path, rt.roots)) {
@@ -159,9 +185,10 @@ async function openPath(rt, raw) {
159
185
  return { ok: false, error: messageOf(error) };
160
186
  }
161
187
  }
162
- async function status(rt) {
188
+ async function status(rt, content) {
163
189
  rt.start();
164
190
  const engine = await rt.engineStatus();
191
+ const contentState = content === undefined ? { enabled: false } : { enabled: true, ...content.status() };
165
192
  return {
166
193
  running: rt.status.running,
167
194
  entries: engine?.entries ?? 0,
@@ -173,6 +200,7 @@ async function status(rt) {
173
200
  scanning: engine?.scanning === true || rt.status.scanning !== undefined,
174
201
  stateDir: engine?.stateDir ?? rt.stateDir,
175
202
  version: engine?.version ?? '',
203
+ content: contentState,
176
204
  ...(rt.status.error === undefined ? {} : { error: rt.status.error }),
177
205
  ...(rt.status.warning === undefined ? {} : { warning: rt.status.warning }),
178
206
  };
package/lib/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-locator",
3
- "version": "0.7.7",
3
+ "version": "0.8.1",
4
4
  "description": "Whole-disk, millisecond file search for DeepSeek Harness without Everything: a self-built cross-platform index, an Everything-style query language, agent tools and a Web search panel (Ctrl+Shift+F). Windows, macOS and Linux.",
5
5
  "author": "PerryLink contributors",
6
6
  "repository": {
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Combined search: one request for the three scopes the Web panel shows by
3
+ * default — content (bodies and sessions), files and directories.
4
+ *
5
+ * The name index and the content index live in different stores, so this module
6
+ * owns the orchestration and the merge rules as pure, injectable functions:
7
+ * scope gating, the lazy-build guard for empty queries, per-group degradation
8
+ * and de-duplication of a path that appears both as a body hit and a name hit.
9
+ * @module dsh-locator/combined
10
+ */
11
+
12
+ import type { ContentHit, ContentState } from './content.ts'
13
+ import type { SearchArgs, SearchHit, SearchResult } from './runtime.ts'
14
+
15
+ /** Which groups a combined request asked for; every scope is on by default. */
16
+ export interface CombinedScopes {
17
+ content: boolean
18
+ files: boolean
19
+ dirs: boolean
20
+ }
21
+
22
+ /** A validated combined request with per-group limits already clamped. */
23
+ export interface CombinedRequest {
24
+ query: string
25
+ limit: number
26
+ contentLimit: number
27
+ sort: string
28
+ desc: boolean
29
+ scopes: CombinedScopes
30
+ }
31
+
32
+ /** One name-index group: files or directories. */
33
+ export interface NameGroup {
34
+ hits: SearchHit[]
35
+ returned: number
36
+ total: number
37
+ truncated: boolean
38
+ /** Rows dropped because the same path already appears in the content group. */
39
+ deduped: number
40
+ tookMs: number
41
+ error?: string
42
+ }
43
+
44
+ /** The content group: body/session hits plus the index state at query time. */
45
+ export interface ContentGroup {
46
+ hits: ContentHit[]
47
+ returned: number
48
+ /** True when the group was cut off by its page limit. */
49
+ capped: boolean
50
+ building: boolean
51
+ files: number
52
+ sessions: number
53
+ messages: number
54
+ truncated: boolean
55
+ /** Wall-clock time of the content lookup; 0 when it was skipped. */
56
+ tookMs: number
57
+ error?: string
58
+ }
59
+
60
+ /** Everything the panel needs from one combined search. */
61
+ export interface CombinedResponse {
62
+ scopes: CombinedScopes
63
+ /** False when the plugin runs with `contentIndex: false`. */
64
+ contentEnabled: boolean
65
+ content?: ContentGroup
66
+ files?: NameGroup
67
+ dirs?: NameGroup
68
+ tookMs: number
69
+ }
70
+
71
+ /** Dependencies required to run a combined search; the HTTP layer supplies them. */
72
+ export interface CombinedDeps {
73
+ search(args: SearchArgs): Promise<SearchResult>
74
+ contentSearch?: (query: string, limit: number) => Promise<ContentHit[]>
75
+ contentStatus?: () => ContentState
76
+ ensure?: () => void
77
+ maxResults: number
78
+ }
79
+
80
+ /**
81
+ * Read the three scope flags from a request body. Anything that is not an
82
+ * explicit `false` counts as enabled, so a panel that only sends `{ content:
83
+ * true }` still gets the name groups.
84
+ * @param body - parsed request body.
85
+ * @returns normalized scopes.
86
+ */
87
+ export function readScopes(body: Record<string, unknown>): CombinedScopes {
88
+ return {
89
+ content: body.content !== false,
90
+ files: body.files !== false,
91
+ dirs: body.dirs !== false,
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Validate and clamp a combined request body. The two pages have separate
97
+ * limits: content hits are heavier (bodies/snippets) than name rows.
98
+ * @param body - parsed request body.
99
+ * @param maxResults - the plugin's hard per-page cap.
100
+ * @returns a normalized request.
101
+ */
102
+ export function readCombinedRequest(body: Record<string, unknown>, maxResults: number): CombinedRequest {
103
+ const nameLimit = clamp(body.limit, 1, Math.max(1, maxResults), 50)
104
+ const contentLimit = clamp(body.contentLimit, 1, 100, 30)
105
+ return {
106
+ query: typeof body.query === 'string' ? body.query : '',
107
+ limit: nameLimit,
108
+ contentLimit,
109
+ sort: sortKey(body.sort),
110
+ desc: body.desc === true,
111
+ scopes: readScopes(body),
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Drop name hits whose path is already present in the content group. Content
117
+ * rows carry the snippet and the jump target, so one row per path is enough;
118
+ * directories are never dropped.
119
+ * @param contentHits - body/session hits from the content index.
120
+ * @param nameHits - hits from the name index.
121
+ * @returns the kept hits and how many were dropped.
122
+ */
123
+ export function dedupeNameHits(
124
+ contentHits: readonly ContentHit[],
125
+ nameHits: readonly SearchHit[],
126
+ ): { hits: SearchHit[], deduped: number } {
127
+ const seen = new Set<string>()
128
+ for (const hit of contentHits) seen.add(hit.path)
129
+ if (seen.size === 0) return { hits: [...nameHits], deduped: 0 }
130
+ const hits: SearchHit[] = []
131
+ let deduped = 0
132
+ for (const hit of nameHits) {
133
+ if (!hit.dir && seen.has(hit.path)) {
134
+ deduped++
135
+ continue
136
+ }
137
+ hits.push(hit)
138
+ }
139
+ return { hits, deduped }
140
+ }
141
+
142
+ /**
143
+ * Run one combined search. Empty queries never touch the content index: the
144
+ * panel opens with an empty box, and a lazy content build there would cost
145
+ * minutes and gigabytes for no results. Failures are contained per group so a
146
+ * broken content cache still shows name results.
147
+ * @param deps - stores and the lazy-start hook.
148
+ * @param request - normalized request.
149
+ * @returns grouped result in content → files → dirs order.
150
+ */
151
+ export async function runCombinedSearch(deps: CombinedDeps, request: CombinedRequest): Promise<CombinedResponse> {
152
+ const started = Date.now()
153
+ const { scopes, query } = request
154
+ const contentEnabled = deps.contentSearch !== undefined
155
+ const wantsContent = scopes.content && contentEnabled
156
+ // Two characters are the floor for the content store: one-character queries
157
+ // fall back to an unindexed LIKE scan and are not worth a build or a query.
158
+ const askContent = wantsContent && query.trim().length >= 2
159
+
160
+ const contentPromise = wantsContent ? contentGroup(deps, request, askContent) : Promise.resolve(undefined)
161
+ const filesPromise = scopes.files ? nameGroup(deps, request, true) : Promise.resolve(undefined)
162
+ const dirsPromise = scopes.dirs ? nameGroup(deps, request, false) : Promise.resolve(undefined)
163
+ const [content, files, dirs] = await Promise.all([contentPromise, filesPromise, dirsPromise])
164
+
165
+ const dedupedFiles = files === undefined
166
+ ? undefined
167
+ : (() => {
168
+ const result = dedupeNameHits(content?.hits ?? [], files.hits)
169
+ return {
170
+ ...files,
171
+ hits: result.hits,
172
+ returned: result.hits.length,
173
+ deduped: result.deduped,
174
+ truncated: files.truncated || result.deduped > 0,
175
+ }
176
+ })()
177
+
178
+ return {
179
+ scopes,
180
+ contentEnabled,
181
+ ...(content === undefined ? {} : { content }),
182
+ ...(dedupedFiles === undefined ? {} : { files: dedupedFiles }),
183
+ ...(dirs === undefined ? {} : { dirs }),
184
+ tookMs: Date.now() - started,
185
+ }
186
+ }
187
+
188
+ /** Page through a directory-shaped name query. */
189
+ async function nameGroup(deps: CombinedDeps, request: CombinedRequest, files: boolean): Promise<NameGroup> {
190
+ const started = Date.now()
191
+ try {
192
+ const result = await deps.search({
193
+ query: request.query,
194
+ limit: request.limit,
195
+ offset: 0,
196
+ sort: request.sort,
197
+ desc: request.desc,
198
+ regex: false,
199
+ caseSensitive: false,
200
+ wholeWord: false,
201
+ filesOnly: files,
202
+ dirsOnly: !files,
203
+ })
204
+ return {
205
+ hits: result.hits,
206
+ returned: result.hits.length,
207
+ total: result.total,
208
+ truncated: result.truncated,
209
+ deduped: 0,
210
+ tookMs: result.tookNs / 1e6,
211
+ }
212
+ } catch (error) {
213
+ return { hits: [], returned: 0, total: 0, truncated: false, deduped: 0, tookMs: Date.now() - started, error: messageOf(error) }
214
+ }
215
+ }
216
+
217
+ /** Query the content store, or report its state without starting a build. */
218
+ async function contentGroup(deps: CombinedDeps, request: CombinedRequest, ask: boolean): Promise<ContentGroup> {
219
+ const started = Date.now()
220
+ const empty = (): ContentGroup => {
221
+ const state = deps.contentStatus?.()
222
+ return {
223
+ hits: [],
224
+ returned: 0,
225
+ capped: false,
226
+ building: state?.building ?? false,
227
+ files: state?.files ?? 0,
228
+ sessions: state?.sessions ?? 0,
229
+ messages: state?.messages ?? 0,
230
+ truncated: state?.truncated ?? false,
231
+ tookMs: 0,
232
+ }
233
+ }
234
+ if (!ask || deps.contentSearch === undefined) return empty()
235
+ try {
236
+ deps.ensure?.()
237
+ const hits = await deps.contentSearch(request.query, request.contentLimit)
238
+ const state = deps.contentStatus?.()
239
+ return {
240
+ hits,
241
+ returned: hits.length,
242
+ capped: hits.length >= request.contentLimit,
243
+ building: state?.building ?? false,
244
+ files: state?.files ?? 0,
245
+ sessions: state?.sessions ?? 0,
246
+ messages: state?.messages ?? 0,
247
+ truncated: state?.truncated ?? false,
248
+ tookMs: Date.now() - started,
249
+ }
250
+ } catch (error) {
251
+ return { ...empty(), error: messageOf(error), tookMs: Date.now() - started }
252
+ }
253
+ }
254
+
255
+ function clamp(value: unknown, min: number, max: number, fallback: number): number {
256
+ if (typeof value !== 'number' || !Number.isFinite(value)) return fallback
257
+ return Math.min(max, Math.max(min, Math.trunc(value)))
258
+ }
259
+
260
+ function sortKey(value: unknown): string {
261
+ return value === 'name' || value === 'path' || value === 'size' || value === 'mtime' || value === 'ext' ? value : 'mtime'
262
+ }
263
+
264
+ function messageOf(error: unknown): string {
265
+ return error instanceof Error ? error.message : String(error)
266
+ }
267
+
@@ -22,6 +22,7 @@ export function searchContent(db: DatabaseSync, query: string, limit: number): C
22
22
  // A one- or two-character query cannot use the trigram index, so bound the
23
23
  // payload as well as the row count: never ship a whole megabyte body.
24
24
  rows = db.prepare(`SELECT kind, path, title, session_id, message_id,
25
+ (SELECT node_key FROM docs_meta WHERE docs_meta.rowid = docs.rowid) AS node_key,
25
26
  substr(body, 1, 400) AS snippet, 0 AS score
26
27
  FROM docs WHERE body LIKE '%' || ? || '%' LIMIT ?`).all(text, capped) as Array<Record<string, unknown>>
27
28
  } else {
@@ -30,6 +31,7 @@ export function searchContent(db: DatabaseSync, query: string, limit: number): C
30
31
  // inside a matching query (a rowid subquery silently degrades both). The
31
32
  // query runs in the search worker, so its cost stays off the host thread.
32
33
  rows = db.prepare(`SELECT kind, path, title, session_id, message_id,
34
+ (SELECT node_key FROM docs_meta WHERE docs_meta.rowid = docs.rowid) AS node_key,
33
35
  snippet(docs, 0, char(1), char(2), '…', 16) AS snippet, bm25(docs) AS score
34
36
  FROM docs WHERE docs MATCH ? ORDER BY score LIMIT ?`).all(match, capped) as Array<Record<string, unknown>>
35
37
  }
@@ -40,6 +42,7 @@ export function searchContent(db: DatabaseSync, query: string, limit: number): C
40
42
  snippet: String(row.snippet ?? row.body ?? '').replace(/[\u0001\u0002]/g, ''),
41
43
  ...(row.session_id ? { sessionId: String(row.session_id) } : {}),
42
44
  ...(row.message_id ? { messageId: String(row.message_id) } : {}),
45
+ ...(row.node_key ? { nodeKey: String(row.node_key) } : {}),
43
46
  score: Number(row.score ?? 0),
44
47
  }))
45
48
  }
package/src/content.ts CHANGED
@@ -30,7 +30,7 @@ import { Worker } from 'node:worker_threads'
30
30
  import { searchContent } from './content-search.ts'
31
31
  import type { LocatorRuntime } from './runtime.ts'
32
32
 
33
- const SCHEMA_VERSION = 2
33
+ const SCHEMA_VERSION = 3
34
34
 
35
35
  /** Work budget between two event-loop yields; keeps host latency low. */
36
36
  const SLICE_MS = 8
@@ -65,6 +65,8 @@ export interface ContentHit {
65
65
  snippet: string
66
66
  sessionId?: string
67
67
  messageId?: string
68
+ /** Exact `data-chat-node-key` of the rendered row, when the host has one. */
69
+ nodeKey?: string
68
70
  score: number
69
71
  }
70
72
 
@@ -110,6 +112,7 @@ interface DocRow {
110
112
  title: string
111
113
  sessionId: string | null
112
114
  messageId: string | null
115
+ nodeKey: string | null
113
116
  mtime: number
114
117
  }
115
118
 
@@ -332,7 +335,7 @@ export class ContentIndex {
332
335
  body, kind UNINDEXED, path UNINDEXED, title UNINDEXED,
333
336
  session_id UNINDEXED, message_id UNINDEXED, tokenize = 'trigram'
334
337
  )`)
335
- this.db.exec('CREATE TABLE IF NOT EXISTS docs_meta (rowid INTEGER PRIMARY KEY, doc_key TEXT UNIQUE, path TEXT, mtime INTEGER, kind TEXT)')
338
+ this.db.exec('CREATE TABLE IF NOT EXISTS docs_meta (rowid INTEGER PRIMARY KEY, doc_key TEXT UNIQUE, path TEXT, mtime INTEGER, kind TEXT, node_key TEXT)')
336
339
  this.db.exec('CREATE TABLE IF NOT EXISTS sources (path TEXT PRIMARY KEY, mtime INTEGER)')
337
340
  this.db.exec('CREATE INDEX IF NOT EXISTS docs_meta_path ON docs_meta(path)')
338
341
  if (fresh) {
@@ -509,7 +512,7 @@ export class ContentIndex {
509
512
  return false
510
513
  }
511
514
  this.deleteDoc(row.key)
512
- const meta = this.db!.prepare('INSERT INTO docs_meta (doc_key, path, mtime, kind) VALUES (?, ?, ?, ?)').run(row.key, row.path, row.mtime, row.kind)
515
+ const meta = this.db!.prepare('INSERT INTO docs_meta (doc_key, path, mtime, kind, node_key) VALUES (?, ?, ?, ?, ?)').run(row.key, row.path, row.mtime, row.kind, row.nodeKey)
513
516
  const rowid = meta.lastInsertRowid
514
517
  this.db!.prepare('INSERT INTO docs (rowid, body, kind, path, title, session_id, message_id) VALUES (?, ?, ?, ?, ?, ?, ?)').run(rowid, row.body, row.kind, row.path, row.title, row.sessionId, row.messageId)
515
518
  this.totalBytes += row.body.length
@@ -623,7 +626,7 @@ export class ContentIndex {
623
626
  try { buffer = await readFile(path) } catch { return null }
624
627
  if (buffer.includes(0)) return null
625
628
  const body = buffer.toString('utf8').slice(0, this.options.maxFileBytes)
626
- return { key: `file:${path}`, body, kind: 'file', path, title: name, sessionId: null, messageId: null, mtime }
629
+ return { key: `file:${path}`, body, kind: 'file', path, title: name, sessionId: null, messageId: null, nodeKey: null, mtime }
627
630
  }
628
631
 
629
632
  private async indexSessions(generation: number): Promise<void> {
@@ -680,7 +683,7 @@ export class ContentIndex {
680
683
  if (extracted === undefined) continue
681
684
  if (title === '') title = extracted.text.replace(/\s+/g, ' ').slice(0, 90)
682
685
  const body = extracted.text.slice(0, SESSION_BODY_BYTES)
683
- const row: DocRow = { key: `session:${sessionId}:${extracted.id}`, body, kind: 'session', path: file.path, title: title || sessionId, sessionId, messageId: extracted.id, mtime: file.mtime }
686
+ const row: DocRow = { key: `session:${sessionId}:${extracted.id}`, body, kind: 'session', path: file.path, title: title || sessionId, sessionId, messageId: extracted.id, nodeKey: extracted.nodeKey, mtime: file.mtime }
684
687
  if (!this.addDoc(row)) return false
685
688
  }
686
689
  return true
@@ -766,7 +769,12 @@ async function archivedSessionIds(): Promise<Set<string>> {
766
769
  }
767
770
  }
768
771
 
769
- function messageText(event: { type?: string; data?: Record<string, unknown> }): { text: string; id: string } | undefined {
772
+ /** Conversation node key format used by the host DOM (`${kind.length}:${kind}${id}`). */
773
+ function conversationNodeKey(kind: string, id: string): string {
774
+ return `${kind.length}:${kind}${id}`
775
+ }
776
+
777
+ function messageText(event: { type?: string; data?: Record<string, unknown> }): { text: string; id: string; nodeKey: string | null } | undefined {
770
778
  if (event.type !== 'user/message' && event.type !== 'assistant/message') return undefined
771
779
  const data = event.data ?? {}
772
780
  if (event.type === 'user/message') {
@@ -783,7 +791,16 @@ function messageText(event: { type?: string; data?: Record<string, unknown> }):
783
791
  .trim()
784
792
  if (text === '') return undefined
785
793
  const id = event.type === 'user/message' ? String(data.id ?? '') : String(message.id ?? '')
786
- return { text, id: id || `seq-${String(data.seq ?? '')}` }
794
+ const safeId = id || `seq-${String(data.seq ?? '')}`
795
+ let nodeKey: string | null = null
796
+ if (event.type === 'user/message' && id !== '') {
797
+ nodeKey = conversationNodeKey('input-message', id)
798
+ } else if (event.type === 'assistant/message') {
799
+ const turn = Number(data.turn)
800
+ const step = Number(data.step)
801
+ if (Number.isInteger(turn) && Number.isInteger(step)) nodeKey = conversationNodeKey('assistant-step', `${turn}:${step}`)
802
+ }
803
+ return { text, id: safeId, nodeKey }
787
804
  }
788
805
 
789
806
  async function sessionFiles(roots: string[]): Promise<Array<{ path: string; mtime: number }>> {
package/src/find.ts CHANGED
@@ -16,6 +16,7 @@ const HIT = {
16
16
  snippet: { type: 'string' },
17
17
  sessionId: { type: 'string' },
18
18
  messageId: { type: 'string' },
19
+ nodeKey: { type: 'string' },
19
20
  score: { type: 'number' },
20
21
  },
21
22
  } as const
package/src/http.ts CHANGED
@@ -16,6 +16,7 @@ import type { Context } from '@deepseek-ai/cordis'
16
16
  import type { IncomingMessage, ServerResponse } from 'node:http'
17
17
  import type { LocatorRuntime, SearchArgs } from './runtime.ts'
18
18
  import type { ContentIndex } from './content.ts'
19
+ import { readCombinedRequest, runCombinedSearch, type CombinedDeps } from './combined.ts'
19
20
  import { openWithDefaultApp, revealInFileManager, withinRoots } from './reveal.ts'
20
21
  import { statSync } from 'node:fs'
21
22
 
@@ -63,13 +64,18 @@ export function registerHttp(ctx: Context, rt: LocatorRuntime, content?: Content
63
64
  scoped.effect(() => server.register({
64
65
  kind: 'exact',
65
66
  path: '/dsh-locator/status',
66
- handler: handler(scoped, async () => await status(rt)),
67
+ handler: handler(scoped, async () => await status(rt, content)),
67
68
  }))
68
69
  scoped.effect(() => server.register({
69
70
  kind: 'exact',
70
71
  path: '/dsh-locator/reveal',
71
72
  handler: handler(scoped, async body => await reveal(rt, body)),
72
73
  }))
74
+ scoped.effect(() => server.register({
75
+ kind: 'exact',
76
+ path: '/dsh-locator/combined',
77
+ handler: handler(scoped, async body => await combined(rt, content, ensure, body)),
78
+ }))
73
79
  if (content !== undefined) {
74
80
  scoped.effect(() => server.register({
75
81
  kind: 'exact',
@@ -154,6 +160,32 @@ async function search(rt: LocatorRuntime, raw: Record<string, unknown>): Promise
154
160
  }
155
161
  }
156
162
 
163
+ /**
164
+ * One panel search across all enabled scopes. The stores are injected so the
165
+ * orchestration (scope gating, lazy-build guard, de-duplication) stays testable
166
+ * without an HTTP request or an engine process.
167
+ */
168
+ async function combined(
169
+ rt: LocatorRuntime,
170
+ content: ContentIndex | undefined,
171
+ ensure: (() => void) | undefined,
172
+ raw: Record<string, unknown>,
173
+ ): Promise<unknown> {
174
+ rt.start()
175
+ const deps: CombinedDeps = {
176
+ search: async args => await rt.search(args),
177
+ maxResults: rt.config.maxResults,
178
+ ...(content === undefined ? {} : {
179
+ contentSearch: async (query: string, limit: number) => await content.search(query, limit),
180
+ contentStatus: () => content.status(),
181
+ ...(ensure === undefined ? {} : { ensure }),
182
+ }),
183
+ }
184
+ const request = readCombinedRequest(raw, rt.config.maxResults)
185
+ const result = await runCombinedSearch(deps, request)
186
+ return { query: request.query, ...result }
187
+ }
188
+
157
189
  async function reveal(rt: LocatorRuntime, raw: Record<string, unknown>): Promise<unknown> {
158
190
  const path = typeof raw.path === 'string' ? raw.path : ''
159
191
  if (path === '' || !withinRoots(path, rt.roots)) {
@@ -192,9 +224,10 @@ async function openPath(rt: LocatorRuntime, raw: Record<string, unknown>): Promi
192
224
  }
193
225
  }
194
226
 
195
- async function status(rt: LocatorRuntime): Promise<unknown> {
227
+ async function status(rt: LocatorRuntime, content?: ContentIndex): Promise<unknown> {
196
228
  rt.start()
197
229
  const engine = await rt.engineStatus()
230
+ const contentState = content === undefined ? { enabled: false } : { enabled: true, ...content.status() }
198
231
  return {
199
232
  running: rt.status.running,
200
233
  entries: engine?.entries ?? 0,
@@ -206,6 +239,7 @@ async function status(rt: LocatorRuntime): Promise<unknown> {
206
239
  scanning: engine?.scanning === true || rt.status.scanning !== undefined,
207
240
  stateDir: engine?.stateDir ?? rt.stateDir,
208
241
  version: engine?.version ?? '',
242
+ content: contentState,
209
243
  ...(rt.status.error === undefined ? {} : { error: rt.status.error }),
210
244
  ...(rt.status.warning === undefined ? {} : { warning: rt.status.warning }),
211
245
  }