opalserve 3.1.0 → 3.1.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 (44) hide show
  1. package/README.md +52 -44
  2. package/dist/auth/api-keys.d.ts +8 -0
  3. package/dist/auth/api-keys.d.ts.map +1 -1
  4. package/dist/auth/api-keys.js +62 -2
  5. package/dist/auth/api-keys.js.map +1 -1
  6. package/dist/auth/index.d.ts +1 -1
  7. package/dist/auth/index.d.ts.map +1 -1
  8. package/dist/auth/index.js +1 -1
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/auth/middleware.d.ts.map +1 -1
  11. package/dist/auth/middleware.js +3 -11
  12. package/dist/auth/middleware.js.map +1 -1
  13. package/dist/config/defaults.d.ts +1 -0
  14. package/dist/config/defaults.d.ts.map +1 -1
  15. package/dist/config/defaults.js +3 -0
  16. package/dist/config/defaults.js.map +1 -1
  17. package/dist/constants.d.ts +1 -1
  18. package/dist/constants.js +1 -1
  19. package/dist/server/app.d.ts.map +1 -1
  20. package/dist/server/app.js +34 -1
  21. package/dist/server/app.js.map +1 -1
  22. package/dist/server/routes/_schemas.d.ts +116 -0
  23. package/dist/server/routes/_schemas.d.ts.map +1 -0
  24. package/dist/server/routes/_schemas.js +53 -0
  25. package/dist/server/routes/_schemas.js.map +1 -0
  26. package/dist/server/routes/auth.d.ts.map +1 -1
  27. package/dist/server/routes/auth.js +28 -14
  28. package/dist/server/routes/auth.js.map +1 -1
  29. package/dist/server/routes/context.d.ts.map +1 -1
  30. package/dist/server/routes/context.js +14 -7
  31. package/dist/server/routes/context.js.map +1 -1
  32. package/dist/server/routes/servers.d.ts.map +1 -1
  33. package/dist/server/routes/servers.js +12 -7
  34. package/dist/server/routes/servers.js.map +1 -1
  35. package/dist/server/routes/stats.d.ts.map +1 -1
  36. package/dist/server/routes/stats.js +26 -5
  37. package/dist/server/routes/stats.js.map +1 -1
  38. package/dist/server/routes/team-servers.d.ts.map +1 -1
  39. package/dist/server/routes/team-servers.js +7 -6
  40. package/dist/server/routes/team-servers.js.map +1 -1
  41. package/dist/server/routes/tools.d.ts.map +1 -1
  42. package/dist/server/routes/tools.js +26 -12
  43. package/dist/server/routes/tools.js.map +1 -1
  44. package/package.json +93 -91
package/README.md CHANGED
@@ -22,16 +22,16 @@
22
22
 
23
23
  ## Feature Highlights
24
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 |
25
+ | | Feature | Status | Description |
26
+ |---|---|---|---|
27
+ | :books: | **Team MCP Registry** | ✅ Stable | Admin registers servers once; every developer pulls them with `opalserve sync` |
28
+ | :brain: | **Shared Knowledge Base** | ⚙️ Keyword search today; semantic graph (Graphiti) lands in v3.3 | Upload docs, search via the `opalserve_search` MCP tool from any connected client |
29
+ | :bar_chart: | **Usage Analytics Dashboard** | 🚧 Dashboard ships; live event ingestion lands in v3.3 | React SPA renders the analytics surface; full event capture is the v3.3 milestone |
30
+ | :lock: | **Auth & Access Control** | ✅ Stable (v3.1.1 hardened) | User accounts (scrypt-hashed), HMAC-secured API keys, per-IP/key rate limits. Per-role tool-permission enforcement targets v3.3 |
31
+ | :electric_plug: | **GitHub + Slack Integrations** | ⚙️ Webhook handlers ship; signature verification lands in v3.2 | Webhooks accept events; Slack slash command returns search results |
32
+ | :globe_with_meridians: | **MCP Gateway** | ✅ Stable (stdio); SSE/HTTP transports targeted for v3.3 | OpalServe is itself an MCP server connect any MCP client over stdio today |
33
+ | :art: | **Beautiful CLI** | ✅ Stable | Interactive setup wizard, gradient banners, color-coded tables, 20+ commands |
34
+ | :seedling: | **100% Open Source** | ✅ Stable | MIT licensed, self-host for free, no vendor lock-in |
35
35
 
