@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,53 @@
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.VALID_QUOTA_TYPES = void 0;
6
+ exports.isValidQuotaType = isValidQuotaType;
7
+ exports.validateQuotaType = validateQuotaType;
8
+ /**
9
+ * Valid quota type values.
10
+ */
11
+ exports.VALID_QUOTA_TYPES = ['plugins', 'pipelines', 'apiCalls'];
12
+ /**
13
+ * Type guard to check if a value is a valid QuotaType.
14
+ *
15
+ * @param value - Value to check
16
+ * @returns True if value is a valid QuotaType
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * if (isValidQuotaType(req.body.quotaType)) {
21
+ * // quotaType is guaranteed to be QuotaType
22
+ * }
23
+ * ```
24
+ */
25
+ function isValidQuotaType(value) {
26
+ return typeof value === 'string' && exports.VALID_QUOTA_TYPES.includes(value);
27
+ }
28
+ /**
29
+ * Validate and assert that a value is a valid QuotaType.
30
+ * Throws an error if validation fails.
31
+ *
32
+ * @param value - Value to validate
33
+ * @param fieldName - Name of the field being validated (for error messages)
34
+ * @returns The validated QuotaType
35
+ * @throws Error if value is not a valid QuotaType
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * try {
40
+ * const quotaType = validateQuotaType(req.body.quotaType, 'quotaType');
41
+ * // Use quotaType safely
42
+ * } catch (err) {
43
+ * return sendError(res, 400, err.message);
44
+ * }
45
+ * ```
46
+ */
47
+ function validateQuotaType(value, fieldName = 'quotaType') {
48
+ if (!isValidQuotaType(value)) {
49
+ throw new Error(`Invalid ${fieldName}: "${value}". Must be one of: ${exports.VALID_QUOTA_TYPES.join(', ')}`);
50
+ }
51
+ return value;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBeUJ0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQWhERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRS9FOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUkseUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQWtCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEtBQWMsRUFBRSxTQUFTLEdBQUcsV0FBVztJQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsU0FBUyxNQUFNLEtBQUssc0JBQXNCLHlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNwRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFF1b3RhIHR5cGUgaWRlbnRpZmllcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhVHlwZSA9ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gWydwbHVnaW5zJywgJ3BpcGVsaW5lcycsICdhcGlDYWxscyddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNWYWxpZFF1b3RhVHlwZShyZXEuYm9keS5xdW90YVR5cGUpKSB7XG4gKiAgIC8vIHF1b3RhVHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIFF1b3RhVHlwZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUXVvdGFUeXBlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfUVVPVEFfVFlQRVMuaW5jbHVkZXModmFsdWUgYXMgUXVvdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgYXNzZXJ0IHRoYXQgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqIFRocm93cyBhbiBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZmllbGROYW1lIC0gTmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgdmFsaWRhdGVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIFF1b3RhVHlwZVxuICogQHRocm93cyBFcnJvciBpZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgY29uc3QgcXVvdGFUeXBlID0gdmFsaWRhdGVRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlLCAncXVvdGFUeXBlJyk7XG4gKiAgIC8vIFVzZSBxdW90YVR5cGUgc2FmZWx5XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIDQwMCwgZXJyLm1lc3NhZ2UpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVF1b3RhVHlwZSh2YWx1ZTogdW5rbm93biwgZmllbGROYW1lID0gJ3F1b3RhVHlwZScpOiBRdW90YVR5cGUge1xuICBpZiAoIWlzVmFsaWRRdW90YVR5cGUodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgJHtmaWVsZE5hbWV9OiBcIiR7dmFsdWV9XCIuIE11c3QgYmUgb25lIG9mOiAke1ZBTElEX1FVT1RBX1RZUEVTLmpvaW4oJywgJyl9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBxdW90YSBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFDaGVja1Jlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgKi9cbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gcXVvdGEgbGltaXQgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIGxpbWl0OiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHVzYWdlIGNvdW50ICovXG4gIHVzZWQ6IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyBxdW90YSAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gcXVvdGEgcmVzZXRzICovXG4gIHJlc2V0QXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcXVvdGEgaXMgdW5saW1pdGVkICovXG4gIHVubGltaXRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdW90YSBpbmZvcm1hdGlvbiBmb3IgZXJyb3IgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhSW5mbyB7XG4gIHR5cGU6IFF1b3RhVHlwZTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdXNlZDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgc3VjY2VzcyByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgc3VjY2VzczogdHJ1ZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBkYXRhPzogVDtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgZXJyb3IgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3JSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGZhbHNlO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgZGV0YWlscz86IHVua25vd247XG4gIHF1b3RhPzogUXVvdGFJbmZvO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIEFQSSByZXNwb25zZSB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZTxUID0gdW5rbm93bj4gPSBBcGlTdWNjZXNzUmVzcG9uc2U8VD4gfCBBcGlFcnJvclJlc3BvbnNlO1xuXG4vKipcbiAqIEpXVCBwYXlsb2FkIGZyb20gYWNjZXNzIHRva2Vucy5cbiAqXG4gKiBVc2VycyBjYW4gYmVsb25nIHRvIG11bHRpcGxlIG9yZ2FuaXphdGlvbnMuIFRoZSB0b2tlbiBpcyBzY29wZWQgdG8gb25lXG4gKiBhY3RpdmUgb3JnYW5pemF0aW9uIGF0IGEgdGltZS4gVGhlIGByb2xlYCBmaWVsZCBpcyB0aGUgdXNlcidzIHBlci1vcmdcbiAqIHJvbGUgaW4gdGhhdCBvcmdhbml6YXRpb24gKGZyb20gdGhlIFVzZXJPcmdhbml6YXRpb24ganVuY3Rpb24gY29sbGVjdGlvbiksXG4gKiBhbmQgYGlzQWRtaW5gIGlzIGRlcml2ZWQgYXMgYHJvbGUgPT09ICdhZG1pbicgfHwgcm9sZSA9PT0gJ293bmVyJ2AuXG4gKlxuICogVXNlIGBQT1NUIC9hdXRoL3N3aXRjaC1vcmdgIHRvIGNoYW5nZSB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiwgd2hpY2hcbiAqIHJlLWlzc3VlcyB0b2tlbnMgd2l0aCB0aGUgbmV3IG9yZydzIHJvbGUgYW5kIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XG4gIC8qKiBVc2VyIElEIChzdWJqZWN0KSAqL1xuICBzdWI6IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lICovXG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKiBVc2VyIGVtYWlsICovXG4gIGVtYWlsOiBzdHJpbmc7XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqIE9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXIgKCdkZXZlbG9wZXInIHwgJ3BybycgfCAndW5saW1pdGVkJykgKi9cbiAgdGllcj86IHN0cmluZztcbiAgLyoqIFJlc29sdmVkIGZlYXR1cmUgZmxhZ3MgZm9yIHRoaXMgdXNlci9vcmcgKi9cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gSUQgKGZyb20gVXNlck9yZ2FuaXphdGlvbiBtZW1iZXJzaGlwKSAqL1xuICBvcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gbmFtZSAqL1xuICBvcmdhbml6YXRpb25OYW1lPzogc3RyaW5nO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Standardized error codes used across all API microservices.
3
+ * Use these codes in error responses for consistent client handling.
4
+ *
5
+ * Each HTTP status category has one primary code. Use the `details`
6
+ * field in error responses for sub-type information (e.g. which quota
7
+ * was exceeded, which field failed validation).
8
+ */
9
+ export declare enum ErrorCode {
10
+ UNAUTHORIZED = "UNAUTHORIZED",
11
+ TOKEN_EXPIRED = "TOKEN_EXPIRED",
12
+ TOKEN_INVALID = "TOKEN_INVALID",
13
+ TOKEN_MISSING = "TOKEN_MISSING",
14
+ INSUFFICIENT_PERMISSIONS = "INSUFFICIENT_PERMISSIONS",
15
+ ORG_MISMATCH = "ORG_MISMATCH",
16
+ COMPLIANCE_VIOLATION = "COMPLIANCE_VIOLATION",
17
+ NOT_FOUND = "NOT_FOUND",
18
+ ORG_NOT_FOUND = "ORG_NOT_FOUND",
19
+ VALIDATION_ERROR = "VALIDATION_ERROR",
20
+ MISSING_REQUIRED_FIELD = "MISSING_REQUIRED_FIELD",
21
+ QUOTA_EXCEEDED = "QUOTA_EXCEEDED",
22
+ RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED",
23
+ CONFLICT = "CONFLICT",
24
+ DUPLICATE_ENTRY = "DUPLICATE_ENTRY",
25
+ SCAN_CONFLICT = "SCAN_CONFLICT",
26
+ INTERNAL_ERROR = "INTERNAL_ERROR",
27
+ DATABASE_ERROR = "DATABASE_ERROR",
28
+ SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE",
29
+ COMPLIANCE_SERVICE_UNAVAILABLE = "COMPLIANCE_SERVICE_UNAVAILABLE"
30
+ }
31
+ /**
32
+ * Maps error codes to their default HTTP status codes.
33
+ */
34
+ export declare const ErrorCodeStatus: Record<ErrorCode, number>;
35
+ /**
36
+ * Get the HTTP status code for an error code.
37
+ */
38
+ export declare function getStatusForErrorCode(code: ErrorCode): number;
@@ -0,0 +1,77 @@
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.ErrorCodeStatus = exports.ErrorCode = void 0;
6
+ exports.getStatusForErrorCode = getStatusForErrorCode;
7
+ /**
8
+ * Standardized error codes used across all API microservices.
9
+ * Use these codes in error responses for consistent client handling.
10
+ *
11
+ * Each HTTP status category has one primary code. Use the `details`
12
+ * field in error responses for sub-type information (e.g. which quota
13
+ * was exceeded, which field failed validation).
14
+ */
15
+ var ErrorCode;
16
+ (function (ErrorCode) {
17
+ // Authentication errors (401)
18
+ ErrorCode["UNAUTHORIZED"] = "UNAUTHORIZED";
19
+ ErrorCode["TOKEN_EXPIRED"] = "TOKEN_EXPIRED";
20
+ ErrorCode["TOKEN_INVALID"] = "TOKEN_INVALID";
21
+ ErrorCode["TOKEN_MISSING"] = "TOKEN_MISSING";
22
+ // Authorization errors (403)
23
+ ErrorCode["INSUFFICIENT_PERMISSIONS"] = "INSUFFICIENT_PERMISSIONS";
24
+ ErrorCode["ORG_MISMATCH"] = "ORG_MISMATCH";
25
+ ErrorCode["COMPLIANCE_VIOLATION"] = "COMPLIANCE_VIOLATION";
26
+ // Not found errors (404)
27
+ ErrorCode["NOT_FOUND"] = "NOT_FOUND";
28
+ ErrorCode["ORG_NOT_FOUND"] = "ORG_NOT_FOUND";
29
+ // Validation errors (400)
30
+ ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
31
+ ErrorCode["MISSING_REQUIRED_FIELD"] = "MISSING_REQUIRED_FIELD";
32
+ // Quota/Rate limit errors (429)
33
+ ErrorCode["QUOTA_EXCEEDED"] = "QUOTA_EXCEEDED";
34
+ ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
35
+ // Conflict errors (409)
36
+ ErrorCode["CONFLICT"] = "CONFLICT";
37
+ ErrorCode["DUPLICATE_ENTRY"] = "DUPLICATE_ENTRY";
38
+ ErrorCode["SCAN_CONFLICT"] = "SCAN_CONFLICT";
39
+ // Server errors (500)
40
+ ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
41
+ ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
42
+ // Service unavailable (503)
43
+ ErrorCode["SERVICE_UNAVAILABLE"] = "SERVICE_UNAVAILABLE";
44
+ ErrorCode["COMPLIANCE_SERVICE_UNAVAILABLE"] = "COMPLIANCE_SERVICE_UNAVAILABLE";
45
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
46
+ /**
47
+ * Maps error codes to their default HTTP status codes.
48
+ */
49
+ exports.ErrorCodeStatus = {
50
+ [ErrorCode.UNAUTHORIZED]: 401,
51
+ [ErrorCode.TOKEN_EXPIRED]: 401,
52
+ [ErrorCode.TOKEN_INVALID]: 401,
53
+ [ErrorCode.TOKEN_MISSING]: 401,
54
+ [ErrorCode.INSUFFICIENT_PERMISSIONS]: 403,
55
+ [ErrorCode.ORG_MISMATCH]: 403,
56
+ [ErrorCode.COMPLIANCE_VIOLATION]: 403,
57
+ [ErrorCode.NOT_FOUND]: 404,
58
+ [ErrorCode.ORG_NOT_FOUND]: 404,
59
+ [ErrorCode.VALIDATION_ERROR]: 400,
60
+ [ErrorCode.MISSING_REQUIRED_FIELD]: 400,
61
+ [ErrorCode.QUOTA_EXCEEDED]: 429,
62
+ [ErrorCode.RATE_LIMIT_EXCEEDED]: 429,
63
+ [ErrorCode.CONFLICT]: 409,
64
+ [ErrorCode.DUPLICATE_ENTRY]: 409,
65
+ [ErrorCode.SCAN_CONFLICT]: 409,
66
+ [ErrorCode.INTERNAL_ERROR]: 500,
67
+ [ErrorCode.DATABASE_ERROR]: 500,
68
+ [ErrorCode.SERVICE_UNAVAILABLE]: 503,
69
+ [ErrorCode.COMPLIANCE_SERVICE_UNAVAILABLE]: 503,
70
+ };
71
+ /**
72
+ * Get the HTTP status code for an error code.
73
+ */
74
+ function getStatusForErrorCode(code) {
75
+ return exports.ErrorCodeStatus[code] ?? 500;
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQTZFdEMsc0RBRUM7QUE3RUQ7Ozs7Ozs7R0FPRztBQUNILElBQVksU0FvQ1g7QUFwQ0QsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUUvQiw2QkFBNkI7SUFDN0Isa0VBQXFELENBQUE7SUFDckQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUVqRCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0Msd0JBQXdCO0lBQ3hCLGtDQUFxQixDQUFBO0lBQ3JCLGdEQUFtQyxDQUFBO0lBQ25DLDRDQUErQixDQUFBO0lBRS9CLHNCQUFzQjtJQUN0Qiw4Q0FBaUMsQ0FBQTtJQUNqQyw4Q0FBaUMsQ0FBQTtJQUVqQyw0QkFBNEI7SUFDNUIsd0RBQTJDLENBQUE7SUFDM0MsOEVBQWlFLENBQUE7QUFDbkUsQ0FBQyxFQXBDVyxTQUFTLHlCQUFULFNBQVMsUUFvQ3BCO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLGVBQWUsR0FBOEI7SUFDeEQsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRztJQUM3QixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHO0lBQzlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUc7SUFDOUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRztJQUM5QixDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUc7SUFDekMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRztJQUM3QixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUc7SUFDckMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRztJQUMxQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHO0lBQzlCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRztJQUNqQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUc7SUFDdkMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUc7SUFDcEMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRztJQUN6QixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHO0lBQ2hDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUc7SUFDOUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO0lBQy9CLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRztJQUNwQyxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEdBQUc7Q0FDaEQsQ0FBQztBQUVGOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsSUFBZTtJQUNuRCxPQUFPLHVCQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTdGFuZGFyZGl6ZWQgZXJyb3IgY29kZXMgdXNlZCBhY3Jvc3MgYWxsIEFQSSBtaWNyb3NlcnZpY2VzLlxuICogVXNlIHRoZXNlIGNvZGVzIGluIGVycm9yIHJlc3BvbnNlcyBmb3IgY29uc2lzdGVudCBjbGllbnQgaGFuZGxpbmcuXG4gKlxuICogRWFjaCBIVFRQIHN0YXR1cyBjYXRlZ29yeSBoYXMgb25lIHByaW1hcnkgY29kZS4gVXNlIHRoZSBgZGV0YWlsc2BcbiAqIGZpZWxkIGluIGVycm9yIHJlc3BvbnNlcyBmb3Igc3ViLXR5cGUgaW5mb3JtYXRpb24gKGUuZy4gd2hpY2ggcXVvdGFcbiAqIHdhcyBleGNlZWRlZCwgd2hpY2ggZmllbGQgZmFpbGVkIHZhbGlkYXRpb24pLlxuICovXG5leHBvcnQgZW51bSBFcnJvckNvZGUge1xuICAvLyBBdXRoZW50aWNhdGlvbiBlcnJvcnMgKDQwMSlcbiAgVU5BVVRIT1JJWkVEID0gJ1VOQVVUSE9SSVpFRCcsXG4gIFRPS0VOX0VYUElSRUQgPSAnVE9LRU5fRVhQSVJFRCcsXG4gIFRPS0VOX0lOVkFMSUQgPSAnVE9LRU5fSU5WQUxJRCcsXG4gIFRPS0VOX01JU1NJTkcgPSAnVE9LRU5fTUlTU0lORycsXG5cbiAgLy8gQXV0aG9yaXphdGlvbiBlcnJvcnMgKDQwMylcbiAgSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TID0gJ0lOU1VGRklDSUVOVF9QRVJNSVNTSU9OUycsXG4gIE9SR19NSVNNQVRDSCA9ICdPUkdfTUlTTUFUQ0gnLFxuICBDT01QTElBTkNFX1ZJT0xBVElPTiA9ICdDT01QTElBTkNFX1ZJT0xBVElPTicsXG5cbiAgLy8gTm90IGZvdW5kIGVycm9ycyAoNDA0KVxuICBOT1RfRk9VTkQgPSAnTk9UX0ZPVU5EJyxcbiAgT1JHX05PVF9GT1VORCA9ICdPUkdfTk9UX0ZPVU5EJyxcblxuICAvLyBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKVxuICBWQUxJREFUSU9OX0VSUk9SID0gJ1ZBTElEQVRJT05fRVJST1InLFxuICBNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEID0gJ01JU1NJTkdfUkVRVUlSRURfRklFTEQnLFxuXG4gIC8vIFF1b3RhL1JhdGUgbGltaXQgZXJyb3JzICg0MjkpXG4gIFFVT1RBX0VYQ0VFREVEID0gJ1FVT1RBX0VYQ0VFREVEJyxcbiAgUkFURV9MSU1JVF9FWENFRURFRCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcblxuICAvLyBDb25mbGljdCBlcnJvcnMgKDQwOSlcbiAgQ09ORkxJQ1QgPSAnQ09ORkxJQ1QnLFxuICBEVVBMSUNBVEVfRU5UUlkgPSAnRFVQTElDQVRFX0VOVFJZJyxcbiAgU0NBTl9DT05GTElDVCA9ICdTQ0FOX0NPTkZMSUNUJyxcblxuICAvLyBTZXJ2ZXIgZXJyb3JzICg1MDApXG4gIElOVEVSTkFMX0VSUk9SID0gJ0lOVEVSTkFMX0VSUk9SJyxcbiAgREFUQUJBU0VfRVJST1IgPSAnREFUQUJBU0VfRVJST1InLFxuXG4gIC8vIFNlcnZpY2UgdW5hdmFpbGFibGUgKDUwMylcbiAgU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdTRVJWSUNFX1VOQVZBSUxBQkxFJyxcbiAgQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFID0gJ0NPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRScsXG59XG5cbi8qKlxuICogTWFwcyBlcnJvciBjb2RlcyB0byB0aGVpciBkZWZhdWx0IEhUVFAgc3RhdHVzIGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlU3RhdHVzOiBSZWNvcmQ8RXJyb3JDb2RlLCBudW1iZXI+ID0ge1xuICBbRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX0lOVkFMSURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fTUlTU0lOR106IDQwMSxcbiAgW0Vycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlNdOiA0MDMsXG4gIFtFcnJvckNvZGUuT1JHX01JU01BVENIXTogNDAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfVklPTEFUSU9OXTogNDAzLFxuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5PUkdfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5RVU9UQV9FWENFRURFRF06IDQyOSxcbiAgW0Vycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLkNPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLkRVUExJQ0FURV9FTlRSWV06IDQwOSxcbiAgW0Vycm9yQ29kZS5TQ0FOX0NPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLkRBVEFCQVNFX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEVdOiA1MDMsXG4gIFtFcnJvckNvZGUuQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIEhUVFAgc3RhdHVzIGNvZGUgZm9yIGFuIGVycm9yIGNvZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNGb3JFcnJvckNvZGUoY29kZTogRXJyb3JDb2RlKTogbnVtYmVyIHtcbiAgcmV0dXJuIEVycm9yQ29kZVN0YXR1c1tjb2RlXSA/PyA1MDA7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ import type { QuotaTier } from './quota-tiers';
2
+ /** Canonical feature flag identifiers. */
3
+ export type FeatureFlag = 'priority_support' | 'custom_integrations' | 'ai_generation' | 'bulk_operations' | 'audit_log';
4
+ /** All valid feature flags (order determines display order). */
5
+ export declare const ALL_FEATURE_FLAGS: readonly FeatureFlag[];
6
+ /** Check whether a string is a valid FeatureFlag. */
7
+ export declare function isValidFeatureFlag(value: string): value is FeatureFlag;
8
+ /** Features enabled by default for each tier. */
9
+ export declare const TIER_FEATURES: Record<QuotaTier, readonly FeatureFlag[]>;
10
+ /** Human-readable metadata for each feature flag. */
11
+ export declare const FEATURE_METADATA: Record<FeatureFlag, {
12
+ label: string;
13
+ description: string;
14
+ }>;
15
+ /**
16
+ * Resolve a user's effective feature set.
17
+ *
18
+ * 1. System org users always get ALL features.
19
+ * 2. Start with the tier's default features.
20
+ * 3. Apply per-user overrides: `true` adds a feature, `false` removes it.
21
+ * 4. Invalid override keys are silently ignored.
22
+ *
23
+ * @param tier - The organization's quota tier
24
+ * @param featureOverrides - Per-user overrides (key = feature flag, value = enabled)
25
+ * @param isSystemOrg - Whether the user belongs to the system organization
26
+ * @returns Sorted array of enabled feature flags
27
+ */
28
+ export declare function resolveUserFeatures(tier: QuotaTier, featureOverrides?: Record<string, boolean> | null, isSystemOrg?: boolean): FeatureFlag[];
29
+ /**
30
+ * Check if a specific feature is enabled for a user.
31
+ *
32
+ * @param tier - The organization's quota tier
33
+ * @param feature - The feature flag to check
34
+ * @param featureOverrides - Per-user overrides
35
+ * @param isSystemOrg - Whether the user belongs to the system organization
36
+ * @returns true if the feature is enabled
37
+ */
38
+ export declare function hasFeature(tier: QuotaTier, feature: FeatureFlag, featureOverrides?: Record<string, boolean> | null, isSystemOrg?: boolean): boolean;
@@ -0,0 +1,107 @@
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.FEATURE_METADATA = exports.TIER_FEATURES = exports.ALL_FEATURE_FLAGS = void 0;
6
+ exports.isValidFeatureFlag = isValidFeatureFlag;
7
+ exports.resolveUserFeatures = resolveUserFeatures;
8
+ exports.hasFeature = hasFeature;
9
+ /** All valid feature flags (order determines display order). */
10
+ exports.ALL_FEATURE_FLAGS = [
11
+ 'priority_support',
12
+ 'ai_generation',
13
+ 'bulk_operations',
14
+ 'custom_integrations',
15
+ 'audit_log',
16
+ ];
17
+ /** Check whether a string is a valid FeatureFlag. */
18
+ function isValidFeatureFlag(value) {
19
+ return exports.ALL_FEATURE_FLAGS.includes(value);
20
+ }
21
+ // Tier-to-feature mapping
22
+ /** Features enabled by default for each tier. */
23
+ exports.TIER_FEATURES = {
24
+ developer: [],
25
+ pro: ['priority_support', 'ai_generation', 'bulk_operations'],
26
+ unlimited: [...exports.ALL_FEATURE_FLAGS],
27
+ };
28
+ // Feature metadata (for display)
29
+ /** Human-readable metadata for each feature flag. */
30
+ exports.FEATURE_METADATA = {
31
+ priority_support: {
32
+ label: 'Priority Support',
33
+ description: 'Faster response times and dedicated support channels',
34
+ },
35
+ ai_generation: {
36
+ label: 'AI Generation',
37
+ description: 'AI-powered pipeline and plugin generation',
38
+ },
39
+ bulk_operations: {
40
+ label: 'Bulk Operations',
41
+ description: 'Batch create, update, and delete for pipelines and plugins',
42
+ },
43
+ custom_integrations: {
44
+ label: 'Custom Integrations',
45
+ description: 'Connect to external services and custom webhook endpoints',
46
+ },
47
+ audit_log: {
48
+ label: 'Audit Log',
49
+ description: 'Detailed audit trail of all user and system actions',
50
+ },
51
+ };
52
+ // Resolution logic
53
+ /**
54
+ * Resolve a user's effective feature set.
55
+ *
56
+ * 1. System org users always get ALL features.
57
+ * 2. Start with the tier's default features.
58
+ * 3. Apply per-user overrides: `true` adds a feature, `false` removes it.
59
+ * 4. Invalid override keys are silently ignored.
60
+ *
61
+ * @param tier - The organization's quota tier
62
+ * @param featureOverrides - Per-user overrides (key = feature flag, value = enabled)
63
+ * @param isSystemOrg - Whether the user belongs to the system organization
64
+ * @returns Sorted array of enabled feature flags
65
+ */
66
+ function resolveUserFeatures(tier, featureOverrides, isSystemOrg) {
67
+ // System org always gets everything
68
+ if (isSystemOrg)
69
+ return [...exports.ALL_FEATURE_FLAGS];
70
+ // Start with tier defaults
71
+ const features = new Set(exports.TIER_FEATURES[tier] ?? []);
72
+ // Apply per-user overrides
73
+ if (featureOverrides) {
74
+ for (const [key, enabled] of Object.entries(featureOverrides)) {
75
+ if (!isValidFeatureFlag(key))
76
+ continue;
77
+ if (enabled) {
78
+ features.add(key);
79
+ }
80
+ else {
81
+ features.delete(key);
82
+ }
83
+ }
84
+ }
85
+ // Return in canonical order
86
+ return exports.ALL_FEATURE_FLAGS.filter(f => features.has(f));
87
+ }
88
+ /**
89
+ * Check if a specific feature is enabled for a user.
90
+ *
91
+ * @param tier - The organization's quota tier
92
+ * @param feature - The feature flag to check
93
+ * @param featureOverrides - Per-user overrides
94
+ * @param isSystemOrg - Whether the user belongs to the system organization
95
+ * @returns true if the feature is enabled
96
+ */
97
+ function hasFeature(tier, feature, featureOverrides, isSystemOrg) {
98
+ if (isSystemOrg)
99
+ return true;
100
+ // Check override first
101
+ if (featureOverrides && feature in featureOverrides) {
102
+ return featureOverrides[feature];
103
+ }
104
+ // Fall back to tier default
105
+ return (exports.TIER_FEATURES[tier] ?? []).includes(feature);
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1mbGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9mZWF0dXJlLWZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUF3QnRDLGdEQUVDO0FBb0RELGtEQXlCQztBQVdELGdDQWVDO0FBbkhELGdFQUFnRTtBQUNuRCxRQUFBLGlCQUFpQixHQUEyQjtJQUN2RCxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsV0FBVztDQUNaLENBQUM7QUFFRixxREFBcUQ7QUFDckQsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYTtJQUM5QyxPQUFRLHlCQUF1QyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEJBQTBCO0FBRTFCLGlEQUFpRDtBQUNwQyxRQUFBLGFBQWEsR0FBOEM7SUFDdEUsU0FBUyxFQUFFLEVBQUU7SUFDYixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUM7SUFDN0QsU0FBUyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQztDQUNsQyxDQUFDO0FBRUYsaUNBQWlDO0FBRWpDLHFEQUFxRDtBQUN4QyxRQUFBLGdCQUFnQixHQUFnRTtJQUMzRixnQkFBZ0IsRUFBRTtRQUNoQixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCLFdBQVcsRUFBRSxzREFBc0Q7S0FDcEU7SUFDRCxhQUFhLEVBQUU7UUFDYixLQUFLLEVBQUUsZUFBZTtRQUN0QixXQUFXLEVBQUUsMkNBQTJDO0tBQ3pEO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixXQUFXLEVBQUUsNERBQTREO0tBQzFFO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixXQUFXLEVBQUUsMkRBQTJEO0tBQ3pFO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsS0FBSyxFQUFFLFdBQVc7UUFDbEIsV0FBVyxFQUFFLHFEQUFxRDtLQUNuRTtDQUNGLENBQUM7QUFFRixtQkFBbUI7QUFFbkI7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLElBQWUsRUFDZixnQkFBaUQsRUFDakQsV0FBcUI7SUFFckIsb0NBQW9DO0lBQ3BDLElBQUksV0FBVztRQUFFLE9BQU8sQ0FBQyxHQUFHLHlCQUFpQixDQUFDLENBQUM7SUFFL0MsMkJBQTJCO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFjLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFakUsMkJBQTJCO0lBQzNCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ3ZDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsT0FBTyx5QkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixJQUFlLEVBQ2YsT0FBb0IsRUFDcEIsZ0JBQWlELEVBQ2pELFdBQXFCO0lBRXJCLElBQUksV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTdCLHVCQUF1QjtJQUN2QixJQUFJLGdCQUFnQixJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixPQUFPLENBQUMscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciB9IGZyb20gJy4vcXVvdGEtdGllcnMnO1xuXG4vLyBGZWF0dXJlIGZsYWcgaWRlbnRpZmllcnNcblxuLyoqIENhbm9uaWNhbCBmZWF0dXJlIGZsYWcgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZyA9XG4gIHwgJ3ByaW9yaXR5X3N1cHBvcnQnXG4gIHwgJ2N1c3RvbV9pbnRlZ3JhdGlvbnMnXG4gIHwgJ2FpX2dlbmVyYXRpb24nXG4gIHwgJ2J1bGtfb3BlcmF0aW9ucydcbiAgfCAnYXVkaXRfbG9nJztcblxuLyoqIEFsbCB2YWxpZCBmZWF0dXJlIGZsYWdzIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9GRUFUVVJFX0ZMQUdTOiByZWFkb25seSBGZWF0dXJlRmxhZ1tdID0gW1xuICAncHJpb3JpdHlfc3VwcG9ydCcsXG4gICdhaV9nZW5lcmF0aW9uJyxcbiAgJ2J1bGtfb3BlcmF0aW9ucycsXG4gICdjdXN0b21faW50ZWdyYXRpb25zJyxcbiAgJ2F1ZGl0X2xvZycsXG5dO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIEZlYXR1cmVGbGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGZWF0dXJlRmxhZyh2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgRmVhdHVyZUZsYWcge1xuICByZXR1cm4gKEFMTF9GRUFUVVJFX0ZMQUdTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8vIFRpZXItdG8tZmVhdHVyZSBtYXBwaW5nXG5cbi8qKiBGZWF0dXJlcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIGVhY2ggdGllci4gKi9cbmV4cG9ydCBjb25zdCBUSUVSX0ZFQVRVUkVTOiBSZWNvcmQ8UXVvdGFUaWVyLCByZWFkb25seSBGZWF0dXJlRmxhZ1tdPiA9IHtcbiAgZGV2ZWxvcGVyOiBbXSxcbiAgcHJvOiBbJ3ByaW9yaXR5X3N1cHBvcnQnLCAnYWlfZ2VuZXJhdGlvbicsICdidWxrX29wZXJhdGlvbnMnXSxcbiAgdW5saW1pdGVkOiBbLi4uQUxMX0ZFQVRVUkVfRkxBR1NdLFxufTtcblxuLy8gRmVhdHVyZSBtZXRhZGF0YSAoZm9yIGRpc3BsYXkpXG5cbi8qKiBIdW1hbi1yZWFkYWJsZSBtZXRhZGF0YSBmb3IgZWFjaCBmZWF0dXJlIGZsYWcuICovXG5leHBvcnQgY29uc3QgRkVBVFVSRV9NRVRBREFUQTogUmVjb3JkPEZlYXR1cmVGbGFnLCB7IGxhYmVsOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSB7XG4gIHByaW9yaXR5X3N1cHBvcnQ6IHtcbiAgICBsYWJlbDogJ1ByaW9yaXR5IFN1cHBvcnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRmFzdGVyIHJlc3BvbnNlIHRpbWVzIGFuZCBkZWRpY2F0ZWQgc3VwcG9ydCBjaGFubmVscycsXG4gIH0sXG4gIGFpX2dlbmVyYXRpb246IHtcbiAgICBsYWJlbDogJ0FJIEdlbmVyYXRpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnQUktcG93ZXJlZCBwaXBlbGluZSBhbmQgcGx1Z2luIGdlbmVyYXRpb24nLFxuICB9LFxuICBidWxrX29wZXJhdGlvbnM6IHtcbiAgICBsYWJlbDogJ0J1bGsgT3BlcmF0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdCYXRjaCBjcmVhdGUsIHVwZGF0ZSwgYW5kIGRlbGV0ZSBmb3IgcGlwZWxpbmVzIGFuZCBwbHVnaW5zJyxcbiAgfSxcbiAgY3VzdG9tX2ludGVncmF0aW9uczoge1xuICAgIGxhYmVsOiAnQ3VzdG9tIEludGVncmF0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdDb25uZWN0IHRvIGV4dGVybmFsIHNlcnZpY2VzIGFuZCBjdXN0b20gd2ViaG9vayBlbmRwb2ludHMnLFxuICB9LFxuICBhdWRpdF9sb2c6IHtcbiAgICBsYWJlbDogJ0F1ZGl0IExvZycsXG4gICAgZGVzY3JpcHRpb246ICdEZXRhaWxlZCBhdWRpdCB0cmFpbCBvZiBhbGwgdXNlciBhbmQgc3lzdGVtIGFjdGlvbnMnLFxuICB9LFxufTtcblxuLy8gUmVzb2x1dGlvbiBsb2dpY1xuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIGZlYXR1cmUgc2V0LlxuICpcbiAqIDEuIFN5c3RlbSBvcmcgdXNlcnMgYWx3YXlzIGdldCBBTEwgZmVhdHVyZXMuXG4gKiAyLiBTdGFydCB3aXRoIHRoZSB0aWVyJ3MgZGVmYXVsdCBmZWF0dXJlcy5cbiAqIDMuIEFwcGx5IHBlci11c2VyIG92ZXJyaWRlczogYHRydWVgIGFkZHMgYSBmZWF0dXJlLCBgZmFsc2VgIHJlbW92ZXMgaXQuXG4gKiA0LiBJbnZhbGlkIG92ZXJyaWRlIGtleXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHRpZXIgLSBUaGUgb3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllclxuICogQHBhcmFtIGZlYXR1cmVPdmVycmlkZXMgLSBQZXItdXNlciBvdmVycmlkZXMgKGtleSA9IGZlYXR1cmUgZmxhZywgdmFsdWUgPSBlbmFibGVkKVxuICogQHBhcmFtIGlzU3lzdGVtT3JnIC0gV2hldGhlciB0aGUgdXNlciBiZWxvbmdzIHRvIHRoZSBzeXN0ZW0gb3JnYW5pemF0aW9uXG4gKiBAcmV0dXJucyBTb3J0ZWQgYXJyYXkgb2YgZW5hYmxlZCBmZWF0dXJlIGZsYWdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlckZlYXR1cmVzKFxuICB0aWVyOiBRdW90YVRpZXIsXG4gIGZlYXR1cmVPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IG51bGwsXG4gIGlzU3lzdGVtT3JnPzogYm9vbGVhbixcbik6IEZlYXR1cmVGbGFnW10ge1xuICAvLyBTeXN0ZW0gb3JnIGFsd2F5cyBnZXRzIGV2ZXJ5dGhpbmdcbiAgaWYgKGlzU3lzdGVtT3JnKSByZXR1cm4gWy4uLkFMTF9GRUFUVVJFX0ZMQUdTXTtcblxuICAvLyBTdGFydCB3aXRoIHRpZXIgZGVmYXVsdHNcbiAgY29uc3QgZmVhdHVyZXMgPSBuZXcgU2V0PEZlYXR1cmVGbGFnPihUSUVSX0ZFQVRVUkVTW3RpZXJdID8/IFtdKTtcblxuICAvLyBBcHBseSBwZXItdXNlciBvdmVycmlkZXNcbiAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVuYWJsZWRdIG9mIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpKSB7XG4gICAgICBpZiAoIWlzVmFsaWRGZWF0dXJlRmxhZyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIGZlYXR1cmVzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmVhdHVyZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIGluIGNhbm9uaWNhbCBvcmRlclxuICByZXR1cm4gQUxMX0ZFQVRVUkVfRkxBR1MuZmlsdGVyKGYgPT4gZmVhdHVyZXMuaGFzKGYpKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWNpZmljIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgYSB1c2VyLlxuICpcbiAqIEBwYXJhbSB0aWVyIC0gVGhlIG9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXJcbiAqIEBwYXJhbSBmZWF0dXJlIC0gVGhlIGZlYXR1cmUgZmxhZyB0byBjaGVja1xuICogQHBhcmFtIGZlYXR1cmVPdmVycmlkZXMgLSBQZXItdXNlciBvdmVycmlkZXNcbiAqIEBwYXJhbSBpc1N5c3RlbU9yZyAtIFdoZXRoZXIgdGhlIHVzZXIgYmVsb25ncyB0byB0aGUgc3lzdGVtIG9yZ2FuaXphdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGZWF0dXJlKFxuICB0aWVyOiBRdW90YVRpZXIsXG4gIGZlYXR1cmU6IEZlYXR1cmVGbGFnLFxuICBmZWF0dXJlT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCBudWxsLFxuICBpc1N5c3RlbU9yZz86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3lzdGVtT3JnKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDaGVjayBvdmVycmlkZSBmaXJzdFxuICBpZiAoZmVhdHVyZU92ZXJyaWRlcyAmJiBmZWF0dXJlIGluIGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICByZXR1cm4gZmVhdHVyZU92ZXJyaWRlc1tmZWF0dXJlXTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byB0aWVyIGRlZmF1bHRcbiAgcmV0dXJuIChUSUVSX0ZFQVRVUkVTW3RpZXJdID8/IFtdKS5pbmNsdWRlcyhmZWF0dXJlKTtcbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Generic HTTP headers representation.
3
+ */
4
+ export interface HttpHeaders {
5
+ [key: string]: string | string[] | undefined;
6
+ }
7
+ /**
8
+ * Generic HTTP request interface.
9
+ * Represents the minimal request shape needed by api-core utilities.
10
+ */
11
+ export interface HttpRequest {
12
+ /** Request headers */
13
+ headers: HttpHeaders;
14
+ /** Route parameters */
15
+ params: Record<string, string | string[] | undefined>;
16
+ /** Query parameters */
17
+ query: Record<string, unknown>;
18
+ /** Authenticated user (if present) */
19
+ user?: {
20
+ organizationId?: string;
21
+ userId?: string;
22
+ role?: string;
23
+ [key: string]: unknown;
24
+ };
25
+ }
26
+ /**
27
+ * Generic HTTP response interface.
28
+ * Represents the minimal response shape needed by api-core utilities.
29
+ */
30
+ export interface HttpResponse {
31
+ /** Set HTTP status code */
32
+ status(code: number): HttpResponse;
33
+ /** Send JSON response */
34
+ json(body: unknown): void;
35
+ /** Set response header */
36
+ setHeader(name: string, value: string | number): void;
37
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogR2VuZXJpYyBIVFRQIGhlYWRlcnMgcmVwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEhlYWRlcnMge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmljIEhUVFAgcmVxdWVzdCBpbnRlcmZhY2UuXG4gKiBSZXByZXNlbnRzIHRoZSBtaW5pbWFsIHJlcXVlc3Qgc2hhcGUgbmVlZGVkIGJ5IGFwaS1jb3JlIHV0aWxpdGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVxdWVzdCB7XG4gIC8qKiBSZXF1ZXN0IGhlYWRlcnMgKi9cbiAgaGVhZGVyczogSHR0cEhlYWRlcnM7XG4gIC8qKiBSb3V0ZSBwYXJhbWV0ZXJzICovXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+O1xuICAvKiogUXVlcnkgcGFyYW1ldGVycyAqL1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBBdXRoZW50aWNhdGVkIHVzZXIgKGlmIHByZXNlbnQpICovXG4gIHVzZXI/OiB7XG4gICAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nO1xuICAgIHJvbGU/OiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfTtcbn1cblxuLyoqXG4gKiBHZW5lcmljIEhUVFAgcmVzcG9uc2UgaW50ZXJmYWNlLlxuICogUmVwcmVzZW50cyB0aGUgbWluaW1hbCByZXNwb25zZSBzaGFwZSBuZWVkZWQgYnkgYXBpLWNvcmUgdXRpbGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBSZXNwb25zZSB7XG4gIC8qKiBTZXQgSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXMoY29kZTogbnVtYmVyKTogSHR0cFJlc3BvbnNlO1xuICAvKiogU2VuZCBKU09OIHJlc3BvbnNlICovXG4gIGpzb24oYm9keTogdW5rbm93bik6IHZvaWQ7XG4gIC8qKiBTZXQgcmVzcG9uc2UgaGVhZGVyICovXG4gIHNldEhlYWRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkO1xufVxuIl19
@@ -0,0 +1,7 @@
1
+ export * from './error-codes';
2
+ export * from './common';
3
+ export * from './pipeline';
4
+ export * from './http';
5
+ export * from './quota-tiers';
6
+ export * from './billing';
7
+ export * from './feature-flags';
@@ -0,0 +1,26 @@
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("./error-codes"), exports);
20
+ __exportStar(require("./common"), exports);
21
+ __exportStar(require("./pipeline"), exports);
22
+ __exportStar(require("./http"), exports);
23
+ __exportStar(require("./quota-tiers"), exports);
24
+ __exportStar(require("./billing"), exports);
25
+ __exportStar(require("./feature-flags"), exports);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEMsZ0RBQThCO0FBQzlCLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0IseUNBQXVCO0FBQ3ZCLGdEQUE4QjtBQUM5Qiw0Q0FBMEI7QUFDMUIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vZXJyb3ItY29kZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAnO1xuZXhwb3J0ICogZnJvbSAnLi9xdW90YS10aWVycyc7XG5leHBvcnQgKiBmcm9tICcuL2JpbGxpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9mZWF0dXJlLWZsYWdzJztcbiJdfQ==
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared pipeline types used by both pipeline-core and pipeline-data
3
+ */
4
+ /**
5
+ * Utility type to extract the union of all values from an object type
6
+ */
7
+ type ValueOf<T> = T[keyof T];
8
+ /**
9
+ * Access modifier for plugins and resources
10
+ *
11
+ * @property PUBLIC - Accessible to all users and organizations
12
+ * @property PRIVATE - Restricted to specific users or organizations
13
+ */
14
+ export declare const AccessModifier: {
15
+ readonly PUBLIC: "public";
16
+ readonly PRIVATE: "private";
17
+ };
18
+ export type AccessModifier = ValueOf<typeof AccessModifier>;
19
+ /**
20
+ * AWS CodeBuild compute resource sizes
21
+ *
22
+ * @property SMALL - 3 GB memory, 2 vCPUs
23
+ * @property MEDIUM - 7 GB memory, 4 vCPUs
24
+ * @property LARGE - 15 GB memory, 8 vCPUs
25
+ * @property X2_LARGE - 145 GB memory, 72 vCPUs
26
+ *
27
+ * @see https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html
28
+ */
29
+ export declare const ComputeType: {
30
+ readonly SMALL: "SMALL";
31
+ readonly MEDIUM: "MEDIUM";
32
+ readonly LARGE: "LARGE";
33
+ readonly X2_LARGE: "X2_LARGE";
34
+ };
35
+ export type ComputeType = ValueOf<typeof ComputeType>;
36
+ /**
37
+ * Types of pipeline steps that can be created by plugins
38
+ *
39
+ * @property CODE_BUILD_STEP - Full CodeBuild step with custom build environment
40
+ * @property SHELL_STEP - Simple shell step without custom build environment
41
+ * @property MANUAL_APPROVAL_STEP - Native CDK approval gate (no Docker image, no commands)
42
+ */
43
+ export declare const PluginType: {
44
+ readonly CODE_BUILD_STEP: "CodeBuildStep";
45
+ readonly SHELL_STEP: "ShellStep";
46
+ readonly MANUAL_APPROVAL_STEP: "ManualApprovalStep";
47
+ };
48
+ export type PluginType = ValueOf<typeof PluginType>;
49
+ /**
50
+ * Metadata type for storing configuration and custom properties
51
+ *
52
+ * Supports:
53
+ * - Standard key-value pairs (string, boolean, number)
54
+ * - Custom AWS CDK keys with the pattern `aws:cdk:{namespace}:{key}`
55
+ * (all lowercase — matches the format produced by `getCustomKey`)
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const metadata: MetaDataType = {
60
+ * BUILD_ENV: 'production',
61
+ * NODE_VERSION: '18',
62
+ * ENABLE_CACHE: true,
63
+ * MAX_RETRIES: 3
64
+ * };
65
+ * ```
66
+ */
67
+ export type MetaDataType = Record<string, string | boolean | number> & {
68
+ [K in `aws:cdk:${string}`]?: unknown;
69
+ };
70
+ export {};
@@ -0,0 +1,44 @@
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.PluginType = exports.ComputeType = exports.AccessModifier = void 0;
6
+ /**
7
+ * Access modifier for plugins and resources
8
+ *
9
+ * @property PUBLIC - Accessible to all users and organizations
10
+ * @property PRIVATE - Restricted to specific users or organizations
11
+ */
12
+ exports.AccessModifier = {
13
+ PUBLIC: 'public',
14
+ PRIVATE: 'private',
15
+ };
16
+ /**
17
+ * AWS CodeBuild compute resource sizes
18
+ *
19
+ * @property SMALL - 3 GB memory, 2 vCPUs
20
+ * @property MEDIUM - 7 GB memory, 4 vCPUs
21
+ * @property LARGE - 15 GB memory, 8 vCPUs
22
+ * @property X2_LARGE - 145 GB memory, 72 vCPUs
23
+ *
24
+ * @see https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html
25
+ */
26
+ exports.ComputeType = {
27
+ SMALL: 'SMALL',
28
+ MEDIUM: 'MEDIUM',
29
+ LARGE: 'LARGE',
30
+ X2_LARGE: 'X2_LARGE',
31
+ };
32
+ /**
33
+ * Types of pipeline steps that can be created by plugins
34
+ *
35
+ * @property CODE_BUILD_STEP - Full CodeBuild step with custom build environment
36
+ * @property SHELL_STEP - Simple shell step without custom build environment
37
+ * @property MANUAL_APPROVAL_STEP - Native CDK approval gate (no Docker image, no commands)
38
+ */
39
+ exports.PluginType = {
40
+ CODE_BUILD_STEP: 'CodeBuildStep',
41
+ SHELL_STEP: 'ShellStep',
42
+ MANUAL_APPROVAL_STEP: 'ManualApprovalStep',
43
+ };
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQVd0Qzs7Ozs7R0FLRztBQUNVLFFBQUEsY0FBYyxHQUFHO0lBQzVCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0NBQ1YsQ0FBQztBQUdYOzs7Ozs7Ozs7R0FTRztBQUNVLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLE9BQU87SUFDZCxRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUM7QUFHWDs7Ozs7O0dBTUc7QUFDVSxRQUFBLFVBQVUsR0FBRztJQUN4QixlQUFlLEVBQUUsZUFBZTtJQUNoQyxVQUFVLEVBQUUsV0FBVztJQUN2QixvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZSB0eXBlcyB1c2VkIGJ5IGJvdGggcGlwZWxpbmUtY29yZSBhbmQgcGlwZWxpbmUtZGF0YVxuICovXG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3QgdGhlIHVuaW9uIG9mIGFsbCB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgdHlwZVxuICovXG50eXBlIFZhbHVlT2Y8VD4gPSBUW2tleW9mIFRdO1xuXG4vKipcbiAqIEFjY2VzcyBtb2RpZmllciBmb3IgcGx1Z2lucyBhbmQgcmVzb3VyY2VzXG4gKlxuICogQHByb3BlcnR5IFBVQkxJQyAtIEFjY2Vzc2libGUgdG8gYWxsIHVzZXJzIGFuZCBvcmdhbml6YXRpb25zXG4gKiBAcHJvcGVydHkgUFJJVkFURSAtIFJlc3RyaWN0ZWQgdG8gc3BlY2lmaWMgdXNlcnMgb3Igb3JnYW5pemF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgQWNjZXNzTW9kaWZpZXIgPSB7XG4gIFBVQkxJQzogJ3B1YmxpYycsXG4gIFBSSVZBVEU6ICdwcml2YXRlJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBY2Nlc3NNb2RpZmllciA9IFZhbHVlT2Y8dHlwZW9mIEFjY2Vzc01vZGlmaWVyPjtcblxuLyoqXG4gKiBBV1MgQ29kZUJ1aWxkIGNvbXB1dGUgcmVzb3VyY2Ugc2l6ZXNcbiAqXG4gKiBAcHJvcGVydHkgU01BTEwgLSAzIEdCIG1lbW9yeSwgMiB2Q1BVc1xuICogQHByb3BlcnR5IE1FRElVTSAtIDcgR0IgbWVtb3J5LCA0IHZDUFVzXG4gKiBAcHJvcGVydHkgTEFSR0UgLSAxNSBHQiBtZW1vcnksIDggdkNQVXNcbiAqIEBwcm9wZXJ0eSBYMl9MQVJHRSAtIDE0NSBHQiBtZW1vcnksIDcyIHZDUFVzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZWJ1aWxkL2xhdGVzdC91c2VyZ3VpZGUvYnVpbGQtZW52LXJlZi1jb21wdXRlLXR5cGVzLmh0bWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbXB1dGVUeXBlID0ge1xuICBTTUFMTDogJ1NNQUxMJyxcbiAgTUVESVVNOiAnTUVESVVNJyxcbiAgTEFSR0U6ICdMQVJHRScsXG4gIFgyX0xBUkdFOiAnWDJfTEFSR0UnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gVmFsdWVPZjx0eXBlb2YgQ29tcHV0ZVR5cGU+O1xuXG4vKipcbiAqIFR5cGVzIG9mIHBpcGVsaW5lIHN0ZXBzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgcGx1Z2luc1xuICpcbiAqIEBwcm9wZXJ0eSBDT0RFX0JVSUxEX1NURVAgLSBGdWxsIENvZGVCdWlsZCBzdGVwIHdpdGggY3VzdG9tIGJ1aWxkIGVudmlyb25tZW50XG4gKiBAcHJvcGVydHkgU0hFTExfU1RFUCAtIFNpbXBsZSBzaGVsbCBzdGVwIHdpdGhvdXQgY3VzdG9tIGJ1aWxkIGVudmlyb25tZW50XG4gKiBAcHJvcGVydHkgTUFOVUFMX0FQUFJPVkFMX1NURVAgLSBOYXRpdmUgQ0RLIGFwcHJvdmFsIGdhdGUgKG5vIERvY2tlciBpbWFnZSwgbm8gY29tbWFuZHMpXG4gKi9cbmV4cG9ydCBjb25zdCBQbHVnaW5UeXBlID0ge1xuICBDT0RFX0JVSUxEX1NURVA6ICdDb2RlQnVpbGRTdGVwJyxcbiAgU0hFTExfU1RFUDogJ1NoZWxsU3RlcCcsXG4gIE1BTlVBTF9BUFBST1ZBTF9TVEVQOiAnTWFudWFsQXBwcm92YWxTdGVwJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5UeXBlID0gVmFsdWVPZjx0eXBlb2YgUGx1Z2luVHlwZT47XG5cbi8qKlxuICogTWV0YWRhdGEgdHlwZSBmb3Igc3RvcmluZyBjb25maWd1cmF0aW9uIGFuZCBjdXN0b20gcHJvcGVydGllc1xuICpcbiAqIFN1cHBvcnRzOlxuICogLSBTdGFuZGFyZCBrZXktdmFsdWUgcGFpcnMgKHN0cmluZywgYm9vbGVhbiwgbnVtYmVyKVxuICogLSBDdXN0b20gQVdTIENESyBrZXlzIHdpdGggdGhlIHBhdHRlcm4gYGF3czpjZGs6e25hbWVzcGFjZX06e2tleX1gXG4gKiAgIChhbGwgbG93ZXJjYXNlIOKAlCBtYXRjaGVzIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgYGdldEN1c3RvbUtleWApXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhOiBNZXRhRGF0YVR5cGUgPSB7XG4gKiAgIEJVSUxEX0VOVjogJ3Byb2R1Y3Rpb24nLFxuICogICBOT0RFX1ZFUlNJT046ICcxOCcsXG4gKiAgIEVOQUJMRV9DQUNIRTogdHJ1ZSxcbiAqICAgTUFYX1JFVFJJRVM6IDNcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWV0YURhdGFUeXBlID1cbiAgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj4gJlxuICB7IFtLIGluIGBhd3M6Y2RrOiR7c3RyaW5nfWBdPzogdW5rbm93biB9O1xuIl19
@@ -0,0 +1,23 @@
1
+ /** Available quota tier identifiers. */
2
+ export type QuotaTier = 'developer' | 'pro' | 'unlimited';
3
+ /** Limit values for each quota type within a tier. */
4
+ export interface QuotaTierLimits {
5
+ plugins: number;
6
+ pipelines: number;
7
+ apiCalls: number;
8
+ }
9
+ /** Full preset for a single tier (label + limits). */
10
+ export interface QuotaTierPreset {
11
+ label: string;
12
+ limits: QuotaTierLimits;
13
+ }
14
+ /** Preset limits for each tier. */
15
+ export declare const QUOTA_TIERS: Record<QuotaTier, QuotaTierPreset>;
16
+ /** All valid tier names. */
17
+ export declare const VALID_TIERS: readonly QuotaTier[];
18
+ /** Default tier assigned to new organizations. */
19
+ export declare const DEFAULT_TIER: QuotaTier;
20
+ /** Check whether a string is a valid QuotaTier. */
21
+ export declare function isValidTier(value: string): value is QuotaTier;
22
+ /** Get the default limits for a given tier (falls back to developer). */
23
+ export declare function getTierLimits(tier: string): QuotaTierLimits;
@@ -0,0 +1,26 @@
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.DEFAULT_TIER = exports.VALID_TIERS = exports.QUOTA_TIERS = void 0;
6
+ exports.isValidTier = isValidTier;
7
+ exports.getTierLimits = getTierLimits;
8
+ /** Preset limits for each tier. */
9
+ exports.QUOTA_TIERS = {
10
+ developer: { label: 'Developer', limits: { plugins: 100, pipelines: 10, apiCalls: -1 } },
11
+ pro: { label: 'Pro', limits: { plugins: 1000, pipelines: 100, apiCalls: -1 } },
12
+ unlimited: { label: 'Unlimited', limits: { plugins: -1, pipelines: -1, apiCalls: -1 } },
13
+ };
14
+ /** All valid tier names. */
15
+ exports.VALID_TIERS = Object.keys(exports.QUOTA_TIERS);
16
+ /** Default tier assigned to new organizations. */
17
+ exports.DEFAULT_TIER = 'developer';
18
+ /** Check whether a string is a valid QuotaTier. */
19
+ function isValidTier(value) {
20
+ return value in exports.QUOTA_TIERS;
21
+ }
22
+ /** Get the default limits for a given tier (falls back to developer). */
23
+ function getTierLimits(tier) {
24
+ return isValidTier(tier) ? exports.QUOTA_TIERS[tier].limits : exports.QUOTA_TIERS.developer.limits;
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQWdDdEMsa0NBRUM7QUFHRCxzQ0FFQztBQXJCRCxtQ0FBbUM7QUFDdEIsUUFBQSxXQUFXLEdBQXVDO0lBQzdELFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtDQUN4RixDQUFDO0FBRUYsNEJBQTRCO0FBQ2YsUUFBQSxXQUFXLEdBQXlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQVcsQ0FBZ0IsQ0FBQztBQUV6RixrREFBa0Q7QUFDckMsUUFBQSxZQUFZLEdBQWMsV0FBVyxDQUFDO0FBRW5ELG1EQUFtRDtBQUNuRCxTQUFnQixXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLEtBQUssSUFBSSxtQkFBVyxDQUFDO0FBQzlCLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBZ0IsYUFBYSxDQUFDLElBQVk7SUFDeEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDckYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBMaW1pdCB2YWx1ZXMgZm9yIGVhY2ggcXVvdGEgdHlwZSB3aXRoaW4gYSB0aWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJMaW1pdHMge1xuICBwbHVnaW5zOiBudW1iZXI7XG4gIHBpcGVsaW5lczogbnVtYmVyO1xuICBhcGlDYWxsczogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKiBQcmVzZXQgbGltaXRzIGZvciBlYWNoIHRpZXIuICovXG5leHBvcnQgY29uc3QgUVVPVEFfVElFUlM6IFJlY29yZDxRdW90YVRpZXIsIFF1b3RhVGllclByZXNldD4gPSB7XG4gIGRldmVsb3BlcjogeyBsYWJlbDogJ0RldmVsb3BlcicsIGxpbWl0czogeyBwbHVnaW5zOiAxMDAsIHBpcGVsaW5lczogMTAsIGFwaUNhbGxzOiAtMSB9IH0sXG4gIHBybzogeyBsYWJlbDogJ1BybycsIGxpbWl0czogeyBwbHVnaW5zOiAxMDAwLCBwaXBlbGluZXM6IDEwMCwgYXBpQ2FsbHM6IC0xIH0gfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiAnVW5saW1pdGVkJywgbGltaXRzOiB7IHBsdWdpbnM6IC0xLCBwaXBlbGluZXM6IC0xLCBhcGlDYWxsczogLTEgfSB9LFxufTtcblxuLyoqIEFsbCB2YWxpZCB0aWVyIG5hbWVzLiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IE9iamVjdC5rZXlzKFFVT1RBX1RJRVJTKSBhcyBRdW90YVRpZXJbXTtcblxuLyoqIERlZmF1bHQgdGllciBhc3NpZ25lZCB0byBuZXcgb3JnYW5pemF0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICdkZXZlbG9wZXInO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgcmV0dXJuIHZhbHVlIGluIFFVT1RBX1RJRVJTO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHMgOiBRVU9UQV9USUVSUy5kZXZlbG9wZXIubGltaXRzO1xufVxuIl19
@@ -0,0 +1,16 @@
1
+ /** Result of alias resolution. */
2
+ export interface AliasResolution {
3
+ /** The resolved organization ID (e.g., 'system'). */
4
+ resolvedOrgId: string;
5
+ /** Whether the input was an alias that got resolved. */
6
+ wasAlias: boolean;
7
+ /** The original input value, useful for audit logging. */
8
+ originalValue: string;
9
+ }
10
+ /**
11
+ * Resolve an email-like alias to an actual organization ID.
12
+ *
13
+ * If the input matches a configured support alias, it resolves to the system
14
+ * org ID. Otherwise the input is returned as-is (lowercased).
15
+ */
16
+ export declare function resolveRecipientAlias(recipientOrgId: string): AliasResolution;