@pipeline-builder/api-core 3.4.126 → 4.0.2

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 (54) hide show
  1. package/README.md +2 -2
  2. package/lib/constants/ai-providers.d.ts +18 -0
  3. package/lib/constants/ai-providers.js +51 -1
  4. package/lib/helpers/access-helpers.d.ts +52 -11
  5. package/lib/helpers/access-helpers.js +63 -18
  6. package/lib/helpers/restore-helpers.d.ts +8 -5
  7. package/lib/helpers/restore-helpers.js +12 -10
  8. package/lib/index.d.ts +1 -1
  9. package/lib/index.js +2 -2
  10. package/lib/middleware/auth.d.ts +11 -13
  11. package/lib/middleware/auth.js +61 -21
  12. package/lib/openapi/routes/ask-routes.d.ts +7 -0
  13. package/lib/openapi/routes/ask-routes.js +62 -0
  14. package/lib/openapi/routes/image-registry-routes.d.ts +7 -0
  15. package/lib/openapi/routes/image-registry-routes.js +98 -0
  16. package/lib/openapi/routes/index.js +8 -1
  17. package/lib/openapi/routes/pipeline-routes.js +10 -1
  18. package/lib/openapi/routes/pipeline-template-routes.js +8 -6
  19. package/lib/openapi/schema-registry.js +4 -4
  20. package/lib/services/circuit-breaker.d.ts +45 -0
  21. package/lib/services/circuit-breaker.js +138 -0
  22. package/lib/services/durable-event-bus.d.ts +96 -0
  23. package/lib/services/durable-event-bus.js +204 -0
  24. package/lib/services/http-client.js +42 -2
  25. package/lib/services/index.d.ts +2 -0
  26. package/lib/services/index.js +3 -1
  27. package/lib/services/quota.js +8 -1
  28. package/lib/services/remote-audit-client.d.ts +1 -1
  29. package/lib/services/remote-audit-client.js +7 -1
  30. package/lib/services/sse-ticket-store.d.ts +7 -0
  31. package/lib/services/sse-ticket-store.js +10 -5
  32. package/lib/services/token-revocation.js +10 -1
  33. package/lib/types/index.d.ts +1 -0
  34. package/lib/types/index.js +2 -1
  35. package/lib/types/permissions.d.ts +1 -1
  36. package/lib/types/permissions.js +6 -3
  37. package/lib/types/pipeline.d.ts +0 -11
  38. package/lib/types/pipeline.js +1 -11
  39. package/lib/types/visibility.d.ts +20 -0
  40. package/lib/types/visibility.js +22 -0
  41. package/lib/utils/audit.js +1 -1
  42. package/lib/utils/response.js +6 -3
  43. package/lib/validation/ai-schemas.d.ts +2 -1
  44. package/lib/validation/ai-schemas.js +3 -3
  45. package/lib/validation/common-schemas.d.ts +8 -6
  46. package/lib/validation/common-schemas.js +8 -7
  47. package/lib/validation/message-schemas.d.ts +2 -1
  48. package/lib/validation/pipeline-schemas.d.ts +6 -3
  49. package/lib/validation/pipeline-schemas.js +4 -4
  50. package/lib/validation/pipeline-template-schemas.d.ts +9 -6
  51. package/lib/validation/pipeline-template-schemas.js +5 -4
  52. package/lib/validation/plugin-schemas.d.ts +8 -4
  53. package/lib/validation/plugin-schemas.js +5 -5
  54. package/package.json +2 -2
@@ -0,0 +1,98 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { registry } from '../registry.js';
4
+ const tags = ['Image Registry'];
5
+ const auth = [{ bearerAuth: [] }];
6
+ /**
7
+ * OpenAPI definitions for the image-registry service (api/image-registry): the
8
+ * Docker-registry token endpoint (`/token`), the org-scoped image API
9
+ * (`/api/images`), and the admin API (`/api/admin`). Image read/write is gated by
10
+ * the `registry:read` / `registry:write` permissions.
11
+ */
12
+ export function registerImageRegistryRoutes() {
13
+ registry.registerPath({
14
+ method: 'get',
15
+ path: '/token',
16
+ summary: 'Mint a Docker registry token',
17
+ description: 'OAuth2-style token endpoint for `docker`/`crane`/`buildctl` clients. Verifies Basic-auth creds (a platform JWT or user login) and issues a scoped bearer token for pull/push.',
18
+ tags,
19
+ responses: { 200: { description: 'Registry access token' }, 401: { description: 'Invalid credentials' } },
20
+ });
21
+ registry.registerPath({
22
+ method: 'get',
23
+ path: '/api/images',
24
+ summary: 'List images',
25
+ description: "List the organization's container images in the registry.",
26
+ tags,
27
+ security: auth,
28
+ responses: { 200: { description: 'Image list' }, 403: { description: 'registry:read required' } },
29
+ });
30
+ registry.registerPath({
31
+ method: 'get',
32
+ path: '/api/images/{name}/tags',
33
+ summary: 'List image tags',
34
+ tags,
35
+ security: auth,
36
+ responses: { 200: { description: 'Tag list' }, 404: { description: 'Image not found' } },
37
+ });
38
+ registry.registerPath({
39
+ method: 'get',
40
+ path: '/api/images/{name}/manifests/{reference}',
41
+ summary: 'Get an image manifest',
42
+ tags,
43
+ security: auth,
44
+ responses: { 200: { description: 'OCI manifest / index' }, 404: { description: 'Manifest not found' } },
45
+ });
46
+ registry.registerPath({
47
+ method: 'get',
48
+ path: '/api/images/{name}/blobs/{digest}',
49
+ summary: 'Get an image blob',
50
+ tags,
51
+ security: auth,
52
+ responses: { 200: { description: 'Blob content' }, 404: { description: 'Blob not found' } },
53
+ });
54
+ registry.registerPath({
55
+ method: 'post',
56
+ path: '/api/images/copy',
57
+ summary: 'Copy an image',
58
+ description: 'Server-side copy of an image between repositories. Requires both registry:read and registry:write.',
59
+ tags,
60
+ security: auth,
61
+ responses: { 200: { description: 'Image copied' }, 403: { description: 'registry:read + registry:write required' } },
62
+ });
63
+ registry.registerPath({
64
+ method: 'delete',
65
+ path: '/api/images/{name}',
66
+ summary: 'Delete an image repository',
67
+ tags,
68
+ security: auth,
69
+ responses: { 200: { description: 'Repository deleted' }, 403: { description: 'registry:write required' } },
70
+ });
71
+ registry.registerPath({
72
+ method: 'delete',
73
+ path: '/api/images/{name}/manifests/{reference}',
74
+ summary: 'Delete an image manifest/tag',
75
+ tags,
76
+ security: auth,
77
+ responses: { 200: { description: 'Manifest deleted' }, 403: { description: 'registry:write required' } },
78
+ });
79
+ registry.registerPath({
80
+ method: 'get',
81
+ path: '/api/admin/storage/{prefix}',
82
+ summary: 'Registry storage rollup',
83
+ description: 'Storage usage rollup under a prefix (registry:read).',
84
+ tags,
85
+ security: auth,
86
+ responses: { 200: { description: 'Storage usage' }, 403: { description: 'registry:read required' } },
87
+ });
88
+ registry.registerPath({
89
+ method: 'post',
90
+ path: '/api/admin/gc',
91
+ summary: 'Run registry garbage collection',
92
+ description: 'Trigger blob/manifest garbage collection (registry:write).',
93
+ tags,
94
+ security: auth,
95
+ responses: { 202: { description: 'GC started' }, 403: { description: 'registry:write required' } },
96
+ });
97
+ }
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcmVnaXN0cnktcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZW5hcGkvcm91dGVzL2ltYWdlLXJlZ2lzdHJ5LXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQjtJQUN6QyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsOEJBQThCO1FBQ3ZDLFdBQVcsRUFBRSwrS0FBK0s7UUFDNUwsSUFBSTtRQUNKLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO0tBQzFHLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPLEVBQUUsYUFBYTtRQUN0QixXQUFXLEVBQUUsMkRBQTJEO1FBQ3hFLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUUsRUFBRTtLQUNsRyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0s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LDREQUE0RDtRQUN6RSxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLEVBQUU7S0FDbkcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5LmpzJztcblxuY29uc3QgdGFncyA9IFsnSW1hZ2UgUmVnaXN0cnknXTtcbmNvbnN0IGF1dGggPSBbeyBiZWFyZXJBdXRoOiBbXSB9XTtcblxuLyoqXG4gKiBPcGVuQVBJIGRlZmluaXRpb25zIGZvciB0aGUgaW1hZ2UtcmVnaXN0cnkgc2VydmljZSAoYXBpL2ltYWdlLXJlZ2lzdHJ5KTogdGhlXG4gKiBEb2NrZXItcmVnaXN0cnkgdG9rZW4gZW5kcG9pbnQgKGAvdG9rZW5gKSwgdGhlIG9yZy1zY29wZWQgaW1hZ2UgQVBJXG4gKiAoYC9hcGkvaW1hZ2VzYCksIGFuZCB0aGUgYWRtaW4gQVBJIChgL2FwaS9hZG1pbmApLiBJbWFnZSByZWFkL3dyaXRlIGlzIGdhdGVkIGJ5XG4gKiB0aGUgYHJlZ2lzdHJ5OnJlYWRgIC8gYHJlZ2lzdHJ5OndyaXRlYCBwZXJtaXNzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW1hZ2VSZWdpc3RyeVJvdXRlcygpOiB2b2lkIHtcbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvdG9rZW4nLFxuICAgIHN1bW1hcnk6ICdNaW50IGEgRG9ja2VyIHJlZ2lzdHJ5IHRva2VuJyxcbiAgICBkZXNjcmlwdGlvbjogJ09BdXRoMi1zdHlsZSB0b2tlbiBlbmRwb2ludCBmb3IgYGRvY2tlcmAvYGNyYW5lYC9gYnVpbGRjdGxgIGNsaWVudHMuIFZlcmlmaWVzIEJhc2ljLWF1dGggY3JlZHMgKGEgcGxhdGZvcm0gSldUIG9yIHVzZXIgbG9naW4pIGFuZCBpc3N1ZXMgYSBzY29wZWQgYmVhcmVyIHRva2VuIGZvciBwdWxsL3B1c2guJyxcbiAgICB0YWdzLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdSZWdpc3RyeSBhY2Nlc3MgdG9rZW4nIH0sIDQwMTogeyBkZXNjcmlwdGlvbjogJ0ludmFsaWQgY3JlZGVudGlhbHMnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvYXBpL2ltYWdlcycsXG4gICAgc3VtbWFyeTogJ0xpc3QgaW1hZ2VzJyxcbiAgICBkZXNjcmlwdGlvbjogXCJMaXN0IHRoZSBvcmdhbml6YXRpb24ncyBjb250YWluZXIgaW1hZ2VzIGluIHRoZSByZWdpc3RyeS5cIixcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdJbWFnZSBsaXN0JyB9LCA0MDM6IHsgZGVzY3JpcHRpb246ICdyZWdpc3RyeTpyZWFkIHJlcXVpcmVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL2FwaS9pbWFnZXMve25hbWV9L3RhZ3MnLFxuICAgIHN1bW1hcnk6ICdMaXN0IGltYWdlIHRhZ3MnLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1RhZyBsaXN0JyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdJbWFnZSBub3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvYXBpL2ltYWdlcy97bmFtZX0vbWFuaWZlc3RzL3tyZWZlcmVuY2V9JyxcbiAgICBzdW1tYXJ5OiAnR2V0IGFuIGltYWdlIG1hbmlmZXN0JyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdPQ0kgbWFuaWZlc3QgLyBpbmRleCcgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnTWFuaWZlc3Qgbm90IGZvdW5kJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL2FwaS9pbWFnZXMve25hbWV9L2Jsb2JzL3tkaWdlc3R9JyxcbiAgICBzdW1tYXJ5OiAnR2V0IGFuIGltYWdlIGJsb2InLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0Jsb2IgY29udGVudCcgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnQmxvYiBub3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBwYXRoOiAnL2FwaS9pbWFnZXMvY29weScsXG4gICAgc3VtbWFyeTogJ0NvcHkgYW4gaW1hZ2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2VydmVyLXNpZGUgY29weSBvZiBhbiBpbWFnZSBiZXR3ZWVuIHJlcG9zaXRvcmllcy4gUmVxdWlyZXMgYm90aCByZWdpc3RyeTpyZWFkIGFuZCByZWdpc3RyeTp3cml0ZS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0ltYWdlIGNvcGllZCcgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAncmVnaXN0cnk6cmVhZCArIHJlZ2lzdHJ5OndyaXRlIHJlcXVpcmVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAgICBwYXRoOiAnL2FwaS9pbWFnZXMve25hbWV9JyxcbiAgICBzdW1tYXJ5OiAnRGVsZXRlIGFuIGltYWdlIHJlcG9zaXRvcnknLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1JlcG9zaXRvcnkgZGVsZXRlZCcgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAncmVnaXN0cnk6d3JpdGUgcmVxdWlyZWQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgIHBhdGg6ICcvYXBpL2ltYWdlcy97bmFtZX0vbWFuaWZlc3RzL3tyZWZlcmVuY2V9JyxcbiAgICBzdW1tYXJ5OiAnRGVsZXRlIGFuIGltYWdlIG1hbmlmZXN0L3RhZycsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnTWFuaWZlc3QgZGVsZXRlZCcgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAncmVnaXN0cnk6d3JpdGUgcmVxdWlyZWQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvYXBpL2FkbWluL3N0b3JhZ2Uve3ByZWZpeH0nLFxuICAgIHN1bW1hcnk6ICdSZWdpc3RyeSBzdG9yYWdlIHJvbGx1cCcsXG4gICAgZGVzY3JpcHRpb246ICdTdG9yYWdlIHVzYWdlIHJvbGx1cCB1bmRlciBhIHByZWZpeCAocmVnaXN0cnk6cmVhZCkuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdTdG9yYWdlIHVzYWdlJyB9LCA0MDM6IHsgZGVzY3JpcHRpb246ICdyZWdpc3RyeTpyZWFkIHJlcXVpcmVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncG9zdCcsXG4gICAgcGF0aDogJy9hcGkvYWRtaW4vZ2MnLFxuICAgIHN1bW1hcnk6ICdSdW4gcmVnaXN0cnkgZ2FyYmFnZSBjb2xsZWN0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RyaWdnZXIgYmxvYi9tYW5pZmVzdCBnYXJiYWdlIGNvbGxlY3Rpb24gKHJlZ2lzdHJ5OndyaXRlKS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMjogeyBkZXNjcmlwdGlvbjogJ0dDIHN0YXJ0ZWQnIH0sIDQwMzogeyBkZXNjcmlwdGlvbjogJ3JlZ2lzdHJ5OndyaXRlIHJlcXVpcmVkJyB9IH0sXG4gIH0pO1xufVxuIl19
@@ -1,6 +1,8 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { registerAskRoutes } from './ask-routes.js';
3
4
  import { registerBillingRoutes } from './billing-routes.js';
