@andespindola/brainlink 0.1.0-beta.8 → 0.1.0-beta.80

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 (63) hide show
  1. package/AGENTS.md +8 -5
  2. package/CHANGELOG.md +58 -2
  3. package/CONTRIBUTING.md +2 -2
  4. package/COPYRIGHT.md +5 -0
  5. package/README.md +266 -20
  6. package/SECURITY.md +1 -1
  7. package/dist/application/add-note.js +62 -13
  8. package/dist/application/analyze-vault.js +95 -8
  9. package/dist/application/build-context.js +56 -1
  10. package/dist/application/dedupe-notes.js +226 -0
  11. package/dist/application/frontend/client-css.js +138 -103
  12. package/dist/application/frontend/client-html.js +47 -41
  13. package/dist/application/frontend/client-js.js +2469 -156
  14. package/dist/application/frontend/client-worker-js.js +66 -0
  15. package/dist/application/get-graph-layout.js +18 -6
  16. package/dist/application/get-graph-node.js +12 -0
  17. package/dist/application/get-graph-summary.js +12 -0
  18. package/dist/application/get-graph.js +3 -3
  19. package/dist/application/import-legacy-sqlite.js +296 -0
  20. package/dist/application/index-vault.js +252 -19
  21. package/dist/application/list-agents.js +3 -3
  22. package/dist/application/list-links.js +5 -5
  23. package/dist/application/migrate-vault.js +46 -16
  24. package/dist/application/offline-pack-backup.js +44 -0
  25. package/dist/application/search-graph-node-ids.js +12 -0
  26. package/dist/application/search-knowledge.js +75 -5
  27. package/dist/application/server/routes.js +102 -1
  28. package/dist/application/start-server.js +75 -4
  29. package/dist/application/watch-vault.js +23 -2
  30. package/dist/benchmarks/large-vault.js +1 -1
  31. package/dist/cli/commands/agent-commands.js +419 -0
  32. package/dist/cli/commands/config-commands.js +167 -0
  33. package/dist/cli/commands/read-commands.js +25 -8
  34. package/dist/cli/commands/write-commands.js +973 -10
  35. package/dist/cli/main.js +4 -0
  36. package/dist/cli/runtime.js +5 -2
  37. package/dist/domain/context.js +53 -11
  38. package/dist/domain/embeddings.js +2 -1
  39. package/dist/domain/graph-layout.js +67 -16
  40. package/dist/domain/markdown.js +36 -4
  41. package/dist/domain/middle-out.js +18 -0
  42. package/dist/infrastructure/config.js +132 -8
  43. package/dist/infrastructure/file-index.js +358 -0
  44. package/dist/infrastructure/file-system-vault.js +15 -0
  45. package/dist/infrastructure/index-state.js +56 -0
  46. package/dist/infrastructure/paths.js +9 -1
  47. package/dist/infrastructure/private-pack-codec.js +134 -0
  48. package/dist/infrastructure/search-packs.js +452 -0
  49. package/dist/infrastructure/session-state.js +172 -0
  50. package/dist/mcp/main.js +11 -3
  51. package/dist/mcp/server.js +27 -2
  52. package/dist/mcp/startup.js +35 -0
  53. package/dist/mcp/tools.js +633 -19
  54. package/docs/AGENT_USAGE.md +177 -15
  55. package/docs/ARCHITECTURE.md +37 -26
  56. package/docs/QUICKSTART.md +111 -0
  57. package/package.json +6 -4
  58. package/dist/infrastructure/sqlite/document-writer.js +0 -51
  59. package/dist/infrastructure/sqlite/graph-reader.js +0 -120
  60. package/dist/infrastructure/sqlite/schema.js +0 -111
  61. package/dist/infrastructure/sqlite/search-reader.js +0 -156
  62. package/dist/infrastructure/sqlite/types.js +0 -1
  63. package/dist/infrastructure/sqlite-index.js +0 -25
package/AGENTS.md CHANGED
@@ -6,19 +6,19 @@ This file tells coding agents and AI assistants how to use this repository.
6
6
 
7
7
  Brainlink is a local-first knowledge memory for agents.
8
8
 
9
- It reads a Markdown vault, extracts `[[wiki links]]` and `#tags`, builds a local SQLite full-text index, and returns compact context packages that agents can inject into prompts.
9
+ It reads a Markdown vault, extracts `[[wiki links]]` and `#tags`, builds a local file index at `.brainlink/index.json`, and returns compact context packages that agents can inject into prompts.
10
10
 
11
11
  ## Source Of Truth
12
12
 
13
13
  Markdown files are the source of truth.
14
14
 
15
- The SQLite database at `.brainlink/brainlink.db` is a derived index. It can be deleted and rebuilt with:
15
+ The JSON index at `.brainlink/index.json` is derived. It can be deleted and rebuilt with:
16
16
 
17
17
  ```bash
18
18
  npm run dev -- index --vault ./vault
19
19
  ```
20
20
 
21
- Do not store permanent knowledge only in SQLite.
21
+ Do not store permanent knowledge only in index artifacts.
22
22
 
23
23
  By default, the installed Brainlink CLI uses `$HOME/.brainlink/vault` as its vault. Passing `--vault` or setting `vault` in `brainlink.config.json` intentionally selects a custom vault such as `./vault`.
24
24
 
@@ -83,6 +83,9 @@ Use watch mode while editing notes:
83
83
  ```bash
84
84
  npm run dev -- server --vault ./vault --watch
85
85
  npm run dev -- watch --vault ./vault
86
+ npm run dev -- bench --vault ./vault
87
+ npm run dev -- bench --vault ./vault --watch
88
+ npm run dev -- pack-backup --vault ./vault
86
89
  ```
87
90
 
88
91
  Start MCP over stdio:
