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.
Files changed (118) hide show
  1. package/README.md +493 -67
  2. package/assets/logo.svg +36 -39
  3. package/dist/auth/api-keys.d.ts +7 -0
  4. package/dist/auth/api-keys.d.ts.map +1 -0
  5. package/dist/auth/api-keys.js +12 -0
  6. package/dist/auth/api-keys.js.map +1 -0
  7. package/dist/auth/index.d.ts +4 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +4 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/middleware.d.ts +11 -0
  12. package/dist/auth/middleware.d.ts.map +1 -0
  13. package/dist/auth/middleware.js +46 -0
  14. package/dist/auth/middleware.js.map +1 -0
  15. package/dist/auth/passwords.d.ts +3 -0
  16. package/dist/auth/passwords.d.ts.map +1 -0
  17. package/dist/auth/passwords.js +33 -0
  18. package/dist/auth/passwords.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +13 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +261 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/auth.d.ts +4 -0
  24. package/dist/cli/commands/auth.d.ts.map +1 -0
  25. package/dist/cli/commands/auth.js +77 -0
  26. package/dist/cli/commands/auth.js.map +1 -0
  27. package/dist/cli/commands/context.d.ts +5 -0
  28. package/dist/cli/commands/context.d.ts.map +1 -0
  29. package/dist/cli/commands/context.js +162 -0
  30. package/dist/cli/commands/context.js.map +1 -0
  31. package/dist/cli/commands/sync.d.ts +2 -0
  32. package/dist/cli/commands/sync.d.ts.map +1 -0
  33. package/dist/cli/commands/sync.js +58 -0
  34. package/dist/cli/commands/sync.js.map +1 -0
  35. package/dist/cli/index.js +75 -1
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/ui/banner.js +2 -2
  38. package/dist/config/credentials.d.ts +10 -0
  39. package/dist/config/credentials.d.ts.map +1 -0
  40. package/dist/config/credentials.js +33 -0
  41. package/dist/config/credentials.js.map +1 -0
  42. package/dist/config/defaults.d.ts.map +1 -1
  43. package/dist/config/defaults.js +2 -0
  44. package/dist/config/defaults.js.map +1 -1
  45. package/dist/constants.d.ts +5 -0
  46. package/dist/constants.d.ts.map +1 -0
  47. package/dist/constants.js +5 -0
  48. package/dist/constants.js.map +1 -0
  49. package/dist/context/chunker.d.ts +2 -0
  50. package/dist/context/chunker.d.ts.map +1 -0
  51. package/dist/context/chunker.js +81 -0
  52. package/dist/context/chunker.js.map +1 -0
  53. package/dist/context/index.d.ts +26 -0
  54. package/dist/context/index.d.ts.map +1 -0
  55. package/dist/context/index.js +97 -0
  56. package/dist/context/index.js.map +1 -0
  57. package/dist/core/registry.d.ts +3 -1
  58. package/dist/core/registry.d.ts.map +1 -1
  59. package/dist/core/registry.js +8 -6
  60. package/dist/core/registry.js.map +1 -1
  61. package/dist/core/secrets.d.ts +4 -0
  62. package/dist/core/secrets.d.ts.map +1 -0
  63. package/dist/core/secrets.js +40 -0
  64. package/dist/core/secrets.js.map +1 -0
  65. package/dist/core/server-manager.js +1 -1
  66. package/dist/dashboard/assets/index-BNOtcUPs.js +257 -0
  67. package/dist/dashboard/assets/index-Duwp34GW.css +1 -0
  68. package/dist/dashboard/index.html +14 -0
  69. package/dist/index.d.ts +13 -2
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +18 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/integrations/github.d.ts +5 -0
  74. package/dist/integrations/github.d.ts.map +1 -0
  75. package/dist/integrations/github.js +63 -0
  76. package/dist/integrations/github.js.map +1 -0
  77. package/dist/integrations/slack.d.ts +21 -0
  78. package/dist/integrations/slack.d.ts.map +1 -0
  79. package/dist/integrations/slack.js +61 -0
  80. package/dist/integrations/slack.js.map +1 -0
  81. package/dist/monitoring/tracker.d.ts +31 -0
  82. package/dist/monitoring/tracker.d.ts.map +1 -0
  83. package/dist/monitoring/tracker.js +86 -0
  84. package/dist/monitoring/tracker.js.map +1 -0
  85. package/dist/server/app.d.ts.map +1 -1
  86. package/dist/server/app.js +46 -0
  87. package/dist/server/app.js.map +1 -1
  88. package/dist/server/mcp-gateway.js +1 -1
  89. package/dist/server/routes/auth.d.ts +4 -0
  90. package/dist/server/routes/auth.d.ts.map +1 -0
  91. package/dist/server/routes/auth.js +117 -0
  92. package/dist/server/routes/auth.js.map +1 -0
  93. package/dist/server/routes/context.d.ts +4 -0
  94. package/dist/server/routes/context.d.ts.map +1 -0
  95. package/dist/server/routes/context.js +107 -0
  96. package/dist/server/routes/context.js.map +1 -0
  97. package/dist/server/routes/health.js +1 -1
  98. package/dist/server/routes/stats.d.ts +4 -0
  99. package/dist/server/routes/stats.d.ts.map +1 -0
  100. package/dist/server/routes/stats.js +97 -0
  101. package/dist/server/routes/stats.js.map +1 -0
  102. package/dist/server/routes/team-servers.d.ts +4 -0
  103. package/dist/server/routes/team-servers.d.ts.map +1 -0
  104. package/dist/server/routes/team-servers.js +108 -0
  105. package/dist/server/routes/team-servers.js.map +1 -0
  106. package/dist/server/routes/webhooks.d.ts +4 -0
  107. package/dist/server/routes/webhooks.d.ts.map +1 -0
  108. package/dist/server/routes/webhooks.js +77 -0
  109. package/dist/server/routes/webhooks.js.map +1 -0
  110. package/dist/storage/database.d.ts +10 -3
  111. package/dist/storage/database.d.ts.map +1 -1
  112. package/dist/storage/database.js +269 -115
  113. package/dist/storage/database.js.map +1 -1
  114. package/dist/types/index.d.ts +102 -0
  115. package/dist/types/index.d.ts.map +1 -1
  116. package/dist/types/index.js +8 -0
  117. package/dist/types/index.js.map +1 -1
  118. 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 data;
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":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA2BtH,qBAAa,QAAQ;IACnB,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;IAKP,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ;IAkBxC,MAAM,CAAC,QAAQ,IAAI,QAAQ;IAI3B,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAMb,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAiB3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,GAAG,IAAI;IAkBpF,aAAa,IAAI;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,EAAE;IAOvE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAenC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAWnF,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;IAahG,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;IA4B5I,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIvC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IAMnD,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;IAgC9E,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAS7C,SAAS,IAAI,MAAM;CAGpB"}
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"}
@@ -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
- function emptyStore() {
5
- return { version: 1, servers: {}, tools: {} };
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
- // --- JSON File Database ---
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
- data;
149
+ db;
10
150
  filePath;
11
- constructor(filePath, data) {
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
- let data;
158
+ const SqlJs = await getSqlJs();
159
+ let db;
19
160
  if (existsSync(resolved)) {
20
- try {
21
- data = JSON.parse(readFileSync(resolved, 'utf-8'));
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
- catch {
24
- data = emptyStore();
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
- data = emptyStore();
178
+ db = new SqlJs.Database();
29
179
  }
30
- return new Database(resolved, data);
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
- return new Database(null, emptyStore());
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
- writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));
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.data.servers[config.name] = {
48
- config,
49
- status: existing?.status || 'disconnected',
50
- serverInfo: existing?.serverInfo || null,
51
- toolCount: existing?.toolCount || 0,
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 record = this.data.servers[name];
61
- if (!record)
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
- return Object.keys(this.data.servers)
78
- .sort()
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
- if (!this.data.servers[name])
84
- return false;
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
- const record = this.data.servers[name];
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
- const record = this.data.servers[name];
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.data.tools[id] = {
128
- id,
129
- serverName,
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
- return this.data.tools[id] || null;
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 Object.values(this.data.tools)
145
- .filter(t => t.serverName === serverName)
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 Object.values(this.data.tools)
150
- .sort((a, b) => a.serverName.localeCompare(b.serverName) || a.name.localeCompare(b.name));
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 = Object.values(this.data.tools);
157
- const scored = tools.map(tool => {
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
- // Server name contains term
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
- for (const [id, tool] of Object.entries(this.data.tools)) {
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
- return Object.keys(this.data.tools).length;
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":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}