@pipeline-builder/api-core 4.1.13 → 4.1.15

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 (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
package/README.md CHANGED
@@ -49,8 +49,9 @@ Provides the cross-cutting primitives every backend service depends on: JWT auth
49
49
  | `CacheService`, `createCacheService` | In-memory LRU TTL cache with cross-replica invalidation over Redis pub/sub |
50
50
  | `safeFetch`, `resolveSafeTarget`, `assertSafeUrl`, `isPrivateAddress` | SSRF guards for user/tenant-supplied URLs. **`safeFetch` is the one to use for an outbound request**: it resolves the host, PINS the vetted IP into the socket (no DNS-rebinding window between check and connect), refuses redirects, and caps body size and wall-clock time. `assertSafeUrl` is VALIDATION ONLY — for rejecting a URL at create/update time; never pair it with a `fetch` |
51
51
  | `createWebhookChannel`, `createEmailChannel`, `createChannelRegistry`, `NotificationChannel`, `NotificationMessage`, `ChannelTarget`, `DeliveryResult` | Shared notification-channel contract plus the webhook (SSRF-safe, HMAC-signing) and email transports. Services supply only their own `in-app` transport |
52
- | `wireServiceSecurity` | One call for every stateless service's boot security: the `authz.denied` audit sink, the token-revocation reader (overridable), and the access-key-exchange service name |
53
- | `createRemoteAuditAccessor` | Returns both audit shapes a service needs — `getAuditClient` (for `wireServiceSecurity`) and `emit` (the terse per-service emitter) |
52
+ | `wireServiceSecurity(serviceName, opts?)` | One call for every stateless service's boot security: binds the service identity for `recordAudit`, the `authz.denied` audit sink, the token-revocation reader (overridable), and the access-key-exchange service name |
53
+ | `recordAudit(event)` | The ONE emitter for the durable, hash-chained central audit trail (platform `POST /audit/events`), attributed to the service bound by `wireServiceSecurity`. Fire-and-forget; throws "audit not initialised" only if called before binding. Tests bind with `bindTestAuditService` (`/testing`) or pass `apiCoreMock({ recordAudit: spy })` |
54
+ | `logAuditEvent(logger, event)` | The short-retention operator sink: an audit event as a structured winston → Loki log line (`eventCategory: 'audit'`) |
54
55
  | `getRetryDecision`, `getErrorRetryDecision`, `RetryConfig` | The single retry/backoff decision function (Retry-After aware, jittered) and the single `RetryConfig`. pipeline-data's `ConnectionRetryStrategy` is built on it |
55
56
  | `createOrgIdCaster` | Builds the Mongo org-id cast (24-hex → ObjectId, anything else through) from a supplied `Types.ObjectId`, so platform and quota share one implementation without api-core depending on mongoose |
56
57
  | `entityEvents` | Process-local domain event pub/sub for entity changes |
@@ -1,3 +1,2 @@
1
- export * from './http-status.js';
2
1
  export * from './ai-providers.js';
3
2
  export * from './time.js';
@@ -1,6 +1,5 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- export * from './http-status.js';
4
3
  export * from './ai-providers.js';
5
4
  export * from './time.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vaHR0cC1zdGF0dXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9haS1wcm92aWRlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90aW1lLmpzJztcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2FpLXByb3ZpZGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWUuanMnO1xuIl19
@@ -6,7 +6,11 @@ import { ErrorCode } from '../types/error-codes.js';
6
6
  export declare class AppError extends Error {
7
7
  readonly statusCode: number;
8
8
  readonly code: ErrorCode;
9
- constructor(statusCode: number, code: ErrorCode, message: string);
9
+ /** Structured context sent with the error response (e.g. the failing gates). */
10
+ readonly details?: Record<string, unknown> | undefined;
11
+ constructor(statusCode: number, code: ErrorCode, message: string,
12
+ /** Structured context sent with the error response (e.g. the failing gates). */
13
+ details?: Record<string, unknown> | undefined);
10
14
  }
11
15
  /** 404 — Resource not found. */
12
16
  export declare class NotFoundError extends AppError {
@@ -20,7 +24,8 @@ export declare class ForbiddenError extends AppError {
20
24
  export declare class ValidationError extends AppError {
21
25
  constructor(message: string);
22
26
  }
23
- /** 409 — Conflict / duplicate. */
27
+ /** 409 — Conflict / duplicate. `code` narrows the conflict for clients
28
+ * (e.g. `PLUGIN_VERSION_FROZEN`); it must be a 409-mapped code. */
24
29
  export declare class ConflictError extends AppError {
25
- constructor(message: string);
30
+ constructor(message: string, code?: ErrorCode);
26
31
  }
@@ -8,10 +8,14 @@ import { ErrorCode, getStatusForErrorCode } from '../types/error-codes.js';
8
8
  export class AppError extends Error {
9
9
  statusCode;
10
10
  code;
11
- constructor(statusCode, code, message) {
11
+ details;
12
+ constructor(statusCode, code, message,
13
+ /** Structured context sent with the error response (e.g. the failing gates). */
14
+ details) {
12
15
  super(message);
13
16
  this.statusCode = statusCode;
14
17
  this.code = code;
18
+ this.details = details;
15
19
  this.name = 'AppError';
16
20
  }
17
21
  }
@@ -36,11 +40,12 @@ export class ValidationError extends AppError {
36
40
  this.name = 'ValidationError';
37
41
  }
38
42
  }
39
- /** 409 — Conflict / duplicate. */
43
+ /** 409 — Conflict / duplicate. `code` narrows the conflict for clients
44
+ * (e.g. `PLUGIN_VERSION_FROZEN`); it must be a 409-mapped code. */
40
45
  export class ConflictError extends AppError {
41
- constructor(message) {
42
- super(getStatusForErrorCode(ErrorCode.CONFLICT), ErrorCode.CONFLICT, message);
46
+ constructor(message, code = ErrorCode.CONFLICT) {
47
+ super(getStatusForErrorCode(ErrorCode.CONFLICT), code, message);
43
48
  this.name = 'ConflictError';
44
49
  }
45
50
  }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvYXBwLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLEtBQUs7SUFFZixVQUFVO0lBQ1YsSUFBSTtJQUZ0QixZQUNrQixVQUFrQixFQUNsQixJQUFlLEVBQy9CLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7MEJBSkMsVUFBVTtvQkFDVixJQUFJO1FBSXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQUVELGdDQUFnQztBQUNoQyxNQUFNLE9BQU8sYUFBYyxTQUFRLFFBQVE7SUFDekMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFFRCxzQ0FBc0M7QUFDdEMsTUFBTSxPQUFPLGNBQWUsU0FBUSxRQUFRO0lBQzFDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sT0FBTyxlQUFnQixTQUFRLFFBQVE7SUFDM0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxrQ0FBa0M7QUFDbEMsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQ3pDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZ2V0U3RhdHVzRm9yRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuXG4vKipcbiAqIEJhc2UgYXBwbGljYXRpb24gZXJyb3Igd2l0aCBIVFRQIHN0YXR1cyBjb2RlIGFuZCBlcnJvciBjb2RlLlxuICogRXh0ZW5kIHRoaXMgZm9yIGRvbWFpbi1zcGVjaWZpYyBlcnJvciB0eXBlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQXBwRXJyb3InO1xuICB9XG59XG5cbi8qKiA0MDQg4oCUIFJlc291cmNlIG5vdCBmb3VuZC4gKi9cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLk5PVF9GT1VORCksIEVycm9yQ29kZS5OT1RfRk9VTkQsIG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG4vKiogNDAzIOKAlCBJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGdldFN0YXR1c0ZvckVycm9yQ29kZShFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TKSwgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUywgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ZvcmJpZGRlbkVycm9yJztcbiAgfVxufVxuXG4vKiogNDAwIOKAlCBWYWxpZGF0aW9uIC8gYmFkIHJlcXVlc3QuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1IpLCBFcnJvckNvZGUuVkFMSURBVElPTl9FUlJPUiwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwOSDigJQgQ29uZmxpY3QgLyBkdXBsaWNhdGUuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5DT05GTElDVCksIEVycm9yQ29kZS5DT05GTElDVCwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZsaWN0RXJyb3InO1xuICB9XG59XG4iXX0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvYXBwLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLEtBQUs7SUFFZixVQUFVO0lBQ1YsSUFBSTtJQUdKLE9BQU87SUFMekIsWUFDa0IsVUFBa0IsRUFDbEIsSUFBZSxFQUMvQixPQUFlO0lBQ2YsZ0ZBQWdGO0lBQ2hFLE9BQWlDO1FBRWpELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzswQkFOQyxVQUFVO29CQUNWLElBQUk7dUJBR0osT0FBTztRQUd2QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRCxnQ0FBZ0M7QUFDaEMsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQ3pDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sT0FBTyxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELHNDQUFzQztBQUN0QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxRQUFRO0lBQzNDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7b0VBQ29FO0FBQ3BFLE1BQU0sT0FBTyxhQUFjLFNBQVEsUUFBUTtJQUN6QyxZQUFZLE9BQWUsRUFBRSxJQUFJLEdBQWMsU0FBUyxDQUFDLFFBQVE7UUFDL0QsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZ2V0U3RhdHVzRm9yRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuXG4vKipcbiAqIEJhc2UgYXBwbGljYXRpb24gZXJyb3Igd2l0aCBIVFRQIHN0YXR1cyBjb2RlIGFuZCBlcnJvciBjb2RlLlxuICogRXh0ZW5kIHRoaXMgZm9yIGRvbWFpbi1zcGVjaWZpYyBlcnJvciB0eXBlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIC8qKiBTdHJ1Y3R1cmVkIGNvbnRleHQgc2VudCB3aXRoIHRoZSBlcnJvciByZXNwb25zZSAoZS5nLiB0aGUgZmFpbGluZyBnYXRlcykuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FwcEVycm9yJztcbiAgfVxufVxuXG4vKiogNDA0IOKAlCBSZXNvdXJjZSBub3QgZm91bmQuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5OT1RfRk9VTkQpLCBFcnJvckNvZGUuTk9UX0ZPVU5ELCBtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwMyDigJQgSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyksIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsIG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGb3JiaWRkZW5FcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwMCDigJQgVmFsaWRhdGlvbiAvIGJhZCByZXF1ZXN0LiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKSwgRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1IsIG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKiA0MDkg4oCUIENvbmZsaWN0IC8gZHVwbGljYXRlLiBgY29kZWAgbmFycm93cyB0aGUgY29uZmxpY3QgZm9yIGNsaWVudHNcbiAqICAoZS5nLiBgUExVR0lOX1ZFUlNJT05fRlJPWkVOYCk7IGl0IG11c3QgYmUgYSA0MDktbWFwcGVkIGNvZGUuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlOiBFcnJvckNvZGUgPSBFcnJvckNvZGUuQ09ORkxJQ1QpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLkNPTkZMSUNUKSwgY29kZSwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZsaWN0RXJyb3InO1xuICB9XG59XG4iXX0=
@@ -40,11 +40,9 @@ export type VisibilityWriteVerdict = 'ok' | 'needs-publish' | 'not-author';
40
40
  /**
41
41
  * The visibility write rule as a PREDICATE, with no response side-effect.
42
42
  *
43
- * Extracted so BULK routes can apply the identical rule per row instead of
44
- * re-deriving it. They used to reject anything not `private`, which contradicted
45
- * this gate: `resolveVisibility` defaults pipelines and plugins to `org`, and
46
- * this function happily allows an `org` write with plain `:write` — so a bulk
47
- * delete/update 403'd the default case that single-row delete/update allowed.
43
+ * Extracted so BULK routes apply the identical rule per row instead of
44
+ * re-deriving it — a bulk rule that disagreed would 403 cases single-row
45
+ * delete/update allow (an `org` row with plain `:write`, the default rung).
48
46
  *
49
47
  * - `private` → author only
50
48
  * - `org` → any member of the org
@@ -72,7 +70,7 @@ export declare function checkVisibilityWriteAccess(req: Request, resource: Visib
72
70
  * rather than a second code path.
73
71
  *
74
72
  * Permission-based (not coarse-role-based): a bespoke custom Role can be granted
75
- * publish rights and is no longer forced private by its `member` label. Built-in
73
+ * publish rights regardless of its `member` label. Built-in
76
74
  * Admin/Owner bundles carry the publish permissions; the built-in Member bundle
77
75
  * does not, so members top out at `org`.
78
76
  */
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { isSystemAdmin, userHasPermission } from '../middleware/auth.js';
3
+ import { isSystemAdmin, userHasPermission } from '../middleware/permission-gates.js';
4
4
  import { ErrorCode } from '../types/error-codes.js';
5
5
  import { sendError } from '../utils/response.js';
6
6
  /**
@@ -41,11 +41,9 @@ export function requireVisibilityWriteAccess(req, res, resource, userId, publish
41
41
  /**
42
42
  * The visibility write rule as a PREDICATE, with no response side-effect.
43
43
  *
44
- * Extracted so BULK routes can apply the identical rule per row instead of
45
- * re-deriving it. They used to reject anything not `private`, which contradicted
46
- * this gate: `resolveVisibility` defaults pipelines and plugins to `org`, and
47
- * this function happily allows an `org` write with plain `:write` — so a bulk
48
- * delete/update 403'd the default case that single-row delete/update allowed.
44
+ * Extracted so BULK routes apply the identical rule per row instead of
45
+ * re-deriving it — a bulk rule that disagreed would 403 cases single-row
46
+ * delete/update allow (an `org` row with plain `:write`, the default rung).
49
47
  *
50
48
  * - `private` → author only
51
49
  * - `org` → any member of the org
@@ -85,7 +83,7 @@ export function checkVisibilityWriteAccess(req, resource, userId, publishPermiss
85
83
  * rather than a second code path.
86
84
  *
87
85
  * Permission-based (not coarse-role-based): a bespoke custom Role can be granted
88
- * publish rights and is no longer forced private by its `member` label. Built-in
86
+ * publish rights regardless of its `member` label. Built-in
89
87
  * Admin/Owner bundles carry the publish permissions; the built-in Member bundle
90
88
  * does not, so members top out at `org`.
91
89
  */
@@ -99,4 +97,4 @@ export function resolveVisibility(req, requested, publishPermission, fallback =
99
97
  return 'private';
100
98
  return fallback;
101
99
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9hY2Nlc3MtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxHQUFZLEVBQ1osR0FBYSxFQUNiLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxpQkFBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixJQUFJLE9BQU8sS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxLQUFLLGVBQWU7UUFDekIsQ0FBQyxDQUFDLHFEQUFxRDtRQUN2RCxDQUFDLENBQUMsZ0RBQWdELEVBQ3BELFNBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUtEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsR0FBWSxFQUNaLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxpQkFBNkI7SUFFN0IsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFcEMsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDbkYsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELCtFQUErRTtJQUMvRSwyREFBMkQ7SUFDM0QsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNwRixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsR0FBWSxFQUNaLFNBQTZCLEVBQzdCLGlCQUE2QixFQUM3QixRQUFRLEdBQWUsU0FBUztJQUVoQyxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixPQUFPLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxTQUFTLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RDLElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGlzU3lzdGVtQWRtaW4sIHVzZXJIYXNQZXJtaXNzaW9uIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB0eXBlIHsgVmlzaWJpbGl0eSB9IGZyb20gJy4uL3R5cGVzL3Zpc2liaWxpdHkuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKiogVGhlIHNsaWNlIG9mIGEgY2F0YWxvZyBlbnRpdHkgdGhlIHdyaXRlIGdhdGUgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlXcml0ZVRhcmdldCB7XG4gIC8qKiBSdW5nIHRoZSByb3cgY3VycmVudGx5IHNpdHMgYXQg4oCUIHNlZSB7QGxpbmsgVmlzaWJpbGl0eX0uICovXG4gIHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIC8qKiBBdXRob3IuIFRoZSBvbmx5IG5vbi1hZG1pbiB3aG8gbWF5IHRvdWNoIGEgYHByaXZhdGVgIHJvdy4gKi9cbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGNhbGxlciBtYXkgbW9kaWZ5IGEgY2F0YWxvZyBlbnRpdHksIHBlciBpdHMgdmlzaWJpbGl0eSBydW5nLlxuICogVGhlIHNpbmdsZSB3cml0ZSBnYXRlIGJlaGluZCBldmVyeSBwaXBlbGluZSAvIHBsdWdpbiAvIHRlbXBsYXRlIG11dGF0aW9uLlxuICpcbiAqIC0gYHB1YmxpY2Ag4oCUIGEgc3lzdGVtIGFkbWluLCBvciB0aGUgaG9sZGVyIG9mIGBwdWJsaXNoUGVybWlzc2lvbmAgKHRoZSBzYW1lXG4gKiAgIHBlcm1pc3Npb24gdGhhdCBsZXQgdGhlbSBwdWJsaXNoIGl0IGluIHRoZSBmaXJzdCBwbGFjZSwgc28gd2hvZXZlciBjYW5cbiAqICAgcHVibGlzaCBjYW4gYWxzbyBtYW5hZ2Ugd2hhdCB0aGV5IHB1Ymxpc2hlZClcbiAqIC0gYG9yZ2Ag4oCUIGFueW9uZSB3aG8gZ290IHRoaXMgZmFyOiB0aGUgcmVzb3VyY2UncyBgOndyaXRlYCBwZXJtaXNzaW9uIHBsdXMgdGhlXG4gKiAgIG9yZyBzY29waW5nIHRoZSBjYWxsZXIgYWxyZWFkeSBwYXNzZWQgSVMgdGhlIGdhdGVcbiAqIC0gYHByaXZhdGVgIOKAlCB0aGUgQVVUSE9SIGFsb25lIChwbHVzIHN5c3RlbSBhZG1pbnMpXG4gKlxuICogVGhlIGBwcml2YXRlYCBicmFuY2ggaXMgbG9hZC1iZWFyaW5nIG9uIHRoZSBUT01CU1RPTkUgcGF0aHMgKHJlc3RvcmUgLyBwdXJnZSksXG4gKiB3aGljaCBhcmUgb3JnLXNjb3BlZCByYXRoZXIgdGhhbiB2aXNpYmlsaXR5LXNjb3BlZCBiZWNhdXNlIHNvZnQtZGVsZXRlIGlzIG9uZVxuICogc2hhcmVkIGNvZGUgcGF0aCDigJQgd2l0aG91dCBpdCwgYW55IG9yZyBtZW1iZXIgY291bGQgcmVzdXJyZWN0IHNvbWVvbmUgZWxzZSdzXG4gKiBwZXJzb25hbCBkcmFmdC4gT24gdGhlIGxpdmUgcGF0aHMgdGhlIHJlYWQgcHJlZGljYXRlIGhhcyBhbHJlYWR5IGhpZGRlbiB0aGVcbiAqIHJvdywgbWFraW5nIHRoaXMgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVxdWVzdCBtYXkgcHJvY2VlZDsgcmV0dXJucyBgZmFsc2VgIGhhdmluZyBBTFJFQURZIHNlbnRcbiAqIGEgNDAzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoIXJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MocmVxLCByZXMsIHBpcGVsaW5lLCB1c2VySWQsICdwaXBlbGluZXM6cHVibGlzaCcpKSByZXR1cm47XG4gKiBhd2FpdCBwaXBlbGluZVNlcnZpY2UuZGVsZXRlKGlkLCBvcmdJZCwgdXNlcklkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICByZXNvdXJjZTogVmlzaWJpbGl0eVdyaXRlVGFyZ2V0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdmVyZGljdCA9IGNoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzKHJlcSwgcmVzb3VyY2UsIHVzZXJJZCwgcHVibGlzaFBlcm1pc3Npb24pO1xuICBpZiAodmVyZGljdCA9PT0gJ29rJykgcmV0dXJuIHRydWU7XG4gIHNlbmRFcnJvcihcbiAgICByZXMsXG4gICAgNDAzLFxuICAgIHZlcmRpY3QgPT09ICduZWVkcy1wdWJsaXNoJ1xuICAgICAgPyAnWW91IGxhY2sgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhpcyBwdWJsaWMgcmVzb3VyY2UuJ1xuICAgICAgOiAnT25seSB0aGUgYXV0aG9yIGNhbiBtb2RpZnkgYSBwcml2YXRlIHJlc291cmNlLicsXG4gICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2h5IGEgd3JpdGUgd2FzIHJlZnVzZWQsIG9yIGAnb2snYC4gU2VlIHtAbGluayBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2Vzc30uICovXG5leHBvcnQgdHlwZSBWaXNpYmlsaXR5V3JpdGVWZXJkaWN0ID0gJ29rJyB8ICduZWVkcy1wdWJsaXNoJyB8ICdub3QtYXV0aG9yJztcblxuLyoqXG4gKiBUaGUgdmlzaWJpbGl0eSB3cml0ZSBydWxlIGFzIGEgUFJFRElDQVRFLCB3aXRoIG5vIHJlc3BvbnNlIHNpZGUtZWZmZWN0LlxuICpcbiAqIEV4dHJhY3RlZCBzbyBCVUxLIHJvdXRlcyBjYW4gYXBwbHkgdGhlIGlkZW50aWNhbCBydWxlIHBlciByb3cgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQuIFRoZXkgdXNlZCB0byByZWplY3QgYW55dGhpbmcgbm90IGBwcml2YXRlYCwgd2hpY2ggY29udHJhZGljdGVkXG4gKiB0aGlzIGdhdGU6IGByZXNvbHZlVmlzaWJpbGl0eWAgZGVmYXVsdHMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvIGBvcmdgLCBhbmRcbiAqIHRoaXMgZnVuY3Rpb24gaGFwcGlseSBhbGxvd3MgYW4gYG9yZ2Agd3JpdGUgd2l0aCBwbGFpbiBgOndyaXRlYCDigJQgc28gYSBidWxrXG4gKiBkZWxldGUvdXBkYXRlIDQwMydkIHRoZSBkZWZhdWx0IGNhc2UgdGhhdCBzaW5nbGUtcm93IGRlbGV0ZS91cGRhdGUgYWxsb3dlZC5cbiAqXG4gKiAgIC0gYHByaXZhdGVgIOKGkiBhdXRob3Igb25seVxuICogICAtIGBvcmdgICAgICDihpIgYW55IG1lbWJlciBvZiB0aGUgb3JnXG4gKiAgIC0gYHB1YmxpY2AgIOKGkiByZXF1aXJlcyBgcHVibGlzaFBlcm1pc3Npb25gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXNvdXJjZTogVmlzaWJpbGl0eVdyaXRlVGFyZ2V0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4pOiBWaXNpYmlsaXR5V3JpdGVWZXJkaWN0IHtcbiAgaWYgKGlzU3lzdGVtQWRtaW4ocmVxKSkgcmV0dXJuICdvayc7XG5cbiAgaWYgKHJlc291cmNlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnICYmICF1c2VySGFzUGVybWlzc2lvbihyZXEsIHB1Ymxpc2hQZXJtaXNzaW9uKSkge1xuICAgIHJldHVybiAnbmVlZHMtcHVibGlzaCc7XG4gIH1cblxuICAvLyBGYWlsIGNsb3NlZCBvbiBhbiBhbm9ueW1vdXMvYWJzZW50IGNhbGxlciDigJQgYW4gZW1wdHkgdXNlcklkIG11c3QgbmV2ZXIgbWF0Y2hcbiAgLy8gYW4gZW1wdHkgYGNyZWF0ZWRCeWAgYW5kIGhhbmQgb3ZlciBzb21lb25lIGVsc2UncyBkcmFmdC5cbiAgaWYgKHJlc291cmNlLnZpc2liaWxpdHkgPT09ICdwcml2YXRlJyAmJiAoIXVzZXJJZCB8fCByZXNvdXJjZS5jcmVhdGVkQnkgIT09IHVzZXJJZCkpIHtcbiAgICByZXR1cm4gJ25vdC1hdXRob3InO1xuICB9XG5cbiAgcmV0dXJuICdvayc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHZpc2liaWxpdHkgZm9yIGFuIGVudGl0eSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWQuXG4gKlxuICogYHB1YmxpY2AgcmVxdWlyZXMgdGhlIHB1Ymxpc2ggY2FwYWJpbGl0eSAoc3VwZXJhZG1pbnMgcGFzcyB2aWEgaW1wbGljaXQtYWxsKTtcbiAqIGEgY2FsbGVyIHdobyBhc2tzIGZvciBpdCB3aXRob3V0IHRoZSBwZXJtaXNzaW9uIGlzIGNsYW1wZWQgdG8gYG9yZ2AgcmF0aGVyXG4gKiB0aGFuIGRyb3BwZWQgdG8gYSBwZXJzb25hbCBkcmFmdCDigJQgdGhleSBhc2tlZCB0byBTSEFSRSBpdCwgYW5kIGBvcmdgIGlzIHRoZVxuICogd2lkZXN0IHJ1bmcgdGhleSBhcmUgZW50aXRsZWQgdG8uIEFueXRoaW5nIGVsc2UgcGFzc2VzIHRocm91Z2guXG4gKlxuICogYGZhbGxiYWNrYCBpcyB0aGUgcnVuZyBhbiBVTlNQRUNJRklFRCB2aXNpYmlsaXR5IGxhbmRzIG9uLCBhbmQgaXQgaXNcbiAqIGRlbGliZXJhdGVseSBwZXItZW50aXR5IGV2ZW4gdGhvdWdoIHRoZSBsYWRkZXIgaXRzZWxmIGlzIGlkZW50aWNhbCBldmVyeXdoZXJlOlxuICpcbiAqIC0gKip0ZW1wbGF0ZXMqKiBkZWZhdWx0IHRvIGBwcml2YXRlYCDigJQgZHJhZnQtZmlyc3QgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZVxuICogICBwZXJzb25hbCBydW5nOyB5b3UgcG9saXNoIGEgc3RhcnRlciBiZWZvcmUgcHVibGlzaGluZyBpdC5cbiAqIC0gKipwaXBlbGluZXMgLyBwbHVnaW5zKiogZGVmYXVsdCB0byBgb3JnYCDigJQgdGhleSBhcmUgdGVhbSBhc3NldHMgdGhhdCBkZXBsb3lcbiAqICAgc2hhcmVkIGluZnJhc3RydWN0dXJlLCBzbyBjcmVhdGluZyBvbmUgbXVzdCBub3QgaGlkZSBpdCBmcm9tIHRoZSB0ZWFtLiBBXG4gKiAgIHBlcnNvbmFsIGRyYWZ0IHN0YXlzIGF2YWlsYWJsZSwgYnV0IG9wdC1pbi5cbiAqXG4gKiBTYW1lIGxhZGRlciwgc2FtZSBnYXRlLCBkaWZmZXJlbnQgY2VudHJlIG9mIGdyYXZpdHkg4oCUIGV4cHJlc3NlZCBhcyBhbiBhcmd1bWVudFxuICogcmF0aGVyIHRoYW4gYSBzZWNvbmQgY29kZSBwYXRoLlxuICpcbiAqIFBlcm1pc3Npb24tYmFzZWQgKG5vdCBjb2Fyc2Utcm9sZS1iYXNlZCk6IGEgYmVzcG9rZSBjdXN0b20gUm9sZSBjYW4gYmUgZ3JhbnRlZFxuICogcHVibGlzaCByaWdodHMgYW5kIGlzIG5vIGxvbmdlciBmb3JjZWQgcHJpdmF0ZSBieSBpdHMgYG1lbWJlcmAgbGFiZWwuIEJ1aWx0LWluXG4gKiBBZG1pbi9Pd25lciBidW5kbGVzIGNhcnJ5IHRoZSBwdWJsaXNoIHBlcm1pc3Npb25zOyB0aGUgYnVpbHQtaW4gTWVtYmVyIGJ1bmRsZVxuICogZG9lcyBub3QsIHNvIG1lbWJlcnMgdG9wIG91dCBhdCBgb3JnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVWaXNpYmlsaXR5KFxuICByZXE6IFJlcXVlc3QsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwdWJsaXNoUGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgZmFsbGJhY2s6IFZpc2liaWxpdHkgPSAncHJpdmF0ZScsXG4pOiBWaXNpYmlsaXR5IHtcbiAgaWYgKHJlcXVlc3RlZCA9PT0gJ3B1YmxpYycpIHtcbiAgICByZXR1cm4gdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwdWJsaXNoUGVybWlzc2lvbikgPyAncHVibGljJyA6ICdvcmcnO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdvcmcnKSByZXR1cm4gJ29yZyc7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwcml2YXRlJykgcmV0dXJuICdwcml2YXRlJztcbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuIl19
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9hY2Nlc3MtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxHQUFZLEVBQ1osR0FBYSxFQUNiLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxpQkFBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixJQUFJLE9BQU8sS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxLQUFLLGVBQWU7UUFDekIsQ0FBQyxDQUFDLHFEQUFxRDtRQUN2RCxDQUFDLENBQUMsZ0RBQWdELEVBQ3BELFNBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUtEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLEdBQVksRUFDWixRQUErQixFQUMvQixNQUFjLEVBQ2QsaUJBQTZCO0lBRTdCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXBDLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ25GLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsMkRBQTJEO0lBQzNELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDcEYsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVksRUFDWixTQUE2QixFQUM3QixpQkFBNkIsRUFDN0IsUUFBUSxHQUFlLFNBQVM7SUFFaEMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDM0IsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksU0FBUyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0QyxJQUFJLFNBQVMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUMsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBpc1N5c3RlbUFkbWluLCB1c2VySGFzUGVybWlzc2lvbiB9IGZyb20gJy4uL21pZGRsZXdhcmUvcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICcuLi90eXBlcy92aXNpYmlsaXR5LmpzJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqIFRoZSBzbGljZSBvZiBhIGNhdGFsb2cgZW50aXR5IHRoZSB3cml0ZSBnYXRlIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXNpYmlsaXR5V3JpdGVUYXJnZXQge1xuICAvKiogUnVuZyB0aGUgcm93IGN1cnJlbnRseSBzaXRzIGF0IOKAlCBzZWUge0BsaW5rIFZpc2liaWxpdHl9LiAqL1xuICB2aXNpYmlsaXR5Pzogc3RyaW5nO1xuICAvKiogQXV0aG9yLiBUaGUgb25seSBub24tYWRtaW4gd2hvIG1heSB0b3VjaCBhIGBwcml2YXRlYCByb3cuICovXG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBjYWxsZXIgbWF5IG1vZGlmeSBhIGNhdGFsb2cgZW50aXR5LCBwZXIgaXRzIHZpc2liaWxpdHkgcnVuZy5cbiAqIFRoZSBzaW5nbGUgd3JpdGUgZ2F0ZSBiZWhpbmQgZXZlcnkgcGlwZWxpbmUgLyBwbHVnaW4gLyB0ZW1wbGF0ZSBtdXRhdGlvbi5cbiAqXG4gKiAtIGBwdWJsaWNgIOKAlCBhIHN5c3RlbSBhZG1pbiwgb3IgdGhlIGhvbGRlciBvZiBgcHVibGlzaFBlcm1pc3Npb25gICh0aGUgc2FtZVxuICogICBwZXJtaXNzaW9uIHRoYXQgbGV0IHRoZW0gcHVibGlzaCBpdCBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIHdob2V2ZXIgY2FuXG4gKiAgIHB1Ymxpc2ggY2FuIGFsc28gbWFuYWdlIHdoYXQgdGhleSBwdWJsaXNoZWQpXG4gKiAtIGBvcmdgIOKAlCBhbnlvbmUgd2hvIGdvdCB0aGlzIGZhcjogdGhlIHJlc291cmNlJ3MgYDp3cml0ZWAgcGVybWlzc2lvbiBwbHVzIHRoZVxuICogICBvcmcgc2NvcGluZyB0aGUgY2FsbGVyIGFscmVhZHkgcGFzc2VkIElTIHRoZSBnYXRlXG4gKiAtIGBwcml2YXRlYCDigJQgdGhlIEFVVEhPUiBhbG9uZSAocGx1cyBzeXN0ZW0gYWRtaW5zKVxuICpcbiAqIFRoZSBgcHJpdmF0ZWAgYnJhbmNoIGlzIGxvYWQtYmVhcmluZyBvbiB0aGUgVE9NQlNUT05FIHBhdGhzIChyZXN0b3JlIC8gcHVyZ2UpLFxuICogd2hpY2ggYXJlIG9yZy1zY29wZWQgcmF0aGVyIHRoYW4gdmlzaWJpbGl0eS1zY29wZWQgYmVjYXVzZSBzb2Z0LWRlbGV0ZSBpcyBvbmVcbiAqIHNoYXJlZCBjb2RlIHBhdGgg4oCUIHdpdGhvdXQgaXQsIGFueSBvcmcgbWVtYmVyIGNvdWxkIHJlc3VycmVjdCBzb21lb25lIGVsc2Unc1xuICogcGVyc29uYWwgZHJhZnQuIE9uIHRoZSBsaXZlIHBhdGhzIHRoZSByZWFkIHByZWRpY2F0ZSBoYXMgYWxyZWFkeSBoaWRkZW4gdGhlXG4gKiByb3csIG1ha2luZyB0aGlzIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgbWF5IHByb2NlZWQ7IHJldHVybnMgYGZhbHNlYCBoYXZpbmcgQUxSRUFEWSBzZW50XG4gKiBhIDQwMy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKCFyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKHJlcSwgcmVzLCBwaXBlbGluZSwgdXNlcklkLCAncGlwZWxpbmVzOnB1Ymxpc2gnKSkgcmV0dXJuO1xuICogYXdhaXQgcGlwZWxpbmVTZXJ2aWNlLmRlbGV0ZShpZCwgb3JnSWQsIHVzZXJJZCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZlcmRpY3QgPSBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhyZXEsIHJlc291cmNlLCB1c2VySWQsIHB1Ymxpc2hQZXJtaXNzaW9uKTtcbiAgaWYgKHZlcmRpY3QgPT09ICdvaycpIHJldHVybiB0cnVlO1xuICBzZW5kRXJyb3IoXG4gICAgcmVzLFxuICAgIDQwMyxcbiAgICB2ZXJkaWN0ID09PSAnbmVlZHMtcHVibGlzaCdcbiAgICAgID8gJ1lvdSBsYWNrIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgcHVibGljIHJlc291cmNlLidcbiAgICAgIDogJ09ubHkgdGhlIGF1dGhvciBjYW4gbW9kaWZ5IGEgcHJpdmF0ZSByZXNvdXJjZS4nLFxuICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoeSBhIHdyaXRlIHdhcyByZWZ1c2VkLCBvciBgJ29rJ2AuIFNlZSB7QGxpbmsgY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3N9LiAqL1xuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eVdyaXRlVmVyZGljdCA9ICdvaycgfCAnbmVlZHMtcHVibGlzaCcgfCAnbm90LWF1dGhvcic7XG5cbi8qKlxuICogVGhlIHZpc2liaWxpdHkgd3JpdGUgcnVsZSBhcyBhIFBSRURJQ0FURSwgd2l0aCBubyByZXNwb25zZSBzaWRlLWVmZmVjdC5cbiAqXG4gKiBFeHRyYWN0ZWQgc28gQlVMSyByb3V0ZXMgYXBwbHkgdGhlIGlkZW50aWNhbCBydWxlIHBlciByb3cgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQg4oCUIGEgYnVsayBydWxlIHRoYXQgZGlzYWdyZWVkIHdvdWxkIDQwMyBjYXNlcyBzaW5nbGUtcm93XG4gKiBkZWxldGUvdXBkYXRlIGFsbG93IChhbiBgb3JnYCByb3cgd2l0aCBwbGFpbiBgOndyaXRlYCwgdGhlIGRlZmF1bHQgcnVuZykuXG4gKlxuICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHlcbiAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZ1xuICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgYHB1Ymxpc2hQZXJtaXNzaW9uYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogVmlzaWJpbGl0eVdyaXRlVmVyZGljdCB7XG4gIGlmIChpc1N5c3RlbUFkbWluKHJlcSkpIHJldHVybiAnb2snO1xuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHVibGljJyAmJiAhdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwdWJsaXNoUGVybWlzc2lvbikpIHtcbiAgICByZXR1cm4gJ25lZWRzLXB1Ymxpc2gnO1xuICB9XG5cbiAgLy8gRmFpbCBjbG9zZWQgb24gYW4gYW5vbnltb3VzL2Fic2VudCBjYWxsZXIg4oCUIGFuIGVtcHR5IHVzZXJJZCBtdXN0IG5ldmVyIG1hdGNoXG4gIC8vIGFuIGVtcHR5IGBjcmVhdGVkQnlgIGFuZCBoYW5kIG92ZXIgc29tZW9uZSBlbHNlJ3MgZHJhZnQuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHJpdmF0ZScgJiYgKCF1c2VySWQgfHwgcmVzb3VyY2UuY3JlYXRlZEJ5ICE9PSB1c2VySWQpKSB7XG4gICAgcmV0dXJuICdub3QtYXV0aG9yJztcbiAgfVxuXG4gIHJldHVybiAnb2snO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSB2aXNpYmlsaXR5IGZvciBhbiBlbnRpdHkgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLlxuICpcbiAqIGBwdWJsaWNgIHJlcXVpcmVzIHRoZSBwdWJsaXNoIGNhcGFiaWxpdHkgKHN1cGVyYWRtaW5zIHBhc3MgdmlhIGltcGxpY2l0LWFsbCk7XG4gKiBhIGNhbGxlciB3aG8gYXNrcyBmb3IgaXQgd2l0aG91dCB0aGUgcGVybWlzc2lvbiBpcyBjbGFtcGVkIHRvIGBvcmdgIHJhdGhlclxuICogdGhhbiBkcm9wcGVkIHRvIGEgcGVyc29uYWwgZHJhZnQg4oCUIHRoZXkgYXNrZWQgdG8gU0hBUkUgaXQsIGFuZCBgb3JnYCBpcyB0aGVcbiAqIHdpZGVzdCBydW5nIHRoZXkgYXJlIGVudGl0bGVkIHRvLiBBbnl0aGluZyBlbHNlIHBhc3NlcyB0aHJvdWdoLlxuICpcbiAqIGBmYWxsYmFja2AgaXMgdGhlIHJ1bmcgYW4gVU5TUEVDSUZJRUQgdmlzaWJpbGl0eSBsYW5kcyBvbiwgYW5kIGl0IGlzXG4gKiBkZWxpYmVyYXRlbHkgcGVyLWVudGl0eSBldmVuIHRob3VnaCB0aGUgbGFkZGVyIGl0c2VsZiBpcyBpZGVudGljYWwgZXZlcnl3aGVyZTpcbiAqXG4gKiAtICoqdGVtcGxhdGVzKiogZGVmYXVsdCB0byBgcHJpdmF0ZWAg4oCUIGRyYWZ0LWZpcnN0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGVcbiAqICAgcGVyc29uYWwgcnVuZzsgeW91IHBvbGlzaCBhIHN0YXJ0ZXIgYmVmb3JlIHB1Ymxpc2hpbmcgaXQuXG4gKiAtICoqcGlwZWxpbmVzIC8gcGx1Z2lucyoqIGRlZmF1bHQgdG8gYG9yZ2Ag4oCUIHRoZXkgYXJlIHRlYW0gYXNzZXRzIHRoYXQgZGVwbG95XG4gKiAgIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSwgc28gY3JlYXRpbmcgb25lIG11c3Qgbm90IGhpZGUgaXQgZnJvbSB0aGUgdGVhbS4gQVxuICogICBwZXJzb25hbCBkcmFmdCBzdGF5cyBhdmFpbGFibGUsIGJ1dCBvcHQtaW4uXG4gKlxuICogU2FtZSBsYWRkZXIsIHNhbWUgZ2F0ZSwgZGlmZmVyZW50IGNlbnRyZSBvZiBncmF2aXR5IOKAlCBleHByZXNzZWQgYXMgYW4gYXJndW1lbnRcbiAqIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvZGUgcGF0aC5cbiAqXG4gKiBQZXJtaXNzaW9uLWJhc2VkIChub3QgY29hcnNlLXJvbGUtYmFzZWQpOiBhIGJlc3Bva2UgY3VzdG9tIFJvbGUgY2FuIGJlIGdyYW50ZWRcbiAqIHB1Ymxpc2ggcmlnaHRzIHJlZ2FyZGxlc3Mgb2YgaXRzIGBtZW1iZXJgIGxhYmVsLiBCdWlsdC1pblxuICogQWRtaW4vT3duZXIgYnVuZGxlcyBjYXJyeSB0aGUgcHVibGlzaCBwZXJtaXNzaW9uczsgdGhlIGJ1aWx0LWluIE1lbWJlciBidW5kbGVcbiAqIGRvZXMgbm90LCBzbyBtZW1iZXJzIHRvcCBvdXQgYXQgYG9yZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJpbGl0eShcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGZhbGxiYWNrOiBWaXNpYmlsaXR5ID0gJ3ByaXZhdGUnLFxuKTogVmlzaWJpbGl0eSB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuIHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcHVibGlzaFBlcm1pc3Npb24pID8gJ3B1YmxpYycgOiAnb3JnJztcbiAgfVxuICBpZiAocmVxdWVzdGVkID09PSAnb3JnJykgcmV0dXJuICdvcmcnO1xuICBpZiAocmVxdWVzdGVkID09PSAncHJpdmF0ZScpIHJldHVybiAncHJpdmF0ZSc7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  export * from './crud-helpers.js';
2
- export * from './access-helpers.js';
3
- export * from './restore-helpers.js';
2
+ export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
3
+ export { loadAndRestore, loadAndPurge, type RestorableService, type PurgeableService, type TombstoneAuthorizer, type TombstoneRouteOptions, } from './restore-helpers.js';
4
4
  export * from './sse-helpers.js';
5
5
  export * from './org-hierarchy.js';
6
- export * from './org-hierarchy-http.js';
6
+ export { fetchParentOrgId, fetchOrgDescendants, fetchOrgNames, fetchOrgMembership, } from './org-hierarchy-http.js';
@@ -1,9 +1,9 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export * from './crud-helpers.js';
4
- export * from './access-helpers.js';
5
- export * from './restore-helpers.js';
4
+ export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
5
+ export { loadAndRestore, loadAndPurge, } from './restore-helpers.js';
6
6
  export * from './sse-helpers.js';
7
7
  export * from './org-hierarchy.js';
8
- export * from './org-hierarchy-http.js';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN0b3JlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2UtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL29yZy1oaWVyYXJjaHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LWh0dHAuanMnO1xuIl19
8
+ export { fetchParentOrgId, fetchOrgDescendants, fetchOrgNames, fetchOrgMembership, } from './org-hierarchy-http.js';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsaUJBQWlCLEdBQ2xCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEdBS2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MsXG4gIGNoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzLFxuICByZXNvbHZlVmlzaWJpbGl0eSxcbn0gZnJvbSAnLi9hY2Nlc3MtaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBsb2FkQW5kUmVzdG9yZSxcbiAgbG9hZEFuZFB1cmdlLFxuICB0eXBlIFJlc3RvcmFibGVTZXJ2aWNlLFxuICB0eXBlIFB1cmdlYWJsZVNlcnZpY2UsXG4gIHR5cGUgVG9tYnN0b25lQXV0aG9yaXplcixcbiAgdHlwZSBUb21ic3RvbmVSb3V0ZU9wdGlvbnMsXG59IGZyb20gJy4vcmVzdG9yZS1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LmpzJztcbmV4cG9ydCB7XG4gIGZldGNoUGFyZW50T3JnSWQsXG4gIGZldGNoT3JnRGVzY2VuZGFudHMsXG4gIGZldGNoT3JnTmFtZXMsXG4gIGZldGNoT3JnTWVtYmVyc2hpcCxcbn0gZnJvbSAnLi9vcmctaGllcmFyY2h5LWh0dHAuanMnO1xuIl19
@@ -1,10 +1,12 @@
1
1
  import type { ServiceConfig } from '../types/common.js';
2
2
  /** Options shared by the platform org-hierarchy HTTP lookups. */
3
3
  export interface OrgHierarchyHttpOptions {
4
- /** Platform service host/port (+ optional default timeout) for the client. */
5
- service: ServiceConfig;
6
- /** Service name minted into the service-auth JWT `sub` (e.g. 'compliance'). */
7
- serviceName: string;
4
+ /** Platform service host/port (+ optional default timeout). Defaults to the
5
+ * registry's platform endpoint. */
6
+ service?: ServiceConfig;
7
+ /** Service name minted into the service-auth JWT `sub`. Defaults to this
8
+ * process's own identity (`SERVICE_NAME`). */
9
+ serviceName?: string;
8
10
  /**
9
11
  * Org id embedded in the signed service token's org context. Defaults to the
10
12
  * queried `orgId`; pass a system org id for a system-scoped lookup.
@@ -33,7 +35,7 @@ export interface OrgHierarchyHttpOptions {
33
35
  * `throwOnHttpError` is set. Always throws on a transport failure
34
36
  * (connection/timeout) so the caller can apply its own fallback.
35
37
  */
36
- export declare function fetchParentOrgId(orgId: string, opts: OrgHierarchyHttpOptions): Promise<string | undefined>;
38
+ export declare function fetchParentOrgId(orgId: string, opts?: OrgHierarchyHttpOptions): Promise<string | undefined>;
37
39
  /**
38
40
  * Resolve `[self, ...descendantOrgIds]` for an org via platform's
39
41
  * `GET /organization/:id/descendants`. Returns the id list only when it is
@@ -46,7 +48,7 @@ export declare function fetchParentOrgId(orgId: string, opts: OrgHierarchyHttpOp
46
48
  * a malformed payload can never smuggle a non-string into the returned
47
49
  * `string[]`.
48
50
  */
49
- export declare function fetchOrgDescendants(orgId: string, opts: OrgHierarchyHttpOptions): Promise<string[] | undefined>;
51
+ export declare function fetchOrgDescendants(orgId: string, opts?: OrgHierarchyHttpOptions): Promise<string[] | undefined>;
50
52
  /**
51
53
  * Batch-resolve org id → display NAME via platform's `POST /organization/names`.
52
54
  * Returns a lowercased `{ [orgId]: name }` map — ids the platform doesn't know
@@ -59,7 +61,7 @@ export declare function fetchOrgDescendants(orgId: string, opts: OrgHierarchyHtt
59
61
  * response is validated entry-by-entry (only string→string pairs survive), so a
60
62
  * malformed payload can't smuggle a non-string into the returned map.
61
63
  */
62
- export declare function fetchOrgNames(orgIds: string[], opts: OrgHierarchyHttpOptions): Promise<Record<string, string>>;
64
+ export declare function fetchOrgNames(orgIds: string[], opts?: OrgHierarchyHttpOptions): Promise<Record<string, string>>;
63
65
  /**
64
66
  * Check whether `userId` is an ACTIVE member of `orgId` via platform's
65
67
  * `GET /organization/:id/members/:userId/exists`. Returns the boolean the
@@ -68,7 +70,6 @@ export declare function fetchOrgNames(orgIds: string[], opts: OrgHierarchyHttpOp
68
70
  * Returns `undefined` (— "couldn't determine") on a non-2xx response, and
69
71
  * throws only on a transport failure (connection/timeout) — so the caller
70
72
  * distinguishes a definitive not-a-member (`false`) from an indeterminate
71
- * lookup (`undefined`) and applies its own fail-open/closed policy. The `path`
72
- * differs from the parent/descendants shape, so this builds its own request.
73
+ * lookup (`undefined`) and applies its own fail-open/closed policy.
73
74
  */
74
- export declare function fetchOrgMembership(orgId: string, userId: string, opts: OrgHierarchyHttpOptions): Promise<boolean | undefined>;
75
+ export declare function fetchOrgMembership(orgId: string, userId: string, opts?: OrgHierarchyHttpOptions): Promise<boolean | undefined>;
@@ -15,22 +15,28 @@
15
15
  * These functions deliberately do NOT swallow transport errors: a connection
16
16
  * failure/timeout propagates so each caller keeps its own fallback policy (log
17
17
  * level, degrade-to-self vs. return-undefined). A non-2xx response is treated
18
- * as "no data" (returns undefined), matching what the callers previously did.
18
+ * as "no data" (returns undefined).
19
19
  */
20
- import { getServiceAuthHeader, SYSTEM_ORG_ID } from '../middleware/auth.js';
20
+ import { getServiceAuthHeader } from '../middleware/service-tokens.js';
21
+ import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
21
22
  import { InternalHttpClient } from '../services/http-client.js';
22
- function buildRequest(orgId, suffix, opts) {
23
- const client = new InternalHttpClient(opts.service);
24
- const path = `/organization/${encodeURIComponent(orgId)}/${suffix}`;
23
+ import { serviceIdentity } from '../services/service-keys.js';
24
+ import { serviceEndpoint } from '../utils/service-registry.js';
25
+ /** The platform client + signed service-auth headers for one lookup. */
26
+ function platformRequest(opts, authOrgId) {
27
+ const client = new InternalHttpClient(opts.service ?? serviceEndpoint('platform'));
25
28
  const headers = {
26
29
  Authorization: getServiceAuthHeader({
27
- serviceName: opts.serviceName,
28
- orgId: opts.authOrgId ?? orgId,
30
+ serviceName: opts.serviceName ?? serviceIdentity(),
31
+ orgId: opts.authOrgId ?? authOrgId,
29
32
  role: opts.role ?? 'member',
30
33
  }),
31
34
  ...opts.headers,
32
35
  };
33
- return { client, path, headers };
36
+ return { client, headers };
37
+ }
38
+ function buildRequest(orgId, suffix, opts) {
39
+ return { ...platformRequest(opts, orgId), path: `/organization/${encodeURIComponent(orgId)}/${suffix}` };
34
40
  }
35
41
  /**
36
42
  * Resolve an org's direct parent id via platform's
@@ -39,7 +45,7 @@ function buildRequest(orgId, suffix, opts) {
39
45
  * `throwOnHttpError` is set. Always throws on a transport failure
40
46
  * (connection/timeout) so the caller can apply its own fallback.
41
47
  */
42
- export async function fetchParentOrgId(orgId, opts) {
48
+ export async function fetchParentOrgId(orgId, opts = {}) {
43
49
  const { client, path, headers } = buildRequest(orgId, 'parent', opts);
44
50
  const res = await client.get(path, { headers, timeout: opts.timeout });
45
51
  if (res.statusCode >= 400) {
@@ -62,7 +68,7 @@ export async function fetchParentOrgId(orgId, opts) {
62
68
  * a malformed payload can never smuggle a non-string into the returned
63
69
  * `string[]`.
64
70
  */
65
- export async function fetchOrgDescendants(orgId, opts) {
71
+ export async function fetchOrgDescendants(orgId, opts = {}) {
66
72
  const { client, path, headers } = buildRequest(orgId, 'descendants', opts);
67
73
  const res = await client.get(path, { headers, timeout: opts.timeout });
68
74
  if (res.statusCode >= 400)
@@ -86,20 +92,12 @@ export async function fetchOrgDescendants(orgId, opts) {
86
92
  * response is validated entry-by-entry (only string→string pairs survive), so a
87
93
  * malformed payload can't smuggle a non-string into the returned map.
88
94
  */
89
- export async function fetchOrgNames(orgIds, opts) {
95
+ export async function fetchOrgNames(orgIds, opts = {}) {
90
96
  if (orgIds.length === 0)
91
97
  return {};
92
- const client = new InternalHttpClient(opts.service);
93
- const headers = {
94
- Authorization: getServiceAuthHeader({
95
- serviceName: opts.serviceName,
96
- // A cross-org registry read, not a tenant-scoped op — default to the system
97
- // org context when the caller doesn't pin one.
98
- orgId: opts.authOrgId ?? SYSTEM_ORG_ID,
99
- role: opts.role ?? 'member',
100
- }),
101
- ...opts.headers,
102
- };
98
+ // A cross-org registry read, not a tenant-scoped op — default to the system
99
+ // org context when the caller doesn't pin one.
100
+ const { client, headers } = platformRequest(opts, SYSTEM_ORG_ID);
103
101
  const res = await client.post('/organization/names', { orgIds }, { headers, timeout: opts.timeout });
104
102
  if (res.statusCode >= 400)
105
103
  return {};
@@ -121,24 +119,15 @@ export async function fetchOrgNames(orgIds, opts) {
121
119
  * Returns `undefined` (— "couldn't determine") on a non-2xx response, and
122
120
  * throws only on a transport failure (connection/timeout) — so the caller
123
121
  * distinguishes a definitive not-a-member (`false`) from an indeterminate
124
- * lookup (`undefined`) and applies its own fail-open/closed policy. The `path`
125
- * differs from the parent/descendants shape, so this builds its own request.
122
+ * lookup (`undefined`) and applies its own fail-open/closed policy.
126
123
  */
127
- export async function fetchOrgMembership(orgId, userId, opts) {
128
- const client = new InternalHttpClient(opts.service);
124
+ export async function fetchOrgMembership(orgId, userId, opts = {}) {
125
+ const { client, headers } = platformRequest(opts, orgId);
129
126
  const path = `/organization/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}/exists`;
130
- const headers = {
131
- Authorization: getServiceAuthHeader({
132
- serviceName: opts.serviceName,
133
- orgId: opts.authOrgId ?? orgId,
134
- role: opts.role ?? 'member',
135
- }),
136
- ...opts.headers,
137
- };
138
127
  const res = await client.get(path, { headers, timeout: opts.timeout });
139
128
  if (res.statusCode >= 400)
140
129
  return undefined;
141
130
  const isMember = res.body?.data?.isMember;
142
131
  return typeof isMember === 'boolean' ? isMember : undefined;
143
132
  }
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS1odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlcnMvb3JnLWhpZXJhcmNoeS1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUErQmhFLFNBQVMsWUFBWSxDQUNuQixLQUFhLEVBQ2IsTUFBZ0MsRUFDaEMsSUFBNkI7SUFFN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxhQUFhLEVBQUUsb0JBQW9CLENBQUM7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUTtTQUM1QixDQUFDO1FBQ0YsR0FBRyxJQUFJLENBQUMsT0FBTztLQUNoQixDQUFDO0lBQ0YsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQTZCO0lBQ2pGLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FB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QUksRUFBRSxRQUFRLENBQUM7SUFDMUMsT0FBTyxPQUFPLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IGxvb2t1cHMgb3ZlciBIVFRQIGFnYWluc3QgdGhlIHBsYXRmb3JtIHNlcnZpY2UuXG4gKlxuICogVGhlIE1vbmdvb3NlLWJhc2VkIHRyYXZlcnNhbCBpbiB7QGxpbmsgLi9vcmctaGllcmFyY2h5fSBpcyBmb3Igc2VydmljZXMgdGhhdFxuICogb3duIHRoZSBvcmcgdGFibGUgKHBsYXRmb3JtLCBxdW90YSkuIEV2ZXJ5b25lIGVsc2UgcmVhZHMgdGhlIGhpZXJhcmNoeSBvdmVyXG4gKiB0aGUgd2lyZSBmcm9tIHBsYXRmb3JtJ3MgYXV0aG9yaXRhdGl2ZSBgL29yZ2FuaXphdGlvbi86aWQvKmAgZW5kcG9pbnRzLiBUaGlzXG4gKiBtb2R1bGUgY2VudHJhbGl6ZXMgdGhlIHRyYW5zcG9ydCBmb3IgdGhvc2UgcmVhZHMg4oCUIFVSTCBjb25zdHJ1Y3Rpb24sIHRoZVxuICogc2lnbmVkIHNlcnZpY2UtdG9rZW4gYXV0aCBoZWFkZXIsIGFuZCB0aW1lb3V0K3JldHJ5IHZpYSB0aGUgc2hhcmVkXG4gKiB7QGxpbmsgSW50ZXJuYWxIdHRwQ2xpZW50fSDigJQgc28gY29tcGxpYW5jZSwgcmVwb3J0aW5nLCBhbmQgYW55IGZ1dHVyZSBjYWxsZXJcbiAqIHNoYXJlIE9ORSBtZWNoYW5pc20gaW5zdGVhZCBvZiBlYWNoIGhhbmQtcm9sbGluZyBhIGBmZXRjaGAvY2xpZW50IHdpdGggaXRzXG4gKiBvd24gYXV0aCBhbmQgZmFpbHVyZSBzZW1hbnRpY3MuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGRlbGliZXJhdGVseSBkbyBOT1Qgc3dhbGxvdyB0cmFuc3BvcnQgZXJyb3JzOiBhIGNvbm5lY3Rpb25cbiAqIGZhaWx1cmUvdGltZW91dCBwcm9wYWdhdGVzIHNvIGVhY2ggY2FsbGVyIGtlZXBzIGl0cyBvd24gZmFsbGJhY2sgcG9saWN5IChsb2dcbiAqIGxldmVsLCBkZWdyYWRlLXRvLXNlbGYgdnMuIHJldHVybi11bmRlZmluZWQpLiBBIG5vbi0yeHggcmVzcG9uc2UgaXMgdHJlYXRlZFxuICogYXMgXCJubyBkYXRhXCIgKHJldHVybnMgdW5kZWZpbmVkKSwgbWF0Y2hpbmcgd2hhdCB0aGUgY2FsbGVycyBwcmV2aW91c2x5IGRpZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRTZXJ2aWNlQXV0aEhlYWRlciwgU1lTVEVNX09SR19JRCB9IGZyb20gJy4uL21pZGRsZXdhcmUvYXV0aC5qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuXG4vKiogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIHBsYXRmb3JtIG9yZy1oaWVyYXJjaHkgSFRUUCBsb29rdXBzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyB7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIGhvc3QvcG9ydCAoKyBvcHRpb25hbCBkZWZhdWx0IHRpbWVvdXQpIGZvciB0aGUgY2xpZW50LiAqL1xuICBzZXJ2aWNlOiBTZXJ2aWNlQ29uZmlnO1xuICAvKiogU2VydmljZSBuYW1lIG1pbnRlZCBpbnRvIHRoZSBzZXJ2aWNlLWF1dGggSldUIGBzdWJgIChlLmcuICdjb21wbGlhbmNlJykuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcgaWQgZW1iZWRkZWQgaW4gdGhlIHNpZ25lZCBzZXJ2aWNlIHRva2VuJ3Mgb3JnIGNvbnRleHQuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBxdWVyaWVkIGBvcmdJZGA7IHBhc3MgYSBzeXN0ZW0gb3JnIGlkIGZvciBhIHN5c3RlbS1zY29wZWQgbG9va3VwLlxuICAgKi9cbiAgYXV0aE9yZ0lkPzogc3RyaW5nO1xuICAvKiogUm9sZSBjYXJyaWVkIGJ5IHRoZSBzZXJ2aWNlIHRva2VuIChkZWZhdWx0ICdtZW1iZXInIOKAlCBsZWFzdCBwcml2aWxlZ2UpLiAqL1xuICByb2xlPzogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIEV4dHJhIHJlcXVlc3QgaGVhZGVycyBtZXJnZWQgYWZ0ZXIgYEF1dGhvcml6YXRpb25gIChlLmcuIGB4LW9yZy1pZGApLiAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQgb3ZlcnJpZGUgaW4gbXMgKGZhbGxzIGJhY2sgdG8gdGhlIGNsaWVudCBkZWZhdWx0KS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYSBub24tMnh4IHJlc3BvbnNlIFRIUk9XUyBpbnN0ZWFkIG9mIHJlc29sdmluZyB0byBgdW5kZWZpbmVkYC5cbiAgICogRGVmYXVsdCBmYWxzZSAoYSA0eHgvNXh4IG1hcHMgdG8gYHVuZGVmaW5lZGAsIHRoZSBmYWlsLXNvZnQgcG9saWN5IHRoZVxuICAgKiBtZXNzYWdlL3JlcG9ydGluZyByb290LXJlc29sdXRpb24gY2FsbGVycyByZWx5IG9uKS4gQSBjYWxsZXIgZm9yIHdob20gYVxuICAgKiBmYWlsZWQgbG9va3VwIG11c3QgZmFpbC1DTE9TRUQg4oCUIGUuZy4gYSBjb21wbGlhbmNlIHNjYW4sIHdoZXJlIHRyZWF0aW5nIGFcbiAgICogdGVhbSBvcmcgYXMgcGFyZW50LWxlc3Mgd291bGQgc2lsZW50bHkgc2tpcCBpbmhlcml0ZWQgYmxvY2tpbmcgcnVsZXMg4oCUIHNldHNcbiAgICogdGhpcyBzbyBpdCBjYW4gZGlzdGluZ3Vpc2ggXCJyb290IG9yZ1wiIChgdW5kZWZpbmVkYCkgZnJvbSBcImxvb2t1cCBmYWlsZWRcIi5cbiAgICovXG4gIHRocm93T25IdHRwRXJyb3I/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlcXVlc3QoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHN1ZmZpeDogJ3BhcmVudCcgfCAnZGVzY2VuZGFudHMnLFxuICBvcHRzOiBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyxcbik6IHsgY2xpZW50OiBJbnRlcm5hbEh0dHBDbGllbnQ7IHBhdGg6IHN0cmluZzsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UpO1xuICBjb25zdCBwYXRoID0gYC9vcmdhbml6YXRpb24vJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS8ke3N1ZmZpeH1gO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IG9yZ0lkLFxuICAgICAgcm9sZTogb3B0cy5yb2xlID8/ICdtZW1iZXInLFxuICAgIH0pLFxuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgfTtcbiAgcmV0dXJuIHsgY2xpZW50LCBwYXRoLCBoZWFkZXJzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBvcmcncyBkaXJlY3QgcGFyZW50IGlkIHZpYSBwbGF0Zm9ybSdzXG4gKiBgR0VUIC9vcmdhbml6YXRpb24vOmlkL3BhcmVudGAuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGEgcm9vdCBvcmcuIEEgbm9uLTJ4eFxuICogcmVzcG9uc2UgcmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCwgb3IgVEhST1dTIHdoZW5cbiAqIGB0aHJvd09uSHR0cEVycm9yYCBpcyBzZXQuIEFsd2F5cyB0aHJvd3Mgb24gYSB0cmFuc3BvcnQgZmFpbHVyZVxuICogKGNvbm5lY3Rpb24vdGltZW91dCkgc28gdGhlIGNhbGxlciBjYW4gYXBwbHkgaXRzIG93biBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUGFyZW50T3JnSWQob3JnSWQ6IHN0cmluZywgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAncGFyZW50Jywgb3B0cyk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBkYXRhPzogeyBwYXJlbnRPcmdJZD86IHN0cmluZyB8IG51bGwgfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgIGlmIChvcHRzLnRocm93T25IdHRwRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyZW50LW9yZyBsb29rdXAgZmFpbGVkIGZvciAke29yZ0lkfTogSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXMuYm9keT8uZGF0YT8ucGFyZW50T3JnSWQgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYFtzZWxmLCAuLi5kZXNjZW5kYW50T3JnSWRzXWAgZm9yIGFuIG9yZyB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9kZXNjZW5kYW50c2AuIFJldHVybnMgdGhlIGlkIGxpc3Qgb25seSB3aGVuIGl0IGlzXG4gKiBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZiAoYSByZWFsIHN1YnRyZWUpLCBlbHNlIGB1bmRlZmluZWRgOyBhbHNvXG4gKiBgdW5kZWZpbmVkYCBvbiBhIG5vbi0yeHggcmVzcG9uc2UuIFRocm93cyBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIHNvIHRoZVxuICogY2FsbGVyIGNhbiBhcHBseSBpdHMgb3duIGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgYSB0cnVzdCBib3VuZGFyeTogdGhlIHJlc3BvbnNlIGlzIHZhbGlkYXRlZCBlbGVtZW50LWJ5LWVsZW1lbnQgcmF0aGVyXG4gKiB0aGFuIGNhc3Qg4oCUIGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBzdHJpbmcsIGFuZCBhbnkgbm9uLXN0cmluZyBpcyBkcm9wcGVkIOKAlCBzb1xuICogYSBtYWxmb3JtZWQgcGF5bG9hZCBjYW4gbmV2ZXIgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWRcbiAqIGBzdHJpbmdbXWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ0Rlc2NlbmRhbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAnZGVzY2VuZGFudHMnLCBvcHRzKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IG9yZ0lkcz86IHVua25vd24gfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaWRzID0gcmVzLmJvZHk/LmRhdGE/Lm9yZ0lkcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG9yZ0lkcyA9IGlkcy5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpO1xuICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgKHZhbGlkYXRlZCkgc3VidHJlZSBpcyBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZi5cbiAgcmV0dXJuIG9yZ0lkcy5sZW5ndGggPiAxID8gb3JnSWRzIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJhdGNoLXJlc29sdmUgb3JnIGlkIOKGkiBkaXNwbGF5IE5BTUUgdmlhIHBsYXRmb3JtJ3MgYFBPU1QgL29yZ2FuaXphdGlvbi9uYW1lc2AuXG4gKiBSZXR1cm5zIGEgbG93ZXJjYXNlZCBgeyBbb3JnSWRdOiBuYW1lIH1gIG1hcCDigJQgaWRzIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGtub3dcbiAqIGFyZSBzaW1wbHkgYWJzZW50IChjYWxsZXIgZmFsbHMgYmFjayB0byB0aGUgcmF3IGlkKS5cbiAqXG4gKiBCZXN0LWVmZm9ydCBieSBkZXNpZ246IGEgbm9uLTJ4eCByZXNwb25zZSAoZS5nLiB0aGUgY2FsbGVyIGlzbid0IGEgc2VydmljZVxuICogcHJpbmNpcGFsKSBvciBhIG1hbGZvcm1lZCBib2R5IHlpZWxkcyBge31gLCBhbmQgaXQgdGhyb3dzIE9OTFkgb24gYSB0cmFuc3BvcnRcbiAqIGZhaWx1cmUgKGNvbm5lY3Rpb24vdGltZW91dCkg4oCUIG1hdGNoaW5nIHRoZSBmYWlsLXNvZnQgcG9saWN5IG9mIHRoZSBvdGhlclxuICogbG9va3VwcyBoZXJlIHNvIGEgbmFtZS1lbnJpY2htZW50IHJlYWQgbmV2ZXIgZmFpbHMgdGhlIGNhbGxlcidzIHJlcXVlc3QuIFRoZVxuICogcmVzcG9uc2UgaXMgdmFsaWRhdGVkIGVudHJ5LWJ5LWVudHJ5IChvbmx5IHN0cmluZ+KGknN0cmluZyBwYWlycyBzdXJ2aXZlKSwgc28gYVxuICogbWFsZm9ybWVkIHBheWxvYWQgY2FuJ3Qgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWQgbWFwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hPcmdOYW1lcyhcbiAgb3JnSWRzOiBzdHJpbmdbXSxcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgaWYgKG9yZ0lkcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UpO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgLy8gQSBjcm9zcy1vcmcgcmVnaXN0cnkgcmVhZCwgbm90IGEgdGVuYW50LXNjb3BlZCBvcCDigJQgZGVmYXVsdCB0byB0aGUgc3lzdGVtXG4gICAgICAvLyBvcmcgY29udGV4dCB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBwaW4gb25lLlxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IFNZU1RFTV9PUkdfSUQsXG4gICAgICByb2xlOiBvcHRzLnJvbGUgPz8gJ21lbWJlcicsXG4gICAgfSksXG4gICAgLi4ub3B0cy5oZWFkZXJzLFxuICB9O1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQucG9zdDx7IGRhdGE/OiB7IG5hbWVzPzogdW5rbm93biB9IH0+KFxuICAgICcvb3JnYW5pemF0aW9uL25hbWVzJyxcbiAgICB7IG9yZ0lkcyB9LFxuICAgIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0sXG4gICk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA+PSA0MDApIHJldHVybiB7fTtcbiAgY29uc3QgbmFtZXMgPSByZXMuYm9keT8uZGF0YT8ubmFtZXM7XG4gIGlmICghbmFtZXMgfHwgdHlwZW9mIG5hbWVzICE9PSAnb2JqZWN0JykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbaWQsIG5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIG91dFtpZC50b0xvd2VyQ2FzZSgpXSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGB1c2VySWRgIGlzIGFuIEFDVElWRSBtZW1iZXIgb2YgYG9yZ0lkYCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9tZW1iZXJzLzp1c2VySWQvZXhpc3RzYC4gUmV0dXJucyB0aGUgYm9vbGVhbiB0aGVcbiAqIHBsYXRmb3JtIHJlcG9ydHMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCAo4oCUIFwiY291bGRuJ3QgZGV0ZXJtaW5lXCIpIG9uIGEgbm9uLTJ4eCByZXNwb25zZSwgYW5kXG4gKiB0aHJvd3Mgb25seSBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIChjb25uZWN0aW9uL3RpbWVvdXQpIOKAlCBzbyB0aGUgY2FsbGVyXG4gKiBkaXN0aW5ndWlzaGVzIGEgZGVmaW5pdGl2ZSBub3QtYS1tZW1iZXIgKGBmYWxzZWApIGZyb20gYW4gaW5kZXRlcm1pbmF0ZVxuICogbG9va3VwIChgdW5kZWZpbmVkYCkgYW5kIGFwcGxpZXMgaXRzIG93biBmYWlsLW9wZW4vY2xvc2VkIHBvbGljeS4gVGhlIGBwYXRoYFxuICogZGlmZmVycyBmcm9tIHRoZSBwYXJlbnQvZGVzY2VuZGFudHMgc2hhcGUsIHNvIHRoaXMgYnVpbGRzIGl0cyBvd24gcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoT3JnTWVtYmVyc2hpcChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zLFxuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQob3B0cy5zZXJ2aWNlKTtcbiAgY29uc3QgcGF0aCA9IGAvb3JnYW5pemF0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vbWVtYmVycy8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VySWQpfS9leGlzdHNgO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IG9yZ0lkLFxuICAgICAgcm9sZTogb3B0cy5yb2xlID8/ICdtZW1iZXInLFxuICAgIH0pLFxuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgfTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IGlzTWVtYmVyPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpc01lbWJlciA9IHJlcy5ib2R5Py5kYXRhPy5pc01lbWJlcjtcbiAgcmV0dXJuIHR5cGVvZiBpc01lbWJlciA9PT0gJ2Jvb2xlYW4nID8gaXNNZW1iZXIgOiB1bmRlZmluZWQ7XG59XG4iXX0=
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS1odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlcnMvb3JnLWhpZXJhcmNoeS1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdDL0Qsd0VBQXdFO0FBQ3hFLFNBQVMsZUFBZSxDQUN0QixJQUE2QixFQUM3QixTQUFpQjtJQUVqQixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkYsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQztZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLEVBQUU7WUFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUztZQUNsQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRO1NBQzVCLENBQUM7UUFDRixHQUFHLElBQUksQ0FBQyxPQUFPO0tBQ2hCLENBQUM7SUFDRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsS0FBYSxFQUNiLE1BQWdDLEVBQ2hDLElBQTZCO0lBRTdCLE9BQU8sRUFBRSxHQUFHLGVBQWUs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QUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHkgbG9va3VwcyBvdmVyIEhUVFAgYWdhaW5zdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBUaGUgTW9uZ29vc2UtYmFzZWQgdHJhdmVyc2FsIGluIHtAbGluayAuL29yZy1oaWVyYXJjaHl9IGlzIGZvciBzZXJ2aWNlcyB0aGF0XG4gKiBvd24gdGhlIG9yZyB0YWJsZSAocGxhdGZvcm0sIHF1b3RhKS4gRXZlcnlvbmUgZWxzZSByZWFkcyB0aGUgaGllcmFyY2h5IG92ZXJcbiAqIHRoZSB3aXJlIGZyb20gcGxhdGZvcm0ncyBhdXRob3JpdGF0aXZlIGAvb3JnYW5pemF0aW9uLzppZC8qYCBlbmRwb2ludHMuIFRoaXNcbiAqIG1vZHVsZSBjZW50cmFsaXplcyB0aGUgdHJhbnNwb3J0IGZvciB0aG9zZSByZWFkcyDigJQgVVJMIGNvbnN0cnVjdGlvbiwgdGhlXG4gKiBzaWduZWQgc2VydmljZS10b2tlbiBhdXRoIGhlYWRlciwgYW5kIHRpbWVvdXQrcmV0cnkgdmlhIHRoZSBzaGFyZWRcbiAqIHtAbGluayBJbnRlcm5hbEh0dHBDbGllbnR9IOKAlCBzbyBjb21wbGlhbmNlLCByZXBvcnRpbmcsIGFuZCBhbnkgZnV0dXJlIGNhbGxlclxuICogc2hhcmUgT05FIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGVhY2ggaGFuZC1yb2xsaW5nIGEgYGZldGNoYC9jbGllbnQgd2l0aCBpdHNcbiAqIG93biBhdXRoIGFuZCBmYWlsdXJlIHNlbWFudGljcy5cbiAqXG4gKiBUaGVzZSBmdW5jdGlvbnMgZGVsaWJlcmF0ZWx5IGRvIE5PVCBzd2FsbG93IHRyYW5zcG9ydCBlcnJvcnM6IGEgY29ubmVjdGlvblxuICogZmFpbHVyZS90aW1lb3V0IHByb3BhZ2F0ZXMgc28gZWFjaCBjYWxsZXIga2VlcHMgaXRzIG93biBmYWxsYmFjayBwb2xpY3kgKGxvZ1xuICogbGV2ZWwsIGRlZ3JhZGUtdG8tc2VsZiB2cy4gcmV0dXJuLXVuZGVmaW5lZCkuIEEgbm9uLTJ4eCByZXNwb25zZSBpcyB0cmVhdGVkXG4gKiBhcyBcIm5vIGRhdGFcIiAocmV0dXJucyB1bmRlZmluZWQpLlxuICovXG5cbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IEludGVybmFsSHR0cENsaWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IHNlcnZpY2VJZGVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbi8qKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgcGxhdGZvcm0gb3JnLWhpZXJhcmNoeSBIVFRQIGxvb2t1cHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdC9wb3J0ICgrIG9wdGlvbmFsIGRlZmF1bHQgdGltZW91dCkuIERlZmF1bHRzIHRvIHRoZVxuICAgKiAgcmVnaXN0cnkncyBwbGF0Zm9ybSBlbmRwb2ludC4gKi9cbiAgc2VydmljZT86IFNlcnZpY2VDb25maWc7XG4gIC8qKiBTZXJ2aWNlIG5hbWUgbWludGVkIGludG8gdGhlIHNlcnZpY2UtYXV0aCBKV1QgYHN1YmAuIERlZmF1bHRzIHRvIHRoaXNcbiAgICogIHByb2Nlc3MncyBvd24gaWRlbnRpdHkgKGBTRVJWSUNFX05BTUVgKS4gKi9cbiAgc2VydmljZU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcgaWQgZW1iZWRkZWQgaW4gdGhlIHNpZ25lZCBzZXJ2aWNlIHRva2VuJ3Mgb3JnIGNvbnRleHQuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBxdWVyaWVkIGBvcmdJZGA7IHBhc3MgYSBzeXN0ZW0gb3JnIGlkIGZvciBhIHN5c3RlbS1zY29wZWQgbG9va3VwLlxuICAgKi9cbiAgYXV0aE9yZ0lkPzogc3RyaW5nO1xuICAvKiogUm9sZSBjYXJyaWVkIGJ5IHRoZSBzZXJ2aWNlIHRva2VuIChkZWZhdWx0ICdtZW1iZXInIOKAlCBsZWFzdCBwcml2aWxlZ2UpLiAqL1xuICByb2xlPzogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIEV4dHJhIHJlcXVlc3QgaGVhZGVycyBtZXJnZWQgYWZ0ZXIgYEF1dGhvcml6YXRpb25gIChlLmcuIGB4LW9yZy1pZGApLiAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQgb3ZlcnJpZGUgaW4gbXMgKGZhbGxzIGJhY2sgdG8gdGhlIGNsaWVudCBkZWZhdWx0KS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYSBub24tMnh4IHJlc3BvbnNlIFRIUk9XUyBpbnN0ZWFkIG9mIHJlc29sdmluZyB0byBgdW5kZWZpbmVkYC5cbiAgICogRGVmYXVsdCBmYWxzZSAoYSA0eHgvNXh4IG1hcHMgdG8gYHVuZGVmaW5lZGAsIHRoZSBmYWlsLXNvZnQgcG9saWN5IHRoZVxuICAgKiBtZXNzYWdlL3JlcG9ydGluZyByb290LXJlc29sdXRpb24gY2FsbGVycyByZWx5IG9uKS4gQSBjYWxsZXIgZm9yIHdob20gYVxuICAgKiBmYWlsZWQgbG9va3VwIG11c3QgZmFpbC1DTE9TRUQg4oCUIGUuZy4gYSBjb21wbGlhbmNlIHNjYW4sIHdoZXJlIHRyZWF0aW5nIGFcbiAgICogdGVhbSBvcmcgYXMgcGFyZW50LWxlc3Mgd291bGQgc2lsZW50bHkgc2tpcCBpbmhlcml0ZWQgYmxvY2tpbmcgcnVsZXMg4oCUIHNldHNcbiAgICogdGhpcyBzbyBpdCBjYW4gZGlzdGluZ3Vpc2ggXCJyb290IG9yZ1wiIChgdW5kZWZpbmVkYCkgZnJvbSBcImxvb2t1cCBmYWlsZWRcIi5cbiAgICovXG4gIHRocm93T25IdHRwRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHBsYXRmb3JtIGNsaWVudCArIHNpZ25lZCBzZXJ2aWNlLWF1dGggaGVhZGVycyBmb3Igb25lIGxvb2t1cC4gKi9cbmZ1bmN0aW9uIHBsYXRmb3JtUmVxdWVzdChcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4gIGF1dGhPcmdJZDogc3RyaW5nLFxuKTogeyBjbGllbnQ6IEludGVybmFsSHR0cENsaWVudDsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpKTtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBBdXRob3JpemF0aW9uOiBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7XG4gICAgICBzZXJ2aWNlTmFtZTogb3B0cy5zZXJ2aWNlTmFtZSA/PyBzZXJ2aWNlSWRlbnRpdHkoKSxcbiAgICAgIG9yZ0lkOiBvcHRzLmF1dGhPcmdJZCA/PyBhdXRoT3JnSWQsXG4gICAgICByb2xlOiBvcHRzLnJvbGUgPz8gJ21lbWJlcicsXG4gICAgfSksXG4gICAgLi4ub3B0cy5oZWFkZXJzLFxuICB9O1xuICByZXR1cm4geyBjbGllbnQsIGhlYWRlcnMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZXF1ZXN0KFxuICBvcmdJZDogc3RyaW5nLFxuICBzdWZmaXg6ICdwYXJlbnQnIHwgJ2Rlc2NlbmRhbnRzJyxcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4pOiB7IGNsaWVudDogSW50ZXJuYWxIdHRwQ2xpZW50OyBwYXRoOiBzdHJpbmc7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gIHJldHVybiB7IC4uLnBsYXRmb3JtUmVxdWVzdChvcHRzLCBvcmdJZCksIHBhdGg6IGAvb3JnYW5pemF0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtzdWZmaXh9YCB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gb3JnJ3MgZGlyZWN0IHBhcmVudCBpZCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9wYXJlbnRgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHJvb3Qgb3JnLiBBIG5vbi0yeHhcbiAqIHJlc3BvbnNlIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQsIG9yIFRIUk9XUyB3aGVuXG4gKiBgdGhyb3dPbkh0dHBFcnJvcmAgaXMgc2V0LiBBbHdheXMgdGhyb3dzIG9uIGEgdHJhbnNwb3J0IGZhaWx1cmVcbiAqIChjb25uZWN0aW9uL3RpbWVvdXQpIHNvIHRoZSBjYWxsZXIgY2FuIGFwcGx5IGl0cyBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFBhcmVudE9yZ0lkKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAncGFyZW50Jywgb3B0cyk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBkYXRhPzogeyBwYXJlbnRPcmdJZD86IHN0cmluZyB8IG51bGwgfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgIGlmIChvcHRzLnRocm93T25IdHRwRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyZW50LW9yZyBsb29rdXAgZmFpbGVkIGZvciAke29yZ0lkfTogSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXMuYm9keT8uZGF0YT8ucGFyZW50T3JnSWQgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYFtzZWxmLCAuLi5kZXNjZW5kYW50T3JnSWRzXWAgZm9yIGFuIG9yZyB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9kZXNjZW5kYW50c2AuIFJldHVybnMgdGhlIGlkIGxpc3Qgb25seSB3aGVuIGl0IGlzXG4gKiBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZiAoYSByZWFsIHN1YnRyZWUpLCBlbHNlIGB1bmRlZmluZWRgOyBhbHNvXG4gKiBgdW5kZWZpbmVkYCBvbiBhIG5vbi0yeHggcmVzcG9uc2UuIFRocm93cyBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIHNvIHRoZVxuICogY2FsbGVyIGNhbiBhcHBseSBpdHMgb3duIGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgYSB0cnVzdCBib3VuZGFyeTogdGhlIHJlc3BvbnNlIGlzIHZhbGlkYXRlZCBlbGVtZW50LWJ5LWVsZW1lbnQgcmF0aGVyXG4gKiB0aGFuIGNhc3Qg4oCUIGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBzdHJpbmcsIGFuZCBhbnkgbm9uLXN0cmluZyBpcyBkcm9wcGVkIOKAlCBzb1xuICogYSBtYWxmb3JtZWQgcGF5bG9hZCBjYW4gbmV2ZXIgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWRcbiAqIGBzdHJpbmdbXWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ0Rlc2NlbmRhbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgY2xpZW50LCBwYXRoLCBoZWFkZXJzIH0gPSBidWlsZFJlcXVlc3Qob3JnSWQsICdkZXNjZW5kYW50cycsIG9wdHMpO1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuZ2V0PHsgZGF0YT86IHsgb3JnSWRzPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpZHMgPSByZXMuYm9keT8uZGF0YT8ub3JnSWRzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3JnSWRzID0gaWRzLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyk7XG4gIC8vIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSAodmFsaWRhdGVkKSBzdWJ0cmVlIGlzIGxhcmdlciB0aGFuIHRoZSBvcmcgaXRzZWxmLlxuICByZXR1cm4gb3JnSWRzLmxlbmd0aCA+IDEgPyBvcmdJZHMgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQmF0Y2gtcmVzb2x2ZSBvcmcgaWQg4oaSIGRpc3BsYXkgTkFNRSB2aWEgcGxhdGZvcm0ncyBgUE9TVCAvb3JnYW5pemF0aW9uL25hbWVzYC5cbiAqIFJldHVybnMgYSBsb3dlcmNhc2VkIGB7IFtvcmdJZF06IG5hbWUgfWAgbWFwIOKAlCBpZHMgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qga25vd1xuICogYXJlIHNpbXBseSBhYnNlbnQgKGNhbGxlciBmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQpLlxuICpcbiAqIEJlc3QtZWZmb3J0IGJ5IGRlc2lnbjogYSBub24tMnh4IHJlc3BvbnNlIChlLmcuIHRoZSBjYWxsZXIgaXNuJ3QgYSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwpIG9yIGEgbWFsZm9ybWVkIGJvZHkgeWllbGRzIGB7fWAsIGFuZCBpdCB0aHJvd3MgT05MWSBvbiBhIHRyYW5zcG9ydFxuICogZmFpbHVyZSAoY29ubmVjdGlvbi90aW1lb3V0KSDigJQgbWF0Y2hpbmcgdGhlIGZhaWwtc29mdCBwb2xpY3kgb2YgdGhlIG90aGVyXG4gKiBsb29rdXBzIGhlcmUgc28gYSBuYW1lLWVucmljaG1lbnQgcmVhZCBuZXZlciBmYWlscyB0aGUgY2FsbGVyJ3MgcmVxdWVzdC4gVGhlXG4gKiByZXNwb25zZSBpcyB2YWxpZGF0ZWQgZW50cnktYnktZW50cnkgKG9ubHkgc3RyaW5n4oaSc3RyaW5nIHBhaXJzIHN1cnZpdmUpLCBzbyBhXG4gKiBtYWxmb3JtZWQgcGF5bG9hZCBjYW4ndCBzbXVnZ2xlIGEgbm9uLXN0cmluZyBpbnRvIHRoZSByZXR1cm5lZCBtYXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ05hbWVzKFxuICBvcmdJZHM6IHN0cmluZ1tdLFxuICBvcHRzOiBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIC8vIEEgY3Jvc3Mtb3JnIHJlZ2lzdHJ5IHJlYWQsIG5vdCBhIHRlbmFudC1zY29wZWQgb3Ag4oCUIGRlZmF1bHQgdG8gdGhlIHN5c3RlbVxuICAvLyBvcmcgY29udGV4dCB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBwaW4gb25lLlxuICBjb25zdCB7IGNsaWVudCwgaGVhZGVycyB9ID0gcGxhdGZvcm1SZXF1ZXN0KG9wdHMsIFNZU1RFTV9PUkdfSUQpO1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQucG9zdDx7IGRhdGE/OiB7IG5hbWVzPzogdW5rbm93biB9IH0+KFxuICAgICcvb3JnYW5pemF0aW9uL25hbWVzJyxcbiAgICB7IG9yZ0lkcyB9LFxuICAgIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0sXG4gICk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA+PSA0MDApIHJldHVybiB7fTtcbiAgY29uc3QgbmFtZXMgPSByZXMuYm9keT8uZGF0YT8ubmFtZXM7XG4gIGlmICghbmFtZXMgfHwgdHlwZW9mIG5hbWVzICE9PSAnb2JqZWN0JykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbaWQsIG5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIG91dFtpZC50b0xvd2VyQ2FzZSgpXSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGB1c2VySWRgIGlzIGFuIEFDVElWRSBtZW1iZXIgb2YgYG9yZ0lkYCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9tZW1iZXJzLzp1c2VySWQvZXhpc3RzYC4gUmV0dXJucyB0aGUgYm9vbGVhbiB0aGVcbiAqIHBsYXRmb3JtIHJlcG9ydHMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCAo4oCUIFwiY291bGRuJ3QgZGV0ZXJtaW5lXCIpIG9uIGEgbm9uLTJ4eCByZXNwb25zZSwgYW5kXG4gKiB0aHJvd3Mgb25seSBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIChjb25uZWN0aW9uL3RpbWVvdXQpIOKAlCBzbyB0aGUgY2FsbGVyXG4gKiBkaXN0aW5ndWlzaGVzIGEgZGVmaW5pdGl2ZSBub3QtYS1tZW1iZXIgKGBmYWxzZWApIGZyb20gYW4gaW5kZXRlcm1pbmF0ZVxuICogbG9va3VwIChgdW5kZWZpbmVkYCkgYW5kIGFwcGxpZXMgaXRzIG93biBmYWlsLW9wZW4vY2xvc2VkIHBvbGljeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoT3JnTWVtYmVyc2hpcChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBjbGllbnQsIGhlYWRlcnMgfSA9IHBsYXRmb3JtUmVxdWVzdChvcHRzLCBvcmdJZCk7XG4gIGNvbnN0IHBhdGggPSBgL29yZ2FuaXphdGlvbi8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L21lbWJlcnMvJHtlbmNvZGVVUklDb21wb25lbnQodXNlcklkKX0vZXhpc3RzYDtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IGlzTWVtYmVyPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpc01lbWJlciA9IHJlcy5ib2R5Py5kYXRhPy5pc01lbWJlcjtcbiAgcmV0dXJuIHR5cGVvZiBpc01lbWJlciA9PT0gJ2Jvb2xlYW4nID8gaXNNZW1iZXIgOiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -13,9 +13,8 @@
13
13
  * - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
14
14
  * - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
15
15
  *
16
- * Every org is flat today (`parentOrgId` null on all rows), so lineage resolves
17
- * to `{ rootOrgId: self }` and scope to `[self]` — i.e. these are no-ops until
18
- * orgs get parents.
16
+ * A root org (`parentOrgId` null) resolves to `{ rootOrgId: self }` and scope
17
+ * `[self]`.
19
18
  */
20
19
  /** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
21
20
  export declare const MAX_ORG_DEPTH = 16;
@@ -44,6 +43,33 @@ export declare function toOrgIdString(v: unknown): string | undefined;
44
43
  * export const toOrgId = createOrgIdCaster(mongoose.Types.ObjectId);
45
44
  */
46
45
  export declare function createOrgIdCaster<T>(ObjectIdCtor: new (hex: string) => T): (id: string | string[]) => string | T;
46
+ /**
47
+ * The slice of a Mongoose `Organization` model the hierarchy callbacks read.
48
+ * Structural (api-core has no mongoose dependency); `select().lean()` chains as
49
+ * mongoose queries do.
50
+ */
51
+ export interface OrgHierarchyModel {
52
+ findById(id: any): {
53
+ select(fields: string): {
54
+ lean(): PromiseLike<unknown>;
55
+ };
56
+ };
57
+ find(filter: any): {
58
+ select(fields: string): {
59
+ lean(): PromiseLike<unknown[]>;
60
+ };
61
+ };
62
+ }
63
+ /**
64
+ * The parent/children lookups over a service's own `organizations` model, for
65
+ * the `*With` traversals below. `getChildOrgIds` returns LIVE children only (a
66
+ * soft-deleted team leaves every downward scope); `getParentOrgId` does not
67
+ * filter, so a deleted team still resolves through its parent.
68
+ */
69
+ export declare function createMongoOrgHierarchy(Model: OrgHierarchyModel, toOrgId: (id: string) => unknown): {
70
+ getParentOrgId: GetParentOrgId;
71
+ getChildOrgIds: GetChildOrgIds;
72
+ };
47
73
  export interface OrgLineage {
48
74
  /** The org's direct parent id, or `undefined` when it's a root org. */
49
75
  parentOrgId?: string;
@@ -59,6 +85,14 @@ export interface OrgLineage {
59
85
  export declare function resolveOrgLineageWith(orgId: string, getParent: GetParentOrgId): Promise<OrgLineage>;
60
86
  /** Walk `parentOrgId` up to the root and return just the root id. */
61
87
  export declare function resolveRootOrgIdWith(orgId: string, getParent: GetParentOrgId): Promise<string>;
88
+ /**
89
+ * Fail-CLOSED variant of {@link resolveRootOrgIdWith}: returns `null` when the
90
+ * root can't be proven — a cycle or a chain deeper than {@link MAX_ORG_DEPTH} —
91
+ * instead of treating the last reached id as the root. Lookup errors propagate.
92
+ * For callers where a wrong root is worse than no answer (e.g. a retention purge
93
+ * that would otherwise apply a team's shorter default window).
94
+ */
95
+ export declare function resolveRootOrgIdStrict(orgId: string, getParent: GetParentOrgId): Promise<string | null>;
62
96
  /**
63
97
  * True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
64
98
  * `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.