@pipeline-builder/api-core 0.0.1

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 (184) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +98 -0
  3. package/lib/constants/ai-providers.d.ts +52 -0
  4. package/lib/constants/ai-providers.js +129 -0
  5. package/lib/constants/http-status.d.ts +20 -0
  6. package/lib/constants/http-status.js +26 -0
  7. package/lib/constants/index.d.ts +3 -0
  8. package/lib/constants/index.js +6 -0
  9. package/lib/constants/time.d.ts +10 -0
  10. package/lib/constants/time.js +13 -0
  11. package/lib/errors/app-errors.d.ts +30 -0
  12. package/lib/errors/app-errors.js +53 -0
  13. package/lib/errors/index.d.ts +1 -0
  14. package/lib/errors/index.js +4 -0
  15. package/lib/helpers/access-helpers.d.ts +63 -0
  16. package/lib/helpers/access-helpers.js +82 -0
  17. package/lib/helpers/crud-helpers.d.ts +9 -0
  18. package/lib/helpers/crud-helpers.js +23 -0
  19. package/lib/helpers/index.d.ts +6 -0
  20. package/lib/helpers/index.js +9 -0
  21. package/lib/helpers/org-hierarchy-http.d.ts +74 -0
  22. package/lib/helpers/org-hierarchy-http.js +144 -0
  23. package/lib/helpers/org-hierarchy.d.ts +57 -0
  24. package/lib/helpers/org-hierarchy.js +110 -0
  25. package/lib/helpers/restore-helpers.d.ts +49 -0
  26. package/lib/helpers/restore-helpers.js +78 -0
  27. package/lib/helpers/sse-helpers.d.ts +20 -0
  28. package/lib/helpers/sse-helpers.js +45 -0
  29. package/lib/index.d.ts +58 -0
  30. package/lib/index.js +71 -0
  31. package/lib/middleware/auth.d.ts +208 -0
  32. package/lib/middleware/auth.js +588 -0
  33. package/lib/middleware/index.d.ts +3 -0
  34. package/lib/middleware/index.js +6 -0
  35. package/lib/middleware/mongo-sanitize.d.ts +32 -0
  36. package/lib/middleware/mongo-sanitize.js +100 -0
  37. package/lib/middleware/step-up.d.ts +45 -0
  38. package/lib/middleware/step-up.js +138 -0
  39. package/lib/openapi/extend-zod.d.ts +1 -0
  40. package/lib/openapi/extend-zod.js +6 -0
  41. package/lib/openapi/index.d.ts +2 -0
  42. package/lib/openapi/index.js +5 -0
  43. package/lib/openapi/registry.d.ts +17 -0
  44. package/lib/openapi/registry.js +38 -0
  45. package/lib/openapi/routes/ask-routes.d.ts +7 -0
  46. package/lib/openapi/routes/ask-routes.js +62 -0
  47. package/lib/openapi/routes/billing-routes.d.ts +1 -0
  48. package/lib/openapi/routes/billing-routes.js +66 -0
  49. package/lib/openapi/routes/image-registry-routes.d.ts +7 -0
  50. package/lib/openapi/routes/image-registry-routes.js +98 -0
  51. package/lib/openapi/routes/index.d.ts +5 -0
  52. package/lib/openapi/routes/index.js +28 -0
  53. package/lib/openapi/routes/message-routes.d.ts +1 -0
  54. package/lib/openapi/routes/message-routes.js +105 -0
  55. package/lib/openapi/routes/pipeline-routes.d.ts +1 -0
  56. package/lib/openapi/routes/pipeline-routes.js +105 -0
  57. package/lib/openapi/routes/pipeline-template-routes.d.ts +1 -0
  58. package/lib/openapi/routes/pipeline-template-routes.js +61 -0
  59. package/lib/openapi/routes/plugin-routes.d.ts +1 -0
  60. package/lib/openapi/routes/plugin-routes.js +96 -0
  61. package/lib/openapi/routes/quota-routes.d.ts +1 -0
  62. package/lib/openapi/routes/quota-routes.js +62 -0
  63. package/lib/openapi/schema-registry.d.ts +25 -0
  64. package/lib/openapi/schema-registry.js +91 -0
  65. package/lib/routes/health.d.ts +41 -0
  66. package/lib/routes/health.js +82 -0
  67. package/lib/routes/index.d.ts +1 -0
  68. package/lib/routes/index.js +4 -0
  69. package/lib/services/audit-spool.d.ts +80 -0
  70. package/lib/services/audit-spool.js +172 -0
  71. package/lib/services/cache-service.d.ts +124 -0
  72. package/lib/services/cache-service.js +276 -0
  73. package/lib/services/circuit-breaker.d.ts +45 -0
  74. package/lib/services/circuit-breaker.js +138 -0
  75. package/lib/services/compliance-client.d.ts +46 -0
  76. package/lib/services/compliance-client.js +128 -0
  77. package/lib/services/compliance-event-subscriber.d.ts +16 -0
  78. package/lib/services/compliance-event-subscriber.js +72 -0
  79. package/lib/services/durable-event-bus.d.ts +96 -0
  80. package/lib/services/durable-event-bus.js +204 -0
  81. package/lib/services/entity-events.d.ts +48 -0
  82. package/lib/services/entity-events.js +79 -0
  83. package/lib/services/env-redis.d.ts +44 -0
  84. package/lib/services/env-redis.js +94 -0
  85. package/lib/services/http-client.d.ts +143 -0
  86. package/lib/services/http-client.js +335 -0
  87. package/lib/services/index.d.ts +18 -0
  88. package/lib/services/index.js +20 -0
  89. package/lib/services/leader-lock.d.ts +45 -0
  90. package/lib/services/leader-lock.js +85 -0
  91. package/lib/services/quota.d.ts +130 -0
  92. package/lib/services/quota.js +264 -0
  93. package/lib/services/remote-audit-client.d.ts +160 -0
  94. package/lib/services/remote-audit-client.js +390 -0
  95. package/lib/services/retry-strategy.d.ts +74 -0
  96. package/lib/services/retry-strategy.js +118 -0
  97. package/lib/services/scheduler.d.ts +41 -0
  98. package/lib/services/scheduler.js +86 -0
  99. package/lib/services/service-boot.d.ts +20 -0
  100. package/lib/services/service-boot.js +28 -0
  101. package/lib/services/sse-ticket-store.d.ts +51 -0
  102. package/lib/services/sse-ticket-store.js +130 -0
  103. package/lib/services/token-revocation.d.ts +52 -0
  104. package/lib/services/token-revocation.js +120 -0
  105. package/lib/testing/tier-mock.d.ts +44 -0
  106. package/lib/testing/tier-mock.js +65 -0
  107. package/lib/types/audit-events.d.ts +69 -0
  108. package/lib/types/audit-events.js +4 -0
  109. package/lib/types/catalog-metadata.d.ts +36 -0
  110. package/lib/types/catalog-metadata.js +21 -0
  111. package/lib/types/common.d.ts +255 -0
  112. package/lib/types/common.js +41 -0
  113. package/lib/types/error-codes.d.ts +54 -0
  114. package/lib/types/error-codes.js +107 -0
  115. package/lib/types/feature-flags.d.ts +36 -0
  116. package/lib/types/feature-flags.js +128 -0
  117. package/lib/types/http.d.ts +27 -0
  118. package/lib/types/http.js +4 -0
  119. package/lib/types/index.d.ts +11 -0
  120. package/lib/types/index.js +14 -0
  121. package/lib/types/permissions.d.ts +65 -0
  122. package/lib/types/permissions.js +131 -0
  123. package/lib/types/pipeline-template.d.ts +30 -0
  124. package/lib/types/pipeline-template.js +13 -0
  125. package/lib/types/pipeline.d.ts +59 -0
  126. package/lib/types/pipeline.js +31 -0
  127. package/lib/types/quota-tiers.d.ts +79 -0
  128. package/lib/types/quota-tiers.js +221 -0
  129. package/lib/types/visibility.d.ts +20 -0
  130. package/lib/types/visibility.js +22 -0
  131. package/lib/utils/alias-resolver.d.ts +37 -0
  132. package/lib/utils/alias-resolver.js +68 -0
  133. package/lib/utils/audit.d.ts +15 -0
  134. package/lib/utils/audit.js +39 -0
  135. package/lib/utils/aws-scrub.d.ts +11 -0
  136. package/lib/utils/aws-scrub.js +67 -0
  137. package/lib/utils/compliance-attributes.d.ts +6 -0
  138. package/lib/utils/compliance-attributes.js +69 -0
  139. package/lib/utils/concurrency.d.ts +9 -0
  140. package/lib/utils/concurrency.js +29 -0
  141. package/lib/utils/crash-handlers.d.ts +18 -0
  142. package/lib/utils/crash-handlers.js +36 -0
  143. package/lib/utils/env.d.ts +28 -0
  144. package/lib/utils/env.js +54 -0
  145. package/lib/utils/headers.d.ts +18 -0
  146. package/lib/utils/headers.js +21 -0
  147. package/lib/utils/identity.d.ts +40 -0
  148. package/lib/utils/identity.js +51 -0
  149. package/lib/utils/index.d.ts +17 -0
  150. package/lib/utils/index.js +20 -0
  151. package/lib/utils/logger.d.ts +38 -0
  152. package/lib/utils/logger.js +174 -0
  153. package/lib/utils/metric-emitter.d.ts +36 -0
  154. package/lib/utils/metric-emitter.js +32 -0
  155. package/lib/utils/object.d.ts +13 -0
  156. package/lib/utils/object.js +18 -0
  157. package/lib/utils/params.d.ts +150 -0
  158. package/lib/utils/params.js +206 -0
  159. package/lib/utils/response.d.ts +117 -0
  160. package/lib/utils/response.js +223 -0
  161. package/lib/utils/safe-require.d.ts +13 -0
  162. package/lib/utils/safe-require.js +19 -0
  163. package/lib/utils/secret-encryption.d.ts +176 -0
  164. package/lib/utils/secret-encryption.js +374 -0
  165. package/lib/utils/ssrf.d.ts +30 -0
  166. package/lib/utils/ssrf.js +106 -0
  167. package/lib/validation/ai-schemas.d.ts +56 -0
  168. package/lib/validation/ai-schemas.js +78 -0
  169. package/lib/validation/common-schemas.d.ts +133 -0
  170. package/lib/validation/common-schemas.js +94 -0
  171. package/lib/validation/index.d.ts +7 -0
  172. package/lib/validation/index.js +10 -0
  173. package/lib/validation/message-schemas.d.ts +160 -0
  174. package/lib/validation/message-schemas.js +156 -0
  175. package/lib/validation/middleware.d.ts +72 -0
  176. package/lib/validation/middleware.js +65 -0
  177. package/lib/validation/pipeline-schemas.d.ts +181 -0
  178. package/lib/validation/pipeline-schemas.js +101 -0
  179. package/lib/validation/pipeline-template-schemas.d.ts +155 -0
  180. package/lib/validation/pipeline-template-schemas.js +66 -0
  181. package/lib/validation/plugin-schemas.d.ts +171 -0
  182. package/lib/validation/plugin-schemas.js +81 -0
  183. package/openapi.yaml +292 -0
  184. package/package.json +167 -0
