@gmickel/gno 0.3.4 → 0.4.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.
Files changed (57) hide show
  1. package/README.md +194 -53
  2. package/assets/badges/license.svg +12 -0
  3. package/assets/badges/npm.svg +13 -0
  4. package/assets/badges/twitter.svg +22 -0
  5. package/assets/badges/website.svg +22 -0
  6. package/package.json +30 -1
  7. package/src/cli/commands/ask.ts +11 -186
  8. package/src/cli/commands/models/pull.ts +9 -4
  9. package/src/cli/commands/serve.ts +19 -0
  10. package/src/cli/program.ts +28 -0
  11. package/src/llm/registry.ts +3 -1
  12. package/src/pipeline/answer.ts +191 -0
  13. package/src/serve/CLAUDE.md +91 -0
  14. package/src/serve/bunfig.toml +2 -0
  15. package/src/serve/context.ts +181 -0
  16. package/src/serve/index.ts +7 -0
  17. package/src/serve/public/app.tsx +56 -0
  18. package/src/serve/public/components/ai-elements/code-block.tsx +176 -0
  19. package/src/serve/public/components/ai-elements/conversation.tsx +98 -0
  20. package/src/serve/public/components/ai-elements/inline-citation.tsx +285 -0
  21. package/src/serve/public/components/ai-elements/loader.tsx +96 -0
  22. package/src/serve/public/components/ai-elements/message.tsx +443 -0
  23. package/src/serve/public/components/ai-elements/prompt-input.tsx +1421 -0
  24. package/src/serve/public/components/ai-elements/sources.tsx +75 -0
  25. package/src/serve/public/components/ai-elements/suggestion.tsx +51 -0
  26. package/src/serve/public/components/preset-selector.tsx +403 -0
  27. package/src/serve/public/components/ui/badge.tsx +46 -0
  28. package/src/serve/public/components/ui/button-group.tsx +82 -0
  29. package/src/serve/public/components/ui/button.tsx +62 -0
  30. package/src/serve/public/components/ui/card.tsx +92 -0
  31. package/src/serve/public/components/ui/carousel.tsx +244 -0
  32. package/src/serve/public/components/ui/collapsible.tsx +31 -0
  33. package/src/serve/public/components/ui/command.tsx +181 -0
  34. package/src/serve/public/components/ui/dialog.tsx +141 -0
  35. package/src/serve/public/components/ui/dropdown-menu.tsx +255 -0
  36. package/src/serve/public/components/ui/hover-card.tsx +42 -0
  37. package/src/serve/public/components/ui/input-group.tsx +167 -0
  38. package/src/serve/public/components/ui/input.tsx +21 -0
  39. package/src/serve/public/components/ui/progress.tsx +28 -0
  40. package/src/serve/public/components/ui/scroll-area.tsx +56 -0
  41. package/src/serve/public/components/ui/select.tsx +188 -0
  42. package/src/serve/public/components/ui/separator.tsx +26 -0
  43. package/src/serve/public/components/ui/table.tsx +114 -0
  44. package/src/serve/public/components/ui/textarea.tsx +18 -0
  45. package/src/serve/public/components/ui/tooltip.tsx +59 -0
  46. package/src/serve/public/globals.css +226 -0
  47. package/src/serve/public/hooks/use-api.ts +112 -0
  48. package/src/serve/public/index.html +13 -0
  49. package/src/serve/public/pages/Ask.tsx +442 -0
  50. package/src/serve/public/pages/Browse.tsx +270 -0
  51. package/src/serve/public/pages/Dashboard.tsx +202 -0
  52. package/src/serve/public/pages/DocView.tsx +302 -0
  53. package/src/serve/public/pages/Search.tsx +335 -0
  54. package/src/serve/routes/api.ts +763 -0
  55. package/src/serve/server.ts +249 -0
  56. package/src/store/sqlite/adapter.ts +47 -0
  57. package/src/store/types.ts +10 -0
package/README.md CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  **Your Local Second Brain** — Index, search, and synthesize your entire digital life.
4
4
 
