@structured-world/gitlab-mcp 6.16.0 → 6.18.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.
- package/README.md +49 -0
- package/dist/src/cli/list-tools.js +25 -8
- package/dist/src/cli/list-tools.js.map +1 -1
- package/dist/src/cli-utils.d.ts +4 -0
- package/dist/src/cli-utils.js +26 -0
- package/dist/src/cli-utils.js.map +1 -1
- package/dist/src/discovery/auto.d.ts +22 -0
- package/dist/src/discovery/auto.js +170 -0
- package/dist/src/discovery/auto.js.map +1 -0
- package/dist/src/discovery/git-remote.d.ts +19 -0
- package/dist/src/discovery/git-remote.js +197 -0
- package/dist/src/discovery/git-remote.js.map +1 -0
- package/dist/src/discovery/index.d.ts +3 -0
- package/dist/src/discovery/index.js +16 -0
- package/dist/src/discovery/index.js.map +1 -0
- package/dist/src/discovery/profile-matcher.d.ts +8 -0
- package/dist/src/discovery/profile-matcher.js +40 -0
- package/dist/src/discovery/profile-matcher.js.map +1 -0
- package/dist/src/entities/core/schema-readonly.d.ts +6 -6
- package/dist/src/entities/mrs/registry.js +19 -1
- package/dist/src/entities/mrs/registry.js.map +1 -1
- package/dist/src/entities/mrs/schema.d.ts +13 -1
- package/dist/src/entities/mrs/schema.js +16 -0
- package/dist/src/entities/mrs/schema.js.map +1 -1
- package/dist/src/entities/workitems/schema-readonly.d.ts +2 -2
- package/dist/src/entities/workitems/schema.d.ts +1 -1
- package/dist/src/handlers.d.ts +4 -0
- package/dist/src/handlers.js +76 -1
- package/dist/src/handlers.js.map +1 -1
- package/dist/src/logger.js +8 -4
- package/dist/src/logger.js.map +1 -1
- package/dist/src/main.js +93 -11
- package/dist/src/main.js.map +1 -1
- package/dist/src/services/ToolAvailability.d.ts +12 -2
- package/dist/src/services/ToolAvailability.js +200 -3
- package/dist/src/services/ToolAvailability.js.map +1 -1
- package/dist/src/utils/error-handler.d.ts +69 -0
- package/dist/src/utils/error-handler.js +518 -0
- package/dist/src/utils/error-handler.js.map +1 -0
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/namespace.d.ts +1 -0
- package/dist/src/utils/namespace.js +11 -0
- package/dist/src/utils/namespace.js.map +1 -1
- package/dist/structured-world-gitlab-mcp-6.18.0.tgz +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/structured-world-gitlab-mcp-6.16.0.tgz +0 -0
package/dist/src/handlers.js
CHANGED
|
@@ -33,10 +33,70 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseGitLabApiError = parseGitLabApiError;
|
|
36
37
|
exports.setupHandlers = setupHandlers;
|
|
37
38
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
38
39
|
const ConnectionManager_1 = require("./services/ConnectionManager");
|
|
39
40
|
const logger_1 = require("./logger");
|
|
41
|
+
const error_handler_1 = require("./utils/error-handler");
|
|
42
|
+
function parseGitLabApiError(errorMessage) {
|
|
43
|
+
const match = errorMessage.match(/GitLab API error:\s*(\d+)(?:\s+([\w\s]+?))?(?:\s+-\s+(.*))?$/);
|
|
44
|
+
if (!match)
|
|
45
|
+
return null;
|
|
46
|
+
const status = parseInt(match[1], 10);
|
|
47
|
+
const statusText = match[2]?.trim() ?? "";
|
|
48
|
+
const details = match[3]?.trim() ?? "";
|
|
49
|
+
let message;
|
|
50
|
+
if (statusText && details) {
|
|
51
|
+
message = `${status} ${statusText} - ${details}`;
|
|
52
|
+
}
|
|
53
|
+
else if (statusText) {
|
|
54
|
+
message = `${status} ${statusText}`;
|
|
55
|
+
}
|
|
56
|
+
else if (details) {
|
|
57
|
+
message = `${status} - ${details}`;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
message = `${status}`;
|
|
61
|
+
}
|
|
62
|
+
return { status, message };
|
|
63
|
+
}
|
|
64
|
+
function hasAction(value) {
|
|
65
|
+
return (typeof value === "object" &&
|
|
66
|
+
value !== null &&
|
|
67
|
+
"action" in value &&
|
|
68
|
+
typeof value.action === "string");
|
|
69
|
+
}
|
|
70
|
+
function extractActionFromError(error) {
|
|
71
|
+
if (hasAction(error)) {
|
|
72
|
+
return error.action;
|
|
73
|
+
}
|
|
74
|
+
const cause = error.cause;
|
|
75
|
+
if (hasAction(cause)) {
|
|
76
|
+
return cause.action;
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
function toStructuredError(error, toolName, toolArgs) {
|
|
81
|
+
if ((0, error_handler_1.isStructuredToolError)(error)) {
|
|
82
|
+
return error.structuredError;
|
|
83
|
+
}
|
|
84
|
+
const cause = error.cause;
|
|
85
|
+
if ((0, error_handler_1.isStructuredToolError)(cause)) {
|
|
86
|
+
return cause.structuredError;
|
|
87
|
+
}
|
|
88
|
+
if (!(error instanceof Error))
|
|
89
|
+
return null;
|
|
90
|
+
const parsed = parseGitLabApiError(error.message);
|
|
91
|
+
if (!parsed)
|
|
92
|
+
return null;
|
|
93
|
+
let action = extractActionFromError(error);
|
|
94
|
+
if (!action && toolArgs && typeof toolArgs.action === "string") {
|
|
95
|
+
action = toolArgs.action;
|
|
96
|
+
}
|
|
97
|
+
action ??= "unknown";
|
|
98
|
+
return (0, error_handler_1.handleGitLabError)({ status: parsed.status, message: parsed.message }, toolName, action, toolArgs);
|
|
99
|
+
}
|
|
40
100
|
async function setupHandlers(server) {
|
|
41
101
|
const connectionManager = ConnectionManager_1.ConnectionManager.getInstance();
|
|
42
102
|
try {
|
|
@@ -170,11 +230,26 @@ async function setupHandlers(server) {
|
|
|
170
230
|
}
|
|
171
231
|
catch (error) {
|
|
172
232
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
173
|
-
throw new Error(`Failed to execute tool '${toolName}': ${errorMessage}
|
|
233
|
+
throw new Error(`Failed to execute tool '${toolName}': ${errorMessage}`, { cause: error });
|
|
174
234
|
}
|
|
175
235
|
}
|
|
176
236
|
catch (error) {
|
|
177
237
|
logger_1.logger.error(`Error in tool handler: ${error instanceof Error ? error.message : String(error)}`);
|
|
238
|
+
const toolName = request.params.name;
|
|
239
|
+
const toolArgs = request.params.arguments;
|
|
240
|
+
const structuredError = toStructuredError(error, toolName, toolArgs);
|
|
241
|
+
if (structuredError) {
|
|
242
|
+
logger_1.logger.debug({ structuredError }, "Returning structured error response");
|
|
243
|
+
return {
|
|
244
|
+
content: [
|
|
245
|
+
{
|
|
246
|
+
type: "text",
|
|
247
|
+
text: JSON.stringify(structuredError, null, 2),
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
isError: true,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
178
253
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
179
254
|
return {
|
|
180
255
|
content: [
|
package/dist/src/handlers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/handlers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/src/logger.js
CHANGED
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logger = exports.createLogger = void 0;
|
|
4
4
|
const pino_1 = require("pino");
|
|
5
|
+
const isTestEnv = process.env.NODE_ENV === "test" || process.env.JEST_WORKER_ID !== undefined;
|
|
5
6
|
const createLogger = (name) => {
|
|
6
|
-
|
|
7
|
+
const options = {
|
|
7
8
|
name,
|
|
8
9
|
level: process.env.LOG_LEVEL ?? "info",
|
|
9
|
-
|
|
10
|
+
};
|
|
11
|
+
if (!isTestEnv) {
|
|
12
|
+
options.transport = {
|
|
10
13
|
target: "pino-pretty",
|
|
11
14
|
options: {
|
|
12
15
|
colorize: true,
|
|
13
16
|
translateTime: true,
|
|
14
17
|
ignore: "pid,hostname",
|
|
15
18
|
},
|
|
16
|
-
}
|
|
17
|
-
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return (0, pino_1.pino)(options);
|
|
18
22
|
};
|
|
19
23
|
exports.createLogger = createLogger;
|
|
20
24
|
exports.logger = (0, exports.createLogger)("gitlab-mcp");
|
package/dist/src/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;;AAAA,+BAAgD;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC;AAEvF,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5C,MAAM,OAAO,GAAkB;QAC7B,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;KACvC,CAAC;IAIF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,SAAS,GAAG;YAClB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,cAAc;aACvB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAA,WAAI,EAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AApBW,QAAA,YAAY,gBAoBvB;AAEW,QAAA,MAAM,GAAG,IAAA,oBAAY,EAAC,YAAY,CAAC,CAAC"}
|
package/dist/src/main.js
CHANGED
|
@@ -5,6 +5,8 @@ const server_1 = require("./server");
|
|
|
5
5
|
const logger_1 = require("./logger");
|
|
6
6
|
const profiles_1 = require("./profiles");
|
|
7
7
|
const cli_utils_1 = require("./cli-utils");
|
|
8
|
+
const discovery_1 = require("./discovery");
|
|
9
|
+
const namespace_1 = require("./utils/namespace");
|
|
8
10
|
async function main() {
|
|
9
11
|
const cliArgs = (0, cli_utils_1.parseCliArgs)();
|
|
10
12
|
if (cliArgs.showProjectConfig) {
|
|
@@ -19,21 +21,90 @@ async function main() {
|
|
|
19
21
|
process.exit(1);
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
let autoDiscoveryResult = null;
|
|
25
|
+
if (cliArgs.auto) {
|
|
26
|
+
try {
|
|
27
|
+
autoDiscoveryResult = await (0, discovery_1.autoDiscover)({
|
|
28
|
+
repoPath: cliArgs.cwd,
|
|
29
|
+
remoteName: cliArgs.remoteName,
|
|
30
|
+
noProjectConfig: true,
|
|
31
|
+
dryRun: cliArgs.dryRun,
|
|
32
|
+
});
|
|
33
|
+
if (autoDiscoveryResult) {
|
|
34
|
+
if (cliArgs.dryRun) {
|
|
35
|
+
console.log((0, discovery_1.formatDiscoveryResult)(autoDiscoveryResult));
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
logger_1.logger.info({
|
|
39
|
+
host: autoDiscoveryResult.host,
|
|
40
|
+
project: autoDiscoveryResult.projectPath,
|
|
41
|
+
profile: autoDiscoveryResult.matchedProfile?.profileName,
|
|
42
|
+
}, "Auto-discovery detected GitLab configuration");
|
|
27
43
|
}
|
|
28
44
|
else {
|
|
29
|
-
logger_1.logger.
|
|
45
|
+
logger_1.logger.warn("Auto-discovery failed: not in a git repository or no remote found");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
logger_1.logger.error({ error: message }, "Auto-discovery failed");
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (cliArgs.profileName) {
|
|
55
|
+
try {
|
|
56
|
+
const result = await (0, profiles_1.tryApplyProfileFromEnv)(cliArgs.profileName);
|
|
57
|
+
if (result) {
|
|
58
|
+
if ("profileName" in result) {
|
|
59
|
+
logger_1.logger.info({ profile: result.profileName, host: result.host }, "Using CLI-specified profile");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
logger_1.logger.info({ preset: result.presetName }, "Using CLI-specified preset");
|
|
63
|
+
}
|
|
64
|
+
if (autoDiscoveryResult?.matchedProfile &&
|
|
65
|
+
autoDiscoveryResult.matchedProfile.profileName !== cliArgs.profileName) {
|
|
66
|
+
logger_1.logger.warn({
|
|
67
|
+
cliProfile: cliArgs.profileName,
|
|
68
|
+
autoProfile: autoDiscoveryResult.matchedProfile.profileName,
|
|
69
|
+
}, "Auto-discovered profile ignored: --profile takes precedence");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
logger_1.logger.error({ error: message }, "Failed to load profile");
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (autoDiscoveryResult?.matchedProfile) {
|
|
80
|
+
try {
|
|
81
|
+
const result = await (0, profiles_1.tryApplyProfileFromEnv)(autoDiscoveryResult.matchedProfile.profileName);
|
|
82
|
+
if (result && "profileName" in result) {
|
|
83
|
+
logger_1.logger.info({ profile: result.profileName, host: result.host }, "Using auto-discovered profile");
|
|
30
84
|
}
|
|
31
85
|
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
88
|
+
logger_1.logger.warn({ error: message }, "Failed to apply auto-discovered profile");
|
|
89
|
+
}
|
|
32
90
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
91
|
+
else {
|
|
92
|
+
try {
|
|
93
|
+
const result = await (0, profiles_1.tryApplyProfileFromEnv)();
|
|
94
|
+
if (result) {
|
|
95
|
+
if ("profileName" in result) {
|
|
96
|
+
logger_1.logger.info({ profile: result.profileName, host: result.host }, "Using configuration profile");
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
logger_1.logger.info({ preset: result.presetName }, "Using configuration preset");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
105
|
+
logger_1.logger.error({ error: message }, "Failed to load profile");
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
37
108
|
}
|
|
38
109
|
if (!cliArgs.noProjectConfig) {
|
|
39
110
|
try {
|
|
@@ -44,7 +115,7 @@ async function main() {
|
|
|
44
115
|
path: projectConfig.configPath,
|
|
45
116
|
preset: summary.presetSummary,
|
|
46
117
|
profile: summary.profileSummary,
|
|
47
|
-
}, "Loaded project configuration");
|
|
118
|
+
}, "Loaded project configuration (restrictions applied)");
|
|
48
119
|
}
|
|
49
120
|
}
|
|
50
121
|
catch (error) {
|
|
@@ -52,6 +123,17 @@ async function main() {
|
|
|
52
123
|
logger_1.logger.warn({ error: message }, "Failed to load project config, continuing without it");
|
|
53
124
|
}
|
|
54
125
|
}
|
|
126
|
+
if (autoDiscoveryResult) {
|
|
127
|
+
process.env.GITLAB_DEFAULT_PROJECT ??= autoDiscoveryResult.projectPath;
|
|
128
|
+
const namespace = (0, namespace_1.extractNamespaceFromPath)(autoDiscoveryResult.projectPath);
|
|
129
|
+
if (namespace) {
|
|
130
|
+
process.env.GITLAB_DEFAULT_NAMESPACE ??= namespace;
|
|
131
|
+
}
|
|
132
|
+
logger_1.logger.debug({
|
|
133
|
+
defaultProject: process.env.GITLAB_DEFAULT_PROJECT,
|
|
134
|
+
defaultNamespace: process.env.GITLAB_DEFAULT_NAMESPACE,
|
|
135
|
+
}, "Default context set from auto-discovery");
|
|
136
|
+
}
|
|
55
137
|
await (0, server_1.startServer)();
|
|
56
138
|
}
|
|
57
139
|
main().catch((error) => {
|
package/dist/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;;AAEA,qCAAuC;AACvC,qCAAkC;AAClC,yCAAgG;AAChG,2CAAiE;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,21 @@ interface ToolRequirement {
|
|
|
3
3
|
requiredTier: "free" | "premium" | "ultimate";
|
|
4
4
|
notes?: string;
|
|
5
5
|
}
|
|
6
|
+
interface ActionRequirement {
|
|
7
|
+
tier: "free" | "premium" | "ultimate";
|
|
8
|
+
minVersion: number;
|
|
9
|
+
notes?: string;
|
|
10
|
+
}
|
|
6
11
|
export declare class ToolAvailability {
|
|
12
|
+
private static readonly TIER_ORDER;
|
|
7
13
|
private static toolRequirements;
|
|
8
|
-
static
|
|
14
|
+
private static actionRequirements;
|
|
15
|
+
static getActionRequirement(toolName: string, action?: string): ActionRequirement | undefined;
|
|
16
|
+
static getHighestTier(toolName: string): "free" | "premium" | "ultimate";
|
|
17
|
+
static getTierRestrictedActions(toolName: string, tier: "premium" | "ultimate"): string[];
|
|
18
|
+
static isToolAvailable(toolName: string, action?: string): boolean;
|
|
9
19
|
static getAvailableTools(): string[];
|
|
10
|
-
static getToolRequirement(toolName: string): ToolRequirement | undefined;
|
|
20
|
+
static getToolRequirement(toolName: string, action?: string): ToolRequirement | undefined;
|
|
11
21
|
static getUnavailableReason(toolName: string): string | null;
|
|
12
22
|
private static parseVersion;
|
|
13
23
|
private static isTierSufficient;
|
|
@@ -4,6 +4,11 @@ exports.ToolAvailability = void 0;
|
|
|
4
4
|
const ConnectionManager_1 = require("./ConnectionManager");
|
|
5
5
|
const logger_1 = require("../logger");
|
|
6
6
|
class ToolAvailability {
|
|
7
|
+
static TIER_ORDER = {
|
|
8
|
+
free: 0,
|
|
9
|
+
premium: 1,
|
|
10
|
+
ultimate: 2,
|
|
11
|
+
};
|
|
7
12
|
static toolRequirements = {
|
|
8
13
|
list_projects: { minVersion: 8.0, requiredTier: "free" },
|
|
9
14
|
get_project: { minVersion: 8.0, requiredTier: "free" },
|
|
@@ -313,7 +318,179 @@ class ToolAvailability {
|
|
|
313
318
|
protect_repository_tag: { minVersion: 11.3, requiredTier: "free" },
|
|
314
319
|
unprotect_repository_tag: { minVersion: 11.3, requiredTier: "free" },
|
|
315
320
|
};
|
|
316
|
-
static
|
|
321
|
+
static actionRequirements = {
|
|
322
|
+
browse_projects: {
|
|
323
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
324
|
+
},
|
|
325
|
+
browse_namespaces: {
|
|
326
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
327
|
+
},
|
|
328
|
+
browse_commits: {
|
|
329
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
330
|
+
},
|
|
331
|
+
browse_events: {
|
|
332
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
333
|
+
},
|
|
334
|
+
create_branch: {
|
|
335
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
336
|
+
},
|
|
337
|
+
create_group: {
|
|
338
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
339
|
+
},
|
|
340
|
+
manage_repository: {
|
|
341
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
342
|
+
},
|
|
343
|
+
get_users: {
|
|
344
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
345
|
+
},
|
|
346
|
+
browse_merge_requests: {
|
|
347
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
348
|
+
actions: {
|
|
349
|
+
approvals: { tier: "premium", minVersion: 10.6, notes: "MR approvals" },
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
browse_mr_discussions: {
|
|
353
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
354
|
+
},
|
|
355
|
+
manage_merge_request: {
|
|
356
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
357
|
+
},
|
|
358
|
+
manage_mr_discussion: {
|
|
359
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
360
|
+
actions: {
|
|
361
|
+
comment: { tier: "free", minVersion: 8.0 },
|
|
362
|
+
thread: { tier: "free", minVersion: 11.0 },
|
|
363
|
+
reply: { tier: "free", minVersion: 11.0 },
|
|
364
|
+
update: { tier: "free", minVersion: 8.0 },
|
|
365
|
+
apply_suggestion: { tier: "free", minVersion: 13.0 },
|
|
366
|
+
apply_suggestions: { tier: "free", minVersion: 13.0 },
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
manage_draft_notes: {
|
|
370
|
+
default: { tier: "free", minVersion: 13.2 },
|
|
371
|
+
},
|
|
372
|
+
browse_work_items: {
|
|
373
|
+
default: { tier: "free", minVersion: 15.0 },
|
|
374
|
+
},
|
|
375
|
+
manage_work_item: {
|
|
376
|
+
default: { tier: "free", minVersion: 15.0 },
|
|
377
|
+
},
|
|
378
|
+
browse_labels: {
|
|
379
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
380
|
+
},
|
|
381
|
+
manage_label: {
|
|
382
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
383
|
+
},
|
|
384
|
+
browse_wiki: {
|
|
385
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
386
|
+
},
|
|
387
|
+
manage_wiki: {
|
|
388
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
389
|
+
},
|
|
390
|
+
browse_pipelines: {
|
|
391
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
392
|
+
},
|
|
393
|
+
manage_pipeline: {
|
|
394
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
395
|
+
},
|
|
396
|
+
manage_pipeline_job: {
|
|
397
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
398
|
+
},
|
|
399
|
+
browse_variables: {
|
|
400
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
401
|
+
},
|
|
402
|
+
manage_variable: {
|
|
403
|
+
default: { tier: "free", minVersion: 9.0 },
|
|
404
|
+
},
|
|
405
|
+
browse_milestones: {
|
|
406
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
407
|
+
actions: {
|
|
408
|
+
burndown: { tier: "premium", minVersion: 12.0, notes: "Burndown charts" },
|
|
409
|
+
},
|
|
410
|
+
},
|
|
411
|
+
manage_milestone: {
|
|
412
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
413
|
+
},
|
|
414
|
+
browse_files: {
|
|
415
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
416
|
+
},
|
|
417
|
+
manage_files: {
|
|
418
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
419
|
+
},
|
|
420
|
+
browse_snippets: {
|
|
421
|
+
default: { tier: "free", minVersion: 8.15 },
|
|
422
|
+
},
|
|
423
|
+
manage_snippet: {
|
|
424
|
+
default: { tier: "free", minVersion: 8.15 },
|
|
425
|
+
},
|
|
426
|
+
list_webhooks: {
|
|
427
|
+
default: { tier: "free", minVersion: 8.0, notes: "Project webhooks" },
|
|
428
|
+
},
|
|
429
|
+
manage_webhook: {
|
|
430
|
+
default: { tier: "free", minVersion: 8.0, notes: "Project webhooks" },
|
|
431
|
+
actions: {
|
|
432
|
+
create_group: { tier: "premium", minVersion: 10.4, notes: "Group webhooks" },
|
|
433
|
+
update_group: { tier: "premium", minVersion: 10.4, notes: "Group webhooks" },
|
|
434
|
+
delete_group: { tier: "premium", minVersion: 10.4, notes: "Group webhooks" },
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
list_integrations: {
|
|
438
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
439
|
+
},
|
|
440
|
+
manage_integration: {
|
|
441
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
442
|
+
},
|
|
443
|
+
list_todos: {
|
|
444
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
445
|
+
},
|
|
446
|
+
manage_todos: {
|
|
447
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
448
|
+
},
|
|
449
|
+
list_project_members: {
|
|
450
|
+
default: { tier: "free", minVersion: 8.0 },
|
|
451
|
+
},
|
|
452
|
+
list_group_iterations: {
|
|
453
|
+
default: { tier: "premium", minVersion: 13.1, notes: "Iterations/Sprints" },
|
|
454
|
+
},
|
|
455
|
+
download_attachment: {
|
|
456
|
+
default: { tier: "free", minVersion: 10.0 },
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
static getActionRequirement(toolName, action) {
|
|
460
|
+
const toolReq = this.actionRequirements[toolName];
|
|
461
|
+
if (!toolReq)
|
|
462
|
+
return undefined;
|
|
463
|
+
if (action && toolReq.actions?.[action]) {
|
|
464
|
+
return toolReq.actions[action];
|
|
465
|
+
}
|
|
466
|
+
return toolReq.default;
|
|
467
|
+
}
|
|
468
|
+
static getHighestTier(toolName) {
|
|
469
|
+
const toolReq = this.actionRequirements[toolName];
|
|
470
|
+
if (!toolReq) {
|
|
471
|
+
const legacy = this.toolRequirements[toolName];
|
|
472
|
+
return legacy?.requiredTier ?? "free";
|
|
473
|
+
}
|
|
474
|
+
let highest = toolReq.default.tier;
|
|
475
|
+
if (toolReq.actions) {
|
|
476
|
+
for (const actionReq of Object.values(toolReq.actions)) {
|
|
477
|
+
if (this.TIER_ORDER[actionReq.tier] > this.TIER_ORDER[highest]) {
|
|
478
|
+
highest = actionReq.tier;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return highest;
|
|
483
|
+
}
|
|
484
|
+
static getTierRestrictedActions(toolName, tier) {
|
|
485
|
+
const toolReq = this.actionRequirements[toolName];
|
|
486
|
+
if (!toolReq?.actions)
|
|
487
|
+
return [];
|
|
488
|
+
const minLevel = this.TIER_ORDER[tier];
|
|
489
|
+
return Object.entries(toolReq.actions)
|
|
490
|
+
.filter(([, req]) => this.TIER_ORDER[req.tier] >= minLevel)
|
|
491
|
+
.map(([action]) => action);
|
|
492
|
+
}
|
|
493
|
+
static isToolAvailable(toolName, action) {
|
|
317
494
|
const connectionManager = ConnectionManager_1.ConnectionManager.getInstance();
|
|
318
495
|
if (!connectionManager) {
|
|
319
496
|
logger_1.logger.debug(`Tool availability check for '${toolName}': ConnectionManager instance is null`);
|
|
@@ -321,6 +498,14 @@ class ToolAvailability {
|
|
|
321
498
|
}
|
|
322
499
|
try {
|
|
323
500
|
const instanceInfo = connectionManager.getInstanceInfo();
|
|
501
|
+
const actionReq = this.getActionRequirement(toolName, action);
|
|
502
|
+
if (actionReq) {
|
|
503
|
+
const version = this.parseVersion(instanceInfo.version);
|
|
504
|
+
if (version < actionReq.minVersion) {
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
return this.isTierSufficient(instanceInfo.tier, actionReq.tier);
|
|
508
|
+
}
|
|
324
509
|
const requirement = this.toolRequirements[toolName];
|
|
325
510
|
if (!requirement) {
|
|
326
511
|
logger_1.logger.debug(`Tool '${toolName}' not found in requirements database`);
|
|
@@ -343,9 +528,21 @@ class ToolAvailability {
|
|
|
343
528
|
}
|
|
344
529
|
}
|
|
345
530
|
static getAvailableTools() {
|
|
346
|
-
|
|
531
|
+
const allTools = new Set([
|
|
532
|
+
...Object.keys(this.toolRequirements),
|
|
533
|
+
...Object.keys(this.actionRequirements),
|
|
534
|
+
]);
|
|
535
|
+
return Array.from(allTools).filter(tool => this.isToolAvailable(tool));
|
|
347
536
|
}
|
|
348
|
-
static getToolRequirement(toolName) {
|
|
537
|
+
static getToolRequirement(toolName, action) {
|
|
538
|
+
const actionReq = this.getActionRequirement(toolName, action);
|
|
539
|
+
if (actionReq) {
|
|
540
|
+
return {
|
|
541
|
+
minVersion: actionReq.minVersion,
|
|
542
|
+
requiredTier: actionReq.tier,
|
|
543
|
+
notes: actionReq.notes,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
349
546
|
return this.toolRequirements[toolName];
|
|
350
547
|
}
|
|
351
548
|
static getUnavailableReason(toolName) {
|