@tronsfey/ucli-server 0.5.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 (247) hide show
  1. package/README.md +423 -0
  2. package/README.zh.md +404 -0
  3. package/assets/logo.svg +138 -0
  4. package/dist/admin-ui/assets/index-BjdBylCY.css +1 -0
  5. package/dist/admin-ui/assets/index-CDwKIMTJ.js +117 -0
  6. package/dist/admin-ui/assets/remixicon-B25hvfAs.eot +0 -0
  7. package/dist/admin-ui/assets/remixicon-BTtOSOPh.svg +9709 -0
  8. package/dist/admin-ui/assets/remixicon-CZw4FkzQ.woff2 +0 -0
  9. package/dist/admin-ui/assets/remixicon-S6an_USy.woff +0 -0
  10. package/dist/admin-ui/assets/remixicon-sqouR8Ox.ttf +0 -0
  11. package/dist/admin-ui/dist/assets/index-BjdBylCY.css +1 -0
  12. package/dist/admin-ui/dist/assets/index-CDwKIMTJ.js +117 -0
  13. package/dist/admin-ui/dist/assets/index-CppEl63e.css +1 -0
  14. package/dist/admin-ui/dist/assets/index-DBkeGfMQ.js +117 -0
  15. package/dist/admin-ui/dist/assets/index-ss5EmsBH.js +117 -0
  16. package/dist/admin-ui/dist/assets/remixicon-B25hvfAs.eot +0 -0
  17. package/dist/admin-ui/dist/assets/remixicon-BTtOSOPh.svg +9709 -0
  18. package/dist/admin-ui/dist/assets/remixicon-CZw4FkzQ.woff2 +0 -0
  19. package/dist/admin-ui/dist/assets/remixicon-S6an_USy.woff +0 -0
  20. package/dist/admin-ui/dist/assets/remixicon-sqouR8Ox.ttf +0 -0
  21. package/dist/admin-ui/dist/index.html +14 -0
  22. package/dist/admin-ui/index.html +14 -0
  23. package/dist/app.module.d.ts +3 -0
  24. package/dist/app.module.d.ts.map +1 -0
  25. package/dist/app.module.js +65 -0
  26. package/dist/app.module.js.map +1 -0
  27. package/dist/auth/admin.guard.d.ts +8 -0
  28. package/dist/auth/admin.guard.d.ts.map +1 -0
  29. package/dist/auth/admin.guard.js +34 -0
  30. package/dist/auth/admin.guard.js.map +1 -0
  31. package/dist/auth/auth.module.d.ts +3 -0
  32. package/dist/auth/auth.module.d.ts.map +1 -0
  33. package/dist/auth/auth.module.js +24 -0
  34. package/dist/auth/auth.module.js.map +1 -0
  35. package/dist/auth/decorators/jwt-payload.decorator.d.ts +2 -0
  36. package/dist/auth/decorators/jwt-payload.decorator.d.ts.map +1 -0
  37. package/dist/auth/decorators/jwt-payload.decorator.js +10 -0
  38. package/dist/auth/decorators/jwt-payload.decorator.js.map +1 -0
  39. package/dist/auth/group-token.guard.d.ts +11 -0
  40. package/dist/auth/group-token.guard.d.ts.map +1 -0
  41. package/dist/auth/group-token.guard.js +53 -0
  42. package/dist/auth/group-token.guard.js.map +1 -0
  43. package/dist/cache/cache.interface.d.ts +8 -0
  44. package/dist/cache/cache.interface.d.ts.map +1 -0
  45. package/dist/cache/cache.interface.js +3 -0
  46. package/dist/cache/cache.interface.js.map +1 -0
  47. package/dist/cache/cache.module.d.ts +5 -0
  48. package/dist/cache/cache.module.d.ts.map +1 -0
  49. package/dist/cache/cache.module.js +56 -0
  50. package/dist/cache/cache.module.js.map +1 -0
  51. package/dist/cache/cache.token.d.ts +2 -0
  52. package/dist/cache/cache.token.d.ts.map +1 -0
  53. package/dist/cache/cache.token.js +5 -0
  54. package/dist/cache/cache.token.js.map +1 -0
  55. package/dist/cache/memory/memory-cache.adapter.d.ts +15 -0
  56. package/dist/cache/memory/memory-cache.adapter.d.ts.map +1 -0
  57. package/dist/cache/memory/memory-cache.adapter.js +52 -0
  58. package/dist/cache/memory/memory-cache.adapter.js.map +1 -0
  59. package/dist/cache/redis/redis-cache.adapter.d.ts +16 -0
  60. package/dist/cache/redis/redis-cache.adapter.d.ts.map +1 -0
  61. package/dist/cache/redis/redis-cache.adapter.js +63 -0
  62. package/dist/cache/redis/redis-cache.adapter.js.map +1 -0
  63. package/dist/config/app-config.module.d.ts +3 -0
  64. package/dist/config/app-config.module.d.ts.map +1 -0
  65. package/dist/config/app-config.module.js +100 -0
  66. package/dist/config/app-config.module.js.map +1 -0
  67. package/dist/config/app-config.service.d.ts +29 -0
  68. package/dist/config/app-config.service.d.ts.map +1 -0
  69. package/dist/config/app-config.service.js +66 -0
  70. package/dist/config/app-config.service.js.map +1 -0
  71. package/dist/crypto/crypto.module.d.ts +3 -0
  72. package/dist/crypto/crypto.module.d.ts.map +1 -0
  73. package/dist/crypto/crypto.module.js +22 -0
  74. package/dist/crypto/crypto.module.js.map +1 -0
  75. package/dist/crypto/encryption.service.d.ts +9 -0
  76. package/dist/crypto/encryption.service.d.ts.map +1 -0
  77. package/dist/crypto/encryption.service.js +59 -0
  78. package/dist/crypto/encryption.service.js.map +1 -0
  79. package/dist/crypto/jwt.service.d.ts +28 -0
  80. package/dist/crypto/jwt.service.d.ts.map +1 -0
  81. package/dist/crypto/jwt.service.js +72 -0
  82. package/dist/crypto/jwt.service.js.map +1 -0
  83. package/dist/groups/dto/create-group.dto.d.ts +5 -0
  84. package/dist/groups/dto/create-group.dto.d.ts.map +1 -0
  85. package/dist/groups/dto/create-group.dto.js +34 -0
  86. package/dist/groups/dto/create-group.dto.js.map +1 -0
  87. package/dist/groups/groups.controller.d.ts +9 -0
  88. package/dist/groups/groups.controller.d.ts.map +1 -0
  89. package/dist/groups/groups.controller.js +60 -0
  90. package/dist/groups/groups.controller.js.map +1 -0
  91. package/dist/groups/groups.module.d.ts +3 -0
  92. package/dist/groups/groups.module.d.ts.map +1 -0
  93. package/dist/groups/groups.module.js +25 -0
  94. package/dist/groups/groups.module.js.map +1 -0
  95. package/dist/groups/groups.service.d.ts +9 -0
  96. package/dist/groups/groups.service.d.ts.map +1 -0
  97. package/dist/groups/groups.service.js +45 -0
  98. package/dist/groups/groups.service.js.map +1 -0
  99. package/dist/health/health.controller.d.ts +13 -0
  100. package/dist/health/health.controller.d.ts.map +1 -0
  101. package/dist/health/health.controller.js +68 -0
  102. package/dist/health/health.controller.js.map +1 -0
  103. package/dist/health/health.module.d.ts +3 -0
  104. package/dist/health/health.module.d.ts.map +1 -0
  105. package/dist/health/health.module.js +22 -0
  106. package/dist/health/health.module.js.map +1 -0
  107. package/dist/main.d.ts +3 -0
  108. package/dist/main.d.ts.map +1 -0
  109. package/dist/main.js +109 -0
  110. package/dist/main.js.map +1 -0
  111. package/dist/mcp/admin-mcp.controller.d.ts +13 -0
  112. package/dist/mcp/admin-mcp.controller.d.ts.map +1 -0
  113. package/dist/mcp/admin-mcp.controller.js +105 -0
  114. package/dist/mcp/admin-mcp.controller.js.map +1 -0
  115. package/dist/mcp/client-mcp.controller.d.ts +9 -0
  116. package/dist/mcp/client-mcp.controller.d.ts.map +1 -0
  117. package/dist/mcp/client-mcp.controller.js +63 -0
  118. package/dist/mcp/client-mcp.controller.js.map +1 -0
  119. package/dist/mcp/dto/create-mcp.dto.d.ts +11 -0
  120. package/dist/mcp/dto/create-mcp.dto.d.ts.map +1 -0
  121. package/dist/mcp/dto/create-mcp.dto.js +74 -0
  122. package/dist/mcp/dto/create-mcp.dto.js.map +1 -0
  123. package/dist/mcp/dto/update-mcp.dto.d.ts +11 -0
  124. package/dist/mcp/dto/update-mcp.dto.d.ts.map +1 -0
  125. package/dist/mcp/dto/update-mcp.dto.js +71 -0
  126. package/dist/mcp/dto/update-mcp.dto.js.map +1 -0
  127. package/dist/mcp/mcp.module.d.ts +3 -0
  128. package/dist/mcp/mcp.module.d.ts.map +1 -0
  129. package/dist/mcp/mcp.module.js +26 -0
  130. package/dist/mcp/mcp.module.js.map +1 -0
  131. package/dist/mcp/mcp.service.d.ts +16 -0
  132. package/dist/mcp/mcp.service.d.ts.map +1 -0
  133. package/dist/mcp/mcp.service.js +78 -0
  134. package/dist/mcp/mcp.service.js.map +1 -0
  135. package/dist/metrics/metrics.controller.d.ts +12 -0
  136. package/dist/metrics/metrics.controller.d.ts.map +1 -0
  137. package/dist/metrics/metrics.controller.js +71 -0
  138. package/dist/metrics/metrics.controller.js.map +1 -0
  139. package/dist/metrics/metrics.module.d.ts +3 -0
  140. package/dist/metrics/metrics.module.d.ts.map +1 -0
  141. package/dist/metrics/metrics.module.js +20 -0
  142. package/dist/metrics/metrics.module.js.map +1 -0
  143. package/dist/oas/admin-oas.controller.d.ts +12 -0
  144. package/dist/oas/admin-oas.controller.d.ts.map +1 -0
  145. package/dist/oas/admin-oas.controller.js +96 -0
  146. package/dist/oas/admin-oas.controller.js.map +1 -0
  147. package/dist/oas/client-oas.controller.d.ts +9 -0
  148. package/dist/oas/client-oas.controller.d.ts.map +1 -0
  149. package/dist/oas/client-oas.controller.js +63 -0
  150. package/dist/oas/client-oas.controller.js.map +1 -0
  151. package/dist/oas/dto/create-oas.dto.d.ts +12 -0
  152. package/dist/oas/dto/create-oas.dto.d.ts.map +1 -0
  153. package/dist/oas/dto/create-oas.dto.js +82 -0
  154. package/dist/oas/dto/create-oas.dto.js.map +1 -0
  155. package/dist/oas/dto/update-oas.dto.d.ts +12 -0
  156. package/dist/oas/dto/update-oas.dto.d.ts.map +1 -0
  157. package/dist/oas/dto/update-oas.dto.js +77 -0
  158. package/dist/oas/dto/update-oas.dto.js.map +1 -0
  159. package/dist/oas/oas.module.d.ts +3 -0
  160. package/dist/oas/oas.module.d.ts.map +1 -0
  161. package/dist/oas/oas.module.js +26 -0
  162. package/dist/oas/oas.module.js.map +1 -0
  163. package/dist/oas/oas.service.d.ts +16 -0
  164. package/dist/oas/oas.service.d.ts.map +1 -0
  165. package/dist/oas/oas.service.js +79 -0
  166. package/dist/oas/oas.service.js.map +1 -0
  167. package/dist/otel/otel.d.ts +25 -0
  168. package/dist/otel/otel.d.ts.map +1 -0
  169. package/dist/otel/otel.js +61 -0
  170. package/dist/otel/otel.js.map +1 -0
  171. package/dist/storage/interfaces/repos.interface.d.ts +158 -0
  172. package/dist/storage/interfaces/repos.interface.d.ts.map +1 -0
  173. package/dist/storage/interfaces/repos.interface.js +4 -0
  174. package/dist/storage/interfaces/repos.interface.js.map +1 -0
  175. package/dist/storage/memory/memory-group.repo.d.ts +9 -0
  176. package/dist/storage/memory/memory-group.repo.d.ts.map +1 -0
  177. package/dist/storage/memory/memory-group.repo.js +33 -0
  178. package/dist/storage/memory/memory-group.repo.js.map +1 -0
  179. package/dist/storage/memory/memory-mcp.repo.d.ts +13 -0
  180. package/dist/storage/memory/memory-mcp.repo.d.ts.map +1 -0
  181. package/dist/storage/memory/memory-mcp.repo.js +65 -0
  182. package/dist/storage/memory/memory-mcp.repo.js.map +1 -0
  183. package/dist/storage/memory/memory-oas.repo.d.ts +13 -0
  184. package/dist/storage/memory/memory-oas.repo.d.ts.map +1 -0
  185. package/dist/storage/memory/memory-oas.repo.js +55 -0
  186. package/dist/storage/memory/memory-oas.repo.js.map +1 -0
  187. package/dist/storage/memory/memory-token.repo.d.ts +11 -0
  188. package/dist/storage/memory/memory-token.repo.d.ts.map +1 -0
  189. package/dist/storage/memory/memory-token.repo.js +39 -0
  190. package/dist/storage/memory/memory-token.repo.js.map +1 -0
  191. package/dist/storage/storage.module.d.ts +5 -0
  192. package/dist/storage/storage.module.d.ts.map +1 -0
  193. package/dist/storage/storage.module.js +84 -0
  194. package/dist/storage/storage.module.js.map +1 -0
  195. package/dist/storage/storage.tokens.d.ts +5 -0
  196. package/dist/storage/storage.tokens.d.ts.map +1 -0
  197. package/dist/storage/storage.tokens.js +8 -0
  198. package/dist/storage/storage.tokens.js.map +1 -0
  199. package/dist/storage/typeorm/entities/group.entity.d.ts +12 -0
  200. package/dist/storage/typeorm/entities/group.entity.d.ts.map +1 -0
  201. package/dist/storage/typeorm/entities/group.entity.js +57 -0
  202. package/dist/storage/typeorm/entities/group.entity.js.map +1 -0
  203. package/dist/storage/typeorm/entities/mcp-entry.entity.d.ts +16 -0
  204. package/dist/storage/typeorm/entities/mcp-entry.entity.d.ts.map +1 -0
  205. package/dist/storage/typeorm/entities/mcp-entry.entity.js +82 -0
  206. package/dist/storage/typeorm/entities/mcp-entry.entity.js.map +1 -0
  207. package/dist/storage/typeorm/entities/oas-entry.entity.d.ts +17 -0
  208. package/dist/storage/typeorm/entities/oas-entry.entity.d.ts.map +1 -0
  209. package/dist/storage/typeorm/entities/oas-entry.entity.js +87 -0
  210. package/dist/storage/typeorm/entities/oas-entry.entity.js.map +1 -0
  211. package/dist/storage/typeorm/entities/token.entity.d.ts +13 -0
  212. package/dist/storage/typeorm/entities/token.entity.d.ts.map +1 -0
  213. package/dist/storage/typeorm/entities/token.entity.js +68 -0
  214. package/dist/storage/typeorm/entities/token.entity.js.map +1 -0
  215. package/dist/storage/typeorm/typeorm-group.repo.d.ts +12 -0
  216. package/dist/storage/typeorm/typeorm-group.repo.d.ts.map +1 -0
  217. package/dist/storage/typeorm/typeorm-group.repo.js +50 -0
  218. package/dist/storage/typeorm/typeorm-group.repo.js.map +1 -0
  219. package/dist/storage/typeorm/typeorm-mcp.repo.d.ts +15 -0
  220. package/dist/storage/typeorm/typeorm-mcp.repo.d.ts.map +1 -0
  221. package/dist/storage/typeorm/typeorm-mcp.repo.js +88 -0
  222. package/dist/storage/typeorm/typeorm-mcp.repo.js.map +1 -0
  223. package/dist/storage/typeorm/typeorm-oas.repo.d.ts +15 -0
  224. package/dist/storage/typeorm/typeorm-oas.repo.d.ts.map +1 -0
  225. package/dist/storage/typeorm/typeorm-oas.repo.js +92 -0
  226. package/dist/storage/typeorm/typeorm-oas.repo.js.map +1 -0
  227. package/dist/storage/typeorm/typeorm-token.repo.d.ts +13 -0
  228. package/dist/storage/typeorm/typeorm-token.repo.d.ts.map +1 -0
  229. package/dist/storage/typeorm/typeorm-token.repo.js +56 -0
  230. package/dist/storage/typeorm/typeorm-token.repo.js.map +1 -0
  231. package/dist/tokens/dto/issue-token.dto.d.ts +6 -0
  232. package/dist/tokens/dto/issue-token.dto.d.ts.map +1 -0
  233. package/dist/tokens/dto/issue-token.dto.js +41 -0
  234. package/dist/tokens/dto/issue-token.dto.js.map +1 -0
  235. package/dist/tokens/tokens.controller.d.ts +12 -0
  236. package/dist/tokens/tokens.controller.d.ts.map +1 -0
  237. package/dist/tokens/tokens.controller.js +89 -0
  238. package/dist/tokens/tokens.controller.js.map +1 -0
  239. package/dist/tokens/tokens.module.d.ts +3 -0
  240. package/dist/tokens/tokens.module.d.ts.map +1 -0
  241. package/dist/tokens/tokens.module.js +27 -0
  242. package/dist/tokens/tokens.module.js.map +1 -0
  243. package/dist/tokens/tokens.service.d.ts +25 -0
  244. package/dist/tokens/tokens.service.d.ts.map +1 -0
  245. package/dist/tokens/tokens.service.js +69 -0
  246. package/dist/tokens/tokens.service.js.map +1 -0
  247. package/package.json +81 -0
