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.
Files changed (310) hide show
  1. package/README.md +108 -115
  2. package/assets/logo.svg +51 -0
  3. package/dist/auth/api-keys.d.ts +7 -0
  4. package/dist/auth/api-keys.d.ts.map +1 -0
  5. package/dist/auth/api-keys.js +12 -0
  6. package/dist/auth/api-keys.js.map +1 -0
  7. package/dist/auth/index.d.ts +4 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +4 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/middleware.d.ts +11 -0
  12. package/dist/auth/middleware.d.ts.map +1 -0
  13. package/dist/auth/middleware.js +46 -0
  14. package/dist/auth/middleware.js.map +1 -0
  15. package/dist/auth/passwords.d.ts +3 -0
  16. package/dist/auth/passwords.d.ts.map +1 -0
  17. package/dist/auth/passwords.js +33 -0
  18. package/dist/auth/passwords.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +13 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +261 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/auth.d.ts +4 -0
  24. package/dist/cli/commands/auth.d.ts.map +1 -0
  25. package/dist/cli/commands/auth.js +77 -0
  26. package/dist/cli/commands/auth.js.map +1 -0
  27. package/dist/cli/commands/context.d.ts +5 -0
  28. package/dist/cli/commands/context.d.ts.map +1 -0
  29. package/dist/cli/commands/context.js +190 -0
  30. package/dist/cli/commands/context.js.map +1 -0
  31. package/dist/cli/commands/health.d.ts +4 -0
  32. package/dist/cli/commands/health.d.ts.map +1 -0
  33. package/dist/cli/commands/health.js +36 -0
  34. package/dist/cli/commands/health.js.map +1 -0
  35. package/dist/cli/commands/init.d.ts +2 -0
  36. package/dist/cli/commands/init.d.ts.map +1 -0
  37. package/dist/cli/commands/init.js +81 -0
  38. package/dist/cli/commands/init.js.map +1 -0
  39. package/dist/cli/commands/server.d.ts +10 -0
  40. package/dist/cli/commands/server.d.ts.map +1 -0
  41. package/dist/cli/commands/server.js +108 -0
  42. package/dist/cli/commands/server.js.map +1 -0
  43. package/dist/cli/commands/start.d.ts +6 -0
  44. package/dist/cli/commands/start.d.ts.map +1 -0
  45. package/dist/cli/commands/start.js +63 -0
  46. package/dist/cli/commands/start.js.map +1 -0
  47. package/dist/cli/commands/status.d.ts +2 -0
  48. package/dist/cli/commands/status.d.ts.map +1 -0
  49. package/dist/cli/commands/status.js +21 -0
  50. package/dist/cli/commands/status.js.map +1 -0
  51. package/dist/cli/commands/sync.d.ts +2 -0
  52. package/dist/cli/commands/sync.d.ts.map +1 -0
  53. package/dist/cli/commands/sync.js +58 -0
  54. package/dist/cli/commands/sync.js.map +1 -0
  55. package/dist/cli/commands/tools.d.ts +8 -0
  56. package/dist/cli/commands/tools.d.ts.map +1 -0
  57. package/dist/cli/commands/tools.js +28 -0
  58. package/dist/cli/commands/tools.js.map +1 -0
  59. package/dist/cli/index.d.ts +1 -1
  60. package/dist/cli/index.d.ts.map +1 -1
  61. package/dist/cli/index.js +156 -30
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/ui/banner.d.ts +8 -0
  64. package/dist/cli/ui/banner.d.ts.map +1 -0
  65. package/dist/cli/ui/banner.js +54 -0
  66. package/dist/cli/ui/banner.js.map +1 -0
  67. package/dist/cli/ui/prompts.d.ts +11 -0
  68. package/dist/cli/ui/prompts.d.ts.map +1 -0
  69. package/dist/cli/ui/prompts.js +74 -0
  70. package/dist/cli/ui/prompts.js.map +1 -0
  71. package/dist/cli/ui/table.d.ts +5 -0
  72. package/dist/cli/ui/table.d.ts.map +1 -0
  73. package/dist/cli/ui/table.js +103 -0
  74. package/dist/cli/ui/table.js.map +1 -0
  75. package/dist/config/credentials.d.ts +10 -0
  76. package/dist/config/credentials.d.ts.map +1 -0
  77. package/dist/config/credentials.js +33 -0
  78. package/dist/config/credentials.js.map +1 -0
  79. package/dist/config/defaults.d.ts +5 -0
  80. package/dist/config/defaults.d.ts.map +1 -0
  81. package/dist/config/defaults.js +20 -0
  82. package/dist/config/defaults.js.map +1 -0
  83. package/dist/config/loader.d.ts +4 -0
  84. package/dist/config/loader.d.ts.map +1 -0
  85. package/dist/config/loader.js +57 -0
  86. package/dist/config/loader.js.map +1 -0
  87. package/dist/config/schema.d.ts +2 -0
  88. package/dist/config/schema.d.ts.map +1 -0
  89. package/dist/config/schema.js +2 -0
  90. package/dist/config/schema.js.map +1 -0
  91. package/dist/constants.d.ts +5 -0
  92. package/dist/constants.d.ts.map +1 -0
  93. package/dist/constants.js +5 -0
  94. package/dist/constants.js.map +1 -0
  95. package/dist/context/chunker.d.ts +2 -0
  96. package/dist/context/chunker.d.ts.map +1 -0
  97. package/dist/context/chunker.js +81 -0
  98. package/dist/context/chunker.js.map +1 -0
  99. package/dist/context/index.d.ts +26 -0
  100. package/dist/context/index.d.ts.map +1 -0
  101. package/dist/context/index.js +97 -0
  102. package/dist/context/index.js.map +1 -0
  103. package/dist/core/discovery.d.ts +17 -0
  104. package/dist/core/discovery.d.ts.map +1 -0
  105. package/dist/core/discovery.js +31 -0
  106. package/dist/core/discovery.js.map +1 -0
  107. package/dist/core/proxy.d.ts +14 -0
  108. package/dist/core/proxy.d.ts.map +1 -0
  109. package/dist/core/proxy.js +36 -0
  110. package/dist/core/proxy.js.map +1 -0
  111. package/dist/core/registry.d.ts +30 -31
  112. package/dist/core/registry.d.ts.map +1 -1
  113. package/dist/core/registry.js +92 -234
  114. package/dist/core/registry.js.map +1 -1
  115. package/dist/core/secrets.d.ts +4 -0
  116. package/dist/core/secrets.d.ts.map +1 -0
  117. package/dist/core/secrets.js +40 -0
  118. package/dist/core/secrets.js.map +1 -0
  119. package/dist/core/server-manager.d.ts +18 -0
  120. package/dist/core/server-manager.d.ts.map +1 -0
  121. package/dist/core/server-manager.js +120 -0
  122. package/dist/core/server-manager.js.map +1 -0
  123. package/dist/dashboard/assets/index-BNOtcUPs.js +257 -0
  124. package/dist/dashboard/assets/index-Duwp34GW.css +1 -0
  125. package/dist/dashboard/index.html +14 -0
  126. package/dist/index.d.ts +22 -12
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +31 -9
  129. package/dist/index.js.map +1 -1
  130. package/dist/integrations/github.d.ts +5 -0
  131. package/dist/integrations/github.d.ts.map +1 -0
  132. package/dist/integrations/github.js +63 -0
  133. package/dist/integrations/github.js.map +1 -0
  134. package/dist/integrations/slack.d.ts +21 -0
  135. package/dist/integrations/slack.d.ts.map +1 -0
  136. package/dist/integrations/slack.js +61 -0
  137. package/dist/integrations/slack.js.map +1 -0
  138. package/dist/monitoring/tracker.d.ts +31 -0
  139. package/dist/monitoring/tracker.d.ts.map +1 -0
  140. package/dist/monitoring/tracker.js +86 -0
  141. package/dist/monitoring/tracker.js.map +1 -0
  142. package/dist/server/app.d.ts +8 -0
  143. package/dist/server/app.d.ts.map +1 -0
  144. package/dist/server/app.js +81 -0
  145. package/dist/server/app.js.map +1 -0
  146. package/dist/server/mcp-gateway.d.ts +12 -0
  147. package/dist/server/mcp-gateway.d.ts.map +1 -0
  148. package/dist/server/mcp-gateway.js +91 -0
  149. package/dist/server/mcp-gateway.js.map +1 -0
  150. package/dist/server/routes/auth.d.ts +4 -0
  151. package/dist/server/routes/auth.d.ts.map +1 -0
  152. package/dist/server/routes/auth.js +117 -0
  153. package/dist/server/routes/auth.js.map +1 -0
  154. package/dist/server/routes/context.d.ts +4 -0
  155. package/dist/server/routes/context.d.ts.map +1 -0
  156. package/dist/server/routes/context.js +107 -0
  157. package/dist/server/routes/context.js.map +1 -0
  158. package/dist/server/routes/health.d.ts +4 -0
  159. package/dist/server/routes/health.d.ts.map +1 -0
  160. package/dist/server/routes/health.js +22 -0
  161. package/dist/server/routes/health.js.map +1 -0
  162. package/dist/server/routes/servers.d.ts +4 -0
  163. package/dist/server/routes/servers.d.ts.map +1 -0
  164. package/dist/server/routes/servers.js +47 -0
  165. package/dist/server/routes/servers.js.map +1 -0
  166. package/dist/server/routes/stats.d.ts +4 -0
  167. package/dist/server/routes/stats.d.ts.map +1 -0
  168. package/dist/server/routes/stats.js +97 -0
  169. package/dist/server/routes/stats.js.map +1 -0
  170. package/dist/server/routes/team-servers.d.ts +4 -0
  171. package/dist/server/routes/team-servers.d.ts.map +1 -0
  172. package/dist/server/routes/team-servers.js +108 -0
  173. package/dist/server/routes/team-servers.js.map +1 -0
  174. package/dist/server/routes/tools.d.ts +4 -0
  175. package/dist/server/routes/tools.d.ts.map +1 -0
  176. package/dist/server/routes/tools.js +44 -0
  177. package/dist/server/routes/tools.js.map +1 -0
  178. package/dist/server/routes/webhooks.d.ts +4 -0
  179. package/dist/server/routes/webhooks.d.ts.map +1 -0
  180. package/dist/server/routes/webhooks.js +77 -0
  181. package/dist/server/routes/webhooks.js.map +1 -0
  182. package/dist/storage/database.d.ts +48 -0
  183. package/dist/storage/database.d.ts.map +1 -0
  184. package/dist/storage/database.js +336 -0
  185. package/dist/storage/database.js.map +1 -0
  186. package/dist/storage/repositories/server-repo.d.ts +2 -0
  187. package/dist/storage/repositories/server-repo.d.ts.map +1 -0
  188. package/dist/storage/repositories/server-repo.js +3 -0
  189. package/dist/storage/repositories/server-repo.js.map +1 -0
  190. package/dist/storage/repositories/tool-repo.d.ts +2 -0
  191. package/dist/storage/repositories/tool-repo.d.ts.map +1 -0
  192. package/dist/storage/repositories/tool-repo.js +3 -0
  193. package/dist/storage/repositories/tool-repo.js.map +1 -0
  194. package/dist/types/index.d.ts +482 -587
  195. package/dist/types/index.d.ts.map +1 -1
  196. package/dist/types/index.js +52 -69
  197. package/dist/types/index.js.map +1 -1
  198. package/dist/utils/logger.d.ts +7 -0
  199. package/dist/utils/logger.d.ts.map +1 -0
  200. package/dist/utils/logger.js +23 -0
  201. package/dist/utils/logger.js.map +1 -0
  202. package/package.json +67 -56
  203. package/.env.example +0 -19
  204. package/config/servers.example.yaml +0 -67
  205. package/config/servers.yaml +0 -2
  206. package/dist/cli/discover.d.ts +0 -3
  207. package/dist/cli/discover.d.ts.map +0 -1
  208. package/dist/cli/discover.js +0 -160
  209. package/dist/cli/discover.js.map +0 -1
  210. package/dist/connectors/base.d.ts +0 -49
  211. package/dist/connectors/base.d.ts.map +0 -1
  212. package/dist/connectors/base.js +0 -45
  213. package/dist/connectors/base.js.map +0 -1
  214. package/dist/connectors/custom.d.ts +0 -19
  215. package/dist/connectors/custom.d.ts.map +0 -1
  216. package/dist/connectors/custom.js +0 -129
  217. package/dist/connectors/custom.js.map +0 -1
  218. package/dist/connectors/github.d.ts +0 -18
  219. package/dist/connectors/github.d.ts.map +0 -1
  220. package/dist/connectors/github.js +0 -188
  221. package/dist/connectors/github.js.map +0 -1
  222. package/dist/connectors/google-drive.d.ts +0 -18
  223. package/dist/connectors/google-drive.d.ts.map +0 -1
  224. package/dist/connectors/google-drive.js +0 -209
  225. package/dist/connectors/google-drive.js.map +0 -1
  226. package/dist/connectors/index.d.ts +0 -11
  227. package/dist/connectors/index.d.ts.map +0 -1
  228. package/dist/connectors/index.js +0 -76
  229. package/dist/connectors/index.js.map +0 -1
  230. package/dist/connectors/postgres.d.ts +0 -18
  231. package/dist/connectors/postgres.d.ts.map +0 -1
  232. package/dist/connectors/postgres.js +0 -140
  233. package/dist/connectors/postgres.js.map +0 -1
  234. package/dist/connectors/slack.d.ts +0 -18
  235. package/dist/connectors/slack.d.ts.map +0 -1
  236. package/dist/connectors/slack.js +0 -181
  237. package/dist/connectors/slack.js.map +0 -1
  238. package/dist/core/auth.d.ts +0 -26
  239. package/dist/core/auth.d.ts.map +0 -1
  240. package/dist/core/auth.js +0 -81
  241. package/dist/core/auth.js.map +0 -1
  242. package/dist/core/tokenizer.d.ts +0 -16
  243. package/dist/core/tokenizer.d.ts.map +0 -1
  244. package/dist/core/tokenizer.js +0 -29
  245. package/dist/core/tokenizer.js.map +0 -1
  246. package/dist/governance/audit.d.ts +0 -27
  247. package/dist/governance/audit.d.ts.map +0 -1
  248. package/dist/governance/audit.js +0 -149
  249. package/dist/governance/audit.js.map +0 -1
  250. package/dist/governance/index.d.ts +0 -5
  251. package/dist/governance/index.d.ts.map +0 -1
  252. package/dist/governance/index.js +0 -5
  253. package/dist/governance/index.js.map +0 -1
  254. package/dist/governance/policy.d.ts +0 -20
  255. package/dist/governance/policy.d.ts.map +0 -1
  256. package/dist/governance/policy.js +0 -162
  257. package/dist/governance/policy.js.map +0 -1
  258. package/dist/governance/rate-limiter.d.ts +0 -20
  259. package/dist/governance/rate-limiter.d.ts.map +0 -1
  260. package/dist/governance/rate-limiter.js +0 -73
  261. package/dist/governance/rate-limiter.js.map +0 -1
  262. package/dist/governance/types.d.ts +0 -246
  263. package/dist/governance/types.d.ts.map +0 -1
  264. package/dist/governance/types.js +0 -72
  265. package/dist/governance/types.js.map +0 -1
  266. package/dist/identity/access-control.d.ts +0 -15
  267. package/dist/identity/access-control.d.ts.map +0 -1
  268. package/dist/identity/access-control.js +0 -81
  269. package/dist/identity/access-control.js.map +0 -1
  270. package/dist/identity/index.d.ts +0 -4
  271. package/dist/identity/index.d.ts.map +0 -1
  272. package/dist/identity/index.js +0 -4
  273. package/dist/identity/index.js.map +0 -1
  274. package/dist/identity/manager.d.ts +0 -29
  275. package/dist/identity/manager.d.ts.map +0 -1
  276. package/dist/identity/manager.js +0 -167
  277. package/dist/identity/manager.js.map +0 -1
  278. package/dist/identity/types.d.ts +0 -237
  279. package/dist/identity/types.d.ts.map +0 -1
  280. package/dist/identity/types.js +0 -80
  281. package/dist/identity/types.js.map +0 -1
  282. package/dist/registry/server.d.ts +0 -14
  283. package/dist/registry/server.d.ts.map +0 -1
  284. package/dist/registry/server.js +0 -177
  285. package/dist/registry/server.js.map +0 -1
  286. package/dist/utils/config.d.ts +0 -29
  287. package/dist/utils/config.d.ts.map +0 -1
  288. package/dist/utils/config.js +0 -47
  289. package/dist/utils/config.js.map +0 -1
  290. package/dist/utils/index.d.ts +0 -7
  291. package/dist/utils/index.d.ts.map +0 -1
  292. package/dist/utils/index.js +0 -44
  293. package/dist/utils/index.js.map +0 -1
  294. package/dist/workflow/engine.d.ts +0 -18
  295. package/dist/workflow/engine.d.ts.map +0 -1
  296. package/dist/workflow/engine.js +0 -155
  297. package/dist/workflow/engine.js.map +0 -1
  298. package/dist/workflow/index.d.ts +0 -4
  299. package/dist/workflow/index.d.ts.map +0 -1
  300. package/dist/workflow/index.js +0 -4
  301. package/dist/workflow/index.js.map +0 -1
  302. package/dist/workflow/templates.d.ts +0 -4
  303. package/dist/workflow/templates.d.ts.map +0 -1
  304. package/dist/workflow/templates.js +0 -218
  305. package/dist/workflow/templates.js.map +0 -1
  306. package/dist/workflow/types.d.ts +0 -255
  307. package/dist/workflow/types.d.ts.map +0 -1
  308. package/dist/workflow/types.js +0 -48
  309. package/dist/workflow/types.js.map +0 -1
  310. package/eslint.config.js +0 -25
