opalserve 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +492 -63
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +45 -73
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +14 -1
- package/dist/storage/database.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,130 +11,559 @@
|
|
|
11
11
|
<a href="https://www.npmjs.com/package/opalserve"><img src="https://img.shields.io/npm/dm/opalserve?style=flat-square" alt="downloads" /></a>
|
|
12
12
|
<a href="https://github.com/adityaidev/opalserve/blob/master/LICENSE"><img src="https://img.shields.io/github/license/adityaidev/opalserve?style=flat-square" alt="license" /></a>
|
|
13
13
|
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen?style=flat-square" alt="node version" /></a>
|
|
14
|
+
<a href="https://github.com/adityaidev/opalserve"><img src="https://img.shields.io/github/stars/adityaidev/opalserve?style=flat-square" alt="GitHub stars" /></a>
|
|
14
15
|
</p>
|
|
15
16
|
|
|
16
17
|
---
|
|
17
18
|
|
|
18
|
-
**OpalServe** is
|
|
19
|
+
**OpalServe** is an open-source platform that gives engineering teams a single place to register, discover, and govern the MCP (Model Context Protocol) servers their AI coding tools depend on. Instead of every developer manually configuring Claude Desktop, Cursor, Codex, or Windsurf with scattered server definitions, OpalServe provides a centralized registry with shared knowledge bases, usage analytics, role-based access control, and a built-in MCP gateway -- so your team's AI tools stay consistent, observable, and secure.
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Feature Highlights
|
|
24
|
+
|
|
25
|
+
| | Feature | Description |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| :books: | **Team MCP Registry** | Admin registers servers once; every developer pulls them with `opalserve sync` |
|
|
28
|
+
| :brain: | **Shared Knowledge Base** | Upload architecture docs, coding standards, and API specs -- AI tools query them automatically via MCP |
|
|
29
|
+
| :bar_chart: | **Usage Analytics Dashboard** | React SPA showing tool calls, token usage, active users, and error rates in real time |
|
|
30
|
+
| :lock: | **Auth & Access Control** | User accounts, JWT tokens, API keys, rate limits, and per-role tool permissions |
|
|
31
|
+
| :electric_plug: | **GitHub + Slack Integrations** | Webhooks auto-update context; Slack slash commands for search and notifications |
|
|
32
|
+
| :globe_with_meridians: | **MCP Gateway** | OpalServe itself is an MCP server -- connect any AI client to access every tool from one endpoint |
|
|
33
|
+
| :art: | **Beautiful CLI** | Interactive setup wizard, gradient banners, color-coded tables, 20+ commands |
|
|
34
|
+
| :seedling: | **100% Open Source** | MIT licensed, self-host for free, no vendor lock-in |
|
|
21
35
|
|
|
22
|
-
|
|
23
|
-
- **Shared Knowledge Base** — Upload architecture docs, coding standards, API specs — your team's AI tools query it automatically via MCP
|
|
24
|
-
- **Usage Analytics Dashboard** — React SPA showing tool calls, token usage, active users, error rates per developer
|
|
25
|
-
- **Auth & Access Control** — User accounts, API keys, rate limits, tool permissions per role
|
|
26
|
-
- **GitHub + Slack Integration** — Webhooks auto-update context, slash commands for search
|
|
27
|
-
- **MCP Gateway** — OpalServe itself is an MCP server — connect any AI client to access all tools from one endpoint
|
|
28
|
-
- **Beautiful CLI** — Interactive setup, gradient banners, color-coded tables, 15+ commands
|
|
29
|
-
- **100% Open Source** — MIT licensed, self-host for free
|
|
36
|
+
---
|
|
30
37
|
|
|
31
38
|
## Architecture
|
|
32
39
|
|
|
33
40
|
```
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
42
|
+
│ GitHub │ │ Slack │ │ Filesystem │ │ PostgreSQL │
|
|
43
|
+
│ MCP Server │ │ MCP Server │ │ MCP Server │ │ MCP Server │
|
|
44
|
+
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘
|
|
45
|
+
│ │ │ │
|
|
46
|
+
└────────────────┼────────────────┼────────────────┘
|
|
47
|
+
│ MCP Protocol (stdio / SSE)
|
|
48
|
+
│
|
|
49
|
+
┌──────────┴──────────────────────────────┐
|
|
50
|
+
│ OpalServe Team Server │
|
|
51
|
+
│ │
|
|
52
|
+
│ ┌─────────────┐ ┌──────────────────┐ │
|
|
53
|
+
│ │ MCP Server │ │ Shared Knowledge │ │
|
|
54
|
+
│ │ Registry │ │ Base (FTS) │ │
|
|
55
|
+
│ └─────────────┘ └──────────────────┘ │
|
|
56
|
+
│ ┌─────────────┐ ┌──────────────────┐ │
|
|
57
|
+
│ │ Usage │ │ Auth / API Keys │ │
|
|
58
|
+
│ │ Analytics │ │ Rate Limiting │ │
|
|
59
|
+
│ └─────────────┘ └──────────────────┘ │
|
|
60
|
+
│ ┌─────────────┐ ┌──────────────────┐ │
|
|
61
|
+
│ │ MCP Gateway │ │ React Dashboard │ │
|
|
62
|
+
│ │ (stdio/SSE) │ │ (/dashboard) │ │
|
|
63
|
+
│ └─────────────┘ └──────────────────┘ │
|
|
64
|
+
│ │
|
|
65
|
+
│ SQLite DB ── Fastify HTTP API (:3456) │
|
|
66
|
+
└──────────────────┬──────────────────────┘
|
|
67
|
+
│
|
|
68
|
+
HTTPS API + MCP Protocol (stdio / SSE)
|
|
69
|
+
│
|
|
70
|
+
┌──────────────────────┼──────────────────────┐
|
|
71
|
+
│ │ │
|
|
72
|
+
┌────────┴─────────┐ ┌────────┴─────────┐ ┌────────┴─────────┐
|
|
73
|
+
│ Dev A │ │ Dev B │ │ Dev C │
|
|
74
|
+
│ Claude Code │ │ Cursor │ │ Codex / Windsurf │
|
|
75
|
+
│ opalserve sync │ │ opalserve sync │ │ opalserve sync │
|
|
76
|
+
└──────────────────┘ └──────────────────┘ └──────────────────┘
|
|
47
77
|
```
|
|
48
78
|
|
|
79
|
+
---
|
|
80
|
+
|
|
49
81
|
## Quick Start
|
|
50
82
|
|
|
51
83
|
```bash
|
|
52
|
-
# Install
|
|
84
|
+
# 1. Install globally
|
|
53
85
|
npm install -g opalserve
|
|
54
86
|
|
|
55
|
-
#
|
|
87
|
+
# 2. Run the interactive setup wizard
|
|
56
88
|
opalserve init
|
|
57
89
|
|
|
58
|
-
# Start the
|
|
90
|
+
# 3. Start the server
|
|
59
91
|
opalserve start
|
|
60
92
|
|
|
61
|
-
#
|
|
93
|
+
# 4. Register your first MCP server
|
|
62
94
|
opalserve server add --name files --stdio "npx -y @modelcontextprotocol/server-filesystem ."
|
|
63
95
|
|
|
64
|
-
#
|
|
96
|
+
# 5. Discover available tools
|
|
65
97
|
opalserve tools search "read file"
|
|
66
98
|
```
|
|
67
99
|
|
|
68
|
-
|
|
100
|
+
> **Tip:** OpalServe runs on port **3456** by default. Visit `http://localhost:3456/dashboard` after starting.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Team Mode Setup
|
|
105
|
+
|
|
106
|
+
Team mode turns OpalServe into a shared server that your entire engineering org connects to.
|
|
107
|
+
|
|
108
|
+
### 1. Initialize the team server
|
|
69
109
|
|
|
70
110
|
```bash
|
|
71
|
-
# Initialize team server
|
|
72
111
|
opalserve admin init
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This creates an admin account, generates encryption keys, and prepares the SQLite database.
|
|
115
|
+
|
|
116
|
+
### 2. Configure team mode
|
|
117
|
+
|
|
118
|
+
Edit `opalserve.config.json` and set the mode:
|
|
73
119
|
|
|
74
|
-
|
|
75
|
-
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"mode": "team-server",
|
|
123
|
+
"port": 3456,
|
|
124
|
+
"host": "0.0.0.0"
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 3. Start the server
|
|
129
|
+
|
|
130
|
+
```bash
|
|
76
131
|
opalserve start
|
|
132
|
+
```
|
|
77
133
|
|
|
78
|
-
|
|
134
|
+
### 4. Invite team members
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
opalserve admin invite alice@company.com
|
|
138
|
+
opalserve admin invite bob@company.com
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 5. Developers connect
|
|
142
|
+
|
|
143
|
+
On each developer's machine:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
npm install -g opalserve
|
|
147
|
+
|
|
148
|
+
# Login to the team server
|
|
79
149
|
opalserve login
|
|
150
|
+
|
|
151
|
+
# Pull all registered servers to local config
|
|
80
152
|
opalserve sync
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 6. Manage access
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# Set rate limits by role
|
|
159
|
+
opalserve admin limits --set developer:calls_per_hour:500
|
|
160
|
+
|
|
161
|
+
# Set tool permissions
|
|
162
|
+
opalserve admin permissions --set developer:filesystem:*:allow
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Knowledge Base
|
|
168
|
+
|
|
169
|
+
The knowledge base lets you upload documents that become searchable context for every AI tool connected through OpalServe.
|
|
81
170
|
|
|
82
|
-
|
|
171
|
+
### Adding documents
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Upload architecture docs
|
|
83
175
|
opalserve context add ./docs/architecture.md
|
|
176
|
+
|
|
177
|
+
# Upload API specifications
|
|
84
178
|
opalserve context add ./docs/api-spec.md
|
|
85
179
|
|
|
86
|
-
#
|
|
180
|
+
# Upload coding standards
|
|
181
|
+
opalserve context add ./docs/coding-standards.md
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Searching context
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# Search by natural language query
|
|
87
188
|
opalserve context search "authentication flow"
|
|
189
|
+
|
|
190
|
+
# List all uploaded documents
|
|
191
|
+
opalserve context list
|
|
192
|
+
|
|
193
|
+
# Remove a document
|
|
194
|
+
opalserve context remove <document-id>
|
|
88
195
|
```
|
|
89
196
|
|
|
197
|
+
When connected via the MCP gateway, AI tools like Claude Desktop can automatically search the knowledge base to ground their responses in your team's actual documentation.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
90
201
|
## Admin Dashboard
|
|
91
202
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
203
|
+
OpalServe ships with a built-in React SPA accessible at `/dashboard` when the server is running.
|
|
204
|
+
|
|
205
|
+
The dashboard provides:
|
|
206
|
+
|
|
207
|
+
- **Usage overview** -- charts for tool calls, token consumption, and active users over time
|
|
208
|
+
- **Server monitoring** -- live status of every registered MCP server with health indicators
|
|
209
|
+
- **User management** -- view team members, roles, and activity
|
|
210
|
+
- **Tool browser** -- searchable catalog of all discovered tools across servers
|
|
211
|
+
- **Knowledge base manager** -- upload, browse, and remove context documents
|
|
212
|
+
- **Settings** -- API key management, integration configuration, rate limits
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
http://localhost:3456/dashboard
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
> The dashboard is available in team-server mode. Authentication is required for all management operations.
|
|
219
|
+
|
|
220
|
+
---
|
|
99
221
|
|
|
100
222
|
## CLI Commands
|
|
101
223
|
|
|
224
|
+
| Command | Description |
|
|
225
|
+
|---|---|
|
|
226
|
+
| `opalserve init` | Interactive setup wizard -- configures mode, port, and first server |
|
|
227
|
+
| `opalserve start` | Start the registry server (HTTP API + MCP gateway) |
|
|
228
|
+
| `opalserve status` | Show server status, connected servers, and tool counts |
|
|
229
|
+
| `opalserve health` | Health check all registered servers |
|
|
230
|
+
| `opalserve health --server <name>` | Health check a specific server |
|
|
231
|
+
| `opalserve login` | Authenticate with a team server |
|
|
232
|
+
| `opalserve logout` | Clear stored credentials |
|
|
233
|
+
| `opalserve whoami` | Show current authenticated user info |
|
|
234
|
+
| `opalserve sync` | Pull team server configurations to local machine |
|
|
235
|
+
| `opalserve server list` | List all registered MCP servers |
|
|
236
|
+
| `opalserve server add` | Register a new MCP server (stdio, SSE, or streamable-http) |
|
|
237
|
+
| `opalserve server remove <name>` | Remove a registered server |
|
|
238
|
+
| `opalserve tools list` | List all discovered tools across servers |
|
|
239
|
+
| `opalserve tools search <query>` | Search for tools by natural language query |
|
|
240
|
+
| `opalserve context add <file>` | Upload a file to the shared knowledge base |
|
|
241
|
+
| `opalserve context list` | List all context documents |
|
|
242
|
+
| `opalserve context search <query>` | Search the knowledge base |
|
|
243
|
+
| `opalserve context remove <id>` | Remove a context document |
|
|
244
|
+
| `opalserve admin init` | Initialize team mode with an admin user |
|
|
245
|
+
| `opalserve admin stats` | Show usage statistics for the team |
|
|
246
|
+
| `opalserve admin users` | List all team members |
|
|
247
|
+
| `opalserve admin invite <email>` | Invite a user to the team |
|
|
248
|
+
| `opalserve admin limits` | View and manage rate limits |
|
|
249
|
+
| `opalserve admin permissions` | View and manage tool permissions |
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## HTTP API
|
|
254
|
+
|
|
255
|
+
OpalServe exposes a RESTful API under `/api/v1`. All endpoints return JSON.
|
|
256
|
+
|
|
257
|
+
### Health
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
curl http://localhost:3456/api/v1/health
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Servers
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# List all servers
|
|
267
|
+
curl http://localhost:3456/api/v1/servers
|
|
268
|
+
|
|
269
|
+
# Register a new server
|
|
270
|
+
curl -X POST http://localhost:3456/api/v1/servers \
|
|
271
|
+
-H "Content-Type: application/json" \
|
|
272
|
+
-d '{
|
|
273
|
+
"name": "filesystem",
|
|
274
|
+
"transport": {
|
|
275
|
+
"type": "stdio",
|
|
276
|
+
"command": "npx",
|
|
277
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
|
|
278
|
+
}
|
|
279
|
+
}'
|
|
280
|
+
|
|
281
|
+
# Remove a server
|
|
282
|
+
curl -X DELETE http://localhost:3456/api/v1/servers/filesystem
|
|
283
|
+
|
|
284
|
+
# Health check a specific server
|
|
285
|
+
curl http://localhost:3456/api/v1/servers/filesystem/health
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Tools
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# List all tools
|
|
292
|
+
curl http://localhost:3456/api/v1/tools
|
|
293
|
+
|
|
294
|
+
# Search tools
|
|
295
|
+
curl "http://localhost:3456/api/v1/tools/search?q=read+file&limit=5"
|
|
296
|
+
|
|
297
|
+
# Call a tool
|
|
298
|
+
curl -X POST http://localhost:3456/api/v1/tools/filesystem__read_file/call \
|
|
299
|
+
-H "Content-Type: application/json" \
|
|
300
|
+
-d '{"arguments": {"path": "./README.md"}}'
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Authentication (team mode)
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# Register
|
|
307
|
+
curl -X POST http://localhost:3456/api/v1/auth/register \
|
|
308
|
+
-H "Content-Type: application/json" \
|
|
309
|
+
-d '{"email": "dev@company.com", "password": "...", "name": "Alice"}'
|
|
310
|
+
|
|
311
|
+
# Login
|
|
312
|
+
curl -X POST http://localhost:3456/api/v1/auth/login \
|
|
313
|
+
-H "Content-Type: application/json" \
|
|
314
|
+
-d '{"email": "dev@company.com", "password": "..."}'
|
|
315
|
+
|
|
316
|
+
# Get current user
|
|
317
|
+
curl http://localhost:3456/api/v1/auth/me \
|
|
318
|
+
-H "Authorization: Bearer <token>"
|
|
319
|
+
|
|
320
|
+
# Create API key
|
|
321
|
+
curl -X POST http://localhost:3456/api/v1/auth/keys \
|
|
322
|
+
-H "Authorization: Bearer <token>" \
|
|
323
|
+
-H "Content-Type: application/json" \
|
|
324
|
+
-d '{"name": "ci-pipeline"}'
|
|
102
325
|
```
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
326
|
+
|
|
327
|
+
### Knowledge Base (team mode)
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
# Upload a document
|
|
331
|
+
curl -X POST http://localhost:3456/api/v1/context/documents \
|
|
332
|
+
-H "Authorization: Bearer <token>" \
|
|
333
|
+
-H "Content-Type: application/json" \
|
|
334
|
+
-d '{"title": "Architecture", "content": "...", "type": "markdown"}'
|
|
335
|
+
|
|
336
|
+
# Search documents
|
|
337
|
+
curl "http://localhost:3456/api/v1/context/search?q=authentication+flow" \
|
|
338
|
+
-H "Authorization: Bearer <token>"
|
|
114
339
|
```
|
|
115
340
|
|
|
341
|
+
### Usage Stats (team mode)
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# Overview
|
|
345
|
+
curl http://localhost:3456/api/v1/stats/overview \
|
|
346
|
+
-H "Authorization: Bearer <token>"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
116
351
|
## Library Usage
|
|
117
352
|
|
|
118
|
-
|
|
119
|
-
import { OpalServeRegistry } from 'opalserve';
|
|
353
|
+
Use OpalServe programmatically in your Node.js applications:
|
|
120
354
|
|
|
355
|
+
```typescript
|
|
356
|
+
import {
|
|
357
|
+
OpalServeRegistry,
|
|
358
|
+
McpGateway,
|
|
359
|
+
KnowledgeBase,
|
|
360
|
+
UsageTracker,
|
|
361
|
+
} from 'opalserve';
|
|
362
|
+
|
|
363
|
+
// Create the registry with server definitions
|
|
121
364
|
const registry = await OpalServeRegistry.create({
|
|
122
|
-
servers: [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
365
|
+
servers: [
|
|
366
|
+
{
|
|
367
|
+
name: 'filesystem',
|
|
368
|
+
transport: {
|
|
369
|
+
type: 'stdio',
|
|
370
|
+
command: 'npx',
|
|
371
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
name: 'github',
|
|
376
|
+
transport: {
|
|
377
|
+
type: 'sse',
|
|
378
|
+
url: 'https://mcp-github.example.com/sse',
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
],
|
|
126
382
|
});
|
|
127
383
|
|
|
384
|
+
// Start the registry -- connects to all servers and indexes tools
|
|
128
385
|
await registry.start();
|
|
386
|
+
|
|
387
|
+
// List all discovered tools
|
|
129
388
|
const tools = registry.listTools();
|
|
130
|
-
|
|
389
|
+
console.log(`Discovered ${tools.length} tools`);
|
|
390
|
+
|
|
391
|
+
// Search with natural language
|
|
392
|
+
const results = registry.searchTools('read file contents');
|
|
393
|
+
for (const result of results) {
|
|
394
|
+
console.log(`${result.tool.name} (score: ${result.score})`);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Graceful shutdown
|
|
131
398
|
await registry.stop();
|
|
132
399
|
```
|
|
133
400
|
|
|
134
|
-
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## MCP Gateway
|
|
404
|
+
|
|
405
|
+
OpalServe can act as an MCP server itself, exposing every registered tool through a single endpoint. This lets you point Claude Desktop, Cursor, or any MCP-compatible client at OpalServe instead of configuring each server individually.
|
|
406
|
+
|
|
407
|
+
### Claude Desktop
|
|
408
|
+
|
|
409
|
+
Add to your `claude_desktop_config.json`:
|
|
135
410
|
|
|
136
|
-
|
|
411
|
+
```json
|
|
412
|
+
{
|
|
413
|
+
"mcpServers": {
|
|
414
|
+
"opalserve": {
|
|
415
|
+
"command": "opalserve",
|
|
416
|
+
"args": ["start", "--mcp"]
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Cursor
|
|
423
|
+
|
|
424
|
+
Add to your Cursor MCP settings:
|
|
425
|
+
|
|
426
|
+
```json
|
|
427
|
+
{
|
|
428
|
+
"mcpServers": {
|
|
429
|
+
"opalserve": {
|
|
430
|
+
"command": "opalserve",
|
|
431
|
+
"args": ["start", "--mcp"]
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
Once connected, your AI client gains access to:
|
|
438
|
+
|
|
439
|
+
- **`opalserve_search`** -- search across all registered tools by natural language query
|
|
440
|
+
- **`opalserve_context_search`** -- search the shared knowledge base
|
|
441
|
+
- **All proxied tools** -- every tool from every registered server, available through the single gateway
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## Integrations
|
|
446
|
+
|
|
447
|
+
### GitHub
|
|
448
|
+
|
|
449
|
+
Set up GitHub webhooks to automatically update context when code changes:
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
# Add GitHub MCP server
|
|
453
|
+
opalserve server add --name github --stdio "npx -y @modelcontextprotocol/server-github"
|
|
454
|
+
|
|
455
|
+
# Configure webhook (point your repo's webhook to):
|
|
456
|
+
# POST http://your-server:3456/api/v1/webhooks/github
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Environment variables:
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
GITHUB_TOKEN=ghp_...
|
|
463
|
+
GITHUB_WEBHOOK_SECRET=your-secret
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Slack
|
|
467
|
+
|
|
468
|
+
Enable Slack integration for search commands and notifications:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
# Add Slack MCP server
|
|
472
|
+
opalserve server add --name slack --stdio "npx -y @modelcontextprotocol/server-slack"
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
Configure your Slack app to send events and commands to:
|
|
476
|
+
|
|
477
|
+
```
|
|
478
|
+
Events: POST http://your-server:3456/api/v1/slack/events
|
|
479
|
+
Commands: POST http://your-server:3456/api/v1/slack/commands
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Environment variables:
|
|
483
|
+
|
|
484
|
+
```
|
|
485
|
+
SLACK_BOT_TOKEN=xoxb-...
|
|
486
|
+
SLACK_SIGNING_SECRET=your-secret
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Configuration
|
|
492
|
+
|
|
493
|
+
OpalServe is configured via `opalserve.config.json` in your project root or home directory.
|
|
494
|
+
|
|
495
|
+
```json
|
|
496
|
+
{
|
|
497
|
+
"mode": "local",
|
|
498
|
+
"port": 3456,
|
|
499
|
+
"host": "127.0.0.1",
|
|
500
|
+
"servers": [
|
|
501
|
+
{
|
|
502
|
+
"name": "filesystem",
|
|
503
|
+
"transport": {
|
|
504
|
+
"type": "stdio",
|
|
505
|
+
"command": "npx",
|
|
506
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
]
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
| Option | Default | Description |
|
|
514
|
+
|---|---|---|
|
|
515
|
+
| `mode` | `"local"` | `"local"` for single-user, `"team-server"` for shared |
|
|
516
|
+
| `port` | `3456` | HTTP API port |
|
|
517
|
+
| `host` | `"127.0.0.1"` | Bind address (`0.0.0.0` for team server) |
|
|
518
|
+
| `servers` | `[]` | Array of MCP server configurations |
|
|
519
|
+
|
|
520
|
+
Modes: **local** (single developer, no auth) and **team-server** (multi-user with auth, analytics, knowledge base).
|
|
521
|
+
|
|
522
|
+
> See the [full configuration reference](https://opalserve.vercel.app/config) for all options.
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## Contributing
|
|
527
|
+
|
|
528
|
+
Contributions are welcome. To get started:
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
# Clone the repo
|
|
532
|
+
git clone https://github.com/adityaidev/opalserve.git
|
|
533
|
+
cd opalserve
|
|
534
|
+
|
|
535
|
+
# Install dependencies
|
|
536
|
+
pnpm install
|
|
537
|
+
|
|
538
|
+
# Start in dev mode (watch + auto-reload)
|
|
539
|
+
pnpm dev
|
|
540
|
+
|
|
541
|
+
# Type-check
|
|
542
|
+
pnpm typecheck
|
|
543
|
+
|
|
544
|
+
# Lint
|
|
545
|
+
pnpm lint
|
|
546
|
+
|
|
547
|
+
# Run tests
|
|
548
|
+
pnpm test
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
Please open an issue before submitting large PRs. Follow the existing code style -- strict TypeScript, Zod schemas for validation, and `.js` extensions in imports.
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## Links
|
|
556
|
+
|
|
557
|
+
- **Documentation:** [opalserve.vercel.app](https://opalserve.vercel.app)
|
|
558
|
+
- **npm:** [npmjs.com/package/opalserve](https://www.npmjs.com/package/opalserve)
|
|
559
|
+
- **GitHub:** [github.com/adityaidev/opalserve](https://github.com/adityaidev/opalserve)
|
|
560
|
+
- **Releases:** [github.com/adityaidev/opalserve/releases](https://github.com/adityaidev/opalserve/releases)
|
|
561
|
+
- **Issues:** [github.com/adityaidev/opalserve/issues](https://github.com/adityaidev/opalserve/issues)
|
|
562
|
+
|
|
563
|
+
---
|
|
137
564
|
|
|
138
565
|
## License
|
|
139
566
|
|
|
140
|
-
MIT
|
|
567
|
+
MIT -- 100% open source, free to self-host.
|
|
568
|
+
|
|
569
|
+
See [LICENSE](./LICENSE) for details.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAyBA,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEpE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BxD;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvE;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpE"}
|
|
@@ -2,8 +2,9 @@ import chalk from 'chalk';
|
|
|
2
2
|
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
3
|
import { basename, extname, resolve } from 'node:path';
|
|
4
4
|
import { confirm } from '@inquirer/prompts';
|
|
5
|
+
import { OpalServeRegistry } from '../../core/registry.js';
|
|
6
|
+
import { KnowledgeBase } from '../../context/index.js';
|
|
5
7
|
import { showMiniBanner, showSuccess, showError, showInfo } from '../ui/banner.js';
|
|
6
|
-
import { loadCredentials } from '../../config/credentials.js';
|
|
7
8
|
function getContentType(filePath) {
|
|
8
9
|
const ext = extname(filePath).toLowerCase();
|
|
9
10
|
const types = {
|
|
@@ -20,45 +21,27 @@ function getContentType(filePath) {
|
|
|
20
21
|
};
|
|
21
22
|
return types[ext] ?? 'text/plain';
|
|
22
23
|
}
|
|
23
|
-
async function apiRequest(path, options) {
|
|
24
|
-
const creds = loadCredentials();
|
|
25
|
-
if (!creds) {
|
|
26
|
-
throw new Error('Not logged in. Run `opalserve login` first.');
|
|
27
|
-
}
|
|
28
|
-
const response = await fetch(`${creds.serverUrl}${path}`, {
|
|
29
|
-
...options,
|
|
30
|
-
headers: {
|
|
31
|
-
'Content-Type': 'application/json',
|
|
32
|
-
Authorization: `Bearer ${creds.apiKey}`,
|
|
33
|
-
...options?.headers,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
return response.json();
|
|
37
|
-
}
|
|
38
24
|
export async function contextAddCommand(files) {
|
|
39
25
|
showMiniBanner();
|
|
40
26
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
const registry = await OpalServeRegistry.create();
|
|
28
|
+
const kb = new KnowledgeBase(registry.getDatabase());
|
|
29
|
+
// Resolve file paths
|
|
43
30
|
const candidates = files.split(',').map(f => f.trim()).filter(Boolean);
|
|
44
|
-
filePaths = [];
|
|
31
|
+
const filePaths = [];
|
|
45
32
|
for (const candidate of candidates) {
|
|
46
33
|
const resolved = resolve(candidate);
|
|
47
34
|
try {
|
|
48
35
|
const stat = statSync(resolved);
|
|
49
36
|
if (stat.isDirectory()) {
|
|
50
|
-
// If directory, read all files in it
|
|
51
37
|
const entries = readdirSync(resolved);
|
|
52
38
|
for (const entry of entries) {
|
|
53
39
|
const entryPath = resolve(resolved, entry);
|
|
54
40
|
try {
|
|
55
|
-
if (statSync(entryPath).isFile())
|
|
41
|
+
if (statSync(entryPath).isFile())
|
|
56
42
|
filePaths.push(entryPath);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Skip unreadable entries
|
|
61
43
|
}
|
|
44
|
+
catch { /* skip */ }
|
|
62
45
|
}
|
|
63
46
|
}
|
|
64
47
|
else {
|
|
@@ -66,13 +49,13 @@ export async function contextAddCommand(files) {
|
|
|
66
49
|
}
|
|
67
50
|
}
|
|
68
51
|
catch {
|
|
69
|
-
// Try as-is in case it's handled elsewhere
|
|
70
52
|
filePaths.push(resolved);
|
|
71
53
|
}
|
|
72
54
|
}
|
|
73
55
|
if (filePaths.length === 0) {
|
|
74
56
|
showError(`No files found matching "${files}"`);
|
|
75
|
-
|
|
57
|
+
registry.getDatabase().close();
|
|
58
|
+
return;
|
|
76
59
|
}
|
|
77
60
|
showInfo(`Uploading ${chalk.bold(String(filePaths.length))} file(s)...`);
|
|
78
61
|
console.log('');
|
|
@@ -83,18 +66,9 @@ export async function contextAddCommand(files) {
|
|
|
83
66
|
const contentType = getContentType(filePath);
|
|
84
67
|
try {
|
|
85
68
|
const content = readFileSync(filePath, 'utf-8');
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
});
|
|
90
|
-
if (result.ok) {
|
|
91
|
-
showSuccess(`${chalk.white(title)} ${chalk.dim(`(${content.length} chars)`)}`);
|
|
92
|
-
uploaded++;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
showError(`${title}: ${result.error}`);
|
|
96
|
-
failed++;
|
|
97
|
-
}
|
|
69
|
+
kb.addDocument({ title, content, contentType, source: filePath });
|
|
70
|
+
showSuccess(`${chalk.white(title)} ${chalk.dim(`(${content.length} chars)`)}`);
|
|
71
|
+
uploaded++;
|
|
98
72
|
}
|
|
99
73
|
catch (error) {
|
|
100
74
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -104,62 +78,59 @@ export async function contextAddCommand(files) {
|
|
|
104
78
|
}
|
|
105
79
|
console.log('');
|
|
106
80
|
showSuccess(`Uploaded: ${chalk.bold(String(uploaded))}, Failed: ${chalk.bold(String(failed))}`);
|
|
81
|
+
registry.getDatabase().close();
|
|
107
82
|
}
|
|
108
83
|
catch (error) {
|
|
109
84
|
showError(error instanceof Error ? error.message : String(error));
|
|
110
|
-
process.exit(1);
|
|
111
85
|
}
|
|
112
86
|
}
|
|
113
87
|
export async function contextListCommand() {
|
|
114
88
|
showMiniBanner();
|
|
115
89
|
try {
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
showInfo('No context documents found');
|
|
90
|
+
const registry = await OpalServeRegistry.create();
|
|
91
|
+
const kb = new KnowledgeBase(registry.getDatabase());
|
|
92
|
+
const docs = kb.listDocuments();
|
|
93
|
+
if (docs.length === 0) {
|
|
94
|
+
showInfo('No context documents found. Add some with `opalserve context add <file>`');
|
|
95
|
+
registry.getDatabase().close();
|
|
123
96
|
return;
|
|
124
97
|
}
|
|
125
|
-
console.log(` ${chalk.bold('Context Documents')} (${
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
console.log(` ${chalk.dim(id.padEnd(38))} ${chalk.white(title.padEnd(30))} ${chalk.cyan(doc.contentType.padEnd(18))} ${chalk.dim(doc.createdAt)}`);
|
|
98
|
+
console.log(` ${chalk.bold('Context Documents')} ${chalk.dim(`(${docs.length})`)}\n`);
|
|
99
|
+
for (const doc of docs) {
|
|
100
|
+
const id = doc.id.length > 12 ? doc.id.slice(0, 12) + '...' : doc.id;
|
|
101
|
+
const title = doc.title.length > 35 ? doc.title.slice(0, 32) + '...' : doc.title;
|
|
102
|
+
const size = doc.content.length;
|
|
103
|
+
console.log(` ${chalk.dim(id.padEnd(16))} ${chalk.white(title.padEnd(36))} ${chalk.cyan(doc.contentType.padEnd(18))} ${chalk.dim(`${size} chars`)}`);
|
|
132
104
|
}
|
|
133
105
|
console.log('');
|
|
106
|
+
registry.getDatabase().close();
|
|
134
107
|
}
|
|
135
108
|
catch (error) {
|
|
136
109
|
showError(error instanceof Error ? error.message : String(error));
|
|
137
|
-
process.exit(1);
|
|
138
110
|
}
|
|
139
111
|
}
|
|
140
112
|
export async function contextSearchCommand(query) {
|
|
141
113
|
showMiniBanner();
|
|
142
114
|
try {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
if (result.data.length === 0) {
|
|
115
|
+
const registry = await OpalServeRegistry.create();
|
|
116
|
+
const kb = new KnowledgeBase(registry.getDatabase());
|
|
117
|
+
const results = kb.searchDocuments(query);
|
|
118
|
+
if (results.length === 0) {
|
|
149
119
|
showInfo(`No documents matching "${query}"`);
|
|
120
|
+
registry.getDatabase().close();
|
|
150
121
|
return;
|
|
151
122
|
}
|
|
152
|
-
console.log(` ${chalk.bold('Search Results')} for "${query}" (${
|
|
153
|
-
for (const { doc, score } of
|
|
154
|
-
console.log(` ${chalk.yellow(`[${score}]`)} ${chalk.bold(doc.title)} ${chalk.dim(`(${doc.id.slice(0,
|
|
123
|
+
console.log(` ${chalk.bold('Search Results')} for "${chalk.cyan(query)}" ${chalk.dim(`(${results.length})`)}\n`);
|
|
124
|
+
for (const { doc, score } of results) {
|
|
125
|
+
console.log(` ${chalk.yellow(`[${score.toFixed(1)}]`)} ${chalk.bold(doc.title)} ${chalk.dim(`(${doc.id.slice(0, 12)}...)`)}`);
|
|
155
126
|
const preview = doc.content.slice(0, 120).replace(/\n/g, ' ');
|
|
156
127
|
console.log(` ${chalk.dim(preview)}${doc.content.length > 120 ? '...' : ''}`);
|
|
157
128
|
console.log('');
|
|
158
129
|
}
|
|
130
|
+
registry.getDatabase().close();
|
|
159
131
|
}
|
|
160
132
|
catch (error) {
|
|
161
133
|
showError(error instanceof Error ? error.message : String(error));
|
|
162
|
-
process.exit(1);
|
|
163
134
|
}
|
|
164
135
|
}
|
|
165
136
|
export async function contextRemoveCommand(id) {
|
|
@@ -173,18 +144,19 @@ export async function contextRemoveCommand(id) {
|
|
|
173
144
|
showInfo('Cancelled');
|
|
174
145
|
return;
|
|
175
146
|
}
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
147
|
+
const registry = await OpalServeRegistry.create();
|
|
148
|
+
const kb = new KnowledgeBase(registry.getDatabase());
|
|
149
|
+
const removed = kb.removeDocument(id);
|
|
150
|
+
if (removed) {
|
|
151
|
+
showSuccess('Document deleted');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
showError(`Document "${id}" not found`);
|
|
182
155
|
}
|
|
183
|
-
|
|
156
|
+
registry.getDatabase().close();
|
|
184
157
|
}
|
|
185
158
|
catch (error) {
|
|
186
159
|
showError(error instanceof Error ? error.message : String(error));
|
|
187
|
-
process.exit(1);
|
|
188
160
|
}
|
|
189
161
|
}
|
|
190
162
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAKxD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkJtH,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;WAKM,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAKxD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkJtH,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;WAKM,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;WA+B1C,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAQ1C,IAAI,IAAI,IAAI;IAOZ,KAAK,IAAI,IAAI;IAKb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI;IAK1C,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI;IAY3E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAatE,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAS3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,GAAG,IAAI;IAMpF,aAAa,IAAI;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,EAAE;IAKvE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMnC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKnF,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOhG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,EAAE,GAAG,IAAI;IAY5I,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAKvC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IAKnD,WAAW,IAAI,WAAW,EAAE;IAK5B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAuB9E,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI7C,SAAS,IAAI,MAAM;IAOnB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,MAAM;IAad,QAAQ,IAAI,aAAa;CAG1B"}
|
package/dist/storage/database.js
CHANGED
|
@@ -159,7 +159,20 @@ export class Database {
|
|
|
159
159
|
let db;
|
|
160
160
|
if (existsSync(resolved)) {
|
|
161
161
|
const buffer = readFileSync(resolved);
|
|
162
|
-
|
|
162
|
+
// Check if it's a valid SQLite file (starts with "SQLite format 3")
|
|
163
|
+
const header = buffer.slice(0, 16).toString('utf-8');
|
|
164
|
+
if (header.startsWith('SQLite format 3')) {
|
|
165
|
+
db = new SqlJs.Database(buffer);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Old JSON format or corrupted file — start fresh
|
|
169
|
+
const backupPath = resolved + '.v2.bak';
|
|
170
|
+
try {
|
|
171
|
+
writeFileSync(backupPath, buffer);
|
|
172
|
+
}
|
|
173
|
+
catch { /* ignore */ }
|
|
174
|
+
db = new SqlJs.Database();
|
|
175
|
+
}
|
|
163
176
|
}
|
|
164
177
|
else {
|
|
165
178
|
db = new SqlJs.Database();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,IAAI,GAAG,GAAiD,IAAI,CAAC;AAE7D,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,4BAA4B;QAC5B,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;YAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QACD,GAAG,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Hd,CAAC;AAEF,MAAM,OAAO,QAAQ;IACX,EAAE,CAAgB;IAClB,QAAQ,CAAgB;IAEhC,YAAoB,EAAiB,EAAE,QAAuB;QAC5D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAiB;QACjC,MAAM,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QAChD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,IAAI,EAAiB,CAAC;QAEtB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED