@copado/agentia-cli 0.6.0-alpha.0 → 0.7.0-alpha.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 (177) hide show
  1. package/README.md +1025 -7
  2. package/dist/commands/auth/get.d.ts +23 -0
  3. package/dist/commands/auth/get.js +73 -0
  4. package/dist/commands/auth/get.js.map +1 -0
  5. package/dist/commands/auth/set.d.ts +21 -0
  6. package/dist/commands/auth/set.js +113 -0
  7. package/dist/commands/auth/set.js.map +1 -0
  8. package/dist/commands/environment/auth/status.d.ts +13 -0
  9. package/dist/commands/environment/auth/status.js +36 -0
  10. package/dist/commands/environment/auth/status.js.map +1 -0
  11. package/dist/commands/environment/auth/web/login.d.ts +15 -0
  12. package/dist/commands/environment/auth/web/login.js +55 -0
  13. package/dist/commands/environment/auth/web/login.js.map +1 -0
  14. package/dist/commands/environment/create.d.ts +22 -0
  15. package/dist/commands/environment/create.js +41 -0
  16. package/dist/commands/environment/create.js.map +1 -0
  17. package/dist/commands/environment/get.d.ts +10 -0
  18. package/dist/commands/environment/get.js +30 -0
  19. package/dist/commands/environment/get.js.map +1 -0
  20. package/dist/commands/environment/list.d.ts +17 -0
  21. package/dist/commands/environment/list.js +69 -0
  22. package/dist/commands/environment/list.js.map +1 -0
  23. package/dist/commands/environment/update.d.ts +23 -0
  24. package/dist/commands/environment/update.js +70 -0
  25. package/dist/commands/environment/update.js.map +1 -0
  26. package/dist/commands/job/get.d.ts +14 -0
  27. package/dist/commands/job/get.js +33 -0
  28. package/dist/commands/job/get.js.map +1 -0
  29. package/dist/commands/job/kill.d.ts +14 -0
  30. package/dist/commands/job/kill.js +34 -0
  31. package/dist/commands/job/kill.js.map +1 -0
  32. package/dist/commands/job/list.d.ts +18 -0
  33. package/dist/commands/job/list.js +68 -0
  34. package/dist/commands/job/list.js.map +1 -0
  35. package/dist/commands/job/pause.d.ts +14 -0
  36. package/dist/commands/job/pause.js +34 -0
  37. package/dist/commands/job/pause.js.map +1 -0
  38. package/dist/commands/job/resume.d.ts +14 -0
  39. package/dist/commands/job/resume.js +34 -0
  40. package/dist/commands/job/resume.js.map +1 -0
  41. package/dist/commands/job/run.d.ts +15 -0
  42. package/dist/commands/job/run.js +40 -0
  43. package/dist/commands/job/run.js.map +1 -0
  44. package/dist/commands/mcp/start.d.ts +7 -0
  45. package/dist/commands/mcp/start.js +15 -0
  46. package/dist/commands/mcp/start.js.map +1 -0
  47. package/dist/commands/metadata/content/compare.d.ts +40 -0
  48. package/dist/commands/metadata/content/compare.js +127 -0
  49. package/dist/commands/metadata/content/compare.js.map +1 -0
  50. package/dist/commands/metadata/content/get.d.ts +39 -0
  51. package/dist/commands/metadata/content/get.js +158 -0
  52. package/dist/commands/metadata/content/get.js.map +1 -0
  53. package/dist/commands/metadata/dependency/list.d.ts +49 -0
  54. package/dist/commands/metadata/dependency/list.js +216 -0
  55. package/dist/commands/metadata/dependency/list.js.map +1 -0
  56. package/dist/commands/metadata/index/compare.d.ts +34 -0
  57. package/dist/commands/metadata/index/compare.js +100 -0
  58. package/dist/commands/metadata/index/compare.js.map +1 -0
  59. package/dist/commands/metadata/list.d.ts +56 -0
  60. package/dist/commands/metadata/list.js +133 -0
  61. package/dist/commands/metadata/list.js.map +1 -0
  62. package/dist/commands/metadata/refresh/deleted.d.ts +15 -0
  63. package/dist/commands/metadata/refresh/deleted.js +55 -0
  64. package/dist/commands/metadata/refresh/deleted.js.map +1 -0
  65. package/dist/commands/metadata/refresh/run.d.ts +23 -0
  66. package/dist/commands/metadata/refresh/run.js +95 -0
  67. package/dist/commands/metadata/refresh/run.js.map +1 -0
  68. package/dist/commands/metadata/refresh/status.d.ts +14 -0
  69. package/dist/commands/metadata/refresh/status.js +49 -0
  70. package/dist/commands/metadata/refresh/status.js.map +1 -0
  71. package/dist/commands/pipeline/connection/list.d.ts +12 -0
  72. package/dist/commands/pipeline/connection/list.js +39 -0
  73. package/dist/commands/pipeline/connection/list.js.map +1 -0
  74. package/dist/commands/pipeline/get.d.ts +14 -0
  75. package/dist/commands/pipeline/get.js +33 -0
  76. package/dist/commands/pipeline/get.js.map +1 -0
  77. package/dist/commands/pipeline/list.d.ts +11 -0
  78. package/dist/commands/pipeline/list.js +30 -0
  79. package/dist/commands/pipeline/list.js.map +1 -0
  80. package/dist/commands/project/default/get.d.ts +21 -0
  81. package/dist/commands/project/default/get.js +44 -0
  82. package/dist/commands/project/default/get.js.map +1 -0
  83. package/dist/commands/project/default/set.d.ts +21 -0
  84. package/dist/commands/project/default/set.js +55 -0
  85. package/dist/commands/project/default/set.js.map +1 -0
  86. package/dist/commands/project/default/unset.d.ts +21 -0
  87. package/dist/commands/project/default/unset.js +45 -0
  88. package/dist/commands/project/default/unset.js.map +1 -0
  89. package/dist/index.d.ts +1 -0
  90. package/dist/index.js +2 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/lib/agentia-command.d.ts +7 -0
  93. package/dist/lib/agentia-command.js +28 -0
  94. package/dist/lib/agentia-command.js.map +1 -0
  95. package/dist/lib/agentia-oauth-error-codes.d.ts +17 -0
  96. package/dist/lib/agentia-oauth-error-codes.js +30 -0
  97. package/dist/lib/agentia-oauth-error-codes.js.map +1 -0
  98. package/dist/lib/assert.d.ts +1 -0
  99. package/dist/lib/assert.js +7 -0
  100. package/dist/lib/assert.js.map +1 -0
  101. package/dist/lib/cicd-gateway.d.ts +57 -0
  102. package/dist/lib/cicd-gateway.js +221 -0
  103. package/dist/lib/cicd-gateway.js.map +1 -0
  104. package/dist/lib/cicd-region.d.ts +4 -0
  105. package/dist/lib/cicd-region.js +8 -0
  106. package/dist/lib/cicd-region.js.map +1 -0
  107. package/dist/lib/credential-store.d.ts +18 -0
  108. package/dist/lib/credential-store.js +43 -0
  109. package/dist/lib/credential-store.js.map +1 -0
  110. package/dist/lib/defaults-store.d.ts +12 -0
  111. package/dist/lib/defaults-store.js +142 -0
  112. package/dist/lib/defaults-store.js.map +1 -0
  113. package/dist/lib/dependency-from-changes.d.ts +6 -0
  114. package/dist/lib/dependency-from-changes.js +97 -0
  115. package/dist/lib/dependency-from-changes.js.map +1 -0
  116. package/dist/lib/environment-auth-status.d.ts +18 -0
  117. package/dist/lib/environment-auth-status.js +74 -0
  118. package/dist/lib/environment-auth-status.js.map +1 -0
  119. package/dist/lib/environment-auth.d.ts +26 -0
  120. package/dist/lib/environment-auth.js +150 -0
  121. package/dist/lib/environment-auth.js.map +1 -0
  122. package/dist/lib/environment-credential-selection.d.ts +14 -0
  123. package/dist/lib/environment-credential-selection.js +60 -0
  124. package/dist/lib/environment-credential-selection.js.map +1 -0
  125. package/dist/lib/environment-flags.d.ts +81 -0
  126. package/dist/lib/environment-flags.js +134 -0
  127. package/dist/lib/environment-flags.js.map +1 -0
  128. package/dist/lib/environment-types.d.ts +84 -0
  129. package/dist/lib/environment-types.js +52 -0
  130. package/dist/lib/environment-types.js.map +1 -0
  131. package/dist/lib/format.d.ts +5 -0
  132. package/dist/lib/format.js +8 -0
  133. package/dist/lib/format.js.map +1 -0
  134. package/dist/lib/job-types.d.ts +85 -0
  135. package/dist/lib/job-types.js +115 -0
  136. package/dist/lib/job-types.js.map +1 -0
  137. package/dist/lib/loopback-callback-server.d.ts +35 -0
  138. package/dist/lib/loopback-callback-server.js +162 -0
  139. package/dist/lib/loopback-callback-server.js.map +1 -0
  140. package/dist/lib/mcp/redaction.d.ts +2 -0
  141. package/dist/lib/mcp/redaction.js +24 -0
  142. package/dist/lib/mcp/redaction.js.map +1 -0
  143. package/dist/lib/mcp/result.d.ts +37 -0
  144. package/dist/lib/mcp/result.js +39 -0
  145. package/dist/lib/mcp/result.js.map +1 -0
  146. package/dist/lib/mcp/server.d.ts +5 -0
  147. package/dist/lib/mcp/server.js +24 -0
  148. package/dist/lib/mcp/server.js.map +1 -0
  149. package/dist/lib/mcp/tools.d.ts +235 -0
  150. package/dist/lib/mcp/tools.js +683 -0
  151. package/dist/lib/mcp/tools.js.map +1 -0
  152. package/dist/lib/metadata-common.d.ts +159 -0
  153. package/dist/lib/metadata-common.js +234 -0
  154. package/dist/lib/metadata-common.js.map +1 -0
  155. package/dist/lib/metadata-refresh.d.ts +68 -0
  156. package/dist/lib/metadata-refresh.js +104 -0
  157. package/dist/lib/metadata-refresh.js.map +1 -0
  158. package/dist/lib/open-browser.d.ts +8 -0
  159. package/dist/lib/open-browser.js +40 -0
  160. package/dist/lib/open-browser.js.map +1 -0
  161. package/dist/lib/pipeline-flags.d.ts +10 -0
  162. package/dist/lib/pipeline-flags.js +18 -0
  163. package/dist/lib/pipeline-flags.js.map +1 -0
  164. package/dist/lib/pipeline-types.d.ts +84 -0
  165. package/dist/lib/pipeline-types.js +67 -0
  166. package/dist/lib/pipeline-types.js.map +1 -0
  167. package/dist/lib/project-default-flags.d.ts +41 -0
  168. package/dist/lib/project-default-flags.js +82 -0
  169. package/dist/lib/project-default-flags.js.map +1 -0
  170. package/dist/lib/project-defaults.d.ts +23 -0
  171. package/dist/lib/project-defaults.js +51 -0
  172. package/dist/lib/project-defaults.js.map +1 -0
  173. package/dist/lib/user-context-types.d.ts +12 -0
  174. package/dist/lib/user-context-types.js +2 -0
  175. package/dist/lib/user-context-types.js.map +1 -0
  176. package/oclif.manifest.json +2315 -2
  177. package/package.json +5 -3
