@gmickel/gno 1.34.4 → 1.34.6

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.
Files changed (37) hide show
  1. package/README.md +11 -1
  2. package/THIRD_PARTY_NOTICES.md +16 -0
  3. package/browser-extension/artifacts/{gno-browser-clipper-v1.34.4.zip → gno-browser-clipper-v1.34.6.zip} +0 -0
  4. package/browser-extension/artifacts/gno-browser-clipper-v1.34.6.zip.sha256 +1 -0
  5. package/browser-extension/dist/manifest.json +1 -1
  6. package/package.json +5 -1
  7. package/spec/cli.md +16 -10
  8. package/src/cli/pager.ts +29 -14
  9. package/src/ingestion/sync.ts +368 -84
  10. package/src/serve/public/globals.built.css +1 -1
  11. package/src/serve/watch-reconciliation-fallback-disk.ts +220 -0
  12. package/src/serve/watch-reconciliation-fallback.ts +404 -0
  13. package/src/serve/watch-reconciliation-shared.ts +343 -0
  14. package/src/serve/watch-reconciliation.ts +122 -0
  15. package/src/serve/watch-service-events.ts +261 -0
  16. package/src/serve/watch-service-flush-generation.ts +140 -0
  17. package/src/serve/watch-service-flush-helpers.ts +147 -0
  18. package/src/serve/watch-service-flush.ts +433 -0
  19. package/src/serve/watch-service-hosts.ts +109 -0
  20. package/src/serve/watch-service-lifecycle.ts +219 -0
  21. package/src/serve/watch-service-run-flush.ts +236 -0
  22. package/src/serve/watch-service-snapshot.ts +101 -0
  23. package/src/serve/watch-service-state.ts +146 -0
  24. package/src/serve/watch-service.ts +265 -306
  25. package/src/serve/watch-snapshot-handles.ts +285 -0
  26. package/src/serve/watch-snapshot-libc.ts +391 -0
  27. package/src/serve/watch-snapshot-ops.ts +399 -0
  28. package/src/serve/watch-snapshot-resolve.ts +246 -0
  29. package/src/serve/watch-snapshot-scan.ts +297 -0
  30. package/src/serve/watch-snapshot-types.ts +350 -0
  31. package/src/serve/watch-snapshot.ts +51 -0
  32. package/src/store/index.ts +1 -1
  33. package/src/store/sqlite/adapter.ts +191 -0
  34. package/src/store/types.ts +66 -0
  35. package/vendor/fts5-snowball/README.md +5 -1
  36. package/vendor/fts5-snowball/darwin-x64/fts5stemmer.dylib +0 -0
  37. package/browser-extension/artifacts/gno-browser-clipper-v1.34.4.zip.sha256 +0 -1
package/README.md CHANGED
@@ -117,7 +117,7 @@ gno daemon --detach # headless indexing + resident MCP gateway
117
117
 
118
118
  <!-- public-truth:current-version -->
119
119
 
120
- > Current release: **v1.34.4** — see [CHANGELOG.md](./CHANGELOG.md)
120
+ > Current release: **v1.34.5** — see [CHANGELOG.md](./CHANGELOG.md)
121
121
 
122
122
  <!-- /public-truth -->
123
123
 
@@ -332,6 +332,11 @@ gno daemon --detach # background (macOS/Linux); use --status / --stop to manag
332
332
  detached child and exits 0; `gno daemon --status` and `gno daemon --stop` give
333
333
  you lifecycle control without `nohup`, `launchd`, or `systemd` units.
334
334
 
335
+ Exact eligible file events always go through content hashing. Atomic-save temp
336
+ files, directory events, missing filenames, and recursive deletions are
337
+ reconciled from bounded filesystem/index evidence, so final files appear and
338
+ proven removals disappear without routinely resyncing untouched siblings.
339
+
335
340
  See also: [docs/DAEMON.md](./docs/DAEMON.md)
336
341
 
337
342
  ### Connect to AI Agents
@@ -396,6 +401,11 @@ headless. `--detach` / `--status` / `--stop` give you symmetric lifecycle
396
401
  controls so you don't need `nohup`, `launchd`, or `systemd` units. The same
397
402
  flag set is available on `gno serve`.
398
403
 
