bktide 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.
- package/README.md +145 -0
- package/WORKFLOW_README.md +65 -0
- package/bin/alfred-entrypoint +54 -0
- package/dist/commands/BaseCommand.js +159 -0
- package/dist/commands/BaseCommand.js.map +1 -0
- package/dist/commands/BaseCommandHandler.js +80 -0
- package/dist/commands/BaseCommandHandler.js.map +1 -0
- package/dist/commands/BuildCommandHandler.js +28 -0
- package/dist/commands/BuildCommandHandler.js.map +1 -0
- package/dist/commands/HelloCommandHandler.js +6 -0
- package/dist/commands/HelloCommandHandler.js.map +1 -0
- package/dist/commands/ListAnnotations.js +60 -0
- package/dist/commands/ListAnnotations.js.map +1 -0
- package/dist/commands/ListBuilds.js +137 -0
- package/dist/commands/ListBuilds.js.map +1 -0
- package/dist/commands/ListOrganizations.js +27 -0
- package/dist/commands/ListOrganizations.js.map +1 -0
- package/dist/commands/ListPipelines.js +114 -0
- package/dist/commands/ListPipelines.js.map +1 -0
- package/dist/commands/ManageToken.js +180 -0
- package/dist/commands/ManageToken.js.map +1 -0
- package/dist/commands/OrganizationCommandHandler.js +53 -0
- package/dist/commands/OrganizationCommandHandler.js.map +1 -0
- package/dist/commands/PipelineCommandHandler.js +142 -0
- package/dist/commands/PipelineCommandHandler.js.map +1 -0
- package/dist/commands/ShowViewer.js +26 -0
- package/dist/commands/ShowViewer.js.map +1 -0
- package/dist/commands/UserBuildsCommandHandler.js +61 -0
- package/dist/commands/UserBuildsCommandHandler.js.map +1 -0
- package/dist/commands/ViewerBuildsCommandHandler.js +176 -0
- package/dist/commands/ViewerBuildsCommandHandler.js.map +1 -0
- package/dist/commands/ViewerCommandHandler.js +46 -0
- package/dist/commands/ViewerCommandHandler.js.map +1 -0
- package/dist/commands/index.js +8 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/formatters/BaseFormatter.js +14 -0
- package/dist/formatters/BaseFormatter.js.map +1 -0
- package/dist/formatters/FormatterFactory.js +48 -0
- package/dist/formatters/FormatterFactory.js.map +1 -0
- package/dist/formatters/annotations/Formatter.js +10 -0
- package/dist/formatters/annotations/Formatter.js.map +1 -0
- package/dist/formatters/annotations/JsonFormatter.js +20 -0
- package/dist/formatters/annotations/JsonFormatter.js.map +1 -0
- package/dist/formatters/annotations/PlainTextFormatter.js +35 -0
- package/dist/formatters/annotations/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/annotations/index.js +23 -0
- package/dist/formatters/annotations/index.js.map +1 -0
- package/dist/formatters/builds/AlfredFormatter.js +135 -0
- package/dist/formatters/builds/AlfredFormatter.js.map +1 -0
- package/dist/formatters/builds/Formatter.js +10 -0
- package/dist/formatters/builds/Formatter.js.map +1 -0
- package/dist/formatters/builds/JsonFormatter.js +44 -0
- package/dist/formatters/builds/JsonFormatter.js.map +1 -0
- package/dist/formatters/builds/PlainTextFormatter.js +113 -0
- package/dist/formatters/builds/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/builds/index.js +26 -0
- package/dist/formatters/builds/index.js.map +1 -0
- package/dist/formatters/errors/AlfredFormatter.js +110 -0
- package/dist/formatters/errors/AlfredFormatter.js.map +1 -0
- package/dist/formatters/errors/Formatter.js +98 -0
- package/dist/formatters/errors/Formatter.js.map +1 -0
- package/dist/formatters/errors/JsonFormatter.js +63 -0
- package/dist/formatters/errors/JsonFormatter.js.map +1 -0
- package/dist/formatters/errors/PlainTextFormatter.js +52 -0
- package/dist/formatters/errors/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/errors/index.js +26 -0
- package/dist/formatters/errors/index.js.map +1 -0
- package/dist/formatters/index.js +9 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/organizations/Formatter.js +10 -0
- package/dist/formatters/organizations/Formatter.js.map +1 -0
- package/dist/formatters/organizations/JsonFormatter.js +16 -0
- package/dist/formatters/organizations/JsonFormatter.js.map +1 -0
- package/dist/formatters/organizations/PlainTextFormatter.js +15 -0
- package/dist/formatters/organizations/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/organizations/index.js +21 -0
- package/dist/formatters/organizations/index.js.map +1 -0
- package/dist/formatters/pipelines/AlfredFormatter.js +42 -0
- package/dist/formatters/pipelines/AlfredFormatter.js.map +1 -0
- package/dist/formatters/pipelines/Formatter.js +10 -0
- package/dist/formatters/pipelines/Formatter.js.map +1 -0
- package/dist/formatters/pipelines/JsonFormatter.js +13 -0
- package/dist/formatters/pipelines/JsonFormatter.js.map +1 -0
- package/dist/formatters/pipelines/PlainTextFormatter.js +47 -0
- package/dist/formatters/pipelines/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/pipelines/index.js +28 -0
- package/dist/formatters/pipelines/index.js.map +1 -0
- package/dist/formatters/token/AlfredFormatter.js +191 -0
- package/dist/formatters/token/AlfredFormatter.js.map +1 -0
- package/dist/formatters/token/Formatter.js +13 -0
- package/dist/formatters/token/Formatter.js.map +1 -0
- package/dist/formatters/token/JsonFormatter.js +211 -0
- package/dist/formatters/token/JsonFormatter.js.map +1 -0
- package/dist/formatters/token/PlainTextFormatter.js +184 -0
- package/dist/formatters/token/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/token/index.js +26 -0
- package/dist/formatters/token/index.js.map +1 -0
- package/dist/formatters/viewer/Formatter.js +10 -0
- package/dist/formatters/viewer/Formatter.js.map +1 -0
- package/dist/formatters/viewer/JsonFormatter.js +20 -0
- package/dist/formatters/viewer/JsonFormatter.js.map +1 -0
- package/dist/formatters/viewer/PlainTextFormatter.js +20 -0
- package/dist/formatters/viewer/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/viewer/index.js +21 -0
- package/dist/formatters/viewer/index.js.map +1 -0
- package/dist/graphql/generated/fragment-masking.js +17 -0
- package/dist/graphql/generated/fragment-masking.js.map +1 -0
- package/dist/graphql/generated/gql.js +13 -0
- package/dist/graphql/generated/gql.js.map +1 -0
- package/dist/graphql/generated/graphql.js +852 -0
- package/dist/graphql/generated/graphql.js.map +1 -0
- package/dist/graphql/generated/index.js +3 -0
- package/dist/graphql/generated/index.js.map +1 -0
- package/dist/graphql/generated/sdk.js +872 -0
- package/dist/graphql/generated/sdk.js.map +1 -0
- package/dist/graphql/queries.js +138 -0
- package/dist/graphql/queries.js.map +1 -0
- package/dist/index.js +271 -0
- package/dist/index.js.map +1 -0
- package/dist/services/BuildkiteClient.js +520 -0
- package/dist/services/BuildkiteClient.js.map +1 -0
- package/dist/services/BuildkiteRestClient.js +244 -0
- package/dist/services/BuildkiteRestClient.js.map +1 -0
- package/dist/services/CacheManager.js +221 -0
- package/dist/services/CacheManager.js.map +1 -0
- package/dist/services/CredentialManager.js +158 -0
- package/dist/services/CredentialManager.js.map +1 -0
- package/dist/services/EnhancedBuildkiteClient.js +297 -0
- package/dist/services/EnhancedBuildkiteClient.js.map +1 -0
- package/dist/services/logger.js +107 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/types/buildkite.js +5 -0
- package/dist/types/buildkite.js.map +1 -0
- package/dist/types/credentials.js +2 -0
- package/dist/types/credentials.js.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/cli-error-handler.js +172 -0
- package/dist/utils/cli-error-handler.js.map +1 -0
- package/dist/utils/errorUtils.js +59 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/parseBuildRef.js +31 -0
- package/dist/utils/parseBuildRef.js.map +1 -0
- package/dist/utils/textFormatter.js +53 -0
- package/dist/utils/textFormatter.js.map +1 -0
- package/dist/utils/xdgPaths.js +95 -0
- package/dist/utils/xdgPaths.js.map +1 -0
- package/env.example +66 -0
- package/icons/README.md +68 -0
- package/icons/blocked.png +0 -0
- package/icons/buildkite.png +0 -0
- package/icons/failed.png +0 -0
- package/icons/failing.png +0 -0
- package/icons/passed.png +0 -0
- package/icons/running.png +0 -0
- package/icons/scheduled.png +0 -0
- package/icons/skipped.png +0 -0
- package/icons/unknown.png +0 -0
- package/info.plist +734 -0
- package/package.json +87 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { BaseTokenFormatter } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Alfred formatter for tokens
|
|
4
|
+
*/
|
|
5
|
+
export class AlfredFormatter extends BaseTokenFormatter {
|
|
6
|
+
name = 'alfred';
|
|
7
|
+
/**
|
|
8
|
+
* Format token status information for Alfred
|
|
9
|
+
*
|
|
10
|
+
* @param status The token status information
|
|
11
|
+
* @returns Formatted token status message for Alfred
|
|
12
|
+
*/
|
|
13
|
+
formatTokenStatus(status) {
|
|
14
|
+
const items = this.formatTokenStatusAsItems(status);
|
|
15
|
+
return JSON.stringify({ items });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format token storage result for Alfred
|
|
19
|
+
*
|
|
20
|
+
* @param success Whether the token was successfully stored
|
|
21
|
+
* @returns Formatted token storage result message for Alfred
|
|
22
|
+
*/
|
|
23
|
+
formatTokenStorageResult(success) {
|
|
24
|
+
const items = [{
|
|
25
|
+
title: success ? 'Token Stored Successfully' : 'Failed to Store Token',
|
|
26
|
+
subtitle: success ? 'Token was saved to system keychain' : 'Could not save token to system keychain',
|
|
27
|
+
icon: this.getIcon(success),
|
|
28
|
+
arg: success ? 'token:stored' : 'token:store-failed'
|
|
29
|
+
}];
|
|
30
|
+
return JSON.stringify({ items });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format token reset result for Alfred
|
|
34
|
+
*
|
|
35
|
+
* @param success Whether the token was successfully reset
|
|
36
|
+
* @param hadToken Whether there was a token before reset
|
|
37
|
+
* @returns Formatted token reset result message for Alfred
|
|
38
|
+
*/
|
|
39
|
+
formatTokenResetResult(success, hadToken) {
|
|
40
|
+
const items = [{
|
|
41
|
+
title: success ? 'Token Reset Successfully' : 'Failed to Reset Token',
|
|
42
|
+
subtitle: success
|
|
43
|
+
? hadToken
|
|
44
|
+
? 'Token was removed from system keychain'
|
|
45
|
+
: 'No token was present to reset'
|
|
46
|
+
: 'Could not remove token from system keychain',
|
|
47
|
+
icon: this.getIcon(success),
|
|
48
|
+
arg: success ? 'token:reset' : 'token:reset-failed'
|
|
49
|
+
}];
|
|
50
|
+
return JSON.stringify({ items });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Format token validation error for Alfred
|
|
54
|
+
*
|
|
55
|
+
* @param validation The validation status for each API
|
|
56
|
+
* @returns Formatted token validation error message for Alfred
|
|
57
|
+
*/
|
|
58
|
+
formatTokenValidationError(validation) {
|
|
59
|
+
const items = this.formatTokenValidationStatusAsItems(validation);
|
|
60
|
+
return JSON.stringify({ items });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Format token validation status for Alfred
|
|
64
|
+
*
|
|
65
|
+
* @param validation The validation status for each API
|
|
66
|
+
* @returns Formatted token validation status message for Alfred
|
|
67
|
+
*/
|
|
68
|
+
formatTokenValidationStatus(validation) {
|
|
69
|
+
const items = this.formatTokenValidationStatusAsItems(validation);
|
|
70
|
+
return JSON.stringify({ items });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format error message(s) for Alfred
|
|
74
|
+
*
|
|
75
|
+
* @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')
|
|
76
|
+
* @param error The error that occurred, or an array of errors
|
|
77
|
+
* @returns Formatted error message(s) for Alfred
|
|
78
|
+
*/
|
|
79
|
+
formatError(operation, error) {
|
|
80
|
+
const errors = Array.isArray(error) ? error : [error];
|
|
81
|
+
const items = errors.map(err => ({
|
|
82
|
+
title: `Error during ${operation}`,
|
|
83
|
+
subtitle: err instanceof Error ? err.message : String(err),
|
|
84
|
+
icon: this.getIcon(false),
|
|
85
|
+
arg: `error:${operation}`
|
|
86
|
+
}));
|
|
87
|
+
return JSON.stringify({ items });
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format authentication error message(s) for Alfred
|
|
91
|
+
*
|
|
92
|
+
* @param operation The authentication operation that failed (e.g., 'storing', 'validating')
|
|
93
|
+
* @param error The authentication error that occurred, or an array of errors
|
|
94
|
+
* @returns Formatted authentication error message(s) for Alfred
|
|
95
|
+
*/
|
|
96
|
+
formatAuthErrors(operation, error) {
|
|
97
|
+
const errors = Array.isArray(error) ? error : [error];
|
|
98
|
+
const items = errors.map(err => ({
|
|
99
|
+
title: `Authentication Error during ${operation}`,
|
|
100
|
+
subtitle: err instanceof Error ? err.message : String(err),
|
|
101
|
+
icon: this.getIcon(false),
|
|
102
|
+
arg: `auth-error:${operation}`
|
|
103
|
+
}));
|
|
104
|
+
return JSON.stringify({ items });
|
|
105
|
+
}
|
|
106
|
+
getIcon(isValid) {
|
|
107
|
+
return isValid ? '✅' : '❌';
|
|
108
|
+
}
|
|
109
|
+
formatTokenStatusAsItems(status) {
|
|
110
|
+
const items = [];
|
|
111
|
+
// Add token status item
|
|
112
|
+
items.push({
|
|
113
|
+
title: `Token Status: ${status.hasToken ? 'Present' : 'Not Present'}`,
|
|
114
|
+
subtitle: status.hasToken ? 'Token is stored in system keychain' : 'No token found in system keychain',
|
|
115
|
+
icon: this.getIcon(status.hasToken),
|
|
116
|
+
arg: status.hasToken ? 'token:present' : 'token:not-present'
|
|
117
|
+
});
|
|
118
|
+
if (status.hasToken) {
|
|
119
|
+
// Add overall validity item
|
|
120
|
+
items.push({
|
|
121
|
+
title: `Valid: ${status.isValid ? 'Yes' : 'No'}`,
|
|
122
|
+
subtitle: status.isValid ? 'Token is valid for all required APIs' : 'Token has limited access',
|
|
123
|
+
icon: this.getIcon(status.isValid),
|
|
124
|
+
arg: status.isValid ? 'token:valid' : 'token:invalid'
|
|
125
|
+
});
|
|
126
|
+
if (status.validation.canListOrganizations) {
|
|
127
|
+
// Add organization status items
|
|
128
|
+
Object.entries(status.validation.organizations).forEach(([org, orgStatus]) => {
|
|
129
|
+
const isValid = orgStatus.graphql && orgStatus.builds && orgStatus.organizations;
|
|
130
|
+
const invalidApis = [];
|
|
131
|
+
if (!orgStatus.graphql)
|
|
132
|
+
invalidApis.push('GraphQL');
|
|
133
|
+
if (!orgStatus.builds)
|
|
134
|
+
invalidApis.push('Builds');
|
|
135
|
+
if (!orgStatus.organizations)
|
|
136
|
+
invalidApis.push('Organizations');
|
|
137
|
+
items.push({
|
|
138
|
+
title: `Organization: ${org}`,
|
|
139
|
+
subtitle: isValid
|
|
140
|
+
? 'Full access to all APIs'
|
|
141
|
+
: `Limited access: ${invalidApis.join(', ')}`,
|
|
142
|
+
icon: this.getIcon(isValid),
|
|
143
|
+
arg: isValid ? `org:${org}:valid` : `org:${org}:invalid`
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
items.push({
|
|
149
|
+
title: 'Cannot list organizations',
|
|
150
|
+
subtitle: 'Token may be invalid or lacks necessary permissions',
|
|
151
|
+
icon: this.getIcon(false),
|
|
152
|
+
arg: 'token:no-org-access'
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return items;
|
|
157
|
+
}
|
|
158
|
+
formatTokenValidationStatusAsItems(validation) {
|
|
159
|
+
const items = [];
|
|
160
|
+
if (!validation.canListOrganizations) {
|
|
161
|
+
items.push({
|
|
162
|
+
title: 'Cannot list organizations',
|
|
163
|
+
subtitle: 'Token may be invalid or lacks necessary permissions',
|
|
164
|
+
icon: this.getIcon(false),
|
|
165
|
+
arg: 'token:no-org-access'
|
|
166
|
+
});
|
|
167
|
+
return items;
|
|
168
|
+
}
|
|
169
|
+
// Add organization status items
|
|
170
|
+
Object.entries(validation.organizations).forEach(([org, orgStatus]) => {
|
|
171
|
+
const isValid = orgStatus.graphql && orgStatus.builds && orgStatus.organizations;
|
|
172
|
+
const invalidApis = [];
|
|
173
|
+
if (!orgStatus.graphql)
|
|
174
|
+
invalidApis.push('GraphQL');
|
|
175
|
+
if (!orgStatus.builds)
|
|
176
|
+
invalidApis.push('Builds');
|
|
177
|
+
if (!orgStatus.organizations)
|
|
178
|
+
invalidApis.push('Organizations');
|
|
179
|
+
items.push({
|
|
180
|
+
title: `Organization: ${org}`,
|
|
181
|
+
subtitle: isValid
|
|
182
|
+
? 'Full access to all APIs'
|
|
183
|
+
: `Limited access: ${invalidApis.join(', ')}`,
|
|
184
|
+
icon: this.getIcon(isValid),
|
|
185
|
+
arg: isValid ? `org:${org}:valid` : `org:${org}:invalid`
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
return items;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=AlfredFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlfredFormatter.js","sourceRoot":"/","sources":["formatters/token/AlfredFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { TokenStatus, TokenValidationStatus } from '../../types/credentials.js';\nimport { BaseTokenFormatter } from './Formatter.js';\n\ninterface AlfredItem {\n title: string;\n subtitle: string;\n icon: string;\n arg: string;\n}\n\n/**\n * Alfred formatter for tokens\n */\nexport class AlfredFormatter extends BaseTokenFormatter {\n name = 'alfred';\n\n /**\n * Format token status information for Alfred\n * \n * @param status The token status information\n * @returns Formatted token status message for Alfred\n */\n formatTokenStatus(status: TokenStatus): string {\n const items = this.formatTokenStatusAsItems(status);\n return JSON.stringify({ items });\n }\n\n /**\n * Format token storage result for Alfred\n * \n * @param success Whether the token was successfully stored\n * @returns Formatted token storage result message for Alfred\n */\n formatTokenStorageResult(success: boolean): string {\n const items: AlfredItem[] = [{\n title: success ? 'Token Stored Successfully' : 'Failed to Store Token',\n subtitle: success ? 'Token was saved to system keychain' : 'Could not save token to system keychain',\n icon: this.getIcon(success),\n arg: success ? 'token:stored' : 'token:store-failed'\n }];\n return JSON.stringify({ items });\n }\n\n /**\n * Format token reset result for Alfred\n * \n * @param success Whether the token was successfully reset\n * @param hadToken Whether there was a token before reset\n * @returns Formatted token reset result message for Alfred\n */\n formatTokenResetResult(success: boolean, hadToken: boolean): string {\n const items: AlfredItem[] = [{\n title: success ? 'Token Reset Successfully' : 'Failed to Reset Token',\n subtitle: success \n ? hadToken \n ? 'Token was removed from system keychain' \n : 'No token was present to reset'\n : 'Could not remove token from system keychain',\n icon: this.getIcon(success),\n arg: success ? 'token:reset' : 'token:reset-failed'\n }];\n return JSON.stringify({ items });\n }\n\n /**\n * Format token validation error for Alfred\n * \n * @param validation The validation status for each API\n * @returns Formatted token validation error message for Alfred\n */\n formatTokenValidationError(validation: TokenValidationStatus): string {\n const items = this.formatTokenValidationStatusAsItems(validation);\n return JSON.stringify({ items });\n }\n\n /**\n * Format token validation status for Alfred\n * \n * @param validation The validation status for each API\n * @returns Formatted token validation status message for Alfred\n */\n formatTokenValidationStatus(validation: TokenValidationStatus): string {\n const items = this.formatTokenValidationStatusAsItems(validation);\n return JSON.stringify({ items });\n }\n\n /**\n * Format error message(s) for Alfred\n * \n * @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')\n * @param error The error that occurred, or an array of errors\n * @returns Formatted error message(s) for Alfred\n */\n formatError(operation: string, error: unknown | unknown[]): string {\n const errors = Array.isArray(error) ? error : [error];\n const items: AlfredItem[] = errors.map(err => ({\n title: `Error during ${operation}`,\n subtitle: err instanceof Error ? err.message : String(err),\n icon: this.getIcon(false),\n arg: `error:${operation}`\n }));\n return JSON.stringify({ items });\n }\n\n /**\n * Format authentication error message(s) for Alfred\n * \n * @param operation The authentication operation that failed (e.g., 'storing', 'validating')\n * @param error The authentication error that occurred, or an array of errors\n * @returns Formatted authentication error message(s) for Alfred\n */\n formatAuthErrors(operation: string, error: unknown | unknown[]): string {\n const errors = Array.isArray(error) ? error : [error];\n const items: AlfredItem[] = errors.map(err => ({\n title: `Authentication Error during ${operation}`,\n subtitle: err instanceof Error ? err.message : String(err),\n icon: this.getIcon(false),\n arg: `auth-error:${operation}`\n }));\n return JSON.stringify({ items });\n }\n\n private getIcon(isValid: boolean): string {\n return isValid ? '✅' : '❌';\n }\n\n private formatTokenStatusAsItems(status: TokenStatus): AlfredItem[] {\n const items: AlfredItem[] = [];\n \n // Add token status item\n items.push({\n title: `Token Status: ${status.hasToken ? 'Present' : 'Not Present'}`,\n subtitle: status.hasToken ? 'Token is stored in system keychain' : 'No token found in system keychain',\n icon: this.getIcon(status.hasToken),\n arg: status.hasToken ? 'token:present' : 'token:not-present'\n });\n\n if (status.hasToken) {\n // Add overall validity item\n items.push({\n title: `Valid: ${status.isValid ? 'Yes' : 'No'}`,\n subtitle: status.isValid ? 'Token is valid for all required APIs' : 'Token has limited access',\n icon: this.getIcon(status.isValid),\n arg: status.isValid ? 'token:valid' : 'token:invalid'\n });\n\n if (status.validation.canListOrganizations) {\n // Add organization status items\n Object.entries(status.validation.organizations).forEach(([org, orgStatus]) => {\n const isValid = orgStatus.graphql && orgStatus.builds && orgStatus.organizations;\n const invalidApis = [];\n if (!orgStatus.graphql) invalidApis.push('GraphQL');\n if (!orgStatus.builds) invalidApis.push('Builds');\n if (!orgStatus.organizations) invalidApis.push('Organizations');\n \n items.push({\n title: `Organization: ${org}`,\n subtitle: isValid \n ? 'Full access to all APIs'\n : `Limited access: ${invalidApis.join(', ')}`,\n icon: this.getIcon(isValid),\n arg: isValid ? `org:${org}:valid` : `org:${org}:invalid`\n });\n });\n } else {\n items.push({\n title: 'Cannot list organizations',\n subtitle: 'Token may be invalid or lacks necessary permissions',\n icon: this.getIcon(false),\n arg: 'token:no-org-access'\n });\n }\n }\n\n return items;\n }\n\n private formatTokenValidationStatusAsItems(validation: TokenValidationStatus): AlfredItem[] {\n const items: AlfredItem[] = [];\n\n if (!validation.canListOrganizations) {\n items.push({\n title: 'Cannot list organizations',\n subtitle: 'Token may be invalid or lacks necessary permissions',\n icon: this.getIcon(false),\n arg: 'token:no-org-access'\n });\n return items;\n }\n\n // Add organization status items\n Object.entries(validation.organizations).forEach(([org, orgStatus]) => {\n const isValid = orgStatus.graphql && orgStatus.builds && orgStatus.organizations;\n const invalidApis = [];\n if (!orgStatus.graphql) invalidApis.push('GraphQL');\n if (!orgStatus.builds) invalidApis.push('Builds');\n if (!orgStatus.organizations) invalidApis.push('Organizations');\n \n items.push({\n title: `Organization: ${org}`,\n subtitle: isValid \n ? 'Full access to all APIs'\n : `Limited access: ${invalidApis.join(', ')}`,\n icon: this.getIcon(isValid),\n arg: isValid ? `org:${org}:valid` : `org:${org}:invalid`\n });\n });\n\n return items;\n }\n} "]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { logger } from '../../services/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base class for token formatters
|
|
4
|
+
*/
|
|
5
|
+
export class BaseTokenFormatter {
|
|
6
|
+
format(data, formatFn, options) {
|
|
7
|
+
if (options?.debug) {
|
|
8
|
+
logger.debug(`Formatting with ${this.name} formatter`);
|
|
9
|
+
}
|
|
10
|
+
return formatFn(data, options);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Formatter.js","sourceRoot":"/","sources":["formatters/token/Formatter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAwFlD;;GAEG;AACH,MAAM,OAAgB,kBAAkB;IAkCtC,MAAM,CAAI,IAAS,EAAE,QAA2D,EAAE,OAA0B;QAC1G,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["import { BaseFormatter as BaseFormatterInterface, FormatterOptions } from '../BaseFormatter.js';\nimport { logger } from '../../services/logger.js';\nimport { TokenStatus, TokenValidationStatus } from '../../types/credentials.js';\n\n/**\n * Additional options specific to token formatting\n */\nexport interface TokenFormatterOptions extends FormatterOptions {\n // Add any token-specific options here\n}\n\n/**\n * Interface for token formatters\n */\nexport interface TokenFormatter extends BaseFormatterInterface {\n /**\n * Format token status information\n * @param status The token status information\n * @param options Formatting options\n * @returns Formatted token status message\n */\n formatTokenStatus(status: TokenStatus): string;\n\n /**\n * Format token storage result\n * @param success Whether the token was successfully stored\n * @param options Formatting options\n * @returns Formatted token storage result message\n */\n formatTokenStorageResult(success: boolean): string;\n\n /**\n * Format token reset result\n * @param success Whether the token was successfully reset\n * @param hadToken Whether there was a token before reset\n * @param options Formatting options\n * @returns Formatted token reset result message\n */\n formatTokenResetResult(success: boolean, hadToken: boolean): string;\n\n /**\n * Format token validation error\n * @param validation The validation status for each API\n * @param options Formatting options\n * @returns Formatted token validation error message\n */\n formatTokenValidationError(\n validation: TokenValidationStatus,\n options?: TokenFormatterOptions\n ): string;\n\n /**\n * Format token validation status\n * @param validation The validation status for each API\n * @param options Formatting options\n * @returns Formatted token validation status message\n */\n formatTokenValidationStatus(\n validation: TokenValidationStatus,\n options?: TokenFormatterOptions\n ): string;\n\n /**\n * Format error message(s)\n * @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')\n * @param error The error that occurred, or an array of errors\n * @param options Formatting options\n * @returns Formatted error message(s)\n */\n formatError(\n operation: string,\n error: unknown | unknown[],\n options?: TokenFormatterOptions\n ): string;\n\n /**\n * Format authentication error message(s)\n * @param operation The authentication operation that failed (e.g., 'storing', 'validating')\n * @param error The authentication error that occurred, or an array of errors\n * @param options Formatting options\n * @returns Formatted authentication error message(s)\n */\n formatAuthErrors(\n operation: string,\n error: unknown | unknown[],\n options?: TokenFormatterOptions\n ): string;\n}\n\n/**\n * Base class for token formatters\n */\nexport abstract class BaseTokenFormatter implements TokenFormatter {\n abstract name: string;\n \n abstract formatTokenStatus(\n status: TokenStatus,\n options?: TokenFormatterOptions\n ): string;\n\n abstract formatTokenStorageResult(success: boolean, options?: TokenFormatterOptions): string;\n\n abstract formatTokenResetResult(success: boolean, hadToken: boolean, options?: TokenFormatterOptions): string;\n\n abstract formatTokenValidationError(\n validation: TokenValidationStatus,\n options?: TokenFormatterOptions\n ): string;\n\n abstract formatTokenValidationStatus(\n validation: TokenValidationStatus,\n options?: TokenFormatterOptions\n ): string;\n\n abstract formatError(\n operation: string,\n error: unknown | unknown[],\n options?: TokenFormatterOptions\n ): string;\n\n abstract formatAuthErrors(\n operation: string,\n error: unknown | unknown[],\n options?: TokenFormatterOptions\n ): string;\n \n format<T>(data: T[], formatFn: (data: T[], options?: FormatterOptions) => string, options?: FormatterOptions): string {\n if (options?.debug) {\n logger.debug(`Formatting with ${this.name} formatter`);\n }\n return formatFn(data, options);\n }\n} "]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { BaseTokenFormatter } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* JSON formatter for tokens
|
|
4
|
+
*/
|
|
5
|
+
export class JsonFormatter extends BaseTokenFormatter {
|
|
6
|
+
name = 'json';
|
|
7
|
+
/**
|
|
8
|
+
* Format token status information as JSON
|
|
9
|
+
*
|
|
10
|
+
* @param status The token status information
|
|
11
|
+
* @returns Formatted token status message as JSON string
|
|
12
|
+
*/
|
|
13
|
+
formatTokenStatus(status) {
|
|
14
|
+
const result = {
|
|
15
|
+
...status,
|
|
16
|
+
message: this.getStatusMessage(status)
|
|
17
|
+
};
|
|
18
|
+
return JSON.stringify(result, null, 2);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Format token storage result as JSON
|
|
22
|
+
*
|
|
23
|
+
* @param success Whether the token was successfully stored
|
|
24
|
+
* @returns Formatted token storage result message as JSON string
|
|
25
|
+
*/
|
|
26
|
+
formatTokenStorageResult(success) {
|
|
27
|
+
const result = {
|
|
28
|
+
success,
|
|
29
|
+
message: success
|
|
30
|
+
? 'Token successfully stored in system keychain'
|
|
31
|
+
: 'Failed to store token'
|
|
32
|
+
};
|
|
33
|
+
return JSON.stringify(result, null, 2);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format token reset result as JSON
|
|
37
|
+
*
|
|
38
|
+
* @param success Whether the token was successfully reset
|
|
39
|
+
* @param hadToken Whether there was a token before reset
|
|
40
|
+
* @returns Formatted token reset result message as JSON string
|
|
41
|
+
*/
|
|
42
|
+
formatTokenResetResult(success, hadToken) {
|
|
43
|
+
const result = {
|
|
44
|
+
success,
|
|
45
|
+
hadToken,
|
|
46
|
+
message: this.getResetMessage(success, hadToken)
|
|
47
|
+
};
|
|
48
|
+
return JSON.stringify(result, null, 2);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Format token validation error as JSON
|
|
52
|
+
*
|
|
53
|
+
* @param validation The validation status for each API
|
|
54
|
+
* @param options Formatting options
|
|
55
|
+
* @returns Formatted token validation error message as JSON string
|
|
56
|
+
*/
|
|
57
|
+
formatTokenValidationError(validation) {
|
|
58
|
+
const error = {
|
|
59
|
+
...validation,
|
|
60
|
+
message: this.getValidationErrorMessage(validation)
|
|
61
|
+
};
|
|
62
|
+
return JSON.stringify(error, null, 2);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Format token validation status as JSON
|
|
66
|
+
*
|
|
67
|
+
* @param validation The validation status for each API
|
|
68
|
+
* @param options Formatting options
|
|
69
|
+
* @returns Formatted token validation status message as JSON string
|
|
70
|
+
*/
|
|
71
|
+
formatTokenValidationStatus(validation) {
|
|
72
|
+
const status = {
|
|
73
|
+
...validation,
|
|
74
|
+
isValid: validation.valid,
|
|
75
|
+
message: this.getValidationStatusMessage(validation)
|
|
76
|
+
};
|
|
77
|
+
return JSON.stringify(status, null, 2);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Format error message(s) as JSON
|
|
81
|
+
*
|
|
82
|
+
* @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')
|
|
83
|
+
* @param error The error that occurred, or an array of errors
|
|
84
|
+
* @returns Formatted error message(s) as JSON string
|
|
85
|
+
*/
|
|
86
|
+
formatError(operation, error) {
|
|
87
|
+
const errors = Array.isArray(error) ? error : [error];
|
|
88
|
+
const errorObjects = errors.map(error => {
|
|
89
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
90
|
+
return {
|
|
91
|
+
operation,
|
|
92
|
+
error: errorMessage,
|
|
93
|
+
message: `Error ${operation} token: ${errorMessage}`
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
return JSON.stringify(errorObjects, null, 2);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Format authentication error message(s) as JSON
|
|
100
|
+
*
|
|
101
|
+
* @param operation The authentication operation that failed (e.g., 'storing', 'validating')
|
|
102
|
+
* @param error The authentication error that occurred, or an array of errors
|
|
103
|
+
* @returns Formatted authentication error message(s) as JSON string
|
|
104
|
+
*/
|
|
105
|
+
formatAuthErrors(operation, error) {
|
|
106
|
+
const errors = Array.isArray(error) ? error : [error];
|
|
107
|
+
const errorObjects = errors.map(error => {
|
|
108
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
109
|
+
return {
|
|
110
|
+
operation,
|
|
111
|
+
error: errorMessage,
|
|
112
|
+
message: `Authentication error ${operation} token: ${errorMessage}`,
|
|
113
|
+
suggestion: 'Please check your token permissions and try again'
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
return JSON.stringify(errorObjects, null, 2);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Format multiple error messages as JSON
|
|
120
|
+
*
|
|
121
|
+
* @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')
|
|
122
|
+
* @param errors Array of errors that occurred
|
|
123
|
+
* @returns Formatted error messages as JSON string
|
|
124
|
+
*/
|
|
125
|
+
formatErrors(operation, errors) {
|
|
126
|
+
const errorObjects = errors.map(error => {
|
|
127
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
128
|
+
return {
|
|
129
|
+
operation,
|
|
130
|
+
error: errorMessage,
|
|
131
|
+
message: `Error ${operation} token: ${errorMessage}`
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
return JSON.stringify(errorObjects, null, 2);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get a human-readable status message based on token status
|
|
138
|
+
*/
|
|
139
|
+
getStatusMessage(status) {
|
|
140
|
+
if (!status.hasToken) {
|
|
141
|
+
return 'No token found in system keychain';
|
|
142
|
+
}
|
|
143
|
+
if (status.isValid) {
|
|
144
|
+
const validOrgs = Object.entries(status.validation.organizations)
|
|
145
|
+
.filter(([_, status]) => status.graphql && status.builds && status.organizations)
|
|
146
|
+
.map(([org]) => org);
|
|
147
|
+
return `Token is valid for organizations: ${validOrgs.join(', ')}`;
|
|
148
|
+
}
|
|
149
|
+
if (!status.validation.canListOrganizations) {
|
|
150
|
+
return 'Token is invalid or does not have access to list organizations';
|
|
151
|
+
}
|
|
152
|
+
const validOrgs = Object.entries(status.validation.organizations)
|
|
153
|
+
.filter(([_, status]) => status.graphql && status.builds && status.organizations)
|
|
154
|
+
.map(([org]) => org);
|
|
155
|
+
if (validOrgs.length === 0) {
|
|
156
|
+
return 'Token has no valid organizations';
|
|
157
|
+
}
|
|
158
|
+
return `Token is valid for organizations: ${validOrgs.join(', ')}`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get a human-readable reset message based on reset result
|
|
162
|
+
*/
|
|
163
|
+
getResetMessage(success, hadToken) {
|
|
164
|
+
if (!hadToken) {
|
|
165
|
+
return 'No token found in system keychain';
|
|
166
|
+
}
|
|
167
|
+
if (success) {
|
|
168
|
+
return 'Token successfully deleted from system keychain';
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return 'Failed to delete token';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get a human-readable validation error message
|
|
176
|
+
*/
|
|
177
|
+
getValidationErrorMessage(validation) {
|
|
178
|
+
if (validation.canListOrganizations) {
|
|
179
|
+
const invalidOrgs = Object.entries(validation.organizations)
|
|
180
|
+
.filter(([_, status]) => !status.graphql || !status.builds || !status.organizations)
|
|
181
|
+
.map(([org, status]) => {
|
|
182
|
+
const invalidApis = [];
|
|
183
|
+
if (!status.graphql)
|
|
184
|
+
invalidApis.push('GraphQL');
|
|
185
|
+
if (!status.builds)
|
|
186
|
+
invalidApis.push('Builds');
|
|
187
|
+
if (!status.organizations)
|
|
188
|
+
invalidApis.push('Organizations');
|
|
189
|
+
return `${org} (${invalidApis.join(', ')})`;
|
|
190
|
+
});
|
|
191
|
+
return `Token has limited access in some organizations: ${invalidOrgs.join(', ')}`;
|
|
192
|
+
}
|
|
193
|
+
return 'Token is invalid or does not have access to list organizations';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get a human-readable validation status message
|
|
197
|
+
*/
|
|
198
|
+
getValidationStatusMessage(validation) {
|
|
199
|
+
if (!validation.canListOrganizations) {
|
|
200
|
+
return 'Token is invalid or does not have access to list organizations';
|
|
201
|
+
}
|
|
202
|
+
const validOrgs = Object.entries(validation.organizations)
|
|
203
|
+
.filter(([_, status]) => status.graphql && status.builds && status.organizations)
|
|
204
|
+
.map(([org]) => org);
|
|
205
|
+
if (validOrgs.length === 0) {
|
|
206
|
+
return 'Token has no valid organizations';
|
|
207
|
+
}
|
|
208
|
+
return `Token is valid for organizations: ${validOrgs.join(', ')}`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=JsonFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonFormatter.js","sourceRoot":"/","sources":["formatters/token/JsonFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTokenFormatter, TokenFormatter } from './Formatter.js';\nimport { TokenStatus, TokenValidationStatus } from '../../types/credentials.js';\n\n/**\n * JSON formatter for tokens\n */\nexport class JsonFormatter extends BaseTokenFormatter implements TokenFormatter {\n name = 'json';\n\n /**\n * Format token status information as JSON\n * \n * @param status The token status information\n * @returns Formatted token status message as JSON string\n */\n formatTokenStatus(status: TokenStatus): string {\n const result = {\n ...status,\n message: this.getStatusMessage(status)\n };\n\n return JSON.stringify(result, null, 2);\n }\n\n /**\n * Format token storage result as JSON\n * \n * @param success Whether the token was successfully stored\n * @returns Formatted token storage result message as JSON string\n */\n formatTokenStorageResult(success: boolean): string {\n const result = {\n success,\n message: success \n ? 'Token successfully stored in system keychain' \n : 'Failed to store token'\n };\n\n return JSON.stringify(result, null, 2);\n }\n\n /**\n * Format token reset result as JSON\n * \n * @param success Whether the token was successfully reset\n * @param hadToken Whether there was a token before reset\n * @returns Formatted token reset result message as JSON string\n */\n formatTokenResetResult(success: boolean, hadToken: boolean): string {\n const result = {\n success,\n hadToken,\n message: this.getResetMessage(success, hadToken)\n };\n\n return JSON.stringify(result, null, 2);\n }\n\n /**\n * Format token validation error as JSON\n * \n * @param validation The validation status for each API\n * @param options Formatting options\n * @returns Formatted token validation error message as JSON string\n */\n formatTokenValidationError(\n validation: TokenValidationStatus\n ): string {\n const error = {\n ...validation,\n message: this.getValidationErrorMessage(validation)\n };\n\n return JSON.stringify(error, null, 2);\n }\n\n /**\n * Format token validation status as JSON\n * \n * @param validation The validation status for each API\n * @param options Formatting options\n * @returns Formatted token validation status message as JSON string\n */\n formatTokenValidationStatus(\n validation: TokenValidationStatus\n ): string {\n const status = {\n ...validation,\n isValid: validation.valid,\n message: this.getValidationStatusMessage(validation)\n };\n\n return JSON.stringify(status, null, 2);\n }\n\n /**\n * Format error message(s) as JSON\n * \n * @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')\n * @param error The error that occurred, or an array of errors\n * @returns Formatted error message(s) as JSON string\n */\n formatError(\n operation: string,\n error: unknown | unknown[]\n ): string {\n const errors = Array.isArray(error) ? error : [error];\n const errorObjects = errors.map(error => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n operation,\n error: errorMessage,\n message: `Error ${operation} token: ${errorMessage}`\n };\n });\n\n return JSON.stringify(errorObjects, null, 2);\n }\n\n /**\n * Format authentication error message(s) as JSON\n * \n * @param operation The authentication operation that failed (e.g., 'storing', 'validating')\n * @param error The authentication error that occurred, or an array of errors\n * @returns Formatted authentication error message(s) as JSON string\n */\n formatAuthErrors(\n operation: string,\n error: unknown | unknown[]\n ): string {\n const errors = Array.isArray(error) ? error : [error];\n const errorObjects = errors.map(error => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n operation,\n error: errorMessage,\n message: `Authentication error ${operation} token: ${errorMessage}`,\n suggestion: 'Please check your token permissions and try again'\n };\n });\n\n return JSON.stringify(errorObjects, null, 2);\n }\n\n /**\n * Format multiple error messages as JSON\n * \n * @param operation The operation that failed (e.g., 'storing', 'resetting', 'validating')\n * @param errors Array of errors that occurred\n * @returns Formatted error messages as JSON string\n */\n formatErrors(\n operation: string,\n errors: unknown[]\n ): string {\n const errorObjects = errors.map(error => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n operation,\n error: errorMessage,\n message: `Error ${operation} token: ${errorMessage}`\n };\n });\n\n return JSON.stringify(errorObjects, null, 2);\n }\n\n /**\n * Get a human-readable status message based on token status\n */\n private getStatusMessage(status: TokenStatus): string {\n if (!status.hasToken) {\n return 'No token found in system keychain';\n }\n\n if (status.isValid) {\n const validOrgs = Object.entries(status.validation.organizations)\n .filter(([_, status]) => status.graphql && status.builds && status.organizations)\n .map(([org]) => org);\n return `Token is valid for organizations: ${validOrgs.join(', ')}`;\n }\n\n if (!status.validation.canListOrganizations) {\n return 'Token is invalid or does not have access to list organizations';\n }\n\n const validOrgs = Object.entries(status.validation.organizations)\n .filter(([_, status]) => status.graphql && status.builds && status.organizations)\n .map(([org]) => org);\n\n if (validOrgs.length === 0) {\n return 'Token has no valid organizations';\n }\n\n return `Token is valid for organizations: ${validOrgs.join(', ')}`;\n }\n\n /**\n * Get a human-readable reset message based on reset result\n */\n private getResetMessage(success: boolean, hadToken: boolean): string {\n if (!hadToken) {\n return 'No token found in system keychain';\n }\n\n if (success) {\n return 'Token successfully deleted from system keychain';\n } else {\n return 'Failed to delete token';\n }\n }\n\n /**\n * Get a human-readable validation error message\n */\n private getValidationErrorMessage(validation: TokenValidationStatus): string {\n if (validation.canListOrganizations) {\n const invalidOrgs = Object.entries(validation.organizations)\n .filter(([_, status]) => !status.graphql || !status.builds || !status.organizations)\n .map(([org, status]) => {\n const invalidApis = [];\n if (!status.graphql) invalidApis.push('GraphQL');\n if (!status.builds) invalidApis.push('Builds');\n if (!status.organizations) invalidApis.push('Organizations');\n return `${org} (${invalidApis.join(', ')})`;\n });\n return `Token has limited access in some organizations: ${invalidOrgs.join(', ')}`;\n }\n return 'Token is invalid or does not have access to list organizations';\n }\n\n /**\n * Get a human-readable validation status message\n */\n private getValidationStatusMessage(validation: TokenValidationStatus): string {\n if (!validation.canListOrganizations) {\n return 'Token is invalid or does not have access to list organizations';\n }\n\n const validOrgs = Object.entries(validation.organizations)\n .filter(([_, status]) => status.graphql && status.builds && status.organizations)\n .map(([org]) => org);\n\n if (validOrgs.length === 0) {\n return 'Token has no valid organizations';\n }\n\n return `Token is valid for organizations: ${validOrgs.join(', ')}`;\n }\n} "]}
|