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
package/assets/logo.svg
CHANGED
|
@@ -1,54 +1,51 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
|
|
2
2
|
<defs>
|
|
3
|
-
<linearGradient id="
|
|
3
|
+
<linearGradient id="hub-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
4
|
<stop offset="0%" stop-color="#F59E0B"/>
|
|
5
|
-
<stop offset="
|
|
6
|
-
<stop offset="65%" stop-color="#EF4444"/>
|
|
5
|
+
<stop offset="50%" stop-color="#F97316"/>
|
|
7
6
|
<stop offset="100%" stop-color="#8B5CF6"/>
|
|
8
7
|
</linearGradient>
|
|
9
|
-
<linearGradient id="
|
|
10
|
-
<stop offset="0%" stop-color="#
|
|
11
|
-
<stop offset="
|
|
12
|
-
<stop offset="100%" stop-color="#FFFFFF" stop-opacity="0"/>
|
|
8
|
+
<linearGradient id="line-gradient-top" x1="256" y1="256" x2="256" y2="80" gradientUnits="userSpaceOnUse">
|
|
9
|
+
<stop offset="0%" stop-color="#F97316"/>
|
|
10
|
+
<stop offset="100%" stop-color="#F59E0B"/>
|
|
13
11
|
</linearGradient>
|
|
14
|
-
<linearGradient id="
|
|
15
|
-
<stop offset="0%" stop-color="#
|
|
16
|
-
<stop offset="100%" stop-color="#
|
|
12
|
+
<linearGradient id="line-gradient-right" x1="256" y1="256" x2="432" y2="316" gradientUnits="userSpaceOnUse">
|
|
13
|
+
<stop offset="0%" stop-color="#F97316"/>
|
|
14
|
+
<stop offset="100%" stop-color="#8B5CF6"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
<linearGradient id="line-gradient-bottom" x1="256" y1="256" x2="256" y2="432" gradientUnits="userSpaceOnUse">
|
|
17
|
+
<stop offset="0%" stop-color="#F97316"/>
|
|
18
|
+
<stop offset="100%" stop-color="#8B5CF6"/>
|
|
19
|
+
</linearGradient>
|
|
20
|
+
<linearGradient id="line-gradient-left" x1="256" y1="256" x2="80" y2="196" gradientUnits="userSpaceOnUse">
|
|
21
|
+
<stop offset="0%" stop-color="#F97316"/>
|
|
22
|
+
<stop offset="100%" stop-color="#F59E0B"/>
|
|
17
23
|
</linearGradient>
|
|
18
24
|
</defs>
|
|
19
25
|
|
|
20
|
-
<!--
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
/>
|
|
26
|
+
<!-- Connection lines from hub to satellites -->
|
|
27
|
+
<line x1="256" y1="256" x2="256" y2="88" stroke="url(#line-gradient-top)" stroke-width="6" stroke-linecap="round" opacity="0.6"/>
|
|
28
|
+
<line x1="256" y1="256" x2="424" y2="316" stroke="url(#line-gradient-right)" stroke-width="6" stroke-linecap="round" opacity="0.6"/>
|
|
29
|
+
<line x1="256" y1="256" x2="256" y2="424" stroke="url(#line-gradient-bottom)" stroke-width="6" stroke-linecap="round" opacity="0.6"/>
|
|
30
|
+
<line x1="256" y1="256" x2="88" y2="196" stroke="url(#line-gradient-left)" stroke-width="6" stroke-linecap="round" opacity="0.6"/>
|
|
31
|
+
|
|
32
|
+
<!-- Satellite nodes -->
|
|
33
|
+
<circle cx="256" cy="88" r="28" fill="#F59E0B" opacity="0.5"/>
|
|
34
|
+
<circle cx="256" cy="88" r="18" fill="#F59E0B" opacity="0.85"/>
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
<
|
|
28
|
-
points="256,32 432,128 256,192 80,128"
|
|
29
|
-
fill="url(#opal-shine)"
|
|
30
|
-
/>
|
|
36
|
+
<circle cx="424" cy="316" r="28" fill="#8B5CF6" opacity="0.5"/>
|
|
37
|
+
<circle cx="424" cy="316" r="18" fill="#8B5CF6" opacity="0.85"/>
|
|
31
38
|
|
|
32
|
-
|
|
33
|
-
<
|
|
34
|
-
points="80,128 256,192 256,380 80,320"
|
|
35
|
-
fill="url(#facet-light)"
|
|
36
|
-
opacity="0.3"
|
|
37
|
-
/>
|
|
39
|
+
<circle cx="256" cy="424" r="28" fill="#8B5CF6" opacity="0.5"/>
|
|
40
|
+
<circle cx="256" cy="424" r="18" fill="#A855F7" opacity="0.85"/>
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
<
|
|
41
|
-
<line x1="256" y1="192" x2="160" y2="260" stroke="#FFFFFF" stroke-opacity="0.12" stroke-width="1.5"/>
|
|
42
|
-
<line x1="256" y1="192" x2="352" y2="260" stroke="#FFFFFF" stroke-opacity="0.12" stroke-width="1.5"/>
|
|
43
|
-
<line x1="256" y1="192" x2="180" y2="340" stroke="#FFFFFF" stroke-opacity="0.08" stroke-width="1"/>
|
|
44
|
-
<line x1="256" y1="192" x2="332" y2="340" stroke="#FFFFFF" stroke-opacity="0.08" stroke-width="1"/>
|
|
42
|
+
<circle cx="88" cy="196" r="28" fill="#F97316" opacity="0.5"/>
|
|
43
|
+
<circle cx="88" cy="196" r="18" fill="#F97316" opacity="0.85"/>
|
|
45
44
|
|
|
46
|
-
<!--
|
|
47
|
-
<circle cx="256" cy="
|
|
48
|
-
<circle cx="256" cy="
|
|
45
|
+
<!-- Central hub node -->
|
|
46
|
+
<circle cx="256" cy="256" r="64" fill="url(#hub-gradient)" opacity="0.2"/>
|
|
47
|
+
<circle cx="256" cy="256" r="48" fill="url(#hub-gradient)"/>
|
|
49
48
|
|
|
50
|
-
<!--
|
|
51
|
-
<circle cx="
|
|
52
|
-
<circle cx="310" cy="280" r="2.5" fill="#FFFFFF" opacity="0.25"/>
|
|
53
|
-
<circle cx="240" cy="320" r="2" fill="#FFFFFF" opacity="0.2"/>
|
|
49
|
+
<!-- Hub inner highlight -->
|
|
50
|
+
<circle cx="246" cy="246" r="20" fill="#FFFFFF" opacity="0.15"/>
|
|
54
51
|
</svg>
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
2
|
+
export function generateApiKey() {
|
|
3
|
+
const random = randomBytes(16).toString('hex'); // 32 hex chars
|
|
4
|
+
const key = `opal_${random}`;
|
|
5
|
+
const keyHash = hashApiKey(key);
|
|
6
|
+
const keyPrefix = key.slice(0, 8);
|
|
7
|
+
return { key, keyHash, keyPrefix };
|
|
8
|
+
}
|
|
9
|
+
export function hashApiKey(key) {
|
|
10
|
+
return createHash('sha256').update(key).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=api-keys.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
import type { Database } from '../storage/database.js';
|
|
3
|
+
import type { User } from '../types/index.js';
|
|
4
|
+
declare module 'fastify' {
|
|
5
|
+
interface FastifyRequest {
|
|
6
|
+
user?: User;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare function createAuthMiddleware(db: Database): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
10
|
+
export declare function registerAuthDecorator(app: FastifyInstance): void;
|
|
11
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { hashApiKey } from './api-keys.js';
|
|
2
|
+
export function createAuthMiddleware(db) {
|
|
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
|
+
const authHeader = request.headers.authorization;
|
|
10
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
11
|
+
reply.code(401).send({ ok: false, error: 'Missing or invalid Authorization header' });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
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]);
|
|
17
|
+
if (!row) {
|
|
18
|
+
reply.code(401).send({ ok: false, error: 'Invalid API key' });
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Check expiry
|
|
22
|
+
if (row.expires_at && new Date(row.expires_at) < new Date()) {
|
|
23
|
+
reply.code(401).send({ ok: false, error: 'API key has expired' });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Update last_used_at
|
|
27
|
+
db.run('UPDATE api_keys SET last_used_at = datetime("now") WHERE key_hash = ?', [keyHash]);
|
|
28
|
+
// Load user
|
|
29
|
+
const user = db.get('SELECT id, email, display_name, created_at, updated_at FROM users WHERE id = ?', [row.user_id]);
|
|
30
|
+
if (!user) {
|
|
31
|
+
reply.code(401).send({ ok: false, error: 'User not found' });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
request.user = {
|
|
35
|
+
id: user.id,
|
|
36
|
+
email: user.email,
|
|
37
|
+
displayName: user.display_name,
|
|
38
|
+
createdAt: user.created_at,
|
|
39
|
+
updatedAt: user.updated_at,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function registerAuthDecorator(app) {
|
|
44
|
+
app.decorateRequest('user', undefined);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passwords.d.ts","sourceRoot":"","sources":["../../src/auth/passwords.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpE;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAevF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
const SALT_LENGTH = 32;
|
|
3
|
+
const KEY_LENGTH = 64;
|
|
4
|
+
export async function hashPassword(password) {
|
|
5
|
+
const salt = randomBytes(SALT_LENGTH).toString('hex');
|
|
6
|
+
const hash = await new Promise((resolve, reject) => {
|
|
7
|
+
scrypt(password, salt, KEY_LENGTH, (err, derivedKey) => {
|
|
8
|
+
if (err)
|
|
9
|
+
reject(err);
|
|
10
|
+
else
|
|
11
|
+
resolve(derivedKey.toString('hex'));
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
return `${salt}:${hash}`;
|
|
15
|
+
}
|
|
16
|
+
export async function verifyPassword(password, stored) {
|
|
17
|
+
const [salt, storedHash] = stored.split(':');
|
|
18
|
+
if (!salt || !storedHash)
|
|
19
|
+
return false;
|
|
20
|
+
const hash = await new Promise((resolve, reject) => {
|
|
21
|
+
scrypt(password, salt, KEY_LENGTH, (err, derivedKey) => {
|
|
22
|
+
if (err)
|
|
23
|
+
reject(err);
|
|
24
|
+
else
|
|
25
|
+
resolve(derivedKey);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
const storedBuffer = Buffer.from(storedHash, 'hex');
|
|
29
|
+
if (hash.length !== storedBuffer.length)
|
|
30
|
+
return false;
|
|
31
|
+
return timingSafeEqual(hash, storedBuffer);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=passwords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passwords.js","sourceRoot":"","sources":["../../src/auth/passwords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;YACrD,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAc;IACnE,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;YACrD,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function adminInitCommand(): Promise<void>;
|
|
2
|
+
export declare function adminStatsCommand(): Promise<void>;
|
|
3
|
+
export declare function adminUsersCommand(): Promise<void>;
|
|
4
|
+
export declare function adminInviteCommand(email: string): Promise<void>;
|
|
5
|
+
export declare function adminLimitsCommand(options: {
|
|
6
|
+
set?: string;
|
|
7
|
+
list?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function adminPermissionsCommand(options: {
|
|
10
|
+
set?: string;
|
|
11
|
+
list?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DtD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyCvD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CvD;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrE;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEjG;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DtG"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { input } from '@inquirer/prompts';
|
|
4
|
+
import { showMiniBanner, showSuccess, showError, showInfo } from '../ui/banner.js';
|
|
5
|
+
import { OpalServeRegistry } from '../../core/registry.js';
|
|
6
|
+
import { hashPassword } from '../../auth/passwords.js';
|
|
7
|
+
import { generateApiKey } from '../../auth/api-keys.js';
|
|
8
|
+
export async function adminInitCommand() {
|
|
9
|
+
showMiniBanner();
|
|
10
|
+
try {
|
|
11
|
+
const teamName = await input({ message: 'Team name:' });
|
|
12
|
+
const adminEmail = await input({ message: 'Admin email:' });
|
|
13
|
+
const adminPassword = await input({ message: 'Admin password:' });
|
|
14
|
+
const displayName = await input({ message: 'Display name (optional):', default: '' });
|
|
15
|
+
const registry = await OpalServeRegistry.create();
|
|
16
|
+
const db = registry.getDatabase();
|
|
17
|
+
const now = new Date().toISOString();
|
|
18
|
+
// Create team
|
|
19
|
+
const teamId = randomUUID();
|
|
20
|
+
const slug = teamName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
|
|
21
|
+
db.run('INSERT INTO teams (id, name, slug, created_at) VALUES (?, ?, ?, ?)', [teamId, teamName, slug, now]);
|
|
22
|
+
// Create admin user
|
|
23
|
+
const userId = randomUUID();
|
|
24
|
+
const passwordHash = await hashPassword(adminPassword);
|
|
25
|
+
db.run('INSERT INTO users (id, email, password_hash, display_name, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)', [userId, adminEmail, passwordHash, displayName || null, now, now]);
|
|
26
|
+
// Add as team admin
|
|
27
|
+
db.run('INSERT INTO team_members (team_id, user_id, role, joined_at) VALUES (?, ?, ?, ?)', [teamId, userId, 'admin', now]);
|
|
28
|
+
// Generate API key
|
|
29
|
+
const { key, keyHash, keyPrefix } = generateApiKey();
|
|
30
|
+
const keyId = randomUUID();
|
|
31
|
+
db.run('INSERT INTO api_keys (id, user_id, key_hash, key_prefix, name, created_at) VALUES (?, ?, ?, ?, ?, ?)', [keyId, userId, keyHash, keyPrefix, 'admin-init', now]);
|
|
32
|
+
console.log('');
|
|
33
|
+
showSuccess(`Team "${chalk.bold(teamName)}" created`);
|
|
34
|
+
showSuccess(`Admin user ${chalk.bold(adminEmail)} created`);
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(` ${chalk.dim('Team ID:')} ${teamId}`);
|
|
37
|
+
console.log(` ${chalk.dim('User ID:')} ${userId}`);
|
|
38
|
+
console.log(` ${chalk.dim('API Key:')} ${chalk.yellow(key)}`);
|
|
39
|
+
console.log('');
|
|
40
|
+
showInfo('Save the API key above - it cannot be shown again.');
|
|
41
|
+
db.close();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function adminStatsCommand() {
|
|
49
|
+
showMiniBanner();
|
|
50
|
+
try {
|
|
51
|
+
const registry = await OpalServeRegistry.create();
|
|
52
|
+
const db = registry.getDatabase();
|
|
53
|
+
const totalUsers = db.get('SELECT COUNT(*) as count FROM users');
|
|
54
|
+
const totalTeams = db.get('SELECT COUNT(*) as count FROM teams');
|
|
55
|
+
const totalEvents = db.get('SELECT COUNT(*) as count FROM usage_events');
|
|
56
|
+
const recentEvents = db.get("SELECT COUNT(*) as count FROM usage_events WHERE created_at >= datetime('now', '-24 hours')");
|
|
57
|
+
const errorEvents = db.get("SELECT COUNT(*) as count FROM usage_events WHERE success = 0 AND created_at >= datetime('now', '-24 hours')");
|
|
58
|
+
const topTools = db.all("SELECT tool_name as name, COUNT(*) as count FROM usage_events WHERE created_at >= datetime('now', '-24 hours') AND tool_name IS NOT NULL GROUP BY tool_name ORDER BY count DESC LIMIT 5");
|
|
59
|
+
console.log(` ${chalk.bold('Admin Stats')}\n`);
|
|
60
|
+
console.log(` ${chalk.dim('Users:')} ${totalUsers?.count ?? 0}`);
|
|
61
|
+
console.log(` ${chalk.dim('Teams:')} ${totalTeams?.count ?? 0}`);
|
|
62
|
+
console.log(` ${chalk.dim('Total Events:')} ${totalEvents?.count ?? 0}`);
|
|
63
|
+
console.log(` ${chalk.dim('Events (24h):')} ${recentEvents?.count ?? 0}`);
|
|
64
|
+
console.log(` ${chalk.dim('Errors (24h):')} ${errorEvents?.count ?? 0}`);
|
|
65
|
+
if (topTools.length > 0) {
|
|
66
|
+
console.log(`\n ${chalk.bold('Top Tools (24h)')}\n`);
|
|
67
|
+
for (const tool of topTools) {
|
|
68
|
+
console.log(` ${chalk.white(tool.name.padEnd(30))} ${chalk.cyan(String(tool.count))} calls`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
console.log('');
|
|
72
|
+
db.close();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function adminUsersCommand() {
|
|
80
|
+
showMiniBanner();
|
|
81
|
+
try {
|
|
82
|
+
const registry = await OpalServeRegistry.create();
|
|
83
|
+
const db = registry.getDatabase();
|
|
84
|
+
const users = db.all(`
|
|
85
|
+
SELECT u.id, u.email, u.display_name, tm.role, t.name as team_name, u.created_at
|
|
86
|
+
FROM users u
|
|
87
|
+
LEFT JOIN team_members tm ON tm.user_id = u.id
|
|
88
|
+
LEFT JOIN teams t ON t.id = tm.team_id
|
|
89
|
+
ORDER BY u.created_at
|
|
90
|
+
`);
|
|
91
|
+
if (users.length === 0) {
|
|
92
|
+
showInfo('No users found');
|
|
93
|
+
db.close();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
console.log(` ${chalk.bold('Users')} (${users.length})\n`);
|
|
97
|
+
console.log(` ${chalk.dim('Email'.padEnd(30))} ${chalk.dim('Role'.padEnd(10))} ${chalk.dim('Team'.padEnd(20))} ${chalk.dim('Created')}`);
|
|
98
|
+
console.log(` ${chalk.dim('-'.repeat(90))}`);
|
|
99
|
+
for (const user of users) {
|
|
100
|
+
const role = user.role ?? 'none';
|
|
101
|
+
const roleColor = role === 'admin' ? chalk.yellow(role.padEnd(10)) : chalk.dim(role.padEnd(10));
|
|
102
|
+
console.log(` ${chalk.white(user.email.padEnd(30))} ${roleColor} ${chalk.dim((user.team_name ?? '-').padEnd(20))} ${chalk.dim(user.created_at)}`);
|
|
103
|
+
}
|
|
104
|
+
console.log('');
|
|
105
|
+
db.close();
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export async function adminInviteCommand(email) {
|
|
113
|
+
showMiniBanner();
|
|
114
|
+
try {
|
|
115
|
+
const registry = await OpalServeRegistry.create();
|
|
116
|
+
const db = registry.getDatabase();
|
|
117
|
+
// Check if user exists
|
|
118
|
+
const existing = db.get('SELECT id FROM users WHERE email = ?', [email]);
|
|
119
|
+
if (existing) {
|
|
120
|
+
showError(`User with email ${email} already exists`);
|
|
121
|
+
db.close();
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
// Generate a temporary password
|
|
125
|
+
const tempPassword = randomUUID().slice(0, 12);
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
const userId = randomUUID();
|
|
128
|
+
const passwordHash = await hashPassword(tempPassword);
|
|
129
|
+
db.run('INSERT INTO users (id, email, password_hash, display_name, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)', [userId, email, passwordHash, null, now, now]);
|
|
130
|
+
// Add to first team as member
|
|
131
|
+
const team = db.get('SELECT id, name FROM teams LIMIT 1');
|
|
132
|
+
if (team) {
|
|
133
|
+
db.run('INSERT INTO team_members (team_id, user_id, role, joined_at) VALUES (?, ?, ?, ?)', [team.id, userId, 'member', now]);
|
|
134
|
+
}
|
|
135
|
+
// Generate API key
|
|
136
|
+
const { key, keyHash, keyPrefix } = generateApiKey();
|
|
137
|
+
const keyId = randomUUID();
|
|
138
|
+
db.run('INSERT INTO api_keys (id, user_id, key_hash, key_prefix, name, created_at) VALUES (?, ?, ?, ?, ?, ?)', [keyId, userId, keyHash, keyPrefix, 'invite', now]);
|
|
139
|
+
console.log('');
|
|
140
|
+
showSuccess(`User ${chalk.bold(email)} created`);
|
|
141
|
+
if (team) {
|
|
142
|
+
showSuccess(`Added to team ${chalk.bold(team.name)} as member`);
|
|
143
|
+
}
|
|
144
|
+
console.log('');
|
|
145
|
+
console.log(` ${chalk.dim('User ID:')} ${userId}`);
|
|
146
|
+
console.log(` ${chalk.dim('Temporary Password:')} ${chalk.yellow(tempPassword)}`);
|
|
147
|
+
console.log(` ${chalk.dim('API Key:')} ${chalk.yellow(key)}`);
|
|
148
|
+
console.log('');
|
|
149
|
+
showInfo('Share these credentials securely with the invited user.');
|
|
150
|
+
db.close();
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function adminLimitsCommand(options) {
|
|
158
|
+
showMiniBanner();
|
|
159
|
+
try {
|
|
160
|
+
const registry = await OpalServeRegistry.create();
|
|
161
|
+
const db = registry.getDatabase();
|
|
162
|
+
if (options.set) {
|
|
163
|
+
// Format: "role:limit_type:max_value" e.g. "member:calls_per_hour:100"
|
|
164
|
+
const parts = options.set.split(':');
|
|
165
|
+
if (parts.length !== 3) {
|
|
166
|
+
showError('Format: --set "role:limit_type:max_value"');
|
|
167
|
+
db.close();
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
const [role, limitType, maxValueStr] = parts;
|
|
171
|
+
const maxValue = parseInt(maxValueStr, 10);
|
|
172
|
+
if (isNaN(maxValue)) {
|
|
173
|
+
showError('max_value must be a number');
|
|
174
|
+
db.close();
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const team = db.get('SELECT id FROM teams LIMIT 1');
|
|
178
|
+
if (!team) {
|
|
179
|
+
showError('No team found. Run `opalserve admin init` first.');
|
|
180
|
+
db.close();
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
db.run('INSERT INTO rate_limits (team_id, role, limit_type, max_value) VALUES (?, ?, ?, ?)', [team.id, role, limitType, maxValue]);
|
|
184
|
+
showSuccess(`Rate limit set: ${chalk.bold(role)} - ${limitType} = ${maxValue}`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// List all limits
|
|
188
|
+
const limits = db.all('SELECT role, user_id, limit_type, max_value FROM rate_limits ORDER BY role, limit_type');
|
|
189
|
+
if (limits.length === 0) {
|
|
190
|
+
showInfo('No rate limits configured');
|
|
191
|
+
db.close();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log(` ${chalk.bold('Rate Limits')}\n`);
|
|
195
|
+
console.log(` ${chalk.dim('Role/User'.padEnd(20))} ${chalk.dim('Limit Type'.padEnd(25))} ${chalk.dim('Max Value')}`);
|
|
196
|
+
console.log(` ${chalk.dim('-'.repeat(60))}`);
|
|
197
|
+
for (const limit of limits) {
|
|
198
|
+
const target = limit.role ?? limit.user_id ?? 'global';
|
|
199
|
+
console.log(` ${chalk.white(target.padEnd(20))} ${chalk.cyan(limit.limit_type.padEnd(25))} ${chalk.bold(String(limit.max_value))}`);
|
|
200
|
+
}
|
|
201
|
+
console.log('');
|
|
202
|
+
}
|
|
203
|
+
db.close();
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export async function adminPermissionsCommand(options) {
|
|
211
|
+
showMiniBanner();
|
|
212
|
+
try {
|
|
213
|
+
const registry = await OpalServeRegistry.create();
|
|
214
|
+
const db = registry.getDatabase();
|
|
215
|
+
if (options.set) {
|
|
216
|
+
// Format: "role:server_name:tool_name:permission" e.g. "member:github:*:allow"
|
|
217
|
+
const parts = options.set.split(':');
|
|
218
|
+
if (parts.length < 3) {
|
|
219
|
+
showError('Format: --set "role:server_name:permission" or "role:server_name:tool_name:permission"');
|
|
220
|
+
db.close();
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
const role = parts[0];
|
|
224
|
+
const serverName = parts[1];
|
|
225
|
+
const toolName = parts.length === 4 ? parts[2] : null;
|
|
226
|
+
const permission = parts.length === 4 ? parts[3] : parts[2];
|
|
227
|
+
const team = db.get('SELECT id FROM teams LIMIT 1');
|
|
228
|
+
if (!team) {
|
|
229
|
+
showError('No team found. Run `opalserve admin init` first.');
|
|
230
|
+
db.close();
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
db.run('INSERT INTO tool_permissions (team_id, role, server_name, tool_name, permission) VALUES (?, ?, ?, ?, ?)', [team.id, role, serverName, toolName, permission]);
|
|
234
|
+
showSuccess(`Permission set: ${chalk.bold(role)} on ${serverName}${toolName ? ':' + toolName : ''} = ${permission}`);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// List all permissions
|
|
238
|
+
const perms = db.all('SELECT role, server_name, tool_name, permission FROM tool_permissions ORDER BY role, server_name');
|
|
239
|
+
if (perms.length === 0) {
|
|
240
|
+
showInfo('No tool permissions configured');
|
|
241
|
+
db.close();
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
console.log(` ${chalk.bold('Tool Permissions')}\n`);
|
|
245
|
+
console.log(` ${chalk.dim('Role'.padEnd(15))} ${chalk.dim('Server'.padEnd(20))} ${chalk.dim('Tool'.padEnd(20))} ${chalk.dim('Permission')}`);
|
|
246
|
+
console.log(` ${chalk.dim('-'.repeat(70))}`);
|
|
247
|
+
for (const perm of perms) {
|
|
248
|
+
const tool = perm.tool_name ?? '*';
|
|
249
|
+
const permColor = perm.permission === 'allow' ? chalk.green(perm.permission) : chalk.red(perm.permission);
|
|
250
|
+
console.log(` ${chalk.white(perm.role.padEnd(15))} ${chalk.cyan(perm.server_name.padEnd(20))} ${chalk.dim(tool.padEnd(20))} ${permColor}`);
|
|
251
|
+
}
|
|
252
|
+
console.log('');
|
|
253
|
+
}
|
|
254
|
+
db.close();
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
showError(error instanceof Error ? error.message : String(error));
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA0ClD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAMnD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCnD"}
|