opalserve 0.1.2 → 3.0.0
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 +108 -115
- package/assets/logo.svg +51 -0
- 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 +190 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/health.d.ts +4 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +36 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +81 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/server.d.ts +10 -0
- package/dist/cli/commands/server.d.ts.map +1 -0
- package/dist/cli/commands/server.js +108 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/start.d.ts +6 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +63 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +21 -0
- package/dist/cli/commands/status.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/commands/tools.d.ts +8 -0
- package/dist/cli/commands/tools.d.ts.map +1 -0
- package/dist/cli/commands/tools.js +28 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +156 -30
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/banner.d.ts +8 -0
- package/dist/cli/ui/banner.d.ts.map +1 -0
- package/dist/cli/ui/banner.js +54 -0
- package/dist/cli/ui/banner.js.map +1 -0
- package/dist/cli/ui/prompts.d.ts +11 -0
- package/dist/cli/ui/prompts.d.ts.map +1 -0
- package/dist/cli/ui/prompts.js +74 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/cli/ui/table.d.ts +5 -0
- package/dist/cli/ui/table.d.ts.map +1 -0
- package/dist/cli/ui/table.js +103 -0
- package/dist/cli/ui/table.js.map +1 -0
- 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 +5 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +20 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +57 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +2 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +2 -0
- package/dist/config/schema.js.map +1 -0
- 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/discovery.d.ts +17 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +31 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/proxy.d.ts +14 -0
- package/dist/core/proxy.d.ts.map +1 -0
- package/dist/core/proxy.js +36 -0
- package/dist/core/proxy.js.map +1 -0
- package/dist/core/registry.d.ts +30 -31
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +92 -234
- 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.d.ts +18 -0
- package/dist/core/server-manager.d.ts.map +1 -0
- package/dist/core/server-manager.js +120 -0
- package/dist/core/server-manager.js.map +1 -0
- 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 +22 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -9
- 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 +8 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +81 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/mcp-gateway.d.ts +12 -0
- package/dist/server/mcp-gateway.d.ts.map +1 -0
- package/dist/server/mcp-gateway.js +91 -0
- package/dist/server/mcp-gateway.js.map +1 -0
- 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.d.ts +4 -0
- package/dist/server/routes/health.d.ts.map +1 -0
- package/dist/server/routes/health.js +22 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/servers.d.ts +4 -0
- package/dist/server/routes/servers.d.ts.map +1 -0
- package/dist/server/routes/servers.js +47 -0
- package/dist/server/routes/servers.js.map +1 -0
- 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/tools.d.ts +4 -0
- package/dist/server/routes/tools.d.ts.map +1 -0
- package/dist/server/routes/tools.js +44 -0
- package/dist/server/routes/tools.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 +48 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +336 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/repositories/server-repo.d.ts +2 -0
- package/dist/storage/repositories/server-repo.d.ts.map +1 -0
- package/dist/storage/repositories/server-repo.js +3 -0
- package/dist/storage/repositories/server-repo.js.map +1 -0
- package/dist/storage/repositories/tool-repo.d.ts +2 -0
- package/dist/storage/repositories/tool-repo.d.ts.map +1 -0
- package/dist/storage/repositories/tool-repo.js +3 -0
- package/dist/storage/repositories/tool-repo.js.map +1 -0
- package/dist/types/index.d.ts +482 -587
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +52 -69
- package/dist/types/index.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +67 -56
- package/.env.example +0 -19
- package/config/servers.example.yaml +0 -67
- package/config/servers.yaml +0 -2
- package/dist/cli/discover.d.ts +0 -3
- package/dist/cli/discover.d.ts.map +0 -1
- package/dist/cli/discover.js +0 -160
- package/dist/cli/discover.js.map +0 -1
- package/dist/connectors/base.d.ts +0 -49
- package/dist/connectors/base.d.ts.map +0 -1
- package/dist/connectors/base.js +0 -45
- package/dist/connectors/base.js.map +0 -1
- package/dist/connectors/custom.d.ts +0 -19
- package/dist/connectors/custom.d.ts.map +0 -1
- package/dist/connectors/custom.js +0 -129
- package/dist/connectors/custom.js.map +0 -1
- package/dist/connectors/github.d.ts +0 -18
- package/dist/connectors/github.d.ts.map +0 -1
- package/dist/connectors/github.js +0 -188
- package/dist/connectors/github.js.map +0 -1
- package/dist/connectors/google-drive.d.ts +0 -18
- package/dist/connectors/google-drive.d.ts.map +0 -1
- package/dist/connectors/google-drive.js +0 -209
- package/dist/connectors/google-drive.js.map +0 -1
- package/dist/connectors/index.d.ts +0 -11
- package/dist/connectors/index.d.ts.map +0 -1
- package/dist/connectors/index.js +0 -76
- package/dist/connectors/index.js.map +0 -1
- package/dist/connectors/postgres.d.ts +0 -18
- package/dist/connectors/postgres.d.ts.map +0 -1
- package/dist/connectors/postgres.js +0 -140
- package/dist/connectors/postgres.js.map +0 -1
- package/dist/connectors/slack.d.ts +0 -18
- package/dist/connectors/slack.d.ts.map +0 -1
- package/dist/connectors/slack.js +0 -181
- package/dist/connectors/slack.js.map +0 -1
- package/dist/core/auth.d.ts +0 -26
- package/dist/core/auth.d.ts.map +0 -1
- package/dist/core/auth.js +0 -81
- package/dist/core/auth.js.map +0 -1
- package/dist/core/tokenizer.d.ts +0 -16
- package/dist/core/tokenizer.d.ts.map +0 -1
- package/dist/core/tokenizer.js +0 -29
- package/dist/core/tokenizer.js.map +0 -1
- package/dist/governance/audit.d.ts +0 -27
- package/dist/governance/audit.d.ts.map +0 -1
- package/dist/governance/audit.js +0 -149
- package/dist/governance/audit.js.map +0 -1
- package/dist/governance/index.d.ts +0 -5
- package/dist/governance/index.d.ts.map +0 -1
- package/dist/governance/index.js +0 -5
- package/dist/governance/index.js.map +0 -1
- package/dist/governance/policy.d.ts +0 -20
- package/dist/governance/policy.d.ts.map +0 -1
- package/dist/governance/policy.js +0 -162
- package/dist/governance/policy.js.map +0 -1
- package/dist/governance/rate-limiter.d.ts +0 -20
- package/dist/governance/rate-limiter.d.ts.map +0 -1
- package/dist/governance/rate-limiter.js +0 -73
- package/dist/governance/rate-limiter.js.map +0 -1
- package/dist/governance/types.d.ts +0 -246
- package/dist/governance/types.d.ts.map +0 -1
- package/dist/governance/types.js +0 -72
- package/dist/governance/types.js.map +0 -1
- package/dist/identity/access-control.d.ts +0 -15
- package/dist/identity/access-control.d.ts.map +0 -1
- package/dist/identity/access-control.js +0 -81
- package/dist/identity/access-control.js.map +0 -1
- package/dist/identity/index.d.ts +0 -4
- package/dist/identity/index.d.ts.map +0 -1
- package/dist/identity/index.js +0 -4
- package/dist/identity/index.js.map +0 -1
- package/dist/identity/manager.d.ts +0 -29
- package/dist/identity/manager.d.ts.map +0 -1
- package/dist/identity/manager.js +0 -167
- package/dist/identity/manager.js.map +0 -1
- package/dist/identity/types.d.ts +0 -237
- package/dist/identity/types.d.ts.map +0 -1
- package/dist/identity/types.js +0 -80
- package/dist/identity/types.js.map +0 -1
- package/dist/registry/server.d.ts +0 -14
- package/dist/registry/server.d.ts.map +0 -1
- package/dist/registry/server.js +0 -177
- package/dist/registry/server.js.map +0 -1
- package/dist/utils/config.d.ts +0 -29
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -47
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -44
- package/dist/utils/index.js.map +0 -1
- package/dist/workflow/engine.d.ts +0 -18
- package/dist/workflow/engine.d.ts.map +0 -1
- package/dist/workflow/engine.js +0 -155
- package/dist/workflow/engine.js.map +0 -1
- package/dist/workflow/index.d.ts +0 -4
- package/dist/workflow/index.d.ts.map +0 -1
- package/dist/workflow/index.js +0 -4
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/templates.d.ts +0 -4
- package/dist/workflow/templates.d.ts.map +0 -1
- package/dist/workflow/templates.js +0 -218
- package/dist/workflow/templates.js.map +0 -1
- package/dist/workflow/types.d.ts +0 -255
- package/dist/workflow/types.d.ts.map +0 -1
- package/dist/workflow/types.js +0 -48
- package/dist/workflow/types.js.map +0 -1
- package/eslint.config.js +0 -25
package/README.md
CHANGED
|
@@ -1,147 +1,140 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/banner.svg" alt="OpalServe" width="800" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
>
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>The control plane for your team's AI tools</strong>
|
|
7
|
+
</p>
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/opalserve"><img src="https://img.shields.io/npm/v/opalserve?style=flat-square&color=F97316" alt="npm version" /></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/opalserve"><img src="https://img.shields.io/npm/dm/opalserve?style=flat-square" alt="downloads" /></a>
|
|
12
|
+
<a href="https://github.com/adityaidev/opalserve/blob/master/LICENSE"><img src="https://img.shields.io/github/license/adityaidev/opalserve?style=flat-square" alt="license" /></a>
|
|
13
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen?style=flat-square" alt="node version" /></a>
|
|
14
|
+
</p>
|
|
9
15
|
|
|
10
|
-
|
|
16
|
+
---
|
|
11
17
|
|
|
12
|
-
OpalServe
|
|
18
|
+
**OpalServe** is a team platform for managing AI coding tools. Share MCP servers, knowledge bases, and usage analytics across your engineering team — whether they use Claude Code, Cursor, Codex, or any MCP-compatible tool.
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
## Features
|
|
15
21
|
|
|
16
|
-
- **
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
+
- **Team MCP Server Registry** — Admin registers servers once, every developer gets them via `opalserve sync`
|
|
23
|
+
- **Shared Knowledge Base** — Upload architecture docs, coding standards, API specs — your team's AI tools query it automatically via MCP
|
|
24
|
+
- **Usage Analytics Dashboard** — React SPA showing tool calls, token usage, active users, error rates per developer
|
|
25
|
+
- **Auth & Access Control** — User accounts, API keys, rate limits, tool permissions per role
|
|
26
|
+
- **GitHub + Slack Integration** — Webhooks auto-update context, slash commands for search
|
|
27
|
+
- **MCP Gateway** — OpalServe itself is an MCP server — connect any AI client to access all tools from one endpoint
|
|
28
|
+
- **Beautiful CLI** — Interactive setup, gradient banners, color-coded tables, 15+ commands
|
|
29
|
+
- **100% Open Source** — MIT licensed, self-host for free
|
|
22
30
|
|
|
23
|
-
##
|
|
31
|
+
## Architecture
|
|
24
32
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
```
|
|
34
|
+
┌──────────────────────────┐
|
|
35
|
+
│ OpalServe Team Server │
|
|
36
|
+
│ │
|
|
37
|
+
│ Team MCP Server Registry │
|
|
38
|
+
│ Shared Knowledge Base │
|
|
39
|
+
│ Usage Analytics │
|
|
40
|
+
│ React Admin Dashboard │
|
|
41
|
+
│ Auth / API Keys │
|
|
42
|
+
└────────────┬──────────────┘
|
|
43
|
+
│ HTTPS API
|
|
44
|
+
┌────────────────┼────────────────┐
|
|
45
|
+
│ │ │
|
|
46
|
+
Dev A (Claude) Dev B (Cursor) Dev C (Codex)
|
|
47
|
+
```
|
|
31
48
|
|
|
32
49
|
## Quick Start
|
|
33
50
|
|
|
34
51
|
```bash
|
|
35
|
-
# Install
|
|
52
|
+
# Install
|
|
36
53
|
npm install -g opalserve
|
|
37
54
|
|
|
38
|
-
#
|
|
39
|
-
|
|
55
|
+
# Interactive setup
|
|
56
|
+
opalserve init
|
|
57
|
+
|
|
58
|
+
# Start the registry
|
|
59
|
+
opalserve start
|
|
40
60
|
|
|
41
|
-
#
|
|
42
|
-
opalserve
|
|
61
|
+
# Add an MCP server
|
|
62
|
+
opalserve server add --name files --stdio "npx -y @modelcontextprotocol/server-filesystem ."
|
|
43
63
|
|
|
44
|
-
#
|
|
45
|
-
opalserve
|
|
64
|
+
# Search tools
|
|
65
|
+
opalserve tools search "read file"
|
|
46
66
|
```
|
|
47
67
|
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
### Custom (5 tools)
|
|
70
|
-
- HTTP request, Webhook trigger, Transform data
|
|
71
|
-
- Aggregate data, Route request
|
|
72
|
-
|
|
73
|
-
## API Endpoints
|
|
74
|
-
|
|
75
|
-
| Method | Endpoint | Description |
|
|
76
|
-
|--------|----------|-------------|
|
|
77
|
-
| GET | `/api/v1/health` | Health check |
|
|
78
|
-
| GET | `/api/v1/discover?query=<text>` | Discover tools by query |
|
|
79
|
-
| GET | `/api/v1/tools` | List all registered tools |
|
|
80
|
-
| GET | `/api/v1/tools/:id` | Get specific tool details |
|
|
81
|
-
| GET | `/api/v1/servers` | List MCP servers |
|
|
82
|
-
| POST | `/api/v1/servers/register` | Register new MCP server |
|
|
83
|
-
| POST | `/api/v1/auth/token` | Generate JWT token |
|
|
84
|
-
|
|
85
|
-
## Configuration
|
|
86
|
-
|
|
87
|
-
```env
|
|
88
|
-
PORT=3000
|
|
89
|
-
HOST=localhost
|
|
90
|
-
JWT_SECRET=your-secret-key
|
|
91
|
-
GITHUB_TOKEN=ghp_xxx
|
|
92
|
-
SLACK_BOT_TOKEN=xoxb-xxx
|
|
93
|
-
POSTGRES_URL=postgresql://user:pass@host:5432/db
|
|
94
|
-
GOOGLE_SERVICE_ACCOUNT=./config/google-service-account.json
|
|
95
|
-
ENABLE_AUTH=false
|
|
68
|
+
## Team Mode
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Initialize team server
|
|
72
|
+
opalserve admin init
|
|
73
|
+
|
|
74
|
+
# Start in team mode
|
|
75
|
+
# (set mode: "team-server" in opalserve.config.json)
|
|
76
|
+
opalserve start
|
|
77
|
+
|
|
78
|
+
# On each developer's machine:
|
|
79
|
+
opalserve login
|
|
80
|
+
opalserve sync
|
|
81
|
+
|
|
82
|
+
# Upload shared docs
|
|
83
|
+
opalserve context add ./docs/architecture.md
|
|
84
|
+
opalserve context add ./docs/api-spec.md
|
|
85
|
+
|
|
86
|
+
# Search team knowledge
|
|
87
|
+
opalserve context search "authentication flow"
|
|
96
88
|
```
|
|
97
89
|
|
|
98
|
-
##
|
|
90
|
+
## Admin Dashboard
|
|
91
|
+
|
|
92
|
+
Start the server and visit `http://localhost:3456/dashboard` for:
|
|
93
|
+
- Usage overview with charts
|
|
94
|
+
- Server status monitoring
|
|
95
|
+
- User management
|
|
96
|
+
- Tool browser with search
|
|
97
|
+
- Knowledge base management
|
|
98
|
+
- API key + integration settings
|
|
99
|
+
|
|
100
|
+
## CLI Commands
|
|
99
101
|
|
|
100
102
|
```
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
│ Connector │ │ Connector │ │ Connector │
|
|
113
|
-
└─────────────┘ └─────────────┘ └─────────────┘
|
|
114
|
-
│ │ │
|
|
115
|
-
▼ ▼ ▼
|
|
116
|
-
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
117
|
-
│ Google Drive│ │ Custom │ │ More... │
|
|
118
|
-
│ Connector │ │ Connector │ │ │
|
|
119
|
-
└─────────────┘ └─────────────┘ └─────────────┘
|
|
103
|
+
opalserve init Setup wizard
|
|
104
|
+
opalserve start Start server
|
|
105
|
+
opalserve status Show status
|
|
106
|
+
opalserve login / logout / whoami Auth commands
|
|
107
|
+
opalserve sync Pull team configs
|
|
108
|
+
opalserve server list|add|remove Server management
|
|
109
|
+
opalserve tools list|search Tool discovery
|
|
110
|
+
opalserve context add|list|search Knowledge base
|
|
111
|
+
opalserve health Health checks
|
|
112
|
+
opalserve admin init|stats|users Team admin
|
|
113
|
+
opalserve admin limits|permissions Access control
|
|
120
114
|
```
|
|
121
115
|
|
|
122
|
-
##
|
|
116
|
+
## Library Usage
|
|
123
117
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
- **Confused Deputy Prevention**: Blocks malicious prompt injection
|
|
127
|
-
- **Native HTTP**: Uses Node.js `fetch` (no external dependencies)
|
|
128
|
-
- **Audit Logging**: Track all tool invocations and access
|
|
118
|
+
```typescript
|
|
119
|
+
import { OpalServeRegistry } from 'opalserve';
|
|
129
120
|
|
|
130
|
-
|
|
121
|
+
const registry = await OpalServeRegistry.create({
|
|
122
|
+
servers: [{
|
|
123
|
+
name: 'my-files',
|
|
124
|
+
transport: { type: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', '.'] },
|
|
125
|
+
}],
|
|
126
|
+
});
|
|
131
127
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
128
|
+
await registry.start();
|
|
129
|
+
const tools = registry.listTools();
|
|
130
|
+
const results = registry.searchTools('read file');
|
|
131
|
+
await registry.stop();
|
|
132
|
+
```
|
|
136
133
|
|
|
137
|
-
##
|
|
134
|
+
## Documentation
|
|
138
135
|
|
|
139
|
-
|
|
136
|
+
Full docs at [opalserve.vercel.app](https://opalserve.vercel.app)
|
|
140
137
|
|
|
141
138
|
## License
|
|
142
139
|
|
|
143
|
-
MIT
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
**Built for the AI Agent era** - Enterprise-ready MCP tool registry
|
|
140
|
+
MIT — 100% open source, free to self-host
|
package/assets/logo.svg
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="hub-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#F59E0B"/>
|
|
5
|
+
<stop offset="50%" stop-color="#F97316"/>
|
|
6
|
+
<stop offset="100%" stop-color="#8B5CF6"/>
|
|
7
|
+
</linearGradient>
|
|
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"/>
|
|
11
|
+
</linearGradient>
|
|
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"/>
|
|
23
|
+
</linearGradient>
|
|
24
|
+
</defs>
|
|
25
|
+
|
|
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"/>
|
|
35
|
+
|
|
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"/>
|
|
38
|
+
|
|
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"/>
|
|
41
|
+
|
|
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"/>
|
|
44
|
+
|
|
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)"/>
|
|
48
|
+
|
|
49
|
+
<!-- Hub inner highlight -->
|
|
50
|
+
<circle cx="246" cy="246" r="20" fill="#FFFFFF" opacity="0.15"/>
|
|
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"}
|