5
- [![npm version](https://img.shields.io/npm/v/@gmickel/gno.svg)](https://www.npmjs.com/package/@gmickel/gno)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)
5
+ [![npm](./assets/badges/npm.svg)](https://www.npmjs.com/package/@gmickel/gno)
6
+ [![MIT License](./assets/badges/license.svg)](./LICENSE)
7
+ [![Website](./assets/badges/website.svg)](https://gno.sh)
8
+ [![Twitter](./assets/badges/twitter.svg)](https://twitter.com/gmickel)
7
9
 
8
- GNO is a local knowledge engine for privacy-conscious individuals and AI agents. Index your notes, code, PDFs, and Office docs. Get lightning-fast semantic search and AI-powered answers—all on your machine.
10
+ GNO is a local knowledge engine for privacy-conscious developers and AI agents. Index your notes, code, PDFs, and Office docs. Get hybrid search (BM25 + vector + reranking) and AI-powered answers—all running 100% on your machine.
9
11
 
10
12
  ---
11
13
 
@@ -14,8 +16,11 @@ GNO is a local knowledge engine for privacy-conscious individuals and AI agents.
14
16
  - [Quick Start](#quick-start)
15
17
  - [Installation](#installation)
16
18
  - [Search Modes](#search-modes)
19
+ - [Web UI](#web-ui)
20
+ - [REST API](#rest-api)
17
21
  - [Agent Integration](#agent-integration)
18
22
  - [How It Works](#how-it-works)
23
+ - [Features](#features)
19
24
  - [Local Models](#local-models)
20
25
  - [Architecture](#architecture)
21
26
  - [Development](#development)
@@ -25,21 +30,18 @@ GNO is a local knowledge engine for privacy-conscious individuals and AI agents.
25
30
  ## Quick Start
26
31
 
27
32
  ```bash
28
- # Initialize with your notes folder
29
- gno init ~/notes --name notes
30
-
31
- # Index documents (BM25 + vectors)
32
- gno index
33
-
34
- # Search
35
- gno query "authentication best practices"
36
- gno ask "summarize the API discussion" --answer
33
+ gno init ~/notes --name notes # Point at your docs
34
+ gno index # Build search index
35
+ gno query "auth best practices" # Hybrid search
36
+ gno ask "summarize the API" --answer # AI answer with citations
37
37
  ```
38
38
 
39
39
  ---
40
40
 
41
41
  ## Installation
42
42
 
43
+ ### Install GNO
44
+
43
45
  Requires [Bun](https://bun.sh/) >= 1.0.0.
44
46
 
45
47
  ```bash
@@ -47,59 +49,160 @@ bun install -g @gmickel/gno
47
49
  ```
48
50
 
49
51
  **macOS**: Vector search requires Homebrew SQLite:
52
+
50
53
  ```bash
51
54
  brew install sqlite3
52
55
  ```
53
56
 
54
- Verify:
57
+ Verify everything works:
58
+
55
59
  ```bash
56
60
  gno doctor
57
61
  ```
58
62
 
63
+ ### Connect to AI Agents
64
+
65
+ #### MCP Server (Claude Desktop, Cursor, Zed, etc.)
66
+
67
+ One command to add GNO to your AI assistant:
68
+
69
+ ```bash
70
+ gno mcp install # Claude Desktop (default)
71
+ gno mcp install --target cursor # Cursor
72
+ gno mcp install --target claude-code # Claude Code CLI
73
+ gno mcp install --target zed # Zed
74
+ gno mcp install --target windsurf # Windsurf
75
+ gno mcp install --target codex # OpenAI Codex CLI
76
+ gno mcp install --target opencode # OpenCode
77
+ gno mcp install --target amp # Amp
78
+ gno mcp install --target lmstudio # LM Studio
79
+ gno mcp install --target librechat # LibreChat
80
+ ```
81
+
82
+ Check status: `gno mcp status`
83
+
84
+ #### Skills (Claude Code, Codex, OpenCode)
85
+
86
+ Skills integrate via CLI—no MCP overhead:
87
+
88
+ ```bash
89
+ gno skill install --scope user # User-wide
90
+ gno skill install --target codex # Codex
91
+ gno skill install --target all # Both Claude + Codex
92
+ ```
93
+
94
+ > **Full setup guide**: [MCP Integration](https://gno.sh/docs/MCP/) · [CLI Reference](https://gno.sh/docs/CLI/)
95
+
59
96
  ---
60
97
 
61
98
  ## Search Modes
62
99
 
63
100
  | Command | Mode | Best For |
64
101
  |:--------|:-----|:---------|
65
- | `gno search` | BM25 | Exact phrases, known terms |
102
+ | `gno search` | BM25 | Exact phrases, code identifiers |
66
103
  | `gno vsearch` | Vector | Natural language, concepts |
67
- | `gno query` | Hybrid | Highest accuracy (BM25 + Vector + reranking) |
68
- | `gno ask` | RAG | Direct answers with citations |
104
+ | `gno query` | Hybrid | Best accuracy (BM25 + vector + reranking) |
105
+ | `gno ask --answer` | RAG | Direct answers with citations |
106
+
107
+ ```bash
108
+ gno search "handleAuth" # Find exact matches
109
+ gno vsearch "error handling patterns" # Semantic similarity
110
+ gno query "database optimization" # Full pipeline
111
+ gno ask "what did we decide" --answer # AI synthesis
112
+ ```
113
+
114
+ Output formats: `--json`, `--files`, `--csv`, `--md`, `--xml`
69
115
 
70
116
  ---
71
117
 
72
- ## Agent Integration
118
+ ## Web UI
73
119
 
74
- ### For Claude Code / Codex / OpenCode
120
+ Visual dashboard for search, browsing, and AI answers—right in your browser.
75
121
 
76
122
  ```bash
77
- gno skill install --scope user # Claude Code
78
- gno skill install --target codex # Codex
79
- gno skill install --target all # Both
123
+ gno serve # Start on port 3000
124
+ gno serve --port 8080 # Custom port
80
125
  ```
81
126
 
82
- ### For Claude Desktop / Cursor
127
+ Open `http://localhost:3000` to:
128
+
129
+ - **Search** — BM25, vector, or hybrid modes with visual results
130
+ - **Browse** — Paginated document list, filter by collection
131
+ - **Ask** — AI-powered Q&A with citations
132
+ - **Switch presets** — Change models live without restart
133
+
134
+ Everything runs locally. No cloud, no accounts, no data leaving your machine.
135
+
136
+ > **Detailed docs**: [Web UI Guide](https://gno.sh/docs/WEB-UI/)
137
+
138
+ ---
139
+
140
+ ## REST API
83
141
 
84
- Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
142
+ Programmatic access to all GNO features via HTTP.
85
143
 
86
- ```json
87
- {
88
- "mcpServers": {
89
- "gno": { "command": "gno", "args": ["mcp"] }
90
- }
91
- }
144
+ ```bash
145
+ # Hybrid search
146
+ curl -X POST http://localhost:3000/api/query \
147
+ -H "Content-Type: application/json" \
148
+ -d '{"query": "authentication patterns", "limit": 10}'
149
+
150
+ # AI answer
151
+ curl -X POST http://localhost:3000/api/ask \
152
+ -H "Content-Type: application/json" \
153
+ -d '{"query": "What is our deployment process?"}'
154
+
155
+ # Index status
156
+ curl http://localhost:3000/api/status
92
157
  ```
93
158
 
94
- **MCP Tools**: `gno_search`, `gno_vsearch`, `gno_query`, `gno_get`, `gno_multi_get`, `gno_status`
159
+ | Endpoint | Method | Description |
160
+ |:---------|:-------|:------------|
161
+ | `/api/query` | POST | Hybrid search (recommended) |
162
+ | `/api/search` | POST | BM25 keyword search |
163
+ | `/api/ask` | POST | AI-powered Q&A |
164
+ | `/api/docs` | GET | List documents |
165
+ | `/api/doc` | GET | Get document content |
166
+ | `/api/status` | GET | Index statistics |
167
+ | `/api/presets` | GET/POST | Model preset management |
168
+ | `/api/models/pull` | POST | Download models |
169
+ | `/api/models/status` | GET | Download progress |
170
+
171
+ No authentication. No rate limits. Build custom tools, automate workflows, integrate with any language.
172
+
173
+ > **Full reference**: [API Documentation](https://gno.sh/docs/API/)
174
+
175
+ ---
176
+
177
+ ## Agent Integration
178
+
179
+ ### MCP Server
180
+
181
+ GNO exposes 6 tools via [Model Context Protocol](https://modelcontextprotocol.io):
182
+
183
+ | Tool | Description |
184
+ |:-----|:------------|
185
+ | `gno_search` | BM25 keyword search |
186
+ | `gno_vsearch` | Vector semantic search |
187
+ | `gno_query` | Hybrid search (recommended) |
188
+ | `gno_get` | Retrieve document by ID |
189
+ | `gno_multi_get` | Batch document retrieval |
190
+ | `gno_status` | Index health check |
95
191
 
96
- ### CLI Output Formats
192
+ **Design**: MCP tools are retrieval-only. Your AI assistant (Claude, GPT-4) synthesizes answers from retrieved context—best retrieval (GNO) + best reasoning (your LLM).
193
+
194
+ ### Skills
195
+
196
+ Skills add GNO search to Claude Code/Codex without MCP protocol overhead:
97
197
 
98
198
  ```bash
99
- gno query "meeting notes" --json -n 5 # JSON for LLMs
100
- gno search "API design" --files # File paths only
199
+ gno skill install --scope user
101
200
  ```
102
201
 
202
+ Then ask your agent: *"Search my notes for the auth discussion"*
203
+
204
+ > **Detailed docs**: [MCP Integration](https://gno.sh/docs/MCP/) · [Use Cases](https://gno.sh/docs/USE-CASES/)
205
+
103
206
  ---
104
207
 
105
208
  ## How It Works
@@ -110,30 +213,46 @@ graph TD
110
213
  B --> C{Lexical Variants}
111
214
  B --> D{Semantic Variants}
112
215
  B --> E{HyDE Passage}
113
- A --> F[Original Query]
114
216
 
115
217
  C --> G(BM25 Search)
116
218
  D --> H(Vector Search)
117
219
  E --> H
118
- F --> G
119
- F --> H
220
+ A --> G
221
+ A --> H
120
222
 
121
- G --> I(Ranked List 1)
122
- H --> J(Ranked List 2)
223
+ G --> I(Ranked Results)
224
+ H --> J(Ranked Results)
123
225
  I --> K{RRF Fusion}
124
226
  J --> K
125
227
 
126
- K --> L(Top Candidates)
228
+ K --> L(Top 20 Candidates)
127
229
  L --> M(Cross-Encoder Rerank)
128
230
  M --> N[Final Results]
129
231
  ```
130
232
 
131
- 1. **Query Expansion** — LLM generates lexical variants, semantic variants, and [HyDE](https://arxiv.org/abs/2212.10496) passage
132
- 2. **Parallel Retrieval** — BM25 + Vector search run concurrently on all variants
233
+ 1. **Query Expansion** — LLM generates lexical variants, semantic rephrases, and a [HyDE](https://arxiv.org/abs/2212.10496) passage
234
+ 2. **Parallel Retrieval** — BM25 + vector search run concurrently on all variants
133
235
  3. **Fusion** — Reciprocal Rank Fusion merges results with position-based scoring
134
- 4. **Re-ranking** — Cross-encoder rescores top 20, blended with fusion scores
236
+ 4. **Reranking** — Cross-encoder rescores top 20, blended with fusion scores
237
+
238
+ > **Deep dive**: [How Search Works](https://gno.sh/docs/HOW-SEARCH-WORKS/)
239
+
240
+ ---
135
241
 
136
- See [How Search Works](https://gno.sh/docs/HOW-SEARCH-WORKS/) for full pipeline details.
242
+ ## Features
243
+
244
+ | Feature | Description |
245
+ |:--------|:------------|
246
+ | **Hybrid Search** | BM25 + vector + RRF fusion + cross-encoder reranking |
247
+ | **Web UI** | Visual dashboard for search, browse, and AI Q&A |
248
+ | **REST API** | HTTP API for custom tools and integrations |
249
+ | **Multi-Format** | Markdown, PDF, DOCX, XLSX, PPTX, plain text |
250
+ | **Local LLM** | AI answers via llama.cpp—no API keys |
251
+ | **Privacy First** | 100% offline, zero telemetry, your data stays yours |
252
+ | **MCP Server** | Works with Claude Desktop, Cursor, Zed, + 8 more |
253
+ | **Collections** | Organize sources with patterns, excludes, contexts |
254
+ | **Multilingual** | 30+ languages, auto-detection, cross-lingual search |
255
+ | **Incremental** | SHA-256 tracking—only changed files re-indexed |
137
256
 
138
257
  ---
139
258
 
@@ -143,9 +262,24 @@ Models auto-download on first use to `~/.cache/gno/models/`.
143
262
 
144
263
  | Model | Purpose | Size |
145
264
  |:------|:--------|:-----|
146
- | bge-m3 | Embeddings | ~500MB |
147
- | bge-reranker-v2-m3 | Re-ranking | ~700MB |
148
- | Qwen-Instruct | Query expansion | ~600MB |
265
+ | bge-m3 | Embeddings (1024-dim, multilingual) | ~500MB |
266
+ | bge-reranker-v2-m3 | Cross-encoder reranking | ~700MB |
267
+ | Qwen/SmolLM | Query expansion + AI answers | ~600MB-1.2GB |
268
+
269
+ ### Model Presets
270
+
271
+ | Preset | Disk | Best For |
272
+ |:-------|:-----|:---------|
273
+ | `slim` | ~1GB | Fast, lower quality |
274
+ | `balanced` | ~2GB | Good balance (default) |
275
+ | `quality` | ~2.5GB | Best answers |
276
+
277
+ ```bash
278
+ gno models use balanced
279
+ gno models pull --all
280
+ ```
281
+
282
+ > **Configuration**: [Model Setup](https://gno.sh/docs/CONFIGURATION/)
149
283
 
150
284
  ---
151
285
 
@@ -153,16 +287,18 @@ Models auto-download on first use to `~/.cache/gno/models/`.
153
287
 
154
288
  ```
155
289
  ┌─────────────────────────────────────────────────┐
156
- GNO CLI / MCP
290
+ GNO CLI / MCP / Web UI / API
157
291
  ├─────────────────────────────────────────────────┤
158
- │ Ports: Converter, Store, Embedding, Rerank
292
+ │ Ports: Converter, Store, Embedding, Rerank
159
293
  ├─────────────────────────────────────────────────┤
160
- │ Adapters: SQLite, FTS5, sqlite-vec, llama-cpp
294
+ │ Adapters: SQLite, FTS5, sqlite-vec, llama-cpp
161
295
  ├─────────────────────────────────────────────────┤
162
- │ Core: Identity, Mirrors, Chunking, Retrieval
296
+ │ Core: Identity, Mirrors, Chunking, Retrieval
163
297
  └─────────────────────────────────────────────────┘
164
298
  ```
165
299
 
300
+ > **Details**: [Architecture](https://gno.sh/docs/ARCHITECTURE/)
301
+
166
302
  ---
167
303
 
168
304
  ## Development
@@ -171,14 +307,19 @@ Models auto-download on first use to `~/.cache/gno/models/`.
171
307
  git clone https://github.com/gmickel/gno.git && cd gno
172
308
  bun install
173
309
  bun test
174
- bun run lint
175
- bun run typecheck
310
+ bun run lint && bun run typecheck
176
311
  ```
177
312
 
178
- See [Contributing](.github/CONTRIBUTING.md) for CI matrix, caching, and release process.
313
+ > **Contributing**: [CONTRIBUTING.md](.github/CONTRIBUTING.md)
179
314
 
180
315
  ---
181
316
 
182
317
  ## License
183
318
 
184
319
  [MIT](./LICENSE)
320
+
321
+ ---
322
+
323
+ <p align="center">
324
+ made with ❤️ by <a href="https://twitter.com/gmickel">@gmickel</a>
325
+ </p>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="85" height="28" viewBox="0 0 85 28">
2
+ <defs>
3
+ <linearGradient id="bg-lic" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#1a1a2e"/>
5
+ <stop offset="100%" style="stop-color:#0f0f1a"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="85" height="28" rx="6" fill="url(#bg-lic)"/>
9
+ <rect x="1" y="1" width="83" height="26" rx="5" fill="none" stroke="#2dd4bf" stroke-opacity="0.3"/>
10
+ <text x="10" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="11" fill="#94a3b8">MIT</text>
11
+ <text x="34" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="11" fill="#2dd4bf">License</text>
12
+ </svg>
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="66" height="28" viewBox="0 0 66 28">
2
+ <defs>
3
+ <linearGradient id="bg-npm" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#1a1a2e"/>
5
+ <stop offset="100%" style="stop-color:#0f0f1a"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="66" height="28" rx="6" fill="url(#bg-npm)"/>
9
+ <rect x="1" y="1" width="64" height="26" rx="5" fill="none" stroke="#cb3837" stroke-opacity="0.4"/>
10
+ <rect x="8" y="7" width="32" height="14" rx="3" fill="#cb3837"/>
11
+ <text x="13" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="10" font-weight="700" fill="#fff">npm</text>
12
+ <text x="46" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="12" fill="#e2e8f0">↗</text>
13
+ </svg>
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="130" height="28" viewBox="0 0 130 28">
2
+ <defs>
3
+ <linearGradient id="bg2" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#1a1a2e"/>
5
+ <stop offset="100%" style="stop-color:#0f0f1a"/>
6
+ </linearGradient>
7
+ <filter id="glow2">
8
+ <feGaussianBlur stdDeviation="0.5" result="coloredBlur"/>
9
+ <feMerge>
10
+ <feMergeNode in="coloredBlur"/>
11
+ <feMergeNode in="SourceGraphic"/>
12
+ </feMerge>
13
+ </filter>
14
+ </defs>
15
+ <rect width="130" height="28" rx="6" fill="url(#bg2)"/>
16
+ <rect x="1" y="1" width="128" height="26" rx="5" fill="none" stroke="#2dd4bf" stroke-opacity="0.3"/>
17
+ <!-- X logo -->
18
+ <g transform="translate(10, 7)" fill="#e2e8f0">
19
+ <path d="M10.5 1.5L6.75 6.5L10.75 12.5H8.5L5.75 8.5L2.5 12.5H0.25L4.25 7L0.5 1.5H2.75L5.25 5.25L8.25 1.5H10.5Z" transform="scale(1.1)"/>
20
+ </g>
21
+ <text x="32" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="12" font-weight="500" fill="#e2e8f0" filter="url(#glow2)">@gmickel</text>
22
+ </svg>
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="120" height="28" viewBox="0 0 120 28">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#1a1a2e"/>
5
+ <stop offset="100%" style="stop-color:#0f0f1a"/>
6
+ </linearGradient>
7
+ <filter id="glow">
8
+ <feGaussianBlur stdDeviation="1" result="coloredBlur"/>
9
+ <feMerge>
10
+ <feMergeNode in="coloredBlur"/>
11
+ <feMergeNode in="SourceGraphic"/>
12
+ </feMerge>
13
+ </filter>
14
+ </defs>
15
+ <rect width="120" height="28" rx="6" fill="url(#bg)"/>
16
+ <rect x="1" y="1" width="118" height="26" rx="5" fill="none" stroke="#2dd4bf" stroke-opacity="0.3"/>
17
+ <text x="10" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="11" fill="#2dd4bf" filter="url(#glow)">❯</text>
18
+ <text x="24" y="18" font-family="ui-monospace,SFMono-Regular,Menlo,Monaco,monospace" font-size="12" font-weight="600" fill="#e2e8f0">gno.sh</text>
19
+ <rect x="74" y="9" width="2" height="12" fill="#2dd4bf" opacity="0.8">
20
+ <animate attributeName="opacity" values="0.8;0.2;0.8" dur="1.2s" repeatCount="indefinite"/>
21
+ </rect>
22
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gmickel/gno",
3
- "version": "0.3.4",
3
+ "version": "0.4.0",
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
  "search",
@@ -56,6 +56,8 @@
56
56
  "website:dev": "cd website && make serve",
57
57
  "website:build": "cd website && make build",
58
58
  "website:demos": "cd website/demos && ./build-demos.sh",
59
+ "serve": "bun src/index.ts serve",
60
+ "serve:dev": "NODE_ENV=development bun --hot src/index.ts serve",
59
61
  "version:patch": "npm version patch --no-git-tag-version",
60
62
  "version:minor": "npm version minor --no-git-tag-version",
61
63
  "version:major": "npm version major --no-git-tag-version",
@@ -65,18 +67,44 @@
65
67
  },
66
68
  "dependencies": {
67
69
  "@modelcontextprotocol/sdk": "^1.25.1",
70
+ "@radix-ui/react-collapsible": "^1.1.12",
71
+ "@radix-ui/react-dialog": "^1.1.15",
72
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
73
+ "@radix-ui/react-hover-card": "^1.1.15",
74
+ "@radix-ui/react-progress": "^1.1.8",
75
+ "@radix-ui/react-scroll-area": "^1.2.10",
76
+ "@radix-ui/react-select": "^2.2.6",
77
+ "@radix-ui/react-separator": "^1.1.8",
78
+ "@radix-ui/react-slot": "^1.2.4",
79
+ "@radix-ui/react-tooltip": "^1.2.8",
80
+ "ai": "^6.0.5",
81
+ "bun-plugin-tailwind": "^0.1.2",
82
+ "class-variance-authority": "^0.7.1",
83
+ "clsx": "^2.1.1",
84
+ "cmdk": "^1.1.1",
68
85
  "commander": "^14.0.2",
86
+ "embla-carousel-react": "^8.6.0",
69
87
  "franc": "^6.2.0",
88
+ "lucide-react": "^0.562.0",
70
89
  "markitdown-ts": "^0.0.8",
90
+ "nanoid": "^5.1.6",
71
91
  "node-llama-cpp": "^3.14.5",
72
92
  "officeparser": "^5.2.2",
73
93
  "picocolors": "^1.1.1",
94
+ "react": "^19.2.3",
95
+ "react-dom": "^19.2.3",
96
+ "shiki": "^3.20.0",
74
97
  "sqlite-vec": "^0.1.7-alpha.2",
98
+ "streamdown": "^1.6.10",
99
+ "tailwind-merge": "^3.4.0",
100
+ "use-stick-to-bottom": "^1.1.1",
75
101
  "zod": "^4.2.1"
76
102
  },
77
103
  "devDependencies": {
78
104
  "@biomejs/biome": "2.3.10",
79
105
  "@types/bun": "latest",
106
+ "@types/react": "^19.2.7",
107
+ "@types/react-dom": "^19.2.3",
80
108
  "@typescript/native-preview": "^7.0.0-dev.20251215.1",
81
109
  "ajv": "^8.17.1",
82
110
  "ajv-formats": "^3.0.1",
@@ -87,6 +115,7 @@
87
115
  "oxlint-tsgolint": "^0.10.0",
88
116
  "pdf-lib": "^1.17.1",
89
117
  "pptxgenjs": "^4.0.1",
118
+ "tailwindcss": "^4.1.18",
90
119
  "ultracite": "^6.5.0"
91
120
  },
92
121
  "peerDependencies": {