@pipeline-builder/api-core 3.1.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 (122) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +51 -0
  3. package/lib/constants/ai-providers.d.ts +41 -0
  4. package/lib/constants/ai-providers.js +88 -0
  5. package/lib/constants/http-status.d.ts +24 -0
  6. package/lib/constants/http-status.js +29 -0
  7. package/lib/constants/index.d.ts +3 -0
  8. package/lib/constants/index.js +22 -0
  9. package/lib/constants/time.d.ts +10 -0
  10. package/lib/constants/time.js +16 -0
  11. package/lib/errors/app-errors.d.ts +30 -0
  12. package/lib/errors/app-errors.js +62 -0
  13. package/lib/errors/index.d.ts +1 -0
  14. package/lib/errors/index.js +20 -0
  15. package/lib/helpers/access-helpers.d.ts +40 -0
  16. package/lib/helpers/access-helpers.js +56 -0
  17. package/lib/helpers/crud-helpers.d.ts +16 -0
  18. package/lib/helpers/crud-helpers.js +34 -0
  19. package/lib/helpers/index.d.ts +4 -0
  20. package/lib/helpers/index.js +23 -0
  21. package/lib/helpers/mask-helpers.d.ts +33 -0
  22. package/lib/helpers/mask-helpers.js +54 -0
  23. package/lib/helpers/sse-helpers.d.ts +13 -0
  24. package/lib/helpers/sse-helpers.js +40 -0
  25. package/lib/index.d.ts +57 -0
  26. package/lib/index.js +86 -0
  27. package/lib/middleware/auth.d.ts +50 -0
  28. package/lib/middleware/auth.js +171 -0
  29. package/lib/middleware/index.d.ts +1 -0
  30. package/lib/middleware/index.js +20 -0
  31. package/lib/openapi/extend-zod.d.ts +1 -0
  32. package/lib/openapi/extend-zod.js +8 -0
  33. package/lib/openapi/index.d.ts +2 -0
  34. package/lib/openapi/index.js +10 -0
  35. package/lib/openapi/registry.d.ts +17 -0
  36. package/lib/openapi/registry.js +42 -0
  37. package/lib/openapi/routes/billing-routes.d.ts +1 -0
  38. package/lib/openapi/routes/billing-routes.js +69 -0
  39. package/lib/openapi/routes/index.d.ts +5 -0
  40. package/lib/openapi/routes/index.js +22 -0
  41. package/lib/openapi/routes/message-routes.d.ts +1 -0
  42. package/lib/openapi/routes/message-routes.js +108 -0
  43. package/lib/openapi/routes/pipeline-routes.d.ts +1 -0
  44. package/lib/openapi/routes/pipeline-routes.js +90 -0
  45. package/lib/openapi/routes/plugin-routes.d.ts +1 -0
  46. package/lib/openapi/routes/plugin-routes.js +99 -0
  47. package/lib/openapi/routes/quota-routes.d.ts +1 -0
  48. package/lib/openapi/routes/quota-routes.js +65 -0
  49. package/lib/openapi/schema-registry.d.ts +25 -0
  50. package/lib/openapi/schema-registry.js +95 -0
  51. package/lib/routes/health.d.ts +47 -0
  52. package/lib/routes/health.js +81 -0
  53. package/lib/routes/index.d.ts +1 -0
  54. package/lib/routes/index.js +20 -0
  55. package/lib/services/admin-audit.d.ts +13 -0
  56. package/lib/services/admin-audit.js +31 -0
  57. package/lib/services/cache-service.d.ts +108 -0
  58. package/lib/services/cache-service.js +212 -0
  59. package/lib/services/compliance-client.d.ts +46 -0
  60. package/lib/services/compliance-client.js +102 -0
  61. package/lib/services/compliance-event-subscriber.d.ts +11 -0
  62. package/lib/services/compliance-event-subscriber.js +60 -0
  63. package/lib/services/compliance-queue.d.ts +11 -0
  64. package/lib/services/compliance-queue.js +38 -0
  65. package/lib/services/entity-events.d.ts +44 -0
  66. package/lib/services/entity-events.js +63 -0
  67. package/lib/services/http-client.d.ts +108 -0
  68. package/lib/services/http-client.js +285 -0
  69. package/lib/services/index.d.ts +10 -0
  70. package/lib/services/index.js +40 -0
  71. package/lib/services/quota.d.ts +59 -0
  72. package/lib/services/quota.js +137 -0
  73. package/lib/services/retry-strategy.d.ts +74 -0
  74. package/lib/services/retry-strategy.js +127 -0
  75. package/lib/types/billing.d.ts +47 -0
  76. package/lib/types/billing.js +5 -0
  77. package/lib/types/common.d.ts +161 -0
  78. package/lib/types/common.js +53 -0
  79. package/lib/types/error-codes.d.ts +38 -0
  80. package/lib/types/error-codes.js +77 -0
  81. package/lib/types/feature-flags.d.ts +38 -0
  82. package/lib/types/feature-flags.js +107 -0
  83. package/lib/types/http.d.ts +37 -0
  84. package/lib/types/http.js +5 -0
  85. package/lib/types/index.d.ts +7 -0
  86. package/lib/types/index.js +26 -0
  87. package/lib/types/pipeline.d.ts +70 -0
  88. package/lib/types/pipeline.js +44 -0
  89. package/lib/types/quota-tiers.d.ts +23 -0
  90. package/lib/types/quota-tiers.js +26 -0
  91. package/lib/utils/alias-resolver.d.ts +16 -0
  92. package/lib/utils/alias-resolver.js +49 -0
  93. package/lib/utils/headers.d.ts +18 -0
  94. package/lib/utils/headers.js +24 -0
  95. package/lib/utils/identity.d.ts +61 -0
  96. package/lib/utils/identity.js +75 -0
  97. package/lib/utils/index.d.ts +7 -0
  98. package/lib/utils/index.js +26 -0
  99. package/lib/utils/logger.d.ts +28 -0
  100. package/lib/utils/logger.js +77 -0
  101. package/lib/utils/object.d.ts +13 -0
  102. package/lib/utils/object.js +21 -0
  103. package/lib/utils/params.d.ts +89 -0
  104. package/lib/utils/params.js +148 -0
  105. package/lib/utils/response.d.ts +142 -0
  106. package/lib/utils/response.js +237 -0
  107. package/lib/validation/ai-schemas.d.ts +61 -0
  108. package/lib/validation/ai-schemas.js +81 -0
  109. package/lib/validation/common-schemas.d.ts +72 -0
  110. package/lib/validation/common-schemas.js +58 -0
  111. package/lib/validation/index.d.ts +6 -0
  112. package/lib/validation/index.js +25 -0
  113. package/lib/validation/message-schemas.d.ts +79 -0
  114. package/lib/validation/message-schemas.js +42 -0
  115. package/lib/validation/middleware.d.ts +60 -0
  116. package/lib/validation/middleware.js +77 -0
  117. package/lib/validation/pipeline-schemas.d.ts +135 -0
  118. package/lib/validation/pipeline-schemas.js +85 -0
  119. package/lib/validation/plugin-schemas.d.ts +127 -0
  120. package/lib/validation/plugin-schemas.js +84 -0
  121. package/openapi.yaml +292 -0
  122. package/package.json +127 -0
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SYSTEM_ORG_ID = void 0;
9
+ exports.requireAuth = requireAuth;
10
+ exports.requireOrganization = requireOrganization;
11
+ exports.requireAdmin = requireAdmin;
12
+ exports.isSystemOrgId = isSystemOrgId;
13
+ exports.isSystemOrg = isSystemOrg;
14
+ exports.isSystemAdmin = isSystemAdmin;
15
+ exports.requireSystemAdmin = requireSystemAdmin;
16
+ exports.requireFeature = requireFeature;
17
+ exports.resolveAccessModifier = resolveAccessModifier;
18
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
19
+ const http_status_1 = require("../constants/http-status");
20
+ const error_codes_1 = require("../types/error-codes");
21
+ const headers_1 = require("../utils/headers");
22
+ const logger_1 = require("../utils/logger");
23
+ const response_1 = require("../utils/response");
24
+ const logger = (0, logger_1.createLogger)('auth-middleware');
25
+ /** Cached JWT secret with periodic refresh from env var. */
26
+ let _jwtSecret;
27
+ let _jwtSecretRefreshedAt = 0;
28
+ const JWT_SECRET_REFRESH_INTERVAL_MS = 300_000; // 5 minutes
29
+ function getJwtSecret() {
30
+ const now = Date.now();
31
+ if (!_jwtSecret || now - _jwtSecretRefreshedAt > JWT_SECRET_REFRESH_INTERVAL_MS) {
32
+ const secret = process.env.JWT_SECRET;
33
+ if (!secret) {
34
+ logger.error('JWT_SECRET environment variable is not set');
35
+ throw new Error('JWT_SECRET environment variable is required');
36
+ }
37
+ if (_jwtSecret && _jwtSecret !== secret) {
38
+ logger.info('JWT secret rotated');
39
+ }
40
+ _jwtSecret = secret;
41
+ _jwtSecretRefreshedAt = now;
42
+ }
43
+ return _jwtSecret;
44
+ }
45
+ function requireAuth(reqOrOptions, res, next) {
46
+ if (reqOrOptions && res && next && 'headers' in reqOrOptions) {
47
+ return _requireAuth({}, reqOrOptions, res, next);
48
+ }
49
+ const options = reqOrOptions || {};
50
+ return (req, resInner, nextInner) => {
51
+ _requireAuth(options, req, resInner, nextInner);
52
+ };
53
+ }
54
+ function _requireAuth(options, req, res, next) {
55
+ const authHeader = req.headers.authorization;
56
+ if (!authHeader) {
57
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authorization header required', error_codes_1.ErrorCode.TOKEN_MISSING);
58
+ }
59
+ const parts = authHeader.split(' ');
60
+ if (parts.length !== 2 || parts[0] !== 'Bearer') {
61
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Invalid authorization format. Use: Bearer <token>', error_codes_1.ErrorCode.TOKEN_INVALID);
62
+ }
63
+ try {
64
+ const decoded = jsonwebtoken_1.default.verify(parts[1], getJwtSecret());
65
+ if (decoded.type !== 'access') {
66
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Only access tokens can be used for API requests', error_codes_1.ErrorCode.TOKEN_INVALID);
67
+ }
68
+ if (!decoded.sub || !decoded.role) {
69
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Token missing required fields', error_codes_1.ErrorCode.TOKEN_INVALID);
70
+ }
71
+ req.user = { ...decoded };
72
+ if (options.allowOrgHeaderOverride) {
73
+ const headerOrgId = (0, headers_1.getHeaderString)(req.headers['x-org-id']);
74
+ const headerOrgName = (0, headers_1.getHeaderString)(req.headers['x-org-name']);
75
+ if (headerOrgId)
76
+ req.user.organizationId = headerOrgId;
77
+ if (headerOrgName)
78
+ req.user.organizationName = headerOrgName;
79
+ }
80
+ next();
81
+ }
82
+ catch (error) {
83
+ if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
84
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Token has expired', error_codes_1.ErrorCode.TOKEN_EXPIRED);
85
+ }
86
+ if (error instanceof jsonwebtoken_1.default.JsonWebTokenError) {
87
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Invalid token', error_codes_1.ErrorCode.TOKEN_INVALID);
88
+ }
89
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authentication failed', error_codes_1.ErrorCode.UNAUTHORIZED);
90
+ }
91
+ }
92
+ /** Requires organization membership. Use after requireAuth. */
93
+ function requireOrganization(req, res, next) {
94
+ if (!req.user) {
95
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authentication required', error_codes_1.ErrorCode.UNAUTHORIZED);
96
+ }
97
+ if (!req.user.organizationId) {
98
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.BAD_REQUEST, 'Organization membership required', error_codes_1.ErrorCode.ORG_MISMATCH);
99
+ }
100
+ next();
101
+ }
102
+ /**
103
+ * Requires admin role. Use after requireAuth.
104
+ * Permits users whose per-org role is 'admin' or 'owner'.
105
+ */
106
+ function requireAdmin(req, res, next) {
107
+ if (!req.user) {
108
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authentication required', error_codes_1.ErrorCode.UNAUTHORIZED);
109
+ }
110
+ if (req.user.role !== 'admin' && req.user.role !== 'owner') {
111
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.FORBIDDEN, 'Admin access required', error_codes_1.ErrorCode.INSUFFICIENT_PERMISSIONS);
112
+ }
113
+ next();
114
+ }
115
+ /** Organization ID/name that identifies the system (super-admin) tenant. */
116
+ exports.SYSTEM_ORG_ID = (process.env.SYSTEM_ORG_ID || 'system').toLowerCase();
117
+ /**
118
+ * Check if an orgId or orgName matches the system org.
119
+ * Use this instead of comparing directly against SYSTEM_ORG_ID,
120
+ * because the JWT orgId is a database ID (e.g. MongoDB ObjectId)
121
+ * while SYSTEM_ORG_ID is the well-known name "system".
122
+ */
123
+ function isSystemOrgId(orgId, orgName) {
124
+ return orgId?.toLowerCase() === exports.SYSTEM_ORG_ID || orgName?.toLowerCase() === exports.SYSTEM_ORG_ID;
125
+ }
126
+ function isSystemOrg(req) {
127
+ if (!req.user)
128
+ return false;
129
+ return isSystemOrgId(req.user.organizationId, req.user.organizationName);
130
+ }
131
+ /**
132
+ * Check if the request is from a system admin.
133
+ * A system admin has per-org role 'admin' or 'owner' in the system organization.
134
+ */
135
+ function isSystemAdmin(req) {
136
+ return (req.user?.role === 'admin' || req.user?.role === 'owner') && isSystemOrg(req);
137
+ }
138
+ /** Requires system admin (admin role + system organization). */
139
+ function requireSystemAdmin(req, res, next) {
140
+ if (!isSystemAdmin(req)) {
141
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.FORBIDDEN, 'Access denied. Only system administrators can perform this action.', error_codes_1.ErrorCode.INSUFFICIENT_PERMISSIONS);
142
+ }
143
+ next();
144
+ }
145
+ /**
146
+ * Require a specific feature flag. Use after requireAuth.
147
+ * Checks the `features` array in the JWT payload (set at token issuance).
148
+ * System org users always pass (all features enabled).
149
+ */
150
+ function requireFeature(feature) {
151
+ return (req, res, next) => {
152
+ if (!req.user) {
153
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.UNAUTHORIZED, 'Authentication required', error_codes_1.ErrorCode.UNAUTHORIZED);
154
+ }
155
+ // System org always has all features
156
+ if (isSystemOrg(req))
157
+ return next();
158
+ if (!req.user.features?.includes(feature)) {
159
+ return (0, response_1.sendError)(res, http_status_1.HttpStatus.FORBIDDEN, `This feature requires a higher plan (${feature})`, error_codes_1.ErrorCode.INSUFFICIENT_PERMISSIONS);
160
+ }
161
+ next();
162
+ };
163
+ }
164
+ /** Only system admins can set access to 'public'; everyone else gets 'private'. */
165
+ function resolveAccessModifier(req, requested) {
166
+ if (requested === 'public' && isSystemAdmin(req)) {
167
+ return 'public';
168
+ }
169
+ return 'private';
170
+ }
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7OztBQTJEdEMsa0NBYUM7QUF1REQsa0RBY0M7QUFNRCxvQ0FjQztBQVdELHNDQUVDO0FBRUQsa0NBR0M7QUFNRCxzQ0FFQztBQUdELGdEQWFDO0FBT0Qsd0NBbUJDO0FBR0Qsc0RBS0M7QUExT0QsZ0VBQStCO0FBQy9CLDBEQUFzRDtBQUV0RCxzREFBaUQ7QUFDakQsOENBQW1EO0FBQ25ELDRDQUErQztBQUMvQyxnREFBOEM7QUFFOUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFL0MsNERBQTREO0FBQzVELElBQUksVUFBOEIsQ0FBQztBQUNuQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVk7QUFFNUQsU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsR0FBRyxxQkFBcUIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELFVB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LENBQUMsR0FBWSxFQUFFLFNBQTZCO0lBQy9FLElBQUksU0FBUyxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzJztcbmltcG9ydCB7IEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24nO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuXG4vKiogQ2FjaGVkIEpXVCBzZWNyZXQgd2l0aCBwZXJpb2RpYyByZWZyZXNoIGZyb20gZW52IHZhci4gKi9cbmxldCBfand0U2VjcmV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgX2p3dFNlY3JldFJlZnJlc2hlZEF0ID0gMDtcbmNvbnN0IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG5mdW5jdGlvbiBnZXRKd3RTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFfand0U2VjcmV0IHx8IG5vdyAtIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA+IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIGNvbnN0IHNlY3JldCA9IHByb2Nlc3MuZW52LkpXVF9TRUNSRVQ7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSldUX1NFQ1JFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKF9qd3RTZWNyZXQgJiYgX2p3dFNlY3JldCAhPT0gc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuaW5mbygnSldUIHNlY3JldCByb3RhdGVkJyk7XG4gICAgfVxuICAgIF9qd3RTZWNyZXQgPSBzZWNyZXQ7XG4gICAgX2p3dFNlY3JldFJlZnJlc2hlZEF0ID0gbm93O1xuICB9XG4gIHJldHVybiBfand0U2VjcmV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqICoqU0VDVVJJVFkgV0FSTklORzoqKiBXaGVuIGVuYWJsZWQsIGEgY2FsbGVyIGNhbiBzZXQgYHgtb3JnLWlkYCB0byBBTllcbiAgICogb3JnYW5pemF0aW9uIElELCBlZmZlY3RpdmVseSBpbXBlcnNvbmF0aW5nIHRoYXQgb3JnLiBUaGlzIE1VU1Qgb25seSBiZVxuICAgKiB1c2VkIG9uIHJvdXRlcyB0aGF0IGFyZTpcbiAgICogICAxLiBJbnRlcm5hbCBzZXJ2aWNlLXRvLXNlcnZpY2Ugcm91dGVzIChub3QgZXhwb3NlZCB0byBlbmQgdXNlcnMpXG4gICAqICAgMi4gQmVoaW5kIG5ldHdvcmsgaXNvbGF0aW9uIChjb250YWluZXIgbmV0d29yaywgVlBDLCBldGMuKVxuICAgKlxuICAgKiBORVZFUiBlbmFibGUgdGhpcyBvbiB1c2VyLWZhY2luZyBBUEkgcm91dGVzLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgX3JlcXVpcmVBdXRoKG9wdGlvbnMsIHJlcSwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBqd3QudmVyaWZ5KHBhcnRzWzFdLCBnZXRKd3RTZWNyZXQoKSkgYXMgSnd0UGF5bG9hZDtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG5cbi8qKiBSZXF1aXJlcyBvcmdhbml6YXRpb24gbWVtYmVyc2hpcC4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVPcmdhbml6YXRpb24oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghcmVxLnVzZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG5cbiAgaWYgKCFyZXEudXNlci5vcmdhbml6YXRpb25JZCkge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLkJBRF9SRVFVRVNULCAnT3JnYW5pemF0aW9uIG1lbWJlcnNoaXAgcmVxdWlyZWQnLCBFcnJvckNvZGUuT1JHX01JU01BVENIKTtcbiAgfVxuXG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhZG1pbiByb2xlLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBQZXJtaXRzIHVzZXJzIHdob3NlIHBlci1vcmcgcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghcmVxLnVzZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG5cbiAgaWYgKHJlcS51c2VyLnJvbGUgIT09ICdhZG1pbicgJiYgcmVxLnVzZXIucm9sZSAhPT0gJ293bmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTiwgJ0FkbWluIGFjY2VzcyByZXF1aXJlZCcsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICB9XG5cbiAgbmV4dCgpO1xufVxuXG4vKiogT3JnYW5pemF0aW9uIElEL25hbWUgdGhhdCBpZGVudGlmaWVzIHRoZSBzeXN0ZW0gKHN1cGVyLWFkbWluKSB0ZW5hbnQuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19JRCA9IChwcm9jZXNzLmVudi5TWVNURU1fT1JHX0lEIHx8ICdzeXN0ZW0nKS50b0xvd2VyQ2FzZSgpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9yZ0lkIG9yIG9yZ05hbWUgbWF0Y2hlcyB0aGUgc3lzdGVtIG9yZy5cbiAqIFVzZSB0aGlzIGluc3RlYWQgb2YgY29tcGFyaW5nIGRpcmVjdGx5IGFnYWluc3QgU1lTVEVNX09SR19JRCxcbiAqIGJlY2F1c2UgdGhlIEpXVCBvcmdJZCBpcyBhIGRhdGFiYXNlIElEIChlLmcuIE1vbmdvREIgT2JqZWN0SWQpXG4gKiB3aGlsZSBTWVNURU1fT1JHX0lEIGlzIHRoZSB3ZWxsLWtub3duIG5hbWUgXCJzeXN0ZW1cIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtT3JnSWQob3JnSWQ/OiBzdHJpbmcsIG9yZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yZ0lkPy50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEIHx8IG9yZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZyhyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgaWYgKCFyZXEudXNlcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNTeXN0ZW1PcmdJZChyZXEudXNlci5vcmdhbml6YXRpb25JZCwgcmVxLnVzZXIub3JnYW5pemF0aW9uTmFtZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBhIHN5c3RlbSBhZG1pbi5cbiAqIEEgc3lzdGVtIGFkbWluIGhhcyBwZXItb3JnIHJvbGUgJ2FkbWluJyBvciAnb3duZXInIGluIHRoZSBzeXN0ZW0gb3JnYW5pemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1BZG1pbihyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXEudXNlcj8ucm9sZSA9PT0gJ2FkbWluJyB8fCByZXEudXNlcj8ucm9sZSA9PT0gJ293bmVyJykgJiYgaXNTeXN0ZW1PcmcocmVxKTtcbn1cblxuLyoqIFJlcXVpcmVzIHN5c3RlbSBhZG1pbiAoYWRtaW4gcm9sZSArIHN5c3RlbSBvcmdhbml6YXRpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTeXN0ZW1BZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFpc1N5c3RlbUFkbWluKHJlcSkpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICdBY2Nlc3MgZGVuaWVkLiBPbmx5IHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gcGVyZm9ybSB0aGlzIGFjdGlvbi4nLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9XG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlIGEgc3BlY2lmaWMgZmVhdHVyZSBmbGFnLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBDaGVja3MgdGhlIGBmZWF0dXJlc2AgYXJyYXkgaW4gdGhlIEpXVCBwYXlsb2FkIChzZXQgYXQgdG9rZW4gaXNzdWFuY2UpLlxuICogU3lzdGVtIG9yZyB1c2VycyBhbHdheXMgcGFzcyAoYWxsIGZlYXR1cmVzIGVuYWJsZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKSB7XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cblxuICAgIC8vIFN5c3RlbSBvcmcgYWx3YXlzIGhhcyBhbGwgZmVhdHVyZXNcbiAgICBpZiAoaXNTeXN0ZW1PcmcocmVxKSkgcmV0dXJuIG5leHQoKTtcblxuICAgIGlmICghcmVxLnVzZXIuZmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICBgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIGEgaGlnaGVyIHBsYW4gKCR7ZmVhdHVyZX0pYCxcbiAgICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKiogT25seSBzeXN0ZW0gYWRtaW5zIGNhbiBzZXQgYWNjZXNzIHRvICdwdWJsaWMnOyBldmVyeW9uZSBlbHNlIGdldHMgJ3ByaXZhdGUnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY2Nlc3NNb2RpZmllcihyZXE6IFJlcXVlc3QsIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogJ3B1YmxpYycgfCAncHJpdmF0ZScge1xuICBpZiAocmVxdWVzdGVkID09PSAncHVibGljJyAmJiBpc1N5c3RlbUFkbWluKHJlcSkpIHtcbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJztcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from './auth';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ __exportStar(require("./auth"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUV0Qyx5Q0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9hdXRoJztcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
6
+ const zod_1 = require("zod");
7
+ (0, zod_to_openapi_1.extendZodWithOpenApi)(zod_1.z);
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5kLXpvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL2V4dGVuZC16b2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBRXRDLG1FQUFzRTtBQUN0RSw2QkFBd0I7QUFFeEIsSUFBQSxxQ0FBb0IsRUFBQyxPQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBleHRlbmRab2RXaXRoT3BlbkFwaSB9IGZyb20gJ0Bhc3RlYXNvbHV0aW9ucy96b2QtdG8tb3BlbmFwaSc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuZXh0ZW5kWm9kV2l0aE9wZW5BcGkoeik7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { registry, generateOpenApiSpec } from './registry';
2
+ export type { OpenApiSpecOptions } from './registry';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.generateOpenApiSpec = exports.registry = void 0;
6
+ // Public API
7
+ var registry_1 = require("./registry");
8
+ Object.defineProperty(exports, "registry", { enumerable: true, get: function () { return registry_1.registry; } });
9
+ Object.defineProperty(exports, "generateOpenApiSpec", { enumerable: true, get: function () { return registry_1.generateOpenApiSpec; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBRXRDLGFBQWE7QUFDYix1Q0FBMkQ7QUFBbEQsb0dBQUEsUUFBUSxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy8gUHVibGljIEFQSVxuZXhwb3J0IHsgcmVnaXN0cnksIGdlbmVyYXRlT3BlbkFwaVNwZWMgfSBmcm9tICcuL3JlZ2lzdHJ5JztcbmV4cG9ydCB0eXBlIHsgT3BlbkFwaVNwZWNPcHRpb25zIH0gZnJvbSAnLi9yZWdpc3RyeSc7XG4iXX0=
@@ -0,0 +1,17 @@
1
+ import { OpenAPIRegistry, OpenApiGeneratorV31 } from '@asteasolutions/zod-to-openapi';
2
+ /** Shared OpenAPI registry for all schema and path registrations. */
3
+ export declare const registry: OpenAPIRegistry;
4
+ /** Options for customizing the generated OpenAPI spec. */
5
+ export interface OpenApiSpecOptions {
6
+ title?: string;
7
+ version?: string;
8
+ description?: string;
9
+ serverUrl?: string;
10
+ }
11
+ /**
12
+ * Generate the complete OpenAPI 3.1.0 specification document.
13
+ *
14
+ * @param options - Optional overrides for spec metadata
15
+ * @returns OpenAPI 3.1 specification object
16
+ */
17
+ export declare function generateOpenApiSpec(options?: OpenApiSpecOptions): ReturnType<OpenApiGeneratorV31['generateDocument']>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.registry = void 0;
6
+ exports.generateOpenApiSpec = generateOpenApiSpec;
7
+ const zod_to_openapi_1 = require("@asteasolutions/zod-to-openapi");
8
+ const routes_1 = require("./routes");
9
+ const schema_registry_1 = require("./schema-registry");
10
+ /** Shared OpenAPI registry for all schema and path registrations. */
11
+ exports.registry = new zod_to_openapi_1.OpenAPIRegistry();
12
+ let _initialized = false;
13
+ /** Execute all registrations once. */
14
+ function ensureInitialized() {
15
+ if (_initialized)
16
+ return;
17
+ _initialized = true;
18
+ (0, schema_registry_1.registerSchemas)();
19
+ (0, routes_1.registerAllRoutes)();
20
+ }
21
+ /**
22
+ * Generate the complete OpenAPI 3.1.0 specification document.
23
+ *
24
+ * @param options - Optional overrides for spec metadata
25
+ * @returns OpenAPI 3.1 specification object
26
+ */
27
+ function generateOpenApiSpec(options) {
28
+ ensureInitialized();
29
+ const generator = new zod_to_openapi_1.OpenApiGeneratorV31(exports.registry.definitions);
30
+ return generator.generateDocument({
31
+ openapi: '3.1.0',
32
+ info: {
33
+ title: options?.title ?? 'Pipeline Builder API',
34
+ version: options?.version ?? '1.0.0',
35
+ description: options?.description ?? 'CI/CD Pipeline Builder Platform API — manage pipelines, plugins, messages, quotas, and billing.',
36
+ },
37
+ servers: [
38
+ { url: options?.serverUrl ?? '/api', description: 'API base path' },
39
+ ],
40
+ });
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBa0N0QyxrREFpQkM7QUFqREQsbUVBQXNGO0FBRXRGLHFDQUE2QztBQUM3Qyx1REFBb0Q7QUFFcEQscUVBQXFFO0FBQ3hELFFBQUEsUUFBUSxHQUFHLElBQUksZ0NBQWUsRUFBRSxDQUFDO0FBVTlDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUV6QixzQ0FBc0M7QUFDdEMsU0FBUyxpQkFBaUI7SUFDeEIsSUFBSSxZQUFZO1FBQUUsT0FBTztJQUN6QixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLElBQUEsaUNBQWUsR0FBRSxDQUFDO0lBQ2xCLElBQUEsMEJBQWlCLEdBQUUsQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsT0FBNEI7SUFFNUIsaUJBQWlCLEVBQUUsQ0FBQztJQUVwQixNQUFNLFNBQVMsR0FBRyxJQUFJLG9DQUFtQixDQUFDLGdCQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEUsT0FBTyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsT0FBTyxFQUFFLE9BQU87UUFDaEIsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksc0JBQXNCO1lBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLE9BQU87WUFDcEMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLElBQUksaUdBQWlHO1NBQ3ZJO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxNQUFNLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRTtTQUNwRTtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgT3BlbkFQSVJlZ2lzdHJ5LCBPcGVuQXBpR2VuZXJhdG9yVjMxIH0gZnJvbSAnQGFzdGVhc29sdXRpb25zL3pvZC10by1vcGVuYXBpJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJBbGxSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgeyByZWdpc3RlclNjaGVtYXMgfSBmcm9tICcuL3NjaGVtYS1yZWdpc3RyeSc7XG5cbi8qKiBTaGFyZWQgT3BlbkFQSSByZWdpc3RyeSBmb3IgYWxsIHNjaGVtYSBhbmQgcGF0aCByZWdpc3RyYXRpb25zLiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE9wZW5BUElSZWdpc3RyeSgpO1xuXG4vKiogT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgdGhlIGdlbmVyYXRlZCBPcGVuQVBJIHNwZWMuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BcGlTcGVjT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgc2VydmVyVXJsPzogc3RyaW5nO1xufVxuXG5sZXQgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbi8qKiBFeGVjdXRlIGFsbCByZWdpc3RyYXRpb25zIG9uY2UuICovXG5mdW5jdGlvbiBlbnN1cmVJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgaWYgKF9pbml0aWFsaXplZCkgcmV0dXJuO1xuICBfaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICByZWdpc3RlclNjaGVtYXMoKTtcbiAgcmVnaXN0ZXJBbGxSb3V0ZXMoKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgT3BlbkFQSSAzLjEuMCBzcGVjaWZpY2F0aW9uIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3ZlcnJpZGVzIGZvciBzcGVjIG1ldGFkYXRhXG4gKiBAcmV0dXJucyBPcGVuQVBJIDMuMSBzcGVjaWZpY2F0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQXBpU3BlYyhcbiAgb3B0aW9ucz86IE9wZW5BcGlTcGVjT3B0aW9ucyxcbik6IFJldHVyblR5cGU8T3BlbkFwaUdlbmVyYXRvclYzMVsnZ2VuZXJhdGVEb2N1bWVudCddPiB7XG4gIGVuc3VyZUluaXRpYWxpemVkKCk7XG5cbiAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IE9wZW5BcGlHZW5lcmF0b3JWMzEocmVnaXN0cnkuZGVmaW5pdGlvbnMpO1xuICByZXR1cm4gZ2VuZXJhdG9yLmdlbmVyYXRlRG9jdW1lbnQoe1xuICAgIG9wZW5hcGk6ICczLjEuMCcsXG4gICAgaW5mbzoge1xuICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlID8/ICdQaXBlbGluZSBCdWlsZGVyIEFQSScsXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zPy52ZXJzaW9uID8/ICcxLjAuMCcsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucz8uZGVzY3JpcHRpb24gPz8gJ0NJL0NEIFBpcGVsaW5lIEJ1aWxkZXIgUGxhdGZvcm0gQVBJIOKAlCBtYW5hZ2UgcGlwZWxpbmVzLCBwbHVnaW5zLCBtZXNzYWdlcywgcXVvdGFzLCBhbmQgYmlsbGluZy4nLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAgeyB1cmw6IG9wdGlvbnM/LnNlcnZlclVybCA/PyAnL2FwaScsIGRlc2NyaXB0aW9uOiAnQVBJIGJhc2UgcGF0aCcgfSxcbiAgICBdLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export declare function registerBillingRoutes(): void;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.registerBillingRoutes = registerBillingRoutes;
6
+ const registry_1 = require("../registry");
7
+ const tags = ['Billing'];
8
+ const auth = [{ bearerAuth: [] }];
9
+ function registerBillingRoutes() {
10
+ registry_1.registry.registerPath({
11
+ method: 'get',
12
+ path: '/billing/plans',
13
+ summary: 'List active plans',
14
+ description: 'List all active billing plans. No authentication required.',
15
+ tags,
16
+ responses: { 200: { description: 'List of active billing plans' } },
17
+ });
18
+ registry_1.registry.registerPath({
19
+ method: 'get',
20
+ path: '/billing/plans/{planId}',
21
+ summary: 'Get plan by ID',
22
+ tags,
23
+ responses: { 200: { description: 'Plan details' }, 404: { description: 'Plan not found' } },
24
+ });
25
+ registry_1.registry.registerPath({
26
+ method: 'post',
27
+ path: '/billing/subscriptions',
28
+ summary: 'Create subscription',
29
+ description: 'Create a new billing subscription for the current organization.',
30
+ tags,
31
+ security: auth,
32
+ responses: { 201: { description: 'Subscription created' }, 400: { description: 'Validation error' } },
33
+ });
34
+ registry_1.registry.registerPath({
35
+ method: 'get',
36
+ path: '/billing/subscriptions',
37
+ summary: 'List subscriptions',
38
+ description: 'List billing subscriptions for the current organization.',
39
+ tags,
40
+ security: auth,
41
+ responses: { 200: { description: 'List of subscriptions' } },
42
+ });
43
+ registry_1.registry.registerPath({
44
+ method: 'put',
45
+ path: '/billing/subscriptions/{id}',
46
+ summary: 'Update subscription',
47
+ tags,
48
+ security: auth,
49
+ responses: { 200: { description: 'Subscription updated' }, 404: { description: 'Not found' } },
50
+ });
51
+ registry_1.registry.registerPath({
52
+ method: 'delete',
53
+ path: '/billing/subscriptions/{id}',
54
+ summary: 'Cancel subscription',
55
+ tags,
56
+ security: auth,
57
+ responses: { 200: { description: 'Subscription cancelled' }, 404: { description: 'Not found' } },
58
+ });
59
+ registry_1.registry.registerPath({
60
+ method: 'post',
61
+ path: '/billing/marketplace',
62
+ summary: 'AWS Marketplace integration',
63
+ description: 'Handle AWS Marketplace subscription events.',
64
+ tags,
65
+ security: auth,
66
+ responses: { 200: { description: 'Marketplace event processed' } },
67
+ });
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlbmFwaS9yb3V0ZXMvYmlsbGluZy1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBT3RDLHNEQWlFQztBQXRFRCwwQ0FBdUM7QUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QixNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEMsU0FBZ0IscUJBQXFCO0lBQ25DLG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixPQUFPLEVBQUUsbUJBQW1CO1FBQzVCLFdBQVcsRUFBRSw0REFBNEQ7UUFDekUsSUFBSTtRQUNKLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw4QkFBOEIsRUFBRSxFQUFFO0tBQ3BFLENBQUMsQ0FBQztJQUVILG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLElBQUk7UUFDSixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEVBQUU7S0FDNUYsQ0FBQyxDQUFDO0lBRUgsbUJBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUsd0JBQXdCO1FBQzlCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsV0FBVyxFQUFFLGlFQUFpRTtRQUM5RSxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtLQUN0RyxDQUFDLENBQUM7SUFFSCxtQkFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSx3QkFBd0I7UUFDOUIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsMERBQTBEO1FBQ3ZFLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxFQUFFO0tBQzdELENBQUMsQ0FBQztJQUVILG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLDZCQUE2QjtRQUNuQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRTtLQUMvRixDQUFDLENBQUM7SUFFSCxtQkFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsNkJBQTZCO1FBQ25DLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQ2pHLENBQUMsQ0FBQztJQUVILG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixPQUFPLEVBQUUsNkJBQTZCO1FBQ3RDLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFLEVBQUU7S0FDbkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuY29uc3QgdGFncyA9IFsnQmlsbGluZyddO1xuY29uc3QgYXV0aCA9IFt7IGJlYXJlckF1dGg6IFtdIH1dO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCaWxsaW5nUm91dGVzKCk6IHZvaWQge1xuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9iaWxsaW5nL3BsYW5zJyxcbiAgICBzdW1tYXJ5OiAnTGlzdCBhY3RpdmUgcGxhbnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBhbGwgYWN0aXZlIGJpbGxpbmcgcGxhbnMuIE5vIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLicsXG4gICAgdGFncyxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBhY3RpdmUgYmlsbGluZyBwbGFucycgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9iaWxsaW5nL3BsYW5zL3twbGFuSWR9JyxcbiAgICBzdW1tYXJ5OiAnR2V0IHBsYW4gYnkgSUQnLFxuICAgIHRhZ3MsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BsYW4gZGV0YWlscycgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnUGxhbiBub3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBwYXRoOiAnL2JpbGxpbmcvc3Vic2NyaXB0aW9ucycsXG4gICAgc3VtbWFyeTogJ0NyZWF0ZSBzdWJzY3JpcHRpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IGJpbGxpbmcgc3Vic2NyaXB0aW9uIGZvciB0aGUgY3VycmVudCBvcmdhbml6YXRpb24uJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDE6IHsgZGVzY3JpcHRpb246ICdTdWJzY3JpcHRpb24gY3JlYXRlZCcgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9iaWxsaW5nL3N1YnNjcmlwdGlvbnMnLFxuICAgIHN1bW1hcnk6ICdMaXN0IHN1YnNjcmlwdGlvbnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBiaWxsaW5nIHN1YnNjcmlwdGlvbnMgZm9yIHRoZSBjdXJyZW50IG9yZ2FuaXphdGlvbi4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0xpc3Qgb2Ygc3Vic2NyaXB0aW9ucycgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgcGF0aDogJy9iaWxsaW5nL3N1YnNjcmlwdGlvbnMve2lkfScsXG4gICAgc3VtbWFyeTogJ1VwZGF0ZSBzdWJzY3JpcHRpb24nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1N1YnNjcmlwdGlvbiB1cGRhdGVkJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgIHBhdGg6ICcvYmlsbGluZy9zdWJzY3JpcHRpb25zL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdDYW5jZWwgc3Vic2NyaXB0aW9uJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdTdWJzY3JpcHRpb24gY2FuY2VsbGVkJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBwYXRoOiAnL2JpbGxpbmcvbWFya2V0cGxhY2UnLFxuICAgIHN1bW1hcnk6ICdBV1MgTWFya2V0cGxhY2UgaW50ZWdyYXRpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnSGFuZGxlIEFXUyBNYXJrZXRwbGFjZSBzdWJzY3JpcHRpb24gZXZlbnRzLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnTWFya2V0cGxhY2UgZXZlbnQgcHJvY2Vzc2VkJyB9IH0sXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Register all OpenAPI route definitions with the shared registry.
3
+ * Call this once during spec generation initialization.
4
+ */
5
+ export declare function registerAllRoutes(): void;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.registerAllRoutes = registerAllRoutes;
6
+ const billing_routes_1 = require("./billing-routes");
7
+ const message_routes_1 = require("./message-routes");
8
+ const pipeline_routes_1 = require("./pipeline-routes");
9
+ const plugin_routes_1 = require("./plugin-routes");
10
+ const quota_routes_1 = require("./quota-routes");
11
+ /**
12
+ * Register all OpenAPI route definitions with the shared registry.
13
+ * Call this once during spec generation initialization.
14
+ */
15
+ function registerAllRoutes() {
16
+ (0, billing_routes_1.registerBillingRoutes)();
17
+ (0, message_routes_1.registerMessageRoutes)();
18
+ (0, pipeline_routes_1.registerPipelineRoutes)();
19
+ (0, plugin_routes_1.registerPluginRoutes)();
20
+ (0, quota_routes_1.registerQuotaRoutes)();
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlbmFwaS9yb3V0ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBWXRDLDhDQU1DO0FBaEJELHFEQUF5RDtBQUN6RCxxREFBeUQ7QUFDekQsdURBQTJEO0FBQzNELG1EQUF1RDtBQUN2RCxpREFBcUQ7QUFFckQ7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCO0lBQy9CLElBQUEsc0NBQXFCLEdBQUUsQ0FBQztJQUN4QixJQUFBLHNDQUFxQixHQUFFLENBQUM7SUFDeEIsSUFBQSx3Q0FBc0IsR0FBRSxDQUFDO0lBQ3pCLElBQUEsb0NBQW9CLEdBQUUsQ0FBQztJQUN2QixJQUFBLGtDQUFtQixHQUFFLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWdpc3RlckJpbGxpbmdSb3V0ZXMgfSBmcm9tICcuL2JpbGxpbmctcm91dGVzJztcbmltcG9ydCB7IHJlZ2lzdGVyTWVzc2FnZVJvdXRlcyB9IGZyb20gJy4vbWVzc2FnZS1yb3V0ZXMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQaXBlbGluZVJvdXRlcyB9IGZyb20gJy4vcGlwZWxpbmUtcm91dGVzJztcbmltcG9ydCB7IHJlZ2lzdGVyUGx1Z2luUm91dGVzIH0gZnJvbSAnLi9wbHVnaW4tcm91dGVzJztcbmltcG9ydCB7IHJlZ2lzdGVyUXVvdGFSb3V0ZXMgfSBmcm9tICcuL3F1b3RhLXJvdXRlcyc7XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIE9wZW5BUEkgcm91dGUgZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICogQ2FsbCB0aGlzIG9uY2UgZHVyaW5nIHNwZWMgZ2VuZXJhdGlvbiBpbml0aWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsUm91dGVzKCk6IHZvaWQge1xuICByZWdpc3RlckJpbGxpbmdSb3V0ZXMoKTtcbiAgcmVnaXN0ZXJNZXNzYWdlUm91dGVzKCk7XG4gIHJlZ2lzdGVyUGlwZWxpbmVSb3V0ZXMoKTtcbiAgcmVnaXN0ZXJQbHVnaW5Sb3V0ZXMoKTtcbiAgcmVnaXN0ZXJRdW90YVJvdXRlcygpO1xufVxuIl19
@@ -0,0 +1 @@
1
+ export declare function registerMessageRoutes(): void;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.registerMessageRoutes = registerMessageRoutes;
6
+ const registry_1 = require("../registry");
7
+ const tags = ['Messages'];
8
+ const auth = [{ bearerAuth: [] }];
9
+ function registerMessageRoutes() {
10
+ registry_1.registry.registerPath({
11
+ method: 'get',
12
+ path: '/messages',
13
+ summary: 'List inbox messages',
14
+ description: 'List root messages (inbox) with optional filtering by type and pagination.',
15
+ tags,
16
+ security: auth,
17
+ responses: { 200: { description: 'Paginated list of messages' } },
18
+ });
19
+ registry_1.registry.registerPath({
20
+ method: 'get',
21
+ path: '/messages/announcements',
22
+ summary: 'List announcements',
23
+ description: 'List announcement messages only.',
24
+ tags,
25
+ security: auth,
26
+ responses: { 200: { description: 'List of announcements' } },
27
+ });
28
+ registry_1.registry.registerPath({
29
+ method: 'get',
30
+ path: '/messages/conversations',
31
+ summary: 'List conversations',
32
+ description: 'List conversation messages only.',
33
+ tags,
34
+ security: auth,
35
+ responses: { 200: { description: 'List of conversations' } },
36
+ });
37
+ registry_1.registry.registerPath({
38
+ method: 'get',
39
+ path: '/messages/unread/count',
40
+ summary: 'Get unread count',
41
+ description: 'Get the number of unread messages for the current organization.',
42
+ tags,
43
+ security: auth,
44
+ responses: { 200: { description: 'Unread message count' } },
45
+ });
46
+ registry_1.registry.registerPath({
47
+ method: 'get',
48
+ path: '/messages/{id}',
49
+ summary: 'Get message by ID',
50
+ tags,
51
+ security: auth,
52
+ responses: { 200: { description: 'Message details' }, 404: { description: 'Not found' } },
53
+ });
54
+ registry_1.registry.registerPath({
55
+ method: 'get',
56
+ path: '/messages/{id}/thread',
57
+ summary: 'Get message thread',
58
+ description: 'Get all messages in a thread including the root message and replies.',
59
+ tags,
60
+ security: auth,
61
+ responses: { 200: { description: 'Thread messages sorted by date' } },
62
+ });
63
+ registry_1.registry.registerPath({
64
+ method: 'post',
65
+ path: '/messages',
66
+ summary: 'Create a message',
67
+ description: 'Create a new announcement or conversation message.',
68
+ tags,
69
+ security: auth,
70
+ responses: { 201: { description: 'Message created' }, 400: { description: 'Validation error' } },
71
+ });
72
+ registry_1.registry.registerPath({
73
+ method: 'post',
74
+ path: '/messages/{id}/reply',
75
+ summary: 'Reply to a message',
76
+ description: 'Create a reply in an existing message thread.',
77
+ tags,
78
+ security: auth,
79
+ responses: { 201: { description: 'Reply created' }, 404: { description: 'Parent message not found' } },
80
+ });
81
+ registry_1.registry.registerPath({
82
+ method: 'put',
83
+ path: '/messages/{id}/read',
84
+ summary: 'Mark message as read',
85
+ tags,
86
+ security: auth,
87
+ responses: { 200: { description: 'Message marked as read' } },
88
+ });
89
+ registry_1.registry.registerPath({
90
+ method: 'put',
91
+ path: '/messages/{id}/thread/read',
92
+ summary: 'Mark thread as read',
93
+ description: 'Mark all messages in a thread as read.',
94
+ tags,
95
+ security: auth,
96
+ responses: { 200: { description: 'Thread marked as read' } },
97
+ });
98
+ registry_1.registry.registerPath({
99
+ method: 'delete',
100
+ path: '/messages/{id}',
101
+ summary: 'Delete a message',
102
+ description: 'Soft-delete a message.',
103
+ tags,
104
+ security: auth,
105
+ responses: { 200: { description: 'Message deleted' }, 404: { description: 'Not found' } },
106
+ });
107
+ }
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlbmFwaS9yb3V0ZXMvbWVzc2FnZS1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBT3RDLHNEQTRHQztBQWpIRCwwQ0FBdUM7QUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxQixNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEMsU0FBZ0IscUJBQXFCO0lBQ25DLG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixXQUFXLEVBQUUsNEVBQTRFO1FBQ3pGLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRSxFQUFFO0tBQ2xFLENBQUMsQ0FBQztJQUVILG1CQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixPQUFPLEVBQUUsb0JBQW9CO1FBQzdCLFdBQVcsRUFBRSxrQ0FBa0M7UUFDL0MsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLEVBQUU7S0FDN0QsQ0FBQyxDQUFDO0lBRUgsbUJBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUseUJBQXlCO1FBQy9CLE9BQU8sRUFBRSxvQkFBb0I7UUFDN0IsV0FBVyxFQUFFLGtDQUFrQztRQUMvQyxJQUFJO1FBQ0osUUFBUSxFQUFF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QixPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLFdBQVcsRUFBRSx3QkFBd0I7UUFDckMsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQzFGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVnaXN0cnkgfSBmcm9tICcuLi9yZWdpc3RyeSc7XG5cbmNvbnN0IHRhZ3MgPSBbJ01lc3NhZ2VzJ107XG5jb25zdCBhdXRoID0gW3sgYmVhcmVyQXV0aDogW10gfV07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1lc3NhZ2VSb3V0ZXMoKTogdm9pZCB7XG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL21lc3NhZ2VzJyxcbiAgICBzdW1tYXJ5OiAnTGlzdCBpbmJveCBtZXNzYWdlcycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IHJvb3QgbWVzc2FnZXMgKGluYm94KSB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBieSB0eXBlIGFuZCBwYWdpbmF0aW9uLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnUGFnaW5hdGVkIGxpc3Qgb2YgbWVzc2FnZXMnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvbWVzc2FnZXMvYW5ub3VuY2VtZW50cycsXG4gICAgc3VtbWFyeTogJ0xpc3QgYW5ub3VuY2VtZW50cycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IGFubm91bmNlbWVudCBtZXNzYWdlcyBvbmx5LicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBhbm5vdW5jZW1lbnRzJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL21lc3NhZ2VzL2NvbnZlcnNhdGlvbnMnLFxuICAgIHN1bW1hcnk6ICdMaXN0IGNvbnZlcnNhdGlvbnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBjb252ZXJzYXRpb24gbWVzc2FnZXMgb25seS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0xpc3Qgb2YgY29udmVyc2F0aW9ucycgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9tZXNzYWdlcy91bnJlYWQvY291bnQnLFxuICAgIHN1bW1hcnk6ICdHZXQgdW5yZWFkIGNvdW50JyxcbiAgICBkZXNjcmlwdGlvbjogJ0dldCB0aGUgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgb3JnYW5pemF0aW9uLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVW5yZWFkIG1lc3NhZ2UgY291bnQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvbWVzc2FnZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0dldCBtZXNzYWdlIGJ5IElEJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRldGFpbHMnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9tZXNzYWdlcy97aWR9L3RocmVhZCcsXG4gICAgc3VtbWFyeTogJ0dldCBtZXNzYWdlIHRocmVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdHZXQgYWxsIG1lc3NhZ2VzIGluIGEgdGhyZWFkIGluY2x1ZGluZyB0aGUgcm9vdCBtZXNzYWdlIGFuZCByZXBsaWVzLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVGhyZWFkIG1lc3NhZ2VzIHNvcnRlZCBieSBkYXRlJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncG9zdCcsXG4gICAgcGF0aDogJy9tZXNzYWdlcycsXG4gICAgc3VtbWFyeTogJ0NyZWF0ZSBhIG1lc3NhZ2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IGFubm91bmNlbWVudCBvciBjb252ZXJzYXRpb24gbWVzc2FnZS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMTogeyBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgY3JlYXRlZCcgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvbWVzc2FnZXMve2lkfS9yZXBseScsXG4gICAgc3VtbWFyeTogJ1JlcGx5IHRvIGEgbWVzc2FnZScsXG4gICAgZGVzY3JpcHRpb246ICdDcmVhdGUgYSByZXBseSBpbiBhbiBleGlzdGluZyBtZXNzYWdlIHRocmVhZC4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMTogeyBkZXNjcmlwdGlvbjogJ1JlcGx5IGNyZWF0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ1BhcmVudCBtZXNzYWdlIG5vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgcGF0aDogJy9tZXNzYWdlcy97aWR9L3JlYWQnLFxuICAgIHN1bW1hcnk6ICdNYXJrIG1lc3NhZ2UgYXMgcmVhZCcsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBtYXJrZWQgYXMgcmVhZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgcGF0aDogJy9tZXNzYWdlcy97aWR9L3RocmVhZC9yZWFkJyxcbiAgICBzdW1tYXJ5OiAnTWFyayB0aHJlYWQgYXMgcmVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdNYXJrIGFsbCBtZXNzYWdlcyBpbiBhIHRocmVhZCBhcyByZWFkLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVGhyZWFkIG1hcmtlZCBhcyByZWFkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAgICBwYXRoOiAnL21lc3NhZ2VzL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdEZWxldGUgYSBtZXNzYWdlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NvZnQtZGVsZXRlIGEgbWVzc2FnZS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGVsZXRlZCcgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnTm90IGZvdW5kJyB9IH0sXG4gIH0pO1xufVxuIl19
@@ -0,0 +1 @@
1
+ export declare function registerPipelineRoutes(): void;