@@ -0,0 +1,12 @@
1
+ import { GroupsService } from '../groups/groups.service';
2
+ import { TokensService } from './tokens.service';
3
+ import { IssueTokenDto } from './dto/issue-token.dto';
4
+ export declare class TokensController {
5
+ private readonly tokensService;
6
+ private readonly groupsService;
7
+ constructor(tokensService: TokensService, groupsService: GroupsService);
8
+ list(groupId: string): Promise<import("../storage/interfaces/repos.interface").Token[]>;
9
+ issue(groupId: string, dto: IssueTokenDto): Promise<import("./tokens.service").IssueTokenResult>;
10
+ revoke(id: string): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=tokens.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.controller.d.ts","sourceRoot":"","sources":["../../src/tokens/tokens.controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,qBAIa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa;IAOzC,IAAI,CAAmB,OAAO,EAAE,MAAM;IAUtC,KAAK,CAAmB,OAAO,EAAE,MAAM,EAAU,GAAG,EAAE,aAAa;IAgBnE,MAAM,CAAc,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGrD"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TokensController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const swagger_1 = require("@nestjs/swagger");
18
+ const admin_guard_1 = require("../auth/admin.guard");
19
+ const groups_service_1 = require("../groups/groups.service");
20
+ const tokens_service_1 = require("./tokens.service");
21
+ const issue_token_dto_1 = require("./dto/issue-token.dto");
22
+ let TokensController = class TokensController {
23
+ tokensService;
24
+ groupsService;
25
+ constructor(tokensService, groupsService) {
26
+ this.tokensService = tokensService;
27
+ this.groupsService = groupsService;
28
+ }
29
+ async list(groupId) {
30
+ await this.groupsService.findById(groupId); // 404 if group missing
31
+ return this.tokensService.listByGroup(groupId);
32
+ }
33
+ async issue(groupId, dto) {
34
+ const group = await this.groupsService.findById(groupId);
35
+ return this.tokensService.issue({
36
+ groupId: group.id,
37
+ groupName: group.name,
38
+ name: dto.name,
39
+ scopes: dto.scopes,
40
+ ttlSec: dto.ttlSec,
41
+ });
42
+ }
43
+ async revoke(id) {
44
+ await this.tokensService.revoke(id);
45
+ }
46
+ };
47
+ exports.TokensController = TokensController;
48
+ __decorate([
49
+ (0, common_1.Get)('groups/:groupId/tokens'),
50
+ (0, swagger_1.ApiOperation)({ summary: 'List tokens for a group (metadata only — JWTs not stored)' }),
51
+ (0, swagger_1.ApiResponse)({ status: 200, description: 'Token list' }),
52
+ (0, swagger_1.ApiResponse)({ status: 404, description: 'Group not found' }),
53
+ __param(0, (0, common_1.Param)('groupId')),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [String]),
56
+ __metadata("design:returntype", Promise)
57
+ ], TokensController.prototype, "list", null);
58
+ __decorate([
59
+ (0, common_1.Post)('groups/:groupId/tokens'),
60
+ (0, common_1.HttpCode)(201),
61
+ (0, swagger_1.ApiOperation)({ summary: 'Issue a JWT token for a group' }),
62
+ (0, swagger_1.ApiResponse)({ status: 201, description: 'Token issued successfully' }),
63
+ (0, swagger_1.ApiResponse)({ status: 404, description: 'Group not found' }),
64
+ __param(0, (0, common_1.Param)('groupId')),
65
+ __param(1, (0, common_1.Body)()),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", [String, issue_token_dto_1.IssueTokenDto]),
68
+ __metadata("design:returntype", Promise)
69
+ ], TokensController.prototype, "issue", null);
70
+ __decorate([
71
+ (0, common_1.Delete)('tokens/:id'),
72
+ (0, common_1.HttpCode)(204),
73
+ (0, swagger_1.ApiOperation)({ summary: 'Revoke a token by ID' }),
74
+ (0, swagger_1.ApiResponse)({ status: 204, description: 'Token revoked' }),
75
+ (0, swagger_1.ApiResponse)({ status: 404, description: 'Token not found' }),
76
+ __param(0, (0, common_1.Param)('id')),
77
+ __metadata("design:type", Function),
78
+ __metadata("design:paramtypes", [String]),
79
+ __metadata("design:returntype", Promise)
80
+ ], TokensController.prototype, "revoke", null);
81
+ exports.TokensController = TokensController = __decorate([
82
+ (0, swagger_1.ApiTags)('Admin / Tokens'),
83
+ (0, swagger_1.ApiSecurity)('AdminSecret'),
84
+ (0, common_1.Controller)('admin'),
85
+ (0, common_1.UseGuards)(admin_guard_1.AdminGuard),
86
+ __metadata("design:paramtypes", [tokens_service_1.TokensService,
87
+ groups_service_1.GroupsService])
88
+ ], TokensController);
89
+ //# sourceMappingURL=tokens.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.controller.js","sourceRoot":"","sources":["../../src/tokens/tokens.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class TokensModule {
2
+ }
3
+ //# sourceMappingURL=tokens.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.module.d.ts","sourceRoot":"","sources":["../../src/tokens/tokens.module.ts"],"names":[],"mappings":"AAOA,qBAMa,YAAY;CAAG"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TokensModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const auth_module_1 = require("../auth/auth.module");
12
+ const crypto_module_1 = require("../crypto/crypto.module");
13
+ const groups_module_1 = require("../groups/groups.module");
14
+ const tokens_controller_1 = require("./tokens.controller");
15
+ const tokens_service_1 = require("./tokens.service");
16
+ let TokensModule = class TokensModule {
17
+ };
18
+ exports.TokensModule = TokensModule;
19
+ exports.TokensModule = TokensModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [auth_module_1.AuthModule, crypto_module_1.CryptoModule, groups_module_1.GroupsModule],
22
+ controllers: [tokens_controller_1.TokensController],
23
+ providers: [tokens_service_1.TokensService],
24
+ exports: [tokens_service_1.TokensService],
25
+ })
26
+ ], TokensModule);
27
+ //# sourceMappingURL=tokens.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.module.js","sourceRoot":"","sources":["../../src/tokens/tokens.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAuC;AACvC,qDAAgD;AAChD,2DAAsD;AACtD,2DAAsD;AACtD,2DAAsD;AACtD,qDAAgD;AAQzC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IANxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,wBAAU,EAAE,4BAAY,EAAE,4BAAY,CAAC;QACjD,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,25 @@
1
+ import { AppConfigService } from '../config/app-config.service';
2
+ import { JwtService } from '../crypto/jwt.service';
3
+ import type { ICacheAdapter } from '../cache/cache.interface';
4
+ import type { ITokenRepo, Token } from '../storage/interfaces/repos.interface';
5
+ export interface IssueTokenResult {
6
+ token: Token;
7
+ jwt: string;
8
+ }
9
+ export declare class TokensService {
10
+ private readonly tokenRepo;
11
+ private readonly cache;
12
+ private readonly jwtService;
13
+ private readonly appConfig;
14
+ constructor(tokenRepo: ITokenRepo, cache: ICacheAdapter, jwtService: JwtService, appConfig: AppConfigService);
15
+ issue(opts: {
16
+ groupId: string;
17
+ groupName: string;
18
+ name: string;
19
+ scopes?: string[];
20
+ ttlSec?: number;
21
+ }): Promise<IssueTokenResult>;
22
+ listByGroup(groupId: string): Promise<Token[]>;
23
+ revoke(tokenId: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=tokens.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.service.d.ts","sourceRoot":"","sources":["../../src/tokens/tokens.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAI9E,MAAM,WAAW,gBAAgB;IAAG,KAAK,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAE/D,qBACa,aAAa;IAEF,OAAO,CAAC,QAAQ,CAAC,SAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHW,SAAS,EAAE,UAAU,EAClB,KAAK,EAAE,aAAa,EAC3C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,gBAAgB;IAGxC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAahI,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7C"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TokensService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const node_crypto_1 = require("node:crypto");
18
+ const app_config_service_1 = require("../config/app-config.service");
19
+ const jwt_service_1 = require("../crypto/jwt.service");
20
+ const cache_token_1 = require("../cache/cache.token");
21
+ const storage_tokens_1 = require("../storage/storage.tokens");
22
+ const BLACKLIST_PREFIX = 'jti:blacklist:';
23
+ let TokensService = class TokensService {
24
+ tokenRepo;
25
+ cache;
26
+ jwtService;
27
+ appConfig;
28
+ constructor(tokenRepo, cache, jwtService, appConfig) {
29
+ this.tokenRepo = tokenRepo;
30
+ this.cache = cache;
31
+ this.jwtService = jwtService;
32
+ this.appConfig = appConfig;
33
+ }
34
+ async issue(opts) {
35
+ const jti = (0, node_crypto_1.randomUUID)();
36
+ const scopes = opts.scopes ?? ['oas:read'];
37
+ const ttl = opts.ttlSec ?? this.appConfig.jwtDefaultTtl;
38
+ const expiresAt = ttl > 0 ? new Date(Date.now() + ttl * 1000) : null;
39
+ const [token, jwt] = await Promise.all([
40
+ this.tokenRepo.create({ groupId: opts.groupId, name: opts.name, jti, scopes, expiresAt }),
41
+ this.jwtService.sign({ groupId: opts.groupId, groupName: opts.groupName, jti, scopes, expiresAt }),
42
+ ]);
43
+ return { token, jwt };
44
+ }
45
+ async listByGroup(groupId) {
46
+ return this.tokenRepo.findByGroup(groupId);
47
+ }
48
+ async revoke(tokenId) {
49
+ const token = await this.tokenRepo.findById(tokenId);
50
+ if (!token)
51
+ throw new common_1.NotFoundException(`Token not found: ${tokenId}`);
52
+ if (token.revokedAt)
53
+ return;
54
+ await this.tokenRepo.revoke(tokenId, new Date());
55
+ const ttlSec = token.expiresAt
56
+ ? Math.max(1, Math.floor((token.expiresAt.getTime() - Date.now()) / 1000))
57
+ : 60 * 60 * 24 * 365;
58
+ await this.cache.set(`${BLACKLIST_PREFIX}${token.jti}`, true, ttlSec);
59
+ }
60
+ };
61
+ exports.TokensService = TokensService;
62
+ exports.TokensService = TokensService = __decorate([
63
+ (0, common_1.Injectable)(),
64
+ __param(0, (0, common_1.Inject)(storage_tokens_1.TOKEN_REPO)),
65
+ __param(1, (0, common_1.Inject)(cache_token_1.CACHE_ADAPTER)),
66
+ __metadata("design:paramtypes", [Object, Object, jwt_service_1.JwtService,
67
+ app_config_service_1.AppConfigService])
68
+ ], TokensService);
69
+ //# sourceMappingURL=tokens.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.service.js","sourceRoot":"","sources":["../../src/tokens/tokens.service.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@tronsfey/ucli-server",
3
+ "version": "0.5.0",
4
+ "description": "ucli server — centralized OpenAPI and MCP management server with multi-database support",
5
+ "keywords": ["openapi", "oas", "gateway", "nestjs", "jwt", "api-management"],
6
+ "license": "MIT",
7
+ "engines": { "node": ">=18" },
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist/**",
13
+ "assets/**",
14
+ "README.md",
15
+ "README.zh.md"
16
+ ],
17
+ "bin": {
18
+ "ucli-server": "./dist/main.js"
19
+ },
20
+ "main": "./dist/main.js",
21
+ "types": "./dist/main.d.ts",
22
+ "scripts": {
23
+ "dev": "ts-node-dev --respawn --transpile-only src/main.ts",
24
+ "build": "tsc -p tsconfig.json",
25
+ "build:full": "pnpm --filter @tronsfey/ucli-admin build && cp -r ../admin/dist ./dist/admin-ui && tsc -p tsconfig.json",
26
+ "prepack": "pnpm --filter @tronsfey/ucli-admin build && mkdir -p dist && cp -r ../admin/dist ./dist/admin-ui",
27
+ "start": "node dist/main.js",
28
+ "start:prod": "NODE_ENV=production node dist/main.js",
29
+ "test": "jest --config jest.config.js",
30
+ "test:e2e": "jest --config jest-e2e.config.js",
31
+ "test:coverage": "jest --config jest.config.js --coverage",
32
+ "lint": "tsc --noEmit",
33
+ "clean": "rm -rf dist"
34
+ },
35
+ "dependencies": {
36
+ "@nestjs/common": "^11.0.1",
37
+ "@nestjs/config": "^4.0.2",
38
+ "@nestjs/core": "^11.0.1",
39
+ "@nestjs/platform-express": "^11.0.1",
40
+ "@nestjs/swagger": "^8.1.0",
41
+ "@nestjs/terminus": "^11.0.0",
42
+ "@nestjs/throttler": "^6.4.0",
43
+ "@nestjs/typeorm": "^11.0.0",
44
+ "@opentelemetry/auto-instrumentations-node": "^0.71.0",
45
+ "@opentelemetry/exporter-trace-otlp-http": "^0.213.0",
46
+ "@opentelemetry/resources": "^2.6.0",
47
+ "@opentelemetry/sdk-node": "^0.213.0",
48
+ "@opentelemetry/semantic-conventions": "^1.40.0",
49
+ "class-transformer": "^0.5.1",
50
+ "class-validator": "^0.14.1",
51
+ "helmet": "^8.0.0",
52
+ "ioredis": "^5.6.0",
53
+ "joi": "^17.13.3",
54
+ "jose": "^5.10.0",
55
+ "mysql2": "^3.14.0",
56
+ "nestjs-pino": "^4.3.0",
57
+ "pg": "^8.13.3",
58
+ "pino": "^9.7.0",
59
+ "pino-http": "^10.4.0",
60
+ "pino-pretty": "^13.0.0",
61
+ "prom-client": "^15.1.3",
62
+ "reflect-metadata": "^0.2.2",
63
+ "rxjs": "^7.8.2",
64
+ "typeorm": "^0.3.21",
65
+ "uuid": "^11.1.0"
66
+ },
67
+ "devDependencies": {
68
+ "@nestjs/testing": "^11.0.1",
69
+ "@types/express": "^5.0.1",
70
+ "@types/jest": "^29.5.14",
71
+ "@types/node": "^22.14.0",
72
+ "@types/supertest": "^6.0.3",
73
+ "@types/uuid": "^10.0.0",
74
+ "jest": "^29.7.0",
75
+ "supertest": "^7.1.0",
76
+ "ts-jest": "^29.3.2",
77
+ "ts-node": "^10.9.2",
78
+ "ts-node-dev": "^2.0.0",
79
+ "typescript": "^5.7.3"
80
+ }
81
+ }