arc-1 0.9.13 → 0.9.15
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 +17 -4
- package/dist/adt/class-structure.d.ts +1 -1
- package/dist/adt/class-structure.js +1 -1
- package/dist/adt/client.d.ts +16 -3
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +40 -35
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/ddic-xml.d.ts +9 -0
- package/dist/adt/ddic-xml.d.ts.map +1 -1
- package/dist/adt/ddic-xml.js +49 -53
- package/dist/adt/ddic-xml.js.map +1 -1
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +46 -15
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/fm-signature.d.ts +1 -1
- package/dist/adt/fm-signature.js +1 -1
- package/dist/adt/rap-generate.js +1 -1
- package/dist/adt/rap-generate.js.map +1 -1
- package/dist/adt/rap-handlers.d.ts +1 -1
- package/dist/adt/rap-handlers.js +1 -1
- package/dist/adt/refactoring.d.ts.map +1 -1
- package/dist/adt/refactoring.js +11 -14
- package/dist/adt/refactoring.js.map +1 -1
- package/dist/adt/server-driven.d.ts +46 -2
- package/dist/adt/server-driven.d.ts.map +1 -1
- package/dist/adt/server-driven.js +13 -3
- package/dist/adt/server-driven.js.map +1 -1
- package/dist/adt/xml-parser.d.ts +8 -1
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +57 -49
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/authz/policy.d.ts +1 -1
- package/dist/authz/policy.js +1 -1
- package/dist/cache/cache.d.ts +1 -0
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/inactive-list-cache.d.ts +4 -4
- package/dist/cache/inactive-list-cache.d.ts.map +1 -1
- package/dist/cache/inactive-list-cache.js +19 -12
- package/dist/cache/inactive-list-cache.js.map +1 -1
- package/dist/cache/memory.d.ts +1 -0
- package/dist/cache/memory.d.ts.map +1 -1
- package/dist/cache/memory.js +3 -0
- package/dist/cache/memory.js.map +1 -1
- package/dist/cache/sqlite.d.ts +1 -0
- package/dist/cache/sqlite.d.ts.map +1 -1
- package/dist/cache/sqlite.js +3 -0
- package/dist/cache/sqlite.js.map +1 -1
- package/dist/cache/warmup.d.ts.map +1 -1
- package/dist/cache/warmup.js +85 -38
- package/dist/cache/warmup.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/context/compressor.d.ts.map +1 -1
- package/dist/context/compressor.js +22 -13
- package/dist/context/compressor.js.map +1 -1
- package/dist/context/contract.d.ts.map +1 -1
- package/dist/context/contract.js +4 -3
- package/dist/context/contract.js.map +1 -1
- package/dist/context/deps.d.ts.map +1 -1
- package/dist/context/deps.js +3 -2
- package/dist/context/deps.js.map +1 -1
- package/dist/context/grep.d.ts +3 -1
- package/dist/context/grep.d.ts.map +1 -1
- package/dist/context/grep.js +83 -1
- package/dist/context/grep.js.map +1 -1
- package/dist/context/method-surgery.d.ts.map +1 -1
- package/dist/context/method-surgery.js +3 -2
- package/dist/context/method-surgery.js.map +1 -1
- package/dist/handlers/activate.d.ts +25 -0
- package/dist/handlers/activate.d.ts.map +1 -0
- package/dist/handlers/activate.js +334 -0
- package/dist/handlers/activate.js.map +1 -0
- package/dist/handlers/cache-security.d.ts +22 -0
- package/dist/handlers/cache-security.d.ts.map +1 -0
- package/dist/handlers/cache-security.js +51 -0
- package/dist/handlers/cache-security.js.map +1 -0
- package/dist/handlers/cds-hints.d.ts +26 -0
- package/dist/handlers/cds-hints.d.ts.map +1 -0
- package/dist/handlers/cds-hints.js +380 -0
- package/dist/handlers/cds-hints.js.map +1 -0
- package/dist/handlers/context.d.ts +10 -0
- package/dist/handlers/context.d.ts.map +1 -0
- package/dist/handlers/context.js +344 -0
- package/dist/handlers/context.js.map +1 -0
- package/dist/handlers/diagnose.d.ts +8 -0
- package/dist/handlers/diagnose.d.ts.map +1 -0
- package/dist/handlers/diagnose.js +274 -0
- package/dist/handlers/diagnose.js.map +1 -0
- package/dist/handlers/dispatch.d.ts +39 -0
- package/dist/handlers/dispatch.d.ts.map +1 -0
- package/dist/handlers/dispatch.js +640 -0
- package/dist/handlers/dispatch.js.map +1 -0
- package/dist/handlers/feature-cache.d.ts +26 -0
- package/dist/handlers/feature-cache.d.ts.map +1 -0
- package/dist/handlers/feature-cache.js +45 -0
- package/dist/handlers/feature-cache.js.map +1 -0
- package/dist/handlers/git.d.ts +9 -0
- package/dist/handlers/git.d.ts.map +1 -0
- package/dist/handlers/git.js +227 -0
- package/dist/handlers/git.js.map +1 -0
- package/dist/handlers/lint.d.ts +9 -0
- package/dist/handlers/lint.d.ts.map +1 -0
- package/dist/handlers/lint.js +82 -0
- package/dist/handlers/lint.js.map +1 -0
- package/dist/handlers/manage.d.ts +10 -0
- package/dist/handlers/manage.d.ts.map +1 -0
- package/dist/handlers/manage.js +375 -0
- package/dist/handlers/manage.js.map +1 -0
- package/dist/handlers/navigate.d.ts +8 -0
- package/dist/handlers/navigate.d.ts.map +1 -0
- package/dist/handlers/navigate.js +188 -0
- package/dist/handlers/navigate.js.map +1 -0
- package/dist/handlers/object-types.d.ts +103 -0
- package/dist/handlers/object-types.d.ts.map +1 -0
- package/dist/handlers/object-types.js +476 -0
- package/dist/handlers/object-types.js.map +1 -0
- package/dist/handlers/query.d.ts +7 -0
- package/dist/handlers/query.d.ts.map +1 -0
- package/dist/handlers/query.js +190 -0
- package/dist/handlers/query.js.map +1 -0
- package/dist/handlers/read.d.ts +18 -0
- package/dist/handlers/read.d.ts.map +1 -0
- package/dist/handlers/read.js +581 -0
- package/dist/handlers/read.js.map +1 -0
- package/dist/handlers/schemas.d.ts +28 -26
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +17 -153
- package/dist/handlers/schemas.js.map +1 -1
- package/dist/handlers/search.d.ts +24 -0
- package/dist/handlers/search.d.ts.map +1 -0
- package/dist/handlers/search.js +208 -0
- package/dist/handlers/search.js.map +1 -0
- package/dist/handlers/shared.d.ts +19 -0
- package/dist/handlers/shared.d.ts.map +1 -0
- package/dist/handlers/shared.js +23 -0
- package/dist/handlers/shared.js.map +1 -0
- package/dist/handlers/tool-registry.d.ts +44 -0
- package/dist/handlers/tool-registry.d.ts.map +1 -0
- package/dist/handlers/tool-registry.js +152 -0
- package/dist/handlers/tool-registry.js.map +1 -0
- package/dist/handlers/tools.d.ts +9 -0
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +40 -141
- package/dist/handlers/tools.js.map +1 -1
- package/dist/handlers/transport.d.ts +8 -0
- package/dist/handlers/transport.d.ts.map +1 -0
- package/dist/handlers/transport.js +281 -0
- package/dist/handlers/transport.js.map +1 -0
- package/dist/handlers/write/class-surgery.d.ts +18 -0
- package/dist/handlers/write/class-surgery.d.ts.map +1 -0
- package/dist/handlers/write/class-surgery.js +366 -0
- package/dist/handlers/write/class-surgery.js.map +1 -0
- package/dist/handlers/write/context.d.ts +43 -0
- package/dist/handlers/write/context.d.ts.map +1 -0
- package/dist/handlers/write/context.js +5 -0
- package/dist/handlers/write/context.js.map +1 -0
- package/dist/handlers/write/create.d.ts +8 -0
- package/dist/handlers/write/create.d.ts.map +1 -0
- package/dist/handlers/write/create.js +603 -0
- package/dist/handlers/write/create.js.map +1 -0
- package/dist/handlers/write/rap.d.ts +8 -0
- package/dist/handlers/write/rap.d.ts.map +1 -0
- package/dist/handlers/write/rap.js +235 -0
- package/dist/handlers/write/rap.js.map +1 -0
- package/dist/handlers/write/update-delete.d.ts +8 -0
- package/dist/handlers/write/update-delete.d.ts.map +1 -0
- package/dist/handlers/write/update-delete.js +182 -0
- package/dist/handlers/write/update-delete.js.map +1 -0
- package/dist/handlers/write-helpers.d.ts +155 -0
- package/dist/handlers/write-helpers.d.ts.map +1 -0
- package/dist/handlers/write-helpers.js +859 -0
- package/dist/handlers/write-helpers.js.map +1 -0
- package/dist/handlers/write.d.ts +16 -0
- package/dist/handlers/write.d.ts.map +1 -0
- package/dist/handlers/write.js +210 -0
- package/dist/handlers/write.js.map +1 -0
- package/dist/handlers/zod-errors.d.ts +1 -1
- package/dist/handlers/zod-errors.js +1 -1
- package/dist/lint/abaplint-config-cache.d.ts +5 -0
- package/dist/lint/abaplint-config-cache.d.ts.map +1 -0
- package/dist/lint/abaplint-config-cache.js +29 -0
- package/dist/lint/abaplint-config-cache.js.map +1 -0
- package/dist/lint/config-builder.d.ts.map +1 -1
- package/dist/lint/config-builder.js +3 -4
- package/dist/lint/config-builder.js.map +1 -1
- package/dist/lint/lint.d.ts +1 -1
- package/dist/lint/lint.d.ts.map +1 -1
- package/dist/lint/lint.js +3 -2
- package/dist/lint/lint.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +22 -8
- package/dist/server/config.js.map +1 -1
- package/dist/server/mcp-rate-limit.d.ts +1 -1
- package/dist/server/mcp-rate-limit.js +1 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.js +3 -2
- package/dist/server/server.js.map +1 -1
- package/package.json +15 -10
- package/dist/handlers/intent.d.ts +0 -144
- package/dist/handlers/intent.d.ts.map +0 -1
- package/dist/handlers/intent.js +0 -6782
- package/dist/handlers/intent.js.map +0 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAPRead handler — read ABAP source + DDIC metadata, version/draft resolution, grep, table
|
|
3
|
+
* preview. Exports version helpers shared with the write handler.
|
|
4
|
+
*/
|
|
5
|
+
import { decodeKtdText } from '../adt/ddic-xml.js';
|
|
6
|
+
import { isNotFoundError } from '../adt/errors.js';
|
|
7
|
+
import { mapSapReleaseToAbaplintVersion } from '../adt/features.js';
|
|
8
|
+
import { parseFmSignature } from '../adt/fm-signature.js';
|
|
9
|
+
import { isOperationAllowed, OperationType } from '../adt/safety.js';
|
|
10
|
+
import { getServerDrivenObject, isServerDrivenObjectType, supportsServerDrivenObject } from '../adt/server-driven.js';
|
|
11
|
+
import { getAppInfo } from '../adt/ui5-repository.js';
|
|
12
|
+
import { extractCdsElements } from '../context/cds-deps.js';
|
|
13
|
+
import { grepSource } from '../context/grep.js';
|
|
14
|
+
import { extractMethod, formatMethodListing, listMethods } from '../context/method-surgery.js';
|
|
15
|
+
import { logger } from '../server/logger.js';
|
|
16
|
+
import { inactiveListUserKey, invalidateInactiveList } from './cache-security.js';
|
|
17
|
+
import { cachedFeatures, isBtpSystem } from './feature-cache.js';
|
|
18
|
+
import { inferObjectType, normalizeObjectType, objectUrlForTypeRaw } from './object-types.js';
|
|
19
|
+
import { errorResult, textResult } from './shared.js';
|
|
20
|
+
const BTP_HINTS = {
|
|
21
|
+
PROG: 'Executable programs (reports) are not available on BTP ABAP Environment. Use CLAS with IF_OO_ADT_CLASSRUN for console applications.',
|
|
22
|
+
INCL: 'Includes are not available on BTP ABAP Environment. Use classes and interfaces instead — INCLUDE is forbidden in ABAP Cloud.',
|
|
23
|
+
VIEW: 'Classic DDIC views are not available on BTP ABAP Environment. Use DDLS (CDS views) instead.',
|
|
24
|
+
TEXT_ELEMENTS: 'Text elements are not available on BTP ABAP Environment (no classic programs). Use message classes or constant classes instead.',
|
|
25
|
+
VARIANTS: 'Variants are not available on BTP ABAP Environment (no classic programs).',
|
|
26
|
+
SOBJ: 'BOR business objects (SOBJ) are not available on BTP ABAP Environment. Use RAP behavior definitions (BDEF) instead.',
|
|
27
|
+
TRAN: 'Transaction codes (TRAN) are not available on BTP ABAP Environment. Use SAPSearch to find apps and services instead.',
|
|
28
|
+
};
|
|
29
|
+
const VERSIONED_SOURCE_READ_TYPES = new Set([
|
|
30
|
+
'PROG',
|
|
31
|
+
'CLAS',
|
|
32
|
+
'INTF',
|
|
33
|
+
'FUNC',
|
|
34
|
+
'INCL',
|
|
35
|
+
'DDLS',
|
|
36
|
+
'DCLS',
|
|
37
|
+
'BDEF',
|
|
38
|
+
'SRVD',
|
|
39
|
+
'DDLX',
|
|
40
|
+
'SRVB',
|
|
41
|
+
'SKTD',
|
|
42
|
+
'TABL',
|
|
43
|
+
'VIEW',
|
|
44
|
+
]);
|
|
45
|
+
function inactiveTypeMatches(readType, inactiveType) {
|
|
46
|
+
return (inactiveType.split('/')[0] ?? inactiveType).toUpperCase() === readType.toUpperCase();
|
|
47
|
+
}
|
|
48
|
+
export async function resolveVersionAndDraftInfo(client, cachingLayer, type, name, requestedVersion, cacheSecurity) {
|
|
49
|
+
if (!VERSIONED_SOURCE_READ_TYPES.has(type)) {
|
|
50
|
+
return { effectiveVersion: requestedVersion === 'auto' ? 'active' : requestedVersion };
|
|
51
|
+
}
|
|
52
|
+
let draft;
|
|
53
|
+
if (cachingLayer || requestedVersion !== 'active') {
|
|
54
|
+
try {
|
|
55
|
+
const inactiveObjects = cachingLayer
|
|
56
|
+
? await cachingLayer.inactiveLists.getOrFetch(client, inactiveListUserKey(client, cacheSecurity))
|
|
57
|
+
: await client.getInactiveObjects();
|
|
58
|
+
const upperName = name.toUpperCase();
|
|
59
|
+
draft = inactiveObjects.find((object) => inactiveTypeMatches(type, object.type) && object.name.toUpperCase() === upperName);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
logger.debug('Inactive object list unavailable while resolving source version', {
|
|
63
|
+
type,
|
|
64
|
+
name,
|
|
65
|
+
requestedVersion,
|
|
66
|
+
error: err instanceof Error ? err.message : String(err),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (requestedVersion === 'auto') {
|
|
71
|
+
return { effectiveVersion: draft ? 'inactive' : 'active', draft };
|
|
72
|
+
}
|
|
73
|
+
return { effectiveVersion: requestedVersion, draft };
|
|
74
|
+
}
|
|
75
|
+
function sourceVersionWarning(effectiveVersion, draft) {
|
|
76
|
+
if (effectiveVersion === 'active' && draft) {
|
|
77
|
+
const deletion = draft.deleted ? ' deletion' : '';
|
|
78
|
+
const transport = draft.transport ? ` (in transport ${draft.transport})` : '';
|
|
79
|
+
return `Note: You have an unactivated${deletion} draft of this object${transport}. The source below is the LAST ACTIVATED version. To work with your draft, activate it first via SAPActivate or re-run with version='inactive' to read it directly.`;
|
|
80
|
+
}
|
|
81
|
+
if (effectiveVersion === 'inactive' && !draft) {
|
|
82
|
+
return 'Note: No inactive draft exists for this object on the server. Returning the active version.';
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
export async function handleSAPRead(client, args, cachingLayer, cacheSecurity) {
|
|
87
|
+
const type = normalizeObjectType(String(args.type ?? ''));
|
|
88
|
+
const name = String(args.name ?? '');
|
|
89
|
+
const requestedVersion = (args.version ?? 'active');
|
|
90
|
+
// BTP: return helpful error for unavailable types
|
|
91
|
+
if (isBtpSystem() && BTP_HINTS[type]) {
|
|
92
|
+
return errorResult(BTP_HINTS[type]);
|
|
93
|
+
}
|
|
94
|
+
// Server-driven objects (ABAP Platform 2025 / SAP_BASIS 8.16+): DESD, EVTB, DTSC, COTA, …
|
|
95
|
+
// share one AFF generic-object contract (blue:blueSource metadata + AFF JSON source), read
|
|
96
|
+
// via the discovery-gated generic engine instead of the per-type switch below. They bypass
|
|
97
|
+
// the version/draft/cache machinery (no /source/main text; JSON output).
|
|
98
|
+
if (isServerDrivenObjectType(type)) {
|
|
99
|
+
if (!name)
|
|
100
|
+
return errorResult(`"name" is required for SAPRead type=${type}.`);
|
|
101
|
+
if (supportsServerDrivenObject(client.http, type) === false) {
|
|
102
|
+
return errorResult(`SAPRead type=${type} (server-driven object) requires SAP_BASIS 8.16+ (ABAP Platform 2025 / S/4HANA 2025). ` +
|
|
103
|
+
'This system does not expose this object type.');
|
|
104
|
+
}
|
|
105
|
+
const sdo = await getServerDrivenObject(client.http, client.safety, type, name);
|
|
106
|
+
return textResult(JSON.stringify(sdo, null, 2));
|
|
107
|
+
}
|
|
108
|
+
if (args.force_refresh === true && cachingLayer && VERSIONED_SOURCE_READ_TYPES.has(type)) {
|
|
109
|
+
invalidateInactiveList(cachingLayer, client, cacheSecurity);
|
|
110
|
+
cachingLayer.invalidate(type, name, 'all');
|
|
111
|
+
}
|
|
112
|
+
const { effectiveVersion, draft } = await resolveVersionAndDraftInfo(client, cachingLayer, type, name, requestedVersion, cacheSecurity);
|
|
113
|
+
const versionWarning = sourceVersionWarning(effectiveVersion, draft);
|
|
114
|
+
// Helper: get source with cache support, returns cache hit status
|
|
115
|
+
const cachedGet = async (objType, objName, version, fetcher) => {
|
|
116
|
+
if (!cachingLayer) {
|
|
117
|
+
const result = await fetcher(undefined);
|
|
118
|
+
return { source: result.source, cacheHit: false, revalidated: false };
|
|
119
|
+
}
|
|
120
|
+
const { source, hit, revalidated } = await cachingLayer.getSource(objType, objName, fetcher, { version });
|
|
121
|
+
return { source, cacheHit: hit, revalidated };
|
|
122
|
+
};
|
|
123
|
+
/** Prepend draft-awareness notes and cache indicator when the server revalidated a cached source. */
|
|
124
|
+
const cachedTextResult = (source, cacheHit, revalidated, warning) => {
|
|
125
|
+
const note = warning ? `${warning}\n\n` : '';
|
|
126
|
+
const indicator = cacheHit && revalidated ? '[cached:revalidated]\n' : '';
|
|
127
|
+
return textResult(`${note}${indicator}${source}`);
|
|
128
|
+
};
|
|
129
|
+
/** When args.grep is set, return only matching source lines (+context) instead of full source. */
|
|
130
|
+
const grepText = (source) => {
|
|
131
|
+
const g = grepSource(source, String(args.grep));
|
|
132
|
+
return g.invalidPattern ? errorResult(g.output) : textResult(g.output);
|
|
133
|
+
};
|
|
134
|
+
// Structured format is only supported for CLAS type
|
|
135
|
+
if (args.format === 'structured' && type !== 'CLAS') {
|
|
136
|
+
return errorResult('The "structured" format is only supported for CLAS type. Other types return text format.');
|
|
137
|
+
}
|
|
138
|
+
switch (type) {
|
|
139
|
+
case 'PROG': {
|
|
140
|
+
const { source, cacheHit, revalidated } = await cachedGet('PROG', name, effectiveVersion, (ifNoneMatch) => client.getProgram(name, { ifNoneMatch, version: effectiveVersion }));
|
|
141
|
+
if (args.grep)
|
|
142
|
+
return grepText(source);
|
|
143
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
144
|
+
}
|
|
145
|
+
case 'CLAS': {
|
|
146
|
+
// grep: return only matching source lines (+context), annotated with the owning class/method.
|
|
147
|
+
if (args.grep) {
|
|
148
|
+
if (args.method) {
|
|
149
|
+
return errorResult('Do not combine grep with method. Use grep to find code, then method="<name>" to read the full method.');
|
|
150
|
+
}
|
|
151
|
+
const rawSection = args.include;
|
|
152
|
+
// 'main' (and the default) live at /source/main, not /includes/main — read via the
|
|
153
|
+
// cached main path; only real sub-includes go through the raw getClassInclude endpoint.
|
|
154
|
+
const section = rawSection && rawSection.toLowerCase() !== 'main' ? rawSection : undefined;
|
|
155
|
+
let clasSource;
|
|
156
|
+
if (section) {
|
|
157
|
+
try {
|
|
158
|
+
clasSource = (await client.getClassInclude(name, section, { version: effectiveVersion })).source;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (isNotFoundError(err)) {
|
|
162
|
+
return textResult(`Include "${section}" is not available for class ${name}. Run grep without include= to search the full class source.`);
|
|
163
|
+
}
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
clasSource = (await cachedGet('CLAS', name, effectiveVersion, (ifNoneMatch) => client.getClass(name, undefined, { ifNoneMatch, version: effectiveVersion }))).source;
|
|
169
|
+
}
|
|
170
|
+
const abaplintVer = cachedFeatures?.abapRelease
|
|
171
|
+
? mapSapReleaseToAbaplintVersion(cachedFeatures.abapRelease)
|
|
172
|
+
: undefined;
|
|
173
|
+
// MethodInfo is a structural superset of grepSource's MethodRange — pass through directly.
|
|
174
|
+
const listing = listMethods(clasSource, name, abaplintVer);
|
|
175
|
+
const g = grepSource(clasSource, String(args.grep), listing.success ? { methods: listing.methods } : undefined);
|
|
176
|
+
return g.invalidPattern
|
|
177
|
+
? errorResult(g.output)
|
|
178
|
+
: textResult(`[${name} section=${rawSection ?? 'main'}]\n${g.output}`);
|
|
179
|
+
}
|
|
180
|
+
// Structured format: return JSON with metadata + decomposed source
|
|
181
|
+
if (args.format === 'structured') {
|
|
182
|
+
const structured = await client.getClassStructured(name);
|
|
183
|
+
return textResult(JSON.stringify(structured, null, 2));
|
|
184
|
+
}
|
|
185
|
+
const methodParam = args.method;
|
|
186
|
+
if (methodParam && !args.include) {
|
|
187
|
+
// Method-level read — fetch full source then extract (no cache indicator for derived results)
|
|
188
|
+
const { source: fullSource } = await cachedGet('CLAS', name, effectiveVersion, (ifNoneMatch) => client.getClass(name, undefined, { ifNoneMatch, version: effectiveVersion }));
|
|
189
|
+
const abaplintVer = cachedFeatures?.abapRelease
|
|
190
|
+
? mapSapReleaseToAbaplintVersion(cachedFeatures.abapRelease)
|
|
191
|
+
: undefined;
|
|
192
|
+
if (methodParam === '*') {
|
|
193
|
+
const listing = listMethods(fullSource, name, abaplintVer);
|
|
194
|
+
return textResult(formatMethodListing(listing));
|
|
195
|
+
}
|
|
196
|
+
const extracted = extractMethod(fullSource, name, methodParam, abaplintVer);
|
|
197
|
+
if (!extracted.success) {
|
|
198
|
+
return errorResult(extracted.error ?? `Method "${methodParam}" not found in ${name}.`);
|
|
199
|
+
}
|
|
200
|
+
return cachedTextResult(extracted.methodSource, false, false, versionWarning);
|
|
201
|
+
}
|
|
202
|
+
// Only cache the full merged source (no include param), not individual includes
|
|
203
|
+
if (!args.include) {
|
|
204
|
+
const { source, cacheHit, revalidated } = await cachedGet('CLAS', name, effectiveVersion, (ifNoneMatch) => client.getClass(name, undefined, { ifNoneMatch, version: effectiveVersion }));
|
|
205
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
206
|
+
}
|
|
207
|
+
const includeResult = await client.getClass(name, args.include, {
|
|
208
|
+
version: effectiveVersion,
|
|
209
|
+
});
|
|
210
|
+
return cachedTextResult(includeResult.source, false, false, versionWarning);
|
|
211
|
+
}
|
|
212
|
+
case 'INTF': {
|
|
213
|
+
const { source, cacheHit, revalidated } = await cachedGet('INTF', name, effectiveVersion, (ifNoneMatch) => client.getInterface(name, { ifNoneMatch, version: effectiveVersion }));
|
|
214
|
+
if (args.grep)
|
|
215
|
+
return grepText(source);
|
|
216
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
217
|
+
}
|
|
218
|
+
case 'FUNC': {
|
|
219
|
+
let group = String(args.group ?? '');
|
|
220
|
+
if (!group) {
|
|
221
|
+
// Use cached func group resolution if available
|
|
222
|
+
const resolved = cachingLayer
|
|
223
|
+
? await cachingLayer.resolveFuncGroup(client, name)
|
|
224
|
+
: await client.resolveFunctionGroup(name);
|
|
225
|
+
if (!resolved) {
|
|
226
|
+
return errorResult(`Cannot resolve function group for "${name}". Provide the group parameter explicitly, or use SAPSearch("${name}") to find the function group.`);
|
|
227
|
+
}
|
|
228
|
+
group = resolved;
|
|
229
|
+
}
|
|
230
|
+
const { source, cacheHit, revalidated } = await cachedGet('FUNC', name, effectiveVersion, (ifNoneMatch) => client.getFunction(group, name, { ifNoneMatch, version: effectiveVersion }));
|
|
231
|
+
// Issue #252: when caller asks for includeSignature, return JSON with the
|
|
232
|
+
// source body and the parsed structured signature.
|
|
233
|
+
if (args.includeSignature === true) {
|
|
234
|
+
const parsed = parseFmSignature(source);
|
|
235
|
+
const grouped = {
|
|
236
|
+
importing: [],
|
|
237
|
+
exporting: [],
|
|
238
|
+
changing: [],
|
|
239
|
+
tables: [],
|
|
240
|
+
exceptions: [],
|
|
241
|
+
raising: [],
|
|
242
|
+
};
|
|
243
|
+
for (const p of parsed.params)
|
|
244
|
+
grouped[p.kind].push(p);
|
|
245
|
+
const payload = {
|
|
246
|
+
source,
|
|
247
|
+
signature: grouped,
|
|
248
|
+
};
|
|
249
|
+
return textResult(JSON.stringify(payload, null, 2));
|
|
250
|
+
}
|
|
251
|
+
if (args.grep)
|
|
252
|
+
return grepText(source);
|
|
253
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
254
|
+
}
|
|
255
|
+
case 'FUGR': {
|
|
256
|
+
const expand = Boolean(args.expand_includes);
|
|
257
|
+
if (expand) {
|
|
258
|
+
// Recursive expansion: the function module bodies (FUNCTION…ENDFUNCTION) and
|
|
259
|
+
// PBO/PAI modules live in nested includes (LZ<grp>U01, …O…, …I…) pulled in from
|
|
260
|
+
// the UXX include — a one-level walk misses them. getFunctionGroupExpanded BFS-es
|
|
261
|
+
// the include graph (depth/count-capped, cycle-guarded). Dynpros + GUI status are
|
|
262
|
+
// not included: ADT doesn't expose them over REST (SAPGUI-only).
|
|
263
|
+
const { blocks, truncated } = await client.getFunctionGroupExpanded(name, { version: effectiveVersion });
|
|
264
|
+
const parts = blocks.map((b) => `=== ${b.name} ===\n${b.source}`);
|
|
265
|
+
if (truncated) {
|
|
266
|
+
parts.push('=== [truncated] ===\nInclude cap reached; some nested includes were not expanded. ' +
|
|
267
|
+
'Read remaining includes individually with SAPRead(type="INCL", name="...").');
|
|
268
|
+
}
|
|
269
|
+
return textResult(parts.join('\n\n'));
|
|
270
|
+
}
|
|
271
|
+
const fg = await client.getFunctionGroup(name);
|
|
272
|
+
return textResult(JSON.stringify(fg, null, 2));
|
|
273
|
+
}
|
|
274
|
+
case 'INCL': {
|
|
275
|
+
const { source, cacheHit, revalidated } = await cachedGet('INCL', name, effectiveVersion, (ifNoneMatch) => client.getInclude(name, { ifNoneMatch, version: effectiveVersion }));
|
|
276
|
+
if (args.grep)
|
|
277
|
+
return grepText(source);
|
|
278
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
279
|
+
}
|
|
280
|
+
case 'DDLS': {
|
|
281
|
+
const { source: ddlSource, cacheHit, revalidated, } = await cachedGet('DDLS', name, effectiveVersion, (ifNoneMatch) => client.getDdls(name, { ifNoneMatch, version: effectiveVersion }));
|
|
282
|
+
if (ddlSource.trim() === '') {
|
|
283
|
+
return textResult(`DDLS ${name} exists in the object directory but has no source code stored. ` +
|
|
284
|
+
`The DDL source may need to be written via SAPWrite(action="create" or "update", type="DDLS", name="${name}", source="...").`);
|
|
285
|
+
}
|
|
286
|
+
if (args.include?.toLowerCase() === 'elements') {
|
|
287
|
+
// Elements extraction is derived from source — no cache indicator
|
|
288
|
+
return cachedTextResult(extractCdsElements(ddlSource, name), false, false, versionWarning);
|
|
289
|
+
}
|
|
290
|
+
if (args.grep)
|
|
291
|
+
return grepText(ddlSource);
|
|
292
|
+
return cachedTextResult(ddlSource, cacheHit, revalidated, versionWarning);
|
|
293
|
+
}
|
|
294
|
+
case 'DCLS': {
|
|
295
|
+
const { source, cacheHit, revalidated } = await cachedGet('DCLS', name, effectiveVersion, (ifNoneMatch) => client.getDcl(name, { ifNoneMatch, version: effectiveVersion }));
|
|
296
|
+
if (args.grep)
|
|
297
|
+
return grepText(source);
|
|
298
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
299
|
+
}
|
|
300
|
+
case 'BDEF': {
|
|
301
|
+
const { source, cacheHit, revalidated } = await cachedGet('BDEF', name, effectiveVersion, (ifNoneMatch) => client.getBdef(name, { ifNoneMatch, version: effectiveVersion }));
|
|
302
|
+
if (args.grep)
|
|
303
|
+
return grepText(source);
|
|
304
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
305
|
+
}
|
|
306
|
+
case 'SRVD': {
|
|
307
|
+
const { source, cacheHit, revalidated } = await cachedGet('SRVD', name, effectiveVersion, (ifNoneMatch) => client.getSrvd(name, { ifNoneMatch, version: effectiveVersion }));
|
|
308
|
+
if (args.grep)
|
|
309
|
+
return grepText(source);
|
|
310
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
311
|
+
}
|
|
312
|
+
case 'DDLX': {
|
|
313
|
+
try {
|
|
314
|
+
const { source, cacheHit, revalidated } = await cachedGet('DDLX', name, effectiveVersion, (ifNoneMatch) => client.getDdlx(name, { ifNoneMatch, version: effectiveVersion }));
|
|
315
|
+
if (args.grep)
|
|
316
|
+
return grepText(source);
|
|
317
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
if (isNotFoundError(err)) {
|
|
321
|
+
return textResult(`No metadata extension (DDLX) found for "${name}". This means no @UI annotations are defined via DDLX for this view. The view may use inline annotations in the DDLS source, or the Fiori app may configure columns via manifest.json / app descriptor.`);
|
|
322
|
+
}
|
|
323
|
+
throw err;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
case 'SRVB': {
|
|
327
|
+
const { source, cacheHit, revalidated } = await cachedGet('SRVB', name, effectiveVersion, (ifNoneMatch) => client.getSrvb(name, { ifNoneMatch, version: effectiveVersion }));
|
|
328
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
329
|
+
}
|
|
330
|
+
case 'SKTD': {
|
|
331
|
+
try {
|
|
332
|
+
// ADT returns a <sktd:docu> XML envelope with the Markdown body base64-encoded
|
|
333
|
+
// inside <sktd:text>. Cache the raw envelope (update flow re-uses it) and
|
|
334
|
+
// return the decoded Markdown to the LLM.
|
|
335
|
+
const { source, cacheHit, revalidated } = await cachedGet('SKTD', name, effectiveVersion, (ifNoneMatch) => client.getKtd(name, { ifNoneMatch, version: effectiveVersion }));
|
|
336
|
+
return cachedTextResult(decodeKtdText(source), cacheHit, revalidated, versionWarning);
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
if (isNotFoundError(err)) {
|
|
340
|
+
return textResult(`No Knowledge Transfer Document (SKTD) found for "${name}". KTD docs are optional Markdown documentation attached to ABAP objects — either one was never created for "${name}", or the name is wrong.`);
|
|
341
|
+
}
|
|
342
|
+
throw err;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
case 'TABL': {
|
|
346
|
+
// Unified TABL: covers transparent tables and DDIC structures (Model B).
|
|
347
|
+
// client.getTabl() handles the /tables/ → /structures/ fallback internally
|
|
348
|
+
// and caches the resolved URL for subsequent write/activate paths.
|
|
349
|
+
const { source, cacheHit, revalidated } = await cachedGet('TABL', name, effectiveVersion, (ifNoneMatch) => client.getTabl(name, { ifNoneMatch, version: effectiveVersion }));
|
|
350
|
+
if (args.grep)
|
|
351
|
+
return grepText(source);
|
|
352
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
353
|
+
}
|
|
354
|
+
case 'VIEW': {
|
|
355
|
+
const { source, cacheHit, revalidated } = await cachedGet('VIEW', name, effectiveVersion, (ifNoneMatch) => client.getView(name, { ifNoneMatch, version: effectiveVersion }));
|
|
356
|
+
if (args.grep)
|
|
357
|
+
return grepText(source);
|
|
358
|
+
return cachedTextResult(source, cacheHit, revalidated, versionWarning);
|
|
359
|
+
}
|
|
360
|
+
case 'DOMA': {
|
|
361
|
+
const domain = await client.getDomain(name);
|
|
362
|
+
return textResult(JSON.stringify(domain, null, 2));
|
|
363
|
+
}
|
|
364
|
+
case 'DTEL': {
|
|
365
|
+
const dtel = await client.getDataElement(name);
|
|
366
|
+
return textResult(JSON.stringify(dtel, null, 2));
|
|
367
|
+
}
|
|
368
|
+
case 'AUTH': {
|
|
369
|
+
const authField = await client.getAuthorizationField(name);
|
|
370
|
+
return textResult(JSON.stringify(authField, null, 2));
|
|
371
|
+
}
|
|
372
|
+
case 'FTG2':
|
|
373
|
+
case 'FEATURE_TOGGLE': {
|
|
374
|
+
// FEATURE_TOGGLE is the canonical short type. 'FTG2' is a deprecated alias —
|
|
375
|
+
// see research/abap-types/types/ftg2.md (ARC-1-invented; zero hits in TADIR,
|
|
376
|
+
// abap-file-formats, Eclipse apidoc). Removed in the next minor.
|
|
377
|
+
if (type === 'FTG2') {
|
|
378
|
+
logger.warn('SAPRead type "FTG2" is deprecated — use "FEATURE_TOGGLE" instead', {
|
|
379
|
+
type: 'FTG2',
|
|
380
|
+
replacement: 'FEATURE_TOGGLE',
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
const toggle = await client.getFeatureToggle(name);
|
|
384
|
+
return textResult(JSON.stringify(toggle, null, 2));
|
|
385
|
+
}
|
|
386
|
+
case 'ENHO': {
|
|
387
|
+
const enhancement = await client.getEnhancementImplementation(name);
|
|
388
|
+
return textResult(JSON.stringify(enhancement, null, 2));
|
|
389
|
+
}
|
|
390
|
+
case 'VERSIONS': {
|
|
391
|
+
const include = typeof args.include === 'string' ? args.include : undefined;
|
|
392
|
+
let group = typeof args.group === 'string' ? args.group : undefined;
|
|
393
|
+
const objectType = normalizeObjectType(String(args.objectType ?? '')) || inferObjectType(name) || 'PROG';
|
|
394
|
+
if (objectType === 'FUNC' && !group) {
|
|
395
|
+
const resolved = cachingLayer
|
|
396
|
+
? await cachingLayer.resolveFuncGroup(client, name)
|
|
397
|
+
: await client.resolveFunctionGroup(name);
|
|
398
|
+
if (!resolved) {
|
|
399
|
+
return errorResult(`Cannot resolve function group for "${name}". Provide the group parameter explicitly, or use SAPSearch("${name}") to find the function group.`);
|
|
400
|
+
}
|
|
401
|
+
group = resolved;
|
|
402
|
+
}
|
|
403
|
+
try {
|
|
404
|
+
const revisions = await client.getRevisions(objectType, name, { include, group });
|
|
405
|
+
return textResult(JSON.stringify(revisions, null, 2));
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
if (isNotFoundError(err)) {
|
|
409
|
+
return textResult(`No version history available for ${objectType} "${name}" on this SAP system. ` +
|
|
410
|
+
`This usually means the object does not exist, or the ADT versions endpoint is not supported for ${objectType} on this backend release.`);
|
|
411
|
+
}
|
|
412
|
+
throw err;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
case 'VERSION_SOURCE': {
|
|
416
|
+
const versionUri = String(args.versionUri ?? '');
|
|
417
|
+
if (!versionUri) {
|
|
418
|
+
return errorResult('VERSION_SOURCE requires a versionUri parameter. Get it from SAPRead(type="VERSIONS", name="...") response (.revisions[].uri).');
|
|
419
|
+
}
|
|
420
|
+
try {
|
|
421
|
+
return textResult(await client.getRevisionSource(versionUri));
|
|
422
|
+
}
|
|
423
|
+
catch (err) {
|
|
424
|
+
if (isNotFoundError(err)) {
|
|
425
|
+
return errorResult(`Revision at URI "${versionUri}" was not found. The revision may have been removed, or the URI is malformed. Fetch a fresh list via SAPRead(type="VERSIONS", name="...").`);
|
|
426
|
+
}
|
|
427
|
+
throw err;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
case 'TRAN': {
|
|
431
|
+
const tran = await client.getTransaction(name);
|
|
432
|
+
// Enrich with program name via SQL — only if free SQL is allowed by safety config
|
|
433
|
+
if (isOperationAllowed(client.safety, OperationType.FreeSQL)) {
|
|
434
|
+
try {
|
|
435
|
+
const safeName = name.toUpperCase().replace(/[^A-Z0-9_/]/g, '');
|
|
436
|
+
const data = await client.runQuery(`SELECT TCODE, PGMNA FROM TSTC WHERE TCODE = '${safeName}'`, 1);
|
|
437
|
+
if (data.rows.length > 0) {
|
|
438
|
+
tran.program = String(data.rows[0].PGMNA ?? '').trim();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// SQL failed (e.g., TSTC not found on BTP) — still return metadata
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return textResult(JSON.stringify(tran, null, 2));
|
|
446
|
+
}
|
|
447
|
+
case 'API_STATE': {
|
|
448
|
+
// Determine object type for URL construction — use explicit objectType, infer from name, or error
|
|
449
|
+
const explicitType = normalizeObjectType(String(args.objectType ?? ''));
|
|
450
|
+
const inferredType = explicitType || inferObjectType(name);
|
|
451
|
+
if (!inferredType) {
|
|
452
|
+
return errorResult(`Cannot infer object type from name "${name}". Please specify objectType explicitly (e.g., objectType="CLAS", "INTF", "PROG", "TABL", "DDLS", "DCLS", "FUGR", "DOMA", "DTEL", "SRVD", "SRVB", "BDEF").`);
|
|
453
|
+
}
|
|
454
|
+
// Use raw URI (no name encoding) — getApiReleaseState encodes the full URI as a single path segment
|
|
455
|
+
const objectUri = objectUrlForTypeRaw(inferredType, name);
|
|
456
|
+
const releaseState = await client.getApiReleaseState(objectUri);
|
|
457
|
+
return textResult(JSON.stringify(releaseState, null, 2));
|
|
458
|
+
}
|
|
459
|
+
case 'TABLE_CONTENTS': {
|
|
460
|
+
const maxRows = Number(args.maxRows ?? 100);
|
|
461
|
+
const data = await client.getTableContents(name, maxRows, args.sqlFilter);
|
|
462
|
+
return textResult(JSON.stringify(data, null, 2));
|
|
463
|
+
}
|
|
464
|
+
case 'TABLE_QUERY': {
|
|
465
|
+
const maxRows = Number(args.maxRows ?? 100);
|
|
466
|
+
const columns = Array.isArray(args.columns) ? args.columns : undefined;
|
|
467
|
+
const where = Array.isArray(args.where)
|
|
468
|
+
? args.where
|
|
469
|
+
: undefined;
|
|
470
|
+
const data = await client.runTableQuery(name, { columns, where, maxRows });
|
|
471
|
+
return textResult(JSON.stringify(data, null, 2));
|
|
472
|
+
}
|
|
473
|
+
case 'SOBJ': {
|
|
474
|
+
const method = String(args.method ?? '');
|
|
475
|
+
// Sanitize inputs to prevent SQL injection — BOR names are alphanumeric + underscore only
|
|
476
|
+
const safeName = name.toUpperCase().replace(/[^A-Z0-9_/]/g, '');
|
|
477
|
+
const safeMethod = method.toUpperCase().replace(/[^A-Z0-9_]/g, '');
|
|
478
|
+
if (safeName !== name.toUpperCase().replace(/\s/g, '')) {
|
|
479
|
+
return errorResult(`Invalid BOR object name: "${name}". Only alphanumeric characters, underscores, and slashes are allowed.`);
|
|
480
|
+
}
|
|
481
|
+
if (safeMethod) {
|
|
482
|
+
// Read specific BOR method implementation via SWOTLV lookup
|
|
483
|
+
const data = await client.runQuery(`SELECT PROGNAME, FORMNAME FROM SWOTLV WHERE LOBJTYPE = '${safeName}' AND VERB = '${safeMethod}'`, 1);
|
|
484
|
+
if (data.rows.length > 0) {
|
|
485
|
+
const prog = String(data.rows[0].PROGNAME ?? '').trim();
|
|
486
|
+
if (!prog) {
|
|
487
|
+
return errorResult(`BOR method "${method}" on "${name}" has no program assigned.`);
|
|
488
|
+
}
|
|
489
|
+
const { source } = await client.getProgram(prog);
|
|
490
|
+
return textResult(`=== BOR ${name}.${method} (program: ${prog}, form: ${String(data.rows[0].FORMNAME ?? '').trim()}) ===\n${source}`);
|
|
491
|
+
}
|
|
492
|
+
return errorResult(`BOR method "${method}" not found on object type "${name}". Use SAPRead(type="SOBJ", name="${name}") without method to list all methods.`);
|
|
493
|
+
}
|
|
494
|
+
// List all methods for this BOR object
|
|
495
|
+
const methods = await client.runQuery(`SELECT VERB, PROGNAME, FORMNAME, DESCRIPT FROM SWOTLV WHERE LOBJTYPE = '${safeName}'`, 100);
|
|
496
|
+
if (methods.rows.length === 0) {
|
|
497
|
+
return errorResult(`No BOR methods found for object type "${name}". Verify the BOR object type name.`);
|
|
498
|
+
}
|
|
499
|
+
return textResult(JSON.stringify(methods, null, 2));
|
|
500
|
+
}
|
|
501
|
+
case 'DEVC': {
|
|
502
|
+
const maxResults = args.maxResults != null ? Number(args.maxResults) : undefined;
|
|
503
|
+
const contents = await client.getPackageContents(name, maxResults);
|
|
504
|
+
return textResult(JSON.stringify(contents, null, 2));
|
|
505
|
+
}
|
|
506
|
+
case 'SYSTEM':
|
|
507
|
+
return textResult(await client.getSystemInfo());
|
|
508
|
+
case 'COMPONENTS': {
|
|
509
|
+
const components = await client.getInstalledComponents();
|
|
510
|
+
return textResult(JSON.stringify(components, null, 2));
|
|
511
|
+
}
|
|
512
|
+
case 'MESSAGES':
|
|
513
|
+
case 'MSAG': {
|
|
514
|
+
// MSAG is the canonical TADIR R3TR type for message classes; 'MESSAGES' is a
|
|
515
|
+
// deprecated read alias kept for one minor release. See
|
|
516
|
+
// research/abap-types/types/msag.md.
|
|
517
|
+
if (type === 'MESSAGES') {
|
|
518
|
+
logger.warn('SAPRead type "MESSAGES" is deprecated — use "MSAG" instead', {
|
|
519
|
+
type: 'MESSAGES',
|
|
520
|
+
replacement: 'MSAG',
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
try {
|
|
524
|
+
const mcInfo = await client.getMessageClassInfo(name);
|
|
525
|
+
return textResult(JSON.stringify(mcInfo, null, 2));
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Fall back to legacy endpoint if messageclass endpoint unavailable
|
|
529
|
+
return textResult(await client.getMessages(name));
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
case 'TEXT_ELEMENTS':
|
|
533
|
+
return textResult(await client.getTextElements(name));
|
|
534
|
+
case 'VARIANTS':
|
|
535
|
+
return textResult(await client.getVariants(name));
|
|
536
|
+
case 'BSP': {
|
|
537
|
+
if (cachedFeatures?.ui5 && !cachedFeatures.ui5.available) {
|
|
538
|
+
return errorResult('UI5/Fiori BSP Filestore is not available on this SAP system. ' +
|
|
539
|
+
'Run SAPManage(action="probe") to verify feature availability.');
|
|
540
|
+
}
|
|
541
|
+
const include = args.include;
|
|
542
|
+
if (!name) {
|
|
543
|
+
// List all BSP apps (optional search via query param not used here since name is empty)
|
|
544
|
+
const apps = await client.listBspApps();
|
|
545
|
+
return textResult(JSON.stringify(apps, null, 2));
|
|
546
|
+
}
|
|
547
|
+
if (!include) {
|
|
548
|
+
// Browse root structure of the app
|
|
549
|
+
return textResult(JSON.stringify(await client.getBspAppStructure(name), null, 2));
|
|
550
|
+
}
|
|
551
|
+
// If include contains a dot, treat as file read; otherwise browse subfolder
|
|
552
|
+
if (include.includes('.')) {
|
|
553
|
+
return textResult(await client.getBspFileContent(name, include));
|
|
554
|
+
}
|
|
555
|
+
return textResult(JSON.stringify(await client.getBspAppStructure(name, `/${include}`), null, 2));
|
|
556
|
+
}
|
|
557
|
+
case 'BSP_DEPLOY': {
|
|
558
|
+
if (cachedFeatures?.ui5repo && !cachedFeatures.ui5repo.available) {
|
|
559
|
+
return errorResult('ABAP Repository OData Service is not available on this SAP system. ' +
|
|
560
|
+
'Run SAPManage(action="probe") to verify feature availability.');
|
|
561
|
+
}
|
|
562
|
+
if (!name) {
|
|
563
|
+
return errorResult('BSP_DEPLOY requires a name parameter (e.g., name="ZAPP_BOOKING").');
|
|
564
|
+
}
|
|
565
|
+
const info = await getAppInfo(client.http, client.safety, name);
|
|
566
|
+
if (!info) {
|
|
567
|
+
return textResult(`App "${name}" not found in ABAP Repository.`);
|
|
568
|
+
}
|
|
569
|
+
return textResult(JSON.stringify(info, null, 2));
|
|
570
|
+
}
|
|
571
|
+
case 'INACTIVE_OBJECTS': {
|
|
572
|
+
const objects = await client.getInactiveObjects();
|
|
573
|
+
return textResult(JSON.stringify({ count: objects.length, objects }, null, 2));
|
|
574
|
+
}
|
|
575
|
+
default:
|
|
576
|
+
return errorResult(`Unknown SAPRead type: "${type}". Supported types: PROG, CLAS, INTF, FUNC, FUGR, INCL, DDLS, DCLS, DDLX, BDEF, SRVD, SRVB, SKTD, TABL, VIEW, DOMA, DTEL, MSAG, AUTH, FEATURE_TOGGLE, ENHO, VERSIONS, VERSION_SOURCE, TRAN, TABLE_CONTENTS, DEVC, SOBJ, SYSTEM, COMPONENTS, TEXT_ELEMENTS, VARIANTS, BSP, BSP_DEPLOY, API_STATE, INACTIVE_OBJECTS. Deprecated aliases: MESSAGES (use MSAG), FTG2 (use FEATURE_TOGGLE). ` +
|
|
577
|
+
'Tip: Type aliases are auto-normalized (e.g., DDLS/DF → DDLS, DCLS/DL → DCLS, CLAS/OC → CLAS, PROG/P → PROG). ' +
|
|
578
|
+
'Do not pass a URI — use the "type" and "name" parameters instead.');
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/handlers/read.ts"],"names":[],"mappings":"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"}
|