36
36
  ---
37
37
 
@@ -78,11 +78,11 @@
78
78
 
79
79
  ---
80
80
 
81
- ## Quick Start
82
-
83
- ```bash
84
- # 1. Install globally
85
- npm install -g opalserve
81
+ ## Quick Start
82
+
83
+ ```bash
84
+ # 1. Install globally
85
+ npm install -g opalserve
86
86
 
87
87
  # 2. Run the interactive setup wizard
88
88
  opalserve init
@@ -94,35 +94,43 @@ opalserve start
94
94
  opalserve server add --name files --stdio "npx -y @modelcontextprotocol/server-filesystem ."
95
95
 
96
96
  # 5. Discover available tools
97
- opalserve tools search "read file"
98
- ```
99
-
100
- > **Tip:** OpalServe runs on port **3456** by default. The dashboard ships inside the npm package and is served from `http://localhost:3456/dashboard` after starting.
101
-
102
- ## Trust Check
103
-
104
- OpalServe 3.1.0 is the trust-launch release: runtime versions, package metadata, docs, CI, and dashboard packaging are aligned so the install path matches the README.
105
-
106
- ```bash
107
- opalserve --version
108
- # 3.1.0
109
-
110
- opalserve start
111
- # HTTP API http://127.0.0.1:3456
112
- # Dashboard http://127.0.0.1:3456/dashboard
113
- ```
114
-
115
- For source builds, the same release checks are used locally and in CI:
116
-
117
- ```bash
118
- pnpm typecheck
119
- pnpm lint
120
- pnpm test
121
- pnpm build
122
- pnpm pack --dry-run
123
- ```
124
-
125
- ---
97
+ opalserve tools search "read file"
98
+ ```
99
+
100
+ > **Tip:** OpalServe runs on port **3456** by default. The dashboard ships inside the npm package and is served from `http://localhost:3456/dashboard` after starting.
101
+
102
+ ## Trust Check
103
+
104
+ OpalServe 3.1.1 the **Trust Patch** hardens the auth and HTTP surface:
105
+
106
+ - **API keys** now use HMAC-SHA256 with a per-installation server secret (was unsalted SHA-256). Legacy keys are rehashed transparently on first use.
107
+ - **Auth bypass** (env-var fallback that silently disabled auth in non-team mode) removed. The registry's mode is now the single source of truth.
108
+ - **Zod validation** is enforced on every HTTP route. Raw `request.body as { ... }` casts are gone.
109
+ - **Rate limiting** via `@fastify/rate-limit`: 200 req/min global per IP/key; 10 req/min on `/auth/register` and `/auth/login`.
110
+ - **Helmet** wired into Fastify (not just the Vercel docs layer); CORS narrowed from wildcard ports to a strict regex with optional allowlist via `OPALSERVE_CORS_ORIGINS`.
111
+
112
+ Disclosure policy: see [SECURITY.md](SECURITY.md).
113
+
114
+ ```bash
115
+ opalserve --version
116
+ # 3.1.0
117
+
118
+ opalserve start
119
+ # HTTP API http://127.0.0.1:3456
120
+ # Dashboard http://127.0.0.1:3456/dashboard
121
+ ```
122
+
123
+ For source builds, the same release checks are used locally and in CI:
124
+
125
+ ```bash
126
+ pnpm typecheck
127
+ pnpm lint
128
+ pnpm test
129
+ pnpm build
130
+ pnpm pack --dry-run
131
+ ```
132
+
133
+ ---
126
134
 
127
135
  ## Team Mode Setup
128
136
 
@@ -1,7 +1,15 @@
1
+ import type { Database } from '../storage/database.js';
1
2
  export declare function generateApiKey(): {
2
3
  key: string;
3
4
  keyHash: string;
4
5
  keyPrefix: string;
5
6
  };
6
7
  export declare function hashApiKey(key: string): string;
8
+ export declare function safeEqualHex(a: string, b: string): boolean;
9
+ export interface ApiKeyLookupResult {
10
+ id: string;
11
+ user_id: string;
12
+ expires_at: string | null;
13
+ }
14
+ export declare function lookupApiKey(db: Database, presentedKey: string): ApiKeyLookupResult | null;
7
15
  //# sourceMappingURL=api-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../src/auth/api-keys.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMpF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C"}
