arc-1 0.9.14 → 0.9.16

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 (195) hide show
  1. package/README.md +17 -4
  2. package/dist/adt/class-structure.d.ts +1 -1
  3. package/dist/adt/class-structure.js +1 -1
  4. package/dist/adt/client.d.ts +16 -3
  5. package/dist/adt/client.d.ts.map +1 -1
  6. package/dist/adt/client.js +40 -35
  7. package/dist/adt/client.js.map +1 -1
  8. package/dist/adt/ddic-xml.d.ts.map +1 -1
  9. package/dist/adt/ddic-xml.js +46 -53
  10. package/dist/adt/ddic-xml.js.map +1 -1
  11. package/dist/adt/devtools.d.ts.map +1 -1
  12. package/dist/adt/devtools.js +46 -15
  13. package/dist/adt/devtools.js.map +1 -1
  14. package/dist/adt/fm-signature.d.ts +1 -1
  15. package/dist/adt/fm-signature.js +1 -1
  16. package/dist/adt/rap-generate.js +1 -1
  17. package/dist/adt/rap-generate.js.map +1 -1
  18. package/dist/adt/rap-handlers.d.ts +1 -1
  19. package/dist/adt/rap-handlers.js +1 -1
  20. package/dist/adt/refactoring.d.ts.map +1 -1
  21. package/dist/adt/refactoring.js +11 -14
  22. package/dist/adt/refactoring.js.map +1 -1
  23. package/dist/adt/server-driven.d.ts +46 -2
  24. package/dist/adt/server-driven.d.ts.map +1 -1
  25. package/dist/adt/server-driven.js +13 -3
  26. package/dist/adt/server-driven.js.map +1 -1
  27. package/dist/adt/xml-parser.d.ts +8 -1
  28. package/dist/adt/xml-parser.d.ts.map +1 -1
  29. package/dist/adt/xml-parser.js +57 -49
  30. package/dist/adt/xml-parser.js.map +1 -1
  31. package/dist/authz/policy.d.ts +1 -1
  32. package/dist/authz/policy.js +1 -1
  33. package/dist/cache/cache.d.ts +1 -0
  34. package/dist/cache/cache.d.ts.map +1 -1
  35. package/dist/cache/cache.js.map +1 -1
  36. package/dist/cache/memory.d.ts +1 -0
  37. package/dist/cache/memory.d.ts.map +1 -1
  38. package/dist/cache/memory.js +3 -0
  39. package/dist/cache/memory.js.map +1 -1
  40. package/dist/cache/sqlite.d.ts +1 -0
  41. package/dist/cache/sqlite.d.ts.map +1 -1
  42. package/dist/cache/sqlite.js +3 -0
  43. package/dist/cache/sqlite.js.map +1 -1
  44. package/dist/cache/warmup.d.ts.map +1 -1
  45. package/dist/cache/warmup.js +85 -38
  46. package/dist/cache/warmup.js.map +1 -1
  47. package/dist/cli.d.ts +1 -1
  48. package/dist/cli.js +2 -2
  49. package/dist/cli.js.map +1 -1
  50. package/dist/context/compressor.d.ts.map +1 -1
  51. package/dist/context/compressor.js +22 -13
  52. package/dist/context/compressor.js.map +1 -1
  53. package/dist/context/contract.d.ts.map +1 -1
  54. package/dist/context/contract.js +4 -3
  55. package/dist/context/contract.js.map +1 -1
  56. package/dist/context/deps.d.ts.map +1 -1
  57. package/dist/context/deps.js +3 -2
  58. package/dist/context/deps.js.map +1 -1
  59. package/dist/context/method-surgery.d.ts.map +1 -1
  60. package/dist/context/method-surgery.js +3 -2
  61. package/dist/context/method-surgery.js.map +1 -1
  62. package/dist/handlers/activate.d.ts +25 -0
  63. package/dist/handlers/activate.d.ts.map +1 -0
  64. package/dist/handlers/activate.js +334 -0
  65. package/dist/handlers/activate.js.map +1 -0
  66. package/dist/handlers/cache-security.d.ts +22 -0
  67. package/dist/handlers/cache-security.d.ts.map +1 -0
  68. package/dist/handlers/cache-security.js +51 -0
  69. package/dist/handlers/cache-security.js.map +1 -0
  70. package/dist/handlers/cds-hints.d.ts +26 -0
  71. package/dist/handlers/cds-hints.d.ts.map +1 -0
  72. package/dist/handlers/cds-hints.js +380 -0
  73. package/dist/handlers/cds-hints.js.map +1 -0
  74. package/dist/handlers/context.d.ts +10 -0
  75. package/dist/handlers/context.d.ts.map +1 -0
  76. package/dist/handlers/context.js +344 -0
  77. package/dist/handlers/context.js.map +1 -0
  78. package/dist/handlers/diagnose.d.ts +8 -0
  79. package/dist/handlers/diagnose.d.ts.map +1 -0
  80. package/dist/handlers/diagnose.js +274 -0
  81. package/dist/handlers/diagnose.js.map +1 -0
  82. package/dist/handlers/dispatch.d.ts +39 -0
  83. package/dist/handlers/dispatch.d.ts.map +1 -0
  84. package/dist/handlers/dispatch.js +640 -0
  85. package/dist/handlers/dispatch.js.map +1 -0
  86. package/dist/handlers/feature-cache.d.ts +26 -0
  87. package/dist/handlers/feature-cache.d.ts.map +1 -0
  88. package/dist/handlers/feature-cache.js +45 -0
  89. package/dist/handlers/feature-cache.js.map +1 -0
  90. package/dist/handlers/git.d.ts +9 -0
  91. package/dist/handlers/git.d.ts.map +1 -0
  92. package/dist/handlers/git.js +227 -0
  93. package/dist/handlers/git.js.map +1 -0
  94. package/dist/handlers/lint.d.ts +9 -0
  95. package/dist/handlers/lint.d.ts.map +1 -0
  96. package/dist/handlers/lint.js +82 -0
  97. package/dist/handlers/lint.js.map +1 -0
  98. package/dist/handlers/manage.d.ts +10 -0
  99. package/dist/handlers/manage.d.ts.map +1 -0
  100. package/dist/handlers/manage.js +375 -0
  101. package/dist/handlers/manage.js.map +1 -0
  102. package/dist/handlers/navigate.d.ts +8 -0
  103. package/dist/handlers/navigate.d.ts.map +1 -0
  104. package/dist/handlers/navigate.js +188 -0
  105. package/dist/handlers/navigate.js.map +1 -0
  106. package/dist/handlers/object-types.d.ts +103 -0
  107. package/dist/handlers/object-types.d.ts.map +1 -0
  108. package/dist/handlers/object-types.js +476 -0
  109. package/dist/handlers/object-types.js.map +1 -0
  110. package/dist/handlers/query.d.ts +7 -0
  111. package/dist/handlers/query.d.ts.map +1 -0
  112. package/dist/handlers/query.js +190 -0
  113. package/dist/handlers/query.js.map +1 -0
  114. package/dist/handlers/read.d.ts +18 -0
  115. package/dist/handlers/read.d.ts.map +1 -0
  116. package/dist/handlers/read.js +581 -0
  117. package/dist/handlers/read.js.map +1 -0
  118. package/dist/handlers/schemas.d.ts +28 -26
  119. package/dist/handlers/schemas.d.ts.map +1 -1
  120. package/dist/handlers/schemas.js +14 -151
  121. package/dist/handlers/schemas.js.map +1 -1
  122. package/dist/handlers/search.d.ts +24 -0
  123. package/dist/handlers/search.d.ts.map +1 -0
  124. package/dist/handlers/search.js +208 -0
  125. package/dist/handlers/search.js.map +1 -0
  126. package/dist/handlers/shared.d.ts +19 -0
  127. package/dist/handlers/shared.d.ts.map +1 -0
  128. package/dist/handlers/shared.js +23 -0
  129. package/dist/handlers/shared.js.map +1 -0
  130. package/dist/handlers/tool-registry.d.ts +44 -0
  131. package/dist/handlers/tool-registry.d.ts.map +1 -0
  132. package/dist/handlers/tool-registry.js +152 -0
  133. package/dist/handlers/tool-registry.js.map +1 -0
  134. package/dist/handlers/tools.d.ts +9 -0
  135. package/dist/handlers/tools.d.ts.map +1 -1
  136. package/dist/handlers/tools.js +41 -144
  137. package/dist/handlers/tools.js.map +1 -1
  138. package/dist/handlers/transport.d.ts +8 -0
  139. package/dist/handlers/transport.d.ts.map +1 -0
  140. package/dist/handlers/transport.js +281 -0
  141. package/dist/handlers/transport.js.map +1 -0
  142. package/dist/handlers/write/class-surgery.d.ts +18 -0
  143. package/dist/handlers/write/class-surgery.d.ts.map +1 -0
  144. package/dist/handlers/write/class-surgery.js +376 -0
  145. package/dist/handlers/write/class-surgery.js.map +1 -0
  146. package/dist/handlers/write/context.d.ts +43 -0
  147. package/dist/handlers/write/context.d.ts.map +1 -0
  148. package/dist/handlers/write/context.js +5 -0
  149. package/dist/handlers/write/context.js.map +1 -0
  150. package/dist/handlers/write/create.d.ts +8 -0
  151. package/dist/handlers/write/create.d.ts.map +1 -0
  152. package/dist/handlers/write/create.js +603 -0
  153. package/dist/handlers/write/create.js.map +1 -0
  154. package/dist/handlers/write/rap.d.ts +8 -0
  155. package/dist/handlers/write/rap.d.ts.map +1 -0
  156. package/dist/handlers/write/rap.js +235 -0
  157. package/dist/handlers/write/rap.js.map +1 -0
  158. package/dist/handlers/write/update-delete.d.ts +8 -0
  159. package/dist/handlers/write/update-delete.d.ts.map +1 -0
  160. package/dist/handlers/write/update-delete.js +182 -0
  161. package/dist/handlers/write/update-delete.js.map +1 -0
  162. package/dist/handlers/write-helpers.d.ts +155 -0
  163. package/dist/handlers/write-helpers.d.ts.map +1 -0
  164. package/dist/handlers/write-helpers.js +859 -0
  165. package/dist/handlers/write-helpers.js.map +1 -0
  166. package/dist/handlers/write.d.ts +16 -0
  167. package/dist/handlers/write.d.ts.map +1 -0
  168. package/dist/handlers/write.js +210 -0
  169. package/dist/handlers/write.js.map +1 -0
  170. package/dist/handlers/zod-errors.d.ts +1 -1
  171. package/dist/handlers/zod-errors.js +1 -1
  172. package/dist/lint/abaplint-config-cache.d.ts +5 -0
  173. package/dist/lint/abaplint-config-cache.d.ts.map +1 -0
  174. package/dist/lint/abaplint-config-cache.js +29 -0
  175. package/dist/lint/abaplint-config-cache.js.map +1 -0
  176. package/dist/lint/config-builder.d.ts.map +1 -1
  177. package/dist/lint/config-builder.js +3 -4
  178. package/dist/lint/config-builder.js.map +1 -1
  179. package/dist/lint/lint.d.ts +1 -1
  180. package/dist/lint/lint.d.ts.map +1 -1
  181. package/dist/lint/lint.js +3 -2
  182. package/dist/lint/lint.js.map +1 -1
  183. package/dist/server/config.d.ts.map +1 -1
  184. package/dist/server/config.js +22 -8
  185. package/dist/server/config.js.map +1 -1
  186. package/dist/server/mcp-rate-limit.d.ts +1 -1
  187. package/dist/server/mcp-rate-limit.js +1 -1
  188. package/dist/server/server.d.ts +1 -1
  189. package/dist/server/server.js +3 -2
  190. package/dist/server/server.js.map +1 -1
  191. package/package.json +15 -10
  192. package/dist/handlers/intent.d.ts +0 -144
  193. package/dist/handlers/intent.d.ts.map +0 -1
  194. package/dist/handlers/intent.js +0 -6837
  195. package/dist/handlers/intent.js.map +0 -1
@@ -0,0 +1,344 @@
1
+ /**
2
+ * SAPContext handler — object context: relatives, hierarchy, method listings, CDS upstream/
3
+ * downstream dependency analysis.
4
+ */
5
+ import { buildSiblingExtensionFinding, classifyCdsImpact, deriveSiblingStem, isSiblingNameMatch, } from '../adt/cds-impact.js';
6
+ import { findWhereUsed } from '../adt/codeintel.js';
7
+ import { AdtApiError } from '../adt/errors.js';
8
+ import { mapSapReleaseToAbaplintVersion } from '../adt/features.js';
9
+ import { extractCdsDependencies } from '../context/cds-deps.js';
10
+ import { compressCdsContext, compressContext } from '../context/compressor.js';
11
+ import { logger } from '../server/logger.js';
12
+ import { contextCacheForDependencyPayloads } from './cache-security.js';
13
+ import { cachedFeatures } from './feature-cache.js';
14
+ import { normalizeObjectType, objectUrlForType } from './object-types.js';
15
+ import { errorResult, textResult } from './shared.js';
16
+ // ─── SAPContext Handler ───────────────────────────────────────────────
17
+ const DEFAULT_SIBLING_MAX_CANDIDATES = 4;
18
+ const HARD_MAX_SIBLING_MAX_CANDIDATES = 10;
19
+ function parseSiblingMaxCandidates(value) {
20
+ const parsed = Number(value ?? DEFAULT_SIBLING_MAX_CANDIDATES);
21
+ if (!Number.isFinite(parsed))
22
+ return DEFAULT_SIBLING_MAX_CANDIDATES;
23
+ const rounded = Math.trunc(parsed);
24
+ return Math.min(Math.max(rounded, 1), HARD_MAX_SIBLING_MAX_CANDIDATES);
25
+ }
26
+ export async function handleSAPContext(client, args, cachingLayer, cacheSecurity) {
27
+ const action = String(args.action ?? '');
28
+ // action="impact" is DDLS-only on the server side — default the type so LLMs
29
+ // don't have to supply it redundantly (and don't get a validation retry when
30
+ // they don't). Any non-DDLS value still fails the guardrail below.
31
+ const rawType = String(args.type ?? '');
32
+ const type = normalizeObjectType(rawType || (action === 'impact' ? 'DDLS' : ''));
33
+ const name = String(args.name ?? '');
34
+ // Bound dependency fan-out: a huge maxDeps would fan out unbounded SAP fetches per level
35
+ // (depth is already capped at 3). Clamp to [1, 100]; non-finite/<1 falls back to the default 20.
36
+ const rawMaxDeps = Number(args.maxDeps ?? 20);
37
+ const maxDeps = Number.isFinite(rawMaxDeps) && rawMaxDeps >= 1 ? Math.min(Math.floor(rawMaxDeps), 100) : 20;
38
+ const depth = Math.min(Math.max(Number(args.depth ?? 1), 1), 3);
39
+ // ─── Reverse dep lookup (pre-warmer only) ─────────────────────────
40
+ if (action === 'usages') {
41
+ if (!name)
42
+ return errorResult('"name" is required for usages action.');
43
+ if (cacheSecurity.isPerUserClient) {
44
+ return errorResult('SAPContext(action="usages") is disabled under principal propagation because it reads the shared warmup index. ' +
45
+ `Use SAPNavigate(action="references", type="${type || 'CLAS'}", name="${name}") for a live SAP-authorized lookup.`);
46
+ }
47
+ if (!cachingLayer) {
48
+ return errorResult('Reverse dependency lookup requires object caching. Cache is disabled (ARC1_CACHE=none). ' +
49
+ 'Enable caching and run cache warmup to use this feature.');
50
+ }
51
+ const usages = cachingLayer.getUsages(name);
52
+ if (usages === null) {
53
+ return errorResult(`Reverse dependency lookup requires a pre-warmed cache. The cache warmup has not been run yet.\n\n` +
54
+ `To enable this feature:\n` +
55
+ `1. Start ARC-1 with --cache-warmup (or set ARC1_CACHE_WARMUP=true)\n` +
56
+ `2. Wait for the warmup to complete (indexes all custom objects)\n` +
57
+ `3. Then retry SAPContext(action="usages", name="${name}")\n\n` +
58
+ `Alternative: Use SAPNavigate(action="references", type="CLAS", name="${name}") for a live ADT lookup (slower, but works without warmup).`);
59
+ }
60
+ if (usages.length === 0) {
61
+ return textResult(`No objects found that depend on "${name}" in the cached index.`);
62
+ }
63
+ return textResult(JSON.stringify({ name, usageCount: usages.length, usages }, null, 2));
64
+ }
65
+ if (!type || !name) {
66
+ return errorResult('Both "type" and "name" are required for SAPContext.');
67
+ }
68
+ // Helper: get source with cache support
69
+ const cachedGet = async (objType, objName, fetcher) => {
70
+ if (!cachingLayer)
71
+ return (await fetcher()).source;
72
+ const { source } = await cachingLayer.getSource(objType, objName, fetcher);
73
+ return source;
74
+ };
75
+ if (action === 'impact') {
76
+ if (type !== 'DDLS') {
77
+ return errorResult('SAPContext(action="impact") supports DDLS only. For non-CDS objects, use SAPNavigate(action="references").');
78
+ }
79
+ const ddlSource = await cachedGet('DDLS', name, (ifNoneMatch) => client.getDdls(name, { ifNoneMatch }));
80
+ const upstream = buildCdsUpstream(extractCdsDependencies(ddlSource));
81
+ const includeIndirect = args.includeIndirect === true;
82
+ const siblingCheck = args.siblingCheck !== false;
83
+ const siblingMaxCandidates = parseSiblingMaxCandidates(args.siblingMaxCandidates);
84
+ let downstream = classifyCdsImpact([], { includeIndirect });
85
+ const warnings = [];
86
+ const consistencyHints = [];
87
+ let siblingExtensionAnalysis;
88
+ try {
89
+ const whereUsed = await findWhereUsed(client.http, client.safety, objectUrlForType('DDLS', name));
90
+ downstream = classifyCdsImpact(whereUsed, { includeIndirect });
91
+ }
92
+ catch (err) {
93
+ if (err instanceof AdtApiError && [404, 405, 415, 501].includes(err.statusCode)) {
94
+ warnings.push('Where-used endpoint not available on this system');
95
+ }
96
+ else {
97
+ throw err;
98
+ }
99
+ }
100
+ if (siblingCheck && warnings.length === 0) {
101
+ try {
102
+ const targetName = name.toUpperCase();
103
+ const stem = deriveSiblingStem(targetName);
104
+ // Guard against over-broad sibling searches for short/degenerate stems
105
+ // (e.g., target "Z1" -> stem "Z" -> searchQuery "Z*" would scan the full Z namespace).
106
+ if (stem.length < 3) {
107
+ warnings.push(`Sibling consistency check skipped: derived stem "${stem}" is too short to identify siblings safely.`);
108
+ }
109
+ else {
110
+ const targetMatches = await client.searchObject(targetName, 25);
111
+ const targetMatch = targetMatches.find((candidate) => normalizeObjectType(candidate.objectType) === 'DDLS' && candidate.objectName.toUpperCase() === targetName);
112
+ const targetPackageName = targetMatch?.packageName;
113
+ if (!targetPackageName) {
114
+ warnings.push(`Sibling consistency check skipped: could not resolve package for DDLS "${targetName}".`);
115
+ }
116
+ else {
117
+ const searchQuery = `${stem}*`;
118
+ const searchMaxResults = Math.min(100, Math.max(siblingMaxCandidates * 4, siblingMaxCandidates + 4));
119
+ const siblingCandidates = await client.searchObject(searchQuery, searchMaxResults);
120
+ const skipped = {
121
+ self: 0,
122
+ nonDdls: 0,
123
+ packageMismatch: 0,
124
+ nameMismatch: 0,
125
+ overLimit: 0,
126
+ };
127
+ const filteredCandidates = [];
128
+ const seenNames = new Set();
129
+ for (const candidate of siblingCandidates) {
130
+ if (normalizeObjectType(candidate.objectType) !== 'DDLS') {
131
+ skipped.nonDdls += 1;
132
+ continue;
133
+ }
134
+ const candidateName = candidate.objectName.toUpperCase();
135
+ if (candidateName === targetName) {
136
+ skipped.self += 1;
137
+ continue;
138
+ }
139
+ if (candidate.packageName !== targetPackageName) {
140
+ skipped.packageMismatch += 1;
141
+ continue;
142
+ }
143
+ if (!isSiblingNameMatch(targetName, candidateName, stem)) {
144
+ skipped.nameMismatch += 1;
145
+ continue;
146
+ }
147
+ if (seenNames.has(candidateName)) {
148
+ continue;
149
+ }
150
+ seenNames.add(candidateName);
151
+ filteredCandidates.push({ name: candidateName, packageName: candidate.packageName });
152
+ }
153
+ const selectedCandidates = filteredCandidates.slice(0, siblingMaxCandidates);
154
+ skipped.overLimit = Math.max(filteredCandidates.length - selectedCandidates.length, 0);
155
+ const checkedCandidates = [];
156
+ let skippedWhereUsedCandidates = 0;
157
+ for (const candidate of selectedCandidates) {
158
+ try {
159
+ const siblingWhereUsed = await findWhereUsed(client.http, client.safety, objectUrlForType('DDLS', candidate.name));
160
+ const siblingDownstream = classifyCdsImpact(siblingWhereUsed, { includeIndirect });
161
+ checkedCandidates.push({
162
+ name: candidate.name,
163
+ packageName: candidate.packageName,
164
+ metadataExtensions: siblingDownstream.metadataExtensions.length,
165
+ downstreamTotal: siblingDownstream.summary.total,
166
+ });
167
+ }
168
+ catch (err) {
169
+ if (err instanceof AdtApiError && [404, 405, 415, 501].includes(err.statusCode)) {
170
+ skippedWhereUsedCandidates += 1;
171
+ continue;
172
+ }
173
+ throw err;
174
+ }
175
+ }
176
+ if (skippedWhereUsedCandidates > 0) {
177
+ warnings.push(`Sibling consistency check skipped ${skippedWhereUsedCandidates} candidate(s) due to where-used endpoint errors.`);
178
+ }
179
+ const siblingFinding = buildSiblingExtensionFinding({
180
+ targetName,
181
+ targetPackageName,
182
+ stem,
183
+ targetMetadataExtensions: downstream.metadataExtensions.length,
184
+ siblings: checkedCandidates,
185
+ });
186
+ if (siblingFinding) {
187
+ consistencyHints.push(siblingFinding.message);
188
+ }
189
+ siblingExtensionAnalysis = {
190
+ enabled: true,
191
+ stem,
192
+ searchQuery,
193
+ includeIndirect,
194
+ maxCandidates: siblingMaxCandidates,
195
+ filters: {
196
+ samePackage: true,
197
+ siblingStem: stem,
198
+ },
199
+ target: {
200
+ name: targetName,
201
+ packageName: targetPackageName,
202
+ metadataExtensions: downstream.metadataExtensions.length,
203
+ },
204
+ consideredCandidates: filteredCandidates.length,
205
+ checkedCandidates,
206
+ skipped,
207
+ };
208
+ }
209
+ }
210
+ }
211
+ catch (err) {
212
+ logger.debug('Sibling consistency check aborted', {
213
+ name,
214
+ error: err instanceof Error ? err.message : String(err),
215
+ });
216
+ warnings.push('Sibling consistency check skipped due to search or where-used processing errors.');
217
+ }
218
+ }
219
+ const upstreamCount = upstream.tables.length + upstream.views.length + upstream.associations.length + upstream.compositions.length;
220
+ const response = {
221
+ name,
222
+ type: 'DDLS',
223
+ upstream,
224
+ downstream,
225
+ summary: {
226
+ upstreamCount,
227
+ downstreamTotal: downstream.summary.total,
228
+ downstreamDirect: downstream.summary.direct,
229
+ },
230
+ ...(consistencyHints.length > 0 ? { consistencyHints } : {}),
231
+ ...(siblingExtensionAnalysis ? { siblingExtensionAnalysis } : {}),
232
+ ...(warnings.length > 0 ? { warnings } : {}),
233
+ };
234
+ return textResult(JSON.stringify(response, null, 2));
235
+ }
236
+ // Get source — either provided or fetched from SAP
237
+ let source;
238
+ if (args.source) {
239
+ source = String(args.source);
240
+ }
241
+ else {
242
+ switch (type) {
243
+ case 'CLAS':
244
+ source = await cachedGet('CLAS', name, (ifNoneMatch) => client.getClass(name, undefined, { ifNoneMatch }));
245
+ break;
246
+ case 'INTF':
247
+ source = await cachedGet('INTF', name, (ifNoneMatch) => client.getInterface(name, { ifNoneMatch }));
248
+ break;
249
+ case 'PROG':
250
+ source = await cachedGet('PROG', name, (ifNoneMatch) => client.getProgram(name, { ifNoneMatch }));
251
+ break;
252
+ case 'FUNC': {
253
+ const group = String(args.group ?? '');
254
+ if (!group) {
255
+ return errorResult('The "group" parameter is required for FUNC type. Use SAPSearch to find the function group.');
256
+ }
257
+ source = await cachedGet('FUNC', name, (ifNoneMatch) => client.getFunction(group, name, { ifNoneMatch }));
258
+ break;
259
+ }
260
+ case 'DDLS': {
261
+ const ddlSource = await cachedGet('DDLS', name, (ifNoneMatch) => client.getDdls(name, { ifNoneMatch }));
262
+ const cdsResult = await compressCdsContext(client, ddlSource, name, maxDeps, depth, contextCacheForDependencyPayloads(cachingLayer, cacheSecurity));
263
+ return textResult(cdsResult.output);
264
+ }
265
+ default:
266
+ return errorResult(`SAPContext supports types: CLAS, INTF, PROG, FUNC, DDLS. Got: ${type}`);
267
+ }
268
+ }
269
+ // Check dep graph cache — if source hash matches, return cached contracts
270
+ const dependencyPayloadCache = contextCacheForDependencyPayloads(cachingLayer, cacheSecurity);
271
+ if (dependencyPayloadCache) {
272
+ const cachedGraph = dependencyPayloadCache.getCachedDepGraph(source);
273
+ if (cachedGraph) {
274
+ const successful = cachedGraph.contracts.filter((c) => c.success);
275
+ const failed = cachedGraph.contracts.filter((c) => !c.success);
276
+ const lines = [];
277
+ lines.push(`* === Dependency context for ${name} (${successful.length} deps resolved${failed.length > 0 ? `, ${failed.length} failed` : ''}) [cached] ===`);
278
+ lines.push('');
279
+ for (const contract of successful) {
280
+ const typeLabel = contract.type.toLowerCase();
281
+ const methodLabel = contract.methodCount > 0 ? `, ${contract.methodCount} methods` : '';
282
+ lines.push(`* --- ${contract.name} (${typeLabel}${methodLabel}) ---`);
283
+ lines.push(contract.source.trim());
284
+ lines.push('');
285
+ }
286
+ if (failed.length > 0) {
287
+ lines.push('* --- Failed dependencies ---');
288
+ for (const f of failed) {
289
+ lines.push(`* ${f.name}: ${f.error}`);
290
+ }
291
+ lines.push('');
292
+ }
293
+ const totalLines = lines.length;
294
+ lines.push(`* Stats: ${successful.length + failed.length} deps found, ${successful.length} resolved, ${failed.length} failed, ${totalLines} lines [from cache]`);
295
+ return textResult(lines.join('\n'));
296
+ }
297
+ }
298
+ // Use detected ABAP version from probe if available, otherwise Cloud (superset)
299
+ const abaplintVersion = cachedFeatures?.abapRelease
300
+ ? mapSapReleaseToAbaplintVersion(cachedFeatures.abapRelease)
301
+ : undefined;
302
+ const result = await compressContext(client, source, name, type, maxDeps, depth, abaplintVersion, dependencyPayloadCache);
303
+ return textResult(result.output);
304
+ }
305
+ function buildCdsUpstream(deps) {
306
+ const tableNames = new Set();
307
+ const viewNames = new Set();
308
+ const associationNames = new Set();
309
+ const compositionNames = new Set();
310
+ for (const dep of deps) {
311
+ const upperName = dep.name.toUpperCase();
312
+ if (dep.kind === 'association') {
313
+ associationNames.add(upperName);
314
+ continue;
315
+ }
316
+ if (dep.kind === 'composition') {
317
+ compositionNames.add(upperName);
318
+ continue;
319
+ }
320
+ if (dep.kind === 'projection_base') {
321
+ viewNames.add(upperName);
322
+ continue;
323
+ }
324
+ if (isLikelyCdsViewName(upperName)) {
325
+ viewNames.add(upperName);
326
+ }
327
+ else {
328
+ tableNames.add(upperName);
329
+ }
330
+ }
331
+ return {
332
+ tables: [...tableNames].sort().map((name) => ({ name })),
333
+ views: [...viewNames].sort().map((name) => ({ name })),
334
+ associations: [...associationNames].sort().map((name) => ({ name })),
335
+ compositions: [...compositionNames].sort().map((name) => ({ name })),
336
+ };
337
+ }
338
+ function isLikelyCdsViewName(name) {
339
+ if (name.startsWith('/')) {
340
+ return /\/[ICRPAZ][A-Z0-9_]*_/.test(name);
341
+ }
342
+ return /^(ZI_|ZC_|ZR_|ZP_|I_|C_|R_|P_)/.test(name);
343
+ }
344
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/handlers/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAA6B,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvE,yEAAyE;AAEzE,MAAM,8BAA8B,GAAG,CAAC,CAAC;AACzC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAE3C,SAAS,yBAAyB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,8BAA8B,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAiB,EACjB,IAA6B,EAC7B,YAAsC,EACtC,aAAmC;IAEnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACzC,6EAA6E;IAC7E,6EAA6E;IAC7E,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,yFAAyF;IACzF,iGAAiG;IACjG,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,qEAAqE;IACrE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,OAAO,WAAW,CAAC,uCAAuC,CAAC,CAAC;QACvE,IAAI,aAAa,CAAC,eAAe,EAAE,CAAC;YAClC,OAAO,WAAW,CAChB,gHAAgH;gBAC9G,8CAA8C,IAAI,IAAI,MAAM,YAAY,IAAI,sCAAsC,CACrH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,WAAW,CAChB,0FAA0F;gBACxF,0DAA0D,CAC7D,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,WAAW,CAChB,mGAAmG;gBACjG,2BAA2B;gBAC3B,sEAAsE;gBACtE,mEAAmE;gBACnE,mDAAmD,IAAI,QAAQ;gBAC/D,wEAAwE,IAAI,8DAA8D,CAC7I,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC,oCAAoC,IAAI,wBAAwB,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,qDAAqD,CAAC,CAAC;IAC5E,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,KAAK,EACrB,OAAe,EACf,OAAe,EACf,OAA4D,EAC3C,EAAE;QACnB,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,WAAW,CAChB,4GAA4G,CAC7G,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC;QACjD,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClF,IAAI,UAAU,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,wBA0BS,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAClG,UAAU,GAAG,iBAAiB,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChF,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,YAAY,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAC3C,uEAAuE;gBACvE,uFAAuF;gBACvF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,QAAQ,CAAC,IAAI,CACX,oDAAoD,IAAI,6CAA6C,CACtG,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBAChE,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CACpC,CAAC,SAAS,EAAE,EAAE,CACZ,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,UAAU,CAC5G,CAAC;oBACF,MAAM,iBAAiB,GAAG,WAAW,EAAE,WAAW,CAAC;oBAEnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACvB,QAAQ,CAAC,IAAI,CAAC,0EAA0E,UAAU,IAAI,CAAC,CAAC;oBAC1G,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,GAAG,GAAG,IAAI,GAAG,CAAC;wBAC/B,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC;wBACrG,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;wBACnF,MAAM,OAAO,GAAG;4BACd,IAAI,EAAE,CAAC;4BACP,OAAO,EAAE,CAAC;4BACV,eAAe,EAAE,CAAC;4BAClB,YAAY,EAAE,CAAC;4BACf,SAAS,EAAE,CAAC;yBACb,CAAC;wBACF,MAAM,kBAAkB,GAAiD,EAAE,CAAC;wBAC5E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;wBAEpC,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;4BAC1C,IAAI,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;gCACzD,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;gCACrB,SAAS;4BACX,CAAC;4BAED,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;4BACzD,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;gCACjC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gCAClB,SAAS;4BACX,CAAC;4BACD,IAAI,SAAS,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;gCAChD,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;gCAC7B,SAAS;4BACX,CAAC;4BACD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;gCACzD,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;gCAC1B,SAAS;4BACX,CAAC;4BACD,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gCACjC,SAAS;4BACX,CAAC;4BACD,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;4BAC7B,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;wBACvF,CAAC;wBAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;wBAC7E,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBAEvF,MAAM,iBAAiB,GAAmE,EAAE,CAAC;wBAC7F,IAAI,0BAA0B,GAAG,CAAC,CAAC;wBAEnC,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;4BAC3C,IAAI,CAAC;gCACH,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAC1C,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CACzC,CAAC;gCACF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;gCACnF,iBAAiB,CAAC,IAAI,CAAC;oCACrB,IAAI,EAAE,SAAS,CAAC,IAAI;oCACpB,WAAW,EAAE,SAAS,CAAC,WAAW;oCAClC,kBAAkB,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,MAAM;oCAC/D,eAAe,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK;iCACjD,CAAC,CAAC;4BACL,CAAC;4BAAC,OAAO,GAAG,EAAE,CAAC;gCACb,IAAI,GAAG,YAAY,WAAW,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oCAChF,0BAA0B,IAAI,CAAC,CAAC;oCAChC,SAAS;gCACX,CAAC;gCACD,MAAM,GAAG,CAAC;4BACZ,CAAC;wBACH,CAAC;wBAED,IAAI,0BAA0B,GAAG,CAAC,EAAE,CAAC;4BACnC,QAAQ,CAAC,IAAI,CACX,qCAAqC,0BAA0B,kDAAkD,CAClH,CAAC;wBACJ,CAAC;wBAED,MAAM,cAAc,GAAG,4BAA4B,CAAC;4BAClD,UAAU;4BACV,iBAAiB;4BACjB,IAAI;4BACJ,wBAAwB,EAAE,UAAU,CAAC,kBAAkB,CAAC,MAAM;4BAC9D,QAAQ,EAAE,iBAAiB;yBAC5B,CAAC,CAAC;wBACH,IAAI,cAAc,EAAE,CAAC;4BACnB,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBAChD,CAAC;wBAED,wBAAwB,GAAG;4BACzB,OAAO,EAAE,IAAI;4BACb,IAAI;4BACJ,WAAW;4BACX,eAAe;4BACf,aAAa,EAAE,oBAAoB;4BACnC,OAAO,EAAE;gCACP,WAAW,EAAE,IAAI;gCACjB,WAAW,EAAE,IAAI;6BAClB;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,UAAU;gCAChB,WAAW,EAAE,iBAAiB;gCAC9B,kBAAkB,EAAE,UAAU,CAAC,kBAAkB,CAAC,MAAM;6BACzD;4BACD,oBAAoB,EAAE,kBAAkB,CAAC,MAAM;4BAC/C,iBAAiB;4BACjB,OAAO;yBACR,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBAChD,IAAI;oBACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GACjB,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;QAE/G,MAAM,QAAQ,GAAG;YACf,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,QAAQ;YACR,UAAU;YACV,OAAO,EAAE;gBACP,aAAa;gBACb,eAAe,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK;gBACzC,gBAAgB,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;aAC5C;YACD,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC;QAEF,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,mDAAmD;IACnD,IAAI,MAAc,CAAC;IACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC3G,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpG,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAClG,MAAM;YACR,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,WAAW,CAChB,4FAA4F,CAC7F,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC1G,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBACxG,MAAM,SAAS,GAAG,MAAM,kBAAkB,CACxC,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,KAAK,EACL,iCAAiC,CAAC,YAAY,EAAE,aAAa,CAAC,CAC/D,CAAC;gBACF,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YACD;gBACE,OAAO,WAAW,CAAC,iEAAiE,IAAI,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,sBAAsB,GAAG,iCAAiC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC9F,IAAI,sBAAsB,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAClE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CACR,gCAAgC,IAAI,KAAK,UAAU,CAAC,MAAM,iBAAiB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAChJ,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,IAAI,KAAK,SAAS,GAAG,WAAW,OAAO,CAAC,CAAC;gBACtE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,YAAY,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,gBAAgB,UAAU,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,YAAY,UAAU,qBAAqB,CACrJ,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,MAAM,eAAe,GAAG,cAAc,EAAE,WAAW;QACjD,CAAC,CAAC,8BAA8B,CAAC,cAAc,CAAC,WAAW,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,MAAM,EACN,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,EACf,sBAAsB,CACvB,CAAC;IACF,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CACvB,IAGE;IAOF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/B,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/B,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACnC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,YAAY,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,YAAY,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SAPDiagnose handler — runtime diagnostics: short dumps (ST22), traces, gateway errors, object
3
+ * state, ATC, unit tests, CDS test cases.
4
+ */
5
+ import type { AdtClient } from '../adt/client.js';
6
+ import { type ToolResult } from './shared.js';
7
+ export declare function handleSAPDiagnose(client: AdtClient, args: Record<string, unknown>): Promise<ToolResult>;
8
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/handlers/diagnose.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAyBlD,OAAO,EAAe,KAAK,UAAU,EAAc,MAAM,aAAa,CAAC;AAEvE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAqO7G"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * SAPDiagnose handler — runtime diagnostics: short dumps (ST22), traces, gateway errors, object
3
+ * state, ATC, unit tests, CDS test cases.
4
+ */
5
+ import { applyFixProposal, getCdsTestCases, getFixProposals, runAtcCheck, runUnitTests, supportsCdsTestCases, syntaxCheck, } from '../adt/devtools.js';
6
+ import { getDump, getGatewayErrorDetail, getObjectState, getTraceDbAccesses, getTraceHitlist, getTraceStatements, listDumps, listGatewayErrors, listSystemMessages, listTraces, } from '../adt/diagnostics.js';
7
+ import { isBtpSystem } from './feature-cache.js';
8
+ import { classIncludeUrl, normalizeObjectType, objectUrlForType, sourceUrlForType } from './object-types.js';
9
+ import { errorResult, textResult } from './shared.js';
10
+ export async function handleSAPDiagnose(client, args) {
11
+ const action = String(args.action ?? '');
12
+ const name = String(args.name ?? '');
13
+ const type = normalizeObjectType(String(args.type ?? ''));
14
+ switch (action) {
15
+ case 'syntax': {
16
+ const objectUrl = objectUrlForType(type, name);
17
+ const version = args.version === 'inactive' ? 'inactive' : args.version === 'active' ? 'active' : undefined;
18
+ const content = typeof args.source === 'string' ? args.source : undefined;
19
+ const opts = {};
20
+ if (version)
21
+ opts.version = version;
22
+ if (content !== undefined)
23
+ opts.content = content;
24
+ const result = await syntaxCheck(client.http, client.safety, objectUrl, Object.keys(opts).length > 0 ? opts : undefined);
25
+ return textResult(JSON.stringify(result, null, 2));
26
+ }
27
+ case 'unittest': {
28
+ const objectUrl = objectUrlForType(type, name);
29
+ const results = await runUnitTests(client.http, client.safety, objectUrl);
30
+ return textResult(JSON.stringify(results, null, 2));
31
+ }
32
+ case 'atc': {
33
+ const objectUrl = objectUrlForType(type, name);
34
+ const variant = args.variant;
35
+ const result = await runAtcCheck(client.http, client.safety, objectUrl, variant);
36
+ return textResult(JSON.stringify(result, null, 2));
37
+ }
38
+ case 'cds_testcases': {
39
+ // SAP-suggested ABAP Unit test cases for a CDS entity (CDS Test Double Framework).
40
+ // The CDS name goes straight into the ?ddlsourceName= query param — no object URL.
41
+ if (!name) {
42
+ return errorResult('"name" (the CDS entity / DDLS source name) is required for "cds_testcases".');
43
+ }
44
+ // Discovery-gate: the endpoint exists only on SAP_BASIS 8.16+ (ABAP Platform 2025).
45
+ // `false` = discovery loaded and the collection is absent (7.5x / 758) → clear message.
46
+ // `undefined` = discovery not loaded → attempt and let a 404/400 surface normally.
47
+ if (supportsCdsTestCases(client.http) === false) {
48
+ return errorResult('CDS test-case scaffolding requires SAP_BASIS 8.16+ (ABAP Platform 2025 / S/4HANA 2025). ' +
49
+ 'This system does not expose /sap/bc/adt/aunit/dbtestdoubles/cds/testcases.');
50
+ }
51
+ const result = await getCdsTestCases(client.http, client.safety, name);
52
+ const payload = {
53
+ ...result,
54
+ hint: `Scaffold an ABAP Unit test class for ${result.cds}: ` +
55
+ `cl_cds_test_environment=>create( i_for_entity = '${result.cds}' ) in class_setup, ` +
56
+ 'then implement one FOR TESTING method per case (insert_test_data for the doubled sources, ' +
57
+ 'assert with cl_abap_unit_assert). AI testdata/testmethod generation is not exposed.',
58
+ };
59
+ return textResult(JSON.stringify(payload, null, 2));
60
+ }
61
+ case 'object_state': {
62
+ if (!name || !type)
63
+ return errorResult('"name" and "type" are required for "object_state" action.');
64
+ const sections = type === 'CLAS'
65
+ ? [
66
+ { section: 'main', uri: sourceUrlForType(type, name) },
67
+ { section: 'definitions', uri: classIncludeUrl(name, 'definitions'), optional: true },
68
+ { section: 'implementations', uri: classIncludeUrl(name, 'implementations'), optional: true },
69
+ { section: 'macros', uri: classIncludeUrl(name, 'macros'), optional: true },
70
+ { section: 'testclasses', uri: classIncludeUrl(name, 'testclasses'), optional: true },
71
+ ]
72
+ : [{ section: 'main', uri: sourceUrlForType(type, name) }];
73
+ const result = await getObjectState(client.http, client.safety, { type, name, sections });
74
+ return textResult(JSON.stringify(result, null, 2));
75
+ }
76
+ case 'quickfix': {
77
+ const source = args.source;
78
+ const sourceUri = args.sourceUri;
79
+ if (!name || !type)
80
+ return errorResult('"name" and "type" are required for "quickfix" action.');
81
+ if (!source)
82
+ return errorResult('"source" is required for "quickfix" action.');
83
+ if (args.line == null)
84
+ return errorResult('"line" is required for "quickfix" action.');
85
+ const line = Number(args.line);
86
+ const column = Number(args.column ?? 0);
87
+ if (!Number.isFinite(line))
88
+ return errorResult('"line" must be a number for "quickfix" action.');
89
+ if (!Number.isFinite(column))
90
+ return errorResult('"column" must be a number for "quickfix" action.');
91
+ const proposals = await getFixProposals(client.http, client.safety, sourceUri ?? sourceUrlForType(type, name), source, line, column);
92
+ return textResult(JSON.stringify(proposals, null, 2));
93
+ }
94
+ case 'apply_quickfix': {
95
+ const source = args.source;
96
+ const sourceUri = args.sourceUri;
97
+ const proposalUri = args.proposalUri;
98
+ const proposalUserContent = args.proposalUserContent;
99
+ const proposalAffectedObjects = args.proposalAffectedObjects;
100
+ if (!name || !type)
101
+ return errorResult('"name" and "type" are required for "apply_quickfix" action.');
102
+ if (!source)
103
+ return errorResult('"source" is required for "apply_quickfix" action.');
104
+ if (args.line == null)
105
+ return errorResult('"line" is required for "apply_quickfix" action.');
106
+ if (!proposalUri)
107
+ return errorResult('"proposalUri" is required for "apply_quickfix" action.');
108
+ if (proposalUserContent === undefined)
109
+ return errorResult('"proposalUserContent" is required for "apply_quickfix" action.');
110
+ const line = Number(args.line);
111
+ const column = Number(args.column ?? 0);
112
+ if (!Number.isFinite(line))
113
+ return errorResult('"line" must be a number for "apply_quickfix" action.');
114
+ if (!Number.isFinite(column))
115
+ return errorResult('"column" must be a number for "apply_quickfix" action.');
116
+ const deltas = await applyFixProposal(client.http, client.safety, {
117
+ uri: proposalUri,
118
+ type: 'quickfix/proposal',
119
+ name: '',
120
+ description: '',
121
+ userContent: proposalUserContent,
122
+ ...(proposalAffectedObjects ? { affectedObjects: proposalAffectedObjects } : {}),
123
+ }, sourceUri ?? sourceUrlForType(type, name), source, line, column);
124
+ return textResult(JSON.stringify(deltas, null, 2));
125
+ }
126
+ case 'dumps': {
127
+ const id = args.id;
128
+ if (id) {
129
+ const detail = await getDump(client.http, client.safety, id);
130
+ const includeFullText = args.includeFullText === true || String(args.includeFullText ?? '') === 'true';
131
+ const selectedSections = selectDumpSections(detail, args.sections);
132
+ const payload = {
133
+ id: detail.id,
134
+ error: detail.error,
135
+ exception: detail.exception,
136
+ program: detail.program,
137
+ user: detail.user,
138
+ timestamp: detail.timestamp,
139
+ chapters: detail.chapters,
140
+ terminationUri: detail.terminationUri,
141
+ sections: selectedSections,
142
+ selectedSectionIds: Object.keys(selectedSections),
143
+ availableSections: detail.chapters.map((chapter) => ({
144
+ id: chapter.name,
145
+ title: chapter.title,
146
+ line: chapter.line,
147
+ })),
148
+ };
149
+ if (includeFullText) {
150
+ payload.formattedText = detail.formattedText;
151
+ }
152
+ return textResult(JSON.stringify(payload, null, 2));
153
+ }
154
+ const user = args.user;
155
+ const maxResults = args.maxResults ? Number(args.maxResults) : undefined;
156
+ const dumps = await listDumps(client.http, client.safety, { user, maxResults });
157
+ return textResult(JSON.stringify(dumps, null, 2));
158
+ }
159
+ case 'traces': {
160
+ const id = args.id;
161
+ if (id) {
162
+ // Get trace analysis
163
+ const analysis = String(args.analysis ?? 'hitlist');
164
+ switch (analysis) {
165
+ case 'hitlist': {
166
+ const hitlist = await getTraceHitlist(client.http, client.safety, id);
167
+ return textResult(JSON.stringify(hitlist, null, 2));
168
+ }
169
+ case 'statements': {
170
+ const statements = await getTraceStatements(client.http, client.safety, id);
171
+ return textResult(JSON.stringify(statements, null, 2));
172
+ }
173
+ case 'dbAccesses': {
174
+ const dbAccesses = await getTraceDbAccesses(client.http, client.safety, id);
175
+ return textResult(JSON.stringify(dbAccesses, null, 2));
176
+ }
177
+ default:
178
+ return errorResult(`Unknown trace analysis type: ${analysis}. Supported: hitlist, statements, dbAccesses`);
179
+ }
180
+ }
181
+ // List traces
182
+ const traces = await listTraces(client.http, client.safety);
183
+ return textResult(JSON.stringify(traces, null, 2));
184
+ }
185
+ case 'system_messages': {
186
+ const user = args.user;
187
+ const maxResults = args.maxResults ? Number(args.maxResults) : undefined;
188
+ const from = args.from;
189
+ const to = args.to;
190
+ const messages = await listSystemMessages(client.http, client.safety, { user, maxResults, from, to });
191
+ return textResult(JSON.stringify(messages, null, 2));
192
+ }
193
+ case 'gateway_errors': {
194
+ if (isBtpSystem()) {
195
+ return errorResult('SAP Gateway error log is not available on BTP ABAP Environment. Use this action on on-prem systems.');
196
+ }
197
+ const user = args.user;
198
+ const maxResults = args.maxResults ? Number(args.maxResults) : undefined;
199
+ const from = args.from;
200
+ const to = args.to;
201
+ const detailUrl = args.detailUrl;
202
+ const id = args.id;
203
+ const errorType = args.errorType;
204
+ if (detailUrl || id) {
205
+ const detail = await getGatewayErrorDetail(client.http, client.safety, { detailUrl, id, errorType });
206
+ return textResult(JSON.stringify(detail, null, 2));
207
+ }
208
+ const errors = await listGatewayErrors(client.http, client.safety, { user, maxResults, from, to });
209
+ return textResult(JSON.stringify(errors, null, 2));
210
+ }
211
+ default:
212
+ return errorResult(`Unknown SAPDiagnose action: ${action}. Supported: syntax, unittest, atc, object_state, quickfix, apply_quickfix, dumps, traces, system_messages, gateway_errors`);
213
+ }
214
+ }
215
+ function selectDumpSections(detail, requestedSections) {
216
+ const availableSections = detail.sections ?? {};
217
+ const availableIds = Object.keys(availableSections);
218
+ if (availableIds.length === 0)
219
+ return {};
220
+ const requestedIds = resolveRequestedDumpSectionIds(detail, requestedSections);
221
+ const selectedIds = requestedIds.length > 0 ? requestedIds : pickDefaultDumpSectionIds(detail);
222
+ const finalIds = selectedIds.length > 0 ? selectedIds : availableIds.slice(0, 5);
223
+ return Object.fromEntries(finalIds.map((id) => [id, availableSections[id] ?? '']));
224
+ }
225
+ function resolveRequestedDumpSectionIds(detail, requestedSections) {
226
+ if (!Array.isArray(requestedSections))
227
+ return [];
228
+ const availableIds = new Set(Object.keys(detail.sections ?? {}));
229
+ const resolved = requestedSections
230
+ .map((entry) => resolveDumpSectionId(detail, String(entry ?? '')))
231
+ .filter((entry) => typeof entry === 'string' && availableIds.has(entry));
232
+ return Array.from(new Set(resolved));
233
+ }
234
+ function resolveDumpSectionId(detail, candidate) {
235
+ const normalizedCandidate = normalizeDumpSectionKey(candidate);
236
+ if (!normalizedCandidate)
237
+ return undefined;
238
+ const direct = detail.chapters.find((chapter) => normalizeDumpSectionKey(chapter.name) === normalizedCandidate)?.name;
239
+ if (direct)
240
+ return direct;
241
+ const exactTitle = detail.chapters.find((chapter) => normalizeDumpSectionKey(chapter.title) === normalizedCandidate)?.name;
242
+ if (exactTitle)
243
+ return exactTitle;
244
+ const fuzzyTitle = detail.chapters.find((chapter) => normalizeDumpSectionKey(chapter.title).includes(normalizedCandidate))?.name;
245
+ return fuzzyTitle;
246
+ }
247
+ function pickDefaultDumpSectionIds(detail) {
248
+ const wanted = ['short text', 'what happened', 'error analysis', 'source code extract', 'active calls', 'call stack'];
249
+ const selected = [];
250
+ for (const pattern of wanted) {
251
+ const found = detail.chapters.find((chapter) => normalizeDumpSectionKey(chapter.title).includes(normalizeDumpSectionKey(pattern)) && chapter.name);
252
+ if (found?.name && !selected.includes(found.name) && detail.sections[found.name]) {
253
+ selected.push(found.name);
254
+ }
255
+ }
256
+ if (selected.length > 0)
257
+ return selected;
258
+ const ordered = [...detail.chapters]
259
+ .sort((a, b) => {
260
+ if (a.line !== b.line)
261
+ return a.line - b.line;
262
+ return a.chapterOrder - b.chapterOrder;
263
+ })
264
+ .map((chapter) => chapter.name)
265
+ .filter((name) => Boolean(name) && Boolean(detail.sections[name]));
266
+ return Array.from(new Set(ordered)).slice(0, 5);
267
+ }
268
+ function normalizeDumpSectionKey(value) {
269
+ return value
270
+ .toLowerCase()
271
+ .replace(/[^a-z0-9]+/g, ' ')
272
+ .trim();
273
+ }
274
+ //# sourceMappingURL=diagnose.js.map