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,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAPManage handler — server lifecycle: feature probe, discovery cache, package CRUD, FLP catalog
|
|
3
|
+
* management.
|
|
4
|
+
*/
|
|
5
|
+
import { createObject, deleteObject, lockObject, unlockObject } from '../adt/crud.js';
|
|
6
|
+
import { buildPackageXml } from '../adt/ddic-xml.js';
|
|
7
|
+
import { probeFeatures } from '../adt/features.js';
|
|
8
|
+
import { addTileToGroup, createCatalog, createGroup, createTile, deleteCatalog, listCatalogs, listGroups, listTiles, } from '../adt/flp.js';
|
|
9
|
+
import { changePackage } from '../adt/refactoring.js';
|
|
10
|
+
import { checkOperation, checkPackage, OperationType } from '../adt/safety.js';
|
|
11
|
+
import { getTransportInfo } from '../adt/transport.js';
|
|
12
|
+
import { cachedFeatures, setCachedFeatures } from './feature-cache.js';
|
|
13
|
+
import { errorResult, textResult } from './shared.js';
|
|
14
|
+
import { enforceAllowedPackageForObjectUrl } from './write-helpers.js';
|
|
15
|
+
// ─── SAPManage Handler ────────────────────────────────────────────────
|
|
16
|
+
export async function handleSAPManage(client, config, args, cachingLayer, isPerUserClient) {
|
|
17
|
+
const action = String(args.action ?? '');
|
|
18
|
+
const flpUnavailableMessage = 'FLP customization service (PAGE_BUILDER_CUST) is not available on this system. Check ICF service activation in SICF.';
|
|
19
|
+
switch (action) {
|
|
20
|
+
case 'features': {
|
|
21
|
+
if (!cachedFeatures) {
|
|
22
|
+
return textResult(JSON.stringify({ message: 'No features probed yet. Use action="probe" to probe the SAP system first.' }));
|
|
23
|
+
}
|
|
24
|
+
return textResult(JSON.stringify(cachedFeatures, null, 2));
|
|
25
|
+
}
|
|
26
|
+
case 'create_package': {
|
|
27
|
+
const name = String(args.name ?? '').trim();
|
|
28
|
+
const description = String(args.description ?? '').trim();
|
|
29
|
+
const superPackage = String(args.superPackage ?? '').trim();
|
|
30
|
+
const softwareComponent = String(args.softwareComponent ?? '').trim();
|
|
31
|
+
const transportLayer = String(args.transportLayer ?? '').trim();
|
|
32
|
+
const recordChanges = typeof args.recordChanges === 'boolean' ? args.recordChanges : undefined;
|
|
33
|
+
const transport = String(args.transport ?? '').trim();
|
|
34
|
+
if (!name)
|
|
35
|
+
return errorResult('"name" is required for create_package action.');
|
|
36
|
+
if (!description)
|
|
37
|
+
return errorResult('"description" is required for create_package action.');
|
|
38
|
+
checkOperation(client.safety, OperationType.Create, 'CreatePackage');
|
|
39
|
+
// Package allowlist gate:
|
|
40
|
+
// - When `superPackage` is set, gate the parent. This enables creating
|
|
41
|
+
// children in allowed parents like $TMP. With subtree (`X/**`) rules,
|
|
42
|
+
// the new child will automatically be inside its parent's subtree.
|
|
43
|
+
// - When `superPackage` is omitted, the new package is created at the
|
|
44
|
+
// root and IS the gateable name itself — otherwise an admin's
|
|
45
|
+
// allowedPackages restriction would be bypassed by simply omitting
|
|
46
|
+
// the parent. Gate the new name in that case.
|
|
47
|
+
if (superPackage) {
|
|
48
|
+
await checkPackage(client.safety, superPackage, client.getPackageHierarchyResolver());
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
await checkPackage(client.safety, name, client.getPackageHierarchyResolver());
|
|
52
|
+
}
|
|
53
|
+
let effectiveTransport = transport || undefined;
|
|
54
|
+
const packageUrl = `/sap/bc/adt/packages/${encodeURIComponent(name)}`;
|
|
55
|
+
// Transport pre-flight for non-local parent packages when no transport is provided.
|
|
56
|
+
if (!effectiveTransport && superPackage && superPackage.toUpperCase() !== '$TMP') {
|
|
57
|
+
try {
|
|
58
|
+
const transportInfo = await getTransportInfo(client.http, client.safety, packageUrl, superPackage, 'I');
|
|
59
|
+
if (transportInfo.lockedTransport) {
|
|
60
|
+
effectiveTransport = transportInfo.lockedTransport;
|
|
61
|
+
}
|
|
62
|
+
else if (!transportInfo.isLocal && transportInfo.recording) {
|
|
63
|
+
const existingList = transportInfo.existingTransports.length > 0
|
|
64
|
+
? `\n\nExisting transports for this package:\n${transportInfo.existingTransports
|
|
65
|
+
.slice(0, 10)
|
|
66
|
+
.map((t) => ` - ${t.id}: ${t.description} (${t.owner})`)
|
|
67
|
+
.join('\n')}`
|
|
68
|
+
: '';
|
|
69
|
+
return errorResult(`Package "${superPackage}" requires a transport number for package creation, but none was provided.\n\n` +
|
|
70
|
+
`To fix this, either:\n` +
|
|
71
|
+
`1. Use SAPTransport(action="list") to find an existing modifiable transport\n` +
|
|
72
|
+
`2. Use SAPTransport(action="create", description="...") to create a new one\n` +
|
|
73
|
+
`3. Then retry SAPManage(action="create_package", ..., transport="<transport_id>")` +
|
|
74
|
+
existingList);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Graceful fallback: let SAP enforce transport requirements if the pre-check fails.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const packageTypeRaw = String(args.packageType ?? '').trim();
|
|
82
|
+
const packageType = packageTypeRaw === 'development' || packageTypeRaw === 'structure' || packageTypeRaw === 'main'
|
|
83
|
+
? packageTypeRaw
|
|
84
|
+
: undefined;
|
|
85
|
+
const xml = buildPackageXml({
|
|
86
|
+
name,
|
|
87
|
+
description,
|
|
88
|
+
superPackage: superPackage || undefined,
|
|
89
|
+
softwareComponent: softwareComponent || undefined,
|
|
90
|
+
transportLayer: transportLayer || undefined,
|
|
91
|
+
recordChanges,
|
|
92
|
+
packageType,
|
|
93
|
+
responsible: config.username,
|
|
94
|
+
});
|
|
95
|
+
await createObject(client.http, client.safety, '/sap/bc/adt/packages', xml, 'application/*', effectiveTransport, undefined, cachedFeatures?.abapRelease);
|
|
96
|
+
// Hierarchy changed: invalidate any cached subtree that could contain
|
|
97
|
+
// the new package. Conservative: clear all (cheap; per-call cost is one BFS).
|
|
98
|
+
client.invalidatePackageHierarchy();
|
|
99
|
+
return textResult(`Created package ${name}.`);
|
|
100
|
+
}
|
|
101
|
+
case 'delete_package': {
|
|
102
|
+
const name = String(args.name ?? '').trim();
|
|
103
|
+
const transport = String(args.transport ?? '').trim();
|
|
104
|
+
if (!name)
|
|
105
|
+
return errorResult('"name" is required for delete_package action.');
|
|
106
|
+
checkOperation(client.safety, OperationType.Delete, 'DeletePackage');
|
|
107
|
+
// Gate by allowedPackages: deletion targets the package itself, so the
|
|
108
|
+
// package name must be in the allowed set (or in an allowed subtree).
|
|
109
|
+
await checkPackage(client.safety, name, client.getPackageHierarchyResolver());
|
|
110
|
+
const packageUrl = `/sap/bc/adt/packages/${encodeURIComponent(name)}`;
|
|
111
|
+
await client.http.withStatefulSession(async (session) => {
|
|
112
|
+
const lock = await lockObject(session, client.safety, packageUrl, 'MODIFY', cachedFeatures?.abapRelease);
|
|
113
|
+
const effectiveTransport = transport || lock.corrNr || undefined;
|
|
114
|
+
try {
|
|
115
|
+
await deleteObject(session, client.safety, packageUrl, lock.lockHandle, effectiveTransport);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
try {
|
|
119
|
+
await unlockObject(session, packageUrl, lock.lockHandle);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Object may already be deleted — unlock failure is expected.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Hierarchy changed: invalidate cached subtrees.
|
|
127
|
+
client.invalidatePackageHierarchy();
|
|
128
|
+
return textResult(`Deleted package ${name}.`);
|
|
129
|
+
}
|
|
130
|
+
case 'change_package': {
|
|
131
|
+
const objectName = String(args.objectName ?? '').trim();
|
|
132
|
+
const objectType = String(args.objectType ?? '').trim();
|
|
133
|
+
const oldPackage = String(args.oldPackage ?? '').trim();
|
|
134
|
+
const newPackage = String(args.newPackage ?? '').trim();
|
|
135
|
+
const transport = String(args.transport ?? '').trim();
|
|
136
|
+
let objectUri = String(args.objectUri ?? '').trim();
|
|
137
|
+
if (!objectName)
|
|
138
|
+
return errorResult('"objectName" is required for change_package action.');
|
|
139
|
+
if (!objectType)
|
|
140
|
+
return errorResult('"objectType" is required for change_package action.');
|
|
141
|
+
if (!oldPackage)
|
|
142
|
+
return errorResult('"oldPackage" is required for change_package action.');
|
|
143
|
+
if (!newPackage)
|
|
144
|
+
return errorResult('"newPackage" is required for change_package action.');
|
|
145
|
+
checkOperation(client.safety, OperationType.Update, 'ChangePackage');
|
|
146
|
+
{
|
|
147
|
+
const resolver = client.getPackageHierarchyResolver();
|
|
148
|
+
await checkPackage(client.safety, oldPackage, resolver);
|
|
149
|
+
await checkPackage(client.safety, newPackage, resolver);
|
|
150
|
+
}
|
|
151
|
+
// Resolve object URI via search if not provided
|
|
152
|
+
if (!objectUri) {
|
|
153
|
+
const searchResp = await client.http.get(`/sap/bc/adt/repository/informationsystem/search?operation=quickSearch&query=${encodeURIComponent(objectName)}&maxResults=10`);
|
|
154
|
+
const uriMatch = searchResp.body.match(new RegExp(`adtcore:uri="([^"]*)"[^>]*adtcore:type="${objectType.replace('/', '\\/')}"`, 'i'));
|
|
155
|
+
if (!uriMatch?.[1]) {
|
|
156
|
+
return errorResult(`Could not find object "${objectName}" with type "${objectType}" via ADT search. ` +
|
|
157
|
+
`Verify the object exists and the type is correct (e.g., CLAS/OC, DDLS/DF, PROG/P).`);
|
|
158
|
+
}
|
|
159
|
+
objectUri = uriMatch[1];
|
|
160
|
+
}
|
|
161
|
+
// SECURITY: gate the object's REAL package (resolved from objectUri via ADT
|
|
162
|
+
// metadata), not the caller-supplied `oldPackage` — authorization must never
|
|
163
|
+
// trust an attacker-controlled source-package string. This is the authoritative
|
|
164
|
+
// source gate; the `checkPackage(oldPackage)` above is defense-in-depth only.
|
|
165
|
+
// Fail-closed; no-op when allowedPackages is unrestricted. (security audit 2026-06)
|
|
166
|
+
await enforceAllowedPackageForObjectUrl(client, objectUri, `change_package of ${objectName}`);
|
|
167
|
+
// Transport pre-flight for non-local target packages
|
|
168
|
+
let effectiveTransport = transport || undefined;
|
|
169
|
+
if (!effectiveTransport && newPackage.toUpperCase() !== '$TMP') {
|
|
170
|
+
try {
|
|
171
|
+
const transportInfo = await getTransportInfo(client.http, client.safety, objectUri, newPackage, 'I');
|
|
172
|
+
if (transportInfo.lockedTransport) {
|
|
173
|
+
effectiveTransport = transportInfo.lockedTransport;
|
|
174
|
+
}
|
|
175
|
+
else if (!transportInfo.isLocal && transportInfo.recording) {
|
|
176
|
+
const existingList = transportInfo.existingTransports.length > 0
|
|
177
|
+
? `\n\nExisting transports for this package:\n${transportInfo.existingTransports
|
|
178
|
+
.slice(0, 10)
|
|
179
|
+
.map((t) => ` - ${t.id}: ${t.description} (${t.owner})`)
|
|
180
|
+
.join('\n')}`
|
|
181
|
+
: '';
|
|
182
|
+
return errorResult(`Package "${newPackage}" requires a transport number for change_package, but none was provided.\n\n` +
|
|
183
|
+
`To fix this, either:\n` +
|
|
184
|
+
`1. Use SAPTransport(action="list") to find an existing modifiable transport\n` +
|
|
185
|
+
`2. Use SAPTransport(action="create", description="...") to create a new one\n` +
|
|
186
|
+
`3. Then retry SAPManage(action="change_package", ..., transport="<transport_id>")` +
|
|
187
|
+
existingList);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Graceful fallback: let SAP enforce transport requirements if the pre-check fails.
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const result = await changePackage(client.http, client.safety, {
|
|
195
|
+
objectUri,
|
|
196
|
+
objectType,
|
|
197
|
+
objectName,
|
|
198
|
+
oldPackage,
|
|
199
|
+
newPackage,
|
|
200
|
+
transport: effectiveTransport,
|
|
201
|
+
});
|
|
202
|
+
// Hierarchy may have shifted (object moved between packages); invalidate cache.
|
|
203
|
+
client.invalidatePackageHierarchy();
|
|
204
|
+
const transportNote = result.transport ? ` (transport: ${result.transport})` : '';
|
|
205
|
+
return textResult(`Moved ${objectName} from package ${oldPackage} to ${newPackage}${transportNote}.`);
|
|
206
|
+
}
|
|
207
|
+
case 'flp_list_catalogs': {
|
|
208
|
+
const catalogs = await listCatalogs(client.http, client.safety);
|
|
209
|
+
const customCount = catalogs.filter((c) => /^(Z|Y)/i.test(c.domainId)).length;
|
|
210
|
+
const lines = [
|
|
211
|
+
`${catalogs.length} catalogs (${customCount} custom Z/Y). Columns: domainId | title | type | scope | chips`,
|
|
212
|
+
...catalogs.map((c) => `${c.domainId} | ${c.title || '(no title)'} | ${c.type || '-'} | ${c.scope || '-'} | ${c.chipCount}`),
|
|
213
|
+
];
|
|
214
|
+
return textResult(lines.join('\n'));
|
|
215
|
+
}
|
|
216
|
+
case 'flp_list_groups': {
|
|
217
|
+
const groups = await listGroups(client.http, client.safety);
|
|
218
|
+
const lines = [
|
|
219
|
+
`${groups.length} groups. Columns: id | title`,
|
|
220
|
+
...groups.map((g) => `${g.id} | ${g.title || '(no title)'}`),
|
|
221
|
+
];
|
|
222
|
+
return textResult(lines.join('\n'));
|
|
223
|
+
}
|
|
224
|
+
case 'flp_list_tiles': {
|
|
225
|
+
const catalogId = String(args.catalogId ?? '');
|
|
226
|
+
if (!catalogId)
|
|
227
|
+
return errorResult('"catalogId" is required for flp_list_tiles action.');
|
|
228
|
+
const result = await listTiles(client.http, client.safety, catalogId);
|
|
229
|
+
if (result.backendError) {
|
|
230
|
+
return textResult(`⚠ Backend error for catalog "${catalogId}": ${result.backendError}\n\nReturned 0 tiles.`);
|
|
231
|
+
}
|
|
232
|
+
const lines = [
|
|
233
|
+
`${result.tiles.length} tiles in catalog "${catalogId}". Columns: instanceId | title | chipId | semanticObject | semanticAction`,
|
|
234
|
+
...result.tiles.map((t) => {
|
|
235
|
+
const so = t.configuration?.semantic_object ?? '';
|
|
236
|
+
const sa = t.configuration?.semantic_action ?? '';
|
|
237
|
+
return `${t.instanceId} | ${t.title || '(no title)'} | ${t.chipId} | ${so} | ${sa}`;
|
|
238
|
+
}),
|
|
239
|
+
];
|
|
240
|
+
return textResult(lines.join('\n'));
|
|
241
|
+
}
|
|
242
|
+
case 'flp_create_catalog': {
|
|
243
|
+
if (cachedFeatures?.flp && !cachedFeatures.flp.available) {
|
|
244
|
+
return errorResult(flpUnavailableMessage);
|
|
245
|
+
}
|
|
246
|
+
const domainId = String(args.domainId ?? '');
|
|
247
|
+
const title = String(args.title ?? '');
|
|
248
|
+
if (!domainId)
|
|
249
|
+
return errorResult('"domainId" is required for flp_create_catalog action.');
|
|
250
|
+
if (!title)
|
|
251
|
+
return errorResult('"title" is required for flp_create_catalog action.');
|
|
252
|
+
const catalog = await createCatalog(client.http, client.safety, domainId, title);
|
|
253
|
+
return textResult(JSON.stringify(catalog, null, 2));
|
|
254
|
+
}
|
|
255
|
+
case 'flp_create_group': {
|
|
256
|
+
if (cachedFeatures?.flp && !cachedFeatures.flp.available) {
|
|
257
|
+
return errorResult(flpUnavailableMessage);
|
|
258
|
+
}
|
|
259
|
+
const groupId = String(args.groupId ?? '');
|
|
260
|
+
const title = String(args.title ?? '');
|
|
261
|
+
if (!groupId)
|
|
262
|
+
return errorResult('"groupId" is required for flp_create_group action.');
|
|
263
|
+
if (!title)
|
|
264
|
+
return errorResult('"title" is required for flp_create_group action.');
|
|
265
|
+
const group = await createGroup(client.http, client.safety, groupId, title);
|
|
266
|
+
return textResult(JSON.stringify(group, null, 2));
|
|
267
|
+
}
|
|
268
|
+
case 'flp_create_tile': {
|
|
269
|
+
if (cachedFeatures?.flp && !cachedFeatures.flp.available) {
|
|
270
|
+
return errorResult(flpUnavailableMessage);
|
|
271
|
+
}
|
|
272
|
+
const catalogId = String(args.catalogId ?? '');
|
|
273
|
+
if (!catalogId)
|
|
274
|
+
return errorResult('"catalogId" is required for flp_create_tile action.');
|
|
275
|
+
const rawTile = args.tile;
|
|
276
|
+
if (!rawTile || typeof rawTile !== 'object' || Array.isArray(rawTile)) {
|
|
277
|
+
return errorResult('"tile" object is required for flp_create_tile action.');
|
|
278
|
+
}
|
|
279
|
+
const tile = rawTile;
|
|
280
|
+
const id = String(tile.id ?? '');
|
|
281
|
+
const title = String(tile.title ?? '');
|
|
282
|
+
const semanticObject = String(tile.semanticObject ?? '');
|
|
283
|
+
const semanticAction = String(tile.semanticAction ?? '');
|
|
284
|
+
if (!id || !title || !semanticObject || !semanticAction) {
|
|
285
|
+
return errorResult('"tile.id", "tile.title", "tile.semanticObject", and "tile.semanticAction" are required for flp_create_tile action.');
|
|
286
|
+
}
|
|
287
|
+
const tileInstance = await createTile(client.http, client.safety, catalogId, {
|
|
288
|
+
id,
|
|
289
|
+
title,
|
|
290
|
+
semanticObject,
|
|
291
|
+
semanticAction,
|
|
292
|
+
icon: typeof tile.icon === 'string' ? tile.icon : undefined,
|
|
293
|
+
url: typeof tile.url === 'string' ? tile.url : undefined,
|
|
294
|
+
subtitle: typeof tile.subtitle === 'string' ? tile.subtitle : undefined,
|
|
295
|
+
info: typeof tile.info === 'string' ? tile.info : undefined,
|
|
296
|
+
});
|
|
297
|
+
return textResult(JSON.stringify(tileInstance, null, 2));
|
|
298
|
+
}
|
|
299
|
+
case 'flp_add_tile_to_group': {
|
|
300
|
+
if (cachedFeatures?.flp && !cachedFeatures.flp.available) {
|
|
301
|
+
return errorResult(flpUnavailableMessage);
|
|
302
|
+
}
|
|
303
|
+
const groupId = String(args.groupId ?? '');
|
|
304
|
+
const catalogId = String(args.catalogId ?? '');
|
|
305
|
+
const tileInstanceId = String(args.tileInstanceId ?? '');
|
|
306
|
+
if (!groupId)
|
|
307
|
+
return errorResult('"groupId" is required for flp_add_tile_to_group action.');
|
|
308
|
+
if (!catalogId)
|
|
309
|
+
return errorResult('"catalogId" is required for flp_add_tile_to_group action.');
|
|
310
|
+
if (!tileInstanceId)
|
|
311
|
+
return errorResult('"tileInstanceId" is required for flp_add_tile_to_group action.');
|
|
312
|
+
const result = await addTileToGroup(client.http, client.safety, groupId, catalogId, tileInstanceId);
|
|
313
|
+
return textResult(JSON.stringify(result, null, 2));
|
|
314
|
+
}
|
|
315
|
+
case 'flp_delete_catalog': {
|
|
316
|
+
if (cachedFeatures?.flp && !cachedFeatures.flp.available) {
|
|
317
|
+
return errorResult(flpUnavailableMessage);
|
|
318
|
+
}
|
|
319
|
+
const catalogId = String(args.catalogId ?? '');
|
|
320
|
+
if (!catalogId)
|
|
321
|
+
return errorResult('"catalogId" is required for flp_delete_catalog action.');
|
|
322
|
+
await deleteCatalog(client.http, client.safety, catalogId);
|
|
323
|
+
return textResult(`Deleted FLP catalog: ${catalogId}`);
|
|
324
|
+
}
|
|
325
|
+
case 'cache_stats': {
|
|
326
|
+
if (!cachingLayer) {
|
|
327
|
+
return textResult(JSON.stringify({ enabled: false, message: 'Object cache is disabled (ARC1_CACHE=none).' }));
|
|
328
|
+
}
|
|
329
|
+
const stats = cachingLayer.stats();
|
|
330
|
+
return textResult(JSON.stringify({
|
|
331
|
+
enabled: true,
|
|
332
|
+
warmupAvailable: cachingLayer.isWarmupAvailable,
|
|
333
|
+
...stats,
|
|
334
|
+
inactiveListCache: cachingLayer.inactiveLists.stats(),
|
|
335
|
+
}, null, 2));
|
|
336
|
+
}
|
|
337
|
+
case 'probe': {
|
|
338
|
+
const { defaultFeatureConfig } = await import('../adt/config.js');
|
|
339
|
+
const featureConfig = defaultFeatureConfig();
|
|
340
|
+
// Override with server config feature toggles
|
|
341
|
+
featureConfig.hana = config.featureHana;
|
|
342
|
+
featureConfig.abapGit = config.featureAbapGit;
|
|
343
|
+
featureConfig.rap = config.featureRap;
|
|
344
|
+
featureConfig.amdp = config.featureAmdp;
|
|
345
|
+
featureConfig.ui5 = config.featureUi5;
|
|
346
|
+
featureConfig.transport = config.featureTransport;
|
|
347
|
+
featureConfig.ui5repo = config.featureUi5Repo;
|
|
348
|
+
featureConfig.flp = config.featureFlp;
|
|
349
|
+
const probed = await probeFeatures(client.http, featureConfig, config.systemType);
|
|
350
|
+
// In PP mode with a per-user client, auth-sensitive results (401/403 on any
|
|
351
|
+
// feature) must not poison the global cache — another user may have different
|
|
352
|
+
// authorizations. Return the per-user result to the caller but keep the global
|
|
353
|
+
// cache unchanged. However, when PP is enabled but the request fell back to the
|
|
354
|
+
// shared/default client (no JWT, missing btpConfig, or non-strict fallback), the
|
|
355
|
+
// probe ran with the same service-account credentials as the startup probe, so
|
|
356
|
+
// updating the cache is safe and allows a manual probe to repair a failed startup.
|
|
357
|
+
// Apply the same auth-failure sanitization as the startup probe: in PP mode,
|
|
358
|
+
// shared-client 401/403 on textSearch must not hide source_code from users who
|
|
359
|
+
// might have authorization via per-user clients.
|
|
360
|
+
if (!isPerUserClient) {
|
|
361
|
+
if (config.ppEnabled && probed.textSearch && !probed.textSearch.available) {
|
|
362
|
+
const reason = probed.textSearch.reason ?? '';
|
|
363
|
+
if (reason.includes('authorization') || reason.includes('401') || reason.includes('403')) {
|
|
364
|
+
probed.textSearch = undefined;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
setCachedFeatures(probed);
|
|
368
|
+
}
|
|
369
|
+
return textResult(JSON.stringify(probed, null, 2));
|
|
370
|
+
}
|
|
371
|
+
default:
|
|
372
|
+
return errorResult(`Unknown SAPManage action: ${action}. Supported: features, probe, cache_stats, create_package, delete_package, change_package, flp_list_catalogs, flp_list_groups, flp_list_tiles, flp_create_catalog, flp_create_group, flp_create_tile, flp_add_tile_to_group, flp_delete_catalog`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../src/handlers/manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAPNavigate handler — code navigation (go-to-definition, references, where-used, completion,
|
|
3
|
+
* interface implementers, method surgery).
|
|
4
|
+
*/
|
|
5
|
+
import type { AdtClient } from '../adt/client.js';
|
|
6
|
+
import { type ToolResult } from './shared.js';
|
|
7
|
+
export declare function handleSAPNavigate(client: AdtClient, args: Record<string, unknown>): Promise<ToolResult>;
|
|
8
|
+
//# sourceMappingURL=navigate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../src/handlers/navigate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAclD,OAAO,EAAe,KAAK,UAAU,EAAc,MAAM,aAAa,CAAC;AAIvE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CA8M7G"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAPNavigate handler — code navigation (go-to-definition, references, where-used, completion,
|
|
3
|
+
* interface implementers, method surgery).
|
|
4
|
+
*/
|
|
5
|
+
import { findDefinition, findInterfaceImplementersViaSeoMetaRel, findReferences, findWhereUsed, getCompletion, } from '../adt/codeintel.js';
|
|
6
|
+
import { AdtApiError } from '../adt/errors.js';
|
|
7
|
+
import { isOperationAllowed, OperationType } from '../adt/safety.js';
|
|
8
|
+
import { normalizeObjectType, objectUrlForType } from './object-types.js';
|
|
9
|
+
import { errorResult, textResult } from './shared.js';
|
|
10
|
+
// ─── SAPNavigate Handler ─────────────────────────────────────────────
|
|
11
|
+
export async function handleSAPNavigate(client, args) {
|
|
12
|
+
const action = String(args.action ?? '');
|
|
13
|
+
let uri = String(args.uri ?? '');
|
|
14
|
+
const line = Number(args.line ?? 1);
|
|
15
|
+
const column = Number(args.column ?? 1);
|
|
16
|
+
const source = String(args.source ?? '');
|
|
17
|
+
// Allow symbolic type+name as alternative to uri for references
|
|
18
|
+
if (!uri && args.type && args.name) {
|
|
19
|
+
const symType = normalizeObjectType(String(args.type));
|
|
20
|
+
const symName = String(args.name);
|
|
21
|
+
if (symType === 'FUNC') {
|
|
22
|
+
// FUNC needs group to build URL — auto-resolve it
|
|
23
|
+
const group = await client.resolveFunctionGroup(symName);
|
|
24
|
+
if (group) {
|
|
25
|
+
uri = `/sap/bc/adt/functions/groups/${encodeURIComponent(group)}/fmodules/${encodeURIComponent(symName)}`;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return errorResult(`Cannot resolve function group for "${symName}". Provide the full uri parameter, or use SAPSearch("${symName}") to find the ADT URI.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (symType === 'TABL') {
|
|
32
|
+
// DDIC TABL: where-used and other navigate paths must use the canonical
|
|
33
|
+
// object URL — `/sap/bc/adt/ddic/tables/{name}` for transparent tables,
|
|
34
|
+
// `/sap/bc/adt/ddic/structures/{name}` for DDIC structures. NW 7.50
|
|
35
|
+
// returns 500 from usageReferences for /tables/ URLs even for transparent
|
|
36
|
+
// tables, so we always resolve before building. resolveTablObjectUrl
|
|
37
|
+
// caches on the AdtClient, so this is one HTTP probe per cold name.
|
|
38
|
+
uri = await client.resolveTablObjectUrl(symName);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
uri = objectUrlForType(symType, symName);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
switch (action) {
|
|
45
|
+
case 'definition': {
|
|
46
|
+
if (!uri) {
|
|
47
|
+
return errorResult('Provide uri (or type+name) and line+column for definition lookup.');
|
|
48
|
+
}
|
|
49
|
+
const result = await findDefinition(client.http, client.safety, uri, line, column, source);
|
|
50
|
+
if (!result) {
|
|
51
|
+
return textResult('No definition found at this position.');
|
|
52
|
+
}
|
|
53
|
+
return textResult(JSON.stringify(result, null, 2));
|
|
54
|
+
}
|
|
55
|
+
case 'references': {
|
|
56
|
+
if (!uri) {
|
|
57
|
+
return errorResult('Provide uri or type+name to find references.');
|
|
58
|
+
}
|
|
59
|
+
// objectType is passed to SAP's where-used scope API which expects slash format (CLAS/OC, PROG/P).
|
|
60
|
+
// Do NOT normalize it — the slash suffix is semantically meaningful for the SAP filter.
|
|
61
|
+
const objectType = args.objectType ? String(args.objectType) : undefined;
|
|
62
|
+
let results;
|
|
63
|
+
try {
|
|
64
|
+
results = await findWhereUsed(client.http, client.safety, uri, objectType);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
// Only fall back for HTTP errors indicating the endpoint is not available (older SAP systems)
|
|
68
|
+
if (err instanceof AdtApiError && [404, 405, 415, 501].includes(err.statusCode)) {
|
|
69
|
+
results = await findReferences(client.http, client.safety, uri);
|
|
70
|
+
if (results.length === 0) {
|
|
71
|
+
return textResult('No references found.');
|
|
72
|
+
}
|
|
73
|
+
const json = JSON.stringify(results, null, 2);
|
|
74
|
+
if (objectType) {
|
|
75
|
+
return textResult(JSON.stringify({
|
|
76
|
+
note: `This SAP system does not support scope-based Where-Used. The objectType filter "${objectType}" was ignored — results below are unfiltered.`,
|
|
77
|
+
results,
|
|
78
|
+
}, null, 2));
|
|
79
|
+
}
|
|
80
|
+
return textResult(json);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Augment interface where-used with implementing classes from SEOMETAREL.
|
|
87
|
+
// SAP's scope-based usageReferences endpoint sometimes does NOT surface
|
|
88
|
+
// interface→implementing-class links — the implementations sit inside a
|
|
89
|
+
// `canHaveChildren="true"` Interface Section node, and the snippet
|
|
90
|
+
// expansion endpoint returns 404 on every release we've probed (NW 7.50,
|
|
91
|
+
// S/4HANA 2023). SEOMETAREL is the canonical OO-relation table and is
|
|
92
|
+
// always populated, so this augmentation makes references reliable for
|
|
93
|
+
// interfaces. Silently skipped when SQL/data access isn't available.
|
|
94
|
+
const intfMatch = uri.match(/\/sap\/bc\/adt\/oo\/interfaces\/([^/?]+)/i);
|
|
95
|
+
if (intfMatch && (!objectType || /^CLAS/i.test(objectType))) {
|
|
96
|
+
const interfaceName = decodeURIComponent(intfMatch[1]).toUpperCase();
|
|
97
|
+
const canFreeSQL = isOperationAllowed(client.safety, OperationType.FreeSQL);
|
|
98
|
+
const canQuery = isOperationAllowed(client.safety, OperationType.Query);
|
|
99
|
+
try {
|
|
100
|
+
let implementers = [];
|
|
101
|
+
if (canFreeSQL) {
|
|
102
|
+
implementers = await findInterfaceImplementersViaSeoMetaRel((sql, max) => client.runQuery(sql, max), interfaceName);
|
|
103
|
+
}
|
|
104
|
+
else if (canQuery) {
|
|
105
|
+
implementers = await findInterfaceImplementersViaSeoMetaRel((_sql, max) => client.getTableContents('SEOMETAREL', max, `REFCLSNAME = '${interfaceName}' AND RELTYPE = '1'`), interfaceName);
|
|
106
|
+
}
|
|
107
|
+
// Dedupe: don't add an implementer if SAP already returned it
|
|
108
|
+
const existingNames = new Set(results.map((r) => r.name?.toUpperCase()).filter(Boolean));
|
|
109
|
+
const augmented = implementers.filter((r) => !existingNames.has(r.name.toUpperCase()));
|
|
110
|
+
if (augmented.length > 0) {
|
|
111
|
+
results.push(...augmented);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// SEOMETAREL augmentation is best-effort; if SQL fails, fall back to
|
|
116
|
+
// whatever the where-used HTTP endpoint returned. Don't block the response.
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (results.length === 0) {
|
|
120
|
+
return textResult('No references found.');
|
|
121
|
+
}
|
|
122
|
+
return textResult(JSON.stringify(results, null, 2));
|
|
123
|
+
}
|
|
124
|
+
case 'completion': {
|
|
125
|
+
const proposals = await getCompletion(client.http, client.safety, uri, line, column, source);
|
|
126
|
+
return textResult(JSON.stringify(proposals, null, 2));
|
|
127
|
+
}
|
|
128
|
+
case 'hierarchy': {
|
|
129
|
+
const className = String(args.name ?? '').toUpperCase();
|
|
130
|
+
if (!className) {
|
|
131
|
+
return errorResult('Provide name (class name) for hierarchy lookup.');
|
|
132
|
+
}
|
|
133
|
+
// Sanitize to prevent SQL injection — class names are alphanumeric + underscore + namespace slash
|
|
134
|
+
const safeName = className.replace(/[^A-Z0-9_/]/g, '');
|
|
135
|
+
if (safeName !== className) {
|
|
136
|
+
return errorResult(`Invalid class name: "${className}". Only alphanumeric characters, underscores, and slashes are allowed.`);
|
|
137
|
+
}
|
|
138
|
+
const canFreeSQL = isOperationAllowed(client.safety, OperationType.FreeSQL);
|
|
139
|
+
const canQuery = isOperationAllowed(client.safety, OperationType.Query);
|
|
140
|
+
if (!canFreeSQL && !canQuery) {
|
|
141
|
+
return errorResult('Class hierarchy requires data access permissions. ' +
|
|
142
|
+
'Enable free SQL (SAP_ALLOW_FREE_SQL=true / --allow-free-sql=true) or table preview ' +
|
|
143
|
+
'(SAP_ALLOW_DATA_PREVIEW=true / --allow-data-preview=true), and grant the matching sql/data scope in HTTP auth mode.');
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
let ownRels;
|
|
147
|
+
let subRels;
|
|
148
|
+
if (canFreeSQL) {
|
|
149
|
+
ownRels = await client.runQuery(`SELECT CLSNAME, REFCLSNAME, RELTYPE FROM SEOMETAREL WHERE CLSNAME = '${safeName}'`, 100);
|
|
150
|
+
subRels = await client.runQuery(`SELECT CLSNAME FROM SEOMETAREL WHERE REFCLSNAME = '${safeName}' AND RELTYPE = '2'`, 100);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Fall back to named table preview (Query op type)
|
|
154
|
+
ownRels = await client.getTableContents('SEOMETAREL', 100, `CLSNAME = '${safeName}'`);
|
|
155
|
+
subRels = await client.getTableContents('SEOMETAREL', 100, `REFCLSNAME = '${safeName}' AND RELTYPE = '2'`);
|
|
156
|
+
}
|
|
157
|
+
let superclass = null;
|
|
158
|
+
const interfaces = [];
|
|
159
|
+
for (let i = 0; i < ownRels.rows.length; i++) {
|
|
160
|
+
const row = ownRels.rows[i];
|
|
161
|
+
const reltype = String(row.RELTYPE ?? '').trim();
|
|
162
|
+
const refName = String(row.REFCLSNAME ?? '').trim();
|
|
163
|
+
if (reltype === '2') {
|
|
164
|
+
superclass = refName;
|
|
165
|
+
}
|
|
166
|
+
else if (reltype === '1') {
|
|
167
|
+
interfaces.push(refName);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const subclasses = [];
|
|
171
|
+
for (let i = 0; i < subRels.rows.length; i++) {
|
|
172
|
+
subclasses.push(String(subRels.rows[i].CLSNAME ?? '').trim());
|
|
173
|
+
}
|
|
174
|
+
const result = { className: safeName, superclass, interfaces, subclasses };
|
|
175
|
+
return textResult(JSON.stringify(result, null, 2));
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (err instanceof AdtApiError && err.statusCode === 404) {
|
|
179
|
+
return errorResult('Cannot query SEOMETAREL — table may not be accessible on this system.');
|
|
180
|
+
}
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
return errorResult(`Unknown SAPNavigate action: ${action}. Supported: definition, references, completion, hierarchy`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=navigate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/handlers/navigate.ts"],"names":[],"mappings":"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"}
|