arc-1 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -199
- package/dist/adt/btp.d.ts +2 -2
- package/dist/adt/btp.d.ts.map +1 -1
- package/dist/adt/btp.js +1 -1
- package/dist/adt/btp.js.map +1 -1
- package/dist/adt/client.d.ts +13 -1
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +39 -1
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/codeintel.d.ts +41 -0
- package/dist/adt/codeintel.d.ts.map +1 -1
- package/dist/adt/codeintel.js +99 -27
- package/dist/adt/codeintel.js.map +1 -1
- package/dist/adt/config.d.ts.map +1 -1
- package/dist/adt/config.js.map +1 -1
- package/dist/adt/cookies.d.ts.map +1 -1
- package/dist/adt/cookies.js.map +1 -1
- package/dist/adt/crud.d.ts.map +1 -1
- package/dist/adt/crud.js.map +1 -1
- package/dist/adt/devtools.d.ts +14 -0
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +28 -3
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/diagnostics.d.ts +101 -0
- package/dist/adt/diagnostics.d.ts.map +1 -0
- package/dist/adt/diagnostics.js +349 -0
- package/dist/adt/diagnostics.js.map +1 -0
- package/dist/adt/errors.d.ts.map +1 -1
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/http.d.ts +26 -7
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +140 -86
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/oauth.d.ts.map +1 -1
- package/dist/adt/oauth.js.map +1 -1
- package/dist/adt/safety.d.ts.map +1 -1
- package/dist/adt/safety.js.map +1 -1
- package/dist/adt/transport.d.ts.map +1 -1
- package/dist/adt/transport.js.map +1 -1
- package/dist/adt/types.d.ts +139 -0
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/types.js.map +1 -1
- package/dist/adt/xml-parser.d.ts +37 -1
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +147 -0
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/cache/cache.d.ts +47 -4
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js +16 -5
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/caching-layer.d.ts +82 -0
- package/dist/cache/caching-layer.d.ts.map +1 -0
- package/dist/cache/caching-layer.js +134 -0
- package/dist/cache/caching-layer.js.map +1 -0
- package/dist/cache/memory.d.ts +14 -2
- package/dist/cache/memory.d.ts.map +1 -1
- package/dist/cache/memory.js +72 -5
- package/dist/cache/memory.js.map +1 -1
- package/dist/cache/sqlite.d.ts +10 -1
- package/dist/cache/sqlite.d.ts.map +1 -1
- package/dist/cache/sqlite.js +90 -2
- package/dist/cache/sqlite.js.map +1 -1
- package/dist/cache/warmup.d.ts +41 -0
- package/dist/cache/warmup.d.ts.map +1 -0
- package/dist/cache/warmup.js +286 -0
- package/dist/cache/warmup.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/context/cds-deps.d.ts +35 -0
- package/dist/context/cds-deps.d.ts.map +1 -0
- package/dist/context/cds-deps.js +201 -0
- package/dist/context/cds-deps.js.map +1 -0
- package/dist/context/compressor.d.ts +20 -1
- package/dist/context/compressor.d.ts.map +1 -1
- package/dist/context/compressor.js +178 -17
- package/dist/context/compressor.js.map +1 -1
- package/dist/context/contract.d.ts.map +1 -1
- package/dist/context/contract.js.map +1 -1
- package/dist/context/deps.d.ts.map +1 -1
- package/dist/context/deps.js.map +1 -1
- package/dist/context/method-surgery.d.ts +91 -0
- package/dist/context/method-surgery.d.ts.map +1 -0
- package/dist/context/method-surgery.js +441 -0
- package/dist/context/method-surgery.js.map +1 -0
- package/dist/context/types.d.ts +7 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js.map +1 -1
- package/dist/handlers/hyperfocused.d.ts +35 -0
- package/dist/handlers/hyperfocused.d.ts.map +1 -0
- package/dist/handlers/hyperfocused.js +104 -0
- package/dist/handlers/hyperfocused.js.map +1 -0
- package/dist/handlers/intent.d.ts +2 -1
- package/dist/handlers/intent.d.ts.map +1 -1
- package/dist/handlers/intent.js +440 -43
- package/dist/handlers/intent.js.map +1 -1
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +130 -39
- package/dist/handlers/tools.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lint/config-builder.d.ts +60 -0
- package/dist/lint/config-builder.d.ts.map +1 -0
- package/dist/lint/config-builder.js +187 -0
- package/dist/lint/config-builder.js.map +1 -0
- package/dist/lint/lint.d.ts +43 -0
- package/dist/lint/lint.d.ts.map +1 -1
- package/dist/lint/lint.js +77 -2
- package/dist/lint/lint.js.map +1 -1
- package/dist/lint/presets/cloud.d.ts +16 -0
- package/dist/lint/presets/cloud.d.ts.map +1 -0
- package/dist/lint/presets/cloud.js +111 -0
- package/dist/lint/presets/cloud.js.map +1 -0
- package/dist/lint/presets/onprem.d.ts +17 -0
- package/dist/lint/presets/onprem.d.ts.map +1 -0
- package/dist/lint/presets/onprem.js +82 -0
- package/dist/lint/presets/onprem.js.map +1 -0
- package/dist/server/audit.d.ts +1 -0
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +12 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/elicit.d.ts.map +1 -1
- package/dist/server/elicit.js.map +1 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +4 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/logger.js.map +1 -1
- package/dist/server/server.d.ts +3 -2
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +90 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/sinks/btp-auditlog.d.ts.map +1 -1
- package/dist/server/sinks/btp-auditlog.js.map +1 -1
- package/dist/server/sinks/file.d.ts.map +1 -1
- package/dist/server/sinks/file.js.map +1 -1
- package/dist/server/sinks/stderr.d.ts.map +1 -1
- package/dist/server/sinks/stderr.js.map +1 -1
- package/dist/server/sinks/types.d.ts.map +1 -1
- package/dist/server/sinks/types.js.map +1 -1
- package/dist/server/types.d.ts +14 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +6 -0
- package/dist/server/types.js.map +1 -1
- package/dist/server/xsuaa.d.ts.map +1 -1
- package/dist/server/xsuaa.js.map +1 -1
- package/package.json +13 -6
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Method-level surgery for ABAP classes.
|
|
3
|
+
*
|
|
4
|
+
* Provides three operations for token-efficient class editing:
|
|
5
|
+
* 1. listMethods — Extract method table-of-contents (names, signatures, visibility, line ranges)
|
|
6
|
+
* 2. extractMethod — Read a single method implementation (~95% token reduction vs full class)
|
|
7
|
+
* 3. spliceMethod — Surgically replace a single method body, return new full source
|
|
8
|
+
*
|
|
9
|
+
* All functions are pure (no I/O) — they operate on source strings and return results.
|
|
10
|
+
* Uses @abaplint/core AST for accurate parsing with regex fallback for unparseable source.
|
|
11
|
+
*/
|
|
12
|
+
import { Config, MemoryFile, Registry, Statements, Structures, Version } from '@abaplint/core';
|
|
13
|
+
const DEFAULT_VERSION = Version.Cloud;
|
|
14
|
+
// ─── List Methods ───────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* List all methods in a class with their signatures, visibility, and line ranges.
|
|
17
|
+
*/
|
|
18
|
+
export function listMethods(source, className, abaplintVersion) {
|
|
19
|
+
const normalized = source.replace(/\r\n/g, '\n');
|
|
20
|
+
try {
|
|
21
|
+
const result = listMethodsAST(normalized, className, abaplintVersion ?? DEFAULT_VERSION);
|
|
22
|
+
if (result.success && result.methods.length > 0)
|
|
23
|
+
return result;
|
|
24
|
+
// Fallback to regex if AST found nothing
|
|
25
|
+
const regexResult = listMethodsRegex(normalized, className);
|
|
26
|
+
return regexResult;
|
|
27
|
+
}
|
|
28
|
+
catch (_err) {
|
|
29
|
+
// AST parsing failed — use regex fallback
|
|
30
|
+
const regexResult = listMethodsRegex(normalized, className);
|
|
31
|
+
return regexResult;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function listMethodsAST(source, className, ver) {
|
|
35
|
+
const config = Config.getDefault(ver);
|
|
36
|
+
const reg = new Registry(config);
|
|
37
|
+
reg.addFile(new MemoryFile(`${className.toLowerCase().replace(/\//g, '#')}.clas.abap`, source));
|
|
38
|
+
reg.parse();
|
|
39
|
+
// Collect method signatures from DEFINITION with visibility
|
|
40
|
+
const signatures = new Map();
|
|
41
|
+
// Collect method line ranges from IMPLEMENTATION
|
|
42
|
+
const implementations = new Map();
|
|
43
|
+
for (const obj of reg.getObjects()) {
|
|
44
|
+
const file = obj.getMainABAPFile?.();
|
|
45
|
+
if (!file)
|
|
46
|
+
continue;
|
|
47
|
+
const structure = file.getStructure();
|
|
48
|
+
if (!structure)
|
|
49
|
+
continue;
|
|
50
|
+
// ── Definition: extract method signatures with visibility ──
|
|
51
|
+
const classDefs = structure.findAllStructuresRecursive(Structures.ClassDefinition);
|
|
52
|
+
for (const classDef of classDefs) {
|
|
53
|
+
extractMethodSignatures(classDef, 'public', Structures.PublicSection, signatures);
|
|
54
|
+
extractMethodSignatures(classDef, 'protected', Structures.ProtectedSection, signatures);
|
|
55
|
+
extractMethodSignatures(classDef, 'private', Structures.PrivateSection, signatures);
|
|
56
|
+
}
|
|
57
|
+
// ── Implementation: extract METHOD ... ENDMETHOD line ranges ──
|
|
58
|
+
const classImpls = structure.findAllStructuresRecursive(Structures.ClassImplementation);
|
|
59
|
+
for (const classImpl of classImpls) {
|
|
60
|
+
const methods = classImpl.findAllStructuresRecursive(Structures.Method);
|
|
61
|
+
for (const method of methods) {
|
|
62
|
+
const firstStmt = method.getFirstStatement();
|
|
63
|
+
if (!firstStmt)
|
|
64
|
+
continue;
|
|
65
|
+
const tokens = firstStmt.concatTokens();
|
|
66
|
+
// Extract method name from "METHOD method_name."
|
|
67
|
+
const match = tokens.match(/^METHOD\s+(\S+)/i);
|
|
68
|
+
if (match) {
|
|
69
|
+
const name = match[1].replace(/\.$/, '');
|
|
70
|
+
const startLine = firstStmt.getFirstToken().getRow();
|
|
71
|
+
const endLine = method.getLastToken().getRow();
|
|
72
|
+
implementations.set(name.toUpperCase(), { startLine, endLine });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Build a set of all definition method names (upper) so we can detect impl-only methods
|
|
78
|
+
const definedUpper = new Set(signatures.keys());
|
|
79
|
+
// Merge: start from implementations (since those have line ranges) and enrich with definition info
|
|
80
|
+
const methods = [];
|
|
81
|
+
const processed = new Set();
|
|
82
|
+
for (const [upperImplName, impl] of implementations) {
|
|
83
|
+
// Find original case from source
|
|
84
|
+
const lines = source.split('\n');
|
|
85
|
+
const methodLine = lines[impl.startLine - 1] ?? '';
|
|
86
|
+
const nameMatch = methodLine.match(/METHOD\s+(\S+)\s*\./i);
|
|
87
|
+
const originalName = nameMatch?.[1] ?? upperImplName;
|
|
88
|
+
// Try to match to a definition signature
|
|
89
|
+
// For interface methods like "zif_order~create", the definition has "create" (INTERFACES zif_order)
|
|
90
|
+
// For regular methods, definition name matches implementation name
|
|
91
|
+
let sig = signatures.get(upperImplName);
|
|
92
|
+
if (!sig) {
|
|
93
|
+
// For interface methods: try matching by the part after ~
|
|
94
|
+
const parts = upperImplName.split('~');
|
|
95
|
+
if (parts.length === 2) {
|
|
96
|
+
sig = signatures.get(parts[1]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const visibility = sig?.visibility ?? 'public';
|
|
100
|
+
const signature = sig?.signature ?? `METHODS ${originalName}.`;
|
|
101
|
+
const isRedefinition = sig?.isRedefinition ?? false;
|
|
102
|
+
methods.push({
|
|
103
|
+
name: originalName,
|
|
104
|
+
visibility,
|
|
105
|
+
signature,
|
|
106
|
+
startLine: impl.startLine,
|
|
107
|
+
endLine: impl.endLine,
|
|
108
|
+
isRedefinition,
|
|
109
|
+
isInterfaceMethod: originalName.includes('~'),
|
|
110
|
+
});
|
|
111
|
+
processed.add(upperImplName);
|
|
112
|
+
// Also mark the definition key as processed (may differ for interface methods)
|
|
113
|
+
if (sig) {
|
|
114
|
+
// Try exact match first
|
|
115
|
+
if (definedUpper.has(upperImplName)) {
|
|
116
|
+
processed.add(upperImplName);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// For interface methods: mark the short name as processed
|
|
120
|
+
const parts = upperImplName.split('~');
|
|
121
|
+
if (parts.length === 2 && definedUpper.has(parts[1])) {
|
|
122
|
+
processed.add(parts[1]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// No definition found — still mark it processed under its own key
|
|
128
|
+
// to prevent duplication
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Add methods that are in definition but have no implementation (unusual but possible)
|
|
132
|
+
for (const [upperName, sig] of signatures) {
|
|
133
|
+
if (processed.has(upperName))
|
|
134
|
+
continue;
|
|
135
|
+
const originalName = sig.signature.match(/(?:CLASS-)?METHODS\s+(\S+)/i)?.[1] ?? upperName;
|
|
136
|
+
methods.push({
|
|
137
|
+
name: originalName,
|
|
138
|
+
visibility: sig.visibility,
|
|
139
|
+
signature: sig.signature,
|
|
140
|
+
startLine: 0,
|
|
141
|
+
endLine: 0,
|
|
142
|
+
isRedefinition: sig.isRedefinition,
|
|
143
|
+
isInterfaceMethod: originalName.includes('~'),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Sort: public first, then protected, then private, alphabetical within each
|
|
147
|
+
const order = { public: 0, protected: 1, private: 2 };
|
|
148
|
+
methods.sort((a, b) => {
|
|
149
|
+
const vis = order[a.visibility] - order[b.visibility];
|
|
150
|
+
if (vis !== 0)
|
|
151
|
+
return vis;
|
|
152
|
+
return a.name.toUpperCase().localeCompare(b.name.toUpperCase());
|
|
153
|
+
});
|
|
154
|
+
return { className, methods, success: true };
|
|
155
|
+
}
|
|
156
|
+
function extractMethodSignatures(classDef, visibility, sectionType, signatures) {
|
|
157
|
+
const sections = classDef.findDirectStructures(sectionType);
|
|
158
|
+
for (const section of sections) {
|
|
159
|
+
const methodDefs = section.findAllStatements(Statements.MethodDef);
|
|
160
|
+
for (const methodDef of methodDefs) {
|
|
161
|
+
const sigText = methodDef.concatTokens();
|
|
162
|
+
// Extract method name from "METHODS method_name ..." or "CLASS-METHODS ..."
|
|
163
|
+
const match = sigText.match(/(?:CLASS-)?METHODS\s+(\S+)/i);
|
|
164
|
+
if (match) {
|
|
165
|
+
// Strip trailing period (abaplint concatTokens includes it for single-word statements like "METHODS helper.")
|
|
166
|
+
const name = match[1].replace(/\.$/, '');
|
|
167
|
+
const isRedefinition = /REDEFINITION/i.test(sigText);
|
|
168
|
+
signatures.set(name.toUpperCase(), { signature: sigText, visibility, isRedefinition });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ─── Regex Fallback ─────────────────────────────────────────────────
|
|
174
|
+
function listMethodsRegex(source, className) {
|
|
175
|
+
const lines = source.split('\n');
|
|
176
|
+
const methods = [];
|
|
177
|
+
const signatureMap = new Map();
|
|
178
|
+
// Phase 1: Scan DEFINITION for method signatures and visibility
|
|
179
|
+
let inDefinition = false;
|
|
180
|
+
let currentVisibility = 'public';
|
|
181
|
+
for (const line of lines) {
|
|
182
|
+
const trimmed = line.trim();
|
|
183
|
+
const upper = trimmed.toUpperCase();
|
|
184
|
+
if (upper.match(/^CLASS\s+\S+\s+DEFINITION/)) {
|
|
185
|
+
inDefinition = true;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (upper === 'ENDCLASS.' && inDefinition) {
|
|
189
|
+
inDefinition = false;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (inDefinition) {
|
|
193
|
+
if (upper === 'PUBLIC SECTION.') {
|
|
194
|
+
currentVisibility = 'public';
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (upper === 'PROTECTED SECTION.') {
|
|
198
|
+
currentVisibility = 'protected';
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (upper === 'PRIVATE SECTION.') {
|
|
202
|
+
currentVisibility = 'private';
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const methodMatch = trimmed.match(/^(?:CLASS-)?METHODS\s+(\S+)/i);
|
|
206
|
+
if (methodMatch) {
|
|
207
|
+
const name = methodMatch[1];
|
|
208
|
+
// Collect full method statement (may span multiple lines)
|
|
209
|
+
let fullSig = trimmed;
|
|
210
|
+
if (!trimmed.endsWith('.')) {
|
|
211
|
+
// Multi-line signature — collect until we find a period
|
|
212
|
+
const startIdx = lines.indexOf(line);
|
|
213
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
214
|
+
fullSig += ` ${lines[i].trim()}`;
|
|
215
|
+
if (lines[i].trim().endsWith('.'))
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
signatureMap.set(name.toUpperCase(), {
|
|
220
|
+
signature: fullSig,
|
|
221
|
+
visibility: currentVisibility,
|
|
222
|
+
isRedefinition: /REDEFINITION/i.test(fullSig),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Phase 2: Scan IMPLEMENTATION for METHOD ... ENDMETHOD line ranges
|
|
228
|
+
let inImplementation = false;
|
|
229
|
+
let currentMethodName = '';
|
|
230
|
+
let methodStartLine = 0;
|
|
231
|
+
for (let i = 0; i < lines.length; i++) {
|
|
232
|
+
const trimmed = lines[i].trim();
|
|
233
|
+
const upper = trimmed.toUpperCase();
|
|
234
|
+
if (upper.match(/^CLASS\s+\S+\s+IMPLEMENTATION\s*\./)) {
|
|
235
|
+
inImplementation = true;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (upper === 'ENDCLASS.' && inImplementation) {
|
|
239
|
+
inImplementation = false;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (inImplementation) {
|
|
243
|
+
const methodStart = trimmed.match(/^METHOD\s+(\S+)\s*\./i);
|
|
244
|
+
if (methodStart) {
|
|
245
|
+
currentMethodName = methodStart[1];
|
|
246
|
+
methodStartLine = i + 1; // 1-based
|
|
247
|
+
}
|
|
248
|
+
if (upper === 'ENDMETHOD.' && currentMethodName) {
|
|
249
|
+
const endLine = i + 1; // 1-based
|
|
250
|
+
const sig = signatureMap.get(currentMethodName.toUpperCase());
|
|
251
|
+
methods.push({
|
|
252
|
+
name: currentMethodName,
|
|
253
|
+
visibility: sig?.visibility ?? 'public',
|
|
254
|
+
signature: sig?.signature ?? `METHODS ${currentMethodName}.`,
|
|
255
|
+
startLine: methodStartLine,
|
|
256
|
+
endLine,
|
|
257
|
+
isRedefinition: sig?.isRedefinition ?? false,
|
|
258
|
+
isInterfaceMethod: currentMethodName.includes('~'),
|
|
259
|
+
});
|
|
260
|
+
currentMethodName = '';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Sort: public first, then protected, then private
|
|
265
|
+
const order = { public: 0, protected: 1, private: 2 };
|
|
266
|
+
methods.sort((a, b) => {
|
|
267
|
+
const vis = order[a.visibility] - order[b.visibility];
|
|
268
|
+
if (vis !== 0)
|
|
269
|
+
return vis;
|
|
270
|
+
return a.name.toUpperCase().localeCompare(b.name.toUpperCase());
|
|
271
|
+
});
|
|
272
|
+
// Success if we found methods OR if the source contains a class (even with no methods)
|
|
273
|
+
const hasClass = /CLASS\s+\S+\s+IMPLEMENTATION/i.test(source);
|
|
274
|
+
return { className, methods, success: methods.length > 0 || hasClass || source.trim().length === 0 };
|
|
275
|
+
}
|
|
276
|
+
// ─── Extract Method ─────────────────────────────────────────────────
|
|
277
|
+
/**
|
|
278
|
+
* Extract a single method's implementation from a class.
|
|
279
|
+
*
|
|
280
|
+
* Supports:
|
|
281
|
+
* - Exact name match: "get_name"
|
|
282
|
+
* - Interface method: "zif_order~process"
|
|
283
|
+
* - Fuzzy interface match: "process" finds "zif_order~process"
|
|
284
|
+
*/
|
|
285
|
+
export function extractMethod(source, className, methodName, abaplintVersion) {
|
|
286
|
+
const normalized = source.replace(/\r\n/g, '\n');
|
|
287
|
+
const listing = listMethods(normalized, className, abaplintVersion);
|
|
288
|
+
if (!listing.success) {
|
|
289
|
+
return {
|
|
290
|
+
className,
|
|
291
|
+
methodName,
|
|
292
|
+
methodSource: '',
|
|
293
|
+
bodySource: '',
|
|
294
|
+
startLine: 0,
|
|
295
|
+
endLine: 0,
|
|
296
|
+
success: false,
|
|
297
|
+
error: listing.error ?? 'Failed to list methods',
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
// Find the method — try exact match first, then fuzzy interface match
|
|
301
|
+
const upperName = methodName.toUpperCase();
|
|
302
|
+
let method = listing.methods.find((m) => m.name.toUpperCase() === upperName);
|
|
303
|
+
if (!method) {
|
|
304
|
+
// Fuzzy: user said "process", we try to match "*~process"
|
|
305
|
+
const candidates = listing.methods.filter((m) => {
|
|
306
|
+
const parts = m.name.toUpperCase().split('~');
|
|
307
|
+
return parts.length === 2 && parts[1] === upperName;
|
|
308
|
+
});
|
|
309
|
+
if (candidates.length === 1) {
|
|
310
|
+
method = candidates[0];
|
|
311
|
+
}
|
|
312
|
+
else if (candidates.length > 1) {
|
|
313
|
+
const names = candidates.map((c) => c.name).join(', ');
|
|
314
|
+
return {
|
|
315
|
+
className,
|
|
316
|
+
methodName,
|
|
317
|
+
methodSource: '',
|
|
318
|
+
bodySource: '',
|
|
319
|
+
startLine: 0,
|
|
320
|
+
endLine: 0,
|
|
321
|
+
success: false,
|
|
322
|
+
error: `Ambiguous method name "${methodName}". Multiple interface methods match: ${names}. Use the full name (e.g., "zif_order~process").`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (!method || method.startLine === 0 || method.endLine === 0) {
|
|
327
|
+
const available = listing.methods.map((m) => m.name).join(', ');
|
|
328
|
+
return {
|
|
329
|
+
className,
|
|
330
|
+
methodName,
|
|
331
|
+
methodSource: '',
|
|
332
|
+
bodySource: '',
|
|
333
|
+
startLine: 0,
|
|
334
|
+
endLine: 0,
|
|
335
|
+
success: false,
|
|
336
|
+
error: `Method "${methodName}" not found in ${className}. Available methods: ${available || '(none)'}`,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const lines = normalized.split('\n');
|
|
340
|
+
const methodLines = lines.slice(method.startLine - 1, method.endLine);
|
|
341
|
+
const methodSource = methodLines.join('\n');
|
|
342
|
+
// Body = everything between METHOD line and ENDMETHOD line
|
|
343
|
+
const bodyLines = methodLines.slice(1, -1);
|
|
344
|
+
const bodySource = bodyLines.join('\n');
|
|
345
|
+
return {
|
|
346
|
+
className,
|
|
347
|
+
methodName: method.name,
|
|
348
|
+
methodSource,
|
|
349
|
+
bodySource,
|
|
350
|
+
startLine: method.startLine,
|
|
351
|
+
endLine: method.endLine,
|
|
352
|
+
success: true,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
// ─── Splice Method ──────────────────────────────────────────────────
|
|
356
|
+
/**
|
|
357
|
+
* Surgically replace a single method's implementation in a class source.
|
|
358
|
+
*
|
|
359
|
+
* @param source - Full class source code
|
|
360
|
+
* @param className - Class name
|
|
361
|
+
* @param methodName - Method to replace
|
|
362
|
+
* @param newBody - New method body. Either:
|
|
363
|
+
* - Just the body content (auto-wrapped with METHOD/ENDMETHOD)
|
|
364
|
+
* - Full METHOD...ENDMETHOD block (detected and used as-is)
|
|
365
|
+
*/
|
|
366
|
+
export function spliceMethod(source, className, methodName, newBody, abaplintVersion) {
|
|
367
|
+
// Detect line ending style (preserve original)
|
|
368
|
+
const hasCRLF = source.includes('\r\n');
|
|
369
|
+
const normalized = source.replace(/\r\n/g, '\n');
|
|
370
|
+
const extracted = extractMethod(normalized, className, methodName, abaplintVersion);
|
|
371
|
+
if (!extracted.success) {
|
|
372
|
+
return {
|
|
373
|
+
newSource: '',
|
|
374
|
+
oldMethodSource: '',
|
|
375
|
+
newMethodSource: '',
|
|
376
|
+
success: false,
|
|
377
|
+
error: extracted.error,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// Determine if newBody is a full METHOD...ENDMETHOD block or just the body
|
|
381
|
+
const trimmedBody = newBody.trim();
|
|
382
|
+
const isFullBlock = /^METHOD\s+/i.test(trimmedBody) && /ENDMETHOD\s*\.?\s*$/i.test(trimmedBody);
|
|
383
|
+
let newMethodBlock;
|
|
384
|
+
if (isFullBlock) {
|
|
385
|
+
// Use the body as-is (preserve original indentation)
|
|
386
|
+
// Normalize to \n for consistent splicing, then re-apply line endings at the end
|
|
387
|
+
newMethodBlock = newBody.replace(/\r\n/g, '\n');
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
// Wrap with METHOD/ENDMETHOD using the original method name from the source
|
|
391
|
+
newMethodBlock = ` METHOD ${extracted.methodName}.\n${newBody.replace(/\r\n/g, '\n')}\n ENDMETHOD.`;
|
|
392
|
+
}
|
|
393
|
+
// Replace in source
|
|
394
|
+
const lines = normalized.split('\n');
|
|
395
|
+
const before = lines.slice(0, extracted.startLine - 1);
|
|
396
|
+
const after = lines.slice(extracted.endLine);
|
|
397
|
+
let newSource = [...before, newMethodBlock, ...after].join('\n');
|
|
398
|
+
// Restore original line ending style
|
|
399
|
+
if (hasCRLF) {
|
|
400
|
+
newSource = newSource.replace(/\n/g, '\r\n');
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
newSource,
|
|
404
|
+
oldMethodSource: extracted.methodSource,
|
|
405
|
+
newMethodSource: newMethodBlock,
|
|
406
|
+
success: true,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
// ─── Format Method Listing ──────────────────────────────────────────
|
|
410
|
+
/**
|
|
411
|
+
* Format a MethodListResult into a human-readable, LLM-friendly text.
|
|
412
|
+
*/
|
|
413
|
+
export function formatMethodListing(listing) {
|
|
414
|
+
if (!listing.success) {
|
|
415
|
+
return `Failed to list methods for ${listing.className}: ${listing.error}`;
|
|
416
|
+
}
|
|
417
|
+
if (listing.methods.length === 0) {
|
|
418
|
+
return `=== ${listing.className} (0 methods) ===\nNo methods found.`;
|
|
419
|
+
}
|
|
420
|
+
const lines = [];
|
|
421
|
+
lines.push(`=== ${listing.className} (${listing.methods.length} methods) ===`);
|
|
422
|
+
let currentVisibility = '';
|
|
423
|
+
for (const method of listing.methods) {
|
|
424
|
+
if (method.visibility !== currentVisibility) {
|
|
425
|
+
currentVisibility = method.visibility;
|
|
426
|
+
lines.push(`${currentVisibility.toUpperCase()}:`);
|
|
427
|
+
}
|
|
428
|
+
const flags = [];
|
|
429
|
+
if (method.isInterfaceMethod)
|
|
430
|
+
flags.push('interface');
|
|
431
|
+
if (method.isRedefinition)
|
|
432
|
+
flags.push('redefinition');
|
|
433
|
+
const flagStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
|
|
434
|
+
const lineRange = method.startLine > 0 ? ` [lines ${method.startLine}-${method.endLine}]` : '';
|
|
435
|
+
// Show the signature (strip trailing period for cleaner display)
|
|
436
|
+
const sig = method.signature.replace(/\.\s*$/, '');
|
|
437
|
+
lines.push(` ${sig}${flagStr}${lineRange}`);
|
|
438
|
+
}
|
|
439
|
+
return lines.join('\n');
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=method-surgery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-surgery.js","sourceRoot":"","sources":["../../src/context/method-surgery.ts"],"names":[],"mappings":"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"}
|
package/dist/context/types.d.ts
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
* 2. contract.ts — Extract public API contracts from dependency source
|
|
7
7
|
* 3. compressor.ts — Orchestrate: fetch sources, compress, format output
|
|
8
8
|
*/
|
|
9
|
+
/** A dependency found in CDS DDL source code */
|
|
10
|
+
export interface CdsDependency {
|
|
11
|
+
/** Entity/table name (e.g., zsalesorder, ZI_CUSTOMER) */
|
|
12
|
+
name: string;
|
|
13
|
+
/** How the dependency is referenced in the CDS DDL */
|
|
14
|
+
kind: 'data_source' | 'association' | 'composition' | 'projection_base';
|
|
15
|
+
}
|
|
9
16
|
/** A dependency found in ABAP source code */
|
|
10
17
|
export interface Dependency {
|
|
11
18
|
/** Object name (e.g., ZCL_ITEM, ZIF_ORDER) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;CACzE;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oDAAoD;AACpD,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,UAAU,GACV,aAAa,GACb,eAAe,GACf,WAAW,CAAC;AAEhB,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACvB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hyperfocused mode — a single universal `SAP` tool (~200 tokens of schema).
|
|
3
|
+
*
|
|
4
|
+
* Instead of 11 intent-based tools (~14K tokens), hyperfocused mode exposes
|
|
5
|
+
* a single `SAP` tool that routes to all operations via an `action` parameter.
|
|
6
|
+
* This is useful for token-constrained scenarios (small context windows,
|
|
7
|
+
* cost optimization, or when the LLM already knows the ARC-1 API).
|
|
8
|
+
*
|
|
9
|
+
* Activate with: --tool-mode hyperfocused or ARC1_TOOL_MODE=hyperfocused
|
|
10
|
+
*/
|
|
11
|
+
import type { ServerConfig } from '../server/types.js';
|
|
12
|
+
import type { ToolDefinition } from './tools.js';
|
|
13
|
+
/**
|
|
14
|
+
* Get the required scope for a hyperfocused action.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getHyperfocusedScope(action: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the real tool name from a hyperfocused action.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveHyperfocusedTool(action: string): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Expand hyperfocused args into the flat args format expected by the real handler.
|
|
23
|
+
* Merges top-level type/name with params object. Top-level values take precedence.
|
|
24
|
+
*/
|
|
25
|
+
export declare function expandHyperfocusedArgs(args: Record<string, unknown>): {
|
|
26
|
+
toolName: string;
|
|
27
|
+
expandedArgs: Record<string, unknown>;
|
|
28
|
+
} | {
|
|
29
|
+
error: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Get the hyperfocused tool definition (~200 tokens).
|
|
33
|
+
*/
|
|
34
|
+
export declare function getHyperfocusedToolDefinition(config: ServerConfig): ToolDefinition;
|
|
35
|
+
//# sourceMappingURL=hyperfocused.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperfocused.d.ts","sourceRoot":"","sources":["../../src/handlers/hyperfocused.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsBjD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChE;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,GACD;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAwBpB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CA+BlF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hyperfocused mode — a single universal `SAP` tool (~200 tokens of schema).
|
|
3
|
+
*
|
|
4
|
+
* Instead of 11 intent-based tools (~14K tokens), hyperfocused mode exposes
|
|
5
|
+
* a single `SAP` tool that routes to all operations via an `action` parameter.
|
|
6
|
+
* This is useful for token-constrained scenarios (small context windows,
|
|
7
|
+
* cost optimization, or when the LLM already knows the ARC-1 API).
|
|
8
|
+
*
|
|
9
|
+
* Activate with: --tool-mode hyperfocused or ARC1_TOOL_MODE=hyperfocused
|
|
10
|
+
*/
|
|
11
|
+
/** Map hyperfocused action to the real tool name */
|
|
12
|
+
const ACTION_TO_TOOL = {
|
|
13
|
+
read: 'SAPRead',
|
|
14
|
+
search: 'SAPSearch',
|
|
15
|
+
query: 'SAPQuery',
|
|
16
|
+
write: 'SAPWrite',
|
|
17
|
+
activate: 'SAPActivate',
|
|
18
|
+
navigate: 'SAPNavigate',
|
|
19
|
+
lint: 'SAPLint',
|
|
20
|
+
diagnose: 'SAPDiagnose',
|
|
21
|
+
transport: 'SAPTransport',
|
|
22
|
+
context: 'SAPContext',
|
|
23
|
+
manage: 'SAPManage',
|
|
24
|
+
};
|
|
25
|
+
/** Actions that require write scope */
|
|
26
|
+
const WRITE_ACTIONS = new Set(['write', 'activate', 'manage']);
|
|
27
|
+
/** Actions that require admin scope */
|
|
28
|
+
const ADMIN_ACTIONS = new Set(['transport']);
|
|
29
|
+
/**
|
|
30
|
+
* Get the required scope for a hyperfocused action.
|
|
31
|
+
*/
|
|
32
|
+
export function getHyperfocusedScope(action) {
|
|
33
|
+
if (ADMIN_ACTIONS.has(action))
|
|
34
|
+
return 'admin';
|
|
35
|
+
if (WRITE_ACTIONS.has(action))
|
|
36
|
+
return 'write';
|
|
37
|
+
return 'read';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the real tool name from a hyperfocused action.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveHyperfocusedTool(action) {
|
|
43
|
+
return ACTION_TO_TOOL[action];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Expand hyperfocused args into the flat args format expected by the real handler.
|
|
47
|
+
* Merges top-level type/name with params object. Top-level values take precedence.
|
|
48
|
+
*/
|
|
49
|
+
export function expandHyperfocusedArgs(args) {
|
|
50
|
+
const action = String(args.action ?? '');
|
|
51
|
+
const toolName = resolveHyperfocusedTool(action);
|
|
52
|
+
if (!toolName) {
|
|
53
|
+
const validActions = Object.keys(ACTION_TO_TOOL).join(', ');
|
|
54
|
+
return { error: `Unknown action: "${action}". Valid actions: ${validActions}` };
|
|
55
|
+
}
|
|
56
|
+
// Merge params with top-level args (top-level takes precedence)
|
|
57
|
+
const params = args.params ?? {};
|
|
58
|
+
const expandedArgs = { ...params };
|
|
59
|
+
// Copy standard top-level fields
|
|
60
|
+
if (args.type !== undefined)
|
|
61
|
+
expandedArgs.type = args.type;
|
|
62
|
+
if (args.name !== undefined)
|
|
63
|
+
expandedArgs.name = args.name;
|
|
64
|
+
// For write/activate, copy action from params if not already set
|
|
65
|
+
// (the real SAPWrite has its own "action" field like "create"/"update"/"delete")
|
|
66
|
+
if (!expandedArgs.action && params.action) {
|
|
67
|
+
expandedArgs.action = params.action;
|
|
68
|
+
}
|
|
69
|
+
return { toolName, expandedArgs };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the hyperfocused tool definition (~200 tokens).
|
|
73
|
+
*/
|
|
74
|
+
export function getHyperfocusedToolDefinition(config) {
|
|
75
|
+
const readActions = ['read', 'search', 'query', 'navigate', 'context', 'lint', 'diagnose'];
|
|
76
|
+
const writeActions = config.readOnly ? [] : ['write', 'activate', 'manage'];
|
|
77
|
+
const adminActions = config.enableTransports || !config.readOnly ? ['transport'] : [];
|
|
78
|
+
const allActions = [...readActions, ...writeActions, ...adminActions];
|
|
79
|
+
return {
|
|
80
|
+
name: 'SAP',
|
|
81
|
+
description: 'Universal SAP tool. Actions: ' +
|
|
82
|
+
allActions.join(', ') +
|
|
83
|
+
'. Use "type" and "name" for object operations, "params" for additional tool-specific parameters.',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
action: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
enum: allActions,
|
|
90
|
+
description: 'Operation to perform',
|
|
91
|
+
},
|
|
92
|
+
type: { type: 'string', description: 'Object or action type (e.g., CLAS, PROG, INTF, syntax, unittest)' },
|
|
93
|
+
name: { type: 'string', description: 'Object name' },
|
|
94
|
+
params: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
description: 'Additional parameters (tool-specific). Merged with type/name.',
|
|
97
|
+
additionalProperties: true,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
required: ['action'],
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=hyperfocused.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperfocused.js","sourceRoot":"","sources":["../../src/handlers/hyperfocused.ts"],"names":[],"mappings":"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"}
|