@@ -107,10 +110,10 @@ npm run dev -- doctor --vault ./vault
107
110
 
108
111
  - Keep domain rules in `src/domain`.
109
112
  - Keep use cases in `src/application`.
110
- - Keep filesystem and SQLite details in `src/infrastructure`.
113
+ - Keep filesystem and index details in `src/infrastructure`.
111
114
  - Keep CLI concerns in `src/cli`.
112
115
  - Prefer pure functions for parsing, ranking, formatting, and transformation.
113
- - Do not make SQLite the canonical storage layer.
116
+ - Do not make index artifacts the canonical storage layer.
114
117
  - Do not add comments with emojis.
115
118
  - Keep JSON output backwards compatible where possible.
116
119
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0-beta.4
4
+
5
+ - Added bootstrap session-state persistence in `$BRAINLINK_HOME/session-state.json` for vault/agent readiness tracking.
6
+ - Added MCP `brainlink_policy` tool and default bootstrap enforcement for read tools.
7
+ - Added `agent install --self-test` diagnostics and bootstrap readiness details in `agent status`.
8
+ - Added `agent upgrade` for legacy installations to reapply latest MCP/plugin defaults with self-test diagnostics.
9
+ - Added `config doctor --fix` safe autofix mode with dry-run default behavior.
10
+ - Added detailed per-file migration reporting through `migrate-vault --report`.
11
+ - Added `quickstart` command to run plug-and-play vault + bootstrap + agent setup in one flow.
12
+ - Added structured MCP `nextActions` in bootstrap/policy/preflight responses for automatic client continuation.
13
+ - Added default MCP read auto-bootstrap behavior controlled by `brainlink_policy.autoBootstrapOnRead`.
14
+ - Added default MCP startup bootstrap behavior controlled by `brainlink_policy.autoBootstrapOnStartup`.
15
+ - Added CLI MCP policy presets through `blink agent policy --preset fully-auto|strict`.
16
+ - Added write-time non-orphan enforcement by auto-linking notes without wiki edges to agent hub notes.
17
+ - Added MCP `brainlink_policy` presets (`fully-auto`, `strict`) for one-call policy switching.
18
+ - Added MCP write connectivity metadata in `brainlink_add_note`/`brainlink_add_file` responses.
19
+ - Added MCP `brainlink_recommendations` tool for plug-and-play workflow guidance.
20
+ - Improved graph/index robustness by splitting oversized paragraphs into bounded chunks and dropping self-referential links.
21
+ - Added `agentProfiles` configuration support so CLI and MCP can resolve per-agent defaults for mode/limit/tokens.
22
+ - Added short-lived hybrid search cache with automatic invalidation on index changes.
23
+ - Added `stats --extended` observability output with storage, quality and latency probes.
24
+ - Added `docs/QUICKSTART.md` and aligned README/agent docs with the latest CLI/MCP flows.
25
+ - Added middle-out context assembly so chunk selection expands around the strongest note chunk.
26
+ - Added compressed-space pack prefiltering (token bloom index) before `.blpk` decryption and scan.
27
+ - Improved graph UI auto-fit and viewport recovery so loaded nodes are re-centered when zoom/pan drifts to empty canvas.
28
+ - Added cross-platform native desktop GUI auto-open for `blink server` (macOS Swift/WebKit, Windows PowerShell WinForms, Linux Python GTK/WebKit2), with app-window/browser fallback.
29
+ - Changed Linux default UI launch to app-window/browser for lighter startup; Linux native GUI is now opt-in via `BRAINLINK_LINUX_NATIVE_GUI=1`.
30
+ - Added native GUI parent-process monitoring so GUI windows close automatically when `blink server` stops.
31
+ - Improved non-mac browser detection fallback to try installed Edge/Chrome/Firefox/Chromium candidates before system default open.
32
+ - Improved graph filter rendering to keep hub anchor nodes visible (`Memory Hub`/`MOC`/high-degree fallback) for coherent relationship context.
33
+ - Fixed graph modal content loading by correcting agent query parameter composition for `/api/graph-node` and `/api/graph-filter` requests.
34
+ - Improved 50k+ graph rendering performance with viewport-aware spatial node culling, cached render visibility, and node-adjacent edge selection to avoid full graph scans every frame.
35
+ - Added incremental vault indexing with file snapshots to reuse unchanged documents/chunks/embeddings, plus adaptive search-pack rebuild thresholds to avoid full re-compression on small edits.
36
+ - Reduced large-graph HTTP payload size with compact `/api/graph-layout` encoding for high-node vaults and capped transmitted edges to improve UI load responsiveness.
37
+ - Added aggressive graph LOD clustering when zoomed out, dynamic per-zoom edge render budgets, and a dedicated frontend worker for off-main-thread graph filter matching.
38
+ - Improved Linux browser fallback launch stability by auto-applying Chromium compatibility flags (`--ozone-platform=x11`, `--disable-gpu`, `--disable-features=Vulkan,VaapiVideoDecoder`, `--disable-background-networking`) for app-window/browser modes.
39
+ - Improved massive-graph UI responsiveness with stricter render budgets, adaptive heavy-graph frame throttling, reduced interaction hit-test frequency, and URL-first agent selection on initial graph load.
40
+ - Improved 50k+ graph LOD behavior so zoomed-out views render lightweight cluster overviews and progressively reveal nodes/edges only as zoom increases.
41
+ - Added `blink bench` with realtime index phase telemetry and per-run compressed-pack analysis (input/output bytes, ratio, saved space, rebuild reason and duration), including continuous watch mode.
42
+ - Added tunable single-stage search-pack compression settings (`searchPack.rowChunkSize`, `searchPack.compressionLevel`, `searchPack.useDictionary`).
43
+ - Added benchmark guardrails for compression savings and latency regression (`searchPack.guardrailMinSavingsPercent`, `searchPack.guardrailMaxLatencyRegressionPercent`), reported in `blink bench`.
44
+ - Added `blink pack-backup` for offline second-stage compression backups of encrypted `.blpk` packs, outside the online query path.
45
+ - Hardened Linux browser launch flags for Ubuntu 26 Chromium/Wayland compatibility (`--disable-vulkan`, `--use-gl=swiftshader`, `--ozone-platform-hint=x11`).
46
+ - Improved pack resilience by auto-repairing missing search-pack manifests from existing `.blpk` files, avoiding unnecessary full repacks on small incremental updates.
47
+ - Updated Linux graph auto-open behavior to prioritize the system default browser (`xdg-open`) before explicit browser fallbacks.
48
+ - Removed implicit Chromium dependency in Linux auto-open flow; app-window launch is now opt-in (`BRAINLINK_LINUX_APP_WINDOW=1`).
49
+
50
+ ## 0.1.0-beta.3
51
+
52
+ - Added CLI configuration commands for effective vault management, including `config where`, `config get`, `config doctor` and `config set-vault`.
53
+ - Added explicit `migrate-vault` command with `--dry-run` preview and conflict-preserving copy behavior.
54
+ - Added one-command agent setup through `agent install` plus `agent status` diagnostics.
55
+ - Added MCP `brainlink_bootstrap` default entrypoint guidance for plug-and-play agent memory flows.
56
+ - Added migration coverage for S3 bucket vault targets.
57
+ - Updated architecture and agent-usage documentation to reflect current CLI/MCP behavior and configuration precedence.
58
+
3
59
  ## 0.1.0-beta.2
