arc-1 0.6.9 → 0.7.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 (157) hide show
  1. package/README.md +12 -9
  2. package/bin/arc1-cli.js +10 -0
  3. package/bin/arc1.js +1 -1
  4. package/dist/adt/abapgit.d.ts +39 -0
  5. package/dist/adt/abapgit.d.ts.map +1 -0
  6. package/dist/adt/abapgit.js +333 -0
  7. package/dist/adt/abapgit.js.map +1 -0
  8. package/dist/adt/cds-impact.d.ts +35 -0
  9. package/dist/adt/cds-impact.d.ts.map +1 -1
  10. package/dist/adt/cds-impact.js +71 -0
  11. package/dist/adt/cds-impact.js.map +1 -1
  12. package/dist/adt/client.d.ts +4 -1
  13. package/dist/adt/client.d.ts.map +1 -1
  14. package/dist/adt/client.js +18 -5
  15. package/dist/adt/client.js.map +1 -1
  16. package/dist/adt/config.d.ts +1 -0
  17. package/dist/adt/config.d.ts.map +1 -1
  18. package/dist/adt/config.js +1 -0
  19. package/dist/adt/config.js.map +1 -1
  20. package/dist/adt/crud.d.ts.map +1 -1
  21. package/dist/adt/crud.js +74 -8
  22. package/dist/adt/crud.js.map +1 -1
  23. package/dist/adt/devtools.d.ts +39 -3
  24. package/dist/adt/devtools.d.ts.map +1 -1
  25. package/dist/adt/devtools.js +237 -25
  26. package/dist/adt/devtools.js.map +1 -1
  27. package/dist/adt/diagnostics.d.ts +69 -7
  28. package/dist/adt/diagnostics.d.ts.map +1 -1
  29. package/dist/adt/diagnostics.js +694 -36
  30. package/dist/adt/diagnostics.js.map +1 -1
  31. package/dist/adt/errors.d.ts +36 -2
  32. package/dist/adt/errors.d.ts.map +1 -1
  33. package/dist/adt/errors.js +111 -11
  34. package/dist/adt/errors.js.map +1 -1
  35. package/dist/adt/features.d.ts.map +1 -1
  36. package/dist/adt/features.js +3 -0
  37. package/dist/adt/features.js.map +1 -1
  38. package/dist/adt/gcts.d.ts +68 -0
  39. package/dist/adt/gcts.d.ts.map +1 -0
  40. package/dist/adt/gcts.js +239 -0
  41. package/dist/adt/gcts.js.map +1 -0
  42. package/dist/adt/http.d.ts.map +1 -1
  43. package/dist/adt/http.js +86 -1
  44. package/dist/adt/http.js.map +1 -1
  45. package/dist/adt/rap-handlers.d.ts +165 -0
  46. package/dist/adt/rap-handlers.d.ts.map +1 -0
  47. package/dist/adt/rap-handlers.js +835 -0
  48. package/dist/adt/rap-handlers.js.map +1 -0
  49. package/dist/adt/rap-preflight.d.ts +43 -0
  50. package/dist/adt/rap-preflight.d.ts.map +1 -0
  51. package/dist/adt/rap-preflight.js +405 -0
  52. package/dist/adt/rap-preflight.js.map +1 -0
  53. package/dist/adt/safety.d.ts +60 -33
  54. package/dist/adt/safety.d.ts.map +1 -1
  55. package/dist/adt/safety.js +204 -113
  56. package/dist/adt/safety.js.map +1 -1
  57. package/dist/adt/transport.d.ts +1 -1
  58. package/dist/adt/transport.d.ts.map +1 -1
  59. package/dist/adt/transport.js +6 -3
  60. package/dist/adt/transport.js.map +1 -1
  61. package/dist/adt/types.d.ts +225 -0
  62. package/dist/adt/types.d.ts.map +1 -1
  63. package/dist/adt/xml-parser.d.ts +15 -1
  64. package/dist/adt/xml-parser.d.ts.map +1 -1
  65. package/dist/adt/xml-parser.js +28 -15
  66. package/dist/adt/xml-parser.js.map +1 -1
  67. package/dist/authz/policy.d.ts +53 -0
  68. package/dist/authz/policy.d.ts.map +1 -0
  69. package/dist/authz/policy.js +199 -0
  70. package/dist/authz/policy.js.map +1 -0
  71. package/dist/cli-args.d.ts +14 -0
  72. package/dist/cli-args.d.ts.map +1 -0
  73. package/dist/cli-args.js +62 -0
  74. package/dist/cli-args.js.map +1 -0
  75. package/dist/cli.d.ts +13 -7
  76. package/dist/cli.d.ts.map +1 -1
  77. package/dist/cli.js +252 -55
  78. package/dist/cli.js.map +1 -1
  79. package/dist/extract-sap-cookies.d.ts +24 -0
  80. package/dist/extract-sap-cookies.d.ts.map +1 -0
  81. package/dist/extract-sap-cookies.js +317 -0
  82. package/dist/extract-sap-cookies.js.map +1 -0
  83. package/dist/handlers/hyperfocused.d.ts +4 -3
  84. package/dist/handlers/hyperfocused.d.ts.map +1 -1
  85. package/dist/handlers/hyperfocused.js +25 -16
  86. package/dist/handlers/hyperfocused.js.map +1 -1
  87. package/dist/handlers/intent.d.ts +4 -12
  88. package/dist/handlers/intent.d.ts.map +1 -1
  89. package/dist/handlers/intent.js +1448 -89
  90. package/dist/handlers/intent.js.map +1 -1
  91. package/dist/handlers/schemas.d.ts +83 -11
  92. package/dist/handlers/schemas.d.ts.map +1 -1
  93. package/dist/handlers/schemas.js +115 -4
  94. package/dist/handlers/schemas.js.map +1 -1
  95. package/dist/handlers/tools.d.ts +4 -3
  96. package/dist/handlers/tools.d.ts.map +1 -1
  97. package/dist/handlers/tools.js +342 -143
  98. package/dist/handlers/tools.js.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.js +7 -6
  101. package/dist/index.js.map +1 -1
  102. package/dist/probe/catalog.d.ts +30 -0
  103. package/dist/probe/catalog.d.ts.map +1 -0
  104. package/dist/probe/catalog.js +196 -0
  105. package/dist/probe/catalog.js.map +1 -0
  106. package/dist/probe/fixtures.d.ts +54 -0
  107. package/dist/probe/fixtures.d.ts.map +1 -0
  108. package/dist/probe/fixtures.js +94 -0
  109. package/dist/probe/fixtures.js.map +1 -0
  110. package/dist/probe/format.d.ts +10 -0
  111. package/dist/probe/format.d.ts.map +1 -0
  112. package/dist/probe/format.js +114 -0
  113. package/dist/probe/format.js.map +1 -0
  114. package/dist/probe/quality.d.ts +13 -0
  115. package/dist/probe/quality.d.ts.map +1 -0
  116. package/dist/probe/quality.js +50 -0
  117. package/dist/probe/quality.js.map +1 -0
  118. package/dist/probe/runner.d.ts +48 -0
  119. package/dist/probe/runner.d.ts.map +1 -0
  120. package/dist/probe/runner.js +211 -0
  121. package/dist/probe/runner.js.map +1 -0
  122. package/dist/probe/types.d.ts +159 -0
  123. package/dist/probe/types.d.ts.map +1 -0
  124. package/dist/probe/types.js +11 -0
  125. package/dist/probe/types.js.map +1 -0
  126. package/dist/server/audit.d.ts +26 -3
  127. package/dist/server/audit.d.ts.map +1 -1
  128. package/dist/server/audit.js +12 -1
  129. package/dist/server/audit.js.map +1 -1
  130. package/dist/server/config.d.ts +34 -19
  131. package/dist/server/config.d.ts.map +1 -1
  132. package/dist/server/config.js +327 -187
  133. package/dist/server/config.js.map +1 -1
  134. package/dist/server/deny-actions.d.ts +31 -0
  135. package/dist/server/deny-actions.d.ts.map +1 -0
  136. package/dist/server/deny-actions.js +156 -0
  137. package/dist/server/deny-actions.js.map +1 -0
  138. package/dist/server/effective-policy-log.d.ts +27 -0
  139. package/dist/server/effective-policy-log.d.ts.map +1 -0
  140. package/dist/server/effective-policy-log.js +103 -0
  141. package/dist/server/effective-policy-log.js.map +1 -0
  142. package/dist/server/http.d.ts.map +1 -1
  143. package/dist/server/http.js +15 -16
  144. package/dist/server/http.js.map +1 -1
  145. package/dist/server/server.d.ts +38 -4
  146. package/dist/server/server.d.ts.map +1 -1
  147. package/dist/server/server.js +234 -31
  148. package/dist/server/server.js.map +1 -1
  149. package/dist/server/types.d.ts +31 -13
  150. package/dist/server/types.d.ts.map +1 -1
  151. package/dist/server/types.js +11 -10
  152. package/dist/server/types.js.map +1 -1
  153. package/dist/server/xsuaa.d.ts +1 -2
  154. package/dist/server/xsuaa.d.ts.map +1 -1
  155. package/dist/server/xsuaa.js +13 -14
  156. package/dist/server/xsuaa.js.map +1 -1
  157. package/package.json +9 -3
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Human-readable formatters for probe reports.
3
+ *
4
+ * Kept separate from the runner so the runner stays pure and JSON-serializable,
5
+ * and so the CLI can opt between `--format table` and `--format json`.
6
+ */
7
+ const VERDICT_LABEL = {
8
+ 'available-high': 'AVAILABLE (high)',
9
+ 'available-medium': 'AVAILABLE (medium)',
10
+ 'unavailable-high': 'UNAVAILABLE (high)',
11
+ 'unavailable-likely': 'UNAVAILABLE (likely)',
12
+ 'auth-blocked': 'AUTH BLOCKED',
13
+ ambiguous: 'AMBIGUOUS',
14
+ };
15
+ const DISCOVERY_SHORT = { discovered: 'Y', 'not-discovered': 'N', 'no-discovery-map': '-' };
16
+ function signalShortForKnown(k) {
17
+ switch (k.kind) {
18
+ case 'ok':
19
+ return `OK(${k.objectName})`;
20
+ case 'all-missing':
21
+ return `404×${k.attempted.length}`;
22
+ case 'auth-blocked':
23
+ return '401/403';
24
+ case 'error':
25
+ return 'ERR';
26
+ case 'not-tested':
27
+ return '—';
28
+ }
29
+ }
30
+ function signalShortForRelease(r) {
31
+ switch (r.kind) {
32
+ case 'ok':
33
+ return `${r.detected}>=${r.floor || '?'}`;
34
+ case 'below-floor':
35
+ return `${r.detected}<${r.floor}`;
36
+ case 'unknown':
37
+ return '?';
38
+ }
39
+ }
40
+ function padRight(s, n) {
41
+ return s.length >= n ? s : s + ' '.repeat(n - s.length);
42
+ }
43
+ /** Render the full report as a plain-text block (for terminal output). */
44
+ export function formatTable(report) {
45
+ const lines = [];
46
+ lines.push(`SAP system: ${report.system.baseUrl}`);
47
+ lines.push(`SAP_BASIS: ${report.system.abapRelease ?? '(unknown)'}`);
48
+ lines.push(`System type: ${report.system.systemType ?? 'unknown'}`);
49
+ lines.push(`SAP client: ${report.system.client ?? '(default)'}`);
50
+ lines.push(`Discovery size: ${report.system.discoveryMapSize} collections`);
51
+ lines.push(`Probed at: ${report.system.probedAt}`);
52
+ if (report.system.products && report.system.products.length > 0) {
53
+ // Surface the product-line markers that matter for "which SAP is this really".
54
+ const markers = ['SAP_BASIS', 'SAP_ABA', 'S4FND', 'S4CORE', 'SAP_CLOUD', 'SAP_UI'];
55
+ const shown = report.system.products.filter((p) => markers.includes(p.name.toUpperCase()));
56
+ if (shown.length > 0) {
57
+ const joined = shown.map((p) => `${p.name} ${p.release}${p.spLevel ? ` SP${p.spLevel}` : ''}`).join(', ');
58
+ lines.push(`Key components: ${joined}`);
59
+ }
60
+ }
61
+ lines.push('');
62
+ const header = [
63
+ padRight('TYPE', 6),
64
+ padRight('VERDICT', 21),
65
+ padRight('DISCO', 5),
66
+ padRight('COLLECTION', 22),
67
+ padRight('KNOWN', 14),
68
+ padRight('RELEASE', 11),
69
+ 'REASON',
70
+ ].join(' ');
71
+ lines.push(header);
72
+ lines.push('-'.repeat(header.length));
73
+ for (const r of report.results) {
74
+ const statusFragment = r.signals.collection.statusCode
75
+ ? `${r.signals.collection.classification} ${r.signals.collection.statusCode}`
76
+ : r.signals.collection.classification;
77
+ lines.push([
78
+ padRight(r.type, 6),
79
+ padRight(VERDICT_LABEL[r.verdict], 21),
80
+ padRight(DISCOVERY_SHORT[r.signals.discovery], 5),
81
+ padRight(statusFragment, 22),
82
+ padRight(signalShortForKnown(r.signals.knownObject), 14),
83
+ padRight(signalShortForRelease(r.signals.release), 11),
84
+ r.reason,
85
+ ].join(' '));
86
+ }
87
+ lines.push('');
88
+ lines.push('Quality metrics');
89
+ lines.push('---------------');
90
+ const q = report.quality;
91
+ const pct = (n) => `${(n * 100).toFixed(0)}%`;
92
+ lines.push(` Coverage — discovery: ${pct(q.coverage.discovery)}`);
93
+ lines.push(` Coverage — collection: ${pct(q.coverage.collection)}`);
94
+ lines.push(` Coverage — known-object: ${pct(q.coverage.knownObject)}`);
95
+ lines.push(` Coverage — release: ${pct(q.coverage.release)}`);
96
+ lines.push(` Discovery vs known-object: ${q.discoveryAccuracyVsKnownObject === null
97
+ ? 'n/a (no known-object positives)'
98
+ : pct(q.discoveryAccuracyVsKnownObject)}`);
99
+ lines.push('');
100
+ lines.push(' Verdicts:');
101
+ for (const [k, v] of Object.entries(q.verdictHistogram)) {
102
+ lines.push(` ${padRight(k, 20)} ${v}`);
103
+ }
104
+ if (q.ambiguousTypes.length > 0) {
105
+ lines.push('');
106
+ lines.push(` Ambiguous (signals disagree — review): ${q.ambiguousTypes.join(', ')}`);
107
+ }
108
+ if (q.uncoveredByKnownObject.length > 0) {
109
+ lines.push('');
110
+ lines.push(` No known-object fixture (probe blind spot): ${q.uncoveredByKnownObject.join(', ')}`);
111
+ }
112
+ return lines.join('\n');
113
+ }
114
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/probe/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Quality-of-probe metrics.
3
+ *
4
+ * The probe's outputs are only as trustworthy as the signals it gathered.
5
+ * These aggregate metrics tell a reader at a glance:
6
+ * - how many types each signal could answer
7
+ * - which types were flagged ambiguous (the danger zone)
8
+ * - whether the discovery map lines up with the authoritative known-object
9
+ * signal on this system (if not, discovery is unreliable here)
10
+ */
11
+ import type { QualityMetrics, TypeResult } from './types.js';
12
+ export declare function computeQuality(results: TypeResult[]): QualityMetrics;
13
+ //# sourceMappingURL=quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/probe/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAW,MAAM,YAAY,CAAC;AAWtE,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,cAAc,CAkCpE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Quality-of-probe metrics.
3
+ *
4
+ * The probe's outputs are only as trustworthy as the signals it gathered.
5
+ * These aggregate metrics tell a reader at a glance:
6
+ * - how many types each signal could answer
7
+ * - which types were flagged ambiguous (the danger zone)
8
+ * - whether the discovery map lines up with the authoritative known-object
9
+ * signal on this system (if not, discovery is unreliable here)
10
+ */
11
+ import { CATALOG } from './catalog.js';
12
+ const ALL_VERDICTS = [
13
+ 'available-high',
14
+ 'available-medium',
15
+ 'unavailable-high',
16
+ 'unavailable-likely',
17
+ 'auth-blocked',
18
+ 'ambiguous',
19
+ ];
20
+ export function computeQuality(results) {
21
+ const total = results.length || 1; // avoid div-by-zero on empty catalog
22
+ const discoveryDefinitive = results.filter((r) => r.signals.discovery !== 'no-discovery-map').length;
23
+ const collectionDefinitive = results.filter((r) => r.signals.collection.classification !== 'network-error').length;
24
+ const knownObjectTested = results.filter((r) => r.signals.knownObject.kind !== 'not-tested').length;
25
+ const releaseKnown = results.filter((r) => r.signals.release.kind !== 'unknown').length;
26
+ // discoveryAccuracyVsKnownObject: of types where known-object confirmed
27
+ // availability, how many did discovery also list?
28
+ const knownOk = results.filter((r) => r.signals.knownObject.kind === 'ok');
29
+ const discoveryAccuracyVsKnownObject = knownOk.length === 0 ? null : knownOk.filter((r) => r.signals.discovery === 'discovered').length / knownOk.length;
30
+ const verdictHistogram = {};
31
+ for (const v of ALL_VERDICTS)
32
+ verdictHistogram[v] = 0;
33
+ for (const r of results)
34
+ verdictHistogram[r.verdict] += 1;
35
+ const ambiguousTypes = results.filter((r) => r.verdict === 'ambiguous').map((r) => r.type);
36
+ const uncoveredByKnownObject = CATALOG.filter((e) => (e.knownObjects?.length ?? 0) === 0).map((e) => e.type);
37
+ return {
38
+ coverage: {
39
+ discovery: discoveryDefinitive / total,
40
+ collection: collectionDefinitive / total,
41
+ knownObject: knownObjectTested / total,
42
+ release: releaseKnown / total,
43
+ },
44
+ discoveryAccuracyVsKnownObject,
45
+ verdictHistogram,
46
+ ambiguousTypes,
47
+ uncoveredByKnownObject,
48
+ };
49
+ }
50
+ //# sourceMappingURL=quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.js","sourceRoot":"","sources":["../../src/probe/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,MAAM,YAAY,GAAc;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,qCAAqC;IAExE,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,kBAAkB,CAAC,CAAC,MAAM,CAAC;IACrG,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,KAAK,eAAe,CAAC,CAAC,MAAM,CAAC;IACnH,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAExF,wEAAwE;IACxE,kDAAkD;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3E,MAAM,8BAA8B,GAClC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEpH,MAAM,gBAAgB,GAAG,EAA6B,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3F,MAAM,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE7G,OAAO;QACL,QAAQ,EAAE;YACR,SAAS,EAAE,mBAAmB,GAAG,KAAK;YACtC,UAAU,EAAE,oBAAoB,GAAG,KAAK;YACxC,WAAW,EAAE,iBAAiB,GAAG,KAAK;YACtC,OAAO,EAAE,YAAY,GAAG,KAAK;SAC9B;QACD,8BAA8B;QAC9B,gBAAgB;QAChB,cAAc;QACd,sBAAsB;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Probe runner — classifies each ADT type against four independent signals:
3
+ *
4
+ * 1. Discovery map presence (free; from the already-fetched /discovery doc)
5
+ * 2. Collection-URL GET (tolerates 400/403/405 as "endpoint exists" — the
6
+ * #94/#95 lesson: only 404 is a hard negative)
7
+ * 3. Known-object GET on an SAP-shipped fixture (authoritative when available)
8
+ * 4. SAP_BASIS release vs. a hand-curated floor (weak tie-breaker only)
9
+ *
10
+ * The runner is deliberately pure: it takes a simple `HttpProbeFn` that never
11
+ * throws and returns a neutral shape. This makes it trivially testable by
12
+ * replaying recorded SAP responses from fixtures.
13
+ */
14
+ import type { CatalogEntry, DiscoverySignal, HttpClassification, HttpProbe, KnownObjectOutcome, TypeResult, TypeSignals, Verdict } from './types.js';
15
+ /** Neutral HTTP-result shape the runner consumes. Never throws. */
16
+ export interface ProbeFetchResult {
17
+ statusCode?: number;
18
+ body?: string;
19
+ /** True when no HTTP response was obtained at all (connection refused, DNS, TLS). */
20
+ networkError?: boolean;
21
+ errorMessage?: string;
22
+ durationMs: number;
23
+ }
24
+ /** Function the runner calls to probe one URL. Implementations must not throw. */
25
+ export type HttpProbeFn = (url: string, method: 'GET' | 'HEAD') => Promise<ProbeFetchResult>;
26
+ /** Parse SAP_BASIS release string like "750", "7.57", "sap_btp" to a number, or null. */
27
+ export declare function parseRelease(release: string | undefined): number | null;
28
+ /** Classify an HTTP response code into a discrete bucket. */
29
+ export declare function classifyHttp(result: ProbeFetchResult): HttpClassification;
30
+ /** Run the collection-URL probe. Normalized, never throws. */
31
+ export declare function probeCollection(fetchFn: HttpProbeFn, collectionUrl: string): Promise<HttpProbe>;
32
+ /**
33
+ * Try each known object in order and classify the outcome.
34
+ * We stop at the first 2xx; if all fail, we aggregate the attempted list.
35
+ */
36
+ export declare function probeKnownObject(fetchFn: HttpProbeFn, entry: CatalogEntry): Promise<KnownObjectOutcome>;
37
+ /** Classify the release signal. */
38
+ export declare function classifyRelease(detectedRelease: string | undefined, floor: number | undefined): TypeSignals['release'];
39
+ /** Collapse the four signals into a final verdict + one-line reason. */
40
+ export declare function classifyVerdict(signals: TypeSignals): {
41
+ verdict: Verdict;
42
+ reason: string;
43
+ };
44
+ /** Compute a discovery-map lookup for a collection URL. */
45
+ export declare function resolveDiscovery(discoveryMap: Map<string, string[]> | undefined, collectionUrl: string): DiscoverySignal;
46
+ /** Probe one catalog entry end-to-end. */
47
+ export declare function probeType(fetchFn: HttpProbeFn, entry: CatalogEntry, discoveryMap: Map<string, string[]> | undefined, detectedRelease: string | undefined): Promise<TypeResult>;
48
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,OAAO,EACR,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE7F,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMvE;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,CAWzE;AASD,8DAA8D;AAC9D,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAUrG;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6B7G;AAED,mCAAmC;AACnC,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,WAAW,CAAC,SAAS,CAAC,CAMxB;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAkF1F;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAC/C,aAAa,EAAE,MAAM,GACpB,eAAe,CAKjB;AAED,0CAA0C;AAC1C,wBAAsB,SAAS,CAC7B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAC/C,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Probe runner — classifies each ADT type against four independent signals:
3
+ *
4
+ * 1. Discovery map presence (free; from the already-fetched /discovery doc)
5
+ * 2. Collection-URL GET (tolerates 400/403/405 as "endpoint exists" — the
6
+ * #94/#95 lesson: only 404 is a hard negative)
7
+ * 3. Known-object GET on an SAP-shipped fixture (authoritative when available)
8
+ * 4. SAP_BASIS release vs. a hand-curated floor (weak tie-breaker only)
9
+ *
10
+ * The runner is deliberately pure: it takes a simple `HttpProbeFn` that never
11
+ * throws and returns a neutral shape. This makes it trivially testable by
12
+ * replaying recorded SAP responses from fixtures.
13
+ */
14
+ import { buildObjectUrl } from './catalog.js';
15
+ /** Parse SAP_BASIS release string like "750", "7.57", "sap_btp" to a number, or null. */
16
+ export function parseRelease(release) {
17
+ if (!release)
18
+ return null;
19
+ const digits = release.replace(/\D/g, '');
20
+ if (!digits)
21
+ return null;
22
+ const n = Number.parseInt(digits, 10);
23
+ return Number.isFinite(n) && n > 0 ? n : null;
24
+ }
25
+ /** Classify an HTTP response code into a discrete bucket. */
26
+ export function classifyHttp(result) {
27
+ if (result.networkError)
28
+ return 'network-error';
29
+ const s = result.statusCode;
30
+ if (s === undefined)
31
+ return 'network-error';
32
+ if (s >= 200 && s < 300)
33
+ return 'ok-2xx';
34
+ if (s === 400)
35
+ return 'ok-400-bad-params';
36
+ if (s === 401 || s === 403)
37
+ return 'auth-blocked';
38
+ if (s === 404)
39
+ return 'not-found';
40
+ if (s === 405)
41
+ return 'ok-405-method';
42
+ if (s >= 500 && s < 600)
43
+ return 'server-error';
44
+ return 'other-error';
45
+ }
46
+ /** Truncate an HTTP body for inclusion in reports; strips whitespace. */
47
+ function snippet(body) {
48
+ if (!body)
49
+ return undefined;
50
+ const trimmed = body.replace(/\s+/g, ' ').trim();
51
+ return trimmed.length > 200 ? `${trimmed.slice(0, 200)}…` : trimmed;
52
+ }
53
+ /** Run the collection-URL probe. Normalized, never throws. */
54
+ export async function probeCollection(fetchFn, collectionUrl) {
55
+ const res = await fetchFn(collectionUrl, 'GET');
56
+ return {
57
+ url: collectionUrl,
58
+ classification: classifyHttp(res),
59
+ statusCode: res.statusCode,
60
+ errorMessage: res.errorMessage,
61
+ bodySnippet: snippet(res.body),
62
+ durationMs: res.durationMs,
63
+ };
64
+ }
65
+ /**
66
+ * Try each known object in order and classify the outcome.
67
+ * We stop at the first 2xx; if all fail, we aggregate the attempted list.
68
+ */
69
+ export async function probeKnownObject(fetchFn, entry) {
70
+ const list = entry.knownObjects ?? [];
71
+ if (list.length === 0 || !entry.objectUrlTemplate)
72
+ return { kind: 'not-tested' };
73
+ const attempted = [];
74
+ let sawAuthBlock = false;
75
+ let lastError;
76
+ for (const name of list) {
77
+ attempted.push(name);
78
+ const url = buildObjectUrl(entry.objectUrlTemplate, name);
79
+ const res = await fetchFn(url, 'GET');
80
+ const klass = classifyHttp(res);
81
+ if (klass === 'ok-2xx') {
82
+ return { kind: 'ok', objectName: name, statusCode: res.statusCode ?? 200 };
83
+ }
84
+ if (klass === 'auth-blocked')
85
+ sawAuthBlock = true;
86
+ if (klass === 'network-error') {
87
+ lastError = res.errorMessage ?? 'network error';
88
+ }
89
+ if (klass === 'server-error' || klass === 'other-error') {
90
+ lastError = `HTTP ${res.statusCode}`;
91
+ }
92
+ // 404 is expected for objects that don't exist on this system — keep trying.
93
+ }
94
+ if (lastError)
95
+ return { kind: 'error', attempted, message: lastError };
96
+ if (sawAuthBlock)
97
+ return { kind: 'auth-blocked', attempted };
98
+ return { kind: 'all-missing', attempted };
99
+ }
100
+ /** Classify the release signal. */
101
+ export function classifyRelease(detectedRelease, floor) {
102
+ const detected = parseRelease(detectedRelease);
103
+ if (detected === null)
104
+ return { kind: 'unknown', floor };
105
+ if (floor === undefined)
106
+ return { kind: 'ok', detected: detectedRelease ?? '', floor: 0 };
107
+ if (detected < floor)
108
+ return { kind: 'below-floor', detected: detectedRelease ?? '', floor };
109
+ return { kind: 'ok', detected: detectedRelease ?? '', floor };
110
+ }
111
+ /** Collapse the four signals into a final verdict + one-line reason. */
112
+ export function classifyVerdict(signals) {
113
+ const { discovery, collection, knownObject, release } = signals;
114
+ // Rule 1 — known-object is authoritative.
115
+ if (knownObject.kind === 'ok') {
116
+ const discoHint = discovery === 'discovered'
117
+ ? 'discovery confirms'
118
+ : discovery === 'not-discovered'
119
+ ? 'but discovery map did NOT list the collection (discovery incomplete?)'
120
+ : 'no discovery map available';
121
+ return {
122
+ verdict: 'available-high',
123
+ reason: `known-object read of "${knownObject.objectName}" returned 200; ${discoHint}`,
124
+ };
125
+ }
126
+ // Rule 2 — unanimous auth blocking.
127
+ if (collection.classification === 'auth-blocked' && knownObject.kind === 'auth-blocked') {
128
+ return {
129
+ verdict: 'auth-blocked',
130
+ reason: `collection and known-object both returned 401/403 — endpoint exists, probe user lacks rights`,
131
+ };
132
+ }
133
+ // Rule 3 — collection 404 paths (the real "not available" signal).
134
+ if (collection.classification === 'not-found') {
135
+ if (discovery === 'discovered') {
136
+ return {
137
+ verdict: 'ambiguous',
138
+ reason: `discovery lists this collection but GET returned 404 — endpoint registered but inactive?`,
139
+ };
140
+ }
141
+ const discoNegative = discovery === 'not-discovered';
142
+ const knownNegative = knownObject.kind === 'all-missing' || knownObject.kind === 'not-tested';
143
+ const releaseNegative = release.kind === 'below-floor';
144
+ if (discoNegative && knownNegative && releaseNegative) {
145
+ return {
146
+ verdict: 'unavailable-high',
147
+ reason: `discovery miss + collection 404 + release ${release.detected}<${release.floor} — high confidence`,
148
+ };
149
+ }
150
+ return {
151
+ verdict: 'unavailable-likely',
152
+ reason: `collection returned 404${discoNegative ? ' and not in discovery map' : ''}`,
153
+ };
154
+ }
155
+ // Rule 4 — collection responded in a way that suggests the endpoint exists.
156
+ const okBuckets = ['ok-2xx', 'ok-400-bad-params', 'ok-405-method'];
157
+ if (okBuckets.includes(collection.classification)) {
158
+ if (knownObject.kind === 'all-missing') {
159
+ return {
160
+ verdict: discovery === 'discovered' ? 'available-high' : 'available-medium',
161
+ reason: `collection HTTP ${collection.statusCode}; known-object candidates not present on this system`,
162
+ };
163
+ }
164
+ if (discovery === 'discovered') {
165
+ return {
166
+ verdict: 'available-high',
167
+ reason: `discovered + collection HTTP ${collection.statusCode}`,
168
+ };
169
+ }
170
+ return {
171
+ verdict: 'available-medium',
172
+ reason: `collection HTTP ${collection.statusCode} but not in discovery map`,
173
+ };
174
+ }
175
+ // Rule 5 — auth-blocked with weaker corroboration.
176
+ if (collection.classification === 'auth-blocked') {
177
+ return {
178
+ verdict: 'auth-blocked',
179
+ reason: `collection returned 401/403 — endpoint likely exists but probe user lacks rights`,
180
+ };
181
+ }
182
+ // Rule 6 — anything else (5xx, network errors, unexpected codes).
183
+ return {
184
+ verdict: 'ambiguous',
185
+ reason: `collection returned ${collection.classification}${collection.statusCode ? ` (${collection.statusCode})` : ''}; cannot decide`,
186
+ };
187
+ }
188
+ /** Compute a discovery-map lookup for a collection URL. */
189
+ export function resolveDiscovery(discoveryMap, collectionUrl) {
190
+ if (!discoveryMap || discoveryMap.size === 0)
191
+ return 'no-discovery-map';
192
+ // Discovery keys are normalized with no trailing slash; catalog URLs follow the same convention.
193
+ const normalized = collectionUrl.endsWith('/') ? collectionUrl.slice(0, -1) : collectionUrl;
194
+ return discoveryMap.has(normalized) ? 'discovered' : 'not-discovered';
195
+ }
196
+ /** Probe one catalog entry end-to-end. */
197
+ export async function probeType(fetchFn, entry, discoveryMap, detectedRelease) {
198
+ const [collection, knownObject] = await Promise.all([
199
+ probeCollection(fetchFn, entry.collectionUrl),
200
+ probeKnownObject(fetchFn, entry),
201
+ ]);
202
+ const signals = {
203
+ discovery: resolveDiscovery(discoveryMap, entry.collectionUrl),
204
+ collection,
205
+ knownObject,
206
+ release: classifyRelease(detectedRelease, entry.minRelease),
207
+ };
208
+ const { verdict, reason } = classifyVerdict(signals);
209
+ return { type: entry.type, signals, verdict, reason };
210
+ }
211
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/probe/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyB9C,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,OAA2B;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,eAAe,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAClD,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IAClC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC;IACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC;IAC/C,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,yEAAyE;AACzE,SAAS,OAAO,CAAC,IAAwB;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACtE,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAoB,EAAE,aAAqB;IAC/E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO;QACL,GAAG,EAAE,aAAa;QAClB,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC;QACjC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAoB,EAAE,KAAmB;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAEjF,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,SAA6B,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,IAAI,KAAK,KAAK,cAAc;YAAE,YAAY,GAAG,IAAI,CAAC;QAClD,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YAC9B,SAAS,GAAG,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YACxD,SAAS,GAAG,QAAQ,GAAG,CAAC,UAAU,EAAE,CAAC;QACvC,CAAC;QACD,6EAA6E;IAC/E,CAAC;IAED,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACvE,IAAI,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;IAC7D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,eAAe,CAC7B,eAAmC,EACnC,KAAyB;IAEzB,MAAM,QAAQ,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC1F,IAAI,QAAQ,GAAG,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEhE,0CAA0C;IAC1C,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GACb,SAAS,KAAK,YAAY;YACxB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,SAAS,KAAK,gBAAgB;gBAC9B,CAAC,CAAC,uEAAuE;gBACzE,CAAC,CAAC,4BAA4B,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,yBAAyB,WAAW,CAAC,UAAU,mBAAmB,SAAS,EAAE;SACtF,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,CAAC,cAAc,KAAK,cAAc,IAAI,WAAW,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACxF,OAAO;YACL,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,8FAA8F;SACvG,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,IAAI,UAAU,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;QAC9C,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,0FAA0F;aACnG,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,SAAS,KAAK,gBAAgB,CAAC;QACrD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,KAAK,aAAa,IAAI,WAAW,CAAC,IAAI,KAAK,YAAY,CAAC;QAC9F,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC;QACvD,IAAI,aAAa,IAAI,aAAa,IAAI,eAAe,EAAE,CAAC;YACtD,OAAO;gBACL,OAAO,EAAE,kBAAkB;gBAC3B,MAAM,EAAE,6CAA6C,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,oBAAoB;aAC3G,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,oBAAoB;YAC7B,MAAM,EAAE,0BAA0B,aAAa,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE;SACrF,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,SAAS,GAAyB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,eAAe,CAAC,CAAC;IACzF,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB;gBAC3E,MAAM,EAAE,mBAAmB,UAAU,CAAC,UAAU,sDAAsD;aACvG,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,gCAAgC,UAAU,CAAC,UAAU,EAAE;aAChE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,mBAAmB,UAAU,CAAC,UAAU,2BAA2B;SAC5E,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,IAAI,UAAU,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,kFAAkF;SAC3F,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,uBAAuB,UAAU,CAAC,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,iBAAiB;KACvI,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAC9B,YAA+C,EAC/C,aAAqB;IAErB,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACxE,iGAAiG;IACjG,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC5F,OAAO,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACxE,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAoB,EACpB,KAAmB,EACnB,YAA+C,EAC/C,eAAmC;IAEnC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC;QAC7C,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;KACjC,CAAC,CAAC;IACH,MAAM,OAAO,GAAgB;QAC3B,SAAS,EAAE,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC;QAC9D,UAAU;QACV,WAAW;QACX,OAAO,EAAE,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC;KAC5D,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Types for the ADT type-availability probe.
3
+ *
4
+ * The probe is pure diagnostic tooling — it does not change product behavior.
5
+ * It collects multiple independent signals per ADT object type and reports
6
+ * both the per-type verdict AND the quality-of-probe metrics, so anyone
7
+ * running it against their own system can see not just "is TABL supported"
8
+ * but "how confident should we be in that answer".
9
+ */
10
+ /** SAPREAD/SAPWrite type code (TABL, BDEF, DDLS, …). */
11
+ export type TypeCode = string;
12
+ /** A catalog entry for one ADT object type. */
13
+ export interface CatalogEntry {
14
+ /** 4-letter type code used in SAPRead/SAPWrite. */
15
+ type: TypeCode;
16
+ /** Canonical collection URL (e.g. "/sap/bc/adt/ddic/tables"). */
17
+ collectionUrl: string;
18
+ /**
19
+ * Object-level URL template, where `{name}` is the encoded object name.
20
+ * Used for the known-object probe. If absent, that signal is NOT_TESTED.
21
+ */
22
+ objectUrlTemplate?: string;
23
+ /**
24
+ * SAP-shipped objects that should exist on (almost) every system for this type.
25
+ * The probe tries each until one returns 200 (or it exhausts the list).
26
+ * Leave empty for types where no widely-shipped object exists (BDEF, SRVD, …).
27
+ */
28
+ knownObjects?: string[];
29
+ /**
30
+ * Minimum SAP_BASIS release where this type's endpoint is expected to exist.
31
+ * Used only as a weak signal; release strings vary (BTP reports differently).
32
+ * Encoded as the 3-digit release number (750, 752, 757, …).
33
+ */
34
+ minRelease?: number;
35
+ /** Freeform note shown in the report (e.g. "RAP BDEF — needs SAP_BASIS >= 7.57"). */
36
+ note?: string;
37
+ }
38
+ /** Result of the discovery-map lookup for a single type. */
39
+ export type DiscoverySignal = 'discovered' | 'not-discovered' | 'no-discovery-map';
40
+ /** Status classification for a single HTTP probe. */
41
+ export type HttpClassification = 'ok-2xx' | 'ok-400-bad-params' | 'ok-405-method' | 'auth-blocked' | 'not-found' | 'server-error' | 'other-error' | 'network-error';
42
+ /** Single HTTP probe result. */
43
+ export interface HttpProbe {
44
+ url: string;
45
+ classification: HttpClassification;
46
+ statusCode?: number;
47
+ /** Raw error message if the call threw without an HTTP response. */
48
+ errorMessage?: string;
49
+ /** First ~200 chars of the response body, for human review. */
50
+ bodySnippet?: string;
51
+ durationMs: number;
52
+ }
53
+ /** Outcome of the known-object probe. */
54
+ export type KnownObjectOutcome = {
55
+ kind: 'ok';
56
+ objectName: string;
57
+ statusCode: number;
58
+ } | {
59
+ kind: 'all-missing';
60
+ attempted: string[];
61
+ } | {
62
+ kind: 'auth-blocked';
63
+ attempted: string[];
64
+ } | {
65
+ kind: 'error';
66
+ attempted: string[];
67
+ message: string;
68
+ } | {
69
+ kind: 'not-tested';
70
+ };
71
+ /** Four independent signals combined per type. */
72
+ export interface TypeSignals {
73
+ discovery: DiscoverySignal;
74
+ collection: HttpProbe;
75
+ knownObject: KnownObjectOutcome;
76
+ release: {
77
+ kind: 'ok';
78
+ detected: string;
79
+ floor: number;
80
+ } | {
81
+ kind: 'below-floor';
82
+ detected: string;
83
+ floor: number;
84
+ } | {
85
+ kind: 'unknown';
86
+ floor?: number;
87
+ };
88
+ }
89
+ /** Final verdict the probe reports for a type. */
90
+ export type Verdict = 'available-high' | 'available-medium' | 'unavailable-high' | 'unavailable-likely' | 'auth-blocked' | 'ambiguous';
91
+ /** Per-type probe result. */
92
+ export interface TypeResult {
93
+ type: TypeCode;
94
+ signals: TypeSignals;
95
+ verdict: Verdict;
96
+ /** Human-readable one-liner explaining which signals drove the verdict. */
97
+ reason: string;
98
+ }
99
+ /**
100
+ * One installed software component as reported by /sap/bc/adt/system/components.
101
+ * Captured so future readers of a fixture can tell a plain NW 7.58 apart from
102
+ * an S/4HANA 2023 — SAP_BASIS alone is not enough signal.
103
+ */
104
+ export interface InstalledProduct {
105
+ /** Component id (e.g. "SAP_BASIS", "S4FND"). */
106
+ name: string;
107
+ /** Numeric release (e.g. "758", "108"). */
108
+ release: string;
109
+ /** Support package level (e.g. "0002"), if reported. */
110
+ spLevel?: string;
111
+ /** Human-readable description (e.g. "SAP Basis Component"). */
112
+ description?: string;
113
+ }
114
+ /** System-level info the probe captures for context. */
115
+ export interface ProbedSystem {
116
+ baseUrl: string;
117
+ client?: string;
118
+ abapRelease?: string;
119
+ systemType?: 'onprem' | 'btp' | 'unknown';
120
+ /** Full component list from /sap/bc/adt/system/components when available. */
121
+ products?: InstalledProduct[];
122
+ discoveryMapSize: number;
123
+ probedAt: string;
124
+ }
125
+ /** Aggregated quality metrics across all types — "how good is the probe itself". */
126
+ export interface QualityMetrics {
127
+ /** Fraction of types for which each signal returned a definitive answer. */
128
+ coverage: {
129
+ discovery: number;
130
+ collection: number;
131
+ knownObject: number;
132
+ release: number;
133
+ };
134
+ /**
135
+ * Of the types that tested positive via the authoritative known-object signal,
136
+ * what fraction were also present in the discovery map?
137
+ * Low number = the discovery map is unreliable for this release; deweight it.
138
+ */
139
+ discoveryAccuracyVsKnownObject: number | null;
140
+ /** Count of verdicts per bucket. */
141
+ verdictHistogram: Record<Verdict, number>;
142
+ /** Types flagged ambiguous — the danger zone where signals disagree. */
143
+ ambiguousTypes: TypeCode[];
144
+ /** Types for which no known-object fixture was listed in the catalog (probe blind spot). */
145
+ uncoveredByKnownObject: TypeCode[];
146
+ }
147
+ /** Full probe report, serializable to JSON for sharing. */
148
+ export interface ProbeReport {
149
+ /** Metadata so anyone reading the JSON can compare their run against others. */
150
+ system: ProbedSystem;
151
+ results: TypeResult[];
152
+ quality: QualityMetrics;
153
+ /**
154
+ * Schema version for the report file. Bump when the shape changes so
155
+ * replay tests can refuse to load incompatible fixtures.
156
+ */
157
+ schemaVersion: 1;
158
+ }
159
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/probe/types.ts"],"names":[],"mappings":"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"}