@@ -0,0 +1,106 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Shared SSRF guard for user/tenant-supplied outbound URLs (webhook targets,
5
+ * callbacks, …). Promoted to api-core so every service that lets an org point
6
+ * the platform at an arbitrary URL enforces the SAME denylist instead of each
7
+ * re-deriving it (the compliance notifier and the platform alert relay both
8
+ * consume this).
9
+ *
10
+ * The guard resolves the host up front and rejects any address that is — or
11
+ * resolves to — a loopback / private / link-local / unique-local / carrier-grade
12
+ * NAT / cloud-metadata range, so a tenant can't aim a webhook at
13
+ * `169.254.169.254` or an in-cluster service.
14
+ *
15
+ * DNS-rebinding note: the up-front resolve validates the *initial* host only.
16
+ * Node's global `fetch` (undici) re-resolves DNS for a redirect target
17
+ * independently, so callers MUST send with `redirect: 'manual'` and treat any
18
+ * 3xx as a failed delivery — see {@link SSRF_FETCH_INIT}. Pinning the exact
19
+ * resolved IP for the connection would need a custom undici dispatcher (not a
20
+ * dependency here); refusing redirects closes the practical rebinding pivot.
21
+ */
22
+ import { lookup } from 'dns/promises';
23
+ import { isIP } from 'net';
24
+ /**
25
+ * True for loopback / private / link-local / CGNAT / cloud-metadata / ULA
26
+ * addresses — the ranges an outbound tenant webhook must never reach.
27
+ */
28
+ export function isPrivateAddress(ip) {
29
+ const addr = ip.replace(/^\[|\]$/g, '').toLowerCase();
30
+ const v4 = addr.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
31
+ if (v4) {
32
+ const a = Number(v4[1]), b = Number(v4[2]);
33
+ return a === 0 || a === 10 || a === 127
34
+ || (a === 169 && b === 254) // link-local incl. 169.254.169.254 metadata
35
+ || (a === 172 && b >= 16 && b <= 31)
36
+ || (a === 192 && b === 168)
37
+ || (a === 100 && b >= 64 && b <= 127); // CGNAT
38
+ }
39
+ if (addr === '::1' || addr === '::')
40
+ return true;
41
+ if (addr.startsWith('::ffff:')) {
42
+ const suffix = addr.slice(7);
43
+ // Dotted form (`::ffff:127.0.0.1`) — recurse straight into the v4 checks.
44
+ if (suffix.includes('.'))
45
+ return isPrivateAddress(suffix);
46
+ // Hex form (`::ffff:7f00:1` = 127.0.0.1, `::ffff:c0a8:1` = 192.168.0.1):
47
+ // the low 32 bits are written as the last one/two hex groups. Fold them into
48
+ // a dotted quad and recurse so the v4 ranges below still catch it — without
49
+ // this the hex form slips past every check and reaches loopback/private space.
50
+ const groups = suffix.split(':');
51
+ const high = parseInt(groups[groups.length - 2] ?? '0', 16);
52
+ const low = parseInt(groups[groups.length - 1] ?? '0', 16);
53
+ if (Number.isNaN(high) || Number.isNaN(low))
54
+ return false;
55
+ // Fold each 16-bit half into two octets (arithmetic, not bitwise, to satisfy
56
+ // the no-bitwise lint): high → a.b, low → c.d.
57
+ const dotted = `${Math.floor(high / 256) % 256}.${high % 256}.${Math.floor(low / 256) % 256}.${low % 256}`;
58
+ return isPrivateAddress(dotted);
59
+ }
60
+ return addr.startsWith('fc') || addr.startsWith('fd') // unique-local
61
+ || addr.startsWith('fe80'); // link-local
62
+ }
63
+ /**
64
+ * Reject a URL that is malformed, uses a disallowed protocol, or points at a
65
+ * private/loopback/link-local/metadata address (by IP literal or by DNS
66
+ * resolution). Throws a plain `Error` with a caller-safe message on rejection;
67
+ * resolves silently when the URL is safe to fetch.
68
+ */
69
+ export async function assertSafeUrl(rawUrl, opts = {}) {
70
+ const protocols = opts.protocols ?? ['https:'];
71
+ let u;
72
+ try {
73
+ u = new URL(rawUrl);
74
+ }
75
+ catch {
76
+ throw new Error('invalid url');
77
+ }
78
+ if (!protocols.includes(u.protocol)) {
79
+ throw new Error(`url must use ${protocols.map((p) => p.replace(/:$/, '')).join('/')}`);
80
+ }
81
+ const host = u.hostname;
82
+ if (isIP(host) && isPrivateAddress(host))
83
+ throw new Error('url targets a private address');
84
+ let addrs;
85
+ try {
86
+ addrs = await lookup(host, { all: true });
87
+ }
88
+ catch {
89
+ throw new Error('url host did not resolve');
90
+ }
91
+ if (addrs.length === 0)
92
+ throw new Error('url host did not resolve');
93
+ if (addrs.some((a) => isPrivateAddress(a.address)))
94
+ throw new Error('url resolves to a private address');
95
+ }
96
+ /**
97
+ * `fetch` init fragment every SSRF-guarded call MUST spread so a redirect can't
98
+ * pivot to an unvalidated (and re-resolved) host. Callers treat a 3xx / opaque
99
+ * redirect response as a failed delivery rather than following it.
100
+ */
101
+ export const SSRF_FETCH_INIT = { redirect: 'manual' };
102
+ /** True when a `fetch` Response is (or was) a redirect the caller must refuse. */
103
+ export function isRefusedRedirect(resp) {
104
+ return resp.type === 'opaqueredirect' || (resp.status >= 300 && resp.status < 400);
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zc3JmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUzQjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVTtJQUN6QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdEUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNQLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHO2VBQ2xDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsNENBQTRDO2VBQ3JFLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7ZUFDakMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7ZUFDeEIsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUTtJ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SyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDekcsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDcEUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBaUIsRUFBRSxDQUFDO0FBRS9ELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBdUM7SUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIFNTUkYgZ3VhcmQgZm9yIHVzZXIvdGVuYW50LXN1cHBsaWVkIG91dGJvdW5kIFVSTHMgKHdlYmhvb2sgdGFyZ2V0cyxcbiAqIGNhbGxiYWNrcywg4oCmKS4gUHJvbW90ZWQgdG8gYXBpLWNvcmUgc28gZXZlcnkgc2VydmljZSB0aGF0IGxldHMgYW4gb3JnIHBvaW50XG4gKiB0aGUgcGxhdGZvcm0gYXQgYW4gYXJiaXRyYXJ5IFVSTCBlbmZvcmNlcyB0aGUgU0FNRSBkZW55bGlzdCBpbnN0ZWFkIG9mIGVhY2hcbiAqIHJlLWRlcml2aW5nIGl0ICh0aGUgY29tcGxpYW5jZSBub3RpZmllciBhbmQgdGhlIHBsYXRmb3JtIGFsZXJ0IHJlbGF5IGJvdGhcbiAqIGNvbnN1bWUgdGhpcykuXG4gKlxuICogVGhlIGd1YXJkIHJlc29sdmVzIHRoZSBob3N0IHVwIGZyb250IGFuZCByZWplY3RzIGFueSBhZGRyZXNzIHRoYXQgaXMg4oCUIG9yXG4gKiByZXNvbHZlcyB0byDigJQgYSBsb29wYmFjayAvIHByaXZhdGUgLyBsaW5rLWxvY2FsIC8gdW5pcXVlLWxvY2FsIC8gY2Fycmllci1ncmFkZVxuICogTkFUIC8gY2xvdWQtbWV0YWRhdGEgcmFuZ2UsIHNvIGEgdGVuYW50IGNhbid0IGFpbSBhIHdlYmhvb2sgYXRcbiAqIGAxNjkuMjU0LjE2OS4yNTRgIG9yIGFuIGluLWNsdXN0ZXIgc2VydmljZS5cbiAqXG4gKiBETlMtcmViaW5kaW5nIG5vdGU6IHRoZSB1cC1mcm9udCByZXNvbHZlIHZhbGlkYXRlcyB0aGUgKmluaXRpYWwqIGhvc3Qgb25seS5cbiAqIE5vZGUncyBnbG9iYWwgYGZldGNoYCAodW5kaWNpKSByZS1yZXNvbHZlcyBETlMgZm9yIGEgcmVkaXJlY3QgdGFyZ2V0XG4gKiBpbmRlcGVuZGVudGx5LCBzbyBjYWxsZXJzIE1VU1Qgc2VuZCB3aXRoIGByZWRpcmVjdDogJ21hbnVhbCdgIGFuZCB0cmVhdCBhbnlcbiAqIDN4eCBhcyBhIGZhaWxlZCBkZWxpdmVyeSDigJQgc2VlIHtAbGluayBTU1JGX0ZFVENIX0lOSVR9LiBQaW5uaW5nIHRoZSBleGFjdFxuICogcmVzb2x2ZWQgSVAgZm9yIHRoZSBjb25uZWN0aW9uIHdvdWxkIG5lZWQgYSBjdXN0b20gdW5kaWNpIGRpc3BhdGNoZXIgKG5vdCBhXG4gKiBkZXBlbmRlbmN5IGhlcmUpOyByZWZ1c2luZyByZWRpcmVjdHMgY2xvc2VzIHRoZSBwcmFjdGljYWwgcmViaW5kaW5nIHBpdm90LlxuICovXG5cbmltcG9ydCB7IGxvb2t1cCB9IGZyb20gJ2Rucy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0lQIH0gZnJvbSAnbmV0JztcblxuLyoqXG4gKiBUcnVlIGZvciBsb29wYmFjayAvIHByaXZhdGUgLyBsaW5rLWxvY2FsIC8gQ0dOQVQgLyBjbG91ZC1tZXRhZGF0YSAvIFVMQVxuICogYWRkcmVzc2VzIOKAlCB0aGUgcmFuZ2VzIGFuIG91dGJvdW5kIHRlbmFudCB3ZWJob29rIG11c3QgbmV2ZXIgcmVhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVBZGRyZXNzKGlwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWRkciA9IGlwLnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdjQgPSBhZGRyLm1hdGNoKC9eKFxcZHsxLDN9KVxcLihcXGR7MSwzfSlcXC4oXFxkezEsM30pXFwuKFxcZHsxLDN9KSQvKTtcbiAgaWYgKHY0KSB7XG4gICAgY29uc3QgYSA9IE51bWJlcih2NFsxXSksIGIgPSBOdW1iZXIodjRbMl0pO1xuICAgIHJldHVybiBhID09PSAwIHx8IGEgPT09IDEwIHx8IGEgPT09IDEyN1xuICAgICAgfHwgKGEgPT09IDE2OSAmJiBiID09PSAyNTQpIC8vIGxpbmstbG9jYWwgaW5jbC4gMTY5LjI1NC4xNjkuMjU0IG1ldGFkYXRhXG4gICAgICB8fCAoYSA9PT0gMTcyICYmIGIgPj0gMTYgJiYgYiA8PSAzMSlcbiAgICAgIHx8IChhID09PSAxOTIgJiYgYiA9PT0gMTY4KVxuICAgICAgfHwgKGEgPT09IDEwMCAmJiBiID49IDY0ICYmIGIgPD0gMTI3KTsgLy8gQ0dOQVRcbiAgfVxuICBpZiAoYWRkciA9PT0gJzo6MScgfHwgYWRkciA9PT0gJzo6JykgcmV0dXJuIHRydWU7XG4gIGlmIChhZGRyLnN0YXJ0c1dpdGgoJzo6ZmZmZjonKSkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGFkZHIuc2xpY2UoNyk7XG4gICAgLy8gRG90dGVkIGZvcm0gKGA6OmZmZmY6MTI3LjAuMC4xYCkg4oCUIHJlY3Vyc2Ugc3RyYWlnaHQgaW50byB0aGUgdjQgY2hlY2tzLlxuICAgIGlmIChzdWZmaXguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIGlzUHJpdmF0ZUFkZHJlc3Moc3VmZml4KTtcbiAgICAvLyBIZXggZm9ybSAoYDo6ZmZmZjo3ZjAwOjFgID0gMTI3LjAuMC4xLCBgOjpmZmZmOmMwYTg6MWAgPSAxOTIuMTY4LjAuMSk6XG4gICAgLy8gdGhlIGxvdyAzMiBiaXRzIGFyZSB3cml0dGVuIGFzIHRoZSBsYXN0IG9uZS90d28gaGV4IGdyb3Vwcy4gRm9sZCB0aGVtIGludG9cbiAgICAvLyBhIGRvdHRlZCBxdWFkIGFuZCByZWN1cnNlIHNvIHRoZSB2NCByYW5nZXMgYmVsb3cgc3RpbGwgY2F0Y2ggaXQg4oCUIHdpdGhvdXRcbiAgICAvLyB0aGlzIHRoZSBoZXggZm9ybSBzbGlwcyBwYXN0IGV2ZXJ5IGNoZWNrIGFuZCByZWFjaGVzIGxvb3BiYWNrL3ByaXZhdGUgc3BhY2UuXG4gICAgY29uc3QgZ3JvdXBzID0gc3VmZml4LnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgaGlnaCA9IHBhcnNlSW50KGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMl0gPz8gJzAnLCAxNik7XG4gICAgY29uc3QgbG93ID0gcGFyc2VJbnQoZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXSA/PyAnMCcsIDE2KTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGhpZ2gpIHx8IE51bWJlci5pc05hTihsb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRm9sZCBlYWNoIDE2LWJpdCBoYWxmIGludG8gdHdvIG9jdGV0cyAoYXJpdGhtZXRpYywgbm90IGJpdHdpc2UsIHRvIHNhdGlzZnlcbiAgICAvLyB0aGUgbm8tYml0d2lzZSBsaW50KTogaGlnaCDihpIgYS5iLCBsb3cg4oaSIGMuZC5cbiAgICBjb25zdCBkb3R0ZWQgPSBgJHtNYXRoLmZsb29yKGhpZ2ggLyAyNTYpICUgMjU2fS4ke2hpZ2ggJSAyNTZ9LiR7TWF0aC5mbG9vcihsb3cgLyAyNTYpICUgMjU2fS4ke2xvdyAlIDI1Nn1gO1xuICAgIHJldHVybiBpc1ByaXZhdGVBZGRyZXNzKGRvdHRlZCk7XG4gIH1cbiAgcmV0dXJuIGFkZHIuc3RhcnRzV2l0aCgnZmMnKSB8fCBhZGRyLnN0YXJ0c1dpdGgoJ2ZkJykgLy8gdW5pcXVlLWxvY2FsXG4gICAgfHwgYWRkci5zdGFydHNXaXRoKCdmZTgwJyk7IC8vIGxpbmstbG9jYWxcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBhc3NlcnRTYWZlVXJsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FmZVVybE9wdGlvbnMge1xuICAvKiogQWxsb3dlZCBVUkwgcHJvdG9jb2xzIChkZWZhdWx0OiBgWydodHRwczonXWApLiAqL1xuICBwcm90b2NvbHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZWplY3QgYSBVUkwgdGhhdCBpcyBtYWxmb3JtZWQsIHVzZXMgYSBkaXNhbGxvd2VkIHByb3RvY29sLCBvciBwb2ludHMgYXQgYVxuICogcHJpdmF0ZS9sb29wYmFjay9saW5rLWxvY2FsL21ldGFkYXRhIGFkZHJlc3MgKGJ5IElQIGxpdGVyYWwgb3IgYnkgRE5TXG4gKiByZXNvbHV0aW9uKS4gVGhyb3dzIGEgcGxhaW4gYEVycm9yYCB3aXRoIGEgY2FsbGVyLXNhZmUgbWVzc2FnZSBvbiByZWplY3Rpb247XG4gKiByZXNvbHZlcyBzaWxlbnRseSB3aGVuIHRoZSBVUkwgaXMgc2FmZSB0byBmZXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFNhZmVVcmwocmF3VXJsOiBzdHJpbmcsIG9wdHM6IFNhZmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvdG9jb2xzID0gb3B0cy5wcm90b2NvbHMgPz8gWydodHRwczonXTtcbiAgbGV0IHU6IFVSTDtcbiAgdHJ5IHsgdSA9IG5ldyBVUkwocmF3VXJsKTsgfSBjYXRjaCB7IHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1cmwnKTsgfVxuICBpZiAoIXByb3RvY29scy5pbmNsdWRlcyh1LnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXJsIG11c3QgdXNlICR7cHJvdG9jb2xzLm1hcCgocCkgPT4gcC5yZXBsYWNlKC86JC8sICcnKSkuam9pbignLycpfWApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSB1Lmhvc3RuYW1lO1xuICBpZiAoaXNJUChob3N0KSAmJiBpc1ByaXZhdGVBZGRyZXNzKGhvc3QpKSB0aHJvdyBuZXcgRXJyb3IoJ3VybCB0YXJnZXRzIGEgcHJpdmF0ZSBhZGRyZXNzJyk7XG4gIGxldCBhZGRyczogeyBhZGRyZXNzOiBzdHJpbmcgfVtdO1xuICB0cnkgeyBhZGRycyA9IGF3YWl0IGxvb2t1cChob3N0LCB7IGFsbDogdHJ1ZSB9KTsgfSBjYXRjaCB7IHRocm93IG5ldyBFcnJvcigndXJsIGhvc3QgZGlkIG5vdCByZXNvbHZlJyk7IH1cbiAgaWYgKGFkZHJzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCd1cmwgaG9zdCBkaWQgbm90IHJlc29sdmUnKTtcbiAgaWYgKGFkZHJzLnNvbWUoKGEpID0+IGlzUHJpdmF0ZUFkZHJlc3MoYS5hZGRyZXNzKSkpIHRocm93IG5ldyBFcnJvcigndXJsIHJlc29sdmVzIHRvIGEgcHJpdmF0ZSBhZGRyZXNzJyk7XG59XG5cbi8qKlxuICogYGZldGNoYCBpbml0IGZyYWdtZW50IGV2ZXJ5IFNTUkYtZ3VhcmRlZCBjYWxsIE1VU1Qgc3ByZWFkIHNvIGEgcmVkaXJlY3QgY2FuJ3RcbiAqIHBpdm90IHRvIGFuIHVudmFsaWRhdGVkIChhbmQgcmUtcmVzb2x2ZWQpIGhvc3QuIENhbGxlcnMgdHJlYXQgYSAzeHggLyBvcGFxdWVcbiAqIHJlZGlyZWN0IHJlc3BvbnNlIGFzIGEgZmFpbGVkIGRlbGl2ZXJ5IHJhdGhlciB0aGFuIGZvbGxvd2luZyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNTUkZfRkVUQ0hfSU5JVCA9IHsgcmVkaXJlY3Q6ICdtYW51YWwnIGFzIGNvbnN0IH07XG5cbi8qKiBUcnVlIHdoZW4gYSBgZmV0Y2hgIFJlc3BvbnNlIGlzIChvciB3YXMpIGEgcmVkaXJlY3QgdGhlIGNhbGxlciBtdXN0IHJlZnVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZnVzZWRSZWRpcmVjdChyZXNwOiB7IHR5cGU/OiBzdHJpbmc7IHN0YXR1czogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3AudHlwZSA9PT0gJ29wYXF1ZXJlZGlyZWN0JyB8fCAocmVzcC5zdGF0dXMgPj0gMzAwICYmIHJlc3Auc3RhdHVzIDwgNDAwKTtcbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Schema for AI generation request body.
4
+ * Used by both POST /pipelines/generate and POST /plugins/generate.
5
+ */
6
+ export declare const AIGenerateBodySchema: z.ZodObject<{
7
+ prompt: z.ZodString;
8
+ provider: z.ZodString;
9
+ model: z.ZodString;
10
+ apiKey: z.ZodOptional<z.ZodString>;
11
+ previousConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
12
+ fallbackProviders: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ }, z.core.$strip>;
14
+ /**
15
+ * Schema for POST /plugins/deploy-generated request body.
16
+ * Validates the AI-generated plugin configuration before Docker build.
17
+ */
18
+ export declare const PluginDeployGeneratedSchema: z.ZodObject<{
19
+ name: z.ZodString;
20
+ description: z.ZodOptional<z.ZodString>;
21
+ version: z.ZodString;
22
+ pluginType: z.ZodDefault<z.ZodEnum<{
23
+ CodeBuildStep: "CodeBuildStep";
24
+ ManualApprovalStep: "ManualApprovalStep";
25
+ ShellStep: "ShellStep";
26
+ }>>;
27
+ computeType: z.ZodDefault<z.ZodEnum<{
28
+ LARGE: "LARGE";
29
+ MEDIUM: "MEDIUM";
30
+ SMALL: "SMALL";
31
+ X2_LARGE: "X2_LARGE";
32
+ }>>;
33
+ keywords: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
34
+ primaryOutputDirectory: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ installCommands: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
36
+ commands: z.ZodArray<z.ZodString>;
37
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
38
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
39
+ dockerfile: z.ZodString;
40
+ visibility: z.ZodDefault<z.ZodEnum<{
41
+ org: "org";
42
+ private: "private";
43
+ public: "public";
44
+ }>>;
45
+ }, z.core.$strip>;
46
+ /**
47
+ * Schema for POST /pipelines/generate/from-url/stream request body.
48
+ * Validates Git URL + AI provider configuration for repo-based pipeline generation.
49
+ */
50
+ export declare const AIGenerateFromUrlBodySchema: z.ZodObject<{
51
+ gitUrl: z.ZodString;
52
+ provider: z.ZodString;
53
+ model: z.ZodString;
54
+ apiKey: z.ZodOptional<z.ZodString>;
55
+ repoToken: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strip>;
@@ -0,0 +1,78 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { z } from 'zod';
4
+ import { VisibilitySchema } from './common-schemas.js';
5
+ const MAX_PROMPT_LENGTH = parseInt(process.env.MAX_PROMPT_LENGTH || '5000', 10);
6
+ // AI Generation Request
7
+ /**
8
+ * Schema for AI generation request body.
9
+ * Used by both POST /pipelines/generate and POST /plugins/generate.
10
+ */
11
+ export const AIGenerateBodySchema = z.object({
12
+ /** Natural language description of what to generate. */
13
+ prompt: z
14
+ .string()
15
+ .min(1, 'A prompt with a natural language description is required')
16
+ .max(MAX_PROMPT_LENGTH, `Prompt must be ${MAX_PROMPT_LENGTH} characters or fewer`),
17
+ /** AI provider identifier (e.g. "anthropic", "openai", "google"). */
18
+ provider: z.string().min(1, 'A provider is required (e.g., "anthropic", "openai", "google")'),
19
+ /** AI model identifier (e.g. "claude-sonnet-5", "gpt-4o"). */
20
+ model: z.string().min(1, 'A model is required (e.g., "claude-sonnet-5", "gpt-4o")'),
21
+ /** Optional custom API key to override the server/org key for this request. */
22
+ apiKey: z.string().min(1).optional(),
23
+ /** Previous pipeline config for iterative refinement. */
24
+ previousConfig: z.record(z.string(), z.unknown()).optional(),
25
+ /** Fallback AI providers if primary fails (e.g., ["openai", "google"]). */
26
+ fallbackProviders: z.array(z.string()).optional(),
27
+ });
28
+ // Plugin Deploy-Generated Request
29
+ /**
30
+ * Schema for POST /plugins/deploy-generated request body.
31
+ * Validates the AI-generated plugin configuration before Docker build.
32
+ */
33
+ export const PluginDeployGeneratedSchema = z.object({
34
+ /** Plugin name (lowercase, alphanumeric with hyphens). */
35
+ name: z.string().min(1, 'Plugin name is required'),
36
+ /** Human-readable description. */
37
+ description: z.string().optional(),
38
+ /** Semantic version (e.g. "1.0.0"). */
39
+ version: z.string().min(1, 'Version is required'),
40
+ /** Plugin execution type. */
41
+ pluginType: z.enum(['CodeBuildStep', 'ShellStep', 'ManualApprovalStep']).default('CodeBuildStep'),
42
+ /** AWS CodeBuild compute size. */
43
+ computeType: z.enum(['SMALL', 'MEDIUM', 'LARGE', 'X2_LARGE']).default('MEDIUM'),
44
+ /** Keywords for categorization. */
45
+ keywords: z.array(z.string()).optional().default([]),
46
+ /** Primary output directory path. */
47
+ primaryOutputDirectory: z.string().nullable().optional(),
48
+ /** Commands to install dependencies. */
49
+ installCommands: z.array(z.string()).optional().default([]),
50
+ /** Build/execution commands. */
51
+ commands: z.array(z.string()).min(1, 'At least one build command is required'),
52
+ /** Environment variables. */
53
+ env: z.record(z.string(), z.string()).optional(),
54
+ /** Docker build arguments passed via --build-arg at image build time. */
55
+ buildArgs: z.record(z.string(), z.string()).optional(),
56
+ /** Complete Dockerfile content for the build environment. */
57
+ dockerfile: z.string().min(1, 'Dockerfile content is required'),
58
+ /** Access visibility. */
59
+ visibility: VisibilitySchema.default('private'),
60
+ });
61
+ // AI Generate From URL Request
62
+ /**
63
+ * Schema for POST /pipelines/generate/from-url/stream request body.
64
+ * Validates Git URL + AI provider configuration for repo-based pipeline generation.
65
+ */
66
+ export const AIGenerateFromUrlBodySchema = z.object({
67
+ /** Git repository URL (HTTPS, SSH, or git@ format). */
68
+ gitUrl: z.string().min(1, 'A Git repository URL is required').max(500, 'URL must be 500 characters or fewer'),
69
+ /** AI provider identifier (e.g. "anthropic", "openai", "google"). */
70
+ provider: z.string().min(1, 'A provider is required'),
71
+ /** AI model identifier (e.g. "claude-sonnet-5", "gpt-4o"). */
72
+ model: z.string().min(1, 'A model is required'),
73
+ /** Optional custom API key to override the server config. */
74
+ apiKey: z.string().min(1).optional(),
75
+ /** Optional authentication token for accessing private repositories. */
76
+ repoToken: z.string().min(1).optional(),
77
+ });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktc2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2FpLXNjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWhGLHdCQUF3QjtBQUV4Qjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLHdEQUF3RDtJQUN4RCxNQUFNLEVBQUUsQ0FBQztTQUNOLE1BQU0sRUFBRTtTQUNSLEdBQUcsQ0FBQyxDQUFDLEVBQUUsMERBQTBELENBQUM7U0FDbEUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixpQkFBaUIsc0JBQXNCLENBQUM7SUFFcEYscUVBQXFFO0lBQ3JFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxnRUFBZ0UsQ0FBQztJQUU3Riw4REFBOEQ7SUFDOUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHlEQUF5RCxDQUFDO0lBRW5GLCtFQUErRTtJQUMvRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFFcEMseURBQXlEO0lBQ3pELGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENB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QUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDO0lBRS9DLDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFFcEMsd0VBQXdFO0lBQ3hFLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBWaXNpYmlsaXR5U2NoZW1hIH0gZnJvbSAnLi9jb21tb24tc2NoZW1hcy5qcyc7XG5cbmNvbnN0IE1BWF9QUk9NUFRfTEVOR1RIID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTUFYX1BST01QVF9MRU5HVEggfHwgJzUwMDAnLCAxMCk7XG5cbi8vIEFJIEdlbmVyYXRpb24gUmVxdWVzdFxuXG4vKipcbiAqIFNjaGVtYSBmb3IgQUkgZ2VuZXJhdGlvbiByZXF1ZXN0IGJvZHkuXG4gKiBVc2VkIGJ5IGJvdGggUE9TVCAvcGlwZWxpbmVzL2dlbmVyYXRlIGFuZCBQT1NUIC9wbHVnaW5zL2dlbmVyYXRlLlxuICovXG5leHBvcnQgY29uc3QgQUlHZW5lcmF0ZUJvZHlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8qKiBOYXR1cmFsIGxhbmd1YWdlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdG8gZ2VuZXJhdGUuICovXG4gIHByb21wdDogelxuICAgIC5zdHJpbmcoKVxuICAgIC5taW4oMSwgJ0EgcHJvbXB0IHdpdGggYSBuYXR1cmFsIGxhbmd1YWdlIGRlc2NyaXB0aW9uIGlzIHJlcXVpcmVkJylcbiAgICAubWF4KE1BWF9QUk9NUFRfTEVOR1RILCBgUHJvbXB0IG11c3QgYmUgJHtNQVhfUFJPTVBUX0xFTkdUSH0gY2hhcmFjdGVycyBvciBmZXdlcmApLFxuXG4gIC8qKiBBSSBwcm92aWRlciBpZGVudGlmaWVyIChlLmcuIFwiYW50aHJvcGljXCIsIFwib3BlbmFpXCIsIFwiZ29vZ2xlXCIpLiAqL1xuICBwcm92aWRlcjogei5zdHJpbmcoKS5taW4oMSwgJ0EgcHJvdmlkZXIgaXMgcmVxdWlyZWQgKGUuZy4sIFwiYW50aHJvcGljXCIsIFwib3BlbmFpXCIsIFwiZ29vZ2xlXCIpJyksXG5cbiAgLyoqIEFJIG1vZGVsIGlkZW50aWZpZXIgKGUuZy4gXCJjbGF1ZGUtc29ubmV0LTVcIiwgXCJncHQtNG9cIikuICovXG4gIG1vZGVsOiB6LnN0cmluZygpLm1pbigxLCAnQSBtb2RlbCBpcyByZXF1aXJlZCAoZS5nLiwgXCJjbGF1ZGUtc29ubmV0LTVcIiwgXCJncHQtNG9cIiknKSxcblxuICAvKiogT3B0aW9uYWwgY3VzdG9tIEFQSSBrZXkgdG8gb3ZlcnJpZGUgdGhlIHNlcnZlci9vcmcga2V5IGZvciB0aGlzIHJlcXVlc3QuICovXG4gIGFwaUtleTogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcblxuICAvKiogUHJldmlvdXMgcGlwZWxpbmUgY29uZmlnIGZvciBpdGVyYXRpdmUgcmVmaW5lbWVudC4gKi9cbiAgcHJldmlvdXNDb25maWc6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBGYWxsYmFjayBBSSBwcm92aWRlcnMgaWYgcHJpbWFyeSBmYWlscyAoZS5nLiwgW1wib3BlbmFpXCIsIFwiZ29vZ2xlXCJdKS4gKi9cbiAgZmFsbGJhY2tQcm92aWRlcnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vLyBQbHVnaW4gRGVwbG95LUdlbmVyYXRlZCBSZXF1ZXN0XG5cbi8qKlxuICogU2NoZW1hIGZvciBQT1NUIC9wbHVnaW5zL2RlcGxveS1nZW5lcmF0ZWQgcmVxdWVzdCBib2R5LlxuICogVmFsaWRhdGVzIHRoZSBBSS1nZW5lcmF0ZWQgcGx1Z2luIGNvbmZpZ3VyYXRpb24gYmVmb3JlIERvY2tlciBidWlsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBsdWdpbkRlcGxveUdlbmVyYXRlZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLyoqIFBsdWdpbiBuYW1lIChsb3dlcmNhc2UsIGFscGhhbnVtZXJpYyB3aXRoIGh5cGhlbnMpLiAqL1xuICBuYW1lOiB6LnN0cmluZygpLm1pbigxLCAnUGx1Z2luIG5hbWUgaXMgcmVxdWlyZWQnKSxcblxuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG5cbiAgLyoqIFNlbWFudGljIHZlcnNpb24gKGUuZy4gXCIxLjAuMFwiKS4gKi9cbiAgdmVyc2lvbjogei5zdHJpbmcoKS5taW4oMSwgJ1ZlcnNpb24gaXMgcmVxdWlyZWQnKSxcblxuICAvKiogUGx1Z2luIGV4ZWN1dGlvbiB0eXBlLiAqL1xuICBwbHVnaW5UeXBlOiB6LmVudW0oWydDb2RlQnVpbGRTdGVwJywgJ1NoZWxsU3RlcCcsICdNYW51YWxBcHByb3ZhbFN0ZXAnXSkuZGVmYXVsdCgnQ29kZUJ1aWxkU3RlcCcpLFxuXG4gIC8qKiBBV1MgQ29kZUJ1aWxkIGNvbXB1dGUgc2l6ZS4gKi9cbiAgY29tcHV0ZVR5cGU6IHouZW51bShbJ1NNQUxMJywgJ01FRElVTScsICdMQVJHRScsICdYMl9MQVJHRSddKS5kZWZhdWx0KCdNRURJVU0nKSxcblxuICAvKiogS2V5d29yZHMgZm9yIGNhdGVnb3JpemF0aW9uLiAqL1xuICBrZXl3b3Jkczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLmRlZmF1bHQoW10pLFxuXG4gIC8qKiBQcmltYXJ5IG91dHB1dCBkaXJlY3RvcnkgcGF0aC4gKi9cbiAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogei5zdHJpbmcoKS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG5cbiAgLyoqIENvbW1hbmRzIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzLiAqL1xuICBpbnN0YWxsQ29tbWFuZHM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKS5kZWZhdWx0KFtdKSxcblxuICAvKiogQnVpbGQvZXhlY3V0aW9uIGNvbW1hbmRzLiAqL1xuICBjb21tYW5kczogei5hcnJheSh6LnN0cmluZygpKS5taW4oMSwgJ0F0IGxlYXN0IG9uZSBidWlsZCBjb21tYW5kIGlzIHJlcXVpcmVkJyksXG5cbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gKi9cbiAgZW52OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBEb2NrZXIgYnVpbGQgYXJndW1lbnRzIHBhc3NlZCB2aWEgLS1idWlsZC1hcmcgYXQgaW1hZ2UgYnVpbGQgdGltZS4gKi9cbiAgYnVpbGRBcmdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBDb21wbGV0ZSBEb2NrZXJmaWxlIGNvbnRlbnQgZm9yIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gKi9cbiAgZG9ja2VyZmlsZTogei5zdHJpbmcoKS5taW4oMSwgJ0RvY2tlcmZpbGUgY29udGVudCBpcyByZXF1aXJlZCcpLFxuXG4gIC8qKiBBY2Nlc3MgdmlzaWJpbGl0eS4gKi9cbiAgdmlzaWJpbGl0eTogVmlzaWJpbGl0eVNjaGVtYS5kZWZhdWx0KCdwcml2YXRlJyksXG59KTtcblxuLy8gQUkgR2VuZXJhdGUgRnJvbSBVUkwgUmVxdWVzdFxuXG4vKipcbiAqIFNjaGVtYSBmb3IgUE9TVCAvcGlwZWxpbmVzL2dlbmVyYXRlL2Zyb20tdXJsL3N0cmVhbSByZXF1ZXN0IGJvZHkuXG4gKiBWYWxpZGF0ZXMgR2l0IFVSTCArIEFJIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24gZm9yIHJlcG8tYmFzZWQgcGlwZWxpbmUgZ2VuZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFJR2VuZXJhdGVGcm9tVXJsQm9keVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLyoqIEdpdCByZXBvc2l0b3J5IFVSTCAoSFRUUFMsIFNTSCwgb3IgZ2l0QCBmb3JtYXQpLiAqL1xuICBnaXRVcmw6IHouc3RyaW5nKCkubWluKDEsICdBIEdpdCByZXBvc2l0b3J5IFVSTCBpcyByZXF1aXJlZCcpLm1heCg1MDAsICdVUkwgbXVzdCBiZSA1MDAgY2hhcmFjdGVycyBvciBmZXdlcicpLFxuXG4gIC8qKiBBSSBwcm92aWRlciBpZGVudGlmaWVyIChlLmcuIFwiYW50aHJvcGljXCIsIFwib3BlbmFpXCIsIFwiZ29vZ2xlXCIpLiAqL1xuICBwcm92aWRlcjogei5zdHJpbmcoKS5taW4oMSwgJ0EgcHJvdmlkZXIgaXMgcmVxdWlyZWQnKSxcblxuICAvKiogQUkgbW9kZWwgaWRlbnRpZmllciAoZS5nLiBcImNsYXVkZS1zb25uZXQtNVwiLCBcImdwdC00b1wiKS4gKi9cbiAgbW9kZWw6IHouc3RyaW5nKCkubWluKDEsICdBIG1vZGVsIGlzIHJlcXVpcmVkJyksXG5cbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSBBUEkga2V5IHRvIG92ZXJyaWRlIHRoZSBzZXJ2ZXIgY29uZmlnLiAqL1xuICBhcGlLZXk6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG5cbiAgLyoqIE9wdGlvbmFsIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSByZXBvc2l0b3JpZXMuICovXG4gIHJlcG9Ub2tlbjogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbn0pO1xuIl19
@@ -0,0 +1,133 @@
1
+ import '../openapi/extend-zod.js';
2
+ import { z } from 'zod';
3
+ /** The shared three-rung sharing ladder — see the `Visibility` type. */
4
+ export declare const VisibilitySchema: z.ZodEnum<{
5
+ org: "org";
6
+ private: "private";
7
+ public: "public";
8
+ }>;
9
+ /**
10
+ * Developer-portal catalog-metadata schemas — shared by pipeline and plugin
11
+ * create/update bodies (and the filter schema below). Mirror the shared types
12
+ * in `types/catalog-metadata.ts`.
13
+ */
14
+ export declare const LifecycleSchema: z.ZodEnum<{
15
+ deprecated: "deprecated";
16
+ experimental: "experimental";
17
+ production: "production";
18
+ }>;
19
+ export declare const CriticalitySchema: z.ZodEnum<{
20
+ critical: "critical";
21
+ high: "high";
22
+ low: "low";
23
+ medium: "medium";
24
+ }>;
25
+ export declare const OwnerTypeSchema: z.ZodEnum<{
26
+ team: "team";
27
+ user: "user";
28
+ }>;
29
+ export declare const EntityLinkSchema: z.ZodObject<{
30
+ title: z.ZodString;
31
+ url: z.ZodString;
32
+ icon: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>;
34
+ /** Typed classification labels: `{ team: 'payments', tier: 'gold' }`. */
35
+ export declare const EntityLabelsSchema: z.ZodRecord<z.ZodString, z.ZodString>;
36
+ /**
37
+ * Catalog-metadata fields common to catalog entities. Spread into create/update
38
+ * body schemas so pipelines and plugins accept identical ownership/lifecycle/
39
+ * classification input. All optional — owner defaults to the creator server-side.
40
+ */
41
+ export declare const CatalogMetadataShape: {
42
+ readonly ownerId: z.ZodOptional<z.ZodString>;
43
+ readonly ownerType: z.ZodOptional<z.ZodEnum<{
44
+ team: "team";
45
+ user: "user";
46
+ }>>;
47
+ readonly lifecycle: z.ZodOptional<z.ZodEnum<{
48
+ deprecated: "deprecated";
49
+ experimental: "experimental";
50
+ production: "production";
51
+ }>>;
52
+ readonly criticality: z.ZodOptional<z.ZodEnum<{
53
+ critical: "critical";
54
+ high: "high";
55
+ low: "low";
56
+ medium: "medium";
57
+ }>>;
58
+ readonly labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
59
+ readonly links: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ title: z.ZodString;
61
+ url: z.ZodString;
62
+ icon: z.ZodOptional<z.ZodString>;
63
+ }, z.core.$strip>>>;
64
+ };
65
+ /**
66
+ * Sort order schema
67
+ */
68
+ export declare const SortOrderSchema: z.ZodEnum<{
69
+ asc: "asc";
70
+ desc: "desc";
71
+ }>;
72
+ /**
73
+ * Pagination parameters schema.
74
+ *
75
+ * `MAX_PAGE_LIMIT` / `DEFAULT_PAGE_LIMIT` are the SINGLE source for these values
76
+ * across the monorepo — pipeline-core's `CoreConstants` and pipeline-data's
77
+ * `CrudService` import them from here instead of re-reading the env (which drifted).
78
+ */
79
+ export declare const MAX_PAGE_LIMIT: number;
80
+ export declare const DEFAULT_PAGE_LIMIT: number;
81
+ /** Ceiling on offset-based paging — beyond this, deep paging must use the cursor API
82
+ * (an unbounded offset is a scan-and-discard DoS amplifier on hot list routes). */
83
+ export declare const MAX_PAGE_OFFSET: number;
84
+ export declare const PaginationSchema: z.ZodObject<{
85
+ limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
86
+ offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
87
+ sortBy: z.ZodOptional<z.ZodString>;
88
+ sortOrder: z.ZodOptional<z.ZodEnum<{
89
+ asc: "asc";
90
+ desc: "desc";
91
+ }>>;
92
+ }, z.core.$strip>;
93
+ /**
94
+ * Boolean query parameter schema
95
+ * Handles string "true"/"false" and boolean values
96
+ */
97
+ export declare const BooleanQuerySchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
98
+ false: "false";
99
+ true: "true";
100
+ }>, z.ZodTransform<boolean, "false" | "true">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>;
101
+ /**
102
+ * UUID schema with validation
103
+ */
104
+ export declare const UUIDSchema: z.ZodString;
105
+ /**
106
+ * Optional UUID schema (for partial UUIDs or prefixes)
107
+ */
108
+ export declare const UUIDPrefixSchema: z.ZodString;
109
+ /**
110
+ * Base filter schema for entities with common fields
111
+ */
112
+ export declare const BaseFilterSchema: z.ZodObject<{
113
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodString]>>;
114
+ visibility: z.ZodOptional<z.ZodEnum<{
115
+ org: "org";
116
+ private: "private";
117
+ public: "public";
118
+ }>>;
119
+ isActive: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
120
+ false: "false";
121
+ true: "true";
122
+ }>, z.ZodTransform<boolean, "false" | "true">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
123
+ isDefault: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
124
+ false: "false";
125
+ true: "true";
126
+ }>, z.ZodTransform<boolean, "false" | "true">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
127
+ ownerId: z.ZodOptional<z.ZodString>;
128
+ lifecycle: z.ZodOptional<z.ZodEnum<{
129
+ deprecated: "deprecated";
130
+ experimental: "experimental";
131
+ production: "production";
132
+ }>>;
133
+ }, z.core.$strip>;
@@ -0,0 +1,94 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // Must run before any z.* schema creation — Zod 4 requires eager extension
4
+ import '../openapi/extend-zod.js';
5
+ import { z } from 'zod';
6
+ import { VISIBILITIES } from '../types/visibility.js';
7
+ import { envInt } from '../utils/env.js';
8
+ /** The shared three-rung sharing ladder — see the `Visibility` type. */
9
+ export const VisibilitySchema = z.enum(VISIBILITIES);
10
+ /**
11
+ * Developer-portal catalog-metadata schemas — shared by pipeline and plugin
12
+ * create/update bodies (and the filter schema below). Mirror the shared types
13
+ * in `types/catalog-metadata.ts`.
14
+ */
15
+ export const LifecycleSchema = z.enum(['experimental', 'production', 'deprecated']);
16
+ export const CriticalitySchema = z.enum(['low', 'medium', 'high', 'critical']);
17
+ export const OwnerTypeSchema = z.enum(['user', 'team']);
18
+ export const EntityLinkSchema = z.object({
19
+ title: z.string().min(1).max(120),
20
+ url: z.string().url().max(2048),
21
+ icon: z.string().max(40).optional(),
22
+ });
23
+ /** Typed classification labels: `{ team: 'payments', tier: 'gold' }`. */
24
+ export const EntityLabelsSchema = z.record(z.string().min(1).max(63), z.string().max(255));
25
+ /**
26
+ * Catalog-metadata fields common to catalog entities. Spread into create/update
27
+ * body schemas so pipelines and plugins accept identical ownership/lifecycle/
28
+ * classification input. All optional — owner defaults to the creator server-side.
29
+ */
30
+ export const CatalogMetadataShape = {
31
+ ownerId: z.string().min(1).max(255).optional(),
32
+ ownerType: OwnerTypeSchema.optional(),
33
+ lifecycle: LifecycleSchema.optional(),
34
+ criticality: CriticalitySchema.optional(),
35
+ labels: EntityLabelsSchema.optional(),
36
+ links: z.array(EntityLinkSchema).max(50).optional(),
37
+ };
38
+ /**
39
+ * Sort order schema
40
+ */
41
+ export const SortOrderSchema = z.enum(['asc', 'desc']);
42
+ /**
43
+ * Pagination parameters schema.
44
+ *
45
+ * `MAX_PAGE_LIMIT` / `DEFAULT_PAGE_LIMIT` are the SINGLE source for these values
46
+ * across the monorepo — pipeline-core's `CoreConstants` and pipeline-data's
47
+ * `CrudService` import them from here instead of re-reading the env (which drifted).
48
+ */
49
+ export const MAX_PAGE_LIMIT = envInt('MAX_PAGE_LIMIT', 1000, { min: 1 });
50
+ export const DEFAULT_PAGE_LIMIT = envInt('DEFAULT_PAGE_LIMIT', 100, { min: 1 });
51
+ /** Ceiling on offset-based paging — beyond this, deep paging must use the cursor API
52
+ * (an unbounded offset is a scan-and-discard DoS amplifier on hot list routes). */
53
+ export const MAX_PAGE_OFFSET = envInt('MAX_PAGE_OFFSET', 100000, { min: 0 });
54
+ export const PaginationSchema = z.object({
55
+ limit: z.coerce.number().int().min(1).max(MAX_PAGE_LIMIT).optional(),
56
+ offset: z.coerce.number().int().min(0).optional(),
57
+ sortBy: z.string().optional(),
58
+ sortOrder: SortOrderSchema.optional(),
59
+ });
60
+ /**
61
+ * Boolean query parameter schema
62
+ * Handles string "true"/"false" and boolean values
63
+ */
64
+ export const BooleanQuerySchema = z.union([
65
+ z.boolean(),
66
+ z.enum(['true', 'false']).transform(val => val === 'true'),
67
+ z.string().transform(val => val === 'true'),
68
+ ]);
69
+ /**
70
+ * UUID schema with validation
71
+ */
72
+ export const UUIDSchema = z.string().uuid({
73
+ message: 'Invalid UUID format',
74
+ });
75
+ /**
76
+ * Optional UUID schema (for partial UUIDs or prefixes)
77
+ */
78
+ export const UUIDPrefixSchema = z.string().regex(/^[0-9a-f-]+$/i, {
79
+ message: 'Invalid UUID prefix format',
80
+ });
81
+ /**
82
+ * Base filter schema for entities with common fields
83
+ */
84
+ export const BaseFilterSchema = z.object({
85
+ id: z.union([UUIDSchema, z.array(UUIDSchema), UUIDPrefixSchema]).optional(),
86
+ visibility: VisibilitySchema.optional(),
87
+ isActive: BooleanQuerySchema.optional(),
88
+ isDefault: BooleanQuerySchema.optional(),
89
+ // Developer-portal catalog filters (applied only by entities that carry
90
+ // owner/lifecycle columns — pipelines and plugins).
91
+ ownerId: z.string().min(1).optional(),
92
+ lifecycle: LifecycleSchema.optional(),
93
+ });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9jb21tb24tc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLDJFQUEyRTtBQUMzRSxPQUFPLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6Qyx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUVyRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDcEYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDL0UsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUV4RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDakMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxH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QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxxQkFBcUI7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtJQUNoRSxPQUFPLEVBQUUsNEJBQTRCO0NBQ3RDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0UsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtJQUN2QyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsd0VBQXdFO0lBQ3hFLG9EQUFvRDtJQUNwRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDckMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Q0FDdEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIE11c3QgcnVuIGJlZm9yZSBhbnkgei4qIHNjaGVtYSBjcmVhdGlvbiDigJQgWm9kIDQgcmVxdWlyZXMgZWFnZXIgZXh0ZW5zaW9uXG5pbXBvcnQgJy4uL29wZW5hcGkvZXh0ZW5kLXpvZC5qcyc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFZJU0lCSUxJVElFUyB9IGZyb20gJy4uL3R5cGVzL3Zpc2liaWxpdHkuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqIFRoZSBzaGFyZWQgdGhyZWUtcnVuZyBzaGFyaW5nIGxhZGRlciDigJQgc2VlIHRoZSBgVmlzaWJpbGl0eWAgdHlwZS4gKi9cbmV4cG9ydCBjb25zdCBWaXNpYmlsaXR5U2NoZW1hID0gei5lbnVtKFZJU0lCSUxJVElFUyk7XG5cbi8qKlxuICogRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nLW1ldGFkYXRhIHNjaGVtYXMg4oCUIHNoYXJlZCBieSBwaXBlbGluZSBhbmQgcGx1Z2luXG4gKiBjcmVhdGUvdXBkYXRlIGJvZGllcyAoYW5kIHRoZSBmaWx0ZXIgc2NoZW1hIGJlbG93KS4gTWlycm9yIHRoZSBzaGFyZWQgdHlwZXNcbiAqIGluIGB0eXBlcy9jYXRhbG9nLW1ldGFkYXRhLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IExpZmVjeWNsZVNjaGVtYSA9IHouZW51bShbJ2V4cGVyaW1lbnRhbCcsICdwcm9kdWN0aW9uJywgJ2RlcHJlY2F0ZWQnXSk7XG5leHBvcnQgY29uc3QgQ3JpdGljYWxpdHlTY2hlbWEgPSB6LmVudW0oWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAnY3JpdGljYWwnXSk7XG5leHBvcnQgY29uc3QgT3duZXJUeXBlU2NoZW1hID0gei5lbnVtKFsndXNlcicsICd0ZWFtJ10pO1xuXG5leHBvcnQgY29uc3QgRW50aXR5TGlua1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkubWluKDEpLm1heCgxMjApLFxuICB1cmw6IHouc3RyaW5nKCkudXJsKCkubWF4KDIwNDgpLFxuICBpY29uOiB6LnN0cmluZygpLm1heCg0MCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKiogVHlwZWQgY2xhc3NpZmljYXRpb24gbGFiZWxzOiBgeyB0ZWFtOiAncGF5bWVudHMnLCB0aWVyOiAnZ29sZCcgfWAuICovXG5leHBvcnQgY29uc3QgRW50aXR5TGFiZWxzU2NoZW1hID0gei5yZWNvcmQoei5zdHJpbmcoKS5taW4oMSkubWF4KDYzKSwgei5zdHJpbmcoKS5tYXgoMjU1KSk7XG5cbi8qKlxuICogQ2F0YWxvZy1tZXRhZGF0YSBmaWVsZHMgY29tbW9uIHRvIGNhdGFsb2cgZW50aXRpZXMuIFNwcmVhZCBpbnRvIGNyZWF0ZS91cGRhdGVcbiAqIGJvZHkgc2NoZW1hcyBzbyBwaXBlbGluZXMgYW5kIHBsdWdpbnMgYWNjZXB0IGlkZW50aWNhbCBvd25lcnNoaXAvbGlmZWN5Y2xlL1xuICogY2xhc3NpZmljYXRpb24gaW5wdXQuIEFsbCBvcHRpb25hbCDigJQgb3duZXIgZGVmYXVsdHMgdG8gdGhlIGNyZWF0b3Igc2VydmVyLXNpZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXRhbG9nTWV0YWRhdGFTaGFwZSA9IHtcbiAgb3duZXJJZDogei5zdHJpbmcoKS5taW4oMSkubWF4KDI1NSkub3B0aW9uYWwoKSxcbiAgb3duZXJUeXBlOiBPd25lclR5cGVTY2hlbWEub3B0aW9uYWwoKSxcbiAgbGlmZWN5Y2xlOiBMaWZlY3ljbGVTY2hlbWEub3B0aW9uYWwoKSxcbiAgY3JpdGljYWxpdHk6IENyaXRpY2FsaXR5U2NoZW1hLm9wdGlvbmFsKCksXG4gIGxhYmVsczogRW50aXR5TGFiZWxzU2NoZW1hLm9wdGlvbmFsKCksXG4gIGxpbmtzOiB6LmFycmF5KEVudGl0eUxpbmtTY2hlbWEpLm1heCg1MCkub3B0aW9uYWwoKSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogU29ydCBvcmRlciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFNvcnRPcmRlclNjaGVtYSA9IHouZW51bShbJ2FzYycsICdkZXNjJ10pO1xuXG4vKipcbiAqIFBhZ2luYXRpb24gcGFyYW1ldGVycyBzY2hlbWEuXG4gKlxuICogYE1BWF9QQUdFX0xJTUlUYCAvIGBERUZBVUxUX1BBR0VfTElNSVRgIGFyZSB0aGUgU0lOR0xFIHNvdXJjZSBmb3IgdGhlc2UgdmFsdWVzXG4gKiBhY3Jvc3MgdGhlIG1vbm9yZXBvIOKAlCBwaXBlbGluZS1jb3JlJ3MgYENvcmVDb25zdGFudHNgIGFuZCBwaXBlbGluZS1kYXRhJ3NcbiAqIGBDcnVkU2VydmljZWAgaW1wb3J0IHRoZW0gZnJvbSBoZXJlIGluc3RlYWQgb2YgcmUtcmVhZGluZyB0aGUgZW52ICh3aGljaCBkcmlmdGVkKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9QQUdFX0xJTUlUID0gZW52SW50KCdNQVhfUEFHRV9MSU1JVCcsIDEwMDAsIHsgbWluOiAxIH0pO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9MSU1JVCA9IGVudkludCgnREVGQVVMVF9QQUdFX0xJTUlUJywgMTAwLCB7IG1pbjogMSB9KTtcbi8qKiBDZWlsaW5nIG9uIG9mZnNldC1iYXNlZCBwYWdpbmcg4oCUIGJleW9uZCB0aGlzLCBkZWVwIHBhZ2luZyBtdXN0IHVzZSB0aGUgY3Vyc29yIEFQSVxuICogIChhbiB1bmJvdW5kZWQgb2Zmc2V0IGlzIGEgc2Nhbi1hbmQtZGlzY2FyZCBEb1MgYW1wbGlmaWVyIG9uIGhvdCBsaXN0IHJvdXRlcykuICovXG5leHBvcnQgY29uc3QgTUFYX1BBR0VfT0ZGU0VUID0gZW52SW50KCdNQVhfUEFHRV9PRkZTRVQnLCAxMDAwMDAsIHsgbWluOiAwIH0pO1xuXG5leHBvcnQgY29uc3QgUGFnaW5hdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbGltaXQ6IHouY29lcmNlLm51bWJlcigpLmludCgpLm1pbigxKS5tYXgoTUFYX1BBR0VfTElNSVQpLm9wdGlvbmFsKCksXG4gIG9mZnNldDogei5jb2VyY2UubnVtYmVyKCkuaW50KCkubWluKDApLm9wdGlvbmFsKCksXG4gIHNvcnRCeTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzb3J0T3JkZXI6IFNvcnRPcmRlclNjaGVtYS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogQm9vbGVhbiBxdWVyeSBwYXJhbWV0ZXIgc2NoZW1hXG4gKiBIYW5kbGVzIHN0cmluZyBcInRydWVcIi9cImZhbHNlXCIgYW5kIGJvb2xlYW4gdmFsdWVzXG4gKi9cbmV4cG9ydCBjb25zdCBCb29sZWFuUXVlcnlTY2hlbWEgPSB6LnVuaW9uKFtcbiAgei5ib29sZWFuKCksXG4gIHouZW51bShbJ3RydWUnLCAnZmFsc2UnXSkudHJhbnNmb3JtKHZhbCA9PiB2YWwgPT09ICd0cnVlJyksXG4gIHouc3RyaW5nKCkudHJhbnNmb3JtKHZhbCA9PiB2YWwgPT09ICd0cnVlJyksXG5dKTtcblxuLyoqXG4gKiBVVUlEIHNjaGVtYSB3aXRoIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFVVSURTY2hlbWEgPSB6LnN0cmluZygpLnV1aWQoe1xuICBtZXNzYWdlOiAnSW52YWxpZCBVVUlEIGZvcm1hdCcsXG59KTtcblxuLyoqXG4gKiBPcHRpb25hbCBVVUlEIHNjaGVtYSAoZm9yIHBhcnRpYWwgVVVJRHMgb3IgcHJlZml4ZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBVVUlEUHJlZml4U2NoZW1hID0gei5zdHJpbmcoKS5yZWdleCgvXlswLTlhLWYtXSskL2ksIHtcbiAgbWVzc2FnZTogJ0ludmFsaWQgVVVJRCBwcmVmaXggZm9ybWF0Jyxcbn0pO1xuXG4vKipcbiAqIEJhc2UgZmlsdGVyIHNjaGVtYSBmb3IgZW50aXRpZXMgd2l0aCBjb21tb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBCYXNlRmlsdGVyU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei51bmlvbihbVVVJRFNjaGVtYSwgei5hcnJheShVVUlEU2NoZW1hKSwgVVVJRFByZWZpeFNjaGVtYV0pLm9wdGlvbmFsKCksXG4gIHZpc2liaWxpdHk6IFZpc2liaWxpdHlTY2hlbWEub3B0aW9uYWwoKSxcbiAgaXNBY3RpdmU6IEJvb2xlYW5RdWVyeVNjaGVtYS5vcHRpb25hbCgpLFxuICBpc0RlZmF1bHQ6IEJvb2xlYW5RdWVyeVNjaGVtYS5vcHRpb25hbCgpLFxuICAvLyBEZXZlbG9wZXItcG9ydGFsIGNhdGFsb2cgZmlsdGVycyAoYXBwbGllZCBvbmx5IGJ5IGVudGl0aWVzIHRoYXQgY2FycnlcbiAgLy8gb3duZXIvbGlmZWN5Y2xlIGNvbHVtbnMg4oCUIHBpcGVsaW5lcyBhbmQgcGx1Z2lucykuXG4gIG93bmVySWQ6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG4gIGxpZmVjeWNsZTogTGlmZWN5Y2xlU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export * from './common-schemas.js';
2
+ export * from './pipeline-schemas.js';
3
+ export * from './pipeline-template-schemas.js';
4
+ export * from './plugin-schemas.js';
5
+ export * from './message-schemas.js';
6
+ export * from './ai-schemas.js';
7
+ export * from './middleware.js';
@@ -0,0 +1,10 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from './common-schemas.js';
4
+ export * from './pipeline-schemas.js';
5
+ export * from './pipeline-template-schemas.js';
6
+ export * from './plugin-schemas.js';
7
+ export * from './message-schemas.js';
8
+ export * from './ai-schemas.js';
9
+ export * from './middleware.js';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jb21tb24tc2NoZW1hcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lLXNjaGVtYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS10ZW1wbGF0ZS1zY2hlbWFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGx1Z2luLXNjaGVtYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdlLXNjaGVtYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9haS1zY2hlbWFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWlkZGxld2FyZS5qcyc7XG4iXX0=