1
+ {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../src/auth/api-keys.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAkCvD,wBAAgB,cAAc,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMpF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAMD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAkB1F"}
@@ -1,12 +1,72 @@
1
- import { randomBytes, createHash } from 'node:crypto';
1
+ import { randomBytes, createHash, createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ import { getApiKeySecretPath } from '../config/defaults.js';
5
+ let cachedSecret = null;
6
+ function getServerSecret() {
7
+ if (cachedSecret)
8
+ return cachedSecret;
9
+ const fromEnv = process.env.OPALSERVE_API_KEY_SECRET;
10
+ if (fromEnv) {
11
+ if (!/^[0-9a-f]{64}$/i.test(fromEnv)) {
12
+ throw new Error('OPALSERVE_API_KEY_SECRET must be a 64-character hex string (256 bits)');
13
+ }
14
+ cachedSecret = Buffer.from(fromEnv, 'hex');
15
+ return cachedSecret;
16
+ }
17
+ const path = getApiKeySecretPath();
18
+ if (existsSync(path)) {
19
+ const content = readFileSync(path, 'utf8').trim();
20
+ if (!/^[0-9a-f]{64}$/i.test(content)) {
21
+ throw new Error(`Invalid API key secret in ${path}; expected 64 hex chars`);
22
+ }
23
+ cachedSecret = Buffer.from(content, 'hex');
24
+ return cachedSecret;
25
+ }
26
+ const secret = randomBytes(32);
27
+ mkdirSync(dirname(path), { recursive: true });
28
+ writeFileSync(path, secret.toString('hex'), { mode: 0o600 });
29
+ try {
30
+ chmodSync(path, 0o600);
31
+ }
32
+ catch { /* Windows lacks chmod semantics */ }
33
+ cachedSecret = secret;
34
+ return cachedSecret;
35
+ }
2
36
  export function generateApiKey() {
3
- const random = randomBytes(16).toString('hex'); // 32 hex chars
37
+ const random = randomBytes(16).toString('hex');
4
38
  const key = `opal_${random}`;
5
39
  const keyHash = hashApiKey(key);
6
40
  const keyPrefix = key.slice(0, 8);
7
41
  return { key, keyHash, keyPrefix };
8
42
  }
9
43
  export function hashApiKey(key) {
44
+ return createHmac('sha256', getServerSecret()).update(key).digest('hex');
45
+ }
46
+ function legacyHashApiKey(key) {
10
47
  return createHash('sha256').update(key).digest('hex');
11
48
  }
49
+ export function safeEqualHex(a, b) {
50
+ if (a.length !== b.length)
51
+ return false;
52
+ try {
53
+ return timingSafeEqual(Buffer.from(a, 'hex'), Buffer.from(b, 'hex'));
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ export function lookupApiKey(db, presentedKey) {
60
+ const newHash = hashApiKey(presentedKey);
61
+ let row = db.get('SELECT id, user_id, expires_at FROM api_keys WHERE key_hash = ?', [newHash]);
62
+ if (row)
63
+ return row;
64
+ const legacyHash = legacyHashApiKey(presentedKey);
65
+ row = db.get('SELECT id, user_id, expires_at FROM api_keys WHERE key_hash = ?', [legacyHash]);
66
+ if (row) {
67
+ db.run('UPDATE api_keys SET key_hash = ? WHERE id = ?', [newHash, row.id]);
68
+ return row;
69
+ }
70
+ return null;
71
+ }
12
72
  //# sourceMappingURL=api-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/auth/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe;IAC/D,MAAM,GAAG,GAAG,QAAQ,MAAM,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/auth/api-keys.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export { hashPassword, verifyPassword } from './passwords.js';
2
- export { generateApiKey, hashApiKey } from './api-keys.js';
2
+ export { generateApiKey, hashApiKey, lookupApiKey, safeEqualHex } from './api-keys.js';
3
3
  export { createAuthMiddleware, registerAuthDecorator } from './middleware.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { hashPassword, verifyPassword } from './passwords.js';
2
- export { generateApiKey, hashApiKey } from './api-keys.js';
2
+ export { generateApiKey, hashApiKey, lookupApiKey, safeEqualHex } from './api-keys.js';
3
3
  export { createAuthMiddleware, registerAuthDecorator } from './middleware.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb;CACF;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,IAChB,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAsD5F;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAEhE"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb;CACF;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,IAChB,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAyC5F;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAEhE"}
@@ -1,30 +1,22 @@
1
- import { hashApiKey } from './api-keys.js';
1
+ import { lookupApiKey } from './api-keys.js';
2
2
  export function createAuthMiddleware(db) {
3
3
  return async function authHook(request, reply) {
4
- // In local mode, skip auth entirely
5
- const mode = process.env.OPALSERVE_MODE || 'local';
6
- if (mode === 'local') {
7
- return;
8
- }
9
4
  const authHeader = request.headers.authorization;
10
5
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
11
6
  reply.code(401).send({ ok: false, error: 'Missing or invalid Authorization header' });
12
7
  return;
13
8
  }
14
9
  const key = authHeader.slice(7);
15
- const keyHash = hashApiKey(key);
16
- const row = db.get('SELECT user_id, expires_at FROM api_keys WHERE key_hash = ?', [keyHash]);
10
+ const row = lookupApiKey(db, key);
17
11
  if (!row) {
18
12
  reply.code(401).send({ ok: false, error: 'Invalid API key' });
19
13
  return;
20
14
  }
21
- // Check expiry
22
15
  if (row.expires_at && new Date(row.expires_at) < new Date()) {
23
16
  reply.code(401).send({ ok: false, error: 'API key has expired' });
24
17
  return;
25
18
  }
26
- // Update last_used_at
27
- db.run('UPDATE api_keys SET last_used_at = datetime("now") WHERE key_hash = ?', [keyHash]);
19
+ db.run('UPDATE api_keys SET last_used_at = datetime("now") WHERE id = ?', [row.id]);
28
20
  // Load user
29
21
  const user = db.get('SELECT id, email, display_name, created_at, updated_at FROM users WHERE id = ?', [row.user_id]);
30
22
  if (!user) {
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,OAAO,KAAK,UAAU,QAAQ,CAAC,OAAuB,EAAE,KAAmB;QACzE,oCAAoC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;QACnD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAChB,6DAA6D,EAC7D,CAAC,OAAO,CAAC,CACV,CAAC;QAEF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,eAAe;QACf,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,EAAE,CAAC,GAAG,CAAC,uEAAuE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAE3F,YAAY;QACZ,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CACjB,gFAAgF,EAChF,CAAC,GAAG,CAAC,OAAO,CAAC,CACd,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,GAAG;YACb,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,OAAO,KAAK,UAAU,QAAQ,CAAC,OAAuB,EAAE,KAAmB;QACzE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,EAAE,CAAC,GAAG,CAAC,iEAAiE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpF,YAAY;QACZ,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CACjB,gFAAgF,EAChF,CAAC,GAAG,CAAC,OAAO,CAAC,CACd,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,GAAG;YACb,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { OpalServeConfig } from '../types/index.js';
2
2
  export declare function getConfigDir(): string;
3
3
  export declare function getDefaultDbPath(): string;
4
+ export declare function getApiKeySecretPath(): string;
4
5
  export declare function getDefaultConfig(): OpalServeConfig;
5
6
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CASlD"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CASlD"}
@@ -7,6 +7,9 @@ export function getConfigDir() {
7
7
  export function getDefaultDbPath() {
8
8
  return join(OPALSERVE_DIR, 'data.db');
9
9
  }
10
+ export function getApiKeySecretPath() {
11
+ return join(OPALSERVE_DIR, 'api-key-secret');
12
+ }
10
13
  export function getDefaultConfig() {
11
14
  return {
12
15
  mode: 'local',
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACrB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACrB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "3.1.0";
1
+ export declare const VERSION = "3.1.1";
2
2
  export declare const APP_NAME = "opalserve";
3
3
  export declare const DEFAULT_PORT = 3456;
4
4
  export declare const DEFAULT_HOST = "127.0.0.1";
package/dist/constants.js CHANGED
@@ -1,4 +1,4 @@
1
- export const VERSION = '3.1.0';
1
+ export const VERSION = '3.1.1';
2
2
  export const APP_NAME = 'opalserve';
3
3
  export const DEFAULT_PORT = 3456;
4
4
  export const DEFAULT_HOST = '127.0.0.1';
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAgB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,sSA8D7D;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,sSAW3C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAkB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,sSA6F7D;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,sSAW3C"}
@@ -1,5 +1,7 @@
1
1
  import Fastify from 'fastify';
2
2
  import cors from '@fastify/cors';
3
+ import helmet from '@fastify/helmet';
4
+ import rateLimit from '@fastify/rate-limit';
3
5
  import fastifyStatic from '@fastify/static';
4
6
  import { join, dirname } from 'node:path';
5
7
  import { fileURLToPath } from 'node:url';
@@ -19,8 +21,39 @@ export async function createServer(registry) {
19
21
  const app = Fastify({
20
22
  logger: false, // We use our own pino logger
21
23
  });
24
+ await app.register(helmet, {
25
+ contentSecurityPolicy: false,
26
+ crossOriginEmbedderPolicy: false,
27
+ crossOriginResourcePolicy: { policy: 'same-site' },
28
+ });
22
29
  await app.register(cors, {
23
- origin: ['http://localhost:*', 'http://127.0.0.1:*'],
30
+ origin: (origin, cb) => {
31
+ if (!origin)
32
+ return cb(null, true);
33
+ if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d{1,5})?$/.test(origin)) {
34
+ return cb(null, true);
35
+ }
36
+ const extra = (process.env.OPALSERVE_CORS_ORIGINS ?? '')
37
+ .split(',')
38
+ .map(s => s.trim())
39
+ .filter(Boolean);
40
+ if (extra.includes(origin))
41
+ return cb(null, true);
42
+ return cb(new Error('Origin not allowed'), false);
43
+ },
44
+ credentials: false,
45
+ });
46
+ await app.register(rateLimit, {
47
+ global: true,
48
+ max: 200,
49
+ timeWindow: '1 minute',
50
+ skipOnError: true,
51
+ keyGenerator: (request) => {
52
+ const apiKey = request.headers.authorization?.startsWith('Bearer ')
53
+ ? request.headers.authorization.slice(7)
54
+ : null;
55
+ return apiKey ? `key:${apiKey.slice(0, 12)}` : `ip:${request.ip}`;
56
+ },
24
57
  });
25
58
  // Register the user decorator so request.user is available
26
59
  registerAuthDecorator(app);
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { z } from 'zod';
2
+ export declare const EmailSchema: z.ZodString;
3
+ export declare const PasswordSchema: z.ZodString;
4
+ export declare const RegisterBody: z.ZodObject<{
5
+ email: z.ZodString;
6
+ password: z.ZodString;
7
+ displayName: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ email: string;
10
+ password: string;
11
+ displayName?: string | undefined;
12
+ }, {
13
+ email: string;
14
+ password: string;
15
+ displayName?: string | undefined;
16
+ }>;
17
+ export declare const LoginBody: z.ZodObject<{
18
+ email: z.ZodString;
19
+ password: z.ZodString;
20
+ }, "strip", z.ZodTypeAny, {
21
+ email: string;
22
+ password: string;
23
+ }, {
24
+ email: string;
25
+ password: string;
26
+ }>;
27
+ export declare const ApiKeyCreateBody: z.ZodObject<{
28
+ name: z.ZodString;
29
+ }, "strip", z.ZodTypeAny, {
30
+ name: string;
31
+ }, {
32
+ name: string;
33
+ }>;
34
+ export declare const UuidParam: z.ZodObject<{
35
+ id: z.ZodString;
36
+ }, "strip", z.ZodTypeAny, {
37
+ id: string;
38
+ }, {
39
+ id: string;
40
+ }>;
41
+ export declare const NameParam: z.ZodObject<{
42
+ name: z.ZodString;
43
+ }, "strip", z.ZodTypeAny, {
44
+ name: string;
45
+ }, {
46
+ name: string;
47
+ }>;
48
+ export declare const ContextDocBody: z.ZodObject<{
49
+ title: z.ZodString;
50
+ content: z.ZodString;
51
+ contentType: z.ZodOptional<z.ZodString>;
52
+ source: z.ZodOptional<z.ZodString>;
53
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ title: string;
56
+ content: string;
57
+ tags?: string[] | undefined;
58
+ contentType?: string | undefined;
59
+ source?: string | undefined;
60
+ }, {
61
+ title: string;
62
+ content: string;
63
+ tags?: string[] | undefined;
64
+ contentType?: string | undefined;
65
+ source?: string | undefined;
66
+ }>;
67
+ export declare const SearchQuery: z.ZodObject<{
68
+ q: z.ZodString;
69
+ }, "strip", z.ZodTypeAny, {
70
+ q: string;
71
+ }, {
72
+ q: string;
73
+ }>;
74
+ export declare const ToolsQuery: z.ZodObject<{
75
+ server: z.ZodOptional<z.ZodString>;
76
+ }, "strip", z.ZodTypeAny, {
77
+ server?: string | undefined;
78
+ }, {
79
+ server?: string | undefined;
80
+ }>;
81
+ export declare const ToolsSearchQuery: z.ZodObject<{
82
+ q: z.ZodString;
83
+ limit: z.ZodOptional<z.ZodNumber>;
84
+ server: z.ZodOptional<z.ZodString>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ q: string;
87
+ server?: string | undefined;
88
+ limit?: number | undefined;
89
+ }, {
90
+ q: string;
91
+ server?: string | undefined;
92
+ limit?: number | undefined;
93
+ }>;
94
+ export declare const PeriodQuery: z.ZodObject<{
95
+ period: z.ZodOptional<z.ZodString>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ period?: string | undefined;
98
+ }, {
99
+ period?: string | undefined;
100
+ }>;
101
+ export declare const ToolIdParam: z.ZodObject<{
102
+ id: z.ZodString;
103
+ }, "strip", z.ZodTypeAny, {
104
+ id: string;
105
+ }, {
106
+ id: string;
107
+ }>;
108
+ export interface ValidationFailureReply {
109
+ status(code: number): {
110
+ send(body: unknown): unknown;
111
+ };
112
+ }
113
+ export declare function sendValidationError(reply: ValidationFailureReply, message: string, zodError?: {
114
+ flatten: () => unknown;
115
+ }): unknown;
116
+ //# sourceMappingURL=_schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schemas.d.ts","sourceRoot":"","sources":["../../../src/server/routes/_schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW,aAA8B,CAAC;AACvD,eAAO,MAAM,cAAc,aAA6B,CAAC;AAEzD,eAAO,MAAM,YAAY;;;;;;;;;;;;EAIvB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;EAGpB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;EAE3B,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;EAEpB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;EAEpB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAMzB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;EAEtB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;EAErB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAI3B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;EAEtB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;EAEtB,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,CAAC;CACxD;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,GACpC,OAAO,CAMT"}
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ export const EmailSchema = z.string().email().max(254);
3
+ export const PasswordSchema = z.string().min(8).max(256);
4
+ export const RegisterBody = z.object({
5
+ email: EmailSchema,
6
+ password: PasswordSchema,
7
+ displayName: z.string().min(1).max(100).optional(),
8
+ });
9
+ export const LoginBody = z.object({
10
+ email: EmailSchema,
11
+ password: z.string().min(1).max(256),
12
+ });
13
+ export const ApiKeyCreateBody = z.object({
14
+ name: z.string().min(1).max(100),
15
+ });
16
+ export const UuidParam = z.object({
17
+ id: z.string().uuid(),
18
+ });
19
+ export const NameParam = z.object({
20
+ name: z.string().min(1).max(200).regex(/^[a-zA-Z0-9_\-.]+$/, 'Invalid name'),
21
+ });
22
+ export const ContextDocBody = z.object({
23
+ title: z.string().min(1).max(500),
24
+ content: z.string().min(1).max(1_000_000),
25
+ contentType: z.string().max(100).optional(),
26
+ source: z.string().max(2048).optional(),
27
+ tags: z.array(z.string().max(100)).max(50).optional(),
28
+ });
29
+ export const SearchQuery = z.object({
30
+ q: z.string().min(1).max(500),
31
+ });
32
+ export const ToolsQuery = z.object({
33
+ server: z.string().max(500).optional(),
34
+ });
35
+ export const ToolsSearchQuery = z.object({
36
+ q: z.string().min(1).max(500),
37
+ limit: z.coerce.number().int().min(1).max(100).optional(),
38
+ server: z.string().max(500).optional(),
39
+ });
40
+ export const PeriodQuery = z.object({
41
+ period: z.string().regex(/^\d+(h|d|w|m)$/, 'Period must look like 24h, 7d, 4w, 3m').optional(),
42
+ });
43
+ export const ToolIdParam = z.object({
44
+ id: z.string().min(1).max(500),
45
+ });
46
+ export function sendValidationError(reply, message, zodError) {
47
+ return reply.status(400).send({
48
+ ok: false,
49
+ error: message,
50
+ details: zodError?.flatten(),
51
+ });
52
+ }
53
+ //# sourceMappingURL=_schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schemas.js","sourceRoot":"","sources":["../../../src/server/routes/_schemas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAKhE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CA+J1F"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAYhE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAsK1F"}