abapgit-agent 1.18.1 → 1.19.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.
@@ -246,7 +246,7 @@ Description:
246
246
  Parameters:
247
247
  --objects <obj1,...> Comma-separated object names (required).
248
248
  --type <type> Object type: CLAS, INTF, PROG, TABL, STRU, DTEL, TTYP, DOMA,
249
- DDLS, DCLS, MSAG, FUGR (auto-detected from TADIR if omitted).
249
+ DDLS, DCLS, MSAG, FUGR, SUSO (auto-detected from TADIR if omitted).
250
250
  --full Show full source including all method implementations.
251
251
  --lines Show dual line numbers (G = global for debug set, [N] = include-local).
252
252
  --fm <name> With --full: show only the specified function module (FUGR only).
@@ -593,6 +593,51 @@ Examples:
593
593
  console.log(` ${desc}`);
594
594
  }
595
595
  }
596
+ } else if (objType === 'SUSO' || objType === 'Authorization Object') {
597
+ // SUSO: property box for object class + fields, then activities list
598
+ const classComp = components.filter(c => String(c.FIELD || c.field || '').startsWith('OCLSS'));
599
+ const fieldComps = components.filter(c => String(c.FIELD || c.field || '').startsWith('FIELD_'));
600
+ const actvtComps = components.filter(c => String(c.FIELD || c.field || '').startsWith('ACTVT_'));
601
+
602
+ const propWidth = 16;
603
+ const valueWidth = 42;
604
+ const sep = '┌' + '─'.repeat(propWidth + 2) + '┬' + '─'.repeat(valueWidth + 2) + '┐';
605
+ const mid = '├' + '─'.repeat(propWidth + 2) + '┼' + '─'.repeat(valueWidth + 2) + '┤';
606
+ const end = '└' + '─'.repeat(propWidth + 2) + '┴' + '─'.repeat(valueWidth + 2) + '┘';
607
+ const buildPropRow = (property, value) =>
608
+ '│ ' + String(property || '').padEnd(propWidth) + ' │ ' +
609
+ String(value || '').substring(0, valueWidth).padEnd(valueWidth) + ' │';
610
+
611
+ console.log(` AUTH OBJECT ${objName}:`);
612
+ console.log(sep);
613
+ console.log(buildPropRow('Property', 'Value'));
614
+ console.log(mid);
615
+
616
+ for (const comp of classComp) {
617
+ const desc = comp.DESCRIPTION || comp.description || '';
618
+ const colonIdx = desc.indexOf(': ');
619
+ const value = colonIdx !== -1 ? desc.substring(colonIdx + 2) : desc;
620
+ console.log(buildPropRow('Object class', value));
621
+ }
622
+
623
+ for (const comp of fieldComps) {
624
+ const desc = comp.DESCRIPTION || comp.description || '';
625
+ const colonIdx = desc.indexOf(': ');
626
+ const value = colonIdx !== -1 ? desc.substring(colonIdx + 2) : desc;
627
+ const idx = String(comp.FIELD || comp.field || '').replace('FIELD_', '');
628
+ console.log(buildPropRow(`Field ${idx}`, value));
629
+ }
630
+
631
+ console.log(end);
632
+
633
+ if (actvtComps.length > 0) {
634
+ console.log('');
635
+ console.log(` Allowed activities (${actvtComps.length}):`);
636
+ for (const comp of actvtComps) {
637
+ const desc = comp.DESCRIPTION || comp.description || '';
638
+ console.log(` ${desc}`);
639
+ }
640
+ }
596
641
  } else {
597
642
  // Build table display for TABL/STRU with Data Element and Description
598
643
  const colWidths = {
@@ -166,7 +166,8 @@ class AdtHttp {
166
166
  return await this._makeRequest(method, urlPath, body, options);
167
167
  } catch (error) {
168
168
  if (this._isAuthError(error) && !options.isRetry) {
169
- this.csrfToken = null;
169
+ // Clear stale session state and refresh
170
+ this.clearSession();
170
171
  await this.fetchCsrfToken();
171
172
  return await this._makeRequest(method, urlPath, body, { ...options, isRetry: true });
172
173
  }
@@ -178,7 +179,9 @@ class AdtHttp {
178
179
  if (error.statusCode === 401) return true;
179
180
  if (error.statusCode === 403) return true;
180
181
  const msg = (error.message || '').toLowerCase();
181
- return msg.includes('csrf') || msg.includes('unauthorized') || msg.includes('forbidden');
182
+ if (msg.includes('csrf') || msg.includes('unauthorized') || msg.includes('forbidden')) return true;
183
+ if (msg.includes('session timed out') || msg.includes('session not found')) return true;
184
+ return false;
182
185
  }
183
186
 
184
187
  async _makeRequest(method, urlPath, body = null, options = {}) {