@@ -0,0 +1,84 @@
1
+ export declare const ENVIRONMENT_TYPES: readonly ["Production/Developer", "Sandbox", "Scratch Org", "Custom Domain"];
2
+ export type EnvironmentType = (typeof ENVIRONMENT_TYPES)[number];
3
+ export declare const DEFAULT_ENVIRONMENT_PLATFORM = "SFDX";
4
+ export declare const DEFAULT_ENVIRONMENT_TYPE: EnvironmentType;
5
+ export type EnvironmentCredential = {
6
+ createdBy?: string;
7
+ createdDate?: string;
8
+ customDomain?: null | string;
9
+ defaultCredential?: boolean;
10
+ environment?: string;
11
+ environmentName?: string;
12
+ id: string;
13
+ lastIndexRefreshDate?: null | string;
14
+ lastModifiedBy?: string;
15
+ lastModifiedDate?: string;
16
+ lastValidationDate?: string;
17
+ name?: string;
18
+ orgId?: string;
19
+ orgType?: string;
20
+ signature?: string;
21
+ username?: string;
22
+ };
23
+ export type Environment = {
24
+ apexTestLevel?: string;
25
+ createdBy?: string;
26
+ createdDate?: string;
27
+ credentials?: EnvironmentCredential[];
28
+ enableRollback?: boolean;
29
+ environmentVariables?: unknown[];
30
+ featureFlags?: Record<string, boolean>;
31
+ findAndReplaceRules?: unknown[];
32
+ id: null | string;
33
+ indexBackPromotionMetadata?: boolean;
34
+ lastModifiedBy?: string;
35
+ lastModifiedDate?: string;
36
+ lastRefreshDate?: string;
37
+ name: null | string;
38
+ namespace?: string;
39
+ orgId?: string;
40
+ platform: null | string;
41
+ promotionDefaultCredential?: string;
42
+ runLocalTests?: boolean;
43
+ runSpecifiedTests?: string;
44
+ systemProperties?: unknown[];
45
+ type: null | string;
46
+ validationPromotionDefaultCredential?: string;
47
+ };
48
+ export type EnvironmentsResponse = {
49
+ currentPage: number;
50
+ data: Environment[];
51
+ pageSize: number;
52
+ totalPages: number;
53
+ totalRecords: number;
54
+ };
55
+ export type EnvironmentMutationPayload = {
56
+ apexTestLevel?: string;
57
+ enableRollback?: boolean;
58
+ indexBackPromotionMetadata?: boolean;
59
+ name?: string;
60
+ namespace?: string;
61
+ platform?: string;
62
+ promotionDefaultCredential?: string;
63
+ runLocalTests?: boolean;
64
+ runSpecifiedTests?: string;
65
+ type?: string;
66
+ validationPromotionDefaultCredential?: string;
67
+ };
68
+ export declare function environmentEndpoint(id: string): string;
69
+ export declare function environmentCredentialAuthUrlEndpoint(environmentId: string, credentialId: string, redirectUrl: string): string;
70
+ export declare function environmentCredentialValidateEndpoint(environmentId: string, credentialId: string): string;
71
+ export type EnvironmentCredentialValidation = {
72
+ message?: string;
73
+ validated: boolean;
74
+ };
75
+ export type EnvironmentAuthStatusFormatterOptions = {
76
+ colorize?: (color: string, text: string) => string;
77
+ };
78
+ export declare function formatEnvironmentAuthStatus(result: {
79
+ credentialId: string;
80
+ credentialName: string;
81
+ message?: string;
82
+ validated: boolean;
83
+ }, options?: EnvironmentAuthStatusFormatterOptions): string;
84
+ export declare function formatEnvironmentDetail(environment: Environment): string;
@@ -0,0 +1,52 @@
1
+ import { cellValue } from './format.js';
2
+ export const ENVIRONMENT_TYPES = ['Production/Developer', 'Sandbox', 'Scratch Org', 'Custom Domain'];
3
+ export const DEFAULT_ENVIRONMENT_PLATFORM = 'SFDX';
4
+ export const DEFAULT_ENVIRONMENT_TYPE = 'Production/Developer';
5
+ export function environmentEndpoint(id) {
6
+ return `/corpus/environments/${id}`;
7
+ }
8
+ export function environmentCredentialAuthUrlEndpoint(environmentId, credentialId, redirectUrl) {
9
+ const endpoint = `/corpus/environments/${environmentId}/credentials/${credentialId}/auth-url`;
10
+ return `${endpoint}?redirectUrl=${encodeURIComponent(redirectUrl)}`;
11
+ }
12
+ export function environmentCredentialValidateEndpoint(environmentId, credentialId) {
13
+ return `/corpus/environments/${environmentId}/credentials/${credentialId}/validate`;
14
+ }
15
+ export function formatEnvironmentAuthStatus(result, options = {}) {
16
+ const colorize = options.colorize ?? ((_, text) => text);
17
+ const status = result.validated ? 'valid' : 'invalid';
18
+ const statusColor = result.validated ? 'green' : 'red';
19
+ const lines = [
20
+ `Credential ID: ${result.credentialId}`,
21
+ `Credential Name: ${result.credentialName}`,
22
+ `Status: ${colorize(statusColor, status)}`,
23
+ ];
24
+ if (typeof result.message === 'string' && result.message.trim().length > 0) {
25
+ lines.push(`Message: ${result.message}`);
26
+ }
27
+ return lines.join('\n');
28
+ }
29
+ export function formatEnvironmentDetail(environment) {
30
+ const lines = [
31
+ `ID: ${cellValue(environment.id)}`,
32
+ `Name: ${cellValue(environment.name)}`,
33
+ `Type: ${cellValue(environment.type)}`,
34
+ `Platform: ${cellValue(environment.platform)}`,
35
+ `Org ID: ${cellValue(environment.orgId)}`,
36
+ `Namespace: ${cellValue(environment.namespace)}`,
37
+ `Apex Test Level: ${cellValue(environment.apexTestLevel)}`,
38
+ `Run Local Tests: ${cellValue(environment.runLocalTests)}`,
39
+ `Run Specified Tests: ${cellValue(environment.runSpecifiedTests)}`,
40
+ `Promotion Default Credential: ${cellValue(environment.promotionDefaultCredential)}`,
41
+ `Validation Promotion Default Credential: ${cellValue(environment.validationPromotionDefaultCredential)}`,
42
+ `Index Back Promotion Metadata: ${cellValue(environment.indexBackPromotionMetadata)}`,
43
+ `Enable Rollback: ${cellValue(environment.enableRollback)}`,
44
+ `Created By: ${cellValue(environment.createdBy)}`,
45
+ `Created Date: ${cellValue(environment.createdDate)}`,
46
+ `Last Modified By: ${cellValue(environment.lastModifiedBy)}`,
47
+ `Last Modified Date: ${cellValue(environment.lastModifiedDate)}`,
48
+ `Last Refresh Date: ${cellValue(environment.lastRefreshDate)}`,
49
+ ];
50
+ return lines.join('\n');
51
+ }
52
+ //# sourceMappingURL=environment-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-types.js","sourceRoot":"","sources":["../../src/lib/environment-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cellValue(value: unknown): string;
2
+ export declare function table(headers: Array<{
3
+ alias: string;
4
+ value: string;
5
+ }>, rows: Array<Record<string, unknown>>): string;
@@ -0,0 +1,8 @@
1
+ import createTtyTable from 'tty-table';
2
+ export function cellValue(value) {
3
+ return value === null || value === undefined ? '' : String(value);
4
+ }
5
+ export function table(headers, rows) {
6
+ return createTtyTable(headers, rows).render();
7
+ }
8
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,WAAW,CAAA;AAEtC,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAA8C,EAAE,IAAoC;IACxG,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,85 @@
1
+ export declare const JOB_LIST_LIMIT_MAX = 200;
2
+ export declare const JOB_LIST_LIMIT_MIN = 1;
3
+ export type JobTemplate = {
4
+ id?: null | string;
5
+ name?: null | string;
6
+ };
7
+ export type JobStepResult = {
8
+ errorMessage?: null | string;
9
+ id?: null | string;
10
+ name?: null | string;
11
+ progressStatus?: null | string;
12
+ status?: null | string;
13
+ };
14
+ export type JobStep = {
15
+ customType?: null | string;
16
+ id?: null | string;
17
+ name?: null | string;
18
+ order?: null | number;
19
+ result?: JobStepResult | null;
20
+ resultId?: null | string;
21
+ status?: null | string;
22
+ type?: null | string;
23
+ };
24
+ export type Job = {
25
+ context?: null | string;
26
+ createdDate?: null | string;
27
+ dataJson?: null | string;
28
+ errorMessage?: null | string;
29
+ id?: null | string;
30
+ lastModifiedDate?: null | string;
31
+ name?: null | string;
32
+ parentId?: null | string;
33
+ status?: null | string;
34
+ steps?: JobStep[];
35
+ template?: JobTemplate | null;
36
+ };
37
+ export type JobListPage = {
38
+ currentPage?: number;
39
+ data?: Job[];
40
+ pageSize?: number;
41
+ totalPages?: number;
42
+ totalRecords?: number;
43
+ };
44
+ export type JobListResponse = {
45
+ data?: JobListPage;
46
+ message?: string;
47
+ status?: string;
48
+ };
49
+ export type JobResponse = {
50
+ data?: Job;
51
+ message?: string;
52
+ status?: string;
53
+ };
54
+ export type JobOperationResult = {
55
+ jobId?: null | string;
56
+ message?: null | string;
57
+ operation?: null | string;
58
+ status?: null | string;
59
+ };
60
+ export type JobOperationResponse = {
61
+ data?: JobOperationResult;
62
+ message?: string;
63
+ status?: string;
64
+ };
65
+ export type JobListFilters = {
66
+ context?: string;
67
+ id?: string;
68
+ limit?: number;
69
+ name?: string;
70
+ parent?: string;
71
+ status?: string;
72
+ type?: string;
73
+ };
74
+ export declare function jobListEndpoint(filters?: JobListFilters): string;
75
+ export declare function jobEndpoint(jobId: string): string;
76
+ export declare function jobRunEndpoint(jobId: string, restart?: boolean): string;
77
+ export declare function jobResumeEndpoint(jobId: string): string;
78
+ export declare function jobKillEndpoint(jobId: string): string;
79
+ export declare function jobPauseEndpoint(jobId: string): string;
80
+ export declare function normalizeJobs(response: Job[] | JobListPage | JobListResponse): Job[];
81
+ export declare function normalizeJob(response: Job | JobResponse): Job;
82
+ export declare function normalizeJobOperation(response: JobOperationResponse | JobOperationResult): JobOperationResult;
83
+ export declare function formatJobTable(jobs: Job[]): string;
84
+ export declare function formatJobDetail(job: Job): string;
85
+ export declare function formatJobOperationResult(result: JobOperationResult): string;
@@ -0,0 +1,115 @@
1
+ import { cellValue, table } from './format.js';
2
+ export const JOB_LIST_LIMIT_MAX = 200;
3
+ export const JOB_LIST_LIMIT_MIN = 1;
4
+ export function jobListEndpoint(filters = {}) {
5
+ const params = new URLSearchParams();
6
+ if (filters.id) {
7
+ params.set('id', filters.id);
8
+ }
9
+ if (filters.name) {
10
+ params.set('name', filters.name);
11
+ }
12
+ if (filters.type) {
13
+ params.set('type', filters.type);
14
+ }
15
+ if (filters.status) {
16
+ params.set('status', filters.status);
17
+ }
18
+ if (filters.context) {
19
+ params.set('context', filters.context);
20
+ }
21
+ if (filters.parent) {
22
+ params.set('parent', filters.parent);
23
+ }
24
+ if (filters.limit !== undefined) {
25
+ params.set('limit', String(filters.limit));
26
+ }
27
+ const query = params.toString();
28
+ return query.length > 0 ? `/release/job?${query}` : '/release/job';
29
+ }
30
+ export function jobEndpoint(jobId) {
31
+ return `/release/job/${jobId}`;
32
+ }
33
+ export function jobRunEndpoint(jobId, restart) {
34
+ if (restart) {
35
+ return `/release/job/${jobId}/run?restart=true`;
36
+ }
37
+ return `/release/job/${jobId}/run`;
38
+ }
39
+ export function jobResumeEndpoint(jobId) {
40
+ return `/release/job/${jobId}/resume`;
41
+ }
42
+ export function jobKillEndpoint(jobId) {
43
+ return `/release/job/${jobId}/kill`;
44
+ }
45
+ export function jobPauseEndpoint(jobId) {
46
+ return `/release/job/${jobId}/pause`;
47
+ }
48
+ export function normalizeJobs(response) {
49
+ if (Array.isArray(response)) {
50
+ return response;
51
+ }
52
+ if (Array.isArray(response.data)) {
53
+ return response.data;
54
+ }
55
+ if (response.data && typeof response.data === 'object' && Array.isArray(response.data.data)) {
56
+ return response.data.data;
57
+ }
58
+ return [];
59
+ }
60
+ export function normalizeJob(response) {
61
+ if ('data' in response && response.data !== undefined && typeof response.data === 'object' && !Array.isArray(response.data)) {
62
+ return response.data;
63
+ }
64
+ return response;
65
+ }
66
+ export function normalizeJobOperation(response) {
67
+ if ('data' in response && response.data !== undefined && typeof response.data === 'object' && !Array.isArray(response.data)) {
68
+ return response.data;
69
+ }
70
+ return response;
71
+ }
72
+ export function formatJobTable(jobs) {
73
+ return table([
74
+ { alias: 'ID', value: 'id' },
75
+ { alias: 'NAME', value: 'name' },
76
+ { alias: 'STATUS', value: 'status' },
77
+ { alias: 'TEMPLATE', value: 'template' },
78
+ { alias: 'PARENT ID', value: 'parentId' },
79
+ { alias: 'CREATED', value: 'createdDate' },
80
+ ], jobs.map((job) => ({
81
+ createdDate: cellValue(job.createdDate),
82
+ id: cellValue(job.id),
83
+ name: cellValue(job.name),
84
+ parentId: cellValue(job.parentId),
85
+ status: cellValue(job.status),
86
+ template: cellValue(job.template?.name),
87
+ })));
88
+ }
89
+ export function formatJobDetail(job) {
90
+ const lines = [
91
+ `ID: ${cellValue(job.id)}`,
92
+ `Name: ${cellValue(job.name)}`,
93
+ `Status: ${cellValue(job.status)}`,
94
+ `Template ID: ${cellValue(job.template?.id)}`,
95
+ `Template Name: ${cellValue(job.template?.name)}`,
96
+ `Parent ID: ${cellValue(job.parentId)}`,
97
+ `Created: ${cellValue(job.createdDate)}`,
98
+ `Last Modified: ${cellValue(job.lastModifiedDate)}`,
99
+ `Error: ${cellValue(job.errorMessage)}`,
100
+ `Steps: ${cellValue(job.steps?.length ?? 0)}`,
101
+ ];
102
+ for (const step of job.steps ?? []) {
103
+ lines.push(` Step ${cellValue(step.order)}: ${cellValue(step.name)} [${cellValue(step.status)}] type=${cellValue(step.type)} result=${cellValue(step.result?.status)}`);
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ export function formatJobOperationResult(result) {
108
+ return [
109
+ `Job ID: ${cellValue(result.jobId)}`,
110
+ `Operation: ${cellValue(result.operation)}`,
111
+ `Status: ${cellValue(result.status)}`,
112
+ `Message: ${cellValue(result.message)}`,
113
+ ].join('\n');
114
+ }
115
+ //# sourceMappingURL=job-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-types.js","sourceRoot":"","sources":["../../src/lib/job-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { createServer } from 'node:http';
2
+ export declare const DEFAULT_CALLBACK_PATH = "/callback";
3
+ export declare const DEFAULT_PORT_START = 8080;
4
+ export declare const DEFAULT_PORT_END = 8090;
5
+ export type LoopbackCallbackResult = {
6
+ errorCode?: string;
7
+ errorDescription?: string;
8
+ ok: boolean;
9
+ };
10
+ export type LoopbackCallbackServerOptions = {
11
+ callbackPath?: string;
12
+ checkPortAvailable?: (port: number, host: string) => Promise<boolean>;
13
+ createServerImpl?: typeof createServer;
14
+ host?: string;
15
+ port?: number;
16
+ portEnd?: number;
17
+ portStart?: number;
18
+ };
19
+ export type LoopbackCallbackServer = {
20
+ callbackUrl: string;
21
+ close(): Promise<void>;
22
+ port: number;
23
+ waitForCallback(options: {
24
+ timeoutMs: number;
25
+ }): Promise<LoopbackCallbackResult>;
26
+ };
27
+ export declare function defaultCheckPortAvailable(port: number, host: string): Promise<boolean>;
28
+ export declare function findAvailablePort(options: {
29
+ checkPortAvailable?: (port: number, host: string) => Promise<boolean>;
30
+ host: string;
31
+ port?: number;
32
+ portEnd?: number;
33
+ portStart?: number;
34
+ }): Promise<null | number>;
35
+ export declare function createLoopbackCallbackServer(options?: LoopbackCallbackServerOptions): Promise<LoopbackCallbackServer | null>;
@@ -0,0 +1,162 @@
1
+ import { createServer } from 'node:http';
2
+ import { createConnection } from 'node:net';
3
+ export const DEFAULT_CALLBACK_PATH = '/callback';
4
+ export const DEFAULT_PORT_START = 8080;
5
+ export const DEFAULT_PORT_END = 8090;
6
+ function parseCallbackResult(req, callbackPath) {
7
+ const url = new URL(req.url ?? '/', 'http://127.0.0.1');
8
+ if (url.pathname !== callbackPath) {
9
+ return null;
10
+ }
11
+ const errorCode = url.searchParams.get('errorCode');
12
+ if (errorCode) {
13
+ return {
14
+ errorCode,
15
+ errorDescription: url.searchParams.get('errorDescription') ?? '',
16
+ ok: false,
17
+ };
18
+ }
19
+ const status = url.searchParams.get('status');
20
+ if (status === 'error') {
21
+ const reason = url.searchParams.get('reason') ?? 'Authentication failed';
22
+ return {
23
+ errorCode: reason,
24
+ errorDescription: reason,
25
+ ok: false,
26
+ };
27
+ }
28
+ return { ok: true };
29
+ }
30
+ function successHtml() {
31
+ return `<!DOCTYPE html>
32
+ <html><body style="font-family:sans-serif;text-align:center;padding:50px;">
33
+ <h2 style="color:#2e7d32;">&#10004; Authentication Successful</h2>
34
+ <p>You can safely close this browser window and return to your terminal.</p>
35
+ </body></html>`;
36
+ }
37
+ function errorHtml(errorCode, errorDescription) {
38
+ const safeCode = escapeHtml(errorCode);
39
+ const safeDescription = escapeHtml(errorDescription || errorCode);
40
+ return `<!DOCTYPE html>
41
+ <html><body style="font-family:sans-serif;text-align:center;padding:50px;">
42
+ <h2 style="color:#c62828;">Authentication Failed</h2>
43
+ <p><strong>${safeCode}</strong></p>
44
+ <p>${safeDescription}</p>
45
+ <p>You can close this window and check your terminal for details.</p>
46
+ </body></html>`;
47
+ }
48
+ function escapeHtml(text) {
49
+ return text
50
+ .replaceAll('&', '&amp;')
51
+ .replaceAll('<', '&lt;')
52
+ .replaceAll('>', '&gt;')
53
+ .replaceAll('"', '&quot;');
54
+ }
55
+ function respondNotFound(res) {
56
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
57
+ res.end('Not Found');
58
+ }
59
+ function respondHtml(res, status, body) {
60
+ res.writeHead(status, { 'Content-Type': 'text/html; charset=utf-8' });
61
+ res.end(body);
62
+ }
63
+ export function defaultCheckPortAvailable(port, host) {
64
+ return new Promise((resolve) => {
65
+ const socket = createConnection({ host, port });
66
+ socket.once('connect', () => {
67
+ socket.destroy();
68
+ resolve(false);
69
+ });
70
+ socket.once('error', () => {
71
+ socket.destroy();
72
+ resolve(true);
73
+ });
74
+ });
75
+ }
76
+ export async function findAvailablePort(options) {
77
+ const { host } = options;
78
+ const check = options.checkPortAvailable ?? defaultCheckPortAvailable;
79
+ if (options.port !== undefined) {
80
+ return (await check(options.port, host)) ? options.port : null;
81
+ }
82
+ const start = options.portStart ?? DEFAULT_PORT_START;
83
+ const end = options.portEnd ?? DEFAULT_PORT_END;
84
+ for (let port = start; port <= end; port++) {
85
+ // Sequential probing is intentional: stop at the first available port.
86
+ // eslint-disable-next-line no-await-in-loop
87
+ if (await check(port, host)) {
88
+ return port;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ export async function createLoopbackCallbackServer(options) {
94
+ const host = options?.host ?? '127.0.0.1';
95
+ const callbackPath = options?.callbackPath ?? DEFAULT_CALLBACK_PATH;
96
+ const createSrv = options?.createServerImpl ?? createServer;
97
+ const port = await findAvailablePort({
98
+ checkPortAvailable: options?.checkPortAvailable,
99
+ host,
100
+ port: options?.port,
101
+ portEnd: options?.portEnd,
102
+ portStart: options?.portStart,
103
+ });
104
+ if (port === null) {
105
+ return null;
106
+ }
107
+ const callbackUrl = `http://localhost:${port}${callbackPath}`;
108
+ let resolveWait = null;
109
+ let settled = false;
110
+ const server = createSrv((req, res) => {
111
+ const parsed = parseCallbackResult(req, callbackPath);
112
+ if (!parsed) {
113
+ respondNotFound(res);
114
+ return;
115
+ }
116
+ if (parsed.ok) {
117
+ respondHtml(res, 200, successHtml());
118
+ }
119
+ else {
120
+ respondHtml(res, 200, errorHtml(parsed.errorCode ?? '', parsed.errorDescription ?? ''));
121
+ }
122
+ if (!settled && resolveWait) {
123
+ settled = true;
124
+ resolveWait(parsed);
125
+ }
126
+ });
127
+ await new Promise((resolve, reject) => {
128
+ server.once('error', reject);
129
+ server.listen(port, host, () => resolve());
130
+ });
131
+ return {
132
+ callbackUrl,
133
+ close() {
134
+ return new Promise((resolve, reject) => {
135
+ server.close((error) => (error ? reject(error) : resolve()));
136
+ });
137
+ },
138
+ port,
139
+ waitForCallback({ timeoutMs }) {
140
+ return new Promise((resolve, reject) => {
141
+ if (settled) {
142
+ reject(new Error('Callback already received'));
143
+ return;
144
+ }
145
+ const timer = setTimeout(() => {
146
+ if (!settled) {
147
+ settled = true;
148
+ resolveWait = null;
149
+ const error = new Error('Authentication timed out');
150
+ error.code = 'ETIMEDOUT';
151
+ reject(error);
152
+ }
153
+ }, timeoutMs);
154
+ resolveWait = (result) => {
155
+ clearTimeout(timer);
156
+ resolve(result);
157
+ };
158
+ });
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=loopback-callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-callback-server.js","sourceRoot":"","sources":["../../src/lib/loopback-callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function redactSecrets<T>(value: T): T;
2
+ export declare function redactErrorMessage(error: unknown): string;
@@ -0,0 +1,24 @@
1
+ const REDACTED = '[REDACTED]';
2
+ const SENSITIVE_KEY_PATTERN = /(access.?token|refresh.?token|session.?id|api.?key|apikey|password|secret|authorization|bearer)/i;
3
+ const BEARER_VALUE_PATTERN = /Bearer\s+[\w.~+/=-]+/gi;
4
+ export function redactSecrets(value) {
5
+ if (Array.isArray(value)) {
6
+ return value.map((item) => redactSecrets(item));
7
+ }
8
+ if (value && typeof value === 'object') {
9
+ const result = {};
10
+ for (const [key, nested] of Object.entries(value)) {
11
+ result[key] = SENSITIVE_KEY_PATTERN.test(key) ? REDACTED : redactSecrets(nested);
12
+ }
13
+ return result;
14
+ }
15
+ if (typeof value === 'string') {
16
+ return value.replaceAll(BEARER_VALUE_PATTERN, `Bearer ${REDACTED}`);
17
+ }
18
+ return value;
19
+ }
20
+ export function redactErrorMessage(error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ return redactSecrets(message);
23
+ }
24
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../../src/lib/mcp/redaction.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,YAAY,CAAA;AAE7B,MAAM,qBAAqB,GACzB,kGAAkG,CAAA;AACpG,MAAM,oBAAoB,GAAG,wBAAwB,CAAA;AAErD,MAAM,UAAU,aAAa,CAAI,KAAQ;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAiB,CAAA;IACjE,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAA4B,EAAE,CAAA;QAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC;QAED,OAAO,MAAW,CAAA;IACpB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,oBAAoB,EAAE,UAAU,QAAQ,EAAE,CAAiB,CAAA;IACrF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export declare function toolResult(data: Record<string, unknown>): {
2
+ content: {
3
+ text: string;
4
+ type: "text";
5
+ }[];
6
+ structuredContent: Record<string, unknown>;
7
+ };
8
+ export declare function toolError(error: unknown): {
9
+ content: {
10
+ text: string;
11
+ type: "text";
12
+ }[];
13
+ isError: boolean;
14
+ structuredContent: {
15
+ error: {
16
+ message: string;
17
+ };
18
+ };
19
+ };
20
+ export declare function safelyHandleTool(handler: () => Promise<Record<string, unknown>>): Promise<{
21
+ content: {
22
+ text: string;
23
+ type: "text";
24
+ }[];
25
+ structuredContent: Record<string, unknown>;
26
+ } | {
27
+ content: {
28
+ text: string;
29
+ type: "text";
30
+ }[];
31
+ isError: boolean;
32
+ structuredContent: {
33
+ error: {
34
+ message: string;
35
+ };
36
+ };
37
+ }>;