arc-1 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/bin/arc1.js +12 -0
  4. package/dist/adt/btp.d.ts +122 -0
  5. package/dist/adt/btp.d.ts.map +1 -0
  6. package/dist/adt/btp.js +392 -0
  7. package/dist/adt/btp.js.map +1 -0
  8. package/dist/adt/client.d.ts +89 -0
  9. package/dist/adt/client.d.ts.map +1 -0
  10. package/dist/adt/client.js +208 -0
  11. package/dist/adt/client.js.map +1 -0
  12. package/dist/adt/codeintel.d.ts +38 -0
  13. package/dist/adt/codeintel.d.ts.map +1 -0
  14. package/dist/adt/codeintel.js +61 -0
  15. package/dist/adt/codeintel.js.map +1 -0
  16. package/dist/adt/config.d.ts +65 -0
  17. package/dist/adt/config.d.ts.map +1 -0
  18. package/dist/adt/config.js +35 -0
  19. package/dist/adt/config.js.map +1 -0
  20. package/dist/adt/cookies.d.ts +27 -0
  21. package/dist/adt/cookies.d.ts.map +1 -0
  22. package/dist/adt/cookies.js +67 -0
  23. package/dist/adt/cookies.js.map +1 -0
  24. package/dist/adt/crud.d.ts +35 -0
  25. package/dist/adt/crud.d.ts.map +1 -0
  26. package/dist/adt/crud.js +87 -0
  27. package/dist/adt/crud.js.map +1 -0
  28. package/dist/adt/devtools.d.ts +32 -0
  29. package/dist/adt/devtools.d.ts.map +1 -0
  30. package/dist/adt/devtools.js +154 -0
  31. package/dist/adt/devtools.js.map +1 -0
  32. package/dist/adt/errors.d.ts +49 -0
  33. package/dist/adt/errors.d.ts.map +1 -0
  34. package/dist/adt/errors.js +80 -0
  35. package/dist/adt/errors.js.map +1 -0
  36. package/dist/adt/features.d.ts +44 -0
  37. package/dist/adt/features.d.ts.map +1 -0
  38. package/dist/adt/features.js +173 -0
  39. package/dist/adt/features.js.map +1 -0
  40. package/dist/adt/http.d.ts +116 -0
  41. package/dist/adt/http.d.ts.map +1 -0
  42. package/dist/adt/http.js +374 -0
  43. package/dist/adt/http.js.map +1 -0
  44. package/dist/adt/safety.d.ts +70 -0
  45. package/dist/adt/safety.d.ts.map +1 -0
  46. package/dist/adt/safety.js +222 -0
  47. package/dist/adt/safety.js.map +1 -0
  48. package/dist/adt/transport.d.ts +18 -0
  49. package/dist/adt/transport.d.ts.map +1 -0
  50. package/dist/adt/transport.js +66 -0
  51. package/dist/adt/transport.js.map +1 -0
  52. package/dist/adt/types.d.ts +91 -0
  53. package/dist/adt/types.d.ts.map +1 -0
  54. package/dist/adt/types.js +9 -0
  55. package/dist/adt/types.js.map +1 -0
  56. package/dist/adt/xml-parser.d.ts +109 -0
  57. package/dist/adt/xml-parser.d.ts.map +1 -0
  58. package/dist/adt/xml-parser.js +283 -0
  59. package/dist/adt/xml-parser.js.map +1 -0
  60. package/dist/cache/cache.d.ts +61 -0
  61. package/dist/cache/cache.d.ts.map +1 -0
  62. package/dist/cache/cache.js +14 -0
  63. package/dist/cache/cache.js.map +1 -0
  64. package/dist/cache/memory.d.ts +25 -0
  65. package/dist/cache/memory.d.ts.map +1 -0
  66. package/dist/cache/memory.js +69 -0
  67. package/dist/cache/memory.js.map +1 -0
  68. package/dist/cache/sqlite.d.ts +26 -0
  69. package/dist/cache/sqlite.d.ts.map +1 -0
  70. package/dist/cache/sqlite.js +130 -0
  71. package/dist/cache/sqlite.js.map +1 -0
  72. package/dist/cli.d.ts +14 -0
  73. package/dist/cli.d.ts.map +1 -0
  74. package/dist/cli.js +101 -0
  75. package/dist/cli.js.map +1 -0
  76. package/dist/context/compressor.d.ts +33 -0
  77. package/dist/context/compressor.d.ts.map +1 -0
  78. package/dist/context/compressor.js +208 -0
  79. package/dist/context/compressor.js.map +1 -0
  80. package/dist/context/contract.d.ts +14 -0
  81. package/dist/context/contract.d.ts.map +1 -0
  82. package/dist/context/contract.js +202 -0
  83. package/dist/context/contract.js.map +1 -0
  84. package/dist/context/deps.d.ts +32 -0
  85. package/dist/context/deps.d.ts.map +1 -0
  86. package/dist/context/deps.js +240 -0
  87. package/dist/context/deps.js.map +1 -0
  88. package/dist/context/types.d.ts +56 -0
  89. package/dist/context/types.d.ts.map +1 -0
  90. package/dist/context/types.js +10 -0
  91. package/dist/context/types.js.map +1 -0
  92. package/dist/handlers/intent.d.ts +46 -0
  93. package/dist/handlers/intent.d.ts.map +1 -0
  94. package/dist/handlers/intent.js +539 -0
  95. package/dist/handlers/intent.js.map +1 -0
  96. package/dist/handlers/tools.d.ts +21 -0
  97. package/dist/handlers/tools.d.ts.map +1 -0
  98. package/dist/handlers/tools.js +260 -0
  99. package/dist/handlers/tools.js.map +1 -0
  100. package/dist/index.d.ts +10 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +16 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/lint/lint.d.ts +35 -0
  105. package/dist/lint/lint.d.ts.map +1 -0
  106. package/dist/lint/lint.js +67 -0
  107. package/dist/lint/lint.js.map +1 -0
  108. package/dist/server/audit.d.ts +96 -0
  109. package/dist/server/audit.d.ts.map +1 -0
  110. package/dist/server/audit.js +27 -0
  111. package/dist/server/audit.js.map +1 -0
  112. package/dist/server/config.d.ts +19 -0
  113. package/dist/server/config.d.ts.map +1 -0
  114. package/dist/server/config.js +101 -0
  115. package/dist/server/config.js.map +1 -0
  116. package/dist/server/context.d.ts +20 -0
  117. package/dist/server/context.d.ts.map +1 -0
  118. package/dist/server/context.js +20 -0
  119. package/dist/server/context.js.map +1 -0
  120. package/dist/server/elicit.d.ts +43 -0
  121. package/dist/server/elicit.d.ts.map +1 -0
  122. package/dist/server/elicit.js +183 -0
  123. package/dist/server/elicit.js.map +1 -0
  124. package/dist/server/http.d.ts +34 -0
  125. package/dist/server/http.d.ts.map +1 -0
  126. package/dist/server/http.js +328 -0
  127. package/dist/server/http.js.map +1 -0
  128. package/dist/server/logger.d.ts +57 -0
  129. package/dist/server/logger.d.ts.map +1 -0
  130. package/dist/server/logger.js +129 -0
  131. package/dist/server/logger.js.map +1 -0
  132. package/dist/server/server.d.ts +25 -0
  133. package/dist/server/server.d.ts.map +1 -0
  134. package/dist/server/server.js +307 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/server/sinks/btp-auditlog.d.ts +48 -0
  137. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -0
  138. package/dist/server/sinks/btp-auditlog.js +232 -0
  139. package/dist/server/sinks/btp-auditlog.js.map +1 -0
  140. package/dist/server/sinks/file.d.ts +22 -0
  141. package/dist/server/sinks/file.d.ts.map +1 -0
  142. package/dist/server/sinks/file.js +59 -0
  143. package/dist/server/sinks/file.js.map +1 -0
  144. package/dist/server/sinks/stderr.d.ts +19 -0
  145. package/dist/server/sinks/stderr.d.ts.map +1 -0
  146. package/dist/server/sinks/stderr.js +63 -0
  147. package/dist/server/sinks/stderr.js.map +1 -0
  148. package/dist/server/sinks/types.d.ts +14 -0
  149. package/dist/server/sinks/types.d.ts.map +1 -0
  150. package/dist/server/sinks/types.js +8 -0
  151. package/dist/server/sinks/types.js.map +1 -0
  152. package/dist/server/types.d.ts +54 -0
  153. package/dist/server/types.d.ts.map +1 -0
  154. package/dist/server/types.js +42 -0
  155. package/dist/server/types.js.map +1 -0
  156. package/dist/server/xsuaa.d.ts +77 -0
  157. package/dist/server/xsuaa.d.ts.map +1 -0
  158. package/dist/server/xsuaa.js +364 -0
  159. package/dist/server/xsuaa.js.map +1 -0
  160. package/package.json +66 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ARC-1 CLI — command-line interface for SAP ADT operations.