4
60
 
5
61
  - Added MCP installation guidance for direct server configuration and local client stores.
@@ -17,8 +73,8 @@
17
73
  ## 0.1.0-alpha.0
18
74
 
19
75
  - Added local-first Markdown vault indexing.
20
- - Added SQLite FTS, local semantic retrieval, wiki links, backlinks and graph retrieval.
21
- - Added SQLite semantic bucket indexing to narrow vector candidates for larger vaults.
76
+ - Added local full-text indexing, local semantic retrieval, wiki links, backlinks and graph retrieval.
77
+ - Added semantic candidate bucket indexing to narrow vector candidates for larger vaults.
22
78
  - Optimized title/link resolution with precomputed agent-scoped title maps.
23
79
  - Added CLI, JSON output, HTTP API and graph UI.
24
80
  - Added vault diagnostics: stats, broken links, orphans, validation and doctor.
package/CONTRIBUTING.md CHANGED
@@ -22,7 +22,7 @@ npm run pack:smoke
22
22
  ## Design Rules
23
23
 
24
24
  - Markdown files are the source of truth.
25
- - SQLite is a derived index and must remain rebuildable.
25
+ - Local index artifacts are derived and must remain rebuildable.
26
26
  - Domain parsing, graph analysis and layout should stay pure and testable.
27
- - CLI, HTTP, filesystem and SQLite code are adapters around application use cases.
27
+ - CLI, HTTP, filesystem and index code are adapters around application use cases.
28
28
  - MCP integration should live outside this package by wrapping the CLI with `--json`.
package/COPYRIGHT.md ADDED
@@ -0,0 +1,5 @@
1
+ Copyright (c) 2026 Substructa
2
+
3
+ This project is licensed under the MIT License.
4
+
5
+ See [LICENSE](./LICENSE) for full terms.
package/README.md CHANGED
@@ -52,11 +52,15 @@ LLMs do not have infinite context. Brainlink gives agents an external memory lay
52
52
  1. Durable knowledge is written as Markdown.
53
53
  2. Notes are connected with `[[wiki links]]`.
54
54
  3. Concepts are classified with `#tags`.
55
- 4. Brainlink builds a local SQLite index with FTS records and local embeddings.
55
+ 4. Brainlink builds a local JSON index (`.brainlink/index.json`) and private encrypted search packs.
56
56
  5. Agents query the index before responding.
57
57
  6. Brainlink returns compact, source-backed context.
58
58
 
59
- Markdown is the source of truth. `.brainlink/brainlink.db` is only a rebuildable index.
59
+ Markdown is the source of truth. `.brainlink/index.json` is a rebuildable index artifact.
60
+ After each index run, Brainlink also writes private encrypted search packs at `.brainlink/search-packs/*.blpk` to preserve fast retrieval and portable recovery.
61
+ Online retrieval always uses a single compression stage per pack; optional second-stage compression is reserved for offline backup artifacts only.
62
+ Pack decryption uses a Brainlink key from `$BRAINLINK_HOME/keys` or from `BRAINLINK_SEARCH_PACK_KEY` when explicitly configured.
63
+ Legacy `.jsonl.gz` packs are upgraded to `.blpk` automatically on first search/context access.
60
64
 
61
65
  ## Features
62
66
 
@@ -64,8 +68,12 @@ Markdown is the source of truth. `.brainlink/brainlink.db` is only a rebuildable
64
68
  - Obsidian-compatible `[[wiki links]]` and `#tags`.
65
69
  - Weighted graph edges so agents can rank relationship importance and priority.
66
70
  - Backlinks, broken-link reports, orphan detection and validation.
67
- - Full-text, semantic and hybrid retrieval modes.
68
- - SQLite-backed semantic candidate buckets for larger vaults.
71
+ - Full-text, semantic and hybrid retrieval on a local file index.
72
+ - Middle-out context assembly around the strongest chunk per document.
73
+ - In-process index and context caching with automatic invalidation on index updates.
74
+ - Compressed-space prefiltering for `.blpk` packs before decryption and scan.
75
+ - Incremental indexing that reprocesses only changed markdown files and reuses existing chunks/embeddings for unchanged notes.
76
+ - Adaptive compressed-pack rebuild policy to keep indexing fast during small edit batches.
69
77
  - Agent namespaces under `agents/<agent-id>/`.
