@mcp-abap-adt/calm-server 0.2.1 → 0.4.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/CHANGELOG.md +97 -0
- package/README.md +45 -0
- package/dist/server/auth/buildBroker.d.ts +22 -0
- package/dist/server/auth/buildBroker.d.ts.map +1 -0
- package/dist/server/auth/buildBroker.js +55 -0
- package/dist/server/auth/buildBroker.js.map +1 -0
- package/dist/server/auth/legacyEnvShim.d.ts +10 -0
- package/dist/server/auth/legacyEnvShim.d.ts.map +1 -0
- package/dist/server/auth/legacyEnvShim.js +23 -0
- package/dist/server/auth/legacyEnvShim.js.map +1 -0
- package/dist/server/buildClient.d.ts +17 -5
- package/dist/server/buildClient.d.ts.map +1 -1
- package/dist/server/buildClient.js +22 -64
- package/dist/server/buildClient.js.map +1 -1
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +19 -3
- package/dist/server/config.js.map +1 -1
- package/dist/server/connection/AbstractCalmConnection.d.ts +43 -0
- package/dist/server/connection/AbstractCalmConnection.d.ts.map +1 -0
- package/dist/server/connection/AbstractCalmConnection.js +155 -0
- package/dist/server/connection/AbstractCalmConnection.js.map +1 -0
- package/dist/server/connection/OAuth2CalmConnection.d.ts +13 -0
- package/dist/server/connection/OAuth2CalmConnection.d.ts.map +1 -0
- package/dist/server/connection/OAuth2CalmConnection.js +27 -0
- package/dist/server/connection/OAuth2CalmConnection.js.map +1 -0
- package/dist/server/connection/SandboxCalmConnection.d.ts +10 -0
- package/dist/server/connection/SandboxCalmConnection.d.ts.map +1 -0
- package/dist/server/connection/SandboxCalmConnection.js +16 -0
- package/dist/server/connection/SandboxCalmConnection.js.map +1 -0
- package/dist/server/connection/XsuaaRefresher.d.ts +18 -0
- package/dist/server/connection/XsuaaRefresher.d.ts.map +1 -0
- package/dist/server/connection/XsuaaRefresher.js +51 -0
- package/dist/server/connection/XsuaaRefresher.js.map +1 -0
- package/dist/server/connection/createCalmConnection.d.ts +13 -0
- package/dist/server/connection/createCalmConnection.d.ts.map +1 -0
- package/dist/server/connection/createCalmConnection.js +28 -0
- package/dist/server/connection/createCalmConnection.js.map +1 -0
- package/dist/server/connection/index.d.ts +10 -0
- package/dist/server/connection/index.d.ts.map +1 -0
- package/dist/server/connection/index.js +16 -0
- package/dist/server/connection/index.js.map +1 -0
- package/dist/server/connection/serviceRoutes.d.ts +16 -0
- package/dist/server/connection/serviceRoutes.d.ts.map +1 -0
- package/dist/server/connection/serviceRoutes.js +27 -0
- package/dist/server/connection/serviceRoutes.js.map +1 -0
- package/dist/server/runStdio.js +2 -2
- package/dist/server/runStdio.js.map +1 -1
- package/dist/tools/features/getFeatureByDisplayId.d.ts +1 -0
- package/dist/tools/features/getFeatureByDisplayId.d.ts.map +1 -1
- package/dist/tools/features/getFeatureByDisplayId.js +11 -5
- package/dist/tools/features/getFeatureByDisplayId.js.map +1 -1
- package/dist/tools/features/listFeatures.d.ts.map +1 -1
- package/dist/tools/features/listFeatures.js +5 -2
- package/dist/tools/features/listFeatures.js.map +1 -1
- package/dist/tools/tasks/listTasks.d.ts.map +1 -1
- package/dist/tools/tasks/listTasks.js +19 -15
- package/dist/tools/tasks/listTasks.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AbstractCalmConnection = void 0;
|
|
4
|
+
const calm_client_1 = require("@mcp-abap-adt/calm-client");
|
|
5
|
+
const serviceRoutes_1 = require("./serviceRoutes");
|
|
6
|
+
function trimTrailingSlash(v) {
|
|
7
|
+
return v.endsWith('/') ? v.slice(0, -1) : v;
|
|
8
|
+
}
|
|
9
|
+
function trimLeadingSlash(v) {
|
|
10
|
+
return v.startsWith('/') ? v.slice(1) : v;
|
|
11
|
+
}
|
|
12
|
+
function joinUrl(base, path) {
|
|
13
|
+
if (!path)
|
|
14
|
+
return trimTrailingSlash(base);
|
|
15
|
+
return `${trimTrailingSlash(base)}/${trimLeadingSlash(path)}`;
|
|
16
|
+
}
|
|
17
|
+
function toQueryString(params) {
|
|
18
|
+
if (!params || typeof params !== 'object')
|
|
19
|
+
return '';
|
|
20
|
+
const usp = new URLSearchParams();
|
|
21
|
+
for (const [k, v] of Object.entries(params)) {
|
|
22
|
+
if (v === undefined || v === null)
|
|
23
|
+
continue;
|
|
24
|
+
usp.append(k, String(v));
|
|
25
|
+
}
|
|
26
|
+
const s = usp.toString();
|
|
27
|
+
return s ? `?${s}` : '';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Shared fetch-based transport for Cloud ALM. Subclasses provide
|
|
31
|
+
* `attachAuth()` and may override `onAuthFailure()`. `baseUrl` is used
|
|
32
|
+
* verbatim — NO prefix injection.
|
|
33
|
+
*/
|
|
34
|
+
class AbstractCalmConnection {
|
|
35
|
+
baseUrl;
|
|
36
|
+
defaultTimeout;
|
|
37
|
+
defaultHeaders;
|
|
38
|
+
serviceRoutes;
|
|
39
|
+
logger;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.baseUrl = trimTrailingSlash(options.baseUrl);
|
|
42
|
+
this.defaultTimeout = options.defaultTimeout ?? 30_000;
|
|
43
|
+
this.defaultHeaders = {
|
|
44
|
+
Accept: 'application/json',
|
|
45
|
+
...options.defaultHeaders,
|
|
46
|
+
};
|
|
47
|
+
this.serviceRoutes = {
|
|
48
|
+
...serviceRoutes_1.DEFAULT_CALM_SERVICE_ROUTES,
|
|
49
|
+
...options.serviceRoutes,
|
|
50
|
+
};
|
|
51
|
+
this.logger = options.logger;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Subclass hook on 401/403. Return true to retry once. Default: no
|
|
55
|
+
* retry.
|
|
56
|
+
*/
|
|
57
|
+
async onAuthFailure(_status) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
async connect() { }
|
|
61
|
+
async getBaseUrl() {
|
|
62
|
+
return this.baseUrl;
|
|
63
|
+
}
|
|
64
|
+
async getServiceUrl(service) {
|
|
65
|
+
return joinUrl(this.baseUrl, this.serviceRoutes[service]);
|
|
66
|
+
}
|
|
67
|
+
async makeRequest(options) {
|
|
68
|
+
const base = options.service
|
|
69
|
+
? await this.getServiceUrl(options.service)
|
|
70
|
+
: this.baseUrl;
|
|
71
|
+
const url = joinUrl(base, options.url) + toQueryString(options.params);
|
|
72
|
+
this.logger?.debug(`[calm] ${options.method} ${url}`);
|
|
73
|
+
try {
|
|
74
|
+
return await this.execute(url, options);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const status = err instanceof calm_client_1.CalmApiError ? err.status : undefined;
|
|
78
|
+
if (status !== undefined && (await this.onAuthFailure(status))) {
|
|
79
|
+
this.logger?.debug(`[calm] ${status} from ${options.method} ${url} — refreshed auth, retrying once`);
|
|
80
|
+
// Retry once. The retry's own errors (network, abort, HTTP) go
|
|
81
|
+
// through the same normalization — never escape as a raw error.
|
|
82
|
+
try {
|
|
83
|
+
return await this.execute(url, options);
|
|
84
|
+
}
|
|
85
|
+
catch (retryErr) {
|
|
86
|
+
throw this.logFail(options.method, url, this.normalizeError(retryErr));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw this.logFail(options.method, url, this.normalizeError(err));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
logFail(method, url, err) {
|
|
93
|
+
// HTTP statuses (403/404/4xx/5xx) are expected operational signals —
|
|
94
|
+
// log at debug. Transport/network failures (no status) are logged at
|
|
95
|
+
// warn since they usually indicate misconfiguration or outage.
|
|
96
|
+
if (err.status === undefined) {
|
|
97
|
+
this.logger?.warn(`[calm] ${method} ${url} failed: ${err.message}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.logger?.debug(`[calm] ${method} ${url} -> ${err.status} (${err.code})`);
|
|
101
|
+
}
|
|
102
|
+
return err;
|
|
103
|
+
}
|
|
104
|
+
normalizeError(err) {
|
|
105
|
+
if (err instanceof calm_client_1.CalmApiError)
|
|
106
|
+
return err;
|
|
107
|
+
return calm_client_1.CalmApiError.fromNetwork(err, err instanceof Error ? err.message : String(err));
|
|
108
|
+
}
|
|
109
|
+
async execute(url, options) {
|
|
110
|
+
const auth = await this.attachAuth();
|
|
111
|
+
const headers = { ...this.defaultHeaders, ...auth, ...options.headers };
|
|
112
|
+
const init = {
|
|
113
|
+
method: options.method,
|
|
114
|
+
headers,
|
|
115
|
+
signal: AbortSignal.timeout(options.timeout ?? this.defaultTimeout),
|
|
116
|
+
};
|
|
117
|
+
if (options.data !== undefined) {
|
|
118
|
+
init.body =
|
|
119
|
+
typeof options.data === 'string'
|
|
120
|
+
? options.data
|
|
121
|
+
: JSON.stringify(options.data);
|
|
122
|
+
if (!('Content-Type' in headers) && !('content-type' in headers)) {
|
|
123
|
+
headers['Content-Type'] =
|
|
124
|
+
'application/json';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const response = await fetch(url, init);
|
|
128
|
+
const raw = await response.text();
|
|
129
|
+
const parsed = raw ? safeJson(raw) : undefined;
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
throw (0, calm_client_1.calmErrorFromBody)(response.status, parsed ?? raw);
|
|
132
|
+
}
|
|
133
|
+
this.logger?.debug(`[calm] ${response.status} ${options.method} ${url}`);
|
|
134
|
+
const outHeaders = {};
|
|
135
|
+
response.headers.forEach((v, k) => {
|
|
136
|
+
outHeaders[k] = v;
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
data: parsed,
|
|
140
|
+
status: response.status,
|
|
141
|
+
statusText: response.statusText,
|
|
142
|
+
headers: outHeaders,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.AbstractCalmConnection = AbstractCalmConnection;
|
|
147
|
+
function safeJson(text) {
|
|
148
|
+
try {
|
|
149
|
+
return JSON.parse(text);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return text;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=AbstractCalmConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractCalmConnection.js","sourceRoot":"","sources":["../../../src/server/connection/AbstractCalmConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ITokenRefresher } from '@mcp-abap-adt/interfaces';
|
|
2
|
+
import { AbstractCalmConnection, type IAbstractCalmConnectionOptions } from './AbstractCalmConnection';
|
|
3
|
+
export interface IOAuth2CalmConnectionOptions extends IAbstractCalmConnectionOptions {
|
|
4
|
+
tokenRefresher: ITokenRefresher;
|
|
5
|
+
}
|
|
6
|
+
export declare class OAuth2CalmConnection extends AbstractCalmConnection {
|
|
7
|
+
private readonly tokenRefresher;
|
|
8
|
+
constructor(options: IOAuth2CalmConnectionOptions);
|
|
9
|
+
connect(): Promise<void>;
|
|
10
|
+
protected attachAuth(): Promise<Record<string, string>>;
|
|
11
|
+
protected onAuthFailure(status: number): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=OAuth2CalmConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuth2CalmConnection.d.ts","sourceRoot":"","sources":["../../../src/server/connection/OAuth2CalmConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,KAAK,8BAA8B,EACpC,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,4BACf,SAAQ,8BAA8B;IACtC,cAAc,EAAE,eAAe,CAAC;CACjC;AAED,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;gBACrC,OAAO,EAAE,4BAA4B;IAK3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;cAId,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;cAK7C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAOhE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAuth2CalmConnection = void 0;
|
|
4
|
+
const AbstractCalmConnection_1 = require("./AbstractCalmConnection");
|
|
5
|
+
class OAuth2CalmConnection extends AbstractCalmConnection_1.AbstractCalmConnection {
|
|
6
|
+
tokenRefresher;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super(options);
|
|
9
|
+
this.tokenRefresher = options.tokenRefresher;
|
|
10
|
+
}
|
|
11
|
+
async connect() {
|
|
12
|
+
await this.tokenRefresher.getToken();
|
|
13
|
+
}
|
|
14
|
+
async attachAuth() {
|
|
15
|
+
const token = await this.tokenRefresher.getToken();
|
|
16
|
+
return { Authorization: `Bearer ${token}` };
|
|
17
|
+
}
|
|
18
|
+
async onAuthFailure(status) {
|
|
19
|
+
if (status === 401 || status === 403) {
|
|
20
|
+
await this.tokenRefresher.refreshToken();
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.OAuth2CalmConnection = OAuth2CalmConnection;
|
|
27
|
+
//# sourceMappingURL=OAuth2CalmConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuth2CalmConnection.js","sourceRoot":"","sources":["../../../src/server/connection/OAuth2CalmConnection.ts"],"names":[],"mappings":";;;AACA,qEAGkC;AAOlC,MAAa,oBAAqB,SAAQ,+CAAsB;IAC7C,cAAc,CAAkB;IACjD,YAAY,OAAqC;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,UAAU;QACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QACnD,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;IAC9C,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,MAAc;QAC1C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAvBD,oDAuBC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AbstractCalmConnection, type IAbstractCalmConnectionOptions } from './AbstractCalmConnection';
|
|
2
|
+
export interface ISandboxCalmConnectionOptions extends IAbstractCalmConnectionOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class SandboxCalmConnection extends AbstractCalmConnection {
|
|
6
|
+
private readonly apiKey;
|
|
7
|
+
constructor(options: ISandboxCalmConnectionOptions);
|
|
8
|
+
protected attachAuth(): Promise<Record<string, string>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=SandboxCalmConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxCalmConnection.d.ts","sourceRoot":"","sources":["../../../src/server/connection/SandboxCalmConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,KAAK,8BAA8B,EACpC,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,6BACf,SAAQ,8BAA8B;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAsB,SAAQ,sBAAsB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBACpB,OAAO,EAAE,6BAA6B;cAIlC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAG9D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SandboxCalmConnection = void 0;
|
|
4
|
+
const AbstractCalmConnection_1 = require("./AbstractCalmConnection");
|
|
5
|
+
class SandboxCalmConnection extends AbstractCalmConnection_1.AbstractCalmConnection {
|
|
6
|
+
apiKey;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super(options);
|
|
9
|
+
this.apiKey = options.apiKey;
|
|
10
|
+
}
|
|
11
|
+
async attachAuth() {
|
|
12
|
+
return { APIKey: this.apiKey };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.SandboxCalmConnection = SandboxCalmConnection;
|
|
16
|
+
//# sourceMappingURL=SandboxCalmConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxCalmConnection.js","sourceRoot":"","sources":["../../../src/server/connection/SandboxCalmConnection.ts"],"names":[],"mappings":";;;AAAA,qEAGkC;AAOlC,MAAa,qBAAsB,SAAQ,+CAAsB;IAC9C,MAAM,CAAS;IAChC,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IACS,KAAK,CAAC,UAAU;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;CACF;AATD,sDASC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ITokenRefresher } from '@mcp-abap-adt/interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal XSUAA `client_credentials` refresher — sufficient for
|
|
4
|
+
* standalone-mode servers without a shared auth-broker. Caches the
|
|
5
|
+
* token until `refreshToken()` is called. Consumers running
|
|
6
|
+
* `@mcp-abap-adt/auth-broker` can pass their own ITokenRefresher to
|
|
7
|
+
* the connection factory instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare class XsuaaRefresher implements ITokenRefresher {
|
|
10
|
+
private readonly uaaUrl;
|
|
11
|
+
private readonly clientId;
|
|
12
|
+
private readonly clientSecret;
|
|
13
|
+
private cached?;
|
|
14
|
+
constructor(uaaUrl: string, clientId: string, clientSecret: string);
|
|
15
|
+
getToken(): Promise<string>;
|
|
16
|
+
refreshToken(): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=XsuaaRefresher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XsuaaRefresher.d.ts","sourceRoot":"","sources":["../../../src/server/connection/XsuaaRefresher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,eAAe;IAIlD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAL/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAGL,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM;IAGjC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAK3B,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CA2BtC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XsuaaRefresher = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Minimal XSUAA `client_credentials` refresher — sufficient for
|
|
6
|
+
* standalone-mode servers without a shared auth-broker. Caches the
|
|
7
|
+
* token until `refreshToken()` is called. Consumers running
|
|
8
|
+
* `@mcp-abap-adt/auth-broker` can pass their own ITokenRefresher to
|
|
9
|
+
* the connection factory instead.
|
|
10
|
+
*/
|
|
11
|
+
class XsuaaRefresher {
|
|
12
|
+
uaaUrl;
|
|
13
|
+
clientId;
|
|
14
|
+
clientSecret;
|
|
15
|
+
cached;
|
|
16
|
+
constructor(uaaUrl, clientId, clientSecret) {
|
|
17
|
+
this.uaaUrl = uaaUrl;
|
|
18
|
+
this.clientId = clientId;
|
|
19
|
+
this.clientSecret = clientSecret;
|
|
20
|
+
}
|
|
21
|
+
async getToken() {
|
|
22
|
+
if (!this.cached)
|
|
23
|
+
return this.refreshToken();
|
|
24
|
+
return this.cached;
|
|
25
|
+
}
|
|
26
|
+
async refreshToken() {
|
|
27
|
+
const url = `${this.uaaUrl.replace(/\/$/, '')}/oauth/token`;
|
|
28
|
+
const basic = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
|
|
29
|
+
const response = await fetch(url, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Basic ${basic}`,
|
|
33
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
34
|
+
Accept: 'application/json',
|
|
35
|
+
},
|
|
36
|
+
body: 'grant_type=client_credentials',
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
const body = await response.text().catch(() => '');
|
|
40
|
+
throw new Error(`XSUAA token request failed: ${response.status} ${response.statusText} — ${body.slice(0, 200)}`);
|
|
41
|
+
}
|
|
42
|
+
const json = (await response.json());
|
|
43
|
+
if (!json.access_token) {
|
|
44
|
+
throw new Error('XSUAA token response missing access_token');
|
|
45
|
+
}
|
|
46
|
+
this.cached = json.access_token;
|
|
47
|
+
return this.cached;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.XsuaaRefresher = XsuaaRefresher;
|
|
51
|
+
//# sourceMappingURL=XsuaaRefresher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XsuaaRefresher.js","sourceRoot":"","sources":["../../../src/server/connection/XsuaaRefresher.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAa,cAAc;IAIN;IACA;IACA;IALX,MAAM,CAAU;IAExB,YACmB,MAAc,EACd,QAAgB,EAChB,YAAoB;QAFpB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;IACpC,CAAC;IAEJ,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,CACzE,QAAQ,CACT,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,KAAK,EAAE;gBAC/B,cAAc,EAAE,mCAAmC;gBACnD,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAChG,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAzCD,wCAyCC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ICalmConnection, ILogger, ITokenRefresher } from '@mcp-abap-adt/interfaces';
|
|
2
|
+
import type { ICalmServerConfig } from '../config';
|
|
3
|
+
export interface ICreateCalmConnectionOverrides {
|
|
4
|
+
/** Bring-your-own refresher; overrides the default XsuaaRefresher. */
|
|
5
|
+
tokenRefresher?: ITokenRefresher;
|
|
6
|
+
/**
|
|
7
|
+
* Logger passed through to the connection. In a stdio runtime pass a
|
|
8
|
+
* stderr-only logger (`StderrLogger`); never one that writes stdout.
|
|
9
|
+
*/
|
|
10
|
+
logger?: ILogger;
|
|
11
|
+
}
|
|
12
|
+
export declare function createCalmConnection(config: ICalmServerConfig, overrides?: ICreateCalmConnectionOverrides): ICalmConnection;
|
|
13
|
+
//# sourceMappingURL=createCalmConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCalmConnection.d.ts","sourceRoot":"","sources":["../../../src/server/connection/createCalmConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,MAAM,WAAW,8BAA8B;IAC7C,sEAAsE;IACtE,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EACzB,SAAS,GAAE,8BAAmC,GAC7C,eAAe,CA2BjB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCalmConnection = createCalmConnection;
|
|
4
|
+
const OAuth2CalmConnection_1 = require("./OAuth2CalmConnection");
|
|
5
|
+
const SandboxCalmConnection_1 = require("./SandboxCalmConnection");
|
|
6
|
+
const XsuaaRefresher_1 = require("./XsuaaRefresher");
|
|
7
|
+
function createCalmConnection(config, overrides = {}) {
|
|
8
|
+
if (config.mode === 'oauth2') {
|
|
9
|
+
const tokenRefresher = overrides.tokenRefresher ??
|
|
10
|
+
new XsuaaRefresher_1.XsuaaRefresher(config.uaaUrl, config.uaaClientId, config.uaaClientSecret);
|
|
11
|
+
return new OAuth2CalmConnection_1.OAuth2CalmConnection({
|
|
12
|
+
baseUrl: config.baseUrl,
|
|
13
|
+
tokenRefresher,
|
|
14
|
+
defaultTimeout: config.timeoutMs,
|
|
15
|
+
logger: overrides.logger,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (config.mode === 'sandbox') {
|
|
19
|
+
return new SandboxCalmConnection_1.SandboxCalmConnection({
|
|
20
|
+
baseUrl: config.baseUrl,
|
|
21
|
+
apiKey: config.apiKey,
|
|
22
|
+
defaultTimeout: config.timeoutMs,
|
|
23
|
+
logger: overrides.logger,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Unsupported CALM mode: ${config.mode}`);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=createCalmConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCalmConnection.js","sourceRoot":"","sources":["../../../src/server/connection/createCalmConnection.ts"],"names":[],"mappings":";;AAoBA,oDA8BC;AA5CD,iEAA8D;AAC9D,mEAAgE;AAChE,qDAAkD;AAYlD,SAAgB,oBAAoB,CAClC,MAAyB,EACzB,YAA4C,EAAE;IAE9C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,cAAc,GAClB,SAAS,CAAC,cAAc;YACxB,IAAI,+BAAc,CAChB,MAAM,CAAC,MAAgB,EACvB,MAAM,CAAC,WAAqB,EAC5B,MAAM,CAAC,eAAyB,CACjC,CAAC;QACJ,OAAO,IAAI,2CAAoB,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc;YACd,cAAc,EAAE,MAAM,CAAC,SAAS;YAChC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,6CAAqB,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAgB;YAC/B,cAAc,EAAE,MAAM,CAAC,SAAS;YAChC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,KAAK,CACb,0BAA2B,MAA2B,CAAC,IAAI,EAAE,CAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { IAbstractCalmConnectionOptions } from './AbstractCalmConnection';
|
|
2
|
+
export { AbstractCalmConnection } from './AbstractCalmConnection';
|
|
3
|
+
export { createCalmConnection, type ICreateCalmConnectionOverrides, } from './createCalmConnection';
|
|
4
|
+
export type { IOAuth2CalmConnectionOptions } from './OAuth2CalmConnection';
|
|
5
|
+
export { OAuth2CalmConnection } from './OAuth2CalmConnection';
|
|
6
|
+
export type { ISandboxCalmConnectionOptions } from './SandboxCalmConnection';
|
|
7
|
+
export { SandboxCalmConnection } from './SandboxCalmConnection';
|
|
8
|
+
export { type CalmServiceRouteMap, DEFAULT_CALM_SERVICE_ROUTES, } from './serviceRoutes';
|
|
9
|
+
export { XsuaaRefresher } from './XsuaaRefresher';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/connection/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,KAAK,8BAA8B,GACpC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,mBAAmB,EACxB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XsuaaRefresher = exports.DEFAULT_CALM_SERVICE_ROUTES = exports.SandboxCalmConnection = exports.OAuth2CalmConnection = exports.createCalmConnection = exports.AbstractCalmConnection = void 0;
|
|
4
|
+
var AbstractCalmConnection_1 = require("./AbstractCalmConnection");
|
|
5
|
+
Object.defineProperty(exports, "AbstractCalmConnection", { enumerable: true, get: function () { return AbstractCalmConnection_1.AbstractCalmConnection; } });
|
|
6
|
+
var createCalmConnection_1 = require("./createCalmConnection");
|
|
7
|
+
Object.defineProperty(exports, "createCalmConnection", { enumerable: true, get: function () { return createCalmConnection_1.createCalmConnection; } });
|
|
8
|
+
var OAuth2CalmConnection_1 = require("./OAuth2CalmConnection");
|
|
9
|
+
Object.defineProperty(exports, "OAuth2CalmConnection", { enumerable: true, get: function () { return OAuth2CalmConnection_1.OAuth2CalmConnection; } });
|
|
10
|
+
var SandboxCalmConnection_1 = require("./SandboxCalmConnection");
|
|
11
|
+
Object.defineProperty(exports, "SandboxCalmConnection", { enumerable: true, get: function () { return SandboxCalmConnection_1.SandboxCalmConnection; } });
|
|
12
|
+
var serviceRoutes_1 = require("./serviceRoutes");
|
|
13
|
+
Object.defineProperty(exports, "DEFAULT_CALM_SERVICE_ROUTES", { enumerable: true, get: function () { return serviceRoutes_1.DEFAULT_CALM_SERVICE_ROUTES; } });
|
|
14
|
+
var XsuaaRefresher_1 = require("./XsuaaRefresher");
|
|
15
|
+
Object.defineProperty(exports, "XsuaaRefresher", { enumerable: true, get: function () { return XsuaaRefresher_1.XsuaaRefresher; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/connection/index.ts"],"names":[],"mappings":";;;AACA,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,+DAGgC;AAF9B,4HAAA,oBAAoB,OAAA;AAItB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAE7B,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAC9B,iDAGyB;AADvB,4HAAA,2BAA2B,OAAA;AAE7B,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CalmService } from '@mcp-abap-adt/interfaces';
|
|
2
|
+
export type CalmServiceRouteMap = Record<CalmService, string>;
|
|
3
|
+
/**
|
|
4
|
+
* Cloud ALM service route suffixes appended to `baseUrl` verbatim.
|
|
5
|
+
*
|
|
6
|
+
* Full URL = `joinUrl(baseUrl, serviceRoute)`. `baseUrl` already
|
|
7
|
+
* includes any tenant mount prefix (for OAuth2 tenants that is the
|
|
8
|
+
* `/api` that SAP puts in `endpoints.Api`; for sandbox it is the
|
|
9
|
+
* `/SAPCALM` suffix). The connection layer does NOT inject a prefix.
|
|
10
|
+
*
|
|
11
|
+
* Seeded from `sap-cloud-alm-odata-mcp/src/config.rs`; verify against
|
|
12
|
+
* a live tenant. Override per-connection via the `serviceRoutes` ctor
|
|
13
|
+
* option.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_CALM_SERVICE_ROUTES: CalmServiceRouteMap;
|
|
16
|
+
//# sourceMappingURL=serviceRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceRoutes.d.ts","sourceRoot":"","sources":["../../../src/server/connection/serviceRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,EAAE,mBAUzC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CALM_SERVICE_ROUTES = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Cloud ALM service route suffixes appended to `baseUrl` verbatim.
|
|
6
|
+
*
|
|
7
|
+
* Full URL = `joinUrl(baseUrl, serviceRoute)`. `baseUrl` already
|
|
8
|
+
* includes any tenant mount prefix (for OAuth2 tenants that is the
|
|
9
|
+
* `/api` that SAP puts in `endpoints.Api`; for sandbox it is the
|
|
10
|
+
* `/SAPCALM` suffix). The connection layer does NOT inject a prefix.
|
|
11
|
+
*
|
|
12
|
+
* Seeded from `sap-cloud-alm-odata-mcp/src/config.rs`; verify against
|
|
13
|
+
* a live tenant. Override per-connection via the `serviceRoutes` ctor
|
|
14
|
+
* option.
|
|
15
|
+
*/
|
|
16
|
+
exports.DEFAULT_CALM_SERVICE_ROUTES = {
|
|
17
|
+
features: '/calm-features/v1',
|
|
18
|
+
documents: '/calm-documents/v1',
|
|
19
|
+
tasks: '/calm-tasks/v1',
|
|
20
|
+
projects: '/calm-projects/v1',
|
|
21
|
+
testManagement: '/calm-testmanagement/v1',
|
|
22
|
+
hierarchy: '/calm-processhierarchy/v1',
|
|
23
|
+
analytics: '/calm-analytics/v1/odata/v4/analytics',
|
|
24
|
+
processMonitoring: '/calm-processmonitoring/v1',
|
|
25
|
+
logs: '/calm-logs/v1',
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=serviceRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceRoutes.js","sourceRoot":"","sources":["../../../src/server/connection/serviceRoutes.ts"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;GAWG;AACU,QAAA,2BAA2B,GAAwB;IAC9D,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,oBAAoB;IAC/B,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,mBAAmB;IAC7B,cAAc,EAAE,yBAAyB;IACzC,SAAS,EAAE,2BAA2B;IACtC,SAAS,EAAE,uCAAuC;IAClD,iBAAiB,EAAE,4BAA4B;IAC/C,IAAI,EAAE,eAAe;CACtB,CAAC"}
|
package/dist/server/runStdio.js
CHANGED
|
@@ -8,7 +8,7 @@ const buildClient_1 = require("./buildClient");
|
|
|
8
8
|
const config_1 = require("./config");
|
|
9
9
|
const stderrLogger_1 = require("./stderrLogger");
|
|
10
10
|
const PACKAGE_NAME = '@mcp-abap-adt/calm-server';
|
|
11
|
-
const PACKAGE_VERSION = '0.
|
|
11
|
+
const PACKAGE_VERSION = '0.3.0';
|
|
12
12
|
/**
|
|
13
13
|
* Entry point for standalone stdio mode. Reads `.env` + env vars,
|
|
14
14
|
* builds a `CalmClient`, wires all tool groups onto a
|
|
@@ -20,7 +20,7 @@ const PACKAGE_VERSION = '0.2.1';
|
|
|
20
20
|
async function runStdio() {
|
|
21
21
|
const logger = new stderrLogger_1.StderrLogger();
|
|
22
22
|
const config = (0, config_1.readConfig)();
|
|
23
|
-
const calm = (0, buildClient_1.buildCalmClient)(config);
|
|
23
|
+
const calm = await (0, buildClient_1.buildCalmClient)(config, { logger });
|
|
24
24
|
const server = new BaseCalmMcpServer_1.BaseCalmMcpServer({
|
|
25
25
|
name: PACKAGE_NAME,
|
|
26
26
|
version: PACKAGE_VERSION,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runStdio.js","sourceRoot":"","sources":["../../src/server/runStdio.ts"],"names":[],"mappings":";;AAkBA,4BAwCC;AA1DD,wEAAiF;AACjF,oCAAsC;AACtC,2DAAwD;AACxD,+CAAgD;AAChD,qCAAsC;AACtC,iDAA8C;AAE9C,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC;;;;;;;GAOG;AACI,KAAK,UAAU,QAAQ;IAC5B,MAAM,MAAM,GAAG,IAAI,2BAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runStdio.js","sourceRoot":"","sources":["../../src/server/runStdio.ts"],"names":[],"mappings":";;AAkBA,4BAwCC;AA1DD,wEAAiF;AACjF,oCAAsC;AACtC,2DAAwD;AACxD,+CAAgD;AAChD,qCAAsC;AACtC,iDAA8C;AAE9C,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC;;;;;;;GAOG;AACI,KAAK,UAAU,QAAQ;IAC5B,MAAM,MAAM,GAAG,IAAI,2BAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAe,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,qCAAiB,CAAC;QACnC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe;QACxB,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,CAAC,GAAG,kBAAU,CAAC;KACxB,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;QAC/B,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,MAAM;KAC3C,CAAC,CAAC;IAEH,mEAAmE;IACnE,0DAA0D;IAC1D,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAEhD,mEAAmE;IACnE,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IFeature } from '@mcp-abap-adt/calm-client';
|
|
2
2
|
import type { ICalmHandlerEntry } from '../../registry/types';
|
|
3
3
|
export interface IGetFeatureByDisplayIdArgs {
|
|
4
|
+
projectId: string;
|
|
4
5
|
displayId: string;
|
|
5
6
|
}
|
|
6
7
|
export declare const getFeatureByDisplayIdTool: ICalmHandlerEntry<IGetFeatureByDisplayIdArgs, IFeature>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeatureByDisplayId.d.ts","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"getFeatureByDisplayId.d.ts","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD,eAAO,MAAM,yBAAyB,EAAE,iBAAiB,CACvD,0BAA0B,EAC1B,QAAQ,CAIT,CAAC"}
|
|
@@ -4,11 +4,15 @@ exports.getFeatureByDisplayIdTool = void 0;
|
|
|
4
4
|
const utils_1 = require("../../utils");
|
|
5
5
|
const definition = {
|
|
6
6
|
name: 'calm_features_get_by_display_id',
|
|
7
|
-
description: 'Fetch a Cloud ALM feature by its human-facing displayId (e.g. "6-123" where 6 is the project
|
|
7
|
+
description: 'Fetch a Cloud ALM feature by its human-facing displayId (e.g. "6-123" where 6 is the project sequence and 123 is the feature sequence). Requires `projectId` — the underlying Features endpoint is project-scoped, and the displayId itself is unique only within a project. Returns the full feature record; raises NOT_FOUND if no feature matches inside that project.',
|
|
8
8
|
inputSchema: {
|
|
9
9
|
type: 'object',
|
|
10
|
-
required: ['displayId'],
|
|
10
|
+
required: ['projectId', 'displayId'],
|
|
11
11
|
properties: {
|
|
12
|
+
projectId: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'Project id the feature belongs to.',
|
|
15
|
+
},
|
|
12
16
|
displayId: {
|
|
13
17
|
type: 'string',
|
|
14
18
|
description: 'Feature displayId, e.g. "6-123".',
|
|
@@ -17,14 +21,16 @@ const definition = {
|
|
|
17
21
|
},
|
|
18
22
|
};
|
|
19
23
|
const handler = async (ctx, args) => {
|
|
20
|
-
if (!args?.displayId) {
|
|
24
|
+
if (!args?.projectId || !args?.displayId) {
|
|
21
25
|
throw new utils_1.CalmToolError({
|
|
22
26
|
code: 'INVALID_ARGUMENT',
|
|
23
|
-
message: 'displayId
|
|
27
|
+
message: 'projectId and displayId are required',
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
30
|
try {
|
|
27
|
-
return await ctx.calm
|
|
31
|
+
return await ctx.calm
|
|
32
|
+
.getFeatures()
|
|
33
|
+
.getByDisplayId(args.projectId, args.displayId);
|
|
28
34
|
}
|
|
29
35
|
catch (err) {
|
|
30
36
|
throw (0, utils_1.mapCalmErrorForTool)(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeatureByDisplayId.js","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":";;;AAMA,uCAAiE;
|
|
1
|
+
{"version":3,"file":"getFeatureByDisplayId.js","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":";;;AAMA,uCAAiE;AAOjE,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,iCAAiC;IACvC,WAAW,EACT,2WAA2W;IAC7W,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;QACpC,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;SACF;KACF;CACF,CAAC;AAEF,MAAM,OAAO,GAA0D,KAAK,EAC1E,GAAG,EACH,IAAI,EACJ,EAAE;IACF,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,qBAAa,CAAC;YACtB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,sCAAsC;SAChD,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,IAAI;aAClB,WAAW,EAAE;aACb,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,2BAAmB,EAAC,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEW,QAAA,yBAAyB,GAGlC;IACF,cAAc,EAAE,UAAU;IAC1B,OAAO;CACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFeatures.d.ts","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAgBrB,QAAA,MAAM,cAAc,uMAgBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"listFeatures.d.ts","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAgBrB,QAAA,MAAM,cAAc,uMAgBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA6GD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,CAC9C,iBAAiB,EACjB,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAIjC,CAAC"}
|
|
@@ -82,7 +82,10 @@ const definition = {
|
|
|
82
82
|
function buildQuery(args) {
|
|
83
83
|
const limit = (0, utils_1.clampListLimit)(args.limit);
|
|
84
84
|
const offset = args.offset && args.offset > 0 ? Math.floor(args.offset) : 0;
|
|
85
|
-
|
|
85
|
+
// projectId is now passed positionally to calm.getFeatures().list
|
|
86
|
+
// and ends up on the URL as ?projectId=…; it must NOT also appear
|
|
87
|
+
// in $filter.
|
|
88
|
+
const filter = (0, utils_1.joinAndFilters)(args.status
|
|
86
89
|
? `statusCode eq '${(0, utils_1.escapeODataString)(args.status)}'`
|
|
87
90
|
: undefined, args.priorityCode
|
|
88
91
|
? `priorityCode eq '${(0, utils_1.escapeODataString)(args.priorityCode)}'`
|
|
@@ -109,7 +112,7 @@ const handler = async (ctx, args) => {
|
|
|
109
112
|
}
|
|
110
113
|
const { query, limit, offset } = buildQuery(args);
|
|
111
114
|
try {
|
|
112
|
-
const collection = await ctx.calm.getFeatures().list(query);
|
|
115
|
+
const collection = await ctx.calm.getFeatures().list(args.projectId, query);
|
|
113
116
|
return (0, utils_1.toListResponse)(collection, { limit, offset });
|
|
114
117
|
}
|
|
115
118
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFeatures.js","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":";;;AAAA,2DAAsE;AAMtE,uCAUqB;AAErB;;;;GAIG;AACH,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;CACJ,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,aAAa;IACb,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,SAAS;IACT,eAAe;IACf,YAAY;IACZ,WAAW;IACX,MAAM;IACN,cAAc;IACd,MAAM;CACE,CAAC;AAeX,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,gUAAgU;IAClU,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sEAAsE;aACzE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wHAAwH;aAC3H;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wGAAwG;aAC3G;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+CAA+C;aAC7D;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,WAAW,EACT,sHAAsH;gBACxH,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gCAAgC,0BAAkB,eAAe,sBAAc,IAAI;gBAChG,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,sBAAc;aACxB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,mCAAmC;gBAChD,OAAO,EAAE,CAAC;aACX;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,+CAA+C;aAC7D;SACF;KACF;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,IAAuB;IAKzC,MAAM,KAAK,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAG,IAAA,sBAAc,EAC3B,
|
|
1
|
+
{"version":3,"file":"listFeatures.js","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":";;;AAAA,2DAAsE;AAMtE,uCAUqB;AAErB;;;;GAIG;AACH,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;CACJ,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,aAAa;IACb,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,SAAS;IACT,eAAe;IACf,YAAY;IACZ,WAAW;IACX,MAAM;IACN,cAAc;IACd,MAAM;CACE,CAAC;AAeX,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,gUAAgU;IAClU,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sEAAsE;aACzE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wHAAwH;aAC3H;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wGAAwG;aAC3G;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+CAA+C;aAC7D;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,WAAW,EACT,sHAAsH;gBACxH,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gCAAgC,0BAAkB,eAAe,sBAAc,IAAI;gBAChG,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,sBAAc;aACxB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,mCAAmC;gBAChD,OAAO,EAAE,CAAC;aACX;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,+CAA+C;aAC7D;SACF;KACF;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,IAAuB;IAKzC,MAAM,KAAK,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,kEAAkE;IAClE,kEAAkE;IAClE,cAAc;IACd,MAAM,MAAM,GAAG,IAAA,sBAAc,EAC3B,IAAI,CAAC,MAAM;QACT,CAAC,CAAC,kBAAkB,IAAA,yBAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG;QACrD,CAAC,CAAC,SAAS,EACb,IAAI,CAAC,YAAY;QACf,CAAC,CAAC,oBAAoB,IAAA,yBAAiB,EAAC,IAAI,CAAC,YAAY,CAAC,GAAG;QAC7D,CAAC,CAAC,SAAS,EACb,IAAI,CAAC,aAAa;QAChB,CAAC,CAAC,qBAAqB,IAAA,yBAAiB,EAAC,IAAI,CAAC,aAAa,CAAC,GAAG;QAC/D,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IAEvE,IAAI,KAAK,GAAG,wBAAU,CAAC,GAAG,EAAE;SACzB,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;SACnB,GAAG,CAAC,KAAK,CAAC;SACV,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,IAAI,MAAM;QAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAE1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,GAGT,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACtB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,qBAAa,CAAC;YACtB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5E,OAAO,IAAA,sBAAc,EAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,2BAAmB,EAAC,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEW,QAAA,gBAAgB,GAGzB;IACF,cAAc,EAAE,UAAU;IAC1B,OAAO;CACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listTasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAYrB,QAAA,MAAM,cAAc,kOAiBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"listTasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAYrB,QAAA,MAAM,cAAc,kOAiBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoED,eAAO,MAAM,aAAa,EAAE,iBAAiB,CAC3C,cAAc,EACd,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAI9B,CAAC"}
|