dsh-locator 0.7.6 → 0.8.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-hi.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  # 🔎 dsh-locator
4
4
 
5
- **DeepSeek Harness के लिए पूरे डिस्क पर मिलीसेकंड में फ़ाइल खोज — Everything के बिना।**
5
+ **नाम याद है तो नाम से खोजें, बात याद है तो सामग्री से खोजें; फिर फ़ाइल खोलें या उसी बातचीत पर वापस जाएँ।**
6
6
 
7
- अपना क्रॉस-प्लेटफ़ॉर्म इंडेक्स (Windows USN/MFT · macOS FSEvents · Linux inotify), एजेंट के लिए छह टूल — नाम, सामग्री और सत्र — और क्रमबद्ध करने योग्य Web पैनल।
7
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) के लिए पूरे डिस्क की फ़ाइल खोज, **अपने ही इंडेक्स** के साथ: Everything इंस्टॉल करने की ज़रूरत नहीं, `es.exe` पर निर्भरता नहीं, Windows / macOS / Linux पर एक ही टूल और एक ही पैनल।
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/dsh-locator)](https://www.npmjs.com/package/dsh-locator)
10
10
  [![npm downloads](https://img.shields.io/npm/dm/dsh-locator)](https://www.npmjs.com/package/dsh-locator)
@@ -12,7 +12,8 @@
12
12
  [![version](https://img.shields.io/github/v/tag/PerryLink/dsh-locator?label=version)](https://github.com/PerryLink/dsh-locator/releases)
13
13
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
14
14
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
15
- [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
15
+ [![Awesome DSH](https://img.shields.io/badge/awesome--dsh--plugin-listed-2ea44f)](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)
16
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#संस्करण-और-संगतता)
16
17
  [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-locator)
17
18
  [![GitCode](https://img.shields.io/badge/GitCode-mirror-1f6feb)](https://gitcode.com/PerryLink/dsh-locator)
18
19
 
@@ -24,15 +25,62 @@ dsh plugin --profile web add dsh-locator
24
25
 
25
26
  </div>
26
27
 
27
- > **आधिकारिक रिपॉज़िटरी:** [GitHub `PerryLink/dsh-locator`](https://github.com/PerryLink/dsh-locator)। Gitee और GitCode स्वतः सिंक होने वाले मिरर हैं; GitHub ही स्रोत है।
28
- >
29
- > यह [DSH प्लगइन परिवार](https://github.com/PerryLink) (Apache-2.0) का हिस्सा है। अगर यह मदद करे, तो **एक ⭐** अगली बार खोजने वाले की मदद करता है — इससे कोई सुविधा नहीं खुलती।
28
+ > **आधिकारिक रिपॉज़िटरी:** [GitHub `PerryLink/dsh-locator`](https://github.com/PerryLink/dsh-locator); Gitee और GitCode स्वतः सिंक होने वाले मिरर हैं, GitHub ही स्रोत है। यह [DSH प्लगइन परिवार](https://github.com/PerryLink) (Apache-2.0) का हिस्सा है और [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) में सूचीबद्ध है। एक ⭐ अगले व्यक्ति को इसे खोजने में मदद करता है; इसके पीछे कुछ भी बंद नहीं है।
29
+
30
+ ## सामग्री
31
+
32
+ - [एक नज़र में](#एक-नज़र-में)
33
+ - [Everything / Spotlight / grep से कैसे अलग है](#everything--spotlight--grep-से-कैसे-अलग-है)
34
+ - [इंस्टॉल](#इंस्टॉल)
35
+ - [पहला रन](#पहला-रन)
36
+ - [दो खोजें](#दो-खोजें)
37
+ - [वेब पैनल](#वेब-पैनल)
38
+ - [टूल्स](#टूल्स)
39
+ - [क्वेरी भाषा](#क्वेरी-भाषा)
40
+ - [कॉन्फ़िगरेशन](#कॉन्फ़िगरेशन)
41
+ - [प्रदर्शन और संसाधन](#प्रदर्शन-और-संसाधन)
42
+ - [प्लेटफ़ॉर्म समर्थन](#प्लेटफ़ॉर्म-समर्थन)
43
+ - [समस्या निवारण](#समस्या-निवारण)
44
+ - [सोर्स से बिल्ड](#सोर्स-से-बिल्ड)
45
+ - [डिज़ाइन](#डिज़ाइन)
46
+ - [सीमाएँ](#सीमाएँ)
47
+ - [मेमोरी](#मेमोरी)
48
+ - [सुरक्षा और गोपनीयता](#सुरक्षा-और-गोपनीयता)
49
+ - [संस्करण और संगतता](#संस्करण-और-संगतता)
50
+ - [रोडमैप](#रोडमैप)
51
+ - [लाइसेंस](#लाइसेंस)
52
+
53
+ ## एक नज़र में
54
+
55
+ फ़ाइल खोजने की दो स्थितियाँ होती हैं:
56
+
57
+ - **नाम याद है, जगह नहीं।** `glob`/`grep` हर कॉल पर फिर से चलते हैं — डायरेक्टरी पता हो तो ठीक, आधा नाम याद हो तो मुश्किल।
58
+ - **कोई वाक्य, निर्णय या कोड याद है, फ़ाइल या बातचीत नहीं।** नाम का इंडेक्स यहाँ काम नहीं आता, और DSH के सेशन लॉग भी उतने ही ज़रूरी डेटा हैं।
59
+
60
+ `dsh-locator` दोनों को एक ही प्लगइन में रखता है:
61
+
62
+ | क्षमता | कैसे इस्तेमाल करें |
63
+ |---|---|
64
+ | नाम / पाथ से खोज | `locator_search`, या पैनल का डिफ़ॉल्ट मोड |
65
+ | फ़ाइल के अंदरूनी टेक्स्ट से खोज | `locator_find`, या पैनल में **सामग्री खोजें** |
66
+ | DSH सेशन की सामग्री से खोज | वही टूल; परिणाम में `sessionId` / `messageId` आते हैं और पैनल उस बातचीत पर लौट सकता है |
67
+ | खोलना / दिखाना | टूल पाथ लौटाते हैं; पैनल डबल-क्लिक से दिखाता है, `Ctrl+O` खोलता है, `Ctrl+Enter` कंपोज़र में `@"पाथ"` डालता है |
68
+ | बाहरी उपयोग | `locator_export` केवल-पढ़ने वाला SQLite मिरर लिखता है |
69
+
70
+ इंडेक्स पूरी तरह स्थानीय है: कोई नेटवर्क कॉल नहीं, कोई टेलीमेट्री नहीं, कोई अपलोड नहीं; प्लगइन इंडेक्स की गई फ़ाइलों को कभी बदलता, हटाता या स्थानांतरित नहीं करता।
30
71
 
31
- `dsh-locator` आपके चुने हुए डायरेक्टरी को एक बार इंडेक्स करता है, परिणाम को एक कॉम्पैक्ट स्नैपशॉट में रखता है, फ़ाइल सिस्टम के बदलाव लागू करता है, और दस लाख से अधिक प्रविष्टियों पर नाम/पथ क्वेरी कुछ दसियों मिलीसेकंड में लौटाता है। एजेंट को `locator_search`, `locator_status`, `locator_rebuild` और `locator_export` मिलते हैं; लोगों को Web GUI में एक **वैश्विक पैनल** मिलता है (`Ctrl+Shift+F` या साइडबार के निचले हिस्से में आवर्धक चिह्न)।
72
+ ## Everything / Spotlight / grep से कैसे अलग है
32
73
 
33
- ## एक और खोज क्यों?
74
+ | | dsh-locator | Everything | Spotlight | `glob` / `grep` |
75
+ |---|---|---|---|---|
76
+ | प्लेटफ़ॉर्म | Windows / macOS / Linux / WSL | Windows | macOS | क्रॉस-प्लेटफ़ॉर्म |
77
+ | इंडेक्स | लगातार बना, अपना | लगातार बना (NTFS USN) | सिस्टम इंडेक्स (मेटाडेटा/सामग्री) | हर कॉल पर फिर से चलता है |
78
+ | सामग्री खोज | टेक्स्ट फ़ाइलें + DSH सेशन संदेश | डिफ़ॉल्ट रूप से केवल नाम | हाँ, सिस्टम के अनुसार बदलता है | हाँ, लेकिन इंडेक्स नहीं |
79
+ | सेशन पर जाना | परिणाम में `sessionId` / `messageId` | नहीं | नहीं | नहीं |
80
+ | एजेंट टूल | छह टूल, एक क्वेरी भाषा | अलग CLI/सेवा चाहिए | अलग स्क्रिप्ट चाहिए | मूल टूल, स्थायी इंडेक्स नहीं |
81
+ | Windows पर गति | Everything के करीब (USN वैकल्पिक) | सबसे तेज़ और हल्का | लागू नहीं | इंडेक्स से धीमा |
34
82
 
35
- `glob` और `grep` हर कॉल पर वर्कस्पेस घूमते हैं — डायरेक्टरी पता हो तो तेज़, नाम का कुछ हिस्सा याद हो तो धीमे। Everything Windows पर बहुत अच्छा है, पर केवल Windows पर; उसे लपेटने से macOS, Linux, WSL और रिमोट होस्ट बाहर रह जाते हैं। `dsh-locator` खुद इंडेक्स का मालिक है, इसलिए वही टूल हर जगह चलते हैं जहाँ Node और Go चलते हैं।
83
+ संक्षेप में: Everything का **विचार** (लगातार इंडेक्स + संरचित क्वेरी) स्वतंत्र रूप से क्रॉस-प्लेटफ़ॉर्म लागू किया गया है, और ऊपर DSH सेशन जोड़े गए हैं। यह Everything का रैपर नहीं है।
36
84
 
37
85
  ## इंस्टॉल
38
86
 
@@ -40,152 +88,335 @@ dsh plugin --profile web add dsh-locator
40
88
  # npm (अनुशंसित)
41
89
  dsh plugin --profile web add dsh-locator
42
90
 
43
- # GitHub main
91
+ # संस्करण तय करें
92
+ dsh plugin --profile web add dsh-locator@0.7.7
93
+
94
+ # GitHub मुख्य ब्रांच
44
95
  dsh plugin --profile web add github:PerryLink/dsh-locator
45
96
 
46
97
  # सोर्स से
47
98
  pnpm install
48
99
  pnpm build
49
- pnpm build:engine
50
- dsh plugin --profile web add /absolute/path/dsh-locator
100
+ pnpm build:engine # मौजूदा प्लेटफ़ॉर्म का Go इंजन
101
+ dsh plugin --profile web add /पूरा/पाथ/dsh-locator
51
102
 
52
- # tarball
103
+ # tarball से (npm pack का आउटपुट; असली संस्करण डालें)
53
104
  npm pack
54
- dsh plugin --profile web add /absolute/path/dsh-locator-0.5.0.tgz
105
+ dsh plugin --profile web add /पूरा/पाथ/dsh-locator-0.7.7.tgz
55
106
  ```
56
107
 
57
- npm पैकेज में `linux-x64`, `linux-arm64`, `win32-x64`, `win32-arm64`, `darwin-x64` और `darwin-arm64` के पहले से बने इंजन हैं।
108
+ - पैकेज में छह प्लेटफ़ॉर्म के पहले से बने इंजन हैं: `linux-x64`, `linux-arm64`, `win32-x64`, `win32-arm64`, `darwin-x64`, `darwin-arm64`; स्थानीय Go की ज़रूरत नहीं।
109
+ - अगर npm मिरर पीछे हो, कमांड में `--registry=https://registry.npmjs.org` जोड़ें।
110
+ - चल रहे Web प्रोफ़ाइल में इंस्टॉल के बाद **पेज रीलोड करें** (`F5`): होस्ट टूल तुरंत माउंट हो सकते हैं, पर ब्राउज़र पैनल पेज लोड के समय boot graph से आता है। headless/TUI प्रोफ़ाइल में केवल टूल मिलते हैं।
111
+ - अपग्रेड: `dsh plugin --profile web add dsh-locator@latest` फिर `F5`। कंटेंट स्कीमा बदलने पर डेटाबेस एक बार फिर बनता है।
112
+ - अनइंस्टॉल: `dsh plugin --profile web remove dsh-locator`; कॉन्फ़िग रखकर बंद करना हो तो `enabled: false`।
58
113
 
59
- चल रहे Web प्रोफ़ाइल में इंस्टॉल के बाद **पेज रीलोड करें** (`F5`): टूल तुरंत माउंट हो सकते हैं, पर पैनल (`client.js`) पेज लोड पर boot graph से आता है। headless/TUI प्रोफ़ाइल में पैनल नहीं मिलता।
114
+ ## पहला रन
60
115
 
61
- ## Web पैनल
116
+ पहली बार माउंट होने पर इंजन कॉन्फ़िगर की गई जड़ों (डिफ़ॉल्ट: आपका होम डायरेक्टरी) को इंडेक्स करता है और स्नैपशॉट तथा कंटेंट डेटाबेस प्लेटफ़ॉर्म के कैश डायरेक्टरी में लिखता है:
62
117
 
63
- ![dsh-locator खोज पैनल: पथ से फ़िल्टर किए गए Markdown परिणाम, हिट संख्या, समय और क्रमबद्ध कॉलम](docs/assets/panel-en.png)
118
+ | प्लेटफ़ॉर्म | डिफ़ॉल्ट स्टेट डायरेक्टरी |
119
+ |---|---|
120
+ | Windows | `%LOCALAPPDATA%\dsh-locator` |
121
+ | macOS | `~/Library/Application Support/dsh-locator` |
122
+ | Linux | `$XDG_CACHE_HOME/dsh-locator` या `~/.cache/dsh-locator` |
64
123
 
65
- Web GUI में कहीं भी `Ctrl+Shift+F` दबाएँ, या साइडबार के निचले हिस्से में आवर्धक चिह्न पर क्लिक करें। पैनल उसी इंडेक्स से होस्ट के इन रूटों के ज़रिए बात करता है — `/dsh-locator/search`, `/dsh-locator/content`, `/dsh-locator/status`, `/dsh-locator/reveal` और `/dsh-locator/open`। सब कुछ same-origin से चलता है — अलग सर्वर या अतिरिक्त पोर्ट की ज़रूरत नहीं।
124
+ बड़े होम डायरेक्टरी की पहली स्कैन डिस्क पढ़ती है; आगे के स्टार्ट स्नैपशॉट लोड करते हैं। स्कैन के **दौरान** भी खोज चलती रहती है: जो इंडेक्स हो चुका है वह `indexing: true` के साथ लौटता है और पैनल के फुटर में इंडेक्स बनने की स्थिति दिखती है।
66
125
 
67
- * खाली क्वेरी: तारीख़ के अनुसार हाल की प्रविष्टियाँ; टाइप करते ही 110 ms डिबाउंस और टूल जैसी ही सिंटैक्स।
68
- * कॉलम हेडर पर क्लिक करके नाम, आकार, तारीख़ या पथ से क्रम; दोबारा क्लिक पर उलटा।
69
- * `केवल फ़ाइलें` / `केवल फ़ोल्डर` टाइप फ़िल्टर करते हैं; **सामग्री खोजें** चेकबॉक्स टिक करने पर खोज नाम की जगह फ़ाइलों के अंदर के टेक्स्ट और DSH सेशन संदेशों में चलती है, और हर हिट के साथ एक-लाइन का स्निपेट दिखता है। निचली पट्टी में हिट, सीमा और समय।
70
- * `↑`/`↓` चयन, `Enter` कॉपी, `Ctrl+O` खोलें, `Ctrl+Enter` कंपोज़र में `@"पथ"` डालें। किसी फ़ाइल पर डबल-क्लिक उसे फ़ाइल मैनेजर में दिखाता है; सेशन वाले परिणाम पर डबल-क्लिक उस बातचीत को खोलता है और मैच हुए संदेश पर कुछ देर के लिए आउटलाइन दिखाता है। `Esc` बंद।
71
- * इंटरफ़ेस `navigator.language` का पालन करता है (zh/en/es/pt/hi)।
126
+ डिफ़ॉल्ट रूप से `node_modules`, `.git`, `.hg`, `.svn`, `.cache`, `__pycache__`, `.venv`, `venv`, `.next` नाम से छोड़े जाते हैं; `excludes` से बदल सकते हैं।
72
127
 
73
- ## टूल
128
+ आज़माएँ:
74
129
 
75
- | टूल | काम |
76
- |---|---|
77
- | `locator_search` | Everything-शैली सिंटैक्स से इंडेक्स क्वेरी। |
78
- | `locator_find` | फ़ाइलों के अंदर के टेक्स्ट और DSH सेशन संदेशों में खोज; हर हिट के साथ स्निपेट, और बातचीत वाले हिट के लिए `sessionId`/`messageId`। |
79
- | `locator_status` | रूट, प्रविष्टियाँ, watcher, USN मोड और त्रुटियाँ। |
80
- | `locator_rebuild` | पृष्ठभूमि में पुनर्निर्माण; खोज पुराने इंडेक्स से चलती रहती है। |
81
- | `locator_reindex` | सामग्री इंडेक्स ताज़ा करें या दोबारा बनाएँ: डिफ़ॉल्ट में इंक्रीमेंटल, `full: true` से पूरा डेटाबेस हटाकर नया बनता है। |
82
- | `locator_export` | केवल-पढ़ने योग्य SQLite प्रति (`entries(path, name, dir, size, mtime_ms, ext)`)। |
130
+ ```text
131
+ पिछले हफ़्ते बदली गई PDF ढूँढो
132
+ "contentRefreshMs" पर कहाँ चर्चा हुई थी?
133
+ यह डिज़ाइन किस बातचीत में तय हुआ था?
134
+ ```
83
135
 
84
- ### सामग्री खोज
136
+ ## दो खोजें
85
137
 
86
- `locator_find` टेक्स्ट फ़ाइलों के अंदर के टेक्स्ट और DSH सेशन संदेशों को स्थानीय SQLite FTS5 इंडेक्स से खोजता है। चीनी और अंग्रेज़ी में सबस्ट्रिंग खोज चलती है — शब्द-विभाजन (segmentation) की ज़रूरत नहीं।
138
+ ### नाम से: `locator_search`
87
139
 
88
- हर हिट के साथ एक स्निपेट मिलता है, और बातचीत वाले हिट के साथ `sessionId`/`messageId` भी — इसी से पैनल उस सेशन को खोलकर मैच हुए संदेश पर निशान लगा पाता है।
140
+ Everything-शैली क्वेरी जो पाथ, आकार, बदलाव की तिथि, एक्सटेंशन और प्रकार लौटाती है। “नाम में report है”, “इस हफ़्ते बदली PDF”, “50MB से बड़े वीडियो” जैसी ज़रूरतों के लिए।
89
141
 
90
- सामग्री इंडेक्स डिफ़ॉल्ट रूप से आलसी (lazy) है: प्लगइन शुरू होने पर कुछ नहीं बनता, पहली सामग्री खोज उसे बैकग्राउंड में शुरू करती है (`contentLazy: false` से शुरू से बनेगा)। प्लगइन दोबारा शुरू होने पर मौजूदा डेटाबेस का ही इस्तेमाल करता है और उसे इंक्रीमेंटल तरीके से रिफ़्रेश करता है; पूरा बिल्ड (पहले सेशन लॉग, फिर फ़ाइलों का अंदरूनी टेक्स्ट) सिर्फ़ तब चलता है जब डेटाबेस मौजूद न हो, उसका स्कीमा वर्ज़न पुराना हो, या वह खुल ही न पाए। उसके बाद हर `contentRefreshMs` (5 मिनट) पर इंक्रीमेंटल रिफ़्रेश होता है, जो सिर्फ़ उन्हीं फ़ाइलों और सेशनों को दोबारा पढ़ता है जिनका mtime बदला हो। `locator_reindex` से दोनों में से कोई भी मोड हाथ से चलाया जा सकता है (`full: true` पूरा डेटाबेस हटाकर फिर से बनाता है)।
142
+ क्रम, पेजिंग और `limit`/`offset` होस्ट इंजन करता है; 1.51 M एंट्री पर सामान्य क्वेरी दसियों मिलीसेकंड में लौटती है।
91
143
 
92
- जब तक बिल्ड चल रहा है, खोज उसी डेटा से जवाब देती रहती है जो अब तक इंडेक्स हो चुका है, और टूल तथा पैनल दोनों बिल्ड की स्थिति बताते हैं।
144
+ ### सामग्री से: `locator_find`
93
145
 
94
- सीमाएँ: एक टेक्स्ट फ़ाइल से अधिकतम 1 MB, कुल 200,000 फ़ाइलें, सबसे हाल के 100 सेशन, और टेक्स्ट की कुल मात्रा 1 GB — ये सब कॉन्फ़िग में बदले जा सकते हैं। डिपेंडेंसी और टूलचेन फ़ोल्डर (`node_modules`, `.cargo`, `.bun`, `.pnpm`, `site-packages`, `toolchain`, …) डिफ़ॉल्ट रूप से छोड़े जाते हैं — वरना वे पहले पूरा बजट खा जाते और आपके अपने दस्तावेज़ नहीं इंडेक्स होते — `contentExcludes` से यह सूची बदल सकते हैं। इंडेक्स फ़ाइलें पढ़ता और zstd डिकोड करता है असिंक्रोनस रूप से, और हर ~8 ms पर event loop छोड़ता है (28.6 MB: 968 ms → 19 ms), इसलिए सत्र लोड/स्विच नहीं रुकते; आर्काइव किए सेशन डिफ़ॉल्ट रूप से नहीं इंडेक्स होते (`contentIncludeArchived: true` से होंगे), और जो सेशन अभी लिखा जा रहा है वह `contentActiveSessionDelayMs` तक रुकता है।
146
+ टेक्स्ट फ़ाइलों और DSH सेशन संदेशों के **अंदरूनी टेक्स्ट** में खोजता है और टुकड़े तथा स्रोत लौटाता है:
95
147
 
96
- ### क्वेरी सिंटैक्स
148
+ - फ़ाइल परिणाम में पाथ होता है, उसे खोला या दिखाया जा सकता है;
149
+ - सेशन परिणाम में `sessionId` और `messageId` होते हैं, इसलिए पैनल बातचीत खोलकर उस संदेश पर जा सकता है;
150
+ - चीनी और अंग्रेज़ी सबस्ट्रिंग दोनों चलती हैं (trigram टोकनाइज़र, शब्द विभाजन की ज़रूरत नहीं)।
97
151
 
98
- ```text
99
- report नाम में AND शब्द
100
- "do shabd" सटीक वाक्यांश
101
- *.go ? वाइल्डकार्ड
102
- ext:pdf,docx ext:!tmp एक्सटेंशन (या नकार)
103
- path:src पूरे पथ का उपभाग
104
- size:>10mb 1kb..2mb आकार
105
- dm:today dm:thisweek बदलाव की तारीख़
106
- folder: file: केवल फ़ोल्डर / केवल फ़ाइलें
107
- !tmp नकार
108
- case:1 wholeword:1 केस / पूरा शब्द
109
- ```
152
+ कंटेंट इंडेक्स का व्यवहार:
153
+
154
+ - **डिफ़ॉल्ट रूप से आलसी।** प्लगइन शुरू होने पर कुछ नहीं बनता; पहली सामग्री खोज (`locator_find` या पैनल का कंटेंट मोड) बैकग्राउंड में बिल्ड शुरू करती है, और `contentLazy: false` शुरू से बिल्ड कराता है। पहली क्वेरी `building: true` बताती है, खाली परिणाम नहीं देती।
155
+ - **रीस्टार्ट पर पुनः उपयोग।** डेटाबेस मौजूद हो तो केवल इंक्रीमेंटल रिफ़्रेश होता है; पूरा बिल्ड (पहले सेशन लॉग, फिर फ़ाइल कंटेंट) केवल तब चलता है जब डेटाबेस न हो, स्कीमा पुराना हो, पिछला बिल्ड अधूरा रह गया हो या डेटाबेस खुल न पाए।
156
+ - **इंक्रीमेंटल रिफ़्रेश** हर `contentRefreshMs` (डिफ़ॉल्ट 5 मिनट) पर, केवल बदली mtime वाली फ़ाइलें/सेशन दोबारा पढ़ता है; `0` इसे बंद करता है।
157
+ - **आर्काइव और सक्रिय सेशन।** आर्काइव किए गए सेशन डिफ़ॉल्ट रूप से छोड़े जाते हैं (`contentIncludeArchived: true` से शामिल); जो लॉग अभी लिखा जा रहा है वह `contentActiveSessionDelayMs` (डिफ़ॉल्ट 2 मिनट) शांत होने के बाद इंडेक्स होता है, ताकि हर रिफ़्रेश पर पूरा लॉग दोबारा डिकंप्रेस न हो। हटाए गए सेशन फ़ाइल गायब होने पर इंडेक्स से निकल जाते हैं।
158
+ - **बजट और ट्रंकेट।** डिफ़ॉल्ट: प्रति टेक्स्ट फ़ाइल 1MB, अधिकतम 200,000 फ़ाइलें, कुल 1GB कंटेंट, हाल के 100 सेशन। बजट पूरा होने पर स्कैन क्रम में बाद की फ़ाइलें छूट जाती हैं; `locator_find` में `content budget reached` दिखता है और HTTP स्टेट में `truncated: true` होता है। `contentMaxTotalBytes` बढ़ाएँ या `contentExcludes` सीमित करें।
159
+ - **डिपेंडेंसी ट्री नहीं पढ़े जाते।** `node_modules`, `.cargo`, `.bun`, `.pnpm`, `site-packages`, `toolchain`, … डिफ़ॉल्ट `contentExcludes` से छूटते हैं, वरना लाइब्रेरी कोड आपके दस्तावेज़ों से पहले बजट खा जाएगा; नाम इंडेक्स उन्हें कवर करता रहता है।
160
+
161
+ बिल्ड DSH होस्ट प्रोसेस में चलता है, पर फ़ाइल पढ़ना और zstd डिकंप्रेसन असिंक्रोनस हैं और दोनों लूप हर ~8ms पर इवेंट लूप को छोड़ते हैं: 28.6MB कॉर्पस पर सबसे लंबा इवेंट-लूप ब्लॉक 968ms से घटकर लगभग 20ms हो गया, इसलिए सेशन लोड/स्विच धीमे नहीं होते। कंटेंट **क्वेरी** worker थ्रेड में केवल-पढ़ने वाले कनेक्शन से चलती है — सामान्य शब्द लगभग 100ms, दुर्लभ शब्द कुछ मिलीसेकंड, होस्ट ब्लॉक नहीं होता।
162
+
163
+ ## वेब पैनल
164
+
165
+ ![dsh-locator सर्च पैनल: कंटेंट मोड चालू, बॉडी मैच और स्निपेट दिखाते हुए](docs/assets/panel-en.png)
166
+
167
+ Web GUI में कहीं भी `Ctrl+Shift+F` दबाएँ, या साइडबार के नीचे वाले आवर्धक लेंस पर क्लिक करें।
110
168
 
111
- ## मुख्य कॉन्फ़िग
169
+ - खाली क्वेरी हाल में बदली एंट्री दिखाती है; टाइप करने पर 110ms डिबाउंस के बाद वही Everything-शैली सिंटैक्स चलता है।
170
+ - नाम, आकार, बदलाव की तिथि या पाथ से क्रमबद्ध करने के लिए कॉलम हेडर पर क्लिक करें।
171
+ - **केवल फ़ाइलें** / **केवल डायरेक्टरी** से प्रकार फ़िल्टर करें।
172
+ - **सामग्री खोजें** चुनकर नाम से बॉडी/सेशन खोज पर जाएँ; बिल्ड के दौरान फुटर स्थिति दिखाता है और पैनल खुद दोबारा क्वेरी करता है।
173
+ - `↑`/`↓` चुनते हैं, `Enter` पाथ कॉपी करता है, `Ctrl+O` खोलता है, `Ctrl+Enter` कंपोज़र में `@"पाथ"` डालता है, `Esc` बंद करता है।
174
+ - फ़ाइल पर डबल-क्लिक Explorer/Finder/`xdg-open` में दिखाता है; सेशन पर डबल-क्लिक उस बातचीत को मिले संदेश पर खोलता है।
175
+ - पैनल का टेक्स्ट `navigator.language` का पालन करता है (zh/en/es/pt/hi)।
112
176
 
113
- | कुंजी | अर्थ |
177
+ पैनल उसी ओरिजिन के रूट इस्तेमाल करता है — `/dsh-locator/search`, `/dsh-locator/content`, `/dsh-locator/content/rebuild`, `/dsh-locator/combined`, `/dsh-locator/status`, `/dsh-locator/reveal`, `/dsh-locator/open` — इसलिए अलग सर्वर या पोर्ट नहीं चाहिए। बिना Web सर्वर वाले प्रोफ़ाइल में यह माउंट नहीं होता।
178
+
179
+ - **तीनों क्षेत्र डिफ़ॉल्ट रूप से चालू हैं**: सामग्री (बॉडी + सत्र), फ़ाइलें और फ़ोल्डर; किसी को हटाकर दायरा घटाएँ। परिणाम **सामग्री → फ़ाइलें → फ़ोल्डर** में समूहित होते हैं और हर समूह पर गिनती दिखती है; सामग्री प्रासंगिकता से क्रमबद्ध होती है और नाम-समूह क्रम मेन्यू का पालन करते हैं।
180
+ - **डबल-क्लिक या `Enter` पर परिणाम सक्रिय होता है**: सत्र परिणाम बातचीत खोलकर मिले शब्दों पर पारभासी अंबर हाइलाइट लगाता है जो स्क्रॉल के साथ चलता है, पहुँचने पर केंद्रित होता है और `Esc` से हटता है; फ़ाइल/फ़ोल्डर फ़ाइल मैनेजर में दिखते हैं। `Ctrl+Shift+C` पथ कॉपी करता है, `Ctrl+O` खोलता है, `Ctrl+Enter` `@file` डालता है और `Alt+1–3` क्षेत्र बदलता है।
181
+ - सामग्री खोज के लिए कम से कम दो अक्षर चाहिए; खाली या एक-अक्षर की खोज सामग्री इंडेक्स नहीं बनाती।
182
+
183
+ ## टूल्स
184
+
185
+ | टूल | क्या करता है |
186
+ |---|---|
187
+ | `locator_search` | नाम और पाथ खोज, `ext:`, `size:`, `dm:`, `path:` फ़िल्टर, क्रम और पेजिंग के साथ। |
188
+ | `locator_find` | फ़ाइल बॉडी और सेशन संदेश खोज; स्निपेट, `sessionId`/`messageId` और कंटेंट इंडेक्स की स्थिति लौटाता है। |
189
+ | `locator_status` | जड़ें, नाम-इंडेक्स गिनती, watcher स्थिति, स्टेट डायरेक्टरी और इंजन पाथ। (कंटेंट प्रगति `locator_find` और पैनल बताते हैं।) |
190
+ | `locator_rebuild` | नाम इंडेक्स को बैकग्राउंड स्कैन से बदलता है; नया तैयार होने तक पुराना इंडेक्स खोजता रहता है। |
191
+ | `locator_reindex` | कंटेंट इंडेक्स रिफ़्रेश/रीबिल्ड: डिफ़ॉल्ट इंक्रीमेंटल, `full: true` पूरा फिर बनाता है। |
192
+ | `locator_export` | नाम इंडेक्स का केवल-पढ़ने वाला SQLite मिरर (`entries` टेबल) बाहरी SQL टूल के लिए लिखता है। |
193
+
194
+ ## क्वेरी भाषा
195
+
196
+ अकेले शब्द नाम के AND सबस्ट्रिंग हैं। Everything-शैली फ़िल्टर उनके साथ जुड़ते हैं:
197
+
198
+ | उदाहरण | अर्थ |
114
199
  |---|---|
115
- | `roots` | इंडेक्स करने वाली डायरेक्टरियाँ; खाली = होम डायरेक्टरी। |
116
- | `excludes` | नाम-आधारित glob (`node_modules`, `.git`, …)। |
117
- | `watch` | सिस्टम की फ़ाइल सूचनाएँ चालू करें। |
118
- | `refreshIntervalMs` | नेटिव watcher न होने पर समय-समय पर पुनर्निर्माण। |
119
- | `windowsUsn` | USN/MFT तेज़ रास्ता (Windows, व्यवस्थापक; डिफ़ॉल्ट `false`)। |
120
- | `scanWorkers` | समानांतर डायरेक्टरी रीडर; 0 = CPU। |
121
- | `contentIndex` | फ़ाइल-बॉडी और सेशन संदेशों का इंडेक्स बनाना है या नहीं (डिफ़ॉल्ट `true`)। |
122
- | `contentLazy` | कंटेंट इंडेक्स पहली सामग्री खोज पर बनाएँ, प्लगइन शुरू होते ही नहीं; `false` = शुरू से बैकग्राउंड में बनाएँ (डिफ़ॉल्ट `true`)। |
123
- | `contentMaxFileBytes` | एक टेक्स्ट फ़ाइल से अधिकतम इतने बाइट पढ़े जाते हैं (डिफ़ॉल्ट `1000000`)। |
124
- | `contentMaxTotalBytes` | कंटेंट डेटाबेस में रखे जाने वाले कुल बाइट (डिफ़ॉल्ट `1000000000`); `0` = कोई सीमा नहीं। |
125
- | `contentMaxFiles` | एक बिल्ड में अधिकतम इतनी टेक्स्ट फ़ाइलें इंडेक्स होती हैं (डिफ़ॉल्ट `200000`); `0` = कोई सीमा नहीं। |
126
- | `contentMaxSessions` | सबसे हाल के इतने सेशन लॉग इंडेक्स होते हैं (डिफ़ॉल्ट `100`); `0` = सभी। |
127
- | `contentRefreshMs` | सामग्री के इंक्रीमेंटल रिफ़्रेश का अंतराल, मिलीसेकंड में (डिफ़ॉल्ट `300000`); `0` = अपने-आप रिफ़्रेश बंद। |
128
- | `contentIncludeArchived` | आर्काइव किए गए सेशन भी इंडेक्स करें; डिफ़ॉल्ट `false`। |
129
- | `contentActiveSessionDelayMs` | सेशन लॉग इतनी देर शांत रहने के बाद ही इंडेक्स होता है (डिफ़ॉल्ट `120000`)। |
130
- | `contentSessionDirs` | अतिरिक्त सेशन डायरेक्टरियाँ (डिफ़ॉल्ट `[]`); खाली = `$DSH_HOME/sessions`। |
131
- | `contentExcludes` | सामग्री इंडेक्स जिन पथ हिस्सों को छोड़ता है (डिपेंडेंसी/टूलचेन); नाम इंडेक्स पर असर नहीं। |
132
- | `stateDir` | स्नैपशॉट डायरेक्टरी; खाली = सिस्टम कैश। |
133
-
134
-
135
- ## प्लेटफ़ॉर्म
136
-
137
- | प्लेटफ़ॉर्म | स्कैन | अपडेट |
200
+ | `report` | नाम में `report` है |
201
+ | `report ext:pdf` | …और एक्सटेंशन `pdf` है |
202
+ | `ext:ts,js` / `ext:!tmp` | एक्सटेंशन शामिल/बाहर |
203
+ | `*.sln` / `?ata` | `*` और `?` वाइल्डकार्ड |
204
+ | `"annual report"` | स्पेस वाला वाक्यांश |
205
+ | `!archive` | किसी शब्द को बाहर करें |
206
+ | `path:src` | पूरा पाथ `src` रखता है |
207
+ | `size:>10mb` / `size:1kb..2mb` | आकार तुलना |
208
+ | `dm:today` / `dm:thisweek` / `dm:2026-01-01` | बदलाव की तिथि |
209
+ | `folder:` / `file:` | केवल डायरेक्टरी / केवल फ़ाइलें |
210
+ | `case:1` / `wholeword:1` | केस-संवेदी / शब्द सीमा |
211
+
212
+ `locator_search` `sort` (`name`, `path`, `size`, `mtime`, `ext`), `desc`, `offset`, `limit`, `regex`, `caseSensitive` और `wholeWord` भी लेता है।
213
+
214
+ ## कॉन्फ़िगरेशन
215
+
216
+ हर फ़ील्ड Schemastery कॉन्फ़िग फ़ील्ड है; प्रोफ़ाइल पैच में `dsh-locator` एंट्री बदलें, उदाहरण:
217
+
218
+ ```yaml
219
+ - id: dsh-locator
220
+ name: dsh-locator
221
+ config:
222
+ roots: ['/home/me/Documents', '/home/me/notes']
223
+ contentMaxTotalBytes: 2000000000
224
+ contentExcludes: ['node_modules', '.git', '.cargo', 'site-packages']
225
+ ```
226
+
227
+ | कुंजी | डिफ़ॉल्ट | अर्थ |
138
228
  |---|---|---|
139
- | Linux | समानांतर वॉक | inotify (पुनरावर्ती) |
140
- | Windows | वॉक या USN/MFT (admin) | `ReadDirectoryChangesW`; USN पुनः आरंभ पर फिर शुरू |
141
- | macOS | वॉक | cgo बाइनरी में FSEvents; `CGO_ENABLED=0` पर kqueue |
229
+ | `enabled` | `true` | मुख्य स्विच; `false` पर टूल माउंट नहीं होते और इंजन नहीं चलता। |
230
+ | `roots` | होम डायरेक्टरी | इंडेक्स करने की जड़ें; एक से ज़्यादा हो सकती हैं। |
231
+ | `excludes` | dev/cache नाम | नाम इंडेक्स में छोड़े जाने वाले नाम-ग्लोब। |
232
+ | `watch` | `true` | फ़ाइलसिस्टम नोटिफ़िकेशन लागू करें। |
233
+ | `refreshIntervalMs` | `1800000` | नेटिव watcher न होने पर रीबिल्ड अंतराल (kqueue या watcher विफलता); `0` बंद। |
234
+ | `scanWorkers` | `0` | स्कैन में डायरेक्टरी पढ़ने की समानांतरता; `0` = CPU संख्या। |
235
+ | `windowsUsn` | `false` | वॉक से पहले NTFS USN/MFT आज़माएँ (Windows, एडमिन; विफलता पर अपने आप वॉक)। |
236
+ | `memoryLimitMB` | `0` | इंजन का Go सॉफ़्ट हीप लिमिट (MiB); `0` = `GOMEMLIMIT`/`GOGC` पर छोड़ें। |
237
+ | `contentIndex` | `true` | बॉडी और सेशन-संदेश इंडेक्स बनाएँ; `false` पर केवल नाम खोज, कंटेंट लागत लगभग शून्य। |
238
+ | `contentLazy` | `true` | कंटेंट इंडेक्स पहली सामग्री खोज पर बनाएँ, शुरू में नहीं। |
239
+ | `contentMaxFileBytes` | `1000000` | एक टेक्स्ट फ़ाइल से पढ़े जाने वाले बाइट। |
240
+ | `contentMaxTotalBytes` | `1000000000` | कंटेंट डेटाबेस में रखे कुल बॉडी बाइट; `0` = कोई सीमा नहीं। |
241
+ | `contentMaxFiles` | `200000` | प्रति बिल्ड इंडेक्स होने वाली टेक्स्ट फ़ाइलें; `0` = कोई सीमा नहीं। |
242
+ | `contentMaxSessions` | `100` | हाल के कितने सेशन लॉग इंडेक्स हों; `0` = सभी। |
243
+ | `contentRefreshMs` | `300000` | कंटेंट इंक्रीमेंटल रिफ़्रेश अंतराल; `0` बंद। |
244
+ | `contentIncludeArchived` | `false` | आर्काइव सेशन भी इंडेक्स करें। |
245
+ | `contentActiveSessionDelayMs` | `120000` | सेशन लॉग इस अवधि तक शांत रहने पर इंडेक्स हो। |
246
+ | `contentSessionDirs` | `[]` | अतिरिक्त सेशन डायरेक्टरी; खाली = `$DSH_HOME/sessions`। |
247
+ | `contentExcludes` | डिपेंडेंसी/toolchain नाम | कंटेंट इंडेक्स में छोड़े जाने वाले पाथ हिस्से/सबस्ट्रिंग; नाम इंडेक्स उन्हें कवर करता है। |
248
+ | `stateDir` | `''` | स्नैपशॉट और कंटेंट डेटाबेस की डायरेक्टरी; खाली = प्लेटफ़ॉर्म कैश। हर DSH प्रोसेस के लिए अलग रखें। |
249
+
250
+ कस्टम इंजन, पेज सीमा और समय-सीमा के लिए `binaryPath`, `maxResults`, `startupTimeoutMs`, `requestTimeoutMs` भी हैं; डिफ़ॉल्ट ज़्यादातर मामलों के लिए ठीक हैं।
251
+
252
+ ## प्रदर्शन और संसाधन
253
+
254
+ माप एक WSL2 विकास मशीन (Linux, गर्म पेज कैश) और असली होम डायरेक्टरी पर; आपकी मशीन डिस्क, फ़ाइल संख्या, कैश और GC के अनुसार अलग होगी।
255
+
256
+ **नाम इंडेक्स**
257
+
258
+ | माप | परिणाम |
259
+ |---|---|
260
+ | ठंडा स्कैन | ~1.51 M एंट्री, 11–12 सेकंड |
261
+ | स्नैपशॉट आकार | 1.51 M एंट्री के लिए ~171 MB |
262
+ | गर्म क्वेरी (`locator_search`) | सामान्य क्वेरी 6–25ms; `path:` स्कैन ~70ms |
263
+ | रीबिल्ड के दौरान खोज | नया तैयार होने तक पुराना इंडेक्स खोजता रहता है |
264
+ | स्कैन की चरम मेमोरी | सैकड़ों MB; इंजन अलग चाइल्ड प्रोसेस है और `memoryLimitMB` / `GOMEMLIMIT` मानता है |
142
265
 
143
- Windows पर `scan --usn` `usn-state.json` (जर्नल id, अगला USN, रूट) लिखता है और `serve --usn` सेवा से पहले जर्नल दोहराता है: डेमॉन बंद रहते बनाई फ़ाइल पुनः आरंभ पर बिना पूरे स्कैन के दिखती है। पुराना/हटाया जर्नल पोर्टेबल watcher पर लौट आता है।
266
+ **कंटेंट इंडेक्स** (असली होम डायरेक्टरी, 1GB बजट)
144
267
 
145
- ## प्रदर्शन
268
+ | माप | परिणाम (0.7.x, असली होम) |
269
+ |---|---|
270
+ | कवरेज | ~95.8 हज़ार टेक्स्ट फ़ाइलें / 95 सेशन / 1,050 संदेश |
271
+ | पूरा रीबिल्ड | ~3.5 मिनट बैकग्राउंड में; उस दौरान होस्ट p95 14ms / अधिकतम 115ms |
272
+ | बिना बदलाव इंक्रीमेंटल | ~12 सेकंड (मुख्यतः इंजन के 1.51 M एंट्री dump में) |
273
+ | खाली बैठे होस्ट की देरी | p50 2ms / p95 3ms / अधिकतम 6ms |
274
+ | डेटाबेस आकार | ~3.1 GB (बजट का लगभग 3 गुना) |
275
+ | कंटेंट क्वेरी | सामान्य शब्द ~100ms, दुर्लभ शब्द कुछ ms (worker थ्रेड, होस्ट ब्लॉक नहीं) |
146
276
 
147
- उसी मशीन पर मापा गया (वार्म कैश): 20,000 फ़ाइलें / 40 MB → 15.1 s और 71 MB; 2,00,000 फ़ाइलें / 331 MB → 31.5 s और 711 MB; पूरे इंडेक्स (13 लाख प्रविष्टियाँ) का इंक्रीमेंटल रिफ़्रेश 2.9 s; रीस्टार्ट पर डेटाबेस दोबारा इस्तेमाल होता है और 2,00,000 फ़ाइलों वाले कॉर्पस में 4.6 s लगते हैं। डेटाबेस इंडेक्स किए टेक्स्ट का 2–3 गुना होता है।
277
+ **कम संसाधन में**
148
278
 
149
- - 1.2 M प्रविष्टियाँ: गरम क्वेरी 25–35 ms; स्कैन के दौरान खोज ~2 ms।
150
- - `C:\Windows` (164,216 प्रविष्टियाँ) USN से CI runner पर 7.8 s में इंडेक्स; क्वेरी 9.6 ms।
151
- - 1.24 M पंक्तियों का `locator_export`: 477 MB, 6.4 s।
279
+ - केवल नाम खोज: `contentIndex: false` से कंटेंट काम शून्य।
280
+ - कंटेंट रखते हुए कम डिस्क: `contentMaxTotalBytes` (जैसे 256000000) या `contentMaxFileBytes` घटाएँ, या `contentRefreshMs` बढ़ाएँ।
281
+ - ज़्यादा फ़ाइलें: `contentMaxTotalBytes` / `contentMaxFiles` बढ़ाएँ और देखें कि `contentExcludes` असली दस्तावेज़ डायरेक्टरी नहीं छोड़ रहा।
282
+ - कंटेंट डेटाबेस कैश है: `stateDir` हटाने पर वह फिर बनता है, स्रोत फ़ाइलों को कुछ नहीं होता।
152
283
 
153
- ## डिज़ाइन
284
+ ## प्लेटफ़ॉर्म समर्थन
285
+
286
+ | प्लेटफ़ॉर्म | स्कैन + स्नैपशॉट | लाइव अपडेट | नोट |
287
+ |---|---|---|---|
288
+ | Linux | हाँ | inotify, रिकर्सिव | वॉच डिस्क्रिप्टर प्रति डायरेक्टरी; बहुत बड़े पेड़ `fs.inotify.max_user_watches` तक पहुँच सकते हैं। |
289
+ | Windows | हाँ | `ReadDirectoryChangesW`, रिकर्सिव | एडमिन अधिकार या Everything ज़रूरी नहीं। ऊँचे अधिकारों में वैकल्पिक USN/MFT। WSL द्वारा `/mnt/<drive>` में किए बदलावों की सूचना न मिले तो उन जड़ों को रीबिल्ड करें। |
290
+ | macOS | हाँ | भेजे गए cgo बाइनरी में FSEvents, रिकर्सिव और बिना सीमा | `CGO_ENABLED=0` बिल्ड में kqueue fallback (अधिकतम 4,096 डायरेक्टरी); कंटेंट बदलाव समय-समय पर रीबिल्ड पर निर्भर। |
291
+
292
+ ### Windows और USN जर्नल
154
293
 
155
- ![dsh-locator आर्किटेक्चर: फ़ाइल सिस्टम → स्कैन/वॉच → कॉम्पैक्ट स्नैपशॉट → क्वेरी इंजन → टूल / Web पैनल](docs/assets/architecture.svg)
294
+ इंजन में USN डिकोडर, वैकल्पिक फ़ास्ट पाथ और जाँच टूल है। यह पाथ **डिफ़ॉल्ट रूप से बंद** है (`windowsUsn: false`) क्योंकि वॉल्यूम ioctl के लिए एडमिन अधिकार चाहिए; इसे GitHub Actions के Windows रनर (एडमिन, असली NTFS वॉल्यूम) पर पूरा जाँचा गया है:
156
295
 
157
- * **समानांतर स्कैन**: सीमित कतार, प्रति-डायरेक्टरी बैच ताकि पिता बच्चों से पहले मौजूद हो।
158
- * **मेमोरी**: 40 B रिकॉर्ड, साझा नाम arena, खुली पथ तालिका; पूरा पथ केवल परिणाम लौटाते समय बनता है।
159
- * **क्वेरी**: शब्द एक बार पार्स, खंडों में समानांतर मिलान, सीमित heap से `offset+limit`।
160
- * **स्थायित्व**: अस्थायी फ़ाइल + atomic rename; स्नैपशॉट ही शुरुआत का स्रोत।
161
- * **प्रोटोकॉल**: stdio पर NDJSON; कोई पोर्ट या नेटवर्क सतह नहीं।
296
+ - 1,345,546 MFT रिकॉर्ड पढ़े गए, 1,345,539 पाथ हल हुए
297
+ - `C:\Windows` के नीचे 164,209 एंट्री (122,915 फ़ाइलें, 41,294 डायरेक्टरी)
298
+ - `scan --usn --root C:\Windows` ने 164,216 एंट्री 7.8 सेकंड में इंडेक्स कीं; एक क्वेरी 9.6ms में लौटी
299
+ - चेंज जर्नल पढ़ा गया (एक रन में 8,233 रिकॉर्ड) और `D:` पर निष्क्रिय जर्नल चेतावनी के साथ वॉक पर लौटा
300
+
301
+ खुद जाँचें:
302
+
303
+ ```powershell
304
+ # एडमिन PowerShell (या: Start-Process -Verb RunAs <path> ...)
305
+ & ".\bin\win32-x64\indexd.exe" usn-probe --volume C: --root "C:\Windows" --limit 5 --journal 5
306
+ ```
307
+
308
+ यह जर्नल id/USN, MFT गणना (प्रति सेकंड रिकॉर्ड, रूट के नीचे फ़ाइलें/डायरेक्टरी, नमूना पाथ) और हाल के चेंज-जर्नल रिकॉर्ड दिखाता है। बिना एडमिन यह `Access is denied` से विफल होता है; पार्सर और पाथ रीकंस्ट्रक्शन हर प्लेटफ़ॉर्म पर यूनिट टेस्ट से कवर हैं।
309
+
310
+ `windowsUsn: true` (या `indexd scan --usn`) पर इंजन डायरेक्टरी वॉक की जगह MFT गिनता है और FRN पैरेंट मैप से पाथ बनाता है। सफल USN स्कैन `usn-state.json` (जर्नल id, अगला USN, जड़ें) लिखता है और हर रिकॉर्ड में FRN रखता है; अगले `serve --usn` पर इंजन उसी कर्सर से जर्नल दोहराकर जवाब देता है, इसलिए बंद रहने के दौरान बनी फ़ाइलें बिना पूरे स्कैन के दिख जाती हैं। जर्नल लपेटा गया, हटा दिया गया या बेमेल हो तो पोर्टेबल watcher पर लौटता है। यह वॉल्यूम हैंडल रखता है और हर दो सेकंड में चेंज जर्नल देखता है, `usn.ApplyChanges` से बनना/हटना/नाम बदलना लागू करता है (वही FRN मैप, जगह पर अपडेट)। USN रिकॉर्ड में **आकार और बदलाव की तिथि नहीं होती**: नाम/पाथ सही रहते हैं, `locator_status` ऐसे इंडेक्स को `USN` बताता है, और daemon लौटे पेज पर stat करता है ताकि पंक्तियों में असली आकार/तिथि दिखे; पूरे इंडेक्स पर `size:`/`dm:` फ़िल्टर मेटाडेटा पास तक अनुमानित रहते हैं। कोई भी विफलता (एडमिन नहीं, अनसपोर्टेड वॉल्यूम, बहुत ज़्यादा रिकॉर्ड) पोर्टेबल वॉक पर चेतावनी के साथ लौटती है; खोज कभी बंद नहीं होती।
311
+
312
+ Everything NTFS की Master File Table को USN जर्नल से पढ़ता है, इसलिए उसका पहला इंडेक्स लगभग तुरंत बनता है। `dsh-locator` डिफ़ॉल्ट रूप से पोर्टेबल डायरेक्टरी वॉक रखता है (सेवा नहीं, UAC नहीं, कोई भी फ़ाइलसिस्टम) और जहाँ प्रोसेस के पास `GENERIC_READ` (एडमिन) है वहाँ USN/MFT को वैकल्पिक फ़ास्ट पाथ की तरह इस्तेमाल करता है, रीस्टार्ट के बीच जर्नल रीप्ले के साथ। पोर्टेबल रास्ता fallback बना रहता है।
313
+
314
+ ## समस्या निवारण
315
+
316
+ **इंस्टॉल के बाद पैनल नहीं दिखता।**
317
+ पेज रीलोड करें (`F5`); देखें कि आपने `web` प्रोफ़ाइल में इंस्टॉल किया है और पैनल boot graph से लोड होता है। headless/TUI प्रोफ़ाइल में पैनल नहीं होता।
318
+
319
+ **अभी बनी फ़ाइल नहीं मिलती।**
320
+ नोटिफ़िकेशन अभी न आई हो (WSL का `/mnt/c` लेखन, नेटवर्क शेयर, कुछ कंटेनर overlay में सामान्य)। थोड़ा रुकें या उस जड़ के लिए `locator_rebuild` चलाएँ। USN मोड रीस्टार्ट पर जर्नल दोहराता है।
321
+
322
+ **सामग्री खोज में कुछ नहीं मिलता।**
323
+ `locator_find` के परिणाम में `building` देखें: पहली खोज आलसी बिल्ड शुरू करती है और पूरा होने तक परिणाम अधूरे हो सकते हैं (पैनल खुद दोबारा क्वेरी करता है)। यह भी देखें कि एक्सटेंशन टेक्स्ट प्रकार का है, फ़ाइल `contentMaxFileBytes` से छोटी है, `contentExcludes` से बाहर नहीं है, और सेशन आर्काइव नहीं है (आर्काइव डिफ़ॉल्ट रूप से छूटते हैं)।
324
+
325
+ **कंटेंट डेटाबेस बहुत बड़ा / डिस्क तेज़ी से बढ़ती है।**
326
+ [प्रदर्शन और संसाधन](#प्रदर्शन-और-संसाधन) देखें: बजट घटाएँ या `contentIndex: false` करें। `stateDir` हटाने पर रीबिल्ड होता है।
327
+
328
+ **`inotify` चेतावनी आती है।**
329
+ बहुत ज़्यादा डायरेक्टरी कर्नेल सीमा तक पहुँचती हैं; इंडेक्स चलता रहता है और बदलाव समय-समय पर रीबिल्ड पर निर्भर रहते हैं। `fs.inotify.max_user_watches` बढ़ाएँ या `roots` घटाएँ।
330
+
331
+ **अपग्रेड के बाद व्यवहार बदला।**
332
+ `dsh plugin --profile web add dsh-locator@latest` चलाएँ, फिर `F5`। कंटेंट स्कीमा बदलने पर डेटाबेस एक बार फिर बनता है। [CHANGELOG](CHANGELOG.md) देखें।
162
333
 
163
334
  ## सोर्स से बिल्ड
164
335
 
165
- Node `^22.19 || >=24.9`, pnpm और Go 1.22+ चाहिए।
336
+ ज़रूरतें: Node `^22.19 || >=24.9`, pnpm और इंजन के लिए Go 1.22+।
166
337
 
167
338
  ```sh
168
339
  pnpm install
169
340
  pnpm build
170
- pnpm build:engine:all
171
- pnpm check
341
+ pnpm build:engine:all # या मौजूदा प्लेटफ़ॉर्म के लिए build:engine
342
+ pnpm check # typecheck + टेस्ट + पैकेजिंग/इंस्टॉल जाँच
172
343
  ```
173
344
 
174
- Go इंजन `engine/` में है; टेस्ट: `cd engine && go test ./...`.
345
+ इंजन `engine/` में अलग Go मॉड्यूल है; टेस्ट `cd engine && go test ./...` से चलते हैं। macOS का FSEvents बैकएंड cgo चाहता है और macOS CI पर बनता है। Node टेस्ट CI में Linux, Windows और macOS पर चलते हैं।
346
+
347
+ ## डिज़ाइन
348
+
349
+ ![dsh-locator आर्किटेक्चर: फ़ाइलसिस्टम → स्कैन/वॉच → कॉम्पैक्ट स्नैपशॉट → क्वेरी इंजन → एजेंट टूल / वेब पैनल](docs/assets/architecture.svg)
350
+
351
+ ```
352
+ DeepSeek Harness
353
+ └─ dsh-locator (TypeScript प्लगइन)
354
+ ├─ locator_search / locator_find / locator_status / locator_rebuild /
355
+ │ locator_reindex / locator_export
356
+ ├─ client.js: Ctrl+Shift+F ओवरले (shell.overlay स्लॉट)
357
+ ├─ POST /dsh-locator/{search,content,status,reveal,open} (समान ओरिजिन)
358
+ ├─ कंटेंट स्टोर: होस्ट प्रोसेस में SQLite FTS5 (trigram),
359
+ │ क्वेरी worker थ्रेड में
360
+ └─ चाइल्ड प्रोसेस: indexd serve (Go, stdio पर NDJSON)
361
+ ├─ scanner: रिकर्सिव वॉक, excludes, प्रगति
362
+ ├─ index: नाम arena + फ़िक्स्ड रिकॉर्ड + ओपन-एड्रेसिंग पाथ टेबल
363
+ ├─ query: parser, matcher, top-K चयन, क्रम, पेजिंग
364
+ ├─ watcher: inotify (Linux) / ReadDirectoryChangesW (Windows)
365
+ └─ snapshot: एक फ़ाइल, mmap-friendly, परमाणु rename
366
+ ```
367
+
368
+ - **समानांतर स्कैनर।** डायरेक्टरी रीडर सीमित क्यू खाली करते हैं और प्रति डायरेक्टरी एक बैच लिखते हैं (`AddBatch`), इसलिए बच्चों से पहले पैरेंट रिकॉर्ड मौजूद रहता है। क्यू ब्लॉक नहीं करता: भर जाने पर वह सबट्री जगह पर ही स्कैन होती है।
369
+ - **मेमोरी लेआउट।** रिकॉर्ड में बाइट arena में नाम का offset/length और पैरेंट id रहता है; पूरा पाथ केवल परिणाम पेज और `path:` फ़िल्टर के लिए बनता है। इससे प्रति फ़ाइल स्ट्रिंग हेडर नहीं चाहिए।
370
+ - **पाथ टेबल।** `id+1` स्लॉट वाली ओपन-एड्रेसिंग टेबल lookup/update को ~12 बाइट प्रति एंट्री पर रखती है, `map[string]int32` के ~50 बाइट के बजाय।
371
+ - **क्वेरी इंजन।** शब्द और फ़िल्टर एक बार कंपाइल होते हैं, समानांतर खंडों में मिलते हैं, फिर सीमित max-heap से घटाए जाते हैं: लाखों मैच सॉर्ट किए बिना शीर्ष `offset+limit` पंक्तियाँ चुनी जाती हैं।
372
+ - **कंटेंट इंडेक्स।** होस्ट में SQLite FTS5 और trigram टोकनाइज़र (UTF-8 सबस्ट्रिंग, CJK); फ़ाइल सूची इंजन के स्कैन से आती है, सेशन लॉग Node के zstd से डिकंप्रेस होते हैं।
373
+ - **कंटेंट संगति।** प्रति-प्रोसेस बिल्ड लॉक `stateDir` साझा करने वाले लेखकों को क्रम में रखता है, पूर्णता फ़्लैग अधूरे बिल्ड के बाद रीबिल्ड कराता है, और पुराना हैंडल device+inode से पहचाना जाता है ताकि दूसरे प्रोसेस का रीबिल्ड होस्ट को हटाए गए डेटाबेस पर न छोड़े।
374
+ - **स्थायित्व।** स्नैपशॉट अस्थायी फ़ाइल में लिखकर rename होता है; generation काउंटर daemon को केवल बदलाव पर सेव कराता है। हटाने की संख्या सीमा पार करने पर tombstones कॉम्पैक्ट होते हैं।
375
+ - **प्रोटोकॉल।** stdio पर प्रति पंक्ति एक JSON अनुरोध/उत्तर, साथ में `scan`, `stats`, `warning`, `error`, `rebuilt` इवेंट। कोई पोर्ट नहीं, कोई auth सतह नहीं, कोई नेटवर्क लिसनर नहीं।
376
+ - **केवल-पढ़ना।** इंजन फ़ाइलें केवल मेटाडेटा के लिए खोलता है; इंडेक्स किए पाथ में कभी नहीं लिखता।
175
377
 
176
378
  ## सीमाएँ
177
379
 
178
- * सामग्री खोज सिर्फ़ टेक्स्ट फ़ाइलें (एक्सटेंशन से) और DSH सत्र लॉग पढ़ती है; PDF, Office दस्तावेज़ और तस्वीरों का टेक्स्ट नहीं निकाला जाता। डिफ़ॉल्ट रूप से इंडेक्स किया गया टेक्स्ट 1 GB / 2,00,000 फ़ाइलों तक सीमित है, इसलिए बहुत बड़े होम डायरेक्टरी में सिर्फ़ पहला हिस्सा ही रहता है।
179
- * यह फ़ाइल-सिस्टम ड्राइवर नहीं; केवल कॉन्फ़िगर किए रूट कवर करता है।
180
- * inotify प्रति डायरेक्टरी एक descriptor लेता है; बहुत बड़े पेड़ कर्नेल सीमा पार कर सकते हैं (चेतावनी मिलती है, स्नैपशॉट उपयोगी रहता है)।
181
- * WSL की `/mnt/c` लेख Windows सूचनाएँ नहीं दे सकतीं; उन रूट को फिर से बनाएँ।
182
- * macOS: प्रकाशित बाइनरी में FSEvents; `CGO_ENABLED=0` बिल्ड में kqueue (अधिकतम 4,096 डायरेक्टरी)। सामग्री बदलाव समय-समय पर पुनर्निर्माण से।
380
+ - कंटेंट खोज केवल टेक्स्ट फ़ाइलें (एक्सटेंशन से) और DSH सेशन लॉग पढ़ती है; PDF, Office और चित्रों से टेक्स्ट नहीं निकाला जाता।
381
+ - कंटेंट बजट स्कैन क्रम में खर्च होता है, फ़ाइल महत्व से नहीं; सीमा पूरी होने पर बाद की फ़ाइलें खोजी नहीं जा सकतीं (`truncated` true)।
382
+ - इंडेक्स कॉन्फ़िगर की गई जड़ों तक है; यह फ़ाइलसिस्टम ड्राइवर नहीं है।
383
+ - Linux inotify प्रति डायरेक्टरी एक डिस्क्रिप्टर लेता है; लाखों डायरेक्टरी होने पर कर्नेल सीमा पार हो सकती है। प्लगइन चेतावनी देता है और स्नैपशॉट काम करता रहता है; रीबिल्ड भरपाई करते हैं।
384
+ - WSL से `/mnt/c` में लिखी फ़ाइलों की Windows सूचना न मिले (watcher 9p लेखक का स्ट्रीम नहीं देख सकता)। उन जड़ों को रीबिल्ड करें।
385
+ - नेटवर्क शेयर तभी स्कैन होते हैं जब सामान्य डायरेक्टरी की तरह पहुँच में हों; SMB-विशिष्ट चेंज फ़ीड नहीं है।
386
+ - सेशन सामग्री स्थानीय लॉग से आती है; डिस्क पर न लिखे नए संदेश खोजे नहीं जा सकते।
387
+ - एक ही `stateDir` साझा करने वाले दो DSH प्रोसेस से बचें: बिल्ड लॉक लेखकों को क्रम में रखता है, पर एक खुला डेटाबेस हैंडल साझा नहीं कर सकता।
388
+ - macOS भेजे गए बाइनरी में FSEvents (रिकर्सिव) इस्तेमाल करता है; `CGO_ENABLED=0` बिल्ड kqueue पर जाता है, 4,096 डायरेक्टरी सीमा के साथ, और कंटेंट बदलाव समय-समय पर रीबिल्ड पर निर्भर रहते हैं।
389
+ - Windows USN/MFT वैकल्पिक है और केवल तब इस्तेमाल होता है जब प्रोसेस वॉल्यूम पढ़ सके और जर्नल सक्रिय हो; वरना पोर्टेबल वॉक चलता है।
390
+
391
+ - फ़ाइल-बॉडी परिणाम अभी फ़ाइल मैनेजर में दिखते हैं (DSH के अंदर पंक्ति-स्तरीय पूर्वावलोकन अगला कदम है); असिस्टेंट संदेश फ़्रेज़ से खोजे जाते हैं क्योंकि उनकी DOM पंक्तियों में messageId नहीं होता।
392
+ - बातचीत के अंदर हाइलाइट CSS Custom Highlight API पर निर्भर है; पुराने ब्राउज़र में पंक्ति की रूपरेखा (outline) दिखती है।
393
+
394
+ ## मेमोरी
395
+
396
+ इंजन एक Go प्रोसेस है और मानक `GOMEMLIMIT` और `GOGC` (या कॉन्फ़िग में `memoryLimitMB`) मानता है। 1.2–1.5 M एंट्री का इंडेक्स डिफ़ॉल्ट GC के साथ कई सौ MB RSS तक जाता है; होस्ट पर RAM कम हो तो `GOMEMLIMIT=600MiB` (सॉफ़्ट सीमा, रनटाइम CPU देकर मेमोरी बचाता है) या `GOGC=50` रखें। इनसे स्नैपशॉट फ़ॉर्मेट नहीं बदलता। ऊपर के आँकड़ों वाले लाइव सेटअप में DSH होस्ट प्रोसेस (कंटेंट डेटाबेस पेज कैश सहित) इंडेक्स बने रहने पर लगभग 700 MB RSS पर था, और खाली बैठे होस्ट की देरी p50 2ms रही।
183
397
 
184
398
  ## सुरक्षा और गोपनीयता
185
399
 
186
- कंटेंट डेटाबेस और बिल्ड लॉक `0600` के साथ बनाए जाते हैं, और स्टेट डायरेक्टरी `0700` के साथ: स्थानीय दूसरे उपयोगकर्ता इंडेक्स किए गए दस्तावेज़ या सत्र टेक्स्ट नहीं पढ़ सकते।
400
+ - इंडेक्स पूरी तरह स्थानीय है: कोई नेटवर्क कॉल नहीं, कोई टेलीमेट्री नहीं, कोई अपलोड नहीं। प्लगइन इंडेक्स की गई फ़ाइलों को कभी बदलता, हटाता या स्थानांतरित नहीं करता।
401
+ - कंटेंट डेटाबेस और बिल्ड लॉक `0600` पर बनते हैं, स्टेट डायरेक्टरी `0700` पर: स्थानीय दूसरे उपयोगकर्ता इंडेक्स किए दस्तावेज़ या सेशन टेक्स्ट नहीं पढ़ सकते।
402
+ - स्नैपशॉट और कंटेंट डेटाबेस में नाम, पाथ और बॉडी होते हैं; स्टेट डायरेक्टरी को निजी डेटा मानें। उसे हटाने पर कैश साफ़ हो जाता है।
403
+ - एक साथ चल रहे DSH प्रोसेस को अलग-अलग `stateDir` दें।
404
+
405
+ ## संस्करण और संगतता
406
+
407
+ - Node `^22.19.0 || >=24.9.0`; DSH `>=0.2.1-rc.2 <0.3.0` (`package.json` का `engines` देखें)।
408
+ - रिलीज़ GitHub Actions provenance के साथ प्रकाशित होते हैं, इसलिए npm पैकेज का स्रोत सत्यापित किया जा सकता है; Gitee / GitCode मिरर वर्कफ़्लो से सिंक होते हैं।
409
+ - चेंजलॉग: [CHANGELOG.md](CHANGELOG.md); सवाल और रिपोर्ट: [Issues](https://github.com/PerryLink/dsh-locator/issues)।
410
+
411
+ ## रोडमैप
412
+
413
+ यह प्रतिबद्धता नहीं, बस मौजूदा दिशा है:
187
414
 
188
- इंडेक्स स्थानीय है: कोई नेटवर्क, टेलीमेट्री या अपलोड नहीं। स्नैपशॉट में नाम और पथ हैं, इसे निजी डेटा मानें। प्लगइन इंडेक्स की गई फ़ाइलों को कभी बदलता, हटाता या स्थानांतरित नहीं करता।
415
+ 1. असली Windows इंस्टॉल पर Electron डेस्कटॉप रनटाइम की जाँच।
416
+ 2. पैनल में प्रीव्यू और परिणाम समूहन।
417
+ 3. Windows on ARM / Linux ARM रनटाइम कवरेज।
418
+ 4. बहुत बड़े इंडेक्स के लिए लोअरकेस नाम arena और trigram प्रीफ़िल्टर।
419
+ 5. इंक्रीमेंटल स्नैपशॉट कॉम्पैक्शन और प्रति-रूट जर्नल।
189
420
 
190
421
  ## लाइसेंस
191
422