arc-1 0.2.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.
Files changed (159) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +77 -199
  3. package/dist/adt/btp.d.ts +2 -2
  4. package/dist/adt/btp.d.ts.map +1 -1
  5. package/dist/adt/btp.js +1 -1
  6. package/dist/adt/btp.js.map +1 -1
  7. package/dist/adt/client.d.ts +13 -1
  8. package/dist/adt/client.d.ts.map +1 -1
  9. package/dist/adt/client.js +40 -1
  10. package/dist/adt/client.js.map +1 -1
  11. package/dist/adt/codeintel.d.ts +41 -0
  12. package/dist/adt/codeintel.d.ts.map +1 -1
  13. package/dist/adt/codeintel.js +99 -27
  14. package/dist/adt/codeintel.js.map +1 -1
  15. package/dist/adt/config.d.ts +6 -0
  16. package/dist/adt/config.d.ts.map +1 -1
  17. package/dist/adt/config.js.map +1 -1
  18. package/dist/adt/cookies.d.ts.map +1 -1
  19. package/dist/adt/cookies.js.map +1 -1
  20. package/dist/adt/crud.d.ts.map +1 -1
  21. package/dist/adt/crud.js.map +1 -1
  22. package/dist/adt/devtools.d.ts +14 -0
  23. package/dist/adt/devtools.d.ts.map +1 -1
  24. package/dist/adt/devtools.js +28 -3
  25. package/dist/adt/devtools.js.map +1 -1
  26. package/dist/adt/diagnostics.d.ts +101 -0
  27. package/dist/adt/diagnostics.d.ts.map +1 -0
  28. package/dist/adt/diagnostics.js +349 -0
  29. package/dist/adt/diagnostics.js.map +1 -0
  30. package/dist/adt/errors.d.ts.map +1 -1
  31. package/dist/adt/errors.js.map +1 -1
  32. package/dist/adt/features.d.ts +11 -2
  33. package/dist/adt/features.d.ts.map +1 -1
  34. package/dist/adt/features.js +37 -12
  35. package/dist/adt/features.js.map +1 -1
  36. package/dist/adt/http.d.ts +33 -7
  37. package/dist/adt/http.d.ts.map +1 -1
  38. package/dist/adt/http.js +148 -84
  39. package/dist/adt/http.js.map +1 -1
  40. package/dist/adt/oauth.d.ts +120 -0
  41. package/dist/adt/oauth.d.ts.map +1 -0
  42. package/dist/adt/oauth.js +321 -0
  43. package/dist/adt/oauth.js.map +1 -0
  44. package/dist/adt/safety.d.ts.map +1 -1
  45. package/dist/adt/safety.js.map +1 -1
  46. package/dist/adt/transport.d.ts.map +1 -1
  47. package/dist/adt/transport.js.map +1 -1
  48. package/dist/adt/types.d.ts +143 -0
  49. package/dist/adt/types.d.ts.map +1 -1
  50. package/dist/adt/types.js.map +1 -1
  51. package/dist/adt/xml-parser.d.ts +37 -1
  52. package/dist/adt/xml-parser.d.ts.map +1 -1
  53. package/dist/adt/xml-parser.js +147 -0
  54. package/dist/adt/xml-parser.js.map +1 -1
  55. package/dist/cache/cache.d.ts +47 -4
  56. package/dist/cache/cache.d.ts.map +1 -1
  57. package/dist/cache/cache.js +16 -5
  58. package/dist/cache/cache.js.map +1 -1
  59. package/dist/cache/caching-layer.d.ts +82 -0
  60. package/dist/cache/caching-layer.d.ts.map +1 -0
  61. package/dist/cache/caching-layer.js +134 -0
  62. package/dist/cache/caching-layer.js.map +1 -0
  63. package/dist/cache/memory.d.ts +14 -2
  64. package/dist/cache/memory.d.ts.map +1 -1
  65. package/dist/cache/memory.js +72 -5
  66. package/dist/cache/memory.js.map +1 -1
  67. package/dist/cache/sqlite.d.ts +10 -1
  68. package/dist/cache/sqlite.d.ts.map +1 -1
  69. package/dist/cache/sqlite.js +90 -2
  70. package/dist/cache/sqlite.js.map +1 -1
  71. package/dist/cache/warmup.d.ts +41 -0
  72. package/dist/cache/warmup.d.ts.map +1 -0
  73. package/dist/cache/warmup.js +286 -0
  74. package/dist/cache/warmup.js.map +1 -0
  75. package/dist/cli.d.ts.map +1 -1
  76. package/dist/cli.js.map +1 -1
  77. package/dist/context/cds-deps.d.ts +35 -0
  78. package/dist/context/cds-deps.d.ts.map +1 -0
  79. package/dist/context/cds-deps.js +201 -0
  80. package/dist/context/cds-deps.js.map +1 -0
  81. package/dist/context/compressor.d.ts +20 -1
  82. package/dist/context/compressor.d.ts.map +1 -1
  83. package/dist/context/compressor.js +178 -17
  84. package/dist/context/compressor.js.map +1 -1
  85. package/dist/context/contract.d.ts.map +1 -1
  86. package/dist/context/contract.js.map +1 -1
  87. package/dist/context/deps.d.ts.map +1 -1
  88. package/dist/context/deps.js.map +1 -1
  89. package/dist/context/method-surgery.d.ts +91 -0
  90. package/dist/context/method-surgery.d.ts.map +1 -0
  91. package/dist/context/method-surgery.js +441 -0
  92. package/dist/context/method-surgery.js.map +1 -0
  93. package/dist/context/types.d.ts +7 -0
  94. package/dist/context/types.d.ts.map +1 -1
  95. package/dist/context/types.js.map +1 -1
  96. package/dist/handlers/hyperfocused.d.ts +35 -0
  97. package/dist/handlers/hyperfocused.d.ts.map +1 -0
  98. package/dist/handlers/hyperfocused.js +104 -0
  99. package/dist/handlers/hyperfocused.js.map +1 -0
  100. package/dist/handlers/intent.d.ts +5 -1
  101. package/dist/handlers/intent.d.ts.map +1 -1
  102. package/dist/handlers/intent.js +462 -44
  103. package/dist/handlers/intent.js.map +1 -1
  104. package/dist/handlers/tools.d.ts +5 -0
  105. package/dist/handlers/tools.d.ts.map +1 -1
  106. package/dist/handlers/tools.js +270 -87
  107. package/dist/handlers/tools.js.map +1 -1
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js.map +1 -1
  110. package/dist/lint/config-builder.d.ts +60 -0
  111. package/dist/lint/config-builder.d.ts.map +1 -0
  112. package/dist/lint/config-builder.js +187 -0
  113. package/dist/lint/config-builder.js.map +1 -0
  114. package/dist/lint/lint.d.ts +43 -0
  115. package/dist/lint/lint.d.ts.map +1 -1
  116. package/dist/lint/lint.js +77 -2
  117. package/dist/lint/lint.js.map +1 -1
  118. package/dist/lint/presets/cloud.d.ts +16 -0
  119. package/dist/lint/presets/cloud.d.ts.map +1 -0
  120. package/dist/lint/presets/cloud.js +111 -0
  121. package/dist/lint/presets/cloud.js.map +1 -0
  122. package/dist/lint/presets/onprem.d.ts +17 -0
  123. package/dist/lint/presets/onprem.d.ts.map +1 -0
  124. package/dist/lint/presets/onprem.js +82 -0
  125. package/dist/lint/presets/onprem.js.map +1 -0
  126. package/dist/server/audit.d.ts +1 -0
  127. package/dist/server/audit.d.ts.map +1 -1
  128. package/dist/server/audit.js.map +1 -1
  129. package/dist/server/config.d.ts.map +1 -1
  130. package/dist/server/config.js +20 -0
  131. package/dist/server/config.js.map +1 -1
  132. package/dist/server/context.d.ts.map +1 -1
  133. package/dist/server/context.js.map +1 -1
  134. package/dist/server/elicit.d.ts.map +1 -1
  135. package/dist/server/elicit.js.map +1 -1
  136. package/dist/server/http.d.ts.map +1 -1
  137. package/dist/server/http.js +4 -1
  138. package/dist/server/http.js.map +1 -1
  139. package/dist/server/logger.d.ts.map +1 -1
  140. package/dist/server/logger.js.map +1 -1
  141. package/dist/server/server.d.ts +4 -2
  142. package/dist/server/server.d.ts.map +1 -1
  143. package/dist/server/server.js +121 -8
  144. package/dist/server/server.js.map +1 -1
  145. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -1
  146. package/dist/server/sinks/btp-auditlog.js.map +1 -1
  147. package/dist/server/sinks/file.d.ts.map +1 -1
  148. package/dist/server/sinks/file.js.map +1 -1
  149. package/dist/server/sinks/stderr.d.ts.map +1 -1
  150. package/dist/server/sinks/stderr.js.map +1 -1
  151. package/dist/server/sinks/types.d.ts.map +1 -1
  152. package/dist/server/sinks/types.js.map +1 -1
  153. package/dist/server/types.d.ts +19 -0
  154. package/dist/server/types.d.ts.map +1 -1
  155. package/dist/server/types.js +8 -0
  156. package/dist/server/types.js.map +1 -1
  157. package/dist/server/xsuaa.d.ts.map +1 -1
  158. package/dist/server/xsuaa.js.map +1 -1
  159. package/package.json +14 -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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"}
@@ -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":["../../ts-src/context/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,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
+ {"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":["../../ts-src/context/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
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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"}