70
78
  - S3-compatible bucket vaults through `s3://bucket/prefix` URIs.
71
79
  - CLI with machine-readable `--json` output.
@@ -73,6 +81,14 @@ Markdown is the source of truth. `.brainlink/brainlink.db` is only a rebuildable
73
81
  - Built-in MCP stdio server for agent tool integration.
74
82
  - Local HTTP API.
75
83
  - Realtime graph UI with agent selector and colored knowledge groups.
84
+ - Graph renderer optimized for large datasets with viewport-driven node culling and edge lookup by visible nodes.
85
+ - Large graph canvas rendering batches regular nodes and edges to reduce per-frame draw calls while keeping selected and hovered items highlighted.
86
+ - Large graph layout API automatically uses compact payload encoding with link-coverage-aware edge selection to reduce initial client load without hiding major relationships.
87
+ - Large-segment layout spacing now grows logarithmically to keep initial visual density consistent between medium and very large vaults (for example, ~1k vs ~50k notes).
88
+ - Zoomed-out graph LOD clusters dense regions and progressively expands the focused viewport as zoom increases, including very large vaults.
89
+ - Graph reset starts in macro "galaxy" overview mode and progressively reveals nearby nodes as zoom increases, including smaller vaults.
90
+ - Graph filtering runs in a dedicated browser worker to keep the UI thread responsive during heavy datasets.
91
+ - Edge rendering budgets adapt to zoom level to prevent frame spikes on large graph panoramas.
76
92
 
77
93
  ## Install
78
94
 
@@ -106,6 +122,8 @@ npx @andespindola/brainlink@latest --help
106
122
 
107
123
  This section is written for agents. If you are an AI agent operating in a user workspace, use this workflow to install and use Brainlink without requiring the user to run commands manually.
108
124
 
125
+ For a condensed setup path, see [docs/QUICKSTART.md](./docs/QUICKSTART.md).
126
+
109
127
  ### 1. Check Whether Brainlink Is Installed
110
128
 
111
129
  ```bash
@@ -280,7 +298,7 @@ export BRAINLINK_S3_FORCE_PATH_STYLE=1
280
298
 
281
299
  Bucket vaults mirror Markdown into a local cache under
282
300
  `$BRAINLINK_HOME/bucket-cache`. The bucket remains canonical; the local
283
- `.brainlink/brainlink.db` stays a disposable index. Run `index` after remote
301
+ `.brainlink/index.json` stays a disposable index artifact. Run `index` after remote
284
302
  bucket changes before relying on `search`, `context`, graph or validation
285
303
  commands. Watch mode is only supported for local filesystem vaults.
286
304
 
@@ -296,7 +314,7 @@ vault/
296
314
  research-agent/
297
315
  source-review-policy.md
298
316
  .brainlink/
299
- brainlink.db
317
+ index.json
300
318
  ```
301
319
 
302
320
  Permanent data:
@@ -306,7 +324,7 @@ Permanent data:
306
324
 
307
325
  Rebuildable data:
308
326
 
309
- - `.brainlink/brainlink.db`
327
+ - `.brainlink/index.json`
310
328
  - full-text records
311
329
  - local embedding vectors
312
330
  - local embedding buckets
@@ -380,6 +398,36 @@ Example MCP client configuration:
380
398
  }
381
399
  ```
382
400
 
401
+ ### One-Command Agent Setup
402
+
403
+ If your agent runtime is Codex-compatible, run:
404
+
405
+ ```bash
406
+ blink agent install --self-test
407
+ blink agent upgrade
408
+ ```
409
+
410
+ This configures `~/.codex/config.toml` with Brainlink MCP (`brainlink-mcp`) so Brainlink is available by default in agent sessions.
411
+ `agent install` and `agent upgrade` also apply the MCP `fully-auto` bootstrap policy by default (`enforceBootstrap`, `enforceContextFirst`, `autoBootstrapOnRead`, `autoBootstrapOnStartup` all enabled).
412
+
413
+ If you are inside this repository and want plugin gallery setup too:
414
+
415
+ ```bash
416
+ blink agent install --plugin-path ./plugins/brainlink
417
+ ```
418
+
419
+ To verify:
420
+
421
+ ```bash
422
+ blink agent status
423
+ ```
424
+
425
+ For fully automated first run (vault index + health + bootstrap readiness + agent integration):
426
+
427
+ ```bash
428
+ blink quickstart --query "what should I know before this task?" --json
429
+ ```
430
+
383
431
  For a locked-down setup, allowlist the vaults that MCP clients may access:
384
432
 
385
433
  ```json
@@ -475,8 +523,13 @@ Restart the client after changing marketplace or MCP configuration so it reloads
475
523
 
476
524
  Available tools:
477
525
 
526
+ - `brainlink_bootstrap`: plug-and-play entrypoint that runs index + health checks and can return context in one call.
527
+ - `brainlink_policy`: read or update bootstrap/context-first policy, including presets (`preset: "fully-auto" | "strict"`).
528
+ - `brainlink_recommendations`: return an automatic action plan so agents can run Brainlink in the recommended order.
478
529
  - `brainlink_context`: read indexed context for a task or question.
479
530
  - `brainlink_search`: search indexed notes.
531
+ - `brainlink_dedupe`: detect duplicate candidates using exact hash + semantic similarity scores.
532
+ - `brainlink_resolve_duplicate`: resolve duplicate pairs (`merge`, `link`, `ignore`) with connectivity-safe fallback edges.
480
533
  - `brainlink_add_note`: write durable Markdown memory and reindex.
481
534
  - `brainlink_add_file`: ingest a local file as a note and reindex.