3
+ *
4
+ * Minimal CLI for direct SAP interaction without an MCP client.
5
+ * For the full MCP server, use `arc1` (runs index.ts).
6
+ *
7
+ * Commands:
8
+ * arc1 search <query> - Search for ABAP objects
9
+ * arc1 source <type> <name> - Get source code
10
+ * arc1 lint <source-file> - Lint ABAP source code
11
+ * arc1 version - Show version
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../ts-src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
package/dist/cli.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * ARC-1 CLI — command-line interface for SAP ADT operations.
3
+ *
4
+ * Minimal CLI for direct SAP interaction without an MCP client.
5
+ * For the full MCP server, use `arc1` (runs index.ts).
6
+ *
7
+ * Commands:
8
+ * arc1 search <query> - Search for ABAP objects
9
+ * arc1 source <type> <name> - Get source code
10
+ * arc1 lint <source-file> - Lint ABAP source code
11
+ * arc1 version - Show version
12
+ */
13
+ import { readFileSync } from 'node:fs';
14
+ import { Command } from 'commander';
15
+ import { config } from 'dotenv';
16
+ import { AdtClient } from './adt/client.js';
17
+ import { detectFilename, lintAbapSource } from './lint/lint.js';
18
+ import { parseArgs } from './server/config.js';
19
+ import { VERSION } from './server/server.js';
20
+ // Load .env
21
+ config();
22
+ const program = new Command();
23
+ program.name('arc1').description('ARC-1 — MCP Server for SAP ABAP Systems').version(VERSION);
24
+ // Server mode (default)
25
+ program
26
+ .command('serve', { isDefault: true })
27
+ .description('Start MCP server (default)')
28
+ .action(async () => {
29
+ // Dynamic import to avoid loading MCP SDK for CLI-only usage
30
+ const { createAndStartServer } = await import('./server/server.js');
31
+ const serverConfig = parseArgs(process.argv.slice(2));
32
+ await createAndStartServer(serverConfig);
33
+ });
34
+ // Search command
35
+ program
36
+ .command('search <query>')
37
+ .description('Search for ABAP objects')
38
+ .option('--max <number>', 'Maximum results', '50')
39
+ .action(async (query, opts) => {
40
+ const client = createClientFromEnv();
41
+ const results = await client.searchObject(query, Number(opts.max));
42
+ console.log(JSON.stringify(results, null, 2));
43
+ });
44
+ // Source command
45
+ program
46
+ .command('source <type> <name>')
47
+ .description('Get source code of an ABAP object')
48
+ .action(async (type, name) => {
49
+ const client = createClientFromEnv();
50
+ switch (type.toUpperCase()) {
51
+ case 'PROG':
52
+ console.log(await client.getProgram(name));
53
+ break;
54
+ case 'CLAS':
55
+ console.log(await client.getClass(name));
56
+ break;
57
+ case 'INTF':
58
+ console.log(await client.getInterface(name));
59
+ break;
60
+ default:
61
+ console.error(`Unsupported type: ${type}`);
62
+ process.exit(1);
63
+ }
64
+ });
65
+ // Lint command
66
+ program
67
+ .command('lint <file>')
68
+ .description('Lint an ABAP source file')
69
+ .action((file) => {
70
+ const source = readFileSync(file, 'utf-8');
71
+ const filename = detectFilename(source, file.replace(/\.abap$/, ''));
72
+ const issues = lintAbapSource(source, filename);
73
+ if (issues.length === 0) {
74
+ console.log('No issues found.');
75
+ }
76
+ else {
77
+ for (const issue of issues) {
78
+ console.log(`${issue.line}:${issue.column} [${issue.severity}] ${issue.rule}: ${issue.message}`);
79
+ }
80
+ }
81
+ });
82
+ // Version command (explicit)
83
+ program
84
+ .command('version')
85
+ .description('Show ARC-1 version')
86
+ .action(() => {
87
+ console.log(`ARC-1 v${VERSION}`);
88
+ });
89
+ function createClientFromEnv() {
90
+ const serverConfig = parseArgs([]);
91
+ return new AdtClient({
92
+ baseUrl: serverConfig.url,
93
+ username: serverConfig.username,
94
+ password: serverConfig.password,
95
+ client: serverConfig.client,
96
+ language: serverConfig.language,
97
+ insecure: serverConfig.insecure,
98
+ });
99
+ }
100
+ program.parse();
101
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../ts-src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Context compression orchestrator for SAPContext.
3
+ *
4
+ * Pipeline:
5
+ * 1. Parse source → extract dependency names (deps.ts)
6
+ * 2. Filter (remove self-refs, SAP built-ins)
7
+ * 3. Sort (custom objects first)
8
+ * 4. Limit to maxDeps
9
+ * 5. Fetch dependency sources (parallel, bounded to MAX_CONCURRENT)
10
+ * 6. Extract contracts (public API only) (contract.ts)
11
+ * 7. If depth > 1, recurse on each dependency's source
12
+ * 8. Format output prologue
13
+ */
14
+ import type { Version } from '@abaplint/core';
15
+ import type { AdtClient } from '../adt/client.js';
16
+ import type { ContextResult, Dependency } from './types.js';
17
+ /**
18
+ * Compress dependency context for an ABAP object.
19
+ *
20
+ * @param client - ADT client for fetching dependency sources
21
+ * @param source - ABAP source code of the target object
22
+ * @param objectName - Target object name
23
+ * @param objectType - Target object type (CLAS, INTF, PROG, FUNC)
24
+ * @param maxDeps - Maximum number of dependencies to resolve (default 20)
25
+ * @param depth - Dependency expansion depth 1-3 (default 1)
26
+ * @param abaplintVersion - abaplint parser version (detected from SAP system, defaults to Cloud)
27
+ */
28
+ export declare function compressContext(client: AdtClient, source: string, objectName: string, objectType: string, maxDeps?: number, depth?: number, abaplintVersion?: Version): Promise<ContextResult>;
29
+ /**
30
+ * Infer the object type from the dependency kind and naming convention.
31
+ */
32
+ export declare function inferObjectType(dep: Dependency): 'CLAS' | 'INTF' | 'FUNC' | 'UNKNOWN';
33
+ //# sourceMappingURL=compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../ts-src/context/compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAY,UAAU,EAAE,MAAM,YAAY,CAAC;AAOtE;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,SAAmB,EAC1B,KAAK,SAAgB,EACrB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,aAAa,CAAC,CAYxB;AA0FD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAmBrF"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Context compression orchestrator for SAPContext.
3
+ *
4
+ * Pipeline:
5
+ * 1. Parse source → extract dependency names (deps.ts)
6
+ * 2. Filter (remove self-refs, SAP built-ins)
7
+ * 3. Sort (custom objects first)
8
+ * 4. Limit to maxDeps
9
+ * 5. Fetch dependency sources (parallel, bounded to MAX_CONCURRENT)
10
+ * 6. Extract contracts (public API only) (contract.ts)
11
+ * 7. If depth > 1, recurse on each dependency's source
12
+ * 8. Format output prologue
13
+ */
14
+ import { extractContract } from './contract.js';
15
+ import { extractDependencies } from './deps.js';
16
+ const DEFAULT_MAX_DEPS = 20;
17
+ const DEFAULT_DEPTH = 1;
18
+ const MAX_DEPTH = 3;
19
+ const MAX_CONCURRENT = 5;
20
+ /**
21
+ * Compress dependency context for an ABAP object.
22
+ *
23
+ * @param client - ADT client for fetching dependency sources
24
+ * @param source - ABAP source code of the target object
25
+ * @param objectName - Target object name
26
+ * @param objectType - Target object type (CLAS, INTF, PROG, FUNC)
27
+ * @param maxDeps - Maximum number of dependencies to resolve (default 20)
28
+ * @param depth - Dependency expansion depth 1-3 (default 1)
29
+ * @param abaplintVersion - abaplint parser version (detected from SAP system, defaults to Cloud)
30
+ */
31
+ export async function compressContext(client, source, objectName, objectType, maxDeps = DEFAULT_MAX_DEPS, depth = DEFAULT_DEPTH, abaplintVersion) {
32
+ const effectiveDepth = Math.min(Math.max(depth, 1), MAX_DEPTH);
33
+ const seen = new Set([objectName.toUpperCase()]);
34
+ const allContracts = [];
35
+ let totalFiltered = 0;
36
+ const deps = extractDependencies(source, objectName, true, abaplintVersion);
37
+ totalFiltered = deps.length; // extractDependencies already filters, but we track the count
38
+ await resolveDepthLevel(client, deps, maxDeps, effectiveDepth, seen, allContracts, abaplintVersion);
39
+ return formatResult(objectName, objectType, deps.length, allContracts, totalFiltered);
40
+ }
41
+ /**
42
+ * Resolve one level of dependencies and recurse if needed.
43
+ */
44
+ async function resolveDepthLevel(client, deps, maxDeps, depth, seen, contracts, abaplintVersion) {
45
+ // Filter already-seen and limit
46
+ const newDeps = deps.filter((d) => !seen.has(d.name.toUpperCase()));
47
+ // Mark as seen immediately (before fetching) to prevent duplicates in recursive calls
48
+ for (const dep of newDeps) {
49
+ seen.add(dep.name.toUpperCase());
50
+ }
51
+ // Limit to maxDeps
52
+ const limited = newDeps.slice(0, maxDeps);
53
+ // Fetch and extract contracts (bounded parallel)
54
+ const fetched = await fetchContractsParallel(client, limited, abaplintVersion);
55
+ contracts.push(...fetched);
56
+ // Recurse if depth > 1
57
+ if (depth > 1) {
58
+ for (const contract of fetched) {
59
+ if (contract.success && (contract.fullSource || contract.source)) {
60
+ // Extract deps from the full source (not compressed contract) for accuracy
61
+ const subDeps = extractDependencies(contract.fullSource || contract.source, contract.name, true, abaplintVersion);
62
+ const unseenSubDeps = subDeps.filter((d) => !seen.has(d.name.toUpperCase()));
63
+ if (unseenSubDeps.length > 0) {
64
+ await resolveDepthLevel(client, unseenSubDeps, maxDeps, depth - 1, seen, contracts, abaplintVersion);
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Fetch source and extract contract for each dependency.
72
+ * Bounded to MAX_CONCURRENT parallel requests.
73
+ */
74
+ async function fetchContractsParallel(client, deps, abaplintVersion) {
75
+ const results = [];
76
+ for (let i = 0; i < deps.length; i += MAX_CONCURRENT) {
77
+ const batch = deps.slice(i, i + MAX_CONCURRENT);
78
+ const batchResults = await Promise.all(batch.map((dep) => fetchSingleContract(client, dep, abaplintVersion)));
79
+ results.push(...batchResults);
80
+ }
81
+ return results;
82
+ }
83
+ /**
84
+ * Fetch source for a single dependency and extract its contract.
85
+ */
86
+ async function fetchSingleContract(client, dep, abaplintVersion) {
87
+ try {
88
+ const objectType = inferObjectType(dep);
89
+ const source = await fetchSource(client, dep.name, objectType);
90
+ const contract = extractContract(source, dep.name, objectType, abaplintVersion);
91
+ // Store full source for recursive dependency extraction
92
+ contract.fullSource = source;
93
+ return contract;
94
+ }
95
+ catch (err) {
96
+ return {
97
+ name: dep.name,
98
+ type: 'UNKNOWN',
99
+ methodCount: 0,
100
+ source: '',
101
+ success: false,
102
+ error: err instanceof Error ? err.message : String(err),
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Infer the object type from the dependency kind and naming convention.
108
+ */
109
+ export function inferObjectType(dep) {
110
+ // Function calls are always function modules
111
+ if (dep.kind === 'function_call')
112
+ return 'FUNC';
113
+ // Interface usage → interface
114
+ if (dep.kind === 'interface')
115
+ return 'INTF';
116
+ const upper = dep.name.toUpperCase();
117
+ // Naming conventions
118
+ if (/^[ZY]?IF_/i.test(upper) || /^IF_/i.test(upper))
119
+ return 'INTF';
120
+ if (/^\/\w+\/IF_/i.test(upper))
121
+ return 'INTF'; // Namespaced interface like /DMO/IF_*
122
+ if (/^[ZY]?CL_/i.test(upper) || /^CL_/i.test(upper))
123
+ return 'CLAS';
124
+ if (/^\/\w+\/CL_/i.test(upper))
125
+ return 'CLAS'; // Namespaced class
126
+ if (/^[ZY]?CX_/i.test(upper) || /^CX_/i.test(upper))
127
+ return 'CLAS'; // Exception classes
128
+ if (/^\/\w+\/CX_/i.test(upper))
129
+ return 'CLAS'; // Namespaced exception
130
+ // Default: assume class
131
+ return 'CLAS';
132
+ }
133
+ /**
134
+ * Fetch source code for a dependency from the SAP system.
135
+ */
136
+ async function fetchSource(client, name, type) {
137
+ switch (type) {
138
+ case 'CLAS':
139
+ return client.getClass(name);
140
+ case 'INTF':
141
+ return client.getInterface(name);
142
+ case 'FUNC': {
143
+ // Function modules need their group — search for it
144
+ const results = await client.searchObject(name, 5);
145
+ const fmResult = results.find((r) => r.objectName.toUpperCase() === name.toUpperCase() && r.objectType?.includes('FUNC'));
146
+ if (fmResult) {
147
+ // Extract function group from URI: .../groups/<group>/fmodules/<name>
148
+ const match = fmResult.uri.match(/groups\/([^/]+)/);
149
+ if (match) {
150
+ return client.getFunction(match[1], name);
151
+ }
152
+ }
153
+ // Fallback: try all search results for a URI match
154
+ for (const r of results) {
155
+ const match = r.uri.match(/groups\/([^/]+)\/fmodules/);
156
+ if (match) {
157
+ return client.getFunction(match[1], name);
158
+ }
159
+ }
160
+ throw new Error(`Cannot determine function group for ${name}`);
161
+ }
162
+ default:
163
+ // Try as class first, then interface
164
+ try {
165
+ return await client.getClass(name);
166
+ }
167
+ catch {
168
+ return client.getInterface(name);
169
+ }
170
+ }
171
+ }
172
+ /**
173
+ * Format the final context result with prologue.
174
+ */
175
+ function formatResult(objectName, objectType, depsFound, contracts, _totalFiltered) {
176
+ const successful = contracts.filter((c) => c.success);
177
+ const failed = contracts.filter((c) => !c.success);
178
+ const lines = [];
179
+ lines.push(`* === Dependency context for ${objectName} (${successful.length} deps resolved${failed.length > 0 ? `, ${failed.length} failed` : ''}) ===`);
180
+ lines.push('');
181
+ for (const contract of successful) {
182
+ const typeLabel = contract.type.toLowerCase();
183
+ const methodLabel = contract.methodCount > 0 ? `, ${contract.methodCount} methods` : '';
184
+ lines.push(`* --- ${contract.name} (${typeLabel}${methodLabel}) ---`);
185
+ lines.push(contract.source.trim());
186
+ lines.push('');
187
+ }
188
+ if (failed.length > 0) {
189
+ lines.push('* --- Failed dependencies ---');
190
+ for (const f of failed) {
191
+ lines.push(`* ${f.name}: ${f.error}`);
192
+ }
193
+ lines.push('');
194
+ }
195
+ const totalLines = lines.length;
196
+ lines.push(`* Stats: ${depsFound} deps found, ${successful.length} resolved, ${failed.length} failed, ${totalLines} lines`);
197
+ return {
198
+ objectName,
199
+ objectType,
200
+ depsFound,
201
+ depsResolved: successful.length,
202
+ depsFiltered: depsFound - contracts.length,
203
+ depsFailed: failed.length,
204
+ totalLines,
205
+ output: lines.join('\n'),
206
+ };
207
+ }
208
+ //# sourceMappingURL=compressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../ts-src/context/compressor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Public API contract extraction from ABAP source code.
3
+ *
4
+ * Uses @abaplint/core AST to extract only the public-facing API:
5
+ * - Classes: CLASS DEFINITION + PUBLIC SECTION only
6
+ * - Interfaces: Full source (interfaces are already public contracts)
7
+ * - Function modules: Signature block only (IMPORTING/EXPORTING params)
8
+ *
9
+ * This achieves 7-30x token compression vs full source code.
10
+ */
11
+ import { Version } from '@abaplint/core';
12
+ import type { Contract } from './types.js';
13
+ export declare function extractContract(source: string, name: string, objectType: 'CLAS' | 'INTF' | 'FUNC' | 'UNKNOWN', abaplintVersion?: Version): Contract;
14
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../ts-src/context/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAwD,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkB3C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EAChD,eAAe,CAAC,EAAE,OAAO,GACxB,QAAQ,CAyBV"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Public API contract extraction from ABAP source code.
3
+ *
4
+ * Uses @abaplint/core AST to extract only the public-facing API:
5
+ * - Classes: CLASS DEFINITION + PUBLIC SECTION only
6
+ * - Interfaces: Full source (interfaces are already public contracts)
7
+ * - Function modules: Signature block only (IMPORTING/EXPORTING params)
8
+ *
9
+ * This achieves 7-30x token compression vs full source code.
10
+ */
11
+ import { Config, MemoryFile, Registry, Statements, Structures, Version } from '@abaplint/core';
12
+ /**
13
+ * Extract the public API contract from ABAP source.
14
+ */
15
+ /** Default abaplint version for contract extraction (Cloud = superset of all) */
16
+ const DEFAULT_VERSION = Version.Cloud;
17
+ export function extractContract(source, name, objectType, abaplintVersion) {
18
+ // Normalize CRLF → LF (SAP ADT returns CRLF which can break abaplint parsing)
19
+ const normalized = source.replace(/\r\n/g, '\n');
20
+ const ver = abaplintVersion ?? DEFAULT_VERSION;
21
+ try {
22
+ switch (objectType) {
23
+ case 'CLAS':
24
+ return extractClassContract(normalized, name, ver);
25
+ case 'INTF':
26
+ return extractInterfaceContract(normalized, name, ver);
27
+ case 'FUNC':
28
+ return extractFunctionContract(normalized, name);
29
+ default:
30
+ return { name, type: objectType, methodCount: 0, source: normalized, success: true };
31
+ }
32
+ }
33
+ catch (err) {
34
+ return {
35
+ name,
36
+ type: objectType,
37
+ methodCount: 0,
38
+ source: '',
39
+ success: false,
40
+ error: err instanceof Error ? err.message : String(err),
41
+ };
42
+ }
43
+ }
44
+ /**
45
+ * Extract class contract: CLASS DEFINITION + PUBLIC SECTION only.
46
+ * Strips PROTECTED, PRIVATE sections and entire CLASS IMPLEMENTATION.
47
+ */
48
+ function extractClassContract(source, name, ver) {
49
+ const config = Config.getDefault(ver);
50
+ const reg = new Registry(config);
51
+ reg.addFile(new MemoryFile(`${name.toLowerCase()}.clas.abap`, source));
52
+ reg.parse();
53
+ for (const obj of reg.getObjects()) {
54
+ const file = obj.getMainABAPFile?.();
55
+ if (!file)
56
+ continue;
57
+ const structure = file.getStructure();
58
+ if (!structure)
59
+ continue;
60
+ // Find the ClassDefinition structure (not the statement)
61
+ const classDefs = structure.findAllStructuresRecursive(Structures.ClassDefinition);
62
+ if (classDefs.length === 0) {
63
+ // Fall back to regex-based extraction
64
+ return extractClassContractRegex(source, name);
65
+ }
66
+ for (const classDef of classDefs) {
67
+ // Get the opening CLASS...DEFINITION statement
68
+ const firstStmt = classDef.getFirstStatement();
69
+ const classLine = firstStmt?.concatTokens() ?? '';
70
+ // Find PublicSection
71
+ const pubSections = classDef.findDirectStructures(Structures.PublicSection);
72
+ if (pubSections.length === 0) {
73
+ // Class has no public section
74
+ const lines = [classLine, ' PUBLIC SECTION.', 'ENDCLASS.'];
75
+ return { name, type: 'CLAS', methodCount: 0, source: lines.join('\n'), success: true };
76
+ }
77
+ // Reconstruct public section from statements
78
+ const pubStmts = pubSections[0].findAllStatementNodes();
79
+ const pubLines = pubStmts.map((s) => ` ${s.concatTokens()}`);
80
+ // Count methods
81
+ const methodDefs = pubSections[0].findAllStatements(Statements.MethodDef);
82
+ const methodCount = methodDefs.length;
83
+ const lines = [classLine, ...pubLines, 'ENDCLASS.'];
84
+ return { name, type: 'CLAS', methodCount, source: lines.join('\n'), success: true };
85
+ }
86
+ }
87
+ // Fallback to regex if AST parsing fails
88
+ return extractClassContractRegex(source, name);
89
+ }
90
+ /**
91
+ * Regex-based fallback for class contract extraction.
92
+ * Used when AST parsing doesn't produce a ClassDefinition structure.
93
+ */
94
+ function extractClassContractRegex(source, name) {
95
+ const lines = source.split('\n');
96
+ const result = [];
97
+ let inDefinition = false;
98
+ let inPublic = false;
99
+ let methodCount = 0;
100
+ for (const line of lines) {
101
+ const upper = line.toUpperCase().trim();
102
+ if (upper.match(/^CLASS\s+\S+\s+DEFINITION/)) {
103
+ inDefinition = true;
104
+ result.push(line);
105
+ continue;
106
+ }
107
+ if (!inDefinition)
108
+ continue;
109
+ if (upper === 'PUBLIC SECTION.') {
110
+ inPublic = true;
111
+ result.push(line);
112
+ continue;
113
+ }
114
+ if (upper === 'PROTECTED SECTION.' || upper === 'PRIVATE SECTION.') {
115
+ inPublic = false;
116
+ continue;
117
+ }
118
+ if (upper === 'ENDCLASS.') {
119
+ result.push('ENDCLASS.');
120
+ break;
121
+ }
122
+ if (inPublic) {
123
+ result.push(line);
124
+ if (upper.match(/^\s*METHODS\s/))
125
+ methodCount++;
126
+ }
127
+ }
128
+ if (result.length === 0) {
129
+ return { name, type: 'CLAS', methodCount: 0, source, success: true };
130
+ }
131
+ return { name, type: 'CLAS', methodCount, source: result.join('\n'), success: true };
132
+ }
133
+ /**
134
+ * Extract interface contract: return full source (interfaces are already contracts).
135
+ * Count methods for stats.
136
+ */
137
+ function extractInterfaceContract(source, name, ver) {
138
+ const config = Config.getDefault(ver);
139
+ const reg = new Registry(config);
140
+ reg.addFile(new MemoryFile(`${name.toLowerCase()}.intf.abap`, source));
141
+ reg.parse();
142
+ let methodCount = 0;
143
+ for (const obj of reg.getObjects()) {
144
+ const file = obj.getMainABAPFile?.();
145
+ if (!file)
146
+ continue;
147
+ const structure = file.getStructure();
148
+ if (!structure)
149
+ continue;
150
+ const intfs = structure.findAllStructuresRecursive(Structures.Interface);
151
+ for (const intf of intfs) {
152
+ const methodDefs = intf.findAllStatements(Statements.MethodDef);
153
+ methodCount = methodDefs.length;
154
+ }
155
+ }
156
+ // Interfaces are already public contracts — return as-is
157
+ return { name, type: 'INTF', methodCount, source: source.trim(), success: true };
158
+ }
159
+ /**
160
+ * Extract function module contract: signature block only.
161
+ * Keeps FUNCTION line + *" parameter comments + ENDFUNCTION.
162
+ */
163
+ function extractFunctionContract(source, name) {
164
+ const lines = source.split('\n');
165
+ const result = [];
166
+ let inFunction = false;
167
+ let pastSignature = false;
168
+ for (const line of lines) {
169
+ const trimmed = line.trim();
170
+ const upper = trimmed.toUpperCase();
171
+ if (upper.startsWith('FUNCTION ')) {
172
+ inFunction = true;
173
+ result.push(line);
174
+ continue;
175
+ }
176
+ if (!inFunction)
177
+ continue;
178
+ if (upper === 'ENDFUNCTION.') {
179
+ result.push('ENDFUNCTION.');
180
+ break;
181
+ }
182
+ // Signature comment lines start with *"
183
+ if (trimmed.startsWith('*"')) {
184
+ result.push(line);
185
+ continue;
186
+ }
187
+ // Once we hit a non-signature line, we're past the signature
188
+ if (!pastSignature && !trimmed.startsWith('*"') && trimmed !== '') {
189
+ pastSignature = true;
190
+ }
191
+ }
192
+ // Count parameters in signature
193
+ const paramCount = result.filter((l) => l.trim().startsWith('*"')).length;
194
+ return {
195
+ name,
196
+ type: 'FUNC',
197
+ methodCount: paramCount, // for FMs, "methodCount" means parameter count
198
+ source: result.join('\n'),
199
+ success: true,
200
+ };
201
+ }
202
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../ts-src/context/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * AST-based dependency extraction from ABAP source code.
3
+ *
4
+ * Uses @abaplint/core to parse ABAP into an AST, then walks the tree
5
+ * to find all external references (classes, interfaces, function modules,
6
+ * exception classes). This is more accurate than the Go version's regex
7
+ * approach — no false positives from string literals or comments.
8
+ *
9
+ * Extracted dependency kinds:
10
+ * - inheritance: CLASS ... INHERITING FROM <name>
11
+ * - interface: INTERFACES <name>
12
+ * - type_ref: TYPE REF TO <name>, NEW <name>(), CAST <name>()
13
+ * - static_call: <name>=>method()
14
+ * - function_call: CALL FUNCTION '<name>'
15
+ * - exception: RAISING <name>, CATCH <name>
16
+ */
17
+ import { Version } from '@abaplint/core';
18
+ import type { Dependency } from './types.js';
19
+ /**
20
+ * Extract dependencies from ABAP source using @abaplint/core AST.
21
+ *
22
+ * Parses the source, walks the AST to find all external references,
23
+ * filters out built-in types and self-references, deduplicates,
24
+ * and sorts (custom objects first).
25
+ *
26
+ * @param source - ABAP source code
27
+ * @param objectName - Name of the object being analyzed (filtered from results)
28
+ * @param filterSapStandard - Whether to filter SAP standard objects (default true)
29
+ * @returns Deduplicated, sorted list of dependencies
30
+ */
31
+ export declare function extractDependencies(source: string, objectName: string, filterSapStandard?: boolean, abaplintVersion?: Version): Dependency[];
32
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../ts-src/context/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAyD,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEhG,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AA0E7D;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,iBAAiB,UAAO,EACxB,eAAe,CAAC,EAAE,OAAO,GACxB,UAAU,EAAE,CA+Hd"}