@pipeline-builder/pipeline-manager 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +74 -0
  3. package/cdk.json +91 -0
  4. package/config.yml +94 -0
  5. package/dist/boilerplate.d.ts +3 -0
  6. package/dist/boilerplate.d.ts.map +1 -0
  7. package/dist/boilerplate.js +58 -0
  8. package/dist/cdk.json +91 -0
  9. package/dist/cli.d.ts +62 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +372 -0
  12. package/dist/commands/bootstrap.d.ts +11 -0
  13. package/dist/commands/bootstrap.d.ts.map +1 -0
  14. package/dist/commands/bootstrap.js +159 -0
  15. package/dist/commands/create-pipeline.d.ts +12 -0
  16. package/dist/commands/create-pipeline.d.ts.map +1 -0
  17. package/dist/commands/create-pipeline.js +291 -0
  18. package/dist/commands/deploy.d.ts +15 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +167 -0
  21. package/dist/commands/get-pipeline.d.ts +13 -0
  22. package/dist/commands/get-pipeline.d.ts.map +1 -0
  23. package/dist/commands/get-pipeline.js +97 -0
  24. package/dist/commands/get-plugin.d.ts +13 -0
  25. package/dist/commands/get-plugin.d.ts.map +1 -0
  26. package/dist/commands/get-plugin.js +98 -0
  27. package/dist/commands/list-pipelines.d.ts +20 -0
  28. package/dist/commands/list-pipelines.d.ts.map +1 -0
  29. package/dist/commands/list-pipelines.js +172 -0
  30. package/dist/commands/list-plugins.d.ts +20 -0
  31. package/dist/commands/list-plugins.d.ts.map +1 -0
  32. package/dist/commands/list-plugins.js +167 -0
  33. package/dist/commands/login.d.ts +21 -0
  34. package/dist/commands/login.d.ts.map +1 -0
  35. package/dist/commands/login.js +179 -0
  36. package/dist/commands/setup-events.d.ts +15 -0
  37. package/dist/commands/setup-events.d.ts.map +1 -0
  38. package/dist/commands/setup-events.js +177 -0
  39. package/dist/commands/status.d.ts +11 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +89 -0
  42. package/dist/commands/store-token.d.ts +20 -0
  43. package/dist/commands/store-token.d.ts.map +1 -0
  44. package/dist/commands/store-token.js +233 -0
  45. package/dist/commands/synth.d.ts +21 -0
  46. package/dist/commands/synth.d.ts.map +1 -0
  47. package/dist/commands/synth.js +143 -0
  48. package/dist/commands/upload-plugin.d.ts +21 -0
  49. package/dist/commands/upload-plugin.d.ts.map +1 -0
  50. package/dist/commands/upload-plugin.js +311 -0
  51. package/dist/commands/version.d.ts +12 -0
  52. package/dist/commands/version.d.ts.map +1 -0
  53. package/dist/commands/version.js +223 -0
  54. package/dist/config/cli.constants.d.ts +101 -0
  55. package/dist/config/cli.constants.d.ts.map +1 -0
  56. package/dist/config/cli.constants.js +165 -0
  57. package/dist/config.yml +94 -0
  58. package/dist/templates/events-stack.json +141 -0
  59. package/dist/types/config.d.ts +44 -0
  60. package/dist/types/config.d.ts.map +1 -0
  61. package/dist/types/config.js +5 -0
  62. package/dist/types/error.d.ts +61 -0
  63. package/dist/types/error.d.ts.map +1 -0
  64. package/dist/types/error.js +39 -0
  65. package/dist/types/index.d.ts +8 -0
  66. package/dist/types/index.d.ts.map +1 -0
  67. package/dist/types/index.js +26 -0
  68. package/dist/types/pipeline.d.ts +144 -0
  69. package/dist/types/pipeline.d.ts.map +1 -0
  70. package/dist/types/pipeline.js +5 -0
  71. package/dist/types/plugin.d.ts +160 -0
  72. package/dist/types/plugin.d.ts.map +1 -0
  73. package/dist/types/plugin.js +5 -0
  74. package/dist/utils/api-client.d.ts +26 -0
  75. package/dist/utils/api-client.d.ts.map +1 -0
  76. package/dist/utils/api-client.js +160 -0
  77. package/dist/utils/audit-log.d.ts +8 -0
  78. package/dist/utils/audit-log.d.ts.map +1 -0
  79. package/dist/utils/audit-log.js +53 -0
  80. package/dist/utils/auth-guard.d.ts +16 -0
  81. package/dist/utils/auth-guard.d.ts.map +1 -0
  82. package/dist/utils/auth-guard.js +25 -0
  83. package/dist/utils/aws-secrets.d.ts +21 -0
  84. package/dist/utils/aws-secrets.d.ts.map +1 -0
  85. package/dist/utils/aws-secrets.js +74 -0
  86. package/dist/utils/banner.d.ts +19 -0
  87. package/dist/utils/banner.d.ts.map +1 -0
  88. package/dist/utils/banner.js +59 -0
  89. package/dist/utils/cdk-utils.d.ts +51 -0
  90. package/dist/utils/cdk-utils.d.ts.map +1 -0
  91. package/dist/utils/cdk-utils.js +101 -0
  92. package/dist/utils/command-utils.d.ts +56 -0
  93. package/dist/utils/command-utils.d.ts.map +1 -0
  94. package/dist/utils/command-utils.js +138 -0
  95. package/dist/utils/config-loader.d.ts +27 -0
  96. package/dist/utils/config-loader.d.ts.map +1 -0
  97. package/dist/utils/config-loader.js +166 -0
  98. package/dist/utils/error-handler.d.ts +29 -0
  99. package/dist/utils/error-handler.d.ts.map +1 -0
  100. package/dist/utils/error-handler.js +255 -0
  101. package/dist/utils/list-command-utils.d.ts +23 -0
  102. package/dist/utils/list-command-utils.d.ts.map +1 -0
  103. package/dist/utils/list-command-utils.js +60 -0
  104. package/dist/utils/output-utils.d.ts +60 -0
  105. package/dist/utils/output-utils.d.ts.map +1 -0
  106. package/dist/utils/output-utils.js +320 -0
  107. package/dist/utils/rate-limiter.d.ts +14 -0
  108. package/dist/utils/rate-limiter.d.ts.map +1 -0
  109. package/dist/utils/rate-limiter.js +73 -0
  110. package/package.json +144 -0
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ApiError = exports.ERROR_CODES = void 0;
6
+ /**
7
+ * Numeric exit-code constants mapped to error categories.
8
+ * Used by {@link handleError} to set the process exit code.
9
+ */
10
+ exports.ERROR_CODES = {
11
+ GENERAL: 1,
12
+ VALIDATION: 2,
13
+ API_REQUEST: 3,
14
+ AUTHENTICATION: 4,
15
+ AUTHORIZATION: 5,
16
+ NOT_FOUND: 6,
17
+ NETWORK: 7,
18
+ CONFIGURATION: 8,
19
+ FILE_SYSTEM: 9,
20
+ TIMEOUT: 10,
21
+ };
22
+ /**
23
+ * Typed API error with status, response, and Axios compatibility flag.
24
+ * Replaces `as any` casts in api-client.ts error handling.
25
+ */
26
+ class ApiError extends Error {
27
+ status;
28
+ response;
29
+ isAxiosError = true;
30
+ constructor(message, status, response) {
31
+ super(message);
32
+ this.status = status;
33
+ this.response = response;
34
+ this.name = 'ApiError';
35
+ Error.captureStackTrace(this, this.constructor);
36
+ }
37
+ }
38
+ exports.ApiError = ApiError;
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qzs7O0dBR0c7QUFDVSxRQUFBLFdBQVcsR0FBRztJQUN6QixPQUFPLEVBQUUsQ0FBQztJQUNWLFVBQVUsRUFBRSxDQUFDO0lBQ2IsV0FBVyxFQUFFLENBQUM7SUFDZCxjQUFjLEVBQUUsQ0FBQztJQUNqQixhQUFhLEVBQUUsQ0FBQztJQUNoQixTQUFTLEVBQUUsQ0FBQztJQUNaLE9BQU8sRUFBRSxDQUFDO0lBQ1YsYUFBYSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLENBQUM7SUFDZCxPQUFPLEVBQUUsRUFBRTtDQUNILENBQUM7QUF1Q1g7OztHQUdHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsS0FBSztJQUt4QjtJQUNBO0lBTE8sWUFBWSxHQUFHLElBQWEsQ0FBQztJQUU3QyxZQUNFLE9BQWUsRUFDUixNQUFjLEVBQ2QsUUFBb0M7UUFFM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSFIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQTRCO1FBRzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQVpELDRCQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTnVtZXJpYyBleGl0LWNvZGUgY29uc3RhbnRzIG1hcHBlZCB0byBlcnJvciBjYXRlZ29yaWVzLlxuICogVXNlZCBieSB7QGxpbmsgaGFuZGxlRXJyb3J9IHRvIHNldCB0aGUgcHJvY2VzcyBleGl0IGNvZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBFUlJPUl9DT0RFUyA9IHtcbiAgR0VORVJBTDogMSxcbiAgVkFMSURBVElPTjogMixcbiAgQVBJX1JFUVVFU1Q6IDMsXG4gIEFVVEhFTlRJQ0FUSU9OOiA0LFxuICBBVVRIT1JJWkFUSU9OOiA1LFxuICBOT1RfRk9VTkQ6IDYsXG4gIE5FVFdPUks6IDcsXG4gIENPTkZJR1VSQVRJT046IDgsXG4gIEZJTEVfU1lTVEVNOiA5LFxuICBUSU1FT1VUOiAxMCxcbn0gYXMgY29uc3Q7XG5cbi8qKiBVbmlvbiBvZiBhbGwgdmFsaWQgZXJyb3IgY29kZSB2YWx1ZXMuICovXG5leHBvcnQgdHlwZSBFcnJvckNvZGUgPSAodHlwZW9mIEVSUk9SX0NPREVTKVtrZXlvZiB0eXBlb2YgRVJST1JfQ09ERVNdO1xuXG4vKipcbiAqIE9wdGlvbnMgY29udHJvbGxpbmcgaG93IHtAbGluayBoYW5kbGVFcnJvcn0gcHJvY2Vzc2VzIGFuZCByZXBvcnRzIGFuIGVycm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVycm9ySGFuZGxlck9wdGlvbnMge1xuICAvKiogV2hlbiBgdHJ1ZWAsIHByaW50cyBmdWxsIHN0YWNrIHRyYWNlcyBhbmQgaW50ZXJuYWwgZGV0YWlscy4gKi9cbiAgZGVidWc/OiBib29sZWFuO1xuICAvKiogV2hlbiBgdHJ1ZWAsIGNhbGxzIGBwcm9jZXNzLmV4aXQoKWAgd2l0aCB0aGUgZXJyb3IgY29kZS4gKi9cbiAgZXhpdD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIGB0cnVlYCwgbG9ncyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGUgKGRlZmF1bHRzIHRvIGB0cnVlYCkuICovXG4gIGxvZ1RvQ29uc29sZT86IGJvb2xlYW47XG4gIC8qKiBBcmJpdHJhcnkga2V5LXZhbHVlIGNvbnRleHQgYXR0YWNoZWQgdG8gdGhlIGVycm9yIG91dHB1dCBmb3IgZGVidWdnaW5nLiAqL1xuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBSZXF1ZXN0L2V4ZWN1dGlvbiBjb3JyZWxhdGlvbiBJRCBmb3IgbG9nIHRyYWNpbmcuICovXG4gIGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTWluaW1hbCBBeGlvcy1jb21wYXRpYmxlIGVycm9yIHNoYXBlIHVzZWQgZm9yIGR1Y2stdHlwaW5nIGluIGVycm9yIGhhbmRsZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF4aW9zRXJyb3JMaWtlIHtcbiAgcmVzcG9uc2U/OiB7XG4gICAgc3RhdHVzPzogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQ/OiBzdHJpbmc7XG4gICAgZGF0YT86IHVua25vd247XG4gIH07XG4gIGNvbmZpZz86IHtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgbWV0aG9kPzogc3RyaW5nO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gIH07XG4gIHJlcXVlc3Q/OiB1bmtub3duO1xuICBpc0F4aW9zRXJyb3I6IHRydWU7XG59XG5cbi8qKlxuICogVHlwZWQgQVBJIGVycm9yIHdpdGggc3RhdHVzLCByZXNwb25zZSwgYW5kIEF4aW9zIGNvbXBhdGliaWxpdHkgZmxhZy5cbiAqIFJlcGxhY2VzIGBhcyBhbnlgIGNhc3RzIGluIGFwaS1jbGllbnQudHMgZXJyb3IgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlFcnJvciBleHRlbmRzIEVycm9yIGltcGxlbWVudHMgQXhpb3NFcnJvckxpa2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgaXNBeGlvc0Vycm9yID0gdHJ1ZSBhcyBjb25zdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHN0YXR1czogbnVtYmVyLFxuICAgIHB1YmxpYyByZXNwb25zZTogQXhpb3NFcnJvckxpa2VbJ3Jlc3BvbnNlJ10sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Main type definitions export
3
+ */
4
+ export * from './config';
5
+ export * from './pipeline';
6
+ export * from './plugin';
7
+ export * from './error';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ /**
20
+ * Main type definitions export
21
+ */
22
+ __exportStar(require("./config"), exports);
23
+ __exportStar(require("./pipeline"), exports);
24
+ __exportStar(require("./plugin"), exports);
25
+ __exportStar(require("./error"), exports);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEM7O0dBRUc7QUFFSCwyQ0FBeUI7QUFDekIsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBNYWluIHR5cGUgZGVmaW5pdGlvbnMgZXhwb3J0XG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3BsdWdpbic7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbiJdfQ==
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Arbitrary key-value pipeline configuration properties
3
+ * passed through to the CDK builder.
4
+ */
5
+ export type PipelineProps = Record<string, unknown>;
6
+ /**
7
+ * Pipeline visibility level.
8
+ */
9
+ export type PipelineAccessModifier = 'public' | 'private';
10
+ /**
11
+ * Core pipeline fields required on every pipeline record.
12
+ */
13
+ export interface PipelineBase {
14
+ /**
15
+ * Unique pipeline identifier
16
+ */
17
+ id: string;
18
+ /**
19
+ * Project name
20
+ */
21
+ project: string;
22
+ /**
23
+ * Organization name
24
+ */
25
+ organization: string;
26
+ /**
27
+ * Tenant identifier (from API response, used for per-org secret resolution)
28
+ */
29
+ orgId?: string;
30
+ /**
31
+ * Pipeline properties/configuration
32
+ */
33
+ props: PipelineProps;
34
+ }
35
+ /**
36
+ * Optional metadata fields attached to a pipeline record.
37
+ */
38
+ export interface PipelineMetadata {
39
+ /**
40
+ * Human-readable pipeline name
41
+ */
42
+ pipelineName?: string;
43
+ /**
44
+ * Access modifier (public or private)
45
+ */
46
+ accessModifier?: PipelineAccessModifier;
47
+ /**
48
+ * Whether this is the default pipeline
49
+ */
50
+ isDefault?: boolean;
51
+ /**
52
+ * Whether the pipeline is active
53
+ */
54
+ isActive?: boolean;
55
+ /**
56
+ * Pipeline creation timestamp
57
+ */
58
+ createdAt?: string;
59
+ /**
60
+ * Pipeline last update timestamp
61
+ */
62
+ updatedAt?: string;
63
+ /**
64
+ * User who created the pipeline
65
+ */
66
+ createdBy?: string;
67
+ /**
68
+ * User who last updated the pipeline
69
+ */
70
+ updatedBy?: string;
71
+ }
72
+ /**
73
+ * Complete pipeline entity combining core fields and metadata.
74
+ */
75
+ export interface Pipeline extends PipelineBase, PipelineMetadata {
76
+ }
77
+ /**
78
+ * Request payload for creating a new pipeline via the platform API.
79
+ */
80
+ export interface CreatePipelineRequest {
81
+ /**
82
+ * Project name
83
+ */
84
+ project: string;
85
+ /**
86
+ * Organization name
87
+ */
88
+ organization: string;
89
+ /**
90
+ * Pipeline properties/configuration
91
+ */
92
+ props: PipelineProps;
93
+ /**
94
+ * Human-readable pipeline name
95
+ */
96
+ pipelineName?: string;
97
+ /**
98
+ * Access modifier (public or private)
99
+ * @default 'private'
100
+ */
101
+ accessModifier?: PipelineAccessModifier;
102
+ /**
103
+ * Whether this is the default pipeline
104
+ * @default false
105
+ */
106
+ isDefault?: boolean;
107
+ /**
108
+ * Whether the pipeline is active
109
+ * @default true
110
+ */
111
+ isActive?: boolean;
112
+ }
113
+ /**
114
+ * Response returned by single-pipeline API endpoints (get, create).
115
+ */
116
+ export interface PipelineResponse {
117
+ pipeline: Pipeline;
118
+ }
119
+ /**
120
+ * Paginated response returned by the pipeline list API endpoint.
121
+ */
122
+ export interface PipelineListResponse {
123
+ /**
124
+ * List of pipelines
125
+ */
126
+ pipelines: Pipeline[];
127
+ /**
128
+ * Total number of pipelines (for pagination)
129
+ */
130
+ total: number;
131
+ /**
132
+ * Current page number
133
+ */
134
+ page: number;
135
+ /**
136
+ * Number of items per page
137
+ */
138
+ limit: number;
139
+ /**
140
+ * Whether there are more pages
141
+ */
142
+ hasMore: boolean;
143
+ }
144
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/types/pipeline.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,YAAY,EAAE,gBAAgB;CAAG;AAEnE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IAExC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,SAAS,EAAE,QAAQ,EAAE,CAAC;IAEtB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBBcmJpdHJhcnkga2V5LXZhbHVlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICogcGFzc2VkIHRocm91Z2ggdG8gdGhlIENESyBidWlsZGVyLlxuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZVByb3BzID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogUGlwZWxpbmUgdmlzaWJpbGl0eSBsZXZlbC5cbiAqL1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVBY2Nlc3NNb2RpZmllciA9ICdwdWJsaWMnIHwgJ3ByaXZhdGUnO1xuXG4vKipcbiAqIENvcmUgcGlwZWxpbmUgZmllbGRzIHJlcXVpcmVkIG9uIGV2ZXJ5IHBpcGVsaW5lIHJlY29yZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJhc2Uge1xuICAvKipcbiAgICogVW5pcXVlIHBpcGVsaW5lIGlkZW50aWZpZXJcbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb2plY3QgbmFtZVxuICAgKi9cbiAgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gbmFtZVxuICAgKi9cbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRlbmFudCBpZGVudGlmaWVyIChmcm9tIEFQSSByZXNwb25zZSwgdXNlZCBmb3IgcGVyLW9yZyBzZWNyZXQgcmVzb2x1dGlvbilcbiAgICovXG4gIG9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSBwcm9wZXJ0aWVzL2NvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByb3BzOiBQaXBlbGluZVByb3BzO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBhdHRhY2hlZCB0byBhIHBpcGVsaW5lIHJlY29yZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIHBpcGVsaW5lIG5hbWVcbiAgICovXG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXNzIG1vZGlmaWVyIChwdWJsaWMgb3IgcHJpdmF0ZSlcbiAgICovXG4gIGFjY2Vzc01vZGlmaWVyPzogUGlwZWxpbmVBY2Nlc3NNb2RpZmllcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIHRoZSBkZWZhdWx0IHBpcGVsaW5lXG4gICAqL1xuICBpc0RlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBhY3RpdmVcbiAgICovXG4gIGlzQWN0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGlwZWxpbmUgY3JlYXRpb24gdGltZXN0YW1wXG4gICAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIGxhc3QgdXBkYXRlIHRpbWVzdGFtcFxuICAgKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VyIHdobyBjcmVhdGVkIHRoZSBwaXBlbGluZVxuICAgKi9cbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIHBpcGVsaW5lXG4gICAqL1xuICB1cGRhdGVkQnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29tcGxldGUgcGlwZWxpbmUgZW50aXR5IGNvbWJpbmluZyBjb3JlIGZpZWxkcyBhbmQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmUgZXh0ZW5kcyBQaXBlbGluZUJhc2UsIFBpcGVsaW5lTWV0YWRhdGEge31cblxuLyoqXG4gKiBSZXF1ZXN0IHBheWxvYWQgZm9yIGNyZWF0aW5nIGEgbmV3IHBpcGVsaW5lIHZpYSB0aGUgcGxhdGZvcm0gQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBpcGVsaW5lUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IG5hbWVcbiAgICovXG4gIHByb2plY3Q6IHN0cmluZztcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIG5hbWVcbiAgICovXG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSBwcm9wZXJ0aWVzL2NvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByb3BzOiBQaXBlbGluZVByb3BzO1xuXG4gIC8qKlxuICAgKiBIdW1hbi1yZWFkYWJsZSBwaXBlbGluZSBuYW1lXG4gICAqL1xuICBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyBtb2RpZmllciAocHVibGljIG9yIHByaXZhdGUpXG4gICAqIEBkZWZhdWx0ICdwcml2YXRlJ1xuICAgKi9cbiAgYWNjZXNzTW9kaWZpZXI/OiBQaXBlbGluZUFjY2Vzc01vZGlmaWVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgcGlwZWxpbmVcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIGFjdGl2ZVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBpc0FjdGl2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzcG9uc2UgcmV0dXJuZWQgYnkgc2luZ2xlLXBpcGVsaW5lIEFQSSBlbmRwb2ludHMgKGdldCwgY3JlYXRlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVJlc3BvbnNlIHtcbiAgcGlwZWxpbmU6IFBpcGVsaW5lO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlZCByZXNwb25zZSByZXR1cm5lZCBieSB0aGUgcGlwZWxpbmUgbGlzdCBBUEkgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVMaXN0UmVzcG9uc2Uge1xuICAvKipcbiAgICogTGlzdCBvZiBwaXBlbGluZXNcbiAgICovXG4gIHBpcGVsaW5lczogUGlwZWxpbmVbXTtcblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHBpcGVsaW5lcyAoZm9yIHBhZ2luYXRpb24pXG4gICAqL1xuICB0b3RhbDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50IHBhZ2UgbnVtYmVyXG4gICAqL1xuICBwYWdlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBpdGVtcyBwZXIgcGFnZVxuICAgKi9cbiAgbGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBwYWdlc1xuICAgKi9cbiAgaGFzTW9yZTogYm9vbGVhbjtcbn1cbiJdfQ==
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Package-level metadata extracted from the plugin archive.
3
+ */
4
+ export interface PluginMetadata {
5
+ /**
6
+ * Plugin name
7
+ */
8
+ name: string;
9
+ /**
10
+ * Plugin version
11
+ */
12
+ version: string;
13
+ /**
14
+ * Plugin description
15
+ */
16
+ description?: string;
17
+ /**
18
+ * Plugin author
19
+ */
20
+ author?: string;
21
+ /**
22
+ * Plugin license
23
+ */
24
+ license?: string;
25
+ /**
26
+ * Plugin homepage URL
27
+ */
28
+ homepage?: string;
29
+ /**
30
+ * Plugin repository URL
31
+ */
32
+ repository?: string;
33
+ /**
34
+ * Plugin keywords/tags
35
+ */
36
+ keywords?: string[];
37
+ /**
38
+ * Plugin dependencies
39
+ */
40
+ dependencies?: Record<string, string>;
41
+ }
42
+ /**
43
+ * Runtime configuration for a plugin, including its entry point and schema.
44
+ */
45
+ export interface PluginConfig {
46
+ /**
47
+ * Plugin entry point
48
+ */
49
+ main?: string;
50
+ /**
51
+ * Plugin configuration schema
52
+ */
53
+ schema?: Record<string, unknown>;
54
+ /**
55
+ * Plugin default configuration
56
+ */
57
+ defaults?: Record<string, unknown>;
58
+ }
59
+ /**
60
+ * Core plugin fields required on every plugin record.
61
+ */
62
+ export interface PluginBase {
63
+ /**
64
+ * Unique plugin identifier
65
+ */
66
+ id: string;
67
+ /**
68
+ * Plugin name
69
+ */
70
+ name: string;
71
+ /**
72
+ * Plugin version
73
+ */
74
+ version: string;
75
+ /**
76
+ * Organization that owns the plugin
77
+ */
78
+ organization: string;
79
+ }
80
+ /**
81
+ * Complete plugin entity combining core fields with optional detail fields.
82
+ */
83
+ export interface Plugin extends PluginBase {
84
+ /**
85
+ * Plugin description
86
+ */
87
+ description?: string;
88
+ /**
89
+ * Plugin metadata
90
+ */
91
+ metadata?: PluginMetadata;
92
+ /**
93
+ * Plugin configuration
94
+ */
95
+ config?: PluginConfig;
96
+ /**
97
+ * Plugin file URL
98
+ */
99
+ fileUrl?: string;
100
+ /**
101
+ * Plugin file size in bytes
102
+ */
103
+ fileSize?: number;
104
+ /**
105
+ * Plugin checksum (SHA256)
106
+ */
107
+ checksum?: string;
108
+ /**
109
+ * Whether the plugin is active
110
+ */
111
+ isActive?: boolean;
112
+ /**
113
+ * Whether the plugin is public
114
+ */
115
+ isPublic?: boolean;
116
+ /**
117
+ * Plugin creation timestamp
118
+ */
119
+ createdAt?: string;
120
+ /**
121
+ * Plugin last update timestamp
122
+ */
123
+ updatedAt?: string;
124
+ /**
125
+ * User who uploaded the plugin
126
+ */
127
+ uploadedBy?: string;
128
+ }
129
+ /**
130
+ * Response returned by single-plugin API endpoints (get, upload).
131
+ */
132
+ export interface PluginResponse {
133
+ plugin: Plugin;
134
+ }
135
+ /**
136
+ * Paginated response returned by the plugin list API endpoint.
137
+ */
138
+ export interface PluginListResponse {
139
+ /**
140
+ * List of plugins
141
+ */
142
+ plugins: Plugin[];
143
+ /**
144
+ * Total number of plugins (for pagination)
145
+ */
146
+ total: number;
147
+ /**
148
+ * Current page number
149
+ */
150
+ page: number;
151
+ /**
152
+ * Number of items per page
153
+ */
154
+ limit: number;
155
+ /**
156
+ * Whether there are more pages
157
+ */
158
+ hasMore: boolean;
159
+ }
160
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBhY2thZ2UtbGV2ZWwgbWV0YWRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHBsdWdpbiBhcmNoaXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiB2ZXJzaW9uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBhdXRob3JcbiAgICovXG4gIGF1dGhvcj86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGxpY2Vuc2VcbiAgICovXG4gIGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBob21lcGFnZSBVUkxcbiAgICovXG4gIGhvbWVwYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gcmVwb3NpdG9yeSBVUkxcbiAgICovXG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBrZXl3b3Jkcy90YWdzXG4gICAqL1xuICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gZGVwZW5kZW5jaWVzXG4gICAqL1xuICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJ1bnRpbWUgY29uZmlndXJhdGlvbiBmb3IgYSBwbHVnaW4sIGluY2x1ZGluZyBpdHMgZW50cnkgcG9pbnQgYW5kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Db25maWcge1xuICAvKipcbiAgICogUGx1Z2luIGVudHJ5IHBvaW50XG4gICAqL1xuICBtYWluPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gY29uZmlndXJhdGlvbiBzY2hlbWFcbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBkZWZhdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENvcmUgcGx1Z2luIGZpZWxkcyByZXF1aXJlZCBvbiBldmVyeSBwbHVnaW4gcmVjb3JkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkJhc2Uge1xuICAvKipcbiAgICogVW5pcXVlIHBsdWdpbiBpZGVudGlmaWVyXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gdmVyc2lvblxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gdGhhdCBvd25zIHRoZSBwbHVnaW5cbiAgICovXG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBsZXRlIHBsdWdpbiBlbnRpdHkgY29tYmluaW5nIGNvcmUgZmllbGRzIHdpdGggb3B0aW9uYWwgZGV0YWlsIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBtZXRhZGF0YVxuICAgKi9cbiAgbWV0YWRhdGE/OiBQbHVnaW5NZXRhZGF0YTtcblxuICAvKipcbiAgICogUGx1Z2luIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGNvbmZpZz86IFBsdWdpbkNvbmZpZztcblxuICAvKipcbiAgICogUGx1Z2luIGZpbGUgVVJMXG4gICAqL1xuICBmaWxlVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gZmlsZSBzaXplIGluIGJ5dGVzXG4gICAqL1xuICBmaWxlU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogUGx1Z2luIGNoZWNrc3VtIChTSEEyNTYpXG4gICAqL1xuICBjaGVja3N1bT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgcHVibGljXG4gICAqL1xuICBpc1B1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBjcmVhdGlvbiB0aW1lc3RhbXBcbiAgICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGxhc3QgdXBkYXRlIHRpbWVzdGFtcFxuICAgKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VyIHdobyB1cGxvYWRlZCB0aGUgcGx1Z2luXG4gICAqL1xuICB1cGxvYWRlZEJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIHJldHVybmVkIGJ5IHNpbmdsZS1wbHVnaW4gQVBJIGVuZHBvaW50cyAoZ2V0LCB1cGxvYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJlc3BvbnNlIHtcbiAgcGx1Z2luOiBQbHVnaW47XG59XG5cbi8qKlxuICogUGFnaW5hdGVkIHJlc3BvbnNlIHJldHVybmVkIGJ5IHRoZSBwbHVnaW4gbGlzdCBBUEkgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTGlzdFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcGx1Z2luc1xuICAgKi9cbiAgcGx1Z2luczogUGx1Z2luW107XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiBwbHVnaW5zIChmb3IgcGFnaW5hdGlvbilcbiAgICovXG4gIHRvdGFsOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGFnZSBudW1iZXJcbiAgICovXG4gIHBhZ2U6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlXG4gICAqL1xuICBsaW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBhZ2VzXG4gICAqL1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,26 @@
1
+ import FormData from 'form-data';
2
+ import { Config } from './config-loader';
3
+ /**
4
+ * API Client for making HTTP requests to the platform API
5
+ */
6
+ export declare class ApiClient {
7
+ private client;
8
+ private config;
9
+ constructor(config: Config);
10
+ private handleError;
11
+ get<T = unknown>(url: string, params?: Record<string, unknown>, headers?: Record<string, string>): Promise<T>;
12
+ post<T = unknown>(url: string, data?: unknown, headers?: Record<string, string>): Promise<T>;
13
+ postForm<T = unknown>(url: string, formData: FormData, headers?: Record<string, string>): Promise<T>;
14
+ put<T = unknown>(url: string, data?: unknown, headers?: Record<string, string>): Promise<T>;
15
+ delete<T = unknown>(url: string, headers?: Record<string, string>): Promise<T>;
16
+ patch<T = unknown>(url: string, data?: unknown, headers?: Record<string, string>): Promise<T>;
17
+ getConfig(): Config;
18
+ getBaseUrl(): string;
19
+ isAuthenticated(): boolean;
20
+ /**
21
+ * Advisory check: decode JWT exp claim and warn if expired.
22
+ * Does NOT verify signature — server handles that.
23
+ */
24
+ private checkTokenExpiry;
25
+ }
26
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAwD1B,OAAO,CAAC,WAAW;IA+Cb,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK7G,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5F,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWpG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK3F,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK9E,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKnG,SAAS,IAAI,MAAM;IACnB,UAAU,IAAI,MAAM;IACpB,eAAe,IAAI,OAAO;IAE1B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAezB"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ApiClient = void 0;
9
+ const https_1 = __importDefault(require("https"));
10
+ const axios_1 = __importDefault(require("axios"));
11
+ const cli_constants_1 = require("../config/cli.constants");
12
+ const types_1 = require("../types");
13
+ const error_handler_1 = require("./error-handler");
14
+ const output_utils_1 = require("./output-utils");
15
+ /**
16
+ * API Client for making HTTP requests to the platform API
17
+ */
18
+ class ApiClient {
19
+ client;
20
+ config;
21
+ constructor(config) {
22
+ this.config = config;
23
+ if (!config.auth?.token) {
24
+ throw new Error('Authentication token is required. Set PLATFORM_TOKEN environment variable.');
25
+ }
26
+ // Warn if token appears expired (advisory — server validates authoritatively)
27
+ this.checkTokenExpiry(config.auth.token);
28
+ const httpsAgent = new https_1.default.Agent({
29
+ rejectUnauthorized: config.api.rejectUnauthorized ?? true,
30
+ });
31
+ if (config.api.rejectUnauthorized === false) {
32
+ (0, output_utils_1.printWarning)('Certificate validation is disabled');
33
+ }
34
+ this.client = axios_1.default.create({
35
+ baseURL: config.api.baseUrl,
36
+ timeout: config.api.timeout || cli_constants_1.TIMEOUTS.HTTP_REQUEST,
37
+ httpsAgent,
38
+ headers: { 'Content-Type': 'application/json' },
39
+ });
40
+ // Auth interceptor
41
+ this.client.interceptors.request.use((requestConfig) => {
42
+ requestConfig.headers.Authorization = `Bearer ${config.auth.token}`;
43
+ (0, output_utils_1.printDebug)('API Request', {
44
+ method: requestConfig.method?.toUpperCase(),
45
+ url: requestConfig.url,
46
+ baseURL: requestConfig.baseURL,
47
+ });
48
+ return requestConfig;
49
+ }, (error) => {
50
+ (0, output_utils_1.printError)('Request interceptor error', { error: error.message });
51
+ return Promise.reject(error);
52
+ });
53
+ // Response interceptor
54
+ this.client.interceptors.response.use((response) => {
55
+ (0, output_utils_1.printDebug)('API Response', {
56
+ status: response.status,
57
+ statusText: response.statusText,
58
+ url: response.config.url,
59
+ });
60
+ return response;
61
+ }, (error) => this.handleError(error));
62
+ }
63
+ handleError(error) {
64
+ if (error.response) {
65
+ const { status, statusText, data } = error.response;
66
+ const url = error.config?.url;
67
+ (0, output_utils_1.printError)('API request failed', { status, statusText, url, data });
68
+ let message = `API request failed with status ${status}`;
69
+ if (data && typeof data === 'object' && 'message' in data) {
70
+ message = data.message;
71
+ }
72
+ return Promise.reject(new types_1.ApiError(message, status, error.response));
73
+ }
74
+ else if (error.request) {
75
+ const code = error.code || 'UNKNOWN';
76
+ const url = error.config?.url;
77
+ const timeout = error.config?.timeout;
78
+ const cause = error.cause;
79
+ (0, output_utils_1.printError)('No response received from API', {
80
+ url,
81
+ timeout,
82
+ code,
83
+ ...(cause instanceof Error ? { cause: cause.message } : {}),
84
+ });
85
+ const hints = {
86
+ ECONNREFUSED: 'Server is not running or port is wrong',
87
+ ECONNRESET: 'Server closed the connection unexpectedly',
88
+ ETIMEDOUT: 'Connection timed out — server unreachable or too slow',
89
+ ENOTFOUND: 'DNS lookup failed — check the hostname in baseUrl',
90
+ ERR_BAD_REQUEST: 'Request was malformed — check the endpoint and payload',
91
+ CERT_HAS_EXPIRED: 'SSL certificate expired — use --no-verify-ssl for dev',
92
+ DEPTH_ZERO_SELF_SIGNED_CERT: 'Self-signed certificate — use --no-verify-ssl',
93
+ UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'SSL chain incomplete — use --no-verify-ssl for dev',
94
+ };
95
+ const hint = hints[code] || 'Check network connectivity and server status';
96
+ const message = `${code}: ${hint} (url: ${url})`;
97
+ return Promise.reject(new error_handler_1.NetworkError(message, url, error));
98
+ }
99
+ else {
100
+ (0, output_utils_1.printError)('API request error', { error: error.message });
101
+ return Promise.reject(error);
102
+ }
103
+ }
104
+ async get(url, params, headers) {
105
+ const response = await this.client.get(url, { params, headers });
106
+ return response.data;
107
+ }
108
+ async post(url, data, headers) {
109
+ const response = await this.client.post(url, data, { headers });
110
+ return response.data;
111
+ }
112
+ async postForm(url, formData, headers) {
113
+ const uploadTimeout = this.config.api.uploadTimeout || 15 * 60 * 1000; // default 15 minutes
114
+ const response = await this.client.post(url, formData, {
115
+ headers: { ...formData.getHeaders(), ...headers },
116
+ maxContentLength: Infinity,
117
+ maxBodyLength: Infinity,
118
+ timeout: uploadTimeout,
119
+ });
120
+ return response.data;
121
+ }
122
+ async put(url, data, headers) {
123
+ const response = await this.client.put(url, data, { headers });
124
+ return response.data;
125
+ }
126
+ async delete(url, headers) {
127
+ const response = await this.client.delete(url, { headers });
128
+ return response.data;
129
+ }
130
+ async patch(url, data, headers) {
131
+ const response = await this.client.patch(url, data, { headers });
132
+ return response.data;
133
+ }
134
+ getConfig() { return this.config; }
135
+ getBaseUrl() { return this.config.api.baseUrl; }
136
+ isAuthenticated() { return !!this.config.auth?.token; }
137
+ /**
138
+ * Advisory check: decode JWT exp claim and warn if expired.
139
+ * Does NOT verify signature — server handles that.
140
+ */
141
+ checkTokenExpiry(token) {
142
+ try {
143
+ const parts = token.split('.');
144
+ if (parts.length !== 3 || !parts[1])
145
+ return;
146
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
147
+ if (payload.exp && typeof payload.exp === 'number') {
148
+ const expiresAt = new Date(payload.exp * 1000);
149
+ if (expiresAt.getTime() < Date.now()) {
150
+ (0, output_utils_1.printWarning)(`Token expired at ${expiresAt.toISOString()} — run "pipeline-manager login" to refresh`);
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // Silently ignore decode errors — server will reject invalid tokens
156
+ }
157
+ }
158
+ }
159
+ exports.ApiClient = ApiClient;
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7Ozs7QUFFdEMsa0RBQTBCO0FBQzFCLGtEQUF5RDtBQUV6RCwyREFBbUQ7QUFDbkQsb0NBQW9DO0FBRXBDLG1EQUErQztBQUMvQyxpREFBc0U7QUFFdEU7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDWixNQUFNLENBQWdCO0lBQ3RCLE1BQU0sQ0FBUztJQUV2QixZQUFZLE1BQWM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2pDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksSUFBSTtTQUMxRCxDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDNUMsSUFBQSwyQkFBWSxFQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQztZQUN6QixPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPO1lBQzNCLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSx3QkFBUSxDQUFDLFlBQVk7WUFDcEQsVUFBVTtZQUNWLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtTQUNoRCxDQUFDLENBQUM7UUFFSCxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDbEMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNoQixhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEUsSUFBQSx5QkFBVSxFQUFDLGFBQWEsRUFBRTtnQkFDeEIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFO2dCQUMzQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUc7Z0JBQ3RCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTzthQUMvQixDQUFDLENBQUM7WUFDSCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUEseUJBQVUsRUFBQywyQkFBMkIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUNGLENBQUM7UUFFRix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDbkMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNYLElBQUEseUJBQVUsRUFBQyxjQUFjLEVBQUU7Z0JBQ3pCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO2dCQUMvQixHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHO2FBQ3pCLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsRUFDRCxDQUFDLEtBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQy9DLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWlCO1FBQ25DLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDcEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7WUFFOUIsSUFBQSx5QkFBVSxFQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVwRSxJQUFJLE9BQU8sR0FBRyxrQ0FBa0MsTUFBTSxFQUFFLENBQUM7WUFDekQsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDMUQsT0FBTyxHQUFJLElBQTRCLENBQUMsT0FBTyxDQUFDO1lBQ2xELENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxnQkFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFMUIsSUFBQSx5QkFBVSxFQUFDLCtCQUErQixFQUFFO2dCQUMxQyxHQUFHO2dCQUNILE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixHQUFHLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDNUQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxLQUFLLEdBQTJCO2dCQUNwQyxZQUFZLEVBQUUsd0NBQXdDO2dCQUN0RCxVQUFVLEVBQUUsMkNBQTJDO2dCQUN2RCxTQUFTLEVBQUUsdURBQXVEO2dCQUNsRSxTQUFTLEVBQUUsbURBQW1EO2dCQUM5RCxlQUFlLEVBQUUsd0RBQXdEO2dCQUN6RSxnQkFBZ0IsRUFBRSx1REFBdUQ7Z0JBQ3pFLDJCQUEyQixFQUFFLCtDQUErQztnQkFDNUUsK0JBQStCLEVBQUUsb0RBQW9EO2FBQ3RGLENBQUM7WUFFRixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksOENBQThDLENBQUM7WUFDM0UsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLEtBQUssSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBRWpELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLDRCQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBQSx5QkFBVSxFQUFDLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzFELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQWMsR0FBVyxFQUFFLE1BQWdDLEVBQUUsT0FBZ0M7UUFDcEcsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQWMsR0FBVyxFQUFFLElBQWMsRUFBRSxPQUFnQztRQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBYyxHQUFXLEVBQUUsUUFBa0IsRUFBRSxPQUFnQztRQUMzRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxxQkFBcUI7UUFDNUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBSSxHQUFHLEVBQUUsUUFBUSxFQUFFO1lBQ3hELE9BQU8sRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFO1lBQ2pELGdCQUFnQixFQUFFLFFBQVE7WUFDMUIsYUFBYSxFQUFFLFFBQVE7WUFDdkIsT0FBTyxFQUFFLGFBQWE7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFjLEdBQVcsRUFBRSxJQUFjLEVBQUUsT0FBZ0M7UUFDbEYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQWMsR0FBVyxFQUFFLE9BQWdDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUksR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQWMsR0FBVyxFQUFFLElBQWMsRUFBRSxPQUFnQztRQUNwRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsU0FBUyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0MsVUFBVSxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RCxlQUFlLEtBQWMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVoRTs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUNyQyxJQUFBLDJCQUFZLEVBQUMsb0JBQW9CLFNBQVMsQ0FBQyxXQUFXLEVBQUUsNENBQTRDLENBQUMsQ0FBQztnQkFDeEcsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asb0VBQW9FO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF0S0QsOEJBc0tDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSwgQXhpb3NFcnJvciB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IHsgVElNRU9VVFMgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBBcGlFcnJvciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnLWxvYWRlcic7XG5pbXBvcnQgeyBOZXR3b3JrRXJyb3IgfSBmcm9tICcuL2Vycm9yLWhhbmRsZXInO1xuaW1wb3J0IHsgcHJpbnREZWJ1ZywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMnO1xuXG4vKipcbiAqIEFQSSBDbGllbnQgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybSBBUElcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgY2xpZW50OiBBeGlvc0luc3RhbmNlO1xuICBwcml2YXRlIGNvbmZpZzogQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZy5hdXRoPy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiB0b2tlbiBpcyByZXF1aXJlZC4gU2V0IFBMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gaWYgdG9rZW4gYXBwZWFycyBleHBpcmVkIChhZHZpc29yeSDigJQgc2VydmVyIHZhbGlkYXRlcyBhdXRob3JpdGF0aXZlbHkpXG4gICAgdGhpcy5jaGVja1Rva2VuRXhwaXJ5KGNvbmZpZy5hdXRoLnRva2VuKTtcblxuICAgIGNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xuICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBjb25maWcuYXBpLnJlamVjdFVuYXV0aG9yaXplZCA/PyB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hcGkucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZSkge1xuICAgICAgcHJpbnRXYXJuaW5nKCdDZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBheGlvcy5jcmVhdGUoe1xuICAgICAgYmFzZVVSTDogY29uZmlnLmFwaS5iYXNlVXJsLFxuICAgICAgdGltZW91dDogY29uZmlnLmFwaS50aW1lb3V0IHx8IFRJTUVPVVRTLkhUVFBfUkVRVUVTVCxcbiAgICAgIGh0dHBzQWdlbnQsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9KTtcblxuICAgIC8vIEF1dGggaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXG4gICAgICAocmVxdWVzdENvbmZpZykgPT4ge1xuICAgICAgICByZXF1ZXN0Q29uZmlnLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgICAgICBwcmludERlYnVnKCdBUEkgUmVxdWVzdCcsIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RDb25maWcubWV0aG9kPy50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgIHVybDogcmVxdWVzdENvbmZpZy51cmwsXG4gICAgICAgICAgYmFzZVVSTDogcmVxdWVzdENvbmZpZy5iYXNlVVJMLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RDb25maWc7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHByaW50RXJyb3IoJ1JlcXVlc3QgaW50ZXJjZXB0b3IgZXJyb3InLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3JcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxuICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHByaW50RGVidWcoJ0FQSSBSZXNwb25zZScsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIHVybDogcmVzcG9uc2UuY29uZmlnLnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IEF4aW9zRXJyb3IpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBBeGlvc0Vycm9yKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgY29uc3QgeyBzdGF0dXMsIHN0YXR1c1RleHQsIGRhdGEgfSA9IGVycm9yLnJlc3BvbnNlO1xuICAgICAgY29uc3QgdXJsID0gZXJyb3IuY29uZmlnPy51cmw7XG5cbiAgICAgIHByaW50RXJyb3IoJ0FQSSByZXF1ZXN0IGZhaWxlZCcsIHsgc3RhdHVzLCBzdGF0dXNUZXh0LCB1cmwsIGRhdGEgfSk7XG5cbiAgICAgIGxldCBtZXNzYWdlID0gYEFQSSByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gO1xuICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UgPSAoZGF0YSBhcyB7IG1lc3NhZ2U6IHN0cmluZyB9KS5tZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEFwaUVycm9yKG1lc3NhZ2UsIHN0YXR1cywgZXJyb3IucmVzcG9uc2UpKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yLnJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBlcnJvci5jb2RlIHx8ICdVTktOT1dOJztcbiAgICAgIGNvbnN0IHVybCA9IGVycm9yLmNvbmZpZz8udXJsO1xuICAgICAgY29uc3QgdGltZW91dCA9IGVycm9yLmNvbmZpZz8udGltZW91dDtcbiAgICAgIGNvbnN0IGNhdXNlID0gZXJyb3IuY2F1c2U7XG5cbiAgICAgIHByaW50RXJyb3IoJ05vIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gQVBJJywge1xuICAgICAgICB1cmwsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIC4uLihjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8geyBjYXVzZTogY2F1c2UubWVzc2FnZSB9IDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhpbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBFQ09OTlJFRlVTRUQ6ICdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgb3IgcG9ydCBpcyB3cm9uZycsXG4gICAgICAgIEVDT05OUkVTRVQ6ICdTZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseScsXG4gICAgICAgIEVUSU1FRE9VVDogJ0Nvbm5lY3Rpb24gdGltZWQgb3V0IOKAlCBzZXJ2ZXIgdW5yZWFjaGFibGUgb3IgdG9vIHNsb3cnLFxuICAgICAgICBFTk9URk9VTkQ6ICdETlMgbG9va3VwIGZhaWxlZCDigJQgY2hlY2sgdGhlIGhvc3RuYW1lIGluIGJhc2VVcmwnLFxuICAgICAgICBFUlJfQkFEX1JFUVVFU1Q6ICdSZXF1ZXN0IHdhcyBtYWxmb3JtZWQg4oCUIGNoZWNrIHRoZSBlbmRwb2ludCBhbmQgcGF5bG9hZCcsXG4gICAgICAgIENFUlRfSEFTX0VYUElSRUQ6ICdTU0wgY2VydGlmaWNhdGUgZXhwaXJlZCDigJQgdXNlIC0tbm8tdmVyaWZ5LXNzbCBmb3IgZGV2JyxcbiAgICAgICAgREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUOiAnU2VsZi1zaWduZWQgY2VydGlmaWNhdGUg4oCUIHVzZSAtLW5vLXZlcmlmeS1zc2wnLFxuICAgICAgICBVTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFOiAnU1NMIGNoYWluIGluY29tcGxldGUg4oCUIHVzZSAtLW5vLXZlcmlmeS1zc2wgZm9yIGRldicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBoaW50ID0gaGludHNbY29kZV0gfHwgJ0NoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5IGFuZCBzZXJ2ZXIgc3RhdHVzJztcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtjb2RlfTogJHtoaW50fSAodXJsOiAke3VybH0pYDtcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBOZXR3b3JrRXJyb3IobWVzc2FnZSwgdXJsLCBlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludEVycm9yKCdBUEkgcmVxdWVzdCBlcnJvcicsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4odXJsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0PFQ+KHVybCwgeyBwYXJhbXMsIGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBwb3N0PFQgPSB1bmtub3duPih1cmw6IHN0cmluZywgZGF0YT86IHVua25vd24sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0PFQ+KHVybCwgZGF0YSwgeyBoZWFkZXJzIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgcG9zdEZvcm08VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBmb3JtRGF0YTogRm9ybURhdGEsIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgdXBsb2FkVGltZW91dCA9IHRoaXMuY29uZmlnLmFwaS51cGxvYWRUaW1lb3V0IHx8IDE1ICogNjAgKiAxMDAwOyAvLyBkZWZhdWx0IDE1IG1pbnV0ZXNcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3Q8VD4odXJsLCBmb3JtRGF0YSwge1xuICAgICAgaGVhZGVyczogeyAuLi5mb3JtRGF0YS5nZXRIZWFkZXJzKCksIC4uLmhlYWRlcnMgfSxcbiAgICAgIG1heENvbnRlbnRMZW5ndGg6IEluZmluaXR5LFxuICAgICAgbWF4Qm9keUxlbmd0aDogSW5maW5pdHksXG4gICAgICB0aW1lb3V0OiB1cGxvYWRUaW1lb3V0LFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgcHV0PFQgPSB1bmtub3duPih1cmw6IHN0cmluZywgZGF0YT86IHVua25vd24sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5wdXQ8VD4odXJsLCBkYXRhLCB7IGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH1cblxuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZGVsZXRlPFQ+KHVybCwgeyBoZWFkZXJzIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgcGF0Y2g8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBkYXRhPzogdW5rbm93biwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBhdGNoPFQ+KHVybCwgZGF0YSwgeyBoZWFkZXJzIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZyB7IHJldHVybiB0aGlzLmNvbmZpZzsgfVxuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbmZpZy5hcGkuYmFzZVVybDsgfVxuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuY29uZmlnLmF1dGg/LnRva2VuOyB9XG5cbiAgLyoqXG4gICAqIEFkdmlzb3J5IGNoZWNrOiBkZWNvZGUgSldUIGV4cCBjbGFpbSBhbmQgd2FybiBpZiBleHBpcmVkLlxuICAgKiBEb2VzIE5PVCB2ZXJpZnkgc2lnbmF0dXJlIOKAlCBzZXJ2ZXIgaGFuZGxlcyB0aGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1Rva2VuRXhwaXJ5KHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCAhcGFydHNbMV0pIHJldHVybjtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHBhcnRzWzFdLCAnYmFzZTY0dXJsJykudG9TdHJpbmcoJ3V0Zi04JykpO1xuICAgICAgaWYgKHBheWxvYWQuZXhwICYmIHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUocGF5bG9hZC5leHAgKiAxMDAwKTtcbiAgICAgICAgaWYgKGV4cGlyZXNBdC5nZXRUaW1lKCkgPCBEYXRlLm5vdygpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKGBUb2tlbiBleHBpcmVkIGF0ICR7ZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCl9IOKAlCBydW4gXCJwaXBlbGluZS1tYW5hZ2VyIGxvZ2luXCIgdG8gcmVmcmVzaGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaWxlbnRseSBpZ25vcmUgZGVjb2RlIGVycm9ycyDigJQgc2VydmVyIHdpbGwgcmVqZWN0IGludmFsaWQgdG9rZW5zXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Log a sensitive operation to the local audit file.
3
+ *
4
+ * @param command - The command name (e.g., 'store-token', 'deploy', 'bootstrap')
5
+ * @param details - Non-sensitive metadata about the operation
6
+ */
7
+ export declare function auditLog(command: string, details?: Record<string, unknown>): void;
8
+ //# sourceMappingURL=audit-log.d.ts.map