482
535
  - `brainlink_index`: rebuild the vault index.
@@ -487,7 +540,15 @@ Available tools:
487
540
  - `brainlink_broken_links`: list unresolved wiki links.
488
541
  - `brainlink_orphans`: list disconnected notes.
489
542
 
490
- The same linking rule applies through MCP: `brainlink_context` is read-only, and real graph links require Markdown notes with explicit `[[wiki links]]`. `brainlink_add_note` and `brainlink_add_file` reindex by default and include the index result when enabled.
543
+ For the most automatic workflow, start MCP sessions with `brainlink_bootstrap` (optionally with `query`) and then continue with `brainlink_context`/`brainlink_add_note`.
544
+ By default, Brainlink enforces context-first for MCP reads (`enforceContextFirst=true`): non-context read tools return preflight until `brainlink_context` is called for the vault/agent session.
545
+ By default, MCP startup already runs bootstrap on the configured default vault/agent (`autoBootstrapOnStartup=true`), so sessions begin warm.
546
+ By default, Brainlink enforces bootstrap and auto-runs it for read tools when session state is missing or stale (`autoBootstrapOnRead=true`).
547
+ If you disable `autoBootstrapOnRead` through `brainlink_policy`, read tools return a preflight instruction with suggested `brainlink_bootstrap` arguments.
548
+ `brainlink_bootstrap`, `brainlink_policy` and preflight responses include structured `nextActions` so MCP clients can continue automatically without custom parsing.
549
+ For one-call planning, use `brainlink_recommendations` to get the recommended tool sequence for the current vault/agent/query.
550
+
551
+ The same linking rule applies through MCP: `brainlink_context` is read-only, and real graph links require Markdown notes with explicit `[[wiki links]]`. `brainlink_add_note` and `brainlink_add_file` reindex by default and include index + `writeConnectivity` metadata. Brainlink guarantees at least one edge per new note by auto-linking when needed.
491
552
 
492
553
  Agents can raise the importance of a relationship by putting priority markers on the same line as a wiki link:
493
554
 