404
+ The shared watcher preserves exact content-hash decisions while reconciling
405
+ ambiguous atomic replacements and directory changes with bounded work and
406
+ durable retries. Tested guarantees cover supported local filesystems; network,
407
+ removable, and coarse-timestamp filesystems are not universally claimed.
408
+
399
409
  [Daemon guide →](https://gno.sh/features/daemon-mode)
400
410
 
401
411
  ---
@@ -2,6 +2,22 @@
2
2
 
3
3
  This project includes the following third-party components:
4
4
 
5
+ ## less-pager-mini
6
+
7
+ - **License**: MIT
8
+ - **Copyright**: Dawson Huang
9
+ - **Project URL**: https://github.com/dawsonhuang0/Less-Pager-Mini
10
+
11
+ Installed as a runtime dependency to provide the built-in Windows terminal pager.
12
+
13
+ ## char-width
14
+
15
+ - **License**: MIT
16
+ - **Copyright**: Dawson Huang
17
+ - **Project URL**: https://github.com/legend80s/char-width
18
+
19
+ Installed transitively by `less-pager-mini` for terminal display-width calculation.
20
+
5
21
  ## fts5-snowball
6
22
 
7
23
  - **Source**: vendored under `vendor/fts5-snowball/`
@@ -0,0 +1 @@
1
+ 76e1e560efa69f780e5e61130008e863cf8288a8ffe5cd82e16b48608c6c8578 gno-browser-clipper-v1.34.6.zip
@@ -21,5 +21,5 @@
21
21
  "content_security_policy": {
22
22
  "extension_pages": "script-src 'self'; object-src 'none'; connect-src http://127.0.0.1:*"
23
23
  },
24
- "version": "1.34.4"
24
+ "version": "1.34.6"
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gmickel/gno",
3
- "version": "1.34.4",
3
+ "version": "1.34.6",
4
4
  "description": "Local semantic search for your documents. Index Markdown, PDF, and Office files with hybrid BM25 + vector search.",
5
5
  "keywords": [
6
6
  "embeddings",
@@ -82,6 +82,9 @@
82
82
  "eval:hybrid:delta": "bun scripts/hybrid-benchmark.ts --delta",
83
83
  "bench:ast-chunking": "bun scripts/ast-chunking-benchmark.ts",
84
84
  "smoke:serve-shutdown": "bun scripts/serve-shutdown-smoke.ts",
85
+ "test:watcher:filesystem": "bun test test/serve/watch-service-filesystem.test.ts test/serve/resident-runtime.test.ts",
86
+ "bench:watcher-reconciliation": "bun scripts/watcher-reconciliation-benchmark.ts",
87
+ "smoke:watcher-reconciliation": "bun scripts/watcher-reconciliation-smoke.ts",
85
88
  "bench:code-embeddings": "bun scripts/code-embedding-benchmark.ts",
86
89
  "bench:code-embeddings:write": "bun scripts/code-embedding-benchmark.ts --write",
87
90
  "bench:general-embeddings": "bun scripts/general-embedding-benchmark.ts",
@@ -176,6 +179,7 @@
176
179
  "embla-carousel-react": "8.6.0",
177
180
  "franc": "6.2.0",
178
181
  "jsonc-parser": "3.3.1",
182
+ "less-pager-mini": "1.12.1",
179
183
  "lucide-react": "1.28.0",
180
184
  "markitdown-ts": "0.0.10",
181
185
  "mdast-util-from-markdown": "2.0.3",
package/spec/cli.md CHANGED
@@ -3369,6 +3369,12 @@ is blocked.
3369
3369
  - Opens DB once at startup
3370
3370
  - Loads config and requires at least one configured collection
3371
3371
  - Starts the same watcher + embed scheduler used by `gno serve`
3372
+ - Exact contained eligible paths always use targeted content-hash sync.
3373
+ Ambiguous temp/directory/missing-name/recursive-delete events use bounded,
3374
+ failure-safe filesystem/index reconciliation with durable retry.
3375
+ - Bounded overflow or unavailable native anchored handles escalates to full
3376
+ collection sync. This does not claim universal network/removable filesystem
3377
+ watcher behavior.
3372
3378
  - Runs an initial sync by default
3373
3379
  - Triggers embedding after initial sync completes
3374
3380
  - Runs in the foreground until `SIGINT` / `SIGTERM`
@@ -3496,16 +3502,16 @@ Error codes match exit codes: `VALIDATION` (exit 1), `RUNTIME` (exit 2), `NOT_RU
3496
3502
 
3497
3503
  ## Environment Variables
3498
3504
 
3499
- | Variable | Description |
3500
- | -------------------------- | ------------------------------------------------ |
3501
- | `GNO_CONFIG_DIR` | Override config directory |
3502
- | `GNO_DATA_DIR` | Override data directory (DB location) |
3503
- | `GNO_CACHE_DIR` | Override cache directory (models) |
3504
- | `NO_COLOR` | Disable colored output (standard) |
3505
- | `PAGER` | Pager for long output (default: less -R, more) |
3506
- | `GNO_SKILLS_HOME_OVERRIDE` | Override home dir for skill user scope (testing) |
3507
- | `CLAUDE_SKILLS_DIR` | Override Claude skills directory |
3508
- | `CODEX_SKILLS_DIR` | Override Codex skills directory |
3505
+ | Variable | Description |
3506
+ | -------------------------- | --------------------------------------------------------------------- |
3507
+ | `GNO_CONFIG_DIR` | Override config directory |
3508
+ | `GNO_DATA_DIR` | Override data directory (DB location) |
3509
+ | `GNO_CACHE_DIR` | Override cache directory (models) |
3510
+ | `NO_COLOR` | Disable colored output (standard) |
3511
+ | `PAGER` | Pager for long output (default: less -R on Unix, built-in on Windows) |
3512
+ | `GNO_SKILLS_HOME_OVERRIDE` | Override home dir for skill user scope (testing) |
3513
+ | `CLAUDE_SKILLS_DIR` | Override Claude skills directory |
3514
+ | `CODEX_SKILLS_DIR` | Override Codex skills directory |
3509
3515
 
3510
3516
  ---
3511
3517
 
package/src/cli/pager.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Pager utility for long CLI output.
3
- * Pipes output through less/more when terminal height exceeded.
3
+ * Pipes output through less or an in-process Windows pager when terminal height exceeded.
4
4
  *
5
5
  * @module src/cli/pager
6
6
  */
@@ -25,26 +25,32 @@ export interface PagerOptions {
25
25
 
26
26
  /**
27
27
  * Find available pager command.
28
- * Priority: $PAGER env → less (with -R for colors) → more
28
+ * Priority: $PAGER env → built-in Windows pager → less (with -R for colors)
29
29
  */
30
- function findPager(): string[] | null {
30
+ export type PagerTarget =
31
+ | { kind: "external"; command: string[] }
32
+ | { kind: "internal" };
33
+
34
+ export function findPager(
35
+ env: NodeJS.ProcessEnv = process.env,
36
+ platformName: NodeJS.Platform = platform()
37
+ ): PagerTarget {
31
38
  // Check $PAGER env first (cross-platform)
32
- const pagerEnv = process.env.PAGER;
39
+ const pagerEnv = env.PAGER;
33
40
  if (pagerEnv) {
34
41
  // Split in case user has args like "less -R"
35
- return pagerEnv.split(/\s+/);
42
+ return { kind: "external", command: pagerEnv.split(/\s+/) };
36
43
  }
37
44
 
38
45
  // Platform-specific fallbacks
39
- const isWindows = platform() === "win32";
46
+ const isWindows = platformName === "win32";
40
47
 
41
48
  if (isWindows) {
42
- // Windows: use more.com (basic but universally available)
43
- return ["more.com"];
49
+ return { kind: "internal" };
44
50
  }
45
51
 
46
52
  // Unix: prefer less with -R (preserve ANSI colors)
47
- return ["less", "-R"];
53
+ return { kind: "external", command: ["less", "-R"] };
48
54
  }
49
55
 
50
56
  /**
@@ -136,15 +142,24 @@ export class Pager {
136
142
  }
137
143
 
138
144
  // Try to spawn pager
139
- const pagerCmd = findPager();
140
- if (!pagerCmd) {
141
- // No pager available, write directly
142
- process.stdout.write(content + "\n");
145
+ const pagerTarget = findPager();
146
+ if (pagerTarget.kind === "internal") {
147
+ await this.runInProcessPager(content);
143
148
  return;
144
149
  }
145
150
 
146
151
  // Spawn pager and pipe content
147
- await this.spawnPager(pagerCmd, content);
152
+ await this.spawnPager(pagerTarget.command, content);
153
+ }
154
+
155
+ /** Use a less-compatible terminal UI on Windows without an external binary. */
156
+ private async runInProcessPager(content: string): Promise<void> {
157
+ try {
158
+ const { default: pager } = await import("less-pager-mini");
159
+ await pager(content, { LESS: "-R" });
160
+ } catch {
161
+ process.stdout.write(content + "\n");
162
+ }
148
163
  }
149
164
 
150
165
  /**