package/README.md CHANGED
@@ -1,147 +1,140 @@
1
- # OpalServe
1
+ <p align="center">
2
+ <img src="assets/banner.svg" alt="OpalServe" width="800" />
3
+ </p>
2
4
 
3
- > Enterprise-grade MCP (Model Context Protocol) Tool Registry & Discovery Hub for AI Agents
5
+ <p align="center">
6
+ <strong>The control plane for your team's AI tools</strong>
7
+ </p>
4
8
 
5
- [![npm version](https://img.shields.io/npm/v/opalserve?style=flat-square)](https://www.npmjs.com/package/opalserve)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
7
- [![Node.js](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen?style=flat-square)](https://nodejs.org/)
8
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue?style=flat-square)](https://www.typescriptlang.org/)
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
- ## What is OpalServe?
16
+ ---
11
17
 
12
- OpalServe solves the **"N×M" integration problem** in AI agent tooling. Before MCP, developers had to build custom connectors for every combination of AI model and tool. OpalServe provides a centralized registry with intelligent, context-sized tool discovery.
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
- ### Key Features
20
+ ## Features
15
21
 
16
- - **Intelligent Discovery**: Context-sized responses with relevance scoring
17
- - **5 Pre-built Connectors**: GitHub, Slack, PostgreSQL, Google Drive, Custom
18
- - **40+ MCP Tools**: Ready-to-use tools with full JSON Schema documentation
19
- - **Visual Workflow Builder**: Build multi-step agentic workflows with templates
20
- - **Enterprise Security**: JWT authentication, RBAC, audit logging
21
- - **Governance**: Policy engine, rate limiting, compliance tracking
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
- ## Why OpalServe?
31
+ ## Architecture
24
32
 
25
- | Problem | Solution |
26
- |---------|----------|
27
- | Context bloat from loading all tools | Intelligent discovery with relevance scoring |
28
- | No standardized auth identity | JWT-based agent identity propagation |
29
- | Security vulnerabilities | Native `fetch` (no axios - March 2026 fix) |
30
- | Complex multi-tool workflows | Visual workflow builder with templates |
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 globally
52
+ # Install
36
53
  npm install -g opalserve
37
54
 
38
- # Or use via npx
39
- npx opalserve
55
+ # Interactive setup
56
+ opalserve init
57
+
58
+ # Start the registry
59
+ opalserve start
40
60
 
41
- # Start the server
42
- opalserve
61
+ # Add an MCP server
62
+ opalserve server add --name files --stdio "npx -y @modelcontextprotocol/server-filesystem ."
43
63
 
44
- # Discover available tools
45
- opalserve-discover "github pull requests"
64
+ # Search tools
65
+ opalserve tools search "read file"
46
66
  ```
47
67
 
48
- ## Available Tools
49
-
50
- ### GitHub (8 tools)
51
- - List repositories, Get repository details
52
- - List pull requests, Get PR details, Create PR review
53
- - Create issue, List issues, Search code
54
-
55
- ### Slack (8 tools)
56
- - Post message, Get channel info, List channels
57
- - List messages, Update message, Delete message
58
- - Upload file, Search messages
59
-
60
- ### PostgreSQL (6 tools)
61
- - Execute query, Get schema, List tables
62
- - Get table info, List databases, Health check
63
-
64
- ### Google Drive (10 tools)
65
- - List files, Get file, Create folder, Upload file
66
- - Share file, List permissions, Search files
67
- - Delete file, Download file, Get file metadata
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
- ## Architecture
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
- │ O P A L S E R V E │
103
- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│
104
- │ │ Discovery │ │ Auth & │ │ Tool Registry ││
105
- │ │ Endpoint │──│ RBAC │──│ & Indexing ││
106
- └─────────────┘ └─────────────┘ └─────────────────────┘│
107
- └─────────────────────────────────────────────────────────────┘
108
- │ │ │
109
- ▼ ▼
110
- ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
111
- │ GitHub │ │ Slack │ │ PostgreSQL
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
- ## Security Features
116
+ ## Library Usage
123
117
 
124
- - **JWT Authentication**: Secure agent identity propagation
125
- - **RBAC**: Fine-grained permission-based access control
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
- ## Use Cases
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
- 1. **AI Agent Tooling**: Give AI agents access to enterprise tools
133
- 2. **Tool Discovery**: Find relevant tools based on natural language queries
134
- 3. **Workflow Automation**: Build multi-step workflows with visual builder
135
- 4. **Governance**: Monitor and control tool usage across organizations
128
+ await registry.start();
129
+ const tools = registry.listTools();
130
+ const results = registry.searchTools('read file');
131
+ await registry.stop();
132
+ ```
136
133
 
137
- ## Contributing
134
+ ## Documentation
138
135
 
139
- Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
136
+ Full docs at [opalserve.vercel.app](https://opalserve.vercel.app)
140
137
 
141
138
  ## License
142
139
 
143
- MIT License - see [LICENSE](LICENSE) for details.
144
-
145
- ---
146
-
147
- **Built for the AI Agent era** - Enterprise-ready MCP tool registry
140
+ MIT 100% open source, free to self-host
@@ -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,7 @@
1
+ export declare function generateApiKey(): {
2
+ key: string;
3
+ keyHash: string;
4
+ keyPrefix: string;
5
+ };
6
+ export declare function hashApiKey(key: string): string;
7
+ //# sourceMappingURL=api-keys.d.ts.map
@@ -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,4 @@
1
+ export { hashPassword, verifyPassword } from './passwords.js';
2
+ export { generateApiKey, hashApiKey } from './api-keys.js';
3
+ export { createAuthMiddleware, registerAuthDecorator } from './middleware.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { hashPassword, verifyPassword } from './passwords.js';
2
+ export { generateApiKey, hashApiKey } from './api-keys.js';
3
+ export { createAuthMiddleware, registerAuthDecorator } from './middleware.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ export declare function hashPassword(password: string): Promise<string>;
2
+ export declare function verifyPassword(password: string, stored: string): Promise<boolean>;
3
+ //# sourceMappingURL=passwords.d.ts.map
@@ -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"}