@@ -507,16 +568,35 @@ blink server --host 127.0.0.1 --port 4321 --watch
507
568
  ```
508
569
 
509
570
  By default, the server uses `$HOME/.brainlink/vault`. Pass `--vault ./vault` only when you want to inspect a custom vault.
571
+ By default, `blink server` tries to open the graph in a native desktop GUI window:
572
+ - macOS: Swift + WebKit
573
+ - Windows: PowerShell WinForms WebBrowser
574
+ - Linux: optional Python GTK + WebKit2 (requires `python3` + `gi` + `WebKit2`)
575
+
576
+ On Linux, native GUI is disabled by default for better startup performance. Enable it with `BRAINLINK_LINUX_NATIVE_GUI=1`.
577
+ If native GUI launch is unavailable on your system, it falls back to dedicated app-window mode and then to the default browser.
578
+ For Chromium-family browsers on Linux (`chromium`, `chromium-browser`, `google-chrome`, `microsoft-edge`, `brave-browser`), Brainlink now auto-applies compatibility flags during launch (`--ozone-platform=x11`, `--ozone-platform-hint=x11`, `--disable-gpu`, `--disable-vulkan`, `--use-gl=swiftshader`, `--disable-features=Vulkan,VaapiVideoDecoder`, `--disable-background-networking`) to avoid common Wayland/Vulkan/VAAPI startup issues.
579
+ On Linux, Brainlink opens the graph through the system default browser first (`xdg-open`), then `$BROWSER`/detected browsers as fallback. Chromium-family app-window mode is optional via `BRAINLINK_LINUX_APP_WINDOW=1`.
580
+ Use `--no-open` to keep it headless.
581
+ When native GUI is used, the GUI window automatically closes when the `blink server` process stops.
510
582
 
511
583
  The graph UI shows:
512
584
 
513
585
  - notes as nodes
514
586
  - `[[wiki links]]` as weighted edges
515
- - backlinks and outgoing links
516
- - full Markdown content for the selected note
587
+ - details opened on node click (tags, outgoing links, backlinks, full Markdown content)
517
588
  - neutral graph nodes with segment/group metadata
518
- - agent selector for isolated views
589
+ - agent selector (id-only labels) for isolated views
590
+ - graph filter matches title, path, tags and note content
591
+ - graph filter keeps hub context nodes visible (`Memory Hub`/`MOC`/high-degree fallback) to preserve relationship readability
519
592
  - realtime refresh while `--watch` is enabled
593
+ - graph controls for zoom in, zoom out, fit visible nodes and reset-to-fit-all
594
+ - wheel zoom (including `cmd+scroll` and `ctrl+scroll`) anchored to cursor position for faster navigation in large graphs
595
+ - keyboard shortcuts: `+` zoom in, `-` zoom out, `0` reset fit
596
+ - double-click on canvas zooms in at cursor position
597
+ - floating graph totals (notes, links, tags) below the Brainlink title
598
+ - large-graph rendering safeguards (batched canvas drawing, edge draw caps, lower redraw rate, zoom-aware interaction)
599
+ - massive-graph LOD progression: very low zoom uses spatial overview sampling plus hub-neighborhood edge previews to preserve whole-vault shape and orientation, then progressively raises the focused node budget as zoom increases so dense local areas keep nearby notes and links visible
520
600
 
521
601
  The server indexes before starting by default. Use `--no-index` to skip that step:
522
602
 
@@ -535,6 +615,7 @@ Routes:
535
615
  - `GET /api/agents`
536
616
  - `GET /api/graph`
537
617
  - `GET /api/graph-layout`
618
+ - `GET /api/graph-node?id=<node-id>`
538
619
  - `GET /api/search?q=<query>&limit=10&mode=hybrid`
539
620
  - `GET /api/context?q=<query>&limit=12&tokens=2000&mode=hybrid`
540
621
  - `GET /api/links`
@@ -556,6 +637,79 @@ Read routes accept `agent=<agent-id>`:
556
637
 
557
638
  Every command works with either `brainlink` or `blink`.
558
639
 
640
+ ### `agent`
641
+
642
+ ```bash
643
+ blink agent install
644
+ blink agent install --self-test
645
+ blink agent upgrade
646
+ blink agent policy --preset fully-auto
647
+ blink agent policy --preset strict
648
+ blink agent policy --enforce-context-first false
649
+ blink agent install --plugin-path ./plugins/brainlink
650
+ blink agent install --mcp-only --allowed-vaults "/absolute/vault,/absolute/team-vault"
651
+ blink agent status
652
+ ```
653
+
654
+ Installs/checks agent integration. `install` writes Brainlink MCP config into `~/.codex/config.toml`.
655
+ When plugin files are available, it also links Brainlink plugin files into `~/plugins/brainlink` and updates `~/.agents/plugins/marketplace.json`.
656
+ With `--self-test`, install also validates MCP block presence, command wiring and local plugin registration signals.
657
+ Use `agent upgrade` on legacy installations to reapply current defaults and run the same self-test diagnostics.
658
+ Use `agent policy --preset fully-auto` for plug-and-play defaults, or `agent policy --preset strict` to require explicit bootstrap calls.
659
+ Both presets keep `enforceContextFirst=true` so Brainlink stays the primary context source for MCP sessions.
660
+
661
+ ### `quickstart`
662
+
663
+ ```bash
664
+ blink quickstart --json
665
+ blink quickstart --vault ./team-vault --agent coding-agent --query "architecture decisions" --json
666
+ blink quickstart --vault ./team-vault --mcp-only --json
667
+ ```
668
+
669
+ Runs index + doctor + stats + validation, refreshes bootstrap session readiness, optionally returns context for a query, and (by default) upgrades local agent integration for plug-and-play MCP usage.
670
+ When `--mode`, `--limit` or `--tokens` are omitted, quickstart uses agent profile defaults when available.
671
+
672
+ ### `config`
673
+
674
+ ```bash
675
+ blink config where
676
+ blink config get vault
677
+ blink config doctor
678
+ blink config doctor --fix
679
+ blink config set-vault /absolute/path/to/existing-vault
680
+ blink config set-vault /absolute/path/to/existing-vault --migrate-from ~/.brainlink/vault
681
+ blink config set-vault "s3://my-memory-bucket/brainlink" --global
682
+ ```
683
+
684
+ `config set-vault` writes configuration through CLI (no manual file edits required).
685
+ By default it writes local config (`./brainlink.config.json`), appends the vault to `allowedVaults`, and migrates Markdown memory from the current configured vault when the target is empty.
686
+ Use `--global` to write to `$BRAINLINK_HOME/brainlink.config.json`, `--no-migrate` to skip migration, and `--no-index` to skip post-migration indexing.
687
+ `config doctor` is dry-run by default; use `--fix` to apply safe config normalization and allowlist fixes.
688
+
689
+ ### `migrate-vault`
690
+
691
+ ```bash
692
+ blink migrate-vault --from ~/.brainlink/vault --to ./team-vault --dry-run
693
+ blink migrate-vault --from ~/.brainlink/vault --to ./team-vault
694
+ blink migrate-vault --from ~/.brainlink/vault --to "s3://my-memory-bucket/brainlink"
695
+ blink migrate-vault --from ~/.brainlink/vault --to ./team-vault --report ./migration-report.json
696
+ ```
697
+
698
+ Runs explicit markdown migration between vaults while preserving conflicts as `.conflict-<timestamp>` files.
699
+ Use `--dry-run` to preview `copied`, `conflicted` and `unchanged` counts before writing.
700
+
701
+ ### `db-import`
702
+
703
+ ```bash
704
+ blink db-import --vault ./team-vault
705
+ blink db-import --vault ./team-vault --db ./legacy/brainlink.db
706
+ blink db-import --vault ./team-vault --db ./legacy/brainlink.db --table legacy_notes --dry-run
707
+ ```
708
+
709
+ Imports durable memory from a legacy SQLite database into Markdown notes (`agents/<agent-id>/*.md`) and reindexes by default.
710
+ When `--db` is omitted, Brainlink auto-detects common legacy paths such as `<vault>/.brainlink/brainlink.db`.
711
+ Use `--agent <id>` to force all imported rows into one namespace, `--limit` for incremental imports, `--dry-run` to preview without writing files, and `--no-index` to defer reindexing.
712
+
559
713
  ### `init`
560
714
 
561
715
  ```bash
@@ -579,6 +733,29 @@ blink add "Note Title" --vault ./vault --content-file ./notes.md --no-auto-index
579
733
  `--content` and `--content-file` are mutually exclusive. Add `--no-auto-index` when you want to defer reindexing.
580
734
 
581
735
  Creates a Markdown note under `agents/<agent-id>/`. Common secret patterns are blocked by default; use `--allow-sensitive` only for an intentionally protected vault.
736
+ To avoid disconnected memory, Brainlink auto-adds a fallback wiki edge when a note is written without links, creating agent hub notes when needed.
737
+ `add` also returns `possibleDuplicates` (exact hash + semantic candidates) so agents can resolve duplicate memory right after writes.
738
+
739
+ ### `dedupe`
740
+
741
+ ```bash
742
+ blink dedupe --vault ./vault --json
743
+ blink dedupe --vault ./vault --agent coding-agent --limit 20 --min-score 0.92 --json
744
+ blink dedupe --vault ./vault --no-semantic --json
745
+ ```
746
+
747
+ Detects `possibleDuplicate` pairs using exact content hashes and optional semantic similarity.
748
+
749
+ ### `dedupe-resolve`
750
+
751
+ ```bash
752
+ blink dedupe-resolve --vault ./vault --left agents/shared/a.md --right agents/shared/b.md --action merge --json
753
+ blink dedupe-resolve --vault ./vault --left agents/shared/a.md --right agents/shared/b.md --action link --json
754
+ blink dedupe-resolve --vault ./vault --left agents/shared/a.md --right agents/shared/b.md --action ignore --json
755
+ ```
756
+
757
+ Resolves a duplicate pair with `merge`, `link` or `ignore`.
758
+ When action is not `merge`, Brainlink still creates a low-priority related edge (`#related-to`) so notes remain connected.
582
759
 
583
760
  ### `index`
584
761
 
@@ -589,6 +766,38 @@ blink index --vault ./vault
589
766
 
590
767
  Rebuilds the local index from Markdown files.
591
768
 
769
+ ### `bench`
770
+
771
+ ```bash
772
+ blink bench --vault ./vault
773
+ blink bench --vault ./vault --watch
774
+ blink bench --vault ./vault --watch --debounce 500
775
+ blink bench --vault ./vault --json
776
+ ```
777
+
778
+ Runs indexing with realtime phase telemetry (`start`, `scan`, `parse`, `embed`, `persist`, `packs`, `complete`) and prints a benchmark summary at the end of each run.
779
+
780
+ Summary includes compression behavior for `.blpk` packs when rebuild happens:
781
+ - pack rebuild reason
782
+ - pack count and pack build duration
783
+ - uncompressed input bytes vs compressed output bytes
784
+ - saved percentage
785
+ - objective guardrails (minimum savings and maximum latency regression thresholds)
786
+
787
+ Use `--watch` to keep benchmarking incremental reindex runs after Markdown changes (local filesystem vaults only).
788
+ When `.brainlink/search-packs/manifest.json` is missing but `.blpk` files exist, Brainlink repairs the manifest first and avoids unnecessary full pack rebuild on small edits.
789
+
790
+ ### `pack-backup`
791
+
792
+ ```bash
793
+ blink pack-backup --vault ./vault
794
+ blink pack-backup --vault ./vault --output ./vault/.brainlink/backups/custom.blpkbak.gz
795
+ blink pack-backup --vault ./vault --json
796
+ ```
797
+
798
+ Creates an offline backup artifact of encrypted search packs with a second compression pass.
799
+ This is intentionally outside the online retrieval path (`index`, `search`, `context`).
800
+
592
801
  ### `agents`
593
802
 
594
803
  ```bash
@@ -607,13 +816,17 @@ blink search "query" --vault ./vault --mode semantic --json
607
816
  ```
608
817
 
609
818
  Runs retrieval over indexed chunks.
819
+ If `--mode` or `--limit` is omitted, Brainlink resolves values from the current agent profile before falling back to global defaults.
610
820
 
611
821
  Modes:
612
822
 
613
- - `hybrid`: default; combines SQLite FTS with local embedding similarity.
614
- - `fts`: exact lexical retrieval through SQLite FTS.
823
+ - `hybrid`: default; combines lexical matching with local embedding similarity.
824
+ - `fts`: exact lexical retrieval from the file index.
615
825
  - `semantic`: local deterministic embedding similarity only.
616
826
 
827
+ Hybrid results are cached in-memory for a short TTL and invalidated automatically when the local index file changes.
828
+ Context selection uses a middle-out strategy: it starts from the strongest chunk in a note and expands to neighboring chunks while respecting token budget.
829
+
617
830
  ### `context`
618
831
 
619
832
  ```bash
@@ -623,6 +836,7 @@ blink context "question" --vault ./vault --agent coding-agent --mode hybrid --js
623
836
  ```
624
837
 
625
838
  Builds a compact context package for an agent.
839
+ Repeated calls with the same vault, agent, query, mode and token/limit settings are served from a short in-memory cache while the index is unchanged.
626
840
 
627
841
  ### `links`
628
842
 
@@ -656,9 +870,11 @@ Prints indexed graph data. Edges include `weight` and `priority` so agents can c
656
870
  ```bash
657
871
  blink stats --vault ./vault
658
872
  blink stats --vault ./vault --agent coding-agent --json
873
+ blink stats --vault ./vault --agent coding-agent --extended --json
659
874
  ```
660
875
 
661
876
  Prints vault metrics.
877
+ Use `--extended` to include storage footprint, link quality ratios and observability probes (`index`, `search`, `context` latencies).
662
878
 
663
879
  ### `broken-links`
664
880
 
@@ -690,7 +906,7 @@ Validates graph health. The command exits non-zero when required checks fail.
690
906
  blink doctor --vault ./vault
691
907
  ```
692
908
 
693
- Runs environment and vault checks.
909
+ Runs environment and vault checks. When vault has zero markdown and zero indexed documents, `doctor` prints recommended next steps (add note, inspect config source, migrate memory).
694
910
 
695
911
  ### `watch`
696
912
 
@@ -705,9 +921,15 @@ Watches Markdown files and rebuilds the index when notes change.
705
921
  ```bash
706
922
  blink server --watch
707
923
  blink server --vault ./vault --watch
924
+ blink server --vault ./vault --watch --no-open
708
925
  ```
709
926
 
710
927
  Starts the local read-only graph UI and HTTP API.
928
+ By default, it tries to open a native desktop GUI window for the graph URL.
929
+ On Linux, native GUI is disabled by default; enable it with `BRAINLINK_LINUX_NATIVE_GUI=1`.
930
+ If native GUI launch is unavailable, it falls back to dedicated app-window mode and then browser open.
931
+ When fallback opens Chromium-family browsers on Linux, Brainlink automatically uses compatibility launch flags for stable rendering on Ubuntu/Wayland setups.
932
+ Use `--no-open` to skip that behavior.
711
933
 
712
934
  The HTTP server only binds to loopback hosts such as `127.0.0.1`, `localhost` or `::1`.
713
935
 
@@ -727,7 +949,13 @@ npm run --silent dev -- context "question" --vault ./vault --json
727
949
 
728
950
  ## Configuration
729
951
 
730
- Brainlink reads `brainlink.config.json` or `.brainlink.json` from the current working directory. If no `vault` is configured and no `--vault` flag is passed, Brainlink uses `$HOME/.brainlink/vault`.
952
+ Brainlink merges configuration in this order:
953
+
954
+ 1. Global: `$BRAINLINK_HOME/brainlink.config.json` (or `$HOME/.brainlink/brainlink.config.json` by default)
955
+ 2. Local: `brainlink.config.json` in the current working directory
956
+ 3. Local legacy compatibility: `.brainlink.json` in the current working directory
957
+
958
+ If no `vault` is configured and no `--vault` flag is passed, Brainlink uses `$HOME/.brainlink/vault`.
731
959
 
732
960
  ```json
733
961
  {
@@ -741,11 +969,29 @@ Brainlink reads `brainlink.config.json` or `.brainlink.json` from the current wo
741
969
  "defaultContextTokens": 2000,
742
970
  "embeddingProvider": "local",
743
971
  "defaultSearchMode": "hybrid",
744
- "chunkSize": 1200
972
+ "chunkSize": 1200,
973
+ "searchPack": {
974
+ "rowChunkSize": 5000,
975
+ "compressionLevel": 5,
976
+ "useDictionary": true,
977
+ "guardrailMinSavingsPercent": 8,
978
+ "guardrailMaxLatencyRegressionPercent": 5
979
+ },
980
+ "agentProfiles": {
981
+ "coding-agent": {
982
+ "defaultSearchMode": "semantic",
983
+ "defaultSearchLimit": 8,
984
+ "defaultContextTokens": 2400
985
+ },
986
+ "*": {
987
+ "defaultSearchMode": "hybrid"
988
+ }
989
+ }
745
990
  }
746
991
  ```
747
992
 
748
993
  `defaultAgent` is optional. When set, CLI and MCP calls that omit `--agent`/`agent` use this value automatically. If not set, behavior remains as before.
994
+ `agentProfiles` is optional. When present, CLI and MCP resolve `mode`, `limit` and `tokens` per agent automatically, then fallback to global defaults.
749
995
 
750
996
  `autoIndexOnWrite` is optional and defaults to `true`. Set it to `false` to defer indexing after writes.
751
997
 
@@ -842,7 +1088,7 @@ src/
842
1088
  application/ use cases
843
1089
  cli/ command-line adapter
844
1090
  domain/ pure knowledge rules
845
- infrastructure/ filesystem and SQLite adapters
1091
+ infrastructure/ filesystem and index adapters
846
1092
  ```
847
1093
 
848
1094
  Detailed notes:
@@ -854,7 +1100,6 @@ Detailed notes:
854
1100
  ## Current Limits
855
1101
 
856
1102
  - Semantic search uses deterministic local embeddings, not a remote model provider.
857
- - Semantic search uses SQLite embedding buckets to narrow candidates before cosine scoring.
858
1103
  - `embeddingProvider` currently supports `local` and `none`.
859
1104
  - Link resolution is title-based inside each agent namespace, with `shared` as fallback.
860
1105
  - HTTP API is local and unauthenticated.
@@ -865,7 +1110,7 @@ Detailed notes:
865
1110
  The `0.1.0-beta` line is intended to stabilize the local-first memory loop:
866
1111
 
867
1112
  - Markdown as durable memory.
868
- - SQLite FTS plus local embeddings and semantic buckets as rebuildable retrieval index.
1113
+ - Rebuildable file index plus local embeddings and encrypted pack exports.
869
1114
  - CLI as the primary agent interface.
870
1115
  - HTTP graph API and frontend as inspection tools.
871
1116
  - Agent namespaces to avoid context mixing.
@@ -881,7 +1126,7 @@ Brainlink is local-first by default.
881
1126
  - Brainlink HTTP is localhost-only and refuses non-loopback hosts.
882
1127
  - Brainlink blocks common secret patterns by default when adding notes. Use `--allow-sensitive` only for intentional, protected vaults.
883
1128
  - Do not store secrets, credentials, API keys or regulated personal data unless the vault is protected by your own storage controls.
884
- - Treat `.brainlink/brainlink.db` as disposable derived data.
1129
+ - Treat `.brainlink/index.json` and `.brainlink/search-packs/` as disposable derived artifacts.
885
1130
 
886
1131
  See [SECURITY.md](SECURITY.md).
887
1132
 
@@ -892,6 +1137,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
892
1137
  ## License
893
1138
 
894
1139
  MIT. See [LICENSE](LICENSE).
1140
+ Copyright (c) 2026 Substructa. See [COPYRIGHT.md](COPYRIGHT.md).
895
1141
 
896
1142
  ### Memory Optimization Loop (1-7)
897
1143
 
package/SECURITY.md CHANGED
@@ -7,7 +7,7 @@ Brainlink is local-first.
7
7
  - The HTTP server binds to `127.0.0.1` by default.
8
8
  - The HTTP server always refuses non-loopback hosts.
9
9
  - The HTTP server is read-only and does not expose note creation, indexing or update routes.
10
- - The SQLite database is a derived local index.
10
+ - Local index artifacts (`.brainlink/index.json` and `.brainlink/search-packs/`) are derived data.
11
11
  - Markdown files are user-owned source data.
12
12
  - Brainlink-created Markdown files use `0600` permissions.
13
13
  - Brainlink-created directories and `.brainlink` use `0700` permissions.