5
+ import { registerImageRegistryRoutes } from './image-registry-routes.js';
4
6
  import { registerMessageRoutes } from './message-routes.js';
5
7
  import { registerPipelineRoutes } from './pipeline-routes.js';
6
8
  import { registerPipelineTemplateRoutes } from './pipeline-template-routes.js';
@@ -11,11 +13,16 @@ import { registerQuotaRoutes } from './quota-routes.js';
11
13
  * Call this once during spec generation initialization.
12
14
  */
13
15
  export function registerAllRoutes() {
16
+ registerAskRoutes();
14
17
  registerBillingRoutes();
18
+ registerImageRegistryRoutes();
15
19
  registerMessageRoutes();
16
20
  registerPipelineRoutes();
17
21
  registerPipelineTemplateRoutes();
18
22
  registerPluginRoutes();
19
23
  registerQuotaRoutes();
24
+ // NOTE: compliance + reporting (large multi-router surfaces) and platform/auth
25
+ // are not yet registered — follow-on, and intentionally omitted rather than
26
+ // shipping inaccurate paths.
20
27
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlbmFwaS9yb3V0ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4RDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLHFCQUFxQixFQUFFLENBQUM7SUFDeEIscUJBQXFCLEVBQUUsQ0FBQztJQUN4QixzQkFBc0IsRUFBRSxDQUFDO0lBQ3pCLDhCQUE4QixFQUFFLENBQUM7SUFDakMsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixtQkFBbUIsRUFBRSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVnaXN0ZXJCaWxsaW5nUm91dGVzIH0gZnJvbSAnLi9iaWxsaW5nLXJvdXRlcy5qcyc7XG5pbXBvcnQgeyByZWdpc3Rlck1lc3NhZ2VSb3V0ZXMgfSBmcm9tICcuL21lc3NhZ2Utcm91dGVzLmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyUGlwZWxpbmVSb3V0ZXMgfSBmcm9tICcuL3BpcGVsaW5lLXJvdXRlcy5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclBpcGVsaW5lVGVtcGxhdGVSb3V0ZXMgfSBmcm9tICcuL3BpcGVsaW5lLXRlbXBsYXRlLXJvdXRlcy5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclBsdWdpblJvdXRlcyB9IGZyb20gJy4vcGx1Z2luLXJvdXRlcy5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclF1b3RhUm91dGVzIH0gZnJvbSAnLi9xdW90YS1yb3V0ZXMuanMnO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGFsbCBPcGVuQVBJIHJvdXRlIGRlZmluaXRpb25zIHdpdGggdGhlIHNoYXJlZCByZWdpc3RyeS5cbiAqIENhbGwgdGhpcyBvbmNlIGR1cmluZyBzcGVjIGdlbmVyYXRpb24gaW5pdGlhbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFJvdXRlcygpOiB2b2lkIHtcbiAgcmVnaXN0ZXJCaWxsaW5nUm91dGVzKCk7XG4gIHJlZ2lzdGVyTWVzc2FnZVJvdXRlcygpO1xuICByZWdpc3RlclBpcGVsaW5lUm91dGVzKCk7XG4gIHJlZ2lzdGVyUGlwZWxpbmVUZW1wbGF0ZVJvdXRlcygpO1xuICByZWdpc3RlclBsdWdpblJvdXRlcygpO1xuICByZWdpc3RlclF1b3RhUm91dGVzKCk7XG59XG4iXX0=
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3BlbmFwaS9yb3V0ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4RDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLGlCQUFpQixFQUFFLENBQUM7SUFDcEIscUJBQXFCLEVBQUUsQ0FBQztJQUN4QiwyQkFBMkIsRUFBRSxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsQ0FBQztJQUN6Qiw4QkFBOEIsRUFBRSxDQUFDO0lBQ2pDLG9CQUFvQixFQUFFLENBQUM7SUFDdkIsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QiwrRUFBK0U7SUFDL0UsNEVBQTRFO0lBQzVFLDZCQUE2QjtBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJlZ2lzdGVyQXNrUm91dGVzIH0gZnJvbSAnLi9hc2stcm91dGVzLmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyQmlsbGluZ1JvdXRlcyB9IGZyb20gJy4vYmlsbGluZy1yb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJJbWFnZVJlZ2lzdHJ5Um91dGVzIH0gZnJvbSAnLi9pbWFnZS1yZWdpc3RyeS1yb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJNZXNzYWdlUm91dGVzIH0gZnJvbSAnLi9tZXNzYWdlLXJvdXRlcy5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclBpcGVsaW5lUm91dGVzIH0gZnJvbSAnLi9waXBlbGluZS1yb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQaXBlbGluZVRlbXBsYXRlUm91dGVzIH0gZnJvbSAnLi9waXBlbGluZS10ZW1wbGF0ZS1yb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQbHVnaW5Sb3V0ZXMgfSBmcm9tICcuL3BsdWdpbi1yb3V0ZXMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJRdW90YVJvdXRlcyB9IGZyb20gJy4vcXVvdGEtcm91dGVzLmpzJztcblxuLyoqXG4gKiBSZWdpc3RlciBhbGwgT3BlbkFQSSByb3V0ZSBkZWZpbml0aW9ucyB3aXRoIHRoZSBzaGFyZWQgcmVnaXN0cnkuXG4gKiBDYWxsIHRoaXMgb25jZSBkdXJpbmcgc3BlYyBnZW5lcmF0aW9uIGluaXRpYWxpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxSb3V0ZXMoKTogdm9pZCB7XG4gIHJlZ2lzdGVyQXNrUm91dGVzKCk7XG4gIHJlZ2lzdGVyQmlsbGluZ1JvdXRlcygpO1xuICByZWdpc3RlckltYWdlUmVnaXN0cnlSb3V0ZXMoKTtcbiAgcmVnaXN0ZXJNZXNzYWdlUm91dGVzKCk7XG4gIHJlZ2lzdGVyUGlwZWxpbmVSb3V0ZXMoKTtcbiAgcmVnaXN0ZXJQaXBlbGluZVRlbXBsYXRlUm91dGVzKCk7XG4gIHJlZ2lzdGVyUGx1Z2luUm91dGVzKCk7XG4gIHJlZ2lzdGVyUXVvdGFSb3V0ZXMoKTtcbiAgLy8gTk9URTogY29tcGxpYW5jZSArIHJlcG9ydGluZyAobGFyZ2UgbXVsdGktcm91dGVyIHN1cmZhY2VzKSBhbmQgcGxhdGZvcm0vYXV0aFxuICAvLyBhcmUgbm90IHlldCByZWdpc3RlcmVkIOKAlCBmb2xsb3ctb24sIGFuZCBpbnRlbnRpb25hbGx5IG9taXR0ZWQgcmF0aGVyIHRoYW5cbiAgLy8gc2hpcHBpbmcgaW5hY2N1cmF0ZSBwYXRocy5cbn1cbiJdfQ==
@@ -39,6 +39,15 @@ export function registerPipelineRoutes() {
39
39
  security: auth,
40
40
  responses: { 200: { description: 'Scorecard' }, 403: { description: 'Feature not enabled' }, 404: { description: 'Not found' } },
41
41
  });
42
+ registry.registerPath({
43
+ method: 'get',
44
+ path: '/pipelines/scorecard',
45
+ summary: 'Org-wide scorecard roll-up (software-health leaderboard)',
46
+ description: 'Grades every pipeline in the organization and returns a ranked leaderboard plus aggregate stats (pipeline count, average score, grade distribution). Bounded per request. Requires the `advanced_reporting` feature.',
47
+ tags,
48
+ security: auth,
49
+ responses: { 200: { description: 'Org-wide scorecard roll-up' }, 403: { description: 'Feature not enabled' } },
50
+ });
42
51
  registry.registerPath({
43
52
  method: 'post',
44
53
  path: '/pipelines',
@@ -93,4 +102,4 @@ export function registerPipelineRoutes() {
93
102
  responses: { 200: { description: 'SSE event stream of partial pipeline objects' }, 400: { description: 'Validation error' } },
94
103
  });
95
104
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZW5hcGkvcm91dGVzL3BpcGVsaW5lLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsQyxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLFdBQVcsRUFBRSx5REFBeUQ7UUFDdEUsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxFQUFFO0tBQ3pHLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLG9EQUFvRDtRQUNqRSxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7S0FDekYsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUs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QUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLE9BQU8sRUFBRSxtQ0FBbUM7UUFDNUMsV0FBVyxFQUFFLDhHQUE4RztRQUMzSCxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsOENBQThDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtLQUM5SCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJlZ2lzdHJ5IH0gZnJvbSAnLi4vcmVnaXN0cnkuanMnO1xuXG5jb25zdCB0YWdzID0gWydQaXBlbGluZXMnXTtcbmNvbnN0IGF1dGggPSBbeyBiZWFyZXJBdXRoOiBbXSB9XTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGlwZWxpbmVSb3V0ZXMoKTogdm9pZCB7XG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcycsXG4gICAgc3VtbWFyeTogJ0xpc3QgcGlwZWxpbmVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xpc3QgcGlwZWxpbmVzIHdpdGggcGFnaW5hdGlvbiwgZmlsdGVyaW5nLCBhbmQgc29ydGluZy4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BhZ2luYXRlZCBsaXN0IG9mIHBpcGVsaW5lcycgfSwgNDAxOiB7IGRlc2NyaXB0aW9uOiAnVW5hdXRob3JpemVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy9maW5kJyxcbiAgICBzdW1tYXJ5OiAnRmluZCBhIHNpbmdsZSBwaXBlbGluZScsXG4gICAgZGVzY3JpcHRpb246ICdGaW5kIGEgc2luZ2xlIHBpcGVsaW5lIG1hdGNoaW5nIHRoZSBxdWVyeSBmaWx0ZXJzLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnUGlwZWxpbmUgZm91bmQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0dldCBwaXBlbGluZSBieSBJRCcsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnUGlwZWxpbmUgZGV0YWlscycgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnTm90IGZvdW5kJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy97aWR9L3Njb3JlY2FyZCcsXG4gICAgc3VtbWFyeTogJ0dldCBhIHBpcGVsaW5lIG1hdHVyaXR5IHNjb3JlY2FyZCcsXG4gICAgZGVzY3JpcHRpb246ICdQZXItcGlwZWxpbmUgbWF0dXJpdHkgc2NvcmVjYXJkIGJsZW5kaW5nIGNvbXBsaWFuY2UgcG9zdHVyZSB3aXRoIERPUkEgcGVyZm9ybWFuY2UgYmFuZHMgaW50byBhIDDigJMxMDAgc2NvcmUgYW5kIGxldHRlciBncmFkZS4gUmVxdWlyZXMgdGhlIGBhZHZhbmNlZF9yZXBvcnRpbmdgIGZlYXR1cmUuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdTY29yZWNhcmQnIH0sIDQwMzogeyBkZXNjcmlwdGlvbjogJ0ZlYXR1cmUgbm90IGVuYWJsZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzJyxcbiAgICBzdW1tYXJ5OiAnQ3JlYXRlIGEgcGlwZWxpbmUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24uIENoZWNrcyBwaXBlbGluZSBxdW90YS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMTogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGNyZWF0ZWQnIH0sIDQwMDogeyBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRpb24gZXJyb3InIH0sIDQyOTogeyBkZXNjcmlwdGlvbjogJ1F1b3RhIGV4Y2VlZGVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncHV0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy97aWR9JyxcbiAgICBzdW1tYXJ5OiAnVXBkYXRlIGEgcGlwZWxpbmUnLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIHVwZGF0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgcGF0aDogJy9waXBlbGluZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0RlbGV0ZSBhIHBpcGVsaW5lJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NvZnQtZGVsZXRlIGEgcGlwZWxpbmUgYnkgc2V0dGluZyBpc0FjdGl2ZSB0byBmYWxzZS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGRlbGV0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMvcHJvdmlkZXJzJyxcbiAgICBzdW1tYXJ5OiAnTGlzdCBBSSBwcm92aWRlcnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBBSSBwcm92aWRlcnMgY29uZmlndXJlZCBmb3IgcGlwZWxpbmUgZ2VuZXJhdGlvbi4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0xpc3Qgb2YgYXZhaWxhYmxlIEFJIHByb3ZpZGVycyB3aXRoIG1vZGVscycgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzL2dlbmVyYXRlJyxcbiAgICBzdW1tYXJ5OiAnR2VuZXJhdGUgcGlwZWxpbmUgdmlhIEFJJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dlbmVyYXRlIGEgQnVpbGRlclByb3BzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG5hdHVyYWwgbGFuZ3VhZ2UgcHJvbXB0LiBSZXR1cm5zIHRoZSBjb21wbGV0ZSByZXN1bHQgd2hlbiBkb25lLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnR2VuZXJhdGVkIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24nIH0sIDQwMDogeyBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRpb24gZXJyb3InIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy9nZW5lcmF0ZS9zdHJlYW0nLFxuICAgIHN1bW1hcnk6ICdTdHJlYW0gcGlwZWxpbmUgZ2VuZXJhdGlvbiB2aWEgQUknLFxuICAgIGRlc2NyaXB0aW9uOiAnR2VuZXJhdGUgYSBCdWlsZGVyUHJvcHMgY29uZmlndXJhdGlvbiBmcm9tIGEgbmF0dXJhbCBsYW5ndWFnZSBwcm9tcHQuIFN0cmVhbXMgcGFydGlhbCByZXN1bHRzIGFzIFNTRSBldmVudHMuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdTU0UgZXZlbnQgc3RyZWFtIG9mIHBhcnRpYWwgcGlwZWxpbmUgb2JqZWN0cycgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSB9LFxuICB9KTtcbn1cbiJdfQ==
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZW5hcGkvcm91dGVzL3BpcGVsaW5lLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsQyxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLFdBQVcsRUFBRSx5REFBeUQ7UUFDdEUsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxFQUFFO0tBQ3pHLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLG9EQUFvRDtRQUNqRSxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7S0FDekYsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUs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QUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLE9BQU8sRUFBRSwwQkFBMEI7UUFDbkMsV0FBVyxFQUFFLDhHQUE4RztRQUMzSCxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0NBQWtDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtLQUNsSCxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLDRCQUE0QjtRQUNsQyxPQUFPLEVBQUUsbUNBQW1DO1FBQzVDLFdBQVcsRUFBRSw4R0FBOEc7UUFDM0gsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDhDQUE4QyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEVBQUU7S0FDOUgsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5LmpzJztcblxuY29uc3QgdGFncyA9IFsnUGlwZWxpbmVzJ107XG5jb25zdCBhdXRoID0gW3sgYmVhcmVyQXV0aDogW10gfV07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBpcGVsaW5lUm91dGVzKCk6IHZvaWQge1xuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMnLFxuICAgIHN1bW1hcnk6ICdMaXN0IHBpcGVsaW5lcycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IHBpcGVsaW5lcyB3aXRoIHBhZ2luYXRpb24sIGZpbHRlcmluZywgYW5kIHNvcnRpbmcuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdQYWdpbmF0ZWQgbGlzdCBvZiBwaXBlbGluZXMnIH0sIDQwMTogeyBkZXNjcmlwdGlvbjogJ1VuYXV0aG9yaXplZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMvZmluZCcsXG4gICAgc3VtbWFyeTogJ0ZpbmQgYSBzaW5nbGUgcGlwZWxpbmUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRmluZCBhIHNpbmdsZSBwaXBlbGluZSBtYXRjaGluZyB0aGUgcXVlcnkgZmlsdGVycy4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGZvdW5kJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdHZXQgcGlwZWxpbmUgYnkgSUQnLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGRldGFpbHMnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMve2lkfS9zY29yZWNhcmQnLFxuICAgIHN1bW1hcnk6ICdHZXQgYSBwaXBlbGluZSBtYXR1cml0eSBzY29yZWNhcmQnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVyLXBpcGVsaW5lIG1hdHVyaXR5IHNjb3JlY2FyZCBibGVuZGluZyBjb21wbGlhbmNlIHBvc3R1cmUgd2l0aCBET1JBIHBlcmZvcm1hbmNlIGJhbmRzIGludG8gYSAw4oCTMTAwIHNjb3JlIGFuZCBsZXR0ZXIgZ3JhZGUuIFJlcXVpcmVzIHRoZSBgYWR2YW5jZWRfcmVwb3J0aW5nYCBmZWF0dXJlLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnU2NvcmVjYXJkJyB9LCA0MDM6IHsgZGVzY3JpcHRpb246ICdGZWF0dXJlIG5vdCBlbmFibGVkJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzL3Njb3JlY2FyZCcsXG4gICAgc3VtbWFyeTogJ09yZy13aWRlIHNjb3JlY2FyZCByb2xsLXVwIChzb2Z0d2FyZS1oZWFsdGggbGVhZGVyYm9hcmQpJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dyYWRlcyBldmVyeSBwaXBlbGluZSBpbiB0aGUgb3JnYW5pemF0aW9uIGFuZCByZXR1cm5zIGEgcmFua2VkIGxlYWRlcmJvYXJkIHBsdXMgYWdncmVnYXRlIHN0YXRzIChwaXBlbGluZSBjb3VudCwgYXZlcmFnZSBzY29yZSwgZ3JhZGUgZGlzdHJpYnV0aW9uKS4gQm91bmRlZCBwZXIgcmVxdWVzdC4gUmVxdWlyZXMgdGhlIGBhZHZhbmNlZF9yZXBvcnRpbmdgIGZlYXR1cmUuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdPcmctd2lkZSBzY29yZWNhcmQgcm9sbC11cCcgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAnRmVhdHVyZSBub3QgZW5hYmxlZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzJyxcbiAgICBzdW1tYXJ5OiAnQ3JlYXRlIGEgcGlwZWxpbmUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24uIENoZWNrcyBwaXBlbGluZSBxdW90YS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMTogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGNyZWF0ZWQnIH0sIDQwMDogeyBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRpb24gZXJyb3InIH0sIDQyOTogeyBkZXNjcmlwdGlvbjogJ1F1b3RhIGV4Y2VlZGVkJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncHV0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy97aWR9JyxcbiAgICBzdW1tYXJ5OiAnVXBkYXRlIGEgcGlwZWxpbmUnLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIHVwZGF0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgcGF0aDogJy9waXBlbGluZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0RlbGV0ZSBhIHBpcGVsaW5lJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NvZnQtZGVsZXRlIGEgcGlwZWxpbmUgYnkgc2V0dGluZyBpc0FjdGl2ZSB0byBmYWxzZS4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGRlbGV0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZXMvcHJvdmlkZXJzJyxcbiAgICBzdW1tYXJ5OiAnTGlzdCBBSSBwcm92aWRlcnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBBSSBwcm92aWRlcnMgY29uZmlndXJlZCBmb3IgcGlwZWxpbmUgZ2VuZXJhdGlvbi4nLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ0xpc3Qgb2YgYXZhaWxhYmxlIEFJIHByb3ZpZGVycyB3aXRoIG1vZGVscycgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmVzL2dlbmVyYXRlJyxcbiAgICBzdW1tYXJ5OiAnR2VuZXJhdGUgcGlwZWxpbmUgdmlhIEFJJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dlbmVyYXRlIGEgQnVpbGRlclByb3BzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG5hdHVyYWwgbGFuZ3VhZ2UgcHJvbXB0LiBSZXR1cm5zIHRoZSBjb21wbGV0ZSByZXN1bHQgd2hlbiBkb25lLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnR2VuZXJhdGVkIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24nIH0sIDQwMDogeyBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRpb24gZXJyb3InIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lcy9nZW5lcmF0ZS9zdHJlYW0nLFxuICAgIHN1bW1hcnk6ICdTdHJlYW0gcGlwZWxpbmUgZ2VuZXJhdGlvbiB2aWEgQUknLFxuICAgIGRlc2NyaXB0aW9uOiAnR2VuZXJhdGUgYSBCdWlsZGVyUHJvcHMgY29uZmlndXJhdGlvbiBmcm9tIGEgbmF0dXJhbCBsYW5ndWFnZSBwcm9tcHQuIFN0cmVhbXMgcGFydGlhbCByZXN1bHRzIGFzIFNTRSBldmVudHMuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdTU0UgZXZlbnQgc3RyZWFtIG9mIHBhcnRpYWwgcGlwZWxpbmUgb2JqZWN0cycgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -8,7 +8,7 @@ export function registerPipelineTemplateRoutes() {
8
8
  method: 'get',
9
9
  path: '/pipeline-templates',
10
10
  summary: 'List pipeline templates',
11
- description: 'List golden-path pipeline templates (own-org + shared system-org catalog) with pagination and filtering.',
11
+ description: 'List golden-path pipeline templates with pagination and filtering. Visibility is a three-rung ladder: `private` (author only), `org` (everyone in the owning org), `public` (the org, its teams, and — for the system org — every org). Optional `visibility` query param narrows within what the caller can already see.',
12
12
  tags,
13
13
  security: auth,
14
14
  responses: { 200: { description: 'Paginated list of templates' }, 401: { description: 'Unauthorized' } },
@@ -34,26 +34,28 @@ export function registerPipelineTemplateRoutes() {
34
34
  method: 'post',
35
35
  path: '/pipeline-templates',
36
36
  summary: 'Create a pipeline template',
37
- description: 'Author a golden-path template. Requires the `pipelines:write` permission.',
37
+ description: 'Author a golden-path template. Requires `templates:write`; `visibility: public` additionally requires `templates:publish` (a caller without it is clamped to `org`). Defaults to `private` — a personal draft only the author can see.',
38
38
  tags,
39
39
  security: auth,
40
- responses: { 201: { description: 'Template created' }, 400: { description: 'Validation error' }, 403: { description: 'Forbidden' } },
40
+ responses: { 201: { description: 'Template created' }, 400: { description: 'Validation error' }, 403: { description: 'Forbidden' }, 409: { description: 'A template with that name already exists in the organization' } },
41
41
  });
42
42
  registry.registerPath({
43
43
  method: 'put',
44
44
  path: '/pipeline-templates/{id}',
45
45
  summary: 'Update a pipeline template',
46
+ description: 'Requires `templates:write`, plus `templates:publish` for a `public` template and authorship for a `private` one.',
46
47
  tags,
47
48
  security: auth,
48
- responses: { 200: { description: 'Template updated' }, 404: { description: 'Not found' } },
49
+ responses: { 200: { description: 'Template updated' }, 403: { description: 'Forbidden' }, 404: { description: 'Not found' } },
49
50
  });
50
51
  registry.registerPath({
51
52
  method: 'delete',
52
53
  path: '/pipeline-templates/{id}',
53
54
  summary: 'Delete a pipeline template',
55
+ description: 'Same authority as update: `templates:write`, plus `templates:publish` for a `public` template and authorship for a `private` one.',
54
56
  tags,
55
57
  security: auth,
56
- responses: { 200: { description: 'Template deleted' }, 404: { description: 'Not found' } },
58
+ responses: { 200: { description: 'Template deleted' }, 403: { description: 'Forbidden' }, 404: { description: 'Not found' } },
57
59
  });
58
60
  }
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtdGVtcGxhdGUtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZW5hcGkvcm91dGVzL3BpcGVsaW5lLXRlbXBsYXRlLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxDLE1BQU0sVUFBVSw4QkFBOEI7SUFDNUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsT0FBTyxFQUFFLHlCQUF5QjtRQUNsQyxXQUFXLEVBQUUsMEdBQTBHO1FBQ3ZILElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw2QkFBNkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsRUFBRTtLQUN6RyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxPQUFPLEVBQUUsK0JBQStCO1FBQ3hDLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRTtLQUMzRixDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSxxTUFBcU07UUFDbE4sSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQzFJLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsV0FBVyxFQUFFLDJFQUEyRTtRQUN4RixJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7S0FDckksQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsT0FBTyxFQUFFLDRCQUE0QjtRQUNyQyxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7S0FDM0YsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsMEJBQTBCO1FBQ2hDLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQzNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVnaXN0cnkgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IHRhZ3MgPSBbJ1BpcGVsaW5lIFRlbXBsYXRlcyddO1xuY29uc3QgYXV0aCA9IFt7IGJlYXJlckF1dGg6IFtdIH1dO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQaXBlbGluZVRlbXBsYXRlUm91dGVzKCk6IHZvaWQge1xuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMnLFxuICAgIHN1bW1hcnk6ICdMaXN0IHBpcGVsaW5lIHRlbXBsYXRlcycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IGdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcyAob3duLW9yZyArIHNoYXJlZCBzeXN0ZW0tb3JnIGNhdGFsb2cpIHdpdGggcGFnaW5hdGlvbiBhbmQgZmlsdGVyaW5nLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnUGFnaW5hdGVkIGxpc3Qgb2YgdGVtcGxhdGVzJyB9LCA0MDE6IHsgZGVzY3JpcHRpb246ICdVbmF1dGhvcml6ZWQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmUtdGVtcGxhdGVzL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdHZXQgYSBwaXBlbGluZSB0ZW1wbGF0ZSBieSBJRCcsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgZGV0YWlscycgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnTm90IGZvdW5kJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncG9zdCcsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMve2lkfS9pbnN0YW50aWF0ZScsXG4gICAgc3VtbWFyeTogJ0luc3RhbnRpYXRlIGEgdGVtcGxhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVuZGVyIGEgdGVtcGxhdGUgaW50byBhIGNvbmNyZXRlIHBpcGVsaW5lIGBwcm9wc2AgYnkgc3VwcGx5aW5nIGl0cyBkZWNsYXJlZCBpbnB1dHMuIFRoZSByZXR1cm5lZCBwcm9wcyBhcmUgc3VibWl0dGVkIHRocm91Z2ggdGhlIG5vcm1hbCBwaXBlbGluZS1jcmVhdGUgZW5kcG9pbnQgKGNvbXBsaWFuY2UgKyBxdW90YSBhcHBseSB0aGVyZSkuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdSZXNvbHZlZCBwaXBlbGluZSBwcm9wcycgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnSW52YWxpZCBpbnB1dHMnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmUtdGVtcGxhdGVzJyxcbiAgICBzdW1tYXJ5OiAnQ3JlYXRlIGEgcGlwZWxpbmUgdGVtcGxhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQXV0aG9yIGEgZ29sZGVuLXBhdGggdGVtcGxhdGUuIFJlcXVpcmVzIHRoZSBgcGlwZWxpbmVzOndyaXRlYCBwZXJtaXNzaW9uLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAxOiB7IGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgY3JlYXRlZCcgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAnRm9yYmlkZGVuJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncHV0JyxcbiAgICBwYXRoOiAnL3BpcGVsaW5lLXRlbXBsYXRlcy97aWR9JyxcbiAgICBzdW1tYXJ5OiAnVXBkYXRlIGEgcGlwZWxpbmUgdGVtcGxhdGUnLFxuICAgIHRhZ3MsXG4gICAgc2VjdXJpdHk6IGF1dGgsXG4gICAgcmVzcG9uc2VzOiB7IDIwMDogeyBkZXNjcmlwdGlvbjogJ1RlbXBsYXRlIHVwZGF0ZWQnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0RlbGV0ZSBhIHBpcGVsaW5lIHRlbXBsYXRlJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdUZW1wbGF0ZSBkZWxldGVkJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG59XG4iXX0=
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtdGVtcGxhdGUtcm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZW5hcGkvcm91dGVzL3BpcGVsaW5lLXRlbXBsYXRlLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxDLE1BQU0sVUFBVSw4QkFBOEI7SUFDNUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsT0FBTyxFQUFFLHlCQUF5QjtRQUNsQyxXQUFXLEVBQUUsMlRBQTJUO1FBQ3hVLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw2QkFBNkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsRUFBRTtLQUN6RyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxPQUFPLEVBQUUsK0JBQStCO1FBQ3hDLElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRTtLQUMzRixDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSxxTUFBcU07UUFDbE4sSUFBSTtRQUNKLFFBQVEsRUFBRSxJQUFJO1FBQ2QsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQzFJLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsV0FBVyxFQUFFLHdPQUF3TztRQUNyUCxJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDhEQUE4RCxFQUFFLEVBQUU7S0FDM04sQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsT0FBTyxFQUFFLDRCQUE0QjtRQUNyQyxXQUFXLEVBQUUsa0hBQWtIO1FBQy9ILElBQUk7UUFDSixRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7S0FDOUgsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwQixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsMEJBQTBCO1FBQ2hDLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsV0FBVyxFQUFFLG1JQUFtSTtRQUNoSixJQUFJO1FBQ0osUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO0tBQzlILENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVnaXN0cnkgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IHRhZ3MgPSBbJ1BpcGVsaW5lIFRlbXBsYXRlcyddO1xuY29uc3QgYXV0aCA9IFt7IGJlYXJlckF1dGg6IFtdIH1dO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQaXBlbGluZVRlbXBsYXRlUm91dGVzKCk6IHZvaWQge1xuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMnLFxuICAgIHN1bW1hcnk6ICdMaXN0IHBpcGVsaW5lIHRlbXBsYXRlcycsXG4gICAgZGVzY3JpcHRpb246ICdMaXN0IGdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcyB3aXRoIHBhZ2luYXRpb24gYW5kIGZpbHRlcmluZy4gVmlzaWJpbGl0eSBpcyBhIHRocmVlLXJ1bmcgbGFkZGVyOiBgcHJpdmF0ZWAgKGF1dGhvciBvbmx5KSwgYG9yZ2AgKGV2ZXJ5b25lIGluIHRoZSBvd25pbmcgb3JnKSwgYHB1YmxpY2AgKHRoZSBvcmcsIGl0cyB0ZWFtcywgYW5kIOKAlCBmb3IgdGhlIHN5c3RlbSBvcmcg4oCUIGV2ZXJ5IG9yZykuIE9wdGlvbmFsIGB2aXNpYmlsaXR5YCBxdWVyeSBwYXJhbSBuYXJyb3dzIHdpdGhpbiB3aGF0IHRoZSBjYWxsZXIgY2FuIGFscmVhZHkgc2VlLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnUGFnaW5hdGVkIGxpc3Qgb2YgdGVtcGxhdGVzJyB9LCA0MDE6IHsgZGVzY3JpcHRpb246ICdVbmF1dGhvcml6ZWQnIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmUtdGVtcGxhdGVzL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdHZXQgYSBwaXBlbGluZSB0ZW1wbGF0ZSBieSBJRCcsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgZGV0YWlscycgfSwgNDA0OiB7IGRlc2NyaXB0aW9uOiAnTm90IGZvdW5kJyB9IH0sXG4gIH0pO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyUGF0aCh7XG4gICAgbWV0aG9kOiAncG9zdCcsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMve2lkfS9pbnN0YW50aWF0ZScsXG4gICAgc3VtbWFyeTogJ0luc3RhbnRpYXRlIGEgdGVtcGxhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVuZGVyIGEgdGVtcGxhdGUgaW50byBhIGNvbmNyZXRlIHBpcGVsaW5lIGBwcm9wc2AgYnkgc3VwcGx5aW5nIGl0cyBkZWNsYXJlZCBpbnB1dHMuIFRoZSByZXR1cm5lZCBwcm9wcyBhcmUgc3VibWl0dGVkIHRocm91Z2ggdGhlIG5vcm1hbCBwaXBlbGluZS1jcmVhdGUgZW5kcG9pbnQgKGNvbXBsaWFuY2UgKyBxdW90YSBhcHBseSB0aGVyZSkuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdSZXNvbHZlZCBwaXBlbGluZSBwcm9wcycgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnSW52YWxpZCBpbnB1dHMnIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmUtdGVtcGxhdGVzJyxcbiAgICBzdW1tYXJ5OiAnQ3JlYXRlIGEgcGlwZWxpbmUgdGVtcGxhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQXV0aG9yIGEgZ29sZGVuLXBhdGggdGVtcGxhdGUuIFJlcXVpcmVzIGB0ZW1wbGF0ZXM6d3JpdGVgOyBgdmlzaWJpbGl0eTogcHVibGljYCBhZGRpdGlvbmFsbHkgcmVxdWlyZXMgYHRlbXBsYXRlczpwdWJsaXNoYCAoYSBjYWxsZXIgd2l0aG91dCBpdCBpcyBjbGFtcGVkIHRvIGBvcmdgKS4gRGVmYXVsdHMgdG8gYHByaXZhdGVgIOKAlCBhIHBlcnNvbmFsIGRyYWZ0IG9ubHkgdGhlIGF1dGhvciBjYW4gc2VlLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAxOiB7IGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgY3JlYXRlZCcgfSwgNDAwOiB7IGRlc2NyaXB0aW9uOiAnVmFsaWRhdGlvbiBlcnJvcicgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAnRm9yYmlkZGVuJyB9LCA0MDk6IHsgZGVzY3JpcHRpb246ICdBIHRlbXBsYXRlIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBvcmdhbml6YXRpb24nIH0gfSxcbiAgfSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXJQYXRoKHtcbiAgICBtZXRob2Q6ICdwdXQnLFxuICAgIHBhdGg6ICcvcGlwZWxpbmUtdGVtcGxhdGVzL3tpZH0nLFxuICAgIHN1bW1hcnk6ICdVcGRhdGUgYSBwaXBlbGluZSB0ZW1wbGF0ZScsXG4gICAgZGVzY3JpcHRpb246ICdSZXF1aXJlcyBgdGVtcGxhdGVzOndyaXRlYCwgcGx1cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGZvciBhIGBwdWJsaWNgIHRlbXBsYXRlIGFuZCBhdXRob3JzaGlwIGZvciBhIGBwcml2YXRlYCBvbmUuJyxcbiAgICB0YWdzLFxuICAgIHNlY3VyaXR5OiBhdXRoLFxuICAgIHJlc3BvbnNlczogeyAyMDA6IHsgZGVzY3JpcHRpb246ICdUZW1wbGF0ZSB1cGRhdGVkJyB9LCA0MDM6IHsgZGVzY3JpcHRpb246ICdGb3JiaWRkZW4nIH0sIDQwNDogeyBkZXNjcmlwdGlvbjogJ05vdCBmb3VuZCcgfSB9LFxuICB9KTtcblxuICByZWdpc3RyeS5yZWdpc3RlclBhdGgoe1xuICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgcGF0aDogJy9waXBlbGluZS10ZW1wbGF0ZXMve2lkfScsXG4gICAgc3VtbWFyeTogJ0RlbGV0ZSBhIHBpcGVsaW5lIHRlbXBsYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgYXV0aG9yaXR5IGFzIHVwZGF0ZTogYHRlbXBsYXRlczp3cml0ZWAsIHBsdXMgYHRlbXBsYXRlczpwdWJsaXNoYCBmb3IgYSBgcHVibGljYCB0ZW1wbGF0ZSBhbmQgYXV0aG9yc2hpcCBmb3IgYSBgcHJpdmF0ZWAgb25lLicsXG4gICAgdGFncyxcbiAgICBzZWN1cml0eTogYXV0aCxcbiAgICByZXNwb25zZXM6IHsgMjAwOiB7IGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgZGVsZXRlZCcgfSwgNDAzOiB7IGRlc2NyaXB0aW9uOiAnRm9yYmlkZGVuJyB9LCA0MDQ6IHsgZGVzY3JpcHRpb246ICdOb3QgZm91bmQnIH0gfSxcbiAgfSk7XG59XG4iXX0=
@@ -3,7 +3,7 @@
3
3
  import { z } from 'zod';
4
4
  import { registry } from './registry.js';
5
5
  import { AIGenerateBodySchema, PluginDeployGeneratedSchema, } from '../validation/ai-schemas.js';
6
- import { AccessModifierSchema, PaginationSchema, BaseFilterSchema, } from '../validation/common-schemas.js';
6
+ import { VisibilitySchema, PaginationSchema, BaseFilterSchema, } from '../validation/common-schemas.js';
7
7
  import { MessageFilterSchema, MessageCreateSchema, MessageReplySchema, } from '../validation/message-schemas.js';
8
8
  import { PipelineFilterSchema, PipelineCreateSchema, PipelineUpdateSchema, } from '../validation/pipeline-schemas.js';
9
9
  import { PluginFilterSchema, PluginCreateSchema, PluginUpdateSchema, PluginUploadBodySchema, } from '../validation/plugin-schemas.js';
@@ -33,8 +33,8 @@ export const PaginatedResponseSchema = z.object({
33
33
  });
34
34
  export function registerSchemas() {
35
35
  // Common schemas
36
- registry.register('AccessModifier', AccessModifierSchema.openapi({
37
- description: 'Resource visibility: "public" (visible to all) or "private" (organization only)',
36
+ registry.register('Visibility', VisibilitySchema.openapi({
37
+ description: 'Sharing rung: "private" (author only), "org" (everyone in the owning organization), or "public" (the org, its teams, and — from the system org — every org)',
38
38
  example: 'private',
39
39
  }));
40
40
  registry.register('PaginationParams', PaginationSchema.openapi({
@@ -88,4 +88,4 @@ export function registerSchemas() {
88
88
  registry.register('ErrorResponse', ErrorResponseSchema.openapi('ErrorResponse'));
89
89
  registry.register('PaginatedResponse', PaginatedResponseSchema.openapi('PaginatedResponse'));
90
90
  }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wZW5hcGkvc2NoZW1hLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEdBQzVCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsa0JBQWtCLEdBQ25CLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN0QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUMvQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFD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QUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzdELFdBQVcsRUFBRSxvQ0FBb0M7S0FDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSixRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFDN0QsV0FBVyxFQUFFLHlEQUF5RDtLQUN2RSxDQUFDLENBQUMsQ0FBQztJQUVKLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQUMzRCxXQUFXLEVBQUUsK0NBQStDO0tBQzdELENBQUMsQ0FBQyxDQUFDO0lBRUosYUFBYTtJQUNiLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDO1FBQy9ELFdBQVcsRUFBRSw2REFBNkQ7S0FDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSixRQUFRLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztRQUM3RSxXQUFXLEVBQUUsbURBQW1EO0tBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBRUosbUJBQW1CO0lBQ25CLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUN2RixRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNqRixRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgcmVnaXN0cnkgfSBmcm9tICcuL3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIEFJR2VuZXJhdGVCb2R5U2NoZW1hLFxuICBQbHVnaW5EZXBsb3lHZW5lcmF0ZWRTY2hlbWEsXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vYWktc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBBY2Nlc3NNb2RpZmllclNjaGVtYSxcbiAgUGFnaW5hdGlvblNjaGVtYSxcbiAgQmFzZUZpbHRlclNjaGVtYSxcbn0gZnJvbSAnLi4vdmFsaWRhdGlvbi9jb21tb24tc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBNZXNzYWdlRmlsdGVyU2NoZW1hLFxuICBNZXNzYWdlQ3JlYXRlU2NoZW1hLFxuICBNZXNzYWdlUmVwbHlTY2hlbWEsXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vbWVzc2FnZS1zY2hlbWFzLmpzJztcbmltcG9ydCB7XG4gIFBpcGVsaW5lRmlsdGVyU2NoZW1hLFxuICBQaXBlbGluZUNyZWF0ZVNjaGVtYSxcbiAgUGlwZWxpbmVVcGRhdGVTY2hlbWEsXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vcGlwZWxpbmUtc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBQbHVnaW5GaWx0ZXJTY2hlbWEsXG4gIFBsdWdpbkNyZWF0ZVNjaGVtYSxcbiAgUGx1Z2luVXBkYXRlU2NoZW1hLFxuICBQbHVnaW5VcGxvYWRCb2R5U2NoZW1hLFxufSBmcm9tICcuLi92YWxpZGF0aW9uL3BsdWdpbi1zY2hlbWFzLmpzJztcblxuLy8gUmVzcG9uc2Ugc2NoZW1hcyAoZXhwb3J0ZWQgZm9yIHR5cGUgdXNhZ2UpXG5leHBvcnQgY29uc3QgU3VjY2Vzc1Jlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdWNjZXNzOiB6LmxpdGVyYWwodHJ1ZSksXG4gIHN0YXR1c0NvZGU6IHoubnVtYmVyKCksXG4gIGRhdGE6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRXJyb3JSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgc3RhdHVzQ29kZTogei5udW1iZXIoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkZXRhaWxzOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBQYWdpbmF0ZWRSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKHRydWUpLFxuICBzdGF0dXNDb2RlOiB6Lm51bWJlcigpLFxuICBkYXRhOiB6LmFycmF5KHoudW5rbm93bigpKSxcbiAgY291bnQ6IHoubnVtYmVyKCksXG4gIGxpbWl0OiB6Lm51bWJlcigpLFxuICBvZmZzZXQ6IHoubnVtYmVyKCksXG4gIHRvdGFsOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTY2hlbWFzKCk6IHZvaWQge1xuICAvLyBDb21tb24gc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignQWNjZXNzTW9kaWZpZXInLCBBY2Nlc3NNb2RpZmllclNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1Jlc291cmNlIHZpc2liaWxpdHk6IFwicHVibGljXCIgKHZpc2libGUgdG8gYWxsKSBvciBcInByaXZhdGVcIiAob3JnYW5pemF0aW9uIG9ubHkpJyxcbiAgICBleGFtcGxlOiAncHJpdmF0ZScsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignUGFnaW5hdGlvblBhcmFtcycsIFBhZ2luYXRpb25TY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTdGFuZGFyZCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nIHBhcmFtZXRlcnMnLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ0Jhc2VGaWx0ZXInLCBCYXNlRmlsdGVyU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbW9uIGZpbHRlciBmaWVsZHMgc2hhcmVkIGJ5IGFsbCBlbnRpdHkgcXVlcmllcycsXG4gIH0pKTtcblxuICAvLyBQaXBlbGluZSBzY2hlbWFzXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQaXBlbGluZUZpbHRlcicsIFBpcGVsaW5lRmlsdGVyU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUXVlcnkgZmlsdGVycyBmb3IgbGlzdGluZyBwaXBlbGluZXMnLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BpcGVsaW5lQ3JlYXRlJywgUGlwZWxpbmVDcmVhdGVTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIGNyZWF0aW5nIGEgbmV3IHBpcGVsaW5lJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQaXBlbGluZVVwZGF0ZScsIFBpcGVsaW5lVXBkYXRlU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVxdWVzdCBib2R5IGZvciB1cGRhdGluZyBhbiBleGlzdGluZyBwaXBlbGluZScsXG4gIH0pKTtcblxuICAvLyBQbHVnaW4gc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignUGx1Z2luRmlsdGVyJywgUGx1Z2luRmlsdGVyU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUXVlcnkgZmlsdGVycyBmb3IgbGlzdGluZyBwbHVnaW5zJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQbHVnaW5DcmVhdGUnLCBQbHVnaW5DcmVhdGVTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIGNyZWF0aW5nIGEgbmV3IHBsdWdpbicsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignUGx1Z2luVXBkYXRlJywgUGx1Z2luVXBkYXRlU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVxdWVzdCBib2R5IGZvciB1cGRhdGluZyBhbiBleGlzdGluZyBwbHVnaW4nLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BsdWdpblVwbG9hZEJvZHknLCBQbHVnaW5VcGxvYWRCb2R5U2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnTWV0YWRhdGEgZm9yIHBsdWdpbiBaSVAgdXBsb2FkIChtdWx0aXBhcnQgZm9ybS1kYXRhKScsXG4gIH0pKTtcblxuICAvLyBNZXNzYWdlIHNjaGVtYXNcbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ01lc3NhZ2VGaWx0ZXInLCBNZXNzYWdlRmlsdGVyU2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUXVlcnkgZmlsdGVycyBmb3IgbGlzdGluZyBtZXNzYWdlcycsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignTWVzc2FnZUNyZWF0ZScsIE1lc3NhZ2VDcmVhdGVTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIGNyZWF0aW5nIGEgbmV3IG1lc3NhZ2Ugb3IgYW5ub3VuY2VtZW50JyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdNZXNzYWdlUmVwbHknLCBNZXNzYWdlUmVwbHlTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIHJlcGx5aW5nIHRvIGEgbWVzc2FnZSB0aHJlYWQnLFxuICB9KSk7XG5cbiAgLy8gQUkgc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignQUlHZW5lcmF0ZUJvZHknLCBBSUdlbmVyYXRlQm9keVNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgQUktcG93ZXJlZCBnZW5lcmF0aW9uIChwaXBlbGluZSBvciBwbHVnaW4pJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQbHVnaW5EZXBsb3lHZW5lcmF0ZWQnLCBQbHVnaW5EZXBsb3lHZW5lcmF0ZWRTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIGRlcGxveWluZyBhbiBBSS1nZW5lcmF0ZWQgcGx1Z2luJyxcbiAgfSkpO1xuXG4gIC8vIFJlc3BvbnNlIHNjaGVtYXNcbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1N1Y2Nlc3NSZXNwb25zZScsIFN1Y2Nlc3NSZXNwb25zZVNjaGVtYS5vcGVuYXBpKCdTdWNjZXNzUmVzcG9uc2UnKSk7XG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdFcnJvclJlc3BvbnNlJywgRXJyb3JSZXNwb25zZVNjaGVtYS5vcGVuYXBpKCdFcnJvclJlc3BvbnNlJykpO1xuICByZWdpc3RyeS5yZWdpc3RlcignUGFnaW5hdGVkUmVzcG9uc2UnLCBQYWdpbmF0ZWRSZXNwb25zZVNjaGVtYS5vcGVuYXBpKCdQYWdpbmF0ZWRSZXNwb25zZScpKTtcbn1cbiJdfQ==
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wZW5hcGkvc2NoZW1hLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEdBQzVCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsa0JBQWtCLEdBQ25CLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN0QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUMvQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFD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QyxRQUFRLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztRQUM3RCxXQUFXLEVBQUUsb0NBQW9DO0tBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUosUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzdELFdBQVcsRUFBRSx5REFBeUQ7S0FDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSixRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDM0QsV0FBVyxFQUFFLCtDQUErQztLQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVKLGFBQWE7SUFDYixRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztRQUMvRCxXQUFXLEVBQUUsNkRBQTZEO0tBQzNFLENBQUMsQ0FBQyxDQUFDO0lBRUosUUFBUSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSwyQkFBMkIsQ0FBQyxPQUFPLENBQUM7UUFDN0UsV0FBVyxFQUFFLG1EQUFtRDtLQUNqRSxDQUFDLENBQUMsQ0FBQztJQUVKLG1CQUFtQjtJQUNuQixRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDdkYsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDakYsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IHJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQge1xuICBBSUdlbmVyYXRlQm9keVNjaGVtYSxcbiAgUGx1Z2luRGVwbG95R2VuZXJhdGVkU2NoZW1hLFxufSBmcm9tICcuLi92YWxpZGF0aW9uL2FpLXNjaGVtYXMuanMnO1xuaW1wb3J0IHtcbiAgVmlzaWJpbGl0eVNjaGVtYSxcbiAgUGFnaW5hdGlvblNjaGVtYSxcbiAgQmFzZUZpbHRlclNjaGVtYSxcbn0gZnJvbSAnLi4vdmFsaWRhdGlvbi9jb21tb24tc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBNZXNzYWdlRmlsdGVyU2NoZW1hLFxuICBNZXNzYWdlQ3JlYXRlU2NoZW1hLFxuICBNZXNzYWdlUmVwbHlTY2hlbWEsXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vbWVzc2FnZS1zY2hlbWFzLmpzJztcbmltcG9ydCB7XG4gIFBpcGVsaW5lRmlsdGVyU2NoZW1hLFxuICBQaXBlbGluZUNyZWF0ZVNjaGVtYSxcbiAgUGlwZWxpbmVVcGRhdGVTY2hlbWEsXG59IGZyb20gJy4uL3ZhbGlkYXRpb24vcGlwZWxpbmUtc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBQbHVnaW5GaWx0ZXJTY2hlbWEsXG4gIFBsdWdpbkNyZWF0ZVNjaGVtYSxcbiAgUGx1Z2luVXBkYXRlU2NoZW1hLFxuICBQbHVnaW5VcGxvYWRCb2R5U2NoZW1hLFxufSBmcm9tICcuLi92YWxpZGF0aW9uL3BsdWdpbi1zY2hlbWFzLmpzJztcblxuLy8gUmVzcG9uc2Ugc2NoZW1hcyAoZXhwb3J0ZWQgZm9yIHR5cGUgdXNhZ2UpXG5leHBvcnQgY29uc3QgU3VjY2Vzc1Jlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdWNjZXNzOiB6LmxpdGVyYWwodHJ1ZSksXG4gIHN0YXR1c0NvZGU6IHoubnVtYmVyKCksXG4gIGRhdGE6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRXJyb3JSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgc3RhdHVzQ29kZTogei5udW1iZXIoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkZXRhaWxzOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBQYWdpbmF0ZWRSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKHRydWUpLFxuICBzdGF0dXNDb2RlOiB6Lm51bWJlcigpLFxuICBkYXRhOiB6LmFycmF5KHoudW5rbm93bigpKSxcbiAgY291bnQ6IHoubnVtYmVyKCksXG4gIGxpbWl0OiB6Lm51bWJlcigpLFxuICBvZmZzZXQ6IHoubnVtYmVyKCksXG4gIHRvdGFsOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTY2hlbWFzKCk6IHZvaWQge1xuICAvLyBDb21tb24gc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignVmlzaWJpbGl0eScsIFZpc2liaWxpdHlTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTaGFyaW5nIHJ1bmc6IFwicHJpdmF0ZVwiIChhdXRob3Igb25seSksIFwib3JnXCIgKGV2ZXJ5b25lIGluIHRoZSBvd25pbmcgb3JnYW5pemF0aW9uKSwgb3IgXCJwdWJsaWNcIiAodGhlIG9yZywgaXRzIHRlYW1zLCBhbmQg4oCUIGZyb20gdGhlIHN5c3RlbSBvcmcg4oCUIGV2ZXJ5IG9yZyknLFxuICAgIGV4YW1wbGU6ICdwcml2YXRlJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQYWdpbmF0aW9uUGFyYW1zJywgUGFnaW5hdGlvblNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YW5kYXJkIHBhZ2luYXRpb24gYW5kIHNvcnRpbmcgcGFyYW1ldGVycycsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignQmFzZUZpbHRlcicsIEJhc2VGaWx0ZXJTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdDb21tb24gZmlsdGVyIGZpZWxkcyBzaGFyZWQgYnkgYWxsIGVudGl0eSBxdWVyaWVzJyxcbiAgfSkpO1xuXG4gIC8vIFBpcGVsaW5lIHNjaGVtYXNcbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BpcGVsaW5lRmlsdGVyJywgUGlwZWxpbmVGaWx0ZXJTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdRdWVyeSBmaWx0ZXJzIGZvciBsaXN0aW5nIHBpcGVsaW5lcycsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignUGlwZWxpbmVDcmVhdGUnLCBQaXBlbGluZUNyZWF0ZVNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgY3JlYXRpbmcgYSBuZXcgcGlwZWxpbmUnLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BpcGVsaW5lVXBkYXRlJywgUGlwZWxpbmVVcGRhdGVTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIHVwZGF0aW5nIGFuIGV4aXN0aW5nIHBpcGVsaW5lJyxcbiAgfSkpO1xuXG4gIC8vIFBsdWdpbiBzY2hlbWFzXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQbHVnaW5GaWx0ZXInLCBQbHVnaW5GaWx0ZXJTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdRdWVyeSBmaWx0ZXJzIGZvciBsaXN0aW5nIHBsdWdpbnMnLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BsdWdpbkNyZWF0ZScsIFBsdWdpbkNyZWF0ZVNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgY3JlYXRpbmcgYSBuZXcgcGx1Z2luJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQbHVnaW5VcGRhdGUnLCBQbHVnaW5VcGRhdGVTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgZm9yIHVwZGF0aW5nIGFuIGV4aXN0aW5nIHBsdWdpbicsXG4gIH0pKTtcblxuICByZWdpc3RyeS5yZWdpc3RlcignUGx1Z2luVXBsb2FkQm9keScsIFBsdWdpblVwbG9hZEJvZHlTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdNZXRhZGF0YSBmb3IgcGx1Z2luIFpJUCB1cGxvYWQgKG11bHRpcGFydCBmb3JtLWRhdGEpJyxcbiAgfSkpO1xuXG4gIC8vIE1lc3NhZ2Ugc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignTWVzc2FnZUZpbHRlcicsIE1lc3NhZ2VGaWx0ZXJTY2hlbWEub3BlbmFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdRdWVyeSBmaWx0ZXJzIGZvciBsaXN0aW5nIG1lc3NhZ2VzJyxcbiAgfSkpO1xuXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdNZXNzYWdlQ3JlYXRlJywgTWVzc2FnZUNyZWF0ZVNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgY3JlYXRpbmcgYSBuZXcgbWVzc2FnZSBvciBhbm5vdW5jZW1lbnQnLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ01lc3NhZ2VSZXBseScsIE1lc3NhZ2VSZXBseVNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgcmVwbHlpbmcgdG8gYSBtZXNzYWdlIHRocmVhZCcsXG4gIH0pKTtcblxuICAvLyBBSSBzY2hlbWFzXG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdBSUdlbmVyYXRlQm9keScsIEFJR2VuZXJhdGVCb2R5U2NoZW1hLm9wZW5hcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVxdWVzdCBib2R5IGZvciBBSS1wb3dlcmVkIGdlbmVyYXRpb24gKHBpcGVsaW5lIG9yIHBsdWdpbiknLFxuICB9KSk7XG5cbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ1BsdWdpbkRlcGxveUdlbmVyYXRlZCcsIFBsdWdpbkRlcGxveUdlbmVyYXRlZFNjaGVtYS5vcGVuYXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgYm9keSBmb3IgZGVwbG95aW5nIGFuIEFJLWdlbmVyYXRlZCBwbHVnaW4nLFxuICB9KSk7XG5cbiAgLy8gUmVzcG9uc2Ugc2NoZW1hc1xuICByZWdpc3RyeS5yZWdpc3RlcignU3VjY2Vzc1Jlc3BvbnNlJywgU3VjY2Vzc1Jlc3BvbnNlU2NoZW1hLm9wZW5hcGkoJ1N1Y2Nlc3NSZXNwb25zZScpKTtcbiAgcmVnaXN0cnkucmVnaXN0ZXIoJ0Vycm9yUmVzcG9uc2UnLCBFcnJvclJlc3BvbnNlU2NoZW1hLm9wZW5hcGkoJ0Vycm9yUmVzcG9uc2UnKSk7XG4gIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdQYWdpbmF0ZWRSZXNwb25zZScsIFBhZ2luYXRlZFJlc3BvbnNlU2NoZW1hLm9wZW5hcGkoJ1BhZ2luYXRlZFJlc3BvbnNlJykpO1xufVxuIl19
@@ -0,0 +1,45 @@
1
+ export type CircuitState = 'closed' | 'open' | 'half-open';
2
+ export interface CircuitBreakerConfig {
3
+ /** Consecutive failures that trip the breaker from closed → open. */
4
+ failureThreshold: number;
5
+ /** How long to stay open before allowing a half-open probe (ms). */
6
+ cooldownMs: number;
7
+ /** Master switch — when false, allowRequest() is always true and no state moves. */
8
+ enabled: boolean;
9
+ }
10
+ export declare const DEFAULT_BREAKER_CONFIG: CircuitBreakerConfig;
11
+ /**
12
+ * A single target's breaker. Not concurrency-locked (JS is single-threaded per
13
+ * event loop); `probeInFlight` gates half-open to one in-flight probe so a burst
14
+ * during cooldown doesn't stampede the recovering downstream.
15
+ */
16
+ export declare class CircuitBreaker {
17
+ private readonly key;
18
+ private readonly config;
19
+ private state;
20
+ private consecutiveFailures;
21
+ private openedAt;
22
+ private probeInFlight;
23
+ constructor(key: string, config?: CircuitBreakerConfig);
24
+ getState(): CircuitState;
25
+ /**
26
+ * Whether a request may proceed. Transitions open→half-open once the cooldown
27
+ * elapses and lets exactly ONE probe through. Returns false when open (or a
28
+ * probe is already in flight) — the caller must fast-fail without any network.
29
+ */
30
+ allowRequest(): boolean;
31
+ /** A logical request succeeded (2xx/3xx/4xx that isn't a downstream fault). */
32
+ recordSuccess(): void;
33
+ /** A logical request failed (connection error, timeout, or 5xx response). */
34
+ recordFailure(): void;
35
+ private open;
36
+ }
37
+ /** Get (or lazily create) the shared breaker for a `host:port` target. */
38
+ export declare function getCircuitBreaker(key: string): CircuitBreaker;
39
+ /** Test helper: clear all breaker state so suites don't leak across each other. */
40
+ export declare function resetCircuitBreakers(): void;
41
+ /** Thrown by the client when a request is fast-failed because the breaker is open. */
42
+ export declare class CircuitOpenError extends Error {
43
+ readonly code = "CIRCUIT_OPEN";
44
+ constructor(target: string);
45
+ }
@@ -0,0 +1,138 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Per-target circuit breaker for service-to-service calls.
5
+ *
6
+ * The shared {@link InternalHttpClient} already has timeouts, a bounded socket
7
+ * pool, and bounded retry-with-jitter — but no load-shedding. Under a sustained
8
+ * downstream brownout every caller keeps paying `timeout × (maxRetries+1)` per
9
+ * request, saturating the socket pool and turning one slow dependency into a
10
+ * fleet-wide latency cascade (the classic retry storm). Worse for fail-CLOSED
11
+ * dependencies (compliance): a brownout there blocks plugin/pipeline creation
12
+ * with full retry latency on every request.
13
+ *
14
+ * This breaker short-circuits that: after `failureThreshold` consecutive
15
+ * failures to a target it OPENS and fast-fails (no network, no retries) for
16
+ * `cooldownMs`, then allows a single half-open probe. A fail-closed caller still
17
+ * fails closed — just immediately, instead of after the full retry budget; a
18
+ * fail-open caller (createSafeClient) gets its `null` immediately.
19
+ *
20
+ * State is keyed by `host:port` in a process-level registry so it is shared even
21
+ * when callers mint a fresh client per request — one bad target trips once, not
22
+ * once-per-client. Disable entirely with `S2S_BREAKER_ENABLED=false`.
23
+ */
24
+ import { envInt, envBool } from '../utils/env.js';
25
+ import { createLogger } from '../utils/logger.js';
26
+ import { emitCounter } from '../utils/metric-emitter.js';
27
+ const logger = createLogger('circuit-breaker');
28
+ export const DEFAULT_BREAKER_CONFIG = {
29
+ failureThreshold: envInt('S2S_BREAKER_THRESHOLD', 5, { min: 1 }),
30
+ cooldownMs: envInt('S2S_BREAKER_COOLDOWN_MS', 10000, { min: 1 }),
31
+ enabled: envBool('S2S_BREAKER_ENABLED', true),
32
+ };
33
+ /**
34
+ * A single target's breaker. Not concurrency-locked (JS is single-threaded per
35
+ * event loop); `probeInFlight` gates half-open to one in-flight probe so a burst
36
+ * during cooldown doesn't stampede the recovering downstream.
37
+ */
38
+ export class CircuitBreaker {
39
+ key;
40
+ config;
41
+ state = 'closed';
42
+ consecutiveFailures = 0;
43
+ openedAt = 0;
44
+ probeInFlight = false;
45
+ constructor(key, config = DEFAULT_BREAKER_CONFIG) {
46
+ this.key = key;
47
+ this.config = config;
48
+ }
49
+ getState() {
50
+ return this.state;
51
+ }
52
+ /**
53
+ * Whether a request may proceed. Transitions open→half-open once the cooldown
54
+ * elapses and lets exactly ONE probe through. Returns false when open (or a
55
+ * probe is already in flight) — the caller must fast-fail without any network.
56
+ */
57
+ allowRequest() {
58
+ if (!this.config.enabled)
59
+ return true;
60
+ if (this.state === 'closed')
61
+ return true;
62
+ if (this.state === 'open') {
63
+ if (Date.now() - this.openedAt >= this.config.cooldownMs) {
64
+ this.state = 'half-open';
65
+ this.probeInFlight = true;
66
+ return true;
67
+ }
68
+ return false;
69
+ }
70
+ // half-open: allow only a single probe at a time.
71
+ if (this.probeInFlight)
72
+ return false;
73
+ this.probeInFlight = true;
74
+ return true;
75
+ }
76
+ /** A logical request succeeded (2xx/3xx/4xx that isn't a downstream fault). */
77
+ recordSuccess() {
78
+ if (!this.config.enabled)
79
+ return;
80
+ this.consecutiveFailures = 0;
81
+ this.probeInFlight = false;
82
+ if (this.state !== 'closed') {
83
+ logger.info('circuit closed (downstream recovered)', { target: this.key });
84
+ this.state = 'closed';
85
+ }
86
+ }
87
+ /** A logical request failed (connection error, timeout, or 5xx response). */
88
+ recordFailure() {
89
+ if (!this.config.enabled)
90
+ return;
91
+ this.probeInFlight = false;
92
+ this.consecutiveFailures++;
93
+ // A failed half-open probe means the downstream is still bad — re-open.
94
+ if (this.state === 'half-open') {
95
+ this.open();
96
+ return;
97
+ }
98
+ if (this.state === 'closed' && this.consecutiveFailures >= this.config.failureThreshold) {
99
+ this.open();
100
+ }
101
+ }
102
+ open() {
103
+ const wasOpen = this.state === 'open';
104
+ this.state = 'open';
105
+ this.openedAt = Date.now();
106
+ if (!wasOpen) {
107
+ logger.warn('circuit opened — shedding load to target', {
108
+ target: this.key,
109
+ consecutiveFailures: this.consecutiveFailures,
110
+ cooldownMs: this.config.cooldownMs,
111
+ });
112
+ emitCounter('s2s_circuit_opened_total', { target: this.key });
113
+ }
114
+ }
115
+ }
116
+ const registry = new Map();
117
+ /** Get (or lazily create) the shared breaker for a `host:port` target. */
118
+ export function getCircuitBreaker(key) {
119
+ let breaker = registry.get(key);
120
+ if (!breaker) {
121
+ breaker = new CircuitBreaker(key);
122
+ registry.set(key, breaker);
123
+ }
124
+ return breaker;
125
+ }
126
+ /** Test helper: clear all breaker state so suites don't leak across each other. */
127
+ export function resetCircuitBreakers() {
128
+ registry.clear();
129
+ }
130
+ /** Thrown by the client when a request is fast-failed because the breaker is open. */
131
+ export class CircuitOpenError extends Error {
132
+ code = 'CIRCUIT_OPEN';
133
+ constructor(target) {
134
+ super(`Circuit open for ${target} — fast-failing to shed load`);
135
+ this.name = 'CircuitOpenError';
136
+ }
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY3VpdC1icmVha2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2NpcmN1aXQtYnJlYWtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQWEvQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBeUI7SUFDMUQsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRSxVQUFVLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRSxPQUFPLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQztDQUM5QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBT04sR0FBRztJQUNILE1BQU07SUFQakIsS0FBSyxHQUFpQixRQUFRLENBQUM7SUFDL0IsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDYixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRTlCLFlBQ21CLEdBQVcsRUFDWCxNQUFNLEdBQXlCLHNCQUFzQjttQkFEckQsR0FBRztzQkFDSCxNQUFNO0lBQ3RCLENBQUM7SUFFSixRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lB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QyxHQUFXO0lBQzNDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ25CLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDaEMsSUFBSSxHQUFHLGNBQWMsQ0FBQztJQUMvQixZQUFZLE1BQWM7UUFDeEIsS0FBSyxDQUFDLG9CQUFvQixNQUFNLDhCQUE4QixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQZXItdGFyZ2V0IGNpcmN1aXQgYnJlYWtlciBmb3Igc2VydmljZS10by1zZXJ2aWNlIGNhbGxzLlxuICpcbiAqIFRoZSBzaGFyZWQge0BsaW5rIEludGVybmFsSHR0cENsaWVudH0gYWxyZWFkeSBoYXMgdGltZW91dHMsIGEgYm91bmRlZCBzb2NrZXRcbiAqIHBvb2wsIGFuZCBib3VuZGVkIHJldHJ5LXdpdGgtaml0dGVyIOKAlCBidXQgbm8gbG9hZC1zaGVkZGluZy4gVW5kZXIgYSBzdXN0YWluZWRcbiAqIGRvd25zdHJlYW0gYnJvd25vdXQgZXZlcnkgY2FsbGVyIGtlZXBzIHBheWluZyBgdGltZW91dCDDlyAobWF4UmV0cmllcysxKWAgcGVyXG4gKiByZXF1ZXN0LCBzYXR1cmF0aW5nIHRoZSBzb2NrZXQgcG9vbCBhbmQgdHVybmluZyBvbmUgc2xvdyBkZXBlbmRlbmN5IGludG8gYVxuICogZmxlZXQtd2lkZSBsYXRlbmN5IGNhc2NhZGUgKHRoZSBjbGFzc2ljIHJldHJ5IHN0b3JtKS4gV29yc2UgZm9yIGZhaWwtQ0xPU0VEXG4gKiBkZXBlbmRlbmNpZXMgKGNvbXBsaWFuY2UpOiBhIGJyb3dub3V0IHRoZXJlIGJsb2NrcyBwbHVnaW4vcGlwZWxpbmUgY3JlYXRpb25cbiAqIHdpdGggZnVsbCByZXRyeSBsYXRlbmN5IG9uIGV2ZXJ5IHJlcXVlc3QuXG4gKlxuICogVGhpcyBicmVha2VyIHNob3J0LWNpcmN1aXRzIHRoYXQ6IGFmdGVyIGBmYWlsdXJlVGhyZXNob2xkYCBjb25zZWN1dGl2ZVxuICogZmFpbHVyZXMgdG8gYSB0YXJnZXQgaXQgT1BFTlMgYW5kIGZhc3QtZmFpbHMgKG5vIG5ldHdvcmssIG5vIHJldHJpZXMpIGZvclxuICogYGNvb2xkb3duTXNgLCB0aGVuIGFsbG93cyBhIHNpbmdsZSBoYWxmLW9wZW4gcHJvYmUuIEEgZmFpbC1jbG9zZWQgY2FsbGVyIHN0aWxsXG4gKiBmYWlscyBjbG9zZWQg4oCUIGp1c3QgaW1tZWRpYXRlbHksIGluc3RlYWQgb2YgYWZ0ZXIgdGhlIGZ1bGwgcmV0cnkgYnVkZ2V0OyBhXG4gKiBmYWlsLW9wZW4gY2FsbGVyIChjcmVhdGVTYWZlQ2xpZW50KSBnZXRzIGl0cyBgbnVsbGAgaW1tZWRpYXRlbHkuXG4gKlxuICogU3RhdGUgaXMga2V5ZWQgYnkgYGhvc3Q6cG9ydGAgaW4gYSBwcm9jZXNzLWxldmVsIHJlZ2lzdHJ5IHNvIGl0IGlzIHNoYXJlZCBldmVuXG4gKiB3aGVuIGNhbGxlcnMgbWludCBhIGZyZXNoIGNsaWVudCBwZXIgcmVxdWVzdCDigJQgb25lIGJhZCB0YXJnZXQgdHJpcHMgb25jZSwgbm90XG4gKiBvbmNlLXBlci1jbGllbnQuIERpc2FibGUgZW50aXJlbHkgd2l0aCBgUzJTX0JSRUFLRVJfRU5BQkxFRD1mYWxzZWAuXG4gKi9cblxuaW1wb3J0IHsgZW52SW50LCBlbnZCb29sIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdjaXJjdWl0LWJyZWFrZXInKTtcblxuZXhwb3J0IHR5cGUgQ2lyY3VpdFN0YXRlID0gJ2Nsb3NlZCcgfCAnb3BlbicgfCAnaGFsZi1vcGVuJztcblxuZXhwb3J0IGludGVyZmFjZSBDaXJjdWl0QnJlYWtlckNvbmZpZyB7XG4gIC8qKiBDb25zZWN1dGl2ZSBmYWlsdXJlcyB0aGF0IHRyaXAgdGhlIGJyZWFrZXIgZnJvbSBjbG9zZWQg4oaSIG9wZW4uICovXG4gIGZhaWx1cmVUaHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqIEhvdyBsb25nIHRvIHN0YXkgb3BlbiBiZWZvcmUgYWxsb3dpbmcgYSBoYWxmLW9wZW4gcHJvYmUgKG1zKS4gKi9cbiAgY29vbGRvd25NczogbnVtYmVyO1xuICAvKiogTWFzdGVyIHN3aXRjaCDigJQgd2hlbiBmYWxzZSwgYWxsb3dSZXF1ZXN0KCkgaXMgYWx3YXlzIHRydWUgYW5kIG5vIHN0YXRlIG1vdmVzLiAqL1xuICBlbmFibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9CUkVBS0VSX0NPTkZJRzogQ2lyY3VpdEJyZWFrZXJDb25maWcgPSB7XG4gIGZhaWx1cmVUaHJlc2hvbGQ6IGVudkludCgnUzJTX0JSRUFLRVJfVEhSRVNIT0xEJywgNSwgeyBtaW46IDEgfSksXG4gIGNvb2xkb3duTXM6IGVudkludCgnUzJTX0JSRUFLRVJfQ09PTERPV05fTVMnLCAxMDAwMCwgeyBtaW46IDEgfSksXG4gIGVuYWJsZWQ6IGVudkJvb2woJ1MyU19CUkVBS0VSX0VOQUJMRUQnLCB0cnVlKSxcbn07XG5cbi8qKlxuICogQSBzaW5nbGUgdGFyZ2V0J3MgYnJlYWtlci4gTm90IGNvbmN1cnJlbmN5LWxvY2tlZCAoSlMgaXMgc2luZ2xlLXRocmVhZGVkIHBlclxuICogZXZlbnQgbG9vcCk7IGBwcm9iZUluRmxpZ2h0YCBnYXRlcyBoYWxmLW9wZW4gdG8gb25lIGluLWZsaWdodCBwcm9iZSBzbyBhIGJ1cnN0XG4gKiBkdXJpbmcgY29vbGRvd24gZG9lc24ndCBzdGFtcGVkZSB0aGUgcmVjb3ZlcmluZyBkb3duc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgQ2lyY3VpdEJyZWFrZXIge1xuICBwcml2YXRlIHN0YXRlOiBDaXJjdWl0U3RhdGUgPSAnY2xvc2VkJztcbiAgcHJpdmF0ZSBjb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgcHJpdmF0ZSBvcGVuZWRBdCA9IDA7XG4gIHByaXZhdGUgcHJvYmVJbkZsaWdodCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkga2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IENpcmN1aXRCcmVha2VyQ29uZmlnID0gREVGQVVMVF9CUkVBS0VSX0NPTkZJRyxcbiAgKSB7fVxuXG4gIGdldFN0YXRlKCk6IENpcmN1aXRTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlcXVlc3QgbWF5IHByb2NlZWQuIFRyYW5zaXRpb25zIG9wZW7ihpJoYWxmLW9wZW4gb25jZSB0aGUgY29vbGRvd25cbiAgICogZWxhcHNlcyBhbmQgbGV0cyBleGFjdGx5IE9ORSBwcm9iZSB0aHJvdWdoLiBSZXR1cm5zIGZhbHNlIHdoZW4gb3BlbiAob3IgYVxuICAgKiBwcm9iZSBpcyBhbHJlYWR5IGluIGZsaWdodCkg4oCUIHRoZSBjYWxsZXIgbXVzdCBmYXN0LWZhaWwgd2l0aG91dCBhbnkgbmV0d29yay5cbiAgICovXG4gIGFsbG93UmVxdWVzdCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuJykge1xuICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLm9wZW5lZEF0ID49IHRoaXMuY29uZmlnLmNvb2xkb3duTXMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdoYWxmLW9wZW4nO1xuICAgICAgICB0aGlzLnByb2JlSW5GbGlnaHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gaGFsZi1vcGVuOiBhbGxvdyBvbmx5IGEgc2luZ2xlIHByb2JlIGF0IGEgdGltZS5cbiAgICBpZiAodGhpcy5wcm9iZUluRmxpZ2h0KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5wcm9iZUluRmxpZ2h0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBBIGxvZ2ljYWwgcmVxdWVzdCBzdWNjZWVkZWQgKDJ4eC8zeHgvNHh4IHRoYXQgaXNuJ3QgYSBkb3duc3RyZWFtIGZhdWx0KS4gKi9cbiAgcmVjb3JkU3VjY2VzcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgIHRoaXMucHJvYmVJbkZsaWdodCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgbG9nZ2VyLmluZm8oJ2NpcmN1aXQgY2xvc2VkIChkb3duc3RyZWFtIHJlY292ZXJlZCknLCB7IHRhcmdldDogdGhpcy5rZXkgfSk7XG4gICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgbG9naWNhbCByZXF1ZXN0IGZhaWxlZCAoY29ubmVjdGlvbiBlcnJvciwgdGltZW91dCwgb3IgNXh4IHJlc3BvbnNlKS4gKi9cbiAgcmVjb3JkRmFpbHVyZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnByb2JlSW5GbGlnaHQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAvLyBBIGZhaWxlZCBoYWxmLW9wZW4gcHJvYmUgbWVhbnMgdGhlIGRvd25zdHJlYW0gaXMgc3RpbGwgYmFkIOKAlCByZS1vcGVuLlxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnaGFsZi1vcGVuJykge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJyAmJiB0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gdGhpcy5jb25maWcuZmFpbHVyZVRocmVzaG9sZCkge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc09wZW4gPSB0aGlzLnN0YXRlID09PSAnb3Blbic7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuJztcbiAgICB0aGlzLm9wZW5lZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoIXdhc09wZW4pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdjaXJjdWl0IG9wZW5lZCDigJQgc2hlZGRpbmcgbG9hZCB0byB0YXJnZXQnLCB7XG4gICAgICAgIHRhcmdldDogdGhpcy5rZXksXG4gICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXM6IHRoaXMuY29uc2VjdXRpdmVGYWlsdXJlcyxcbiAgICAgICAgY29vbGRvd25NczogdGhpcy5jb25maWcuY29vbGRvd25NcyxcbiAgICAgIH0pO1xuICAgICAgZW1pdENvdW50ZXIoJ3Myc19jaXJjdWl0X29wZW5lZF90b3RhbCcsIHsgdGFyZ2V0OiB0aGlzLmtleSB9KTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgQ2lyY3VpdEJyZWFrZXI+KCk7XG5cbi8qKiBHZXQgKG9yIGxhemlseSBjcmVhdGUpIHRoZSBzaGFyZWQgYnJlYWtlciBmb3IgYSBgaG9zdDpwb3J0YCB0YXJnZXQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY3VpdEJyZWFrZXIoa2V5OiBzdHJpbmcpOiBDaXJjdWl0QnJlYWtlciB7XG4gIGxldCBicmVha2VyID0gcmVnaXN0cnkuZ2V0KGtleSk7XG4gIGlmICghYnJlYWtlcikge1xuICAgIGJyZWFrZXIgPSBuZXcgQ2lyY3VpdEJyZWFrZXIoa2V5KTtcbiAgICByZWdpc3RyeS5zZXQoa2V5LCBicmVha2VyKTtcbiAgfVxuICByZXR1cm4gYnJlYWtlcjtcbn1cblxuLyoqIFRlc3QgaGVscGVyOiBjbGVhciBhbGwgYnJlYWtlciBzdGF0ZSBzbyBzdWl0ZXMgZG9uJ3QgbGVhayBhY3Jvc3MgZWFjaCBvdGhlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldENpcmN1aXRCcmVha2VycygpOiB2b2lkIHtcbiAgcmVnaXN0cnkuY2xlYXIoKTtcbn1cblxuLyoqIFRocm93biBieSB0aGUgY2xpZW50IHdoZW4gYSByZXF1ZXN0IGlzIGZhc3QtZmFpbGVkIGJlY2F1c2UgdGhlIGJyZWFrZXIgaXMgb3Blbi4gKi9cbmV4cG9ydCBjbGFzcyBDaXJjdWl0T3BlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0NJUkNVSVRfT1BFTic7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYENpcmN1aXQgb3BlbiBmb3IgJHt0YXJnZXR9IOKAlCBmYXN0LWZhaWxpbmcgdG8gc2hlZCBsb2FkYCk7XG4gICAgdGhpcy5uYW1lID0gJ0NpcmN1aXRPcGVuRXJyb3InO1xuICB9XG59XG4iXX0=