opalserve 2.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 +493 -67
- package/assets/logo.svg +36 -39
- package/dist/auth/api-keys.d.ts +7 -0
- package/dist/auth/api-keys.d.ts.map +1 -0
- package/dist/auth/api-keys.js +12 -0
- package/dist/auth/api-keys.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +11 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +46 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/passwords.d.ts +3 -0
- package/dist/auth/passwords.d.ts.map +1 -0
- package/dist/auth/passwords.js +33 -0
- package/dist/auth/passwords.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +13 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +261 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +4 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +77 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/context.d.ts +5 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +162 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +2 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +58 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.js +75 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/banner.js +2 -2
- package/dist/config/credentials.d.ts +10 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +33 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/chunker.d.ts +2 -0
- package/dist/context/chunker.d.ts.map +1 -0
- package/dist/context/chunker.js +81 -0
- package/dist/context/chunker.js.map +1 -0
- package/dist/context/index.d.ts +26 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +97 -0
- package/dist/context/index.js.map +1 -0
- package/dist/core/registry.d.ts +3 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +8 -6
- package/dist/core/registry.js.map +1 -1
- package/dist/core/secrets.d.ts +4 -0
- package/dist/core/secrets.d.ts.map +1 -0
- package/dist/core/secrets.js +40 -0
- package/dist/core/secrets.js.map +1 -0
- package/dist/core/server-manager.js +1 -1
- package/dist/dashboard/assets/index-BNOtcUPs.js +257 -0
- package/dist/dashboard/assets/index-Duwp34GW.css +1 -0
- package/dist/dashboard/index.html +14 -0
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/github.d.ts +5 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +63 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/slack.d.ts +21 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +61 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/monitoring/tracker.d.ts +31 -0
- package/dist/monitoring/tracker.d.ts.map +1 -0
- package/dist/monitoring/tracker.js +86 -0
- package/dist/monitoring/tracker.js.map +1 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +46 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/mcp-gateway.js +1 -1
- package/dist/server/routes/auth.d.ts +4 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +117 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/context.d.ts +4 -0
- package/dist/server/routes/context.d.ts.map +1 -0
- package/dist/server/routes/context.js +107 -0
- package/dist/server/routes/context.js.map +1 -0
- package/dist/server/routes/health.js +1 -1
- package/dist/server/routes/stats.d.ts +4 -0
- package/dist/server/routes/stats.d.ts.map +1 -0
- package/dist/server/routes/stats.js +97 -0
- package/dist/server/routes/stats.js.map +1 -0
- package/dist/server/routes/team-servers.d.ts +4 -0
- package/dist/server/routes/team-servers.d.ts.map +1 -0
- package/dist/server/routes/team-servers.js +108 -0
- package/dist/server/routes/team-servers.js.map +1 -0
- package/dist/server/routes/webhooks.d.ts +4 -0
- package/dist/server/routes/webhooks.d.ts.map +1 -0
- package/dist/server/routes/webhooks.js +77 -0
- package/dist/server/routes/webhooks.js.map +1 -0
- package/dist/storage/database.d.ts +10 -3
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +269 -115
- package/dist/storage/database.js.map +1 -1
- package/dist/types/index.d.ts +102 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +5 -3
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import type { Database as SqlJsDatabase } from 'sql.js';
|
|
1
2
|
import type { McpServerConfig, ConnectedServer, ServerStatus, IndexedTool, ToolAnnotations } from '../types/index.js';
|
|
2
3
|
export declare class Database {
|
|
3
|
-
private
|
|
4
|
+
private db;
|
|
4
5
|
private filePath;
|
|
5
6
|
private constructor();
|
|
6
|
-
static open(filePath?: string): Database
|
|
7
|
-
static inMemory(): Database
|
|
7
|
+
static open(filePath?: string): Promise<Database>;
|
|
8
|
+
static inMemory(): Promise<Database>;
|
|
8
9
|
save(): void;
|
|
9
10
|
close(): void;
|
|
11
|
+
run(sql: string, params?: unknown[]): void;
|
|
12
|
+
get<T = Record<string, unknown>>(sql: string, params?: unknown[]): T | null;
|
|
13
|
+
all<T = Record<string, unknown>>(sql: string, params?: unknown[]): T[];
|
|
10
14
|
upsertServer(config: McpServerConfig): void;
|
|
11
15
|
getServer(name: string): {
|
|
12
16
|
config: McpServerConfig;
|
|
@@ -37,5 +41,8 @@ export declare class Database {
|
|
|
37
41
|
}[];
|
|
38
42
|
removeToolsByServer(serverName: string): void;
|
|
39
43
|
toolCount(): number;
|
|
44
|
+
private toServerResult;
|
|
45
|
+
private toTool;
|
|
46
|
+
getRawDb(): SqlJsDatabase;
|
|
40
47
|
}
|
|
41
48
|
//# sourceMappingURL=database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"
|
|
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
|
@@ -1,195 +1,349 @@
|
|
|
1
|
+
import initSqlJs from 'sql.js';
|
|
1
2
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { dirname } from 'node:path';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
3
5
|
import { getDefaultDbPath } from '../config/defaults.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
let SQL = null;
|
|
7
|
+
async function getSqlJs() {
|
|
8
|
+
if (!SQL) {
|
|
9
|
+
// Try to find the wasm file
|
|
10
|
+
let wasmBinary;
|
|
11
|
+
try {
|
|
12
|
+
const sqlJsPath = dirname(fileURLToPath(import.meta.resolve('sql.js')));
|
|
13
|
+
const wasmPath = join(sqlJsPath, 'dist', 'sql-wasm.wasm');
|
|
14
|
+
if (existsSync(wasmPath)) {
|
|
15
|
+
wasmBinary = readFileSync(wasmPath);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Let sql.js find it on its own
|
|
20
|
+
}
|
|
21
|
+
SQL = await initSqlJs(wasmBinary ? { wasmBinary } : undefined);
|
|
22
|
+
}
|
|
23
|
+
return SQL;
|
|
6
24
|
}
|
|
7
|
-
|
|
25
|
+
const SCHEMA = `
|
|
26
|
+
CREATE TABLE IF NOT EXISTS servers (
|
|
27
|
+
name TEXT PRIMARY KEY,
|
|
28
|
+
config_json TEXT NOT NULL,
|
|
29
|
+
status TEXT NOT NULL DEFAULT 'disconnected',
|
|
30
|
+
server_info TEXT,
|
|
31
|
+
tool_count INTEGER DEFAULT 0,
|
|
32
|
+
last_seen TEXT,
|
|
33
|
+
error TEXT,
|
|
34
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
35
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS tools (
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
server_name TEXT NOT NULL,
|
|
41
|
+
name TEXT NOT NULL,
|
|
42
|
+
description TEXT DEFAULT '',
|
|
43
|
+
input_schema TEXT,
|
|
44
|
+
annotations TEXT,
|
|
45
|
+
discovered_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
46
|
+
last_verified TEXT NOT NULL DEFAULT (datetime('now'))
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_tools_server ON tools(server_name);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_tools_name ON tools(name);
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
53
|
+
id TEXT PRIMARY KEY,
|
|
54
|
+
email TEXT UNIQUE NOT NULL,
|
|
55
|
+
password_hash TEXT NOT NULL,
|
|
56
|
+
display_name TEXT,
|
|
57
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
58
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
name TEXT NOT NULL,
|
|
64
|
+
slug TEXT UNIQUE NOT NULL,
|
|
65
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
CREATE TABLE IF NOT EXISTS team_members (
|
|
69
|
+
team_id TEXT NOT NULL,
|
|
70
|
+
user_id TEXT NOT NULL,
|
|
71
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
72
|
+
joined_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
73
|
+
PRIMARY KEY (team_id, user_id)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE TABLE IF NOT EXISTS api_keys (
|
|
77
|
+
id TEXT PRIMARY KEY,
|
|
78
|
+
user_id TEXT NOT NULL,
|
|
79
|
+
key_hash TEXT NOT NULL,
|
|
80
|
+
key_prefix TEXT NOT NULL,
|
|
81
|
+
name TEXT NOT NULL,
|
|
82
|
+
last_used_at TEXT,
|
|
83
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
84
|
+
expires_at TEXT
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
CREATE TABLE IF NOT EXISTS team_servers (
|
|
88
|
+
id TEXT PRIMARY KEY,
|
|
89
|
+
team_id TEXT NOT NULL,
|
|
90
|
+
name TEXT NOT NULL,
|
|
91
|
+
config_json TEXT NOT NULL,
|
|
92
|
+
credentials_encrypted TEXT,
|
|
93
|
+
enabled INTEGER DEFAULT 1,
|
|
94
|
+
created_by TEXT,
|
|
95
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
96
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
97
|
+
UNIQUE(team_id, name)
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS context_documents (
|
|
101
|
+
id TEXT PRIMARY KEY,
|
|
102
|
+
team_id TEXT,
|
|
103
|
+
title TEXT NOT NULL,
|
|
104
|
+
content TEXT NOT NULL,
|
|
105
|
+
content_type TEXT DEFAULT 'text/markdown',
|
|
106
|
+
source TEXT,
|
|
107
|
+
tags TEXT DEFAULT '[]',
|
|
108
|
+
uploaded_by TEXT,
|
|
109
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
110
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE IF NOT EXISTS usage_events (
|
|
114
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
115
|
+
team_id TEXT,
|
|
116
|
+
user_id TEXT,
|
|
117
|
+
event_type TEXT NOT NULL,
|
|
118
|
+
server_name TEXT,
|
|
119
|
+
tool_name TEXT,
|
|
120
|
+
latency_ms INTEGER,
|
|
121
|
+
success INTEGER,
|
|
122
|
+
error TEXT,
|
|
123
|
+
metadata TEXT,
|
|
124
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_usage_user ON usage_events(user_id, created_at);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_usage_team ON usage_events(team_id, created_at);
|
|
129
|
+
|
|
130
|
+
CREATE TABLE IF NOT EXISTS rate_limits (
|
|
131
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
132
|
+
team_id TEXT NOT NULL,
|
|
133
|
+
user_id TEXT,
|
|
134
|
+
role TEXT,
|
|
135
|
+
limit_type TEXT NOT NULL,
|
|
136
|
+
max_value INTEGER NOT NULL
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
CREATE TABLE IF NOT EXISTS tool_permissions (
|
|
140
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
141
|
+
team_id TEXT NOT NULL,
|
|
142
|
+
role TEXT NOT NULL,
|
|
143
|
+
server_name TEXT NOT NULL,
|
|
144
|
+
tool_name TEXT,
|
|
145
|
+
permission TEXT NOT NULL DEFAULT 'allow'
|
|
146
|
+
);
|
|
147
|
+
`;
|
|
8
148
|
export class Database {
|
|
9
|
-
|
|
149
|
+
db;
|
|
10
150
|
filePath;
|
|
11
|
-
constructor(
|
|
151
|
+
constructor(db, filePath) {
|
|
152
|
+
this.db = db;
|
|
12
153
|
this.filePath = filePath;
|
|
13
|
-
this.data = data;
|
|
14
154
|
}
|
|
15
|
-
static open(filePath) {
|
|
155
|
+
static async open(filePath) {
|
|
16
156
|
const resolved = filePath || getDefaultDbPath();
|
|
17
157
|
mkdirSync(dirname(resolved), { recursive: true });
|
|
18
|
-
|
|
158
|
+
const SqlJs = await getSqlJs();
|
|
159
|
+
let db;
|
|
19
160
|
if (existsSync(resolved)) {
|
|
20
|
-
|
|
21
|
-
|
|
161
|
+
const buffer = readFileSync(resolved);
|
|
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);
|
|
22
166
|
}
|
|
23
|
-
|
|
24
|
-
|
|
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();
|
|
25
175
|
}
|
|
26
176
|
}
|
|
27
177
|
else {
|
|
28
|
-
|
|
178
|
+
db = new SqlJs.Database();
|
|
29
179
|
}
|
|
30
|
-
|
|
180
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
181
|
+
db.run(SCHEMA);
|
|
182
|
+
const instance = new Database(db, resolved);
|
|
183
|
+
instance.save();
|
|
184
|
+
return instance;
|
|
31
185
|
}
|
|
32
|
-
static inMemory() {
|
|
33
|
-
|
|
186
|
+
static async inMemory() {
|
|
187
|
+
const SqlJs = await getSqlJs();
|
|
188
|
+
const db = new SqlJs.Database();
|
|
189
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
190
|
+
db.run(SCHEMA);
|
|
191
|
+
return new Database(db, null);
|
|
34
192
|
}
|
|
35
193
|
save() {
|
|
36
194
|
if (this.filePath) {
|
|
37
|
-
|
|
195
|
+
const data = this.db.export();
|
|
196
|
+
writeFileSync(this.filePath, Buffer.from(data));
|
|
38
197
|
}
|
|
39
198
|
}
|
|
40
199
|
close() {
|
|
41
200
|
this.save();
|
|
201
|
+
this.db.close();
|
|
202
|
+
}
|
|
203
|
+
run(sql, params) {
|
|
204
|
+
this.db.run(sql, params);
|
|
205
|
+
this.save();
|
|
206
|
+
}
|
|
207
|
+
get(sql, params) {
|
|
208
|
+
const stmt = this.db.prepare(sql);
|
|
209
|
+
if (params)
|
|
210
|
+
stmt.bind(params);
|
|
211
|
+
if (stmt.step()) {
|
|
212
|
+
const row = stmt.getAsObject();
|
|
213
|
+
stmt.free();
|
|
214
|
+
return row;
|
|
215
|
+
}
|
|
216
|
+
stmt.free();
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
all(sql, params) {
|
|
220
|
+
const results = [];
|
|
221
|
+
const stmt = this.db.prepare(sql);
|
|
222
|
+
if (params)
|
|
223
|
+
stmt.bind(params);
|
|
224
|
+
while (stmt.step()) {
|
|
225
|
+
results.push(stmt.getAsObject());
|
|
226
|
+
}
|
|
227
|
+
stmt.free();
|
|
228
|
+
return results;
|
|
42
229
|
}
|
|
43
230
|
// --- Server Operations ---
|
|
44
231
|
upsertServer(config) {
|
|
45
|
-
const existing = this.data.servers[config.name];
|
|
46
232
|
const now = new Date().toISOString();
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
lastSeen: existing?.lastSeen || null,
|
|
53
|
-
error: existing?.error || null,
|
|
54
|
-
createdAt: existing?.createdAt || now,
|
|
55
|
-
updatedAt: now,
|
|
56
|
-
};
|
|
57
|
-
this.save();
|
|
233
|
+
this.run(`
|
|
234
|
+
INSERT INTO servers (name, config_json, status, created_at, updated_at)
|
|
235
|
+
VALUES (?, ?, 'disconnected', ?, ?)
|
|
236
|
+
ON CONFLICT(name) DO UPDATE SET config_json = excluded.config_json, updated_at = ?
|
|
237
|
+
`, [config.name, JSON.stringify(config), now, now, now]);
|
|
58
238
|
}
|
|
59
239
|
getServer(name) {
|
|
60
|
-
const
|
|
61
|
-
if (!
|
|
240
|
+
const row = this.get('SELECT * FROM servers WHERE name = ?', [name]);
|
|
241
|
+
if (!row)
|
|
62
242
|
return null;
|
|
63
|
-
return
|
|
64
|
-
config: record.config,
|
|
65
|
-
server: {
|
|
66
|
-
name,
|
|
67
|
-
status: record.status,
|
|
68
|
-
transport: record.config.transport.type,
|
|
69
|
-
toolCount: record.toolCount,
|
|
70
|
-
lastSeen: record.lastSeen || record.createdAt,
|
|
71
|
-
error: record.error,
|
|
72
|
-
serverInfo: record.serverInfo,
|
|
73
|
-
},
|
|
74
|
-
};
|
|
243
|
+
return this.toServerResult(row);
|
|
75
244
|
}
|
|
76
245
|
getAllServers() {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.map(name => this.getServer(name))
|
|
80
|
-
.filter(Boolean);
|
|
246
|
+
const rows = this.all('SELECT * FROM servers ORDER BY name');
|
|
247
|
+
return rows.map(r => this.toServerResult(r));
|
|
81
248
|
}
|
|
82
249
|
removeServer(name) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
delete this.data.servers[name];
|
|
86
|
-
// Remove tools from this server
|
|
87
|
-
for (const [id, tool] of Object.entries(this.data.tools)) {
|
|
88
|
-
if (tool.serverName === name) {
|
|
89
|
-
delete this.data.tools[id];
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
this.save();
|
|
250
|
+
this.run('DELETE FROM tools WHERE server_name = ?', [name]);
|
|
251
|
+
this.run('DELETE FROM servers WHERE name = ?', [name]);
|
|
93
252
|
return true;
|
|
94
253
|
}
|
|
95
254
|
updateServerStatus(name, status, error) {
|
|
96
|
-
|
|
97
|
-
if (!record)
|
|
98
|
-
return;
|
|
99
|
-
record.status = status;
|
|
100
|
-
record.error = error ?? null;
|
|
101
|
-
record.lastSeen = new Date().toISOString();
|
|
102
|
-
record.updatedAt = new Date().toISOString();
|
|
103
|
-
this.save();
|
|
255
|
+
this.run('UPDATE servers SET status = ?, error = ?, last_seen = datetime("now"), updated_at = datetime("now") WHERE name = ?', [status, error ?? null, name]);
|
|
104
256
|
}
|
|
105
257
|
updateServerInfo(name, info, toolCount) {
|
|
106
|
-
|
|
107
|
-
if (!record)
|
|
108
|
-
return;
|
|
109
|
-
record.serverInfo = info;
|
|
110
|
-
record.toolCount = toolCount;
|
|
111
|
-
record.lastSeen = new Date().toISOString();
|
|
112
|
-
record.updatedAt = new Date().toISOString();
|
|
113
|
-
this.save();
|
|
258
|
+
this.run('UPDATE servers SET server_info = ?, tool_count = ?, last_seen = datetime("now"), updated_at = datetime("now") WHERE name = ?', [JSON.stringify(info), toolCount, name]);
|
|
114
259
|
}
|
|
115
260
|
// --- Tool Operations ---
|
|
116
261
|
upsertTools(serverName, tools) {
|
|
262
|
+
this.run('DELETE FROM tools WHERE server_name = ?', [serverName]);
|
|
117
263
|
const now = new Date().toISOString();
|
|
118
|
-
// Remove old tools from this server
|
|
119
|
-
for (const [id, tool] of Object.entries(this.data.tools)) {
|
|
120
|
-
if (tool.serverName === serverName) {
|
|
121
|
-
delete this.data.tools[id];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Add new tools
|
|
125
264
|
for (const tool of tools) {
|
|
126
265
|
const id = `${serverName}:${tool.name}`;
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
name: tool.name,
|
|
131
|
-
description: tool.description || '',
|
|
132
|
-
inputSchema: tool.inputSchema,
|
|
133
|
-
annotations: tool.annotations,
|
|
134
|
-
discoveredAt: this.data.tools[id]?.discoveredAt || now,
|
|
135
|
-
lastVerified: now,
|
|
136
|
-
};
|
|
266
|
+
this.run(`INSERT INTO tools (id, server_name, name, description, input_schema, annotations, discovered_at, last_verified)
|
|
267
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, serverName, tool.name, tool.description || '', tool.inputSchema ? JSON.stringify(tool.inputSchema) : null,
|
|
268
|
+
tool.annotations ? JSON.stringify(tool.annotations) : null, now, now]);
|
|
137
269
|
}
|
|
138
|
-
this.save();
|
|
139
270
|
}
|
|
140
271
|
getTool(id) {
|
|
141
|
-
|
|
272
|
+
const row = this.get('SELECT * FROM tools WHERE id = ?', [id]);
|
|
273
|
+
return row ? this.toTool(row) : null;
|
|
142
274
|
}
|
|
143
275
|
getToolsByServer(serverName) {
|
|
144
|
-
return
|
|
145
|
-
.
|
|
146
|
-
.sort((a, b) => a.name.localeCompare(b.name));
|
|
276
|
+
return this.all('SELECT * FROM tools WHERE server_name = ? ORDER BY name', [serverName])
|
|
277
|
+
.map(r => this.toTool(r));
|
|
147
278
|
}
|
|
148
279
|
getAllTools() {
|
|
149
|
-
return
|
|
150
|
-
.
|
|
280
|
+
return this.all('SELECT * FROM tools ORDER BY server_name, name')
|
|
281
|
+
.map(r => this.toTool(r));
|
|
151
282
|
}
|
|
152
283
|
searchTools(query, limit = 20) {
|
|
153
284
|
if (!query.trim())
|
|
154
285
|
return [];
|
|
155
286
|
const terms = query.toLowerCase().split(/\s+/);
|
|
156
|
-
const tools =
|
|
157
|
-
|
|
287
|
+
const tools = this.getAllTools();
|
|
288
|
+
return tools
|
|
289
|
+
.map(tool => {
|
|
158
290
|
let score = 0;
|
|
159
291
|
const nameL = tool.name.toLowerCase();
|
|
160
292
|
const descL = tool.description.toLowerCase();
|
|
161
|
-
const serverL = tool.serverName.toLowerCase();
|
|
162
293
|
for (const term of terms) {
|
|
163
|
-
// Exact name match
|
|
164
294
|
if (nameL === term)
|
|
165
295
|
score += 10;
|
|
166
|
-
// Name contains term
|
|
167
296
|
else if (nameL.includes(term))
|
|
168
297
|
score += 5;
|
|
169
|
-
// Description contains term
|
|
170
298
|
if (descL.includes(term))
|
|
171
299
|
score += 3;
|
|
172
|
-
|
|
173
|
-
if (serverL.includes(term))
|
|
300
|
+
if (tool.serverName.toLowerCase().includes(term))
|
|
174
301
|
score += 1;
|
|
175
302
|
}
|
|
176
303
|
return { tool, score };
|
|
177
|
-
})
|
|
178
|
-
return scored
|
|
304
|
+
})
|
|
179
305
|
.filter(s => s.score > 0)
|
|
180
306
|
.sort((a, b) => b.score - a.score)
|
|
181
307
|
.slice(0, limit);
|
|
182
308
|
}
|
|
183
309
|
removeToolsByServer(serverName) {
|
|
184
|
-
|
|
185
|
-
if (tool.serverName === serverName) {
|
|
186
|
-
delete this.data.tools[id];
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
this.save();
|
|
310
|
+
this.run('DELETE FROM tools WHERE server_name = ?', [serverName]);
|
|
190
311
|
}
|
|
191
312
|
toolCount() {
|
|
192
|
-
|
|
313
|
+
const row = this.get('SELECT COUNT(*) as count FROM tools');
|
|
314
|
+
return row?.count ?? 0;
|
|
315
|
+
}
|
|
316
|
+
// --- Helpers ---
|
|
317
|
+
toServerResult(row) {
|
|
318
|
+
const config = JSON.parse(row.config_json);
|
|
319
|
+
const serverInfo = row.server_info ? JSON.parse(row.server_info) : null;
|
|
320
|
+
return {
|
|
321
|
+
config,
|
|
322
|
+
server: {
|
|
323
|
+
name: row.name,
|
|
324
|
+
status: row.status,
|
|
325
|
+
transport: config.transport.type,
|
|
326
|
+
toolCount: row.tool_count,
|
|
327
|
+
lastSeen: (row.last_seen || row.created_at),
|
|
328
|
+
error: row.error,
|
|
329
|
+
serverInfo,
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
toTool(row) {
|
|
334
|
+
return {
|
|
335
|
+
id: row.id,
|
|
336
|
+
serverName: row.server_name,
|
|
337
|
+
name: row.name,
|
|
338
|
+
description: (row.description || ''),
|
|
339
|
+
inputSchema: row.input_schema ? JSON.parse(row.input_schema) : undefined,
|
|
340
|
+
annotations: row.annotations ? JSON.parse(row.annotations) : undefined,
|
|
341
|
+
discoveredAt: row.discovered_at,
|
|
342
|
+
lastVerified: row.last_verified,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
getRawDb() {
|
|
346
|
+
return this.db;
|
|
193
347
|
}
|
|
194
348
|
}
|
|
195
349
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
|