arc-1 1.4.0 → 1.5.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 (235) hide show
  1. package/dist/adt/abapgit.d.ts.map +1 -1
  2. package/dist/adt/abapgit.js +64 -7
  3. package/dist/adt/abapgit.js.map +1 -1
  4. package/dist/adt/aunit.js +4 -4
  5. package/dist/adt/aunit.js.map +1 -1
  6. package/dist/adt/class-structure.d.ts +4 -2
  7. package/dist/adt/class-structure.d.ts.map +1 -1
  8. package/dist/adt/class-structure.js +18 -9
  9. package/dist/adt/class-structure.js.map +1 -1
  10. package/dist/adt/client.d.ts +18 -52
  11. package/dist/adt/client.d.ts.map +1 -1
  12. package/dist/adt/client.js +69 -92
  13. package/dist/adt/client.js.map +1 -1
  14. package/dist/adt/config.d.ts +5 -0
  15. package/dist/adt/config.d.ts.map +1 -1
  16. package/dist/adt/config.js.map +1 -1
  17. package/dist/adt/crud.d.ts +3 -3
  18. package/dist/adt/crud.d.ts.map +1 -1
  19. package/dist/adt/crud.js +21 -6
  20. package/dist/adt/crud.js.map +1 -1
  21. package/dist/adt/data-source-policy.d.ts +20 -8
  22. package/dist/adt/data-source-policy.d.ts.map +1 -1
  23. package/dist/adt/data-source-policy.js +55 -109
  24. package/dist/adt/data-source-policy.js.map +1 -1
  25. package/dist/adt/ddic-xml.d.ts +9 -0
  26. package/dist/adt/ddic-xml.d.ts.map +1 -1
  27. package/dist/adt/ddic-xml.js +17 -3
  28. package/dist/adt/ddic-xml.js.map +1 -1
  29. package/dist/adt/devtools.js +3 -3
  30. package/dist/adt/devtools.js.map +1 -1
  31. package/dist/adt/diagnostics.js +4 -4
  32. package/dist/adt/diagnostics.js.map +1 -1
  33. package/dist/adt/enhancements.d.ts +7 -0
  34. package/dist/adt/enhancements.d.ts.map +1 -0
  35. package/dist/adt/enhancements.js +89 -0
  36. package/dist/adt/enhancements.js.map +1 -0
  37. package/dist/adt/errors.d.ts +19 -10
  38. package/dist/adt/errors.d.ts.map +1 -1
  39. package/dist/adt/errors.js +73 -53
  40. package/dist/adt/errors.js.map +1 -1
  41. package/dist/adt/fm-signature.d.ts +1 -1
  42. package/dist/adt/fm-signature.d.ts.map +1 -1
  43. package/dist/adt/fm-signature.js +9 -1
  44. package/dist/adt/fm-signature.js.map +1 -1
  45. package/dist/adt/http.d.ts +7 -27
  46. package/dist/adt/http.d.ts.map +1 -1
  47. package/dist/adt/http.js +23 -28
  48. package/dist/adt/http.js.map +1 -1
  49. package/dist/adt/internal-data-operations.d.ts +3 -2
  50. package/dist/adt/internal-data-operations.d.ts.map +1 -1
  51. package/dist/adt/internal-data-operations.js +8 -1
  52. package/dist/adt/internal-data-operations.js.map +1 -1
  53. package/dist/adt/lock-object.d.ts +92 -0
  54. package/dist/adt/lock-object.d.ts.map +1 -0
  55. package/dist/adt/lock-object.js +195 -0
  56. package/dist/adt/lock-object.js.map +1 -0
  57. package/dist/adt/rap-generate.d.ts +5 -1
  58. package/dist/adt/rap-generate.d.ts.map +1 -1
  59. package/dist/adt/rap-generate.js +112 -100
  60. package/dist/adt/rap-generate.js.map +1 -1
  61. package/dist/adt/server-driven.d.ts +42 -10
  62. package/dist/adt/server-driven.d.ts.map +1 -1
  63. package/dist/adt/server-driven.js +98 -18
  64. package/dist/adt/server-driven.js.map +1 -1
  65. package/dist/adt/source-precondition.d.ts +3 -0
  66. package/dist/adt/source-precondition.d.ts.map +1 -0
  67. package/dist/adt/source-precondition.js +12 -0
  68. package/dist/adt/source-precondition.js.map +1 -0
  69. package/dist/adt/text-search.js +5 -5
  70. package/dist/adt/text-search.js.map +1 -1
  71. package/dist/adt/transport.js +3 -3
  72. package/dist/adt/transport.js.map +1 -1
  73. package/dist/adt/types.d.ts +19 -1
  74. package/dist/adt/types.d.ts.map +1 -1
  75. package/dist/adt/user-agent.d.ts +4 -0
  76. package/dist/adt/user-agent.d.ts.map +1 -0
  77. package/dist/adt/user-agent.js +11 -0
  78. package/dist/adt/user-agent.js.map +1 -0
  79. package/dist/adt/xml-entities.d.ts +3 -0
  80. package/dist/adt/xml-entities.d.ts.map +1 -0
  81. package/dist/adt/xml-entities.js +19 -0
  82. package/dist/adt/xml-entities.js.map +1 -0
  83. package/dist/adt/xml-parser.d.ts +7 -30
  84. package/dist/adt/xml-parser.d.ts.map +1 -1
  85. package/dist/adt/xml-parser.js +25 -54
  86. package/dist/adt/xml-parser.js.map +1 -1
  87. package/dist/authz/policy.d.ts.map +1 -1
  88. package/dist/authz/policy.js +2 -0
  89. package/dist/authz/policy.js.map +1 -1
  90. package/dist/cache/caching-layer.d.ts.map +1 -1
  91. package/dist/cache/caching-layer.js +5 -10
  92. package/dist/cache/caching-layer.js.map +1 -1
  93. package/dist/cli.js +1 -1
  94. package/dist/cli.js.map +1 -1
  95. package/dist/context/grep.d.ts +14 -0
  96. package/dist/context/grep.d.ts.map +1 -1
  97. package/dist/context/grep.js +49 -0
  98. package/dist/context/grep.js.map +1 -1
  99. package/dist/context/unit-surgery.d.ts +3 -1
  100. package/dist/context/unit-surgery.d.ts.map +1 -1
  101. package/dist/context/unit-surgery.js +52 -5
  102. package/dist/context/unit-surgery.js.map +1 -1
  103. package/dist/handlers/activate.d.ts.map +1 -1
  104. package/dist/handlers/activate.js +7 -20
  105. package/dist/handlers/activate.js.map +1 -1
  106. package/dist/handlers/diagnose.d.ts.map +1 -1
  107. package/dist/handlers/diagnose.js +8 -29
  108. package/dist/handlers/diagnose.js.map +1 -1
  109. package/dist/handlers/dispatch.d.ts.map +1 -1
  110. package/dist/handlers/dispatch.js +20 -4
  111. package/dist/handlers/dispatch.js.map +1 -1
  112. package/dist/handlers/editable-source.d.ts +6 -0
  113. package/dist/handlers/editable-source.d.ts.map +1 -0
  114. package/dist/handlers/editable-source.js +53 -0
  115. package/dist/handlers/editable-source.js.map +1 -0
  116. package/dist/handlers/feature-cache.d.ts +2 -0
  117. package/dist/handlers/feature-cache.d.ts.map +1 -1
  118. package/dist/handlers/feature-cache.js +8 -0
  119. package/dist/handlers/feature-cache.js.map +1 -1
  120. package/dist/handlers/hyperfocused.js +1 -1
  121. package/dist/handlers/hyperfocused.js.map +1 -1
  122. package/dist/handlers/lint.js +1 -1
  123. package/dist/handlers/lint.js.map +1 -1
  124. package/dist/handlers/object-types.d.ts +2 -3
  125. package/dist/handlers/object-types.d.ts.map +1 -1
  126. package/dist/handlers/object-types.js +13 -5
  127. package/dist/handlers/object-types.js.map +1 -1
  128. package/dist/handlers/read.d.ts.map +1 -1
  129. package/dist/handlers/read.js +38 -7
  130. package/dist/handlers/read.js.map +1 -1
  131. package/dist/handlers/schemas.d.ts +39 -0
  132. package/dist/handlers/schemas.d.ts.map +1 -1
  133. package/dist/handlers/schemas.js +50 -7
  134. package/dist/handlers/schemas.js.map +1 -1
  135. package/dist/handlers/syntax.d.ts +5 -0
  136. package/dist/handlers/syntax.d.ts.map +1 -0
  137. package/dist/handlers/syntax.js +35 -0
  138. package/dist/handlers/syntax.js.map +1 -0
  139. package/dist/handlers/tool-descriptions.d.ts.map +1 -1
  140. package/dist/handlers/tool-descriptions.js +7 -5
  141. package/dist/handlers/tool-descriptions.js.map +1 -1
  142. package/dist/handlers/tool-registry.d.ts +4 -4
  143. package/dist/handlers/tool-registry.d.ts.map +1 -1
  144. package/dist/handlers/tool-registry.js +4 -0
  145. package/dist/handlers/tool-registry.js.map +1 -1
  146. package/dist/handlers/tools.d.ts +1 -16
  147. package/dist/handlers/tools.d.ts.map +1 -1
  148. package/dist/handlers/tools.js +40 -51
  149. package/dist/handlers/tools.js.map +1 -1
  150. package/dist/handlers/transport.d.ts.map +1 -1
  151. package/dist/handlers/transport.js +17 -3
  152. package/dist/handlers/transport.js.map +1 -1
  153. package/dist/handlers/where-used.d.ts.map +1 -1
  154. package/dist/handlers/where-used.js +0 -5
  155. package/dist/handlers/where-used.js.map +1 -1
  156. package/dist/handlers/write/class-edit.d.ts +16 -0
  157. package/dist/handlers/write/class-edit.d.ts.map +1 -0
  158. package/dist/handlers/write/class-edit.js +55 -0
  159. package/dist/handlers/write/class-edit.js.map +1 -0
  160. package/dist/handlers/write/class-surgery.d.ts +2 -2
  161. package/dist/handlers/write/class-surgery.d.ts.map +1 -1
  162. package/dist/handlers/write/class-surgery.js +189 -220
  163. package/dist/handlers/write/class-surgery.js.map +1 -1
  164. package/dist/handlers/write/context.d.ts +1 -8
  165. package/dist/handlers/write/context.d.ts.map +1 -1
  166. package/dist/handlers/write/create.d.ts.map +1 -1
  167. package/dist/handlers/write/create.js +11 -4
  168. package/dist/handlers/write/create.js.map +1 -1
  169. package/dist/handlers/write/metadata-update.d.ts +4 -0
  170. package/dist/handlers/write/metadata-update.d.ts.map +1 -0
  171. package/dist/handlers/write/metadata-update.js +58 -0
  172. package/dist/handlers/write/metadata-update.js.map +1 -0
  173. package/dist/handlers/write/rap.d.ts.map +1 -1
  174. package/dist/handlers/write/rap.js +132 -155
  175. package/dist/handlers/write/rap.js.map +1 -1
  176. package/dist/handlers/write/unit-surgery.d.ts +2 -2
  177. package/dist/handlers/write/unit-surgery.d.ts.map +1 -1
  178. package/dist/handlers/write/unit-surgery.js +14 -8
  179. package/dist/handlers/write/unit-surgery.js.map +1 -1
  180. package/dist/handlers/write/update-delete.d.ts.map +1 -1
  181. package/dist/handlers/write/update-delete.js +34 -82
  182. package/dist/handlers/write/update-delete.js.map +1 -1
  183. package/dist/handlers/write-helpers.d.ts +3 -2
  184. package/dist/handlers/write-helpers.d.ts.map +1 -1
  185. package/dist/handlers/write-helpers.js +118 -15
  186. package/dist/handlers/write-helpers.js.map +1 -1
  187. package/dist/handlers/write.d.ts.map +1 -1
  188. package/dist/handlers/write.js +12 -27
  189. package/dist/handlers/write.js.map +1 -1
  190. package/dist/public/read-only-client.d.ts +6 -0
  191. package/dist/public/read-only-client.d.ts.map +1 -0
  192. package/dist/public/read-only-client.js +66 -0
  193. package/dist/public/read-only-client.js.map +1 -0
  194. package/dist/public/types.d.ts +2 -13
  195. package/dist/public/types.d.ts.map +1 -1
  196. package/dist/server/audit.d.ts +6 -1
  197. package/dist/server/audit.d.ts.map +1 -1
  198. package/dist/server/audit.js.map +1 -1
  199. package/dist/server/config.d.ts.map +1 -1
  200. package/dist/server/config.js +3 -0
  201. package/dist/server/config.js.map +1 -1
  202. package/dist/server/deny-actions.d.ts +2 -1
  203. package/dist/server/deny-actions.d.ts.map +1 -1
  204. package/dist/server/deny-actions.js +13 -2
  205. package/dist/server/deny-actions.js.map +1 -1
  206. package/dist/server/logger.d.ts +3 -3
  207. package/dist/server/logger.d.ts.map +1 -1
  208. package/dist/server/logger.js +7 -7
  209. package/dist/server/logger.js.map +1 -1
  210. package/dist/server/multi-target-basic-auth.d.ts.map +1 -1
  211. package/dist/server/multi-target-basic-auth.js +1 -0
  212. package/dist/server/multi-target-basic-auth.js.map +1 -1
  213. package/dist/server/multi-target-runtime.d.ts.map +1 -1
  214. package/dist/server/multi-target-runtime.js +1 -0
  215. package/dist/server/multi-target-runtime.js.map +1 -1
  216. package/dist/server/plugin-loader.d.ts.map +1 -1
  217. package/dist/server/plugin-loader.js +1 -3
  218. package/dist/server/plugin-loader.js.map +1 -1
  219. package/dist/server/safe-http-client.d.ts +6 -12
  220. package/dist/server/safe-http-client.d.ts.map +1 -1
  221. package/dist/server/safe-http-client.js +28 -63
  222. package/dist/server/safe-http-client.js.map +1 -1
  223. package/dist/server/server.d.ts +5 -4
  224. package/dist/server/server.d.ts.map +1 -1
  225. package/dist/server/server.js +30 -23
  226. package/dist/server/server.js.map +1 -1
  227. package/dist/server/types.d.ts +1 -0
  228. package/dist/server/types.d.ts.map +1 -1
  229. package/dist/server/types.js +2 -0
  230. package/dist/server/types.js.map +1 -1
  231. package/dist/version.d.ts +3 -0
  232. package/dist/version.d.ts.map +1 -0
  233. package/dist/version.js +3 -0
  234. package/dist/version.js.map +1 -0
  235. package/package.json +7 -7
@@ -2,15 +2,15 @@
2
2
  * SAPWrite actions — update + delete.
3
3
  */
4
4
  import { isTextElementObjectType, TEXT_ELEMENT_OBJECT_TYPES, TEXT_ELEMENT_PARTS, } from '../../adt/client.js';
5
- import { deleteObject, lockObject, safeUpdateClassInclude, safeUpdateObject, safeUpdateSource, unlockObject, } from '../../adt/crud.js';
6
- import { formatKtdWriteReport, rewriteKtdDocument, } from '../../adt/ddic-xml.js';
5
+ import { deleteObject, lockObject, safeUpdateClassInclude, safeUpdateSource, unlockObject } from '../../adt/crud.js';
7
6
  import { AdtApiError } from '../../adt/errors.js';
8
7
  import { spliceFmSignature } from '../../adt/fm-signature.js';
9
8
  import { buildCdsDeleteDependencyHint, buildCdsUpdateCrudHint, CDS_DEPENDENCY_SENSITIVE_TYPES, guardCdsSyntax, } from '../cds-hints.js';
10
9
  import { getCachedFeatures } from '../feature-cache.js';
11
10
  import { CLASS_WRITE_INCLUDES, canonicalTablType, classIncludeUrl } from '../object-types.js';
12
11
  import { errorResult, textResult } from '../shared.js';
13
- import { buildCreateXml, getMetadataWriteProperties, isMetadataWriteType, mergeMetadataWriteProperties, mergePreWriteWarnings, resolveWriteSystemType, runPreWriteLint, runPreWriteSyntaxCheck, runRapPreflightValidation, SKTD_V2_CONTENT_TYPE, stripFmParamCommentBlock, vendorContentTypeForType, } from '../write-helpers.js';
12
+ import { isMetadataWriteType, mergePreWriteWarnings, runPreWriteLint, runPreWriteSyntaxCheck, runRapPreflightValidation, stripFmParamCommentBlock, } from '../write-helpers.js';
13
+ import { writeMetadataUpdate } from './metadata-update.js';
14
14
  function isDeleteDependencyError(err) {
15
15
  const clean = AdtApiError.extractCleanMessage(err.responseBody ?? err.message).toLowerCase();
16
16
  const body = (err.responseBody ?? '').toLowerCase();
@@ -39,54 +39,13 @@ export async function writeActionUpdate(ctx) {
39
39
  // the testclasses (CCAU) include is absent — a content PUT alone fails
40
40
  // with HTTP 500 "…CCAU does not have any inactive version". safeUpdateClassInclude
41
41
  // probes the include and POST-creates it (under the same lock) before the PUT.
42
- const { initialized } = await safeUpdateClassInclude(client.http, client.safety, objectUrl, classIncludeUrl(name, include), source, transport, getCachedFeatures()?.abapRelease);
42
+ const { initialized } = await safeUpdateClassInclude(client.http, client.safety, objectUrl, classIncludeUrl(name, include), source, transport, getCachedFeatures()?.abapRelease, args.expectedSourceHash);
43
43
  invalidateWrittenObject(type, name);
44
44
  const initNote = initialized ? ` (initialised the ${include} include first)` : '';
45
45
  return textResult(`Successfully updated ${type} ${name} include ${include}${initNote}. Active version remains unchanged until activation; read with SAPRead(version="inactive") to verify the draft.`);
46
46
  }
47
- if (type === 'SKTD') {
48
- // KTD update requires the full <sktd:docu> XML envelope with the Markdown
49
- // body base64-encoded inside <sktd:text>, PUT with
50
- // `application/vnd.sap.adt.sktdv2+xml`. PUTting raw text/plain silently
51
- // no-ops (or 415s on strict systems). Fetch the current envelope,
52
- // replace only the <sktd:text> body, and PUT it back — preserves
53
- // responsible/masterLanguage/packageRef/refObject metadata.
54
- //
55
- // Deliberately no `version`: ADT's default view already carries the pending
56
- // inactive draft, so consecutive node writes without an activation in between
57
- // accumulate instead of reverting to the active version (live-verified
58
- // 2026-09-02). SAPRead defaults to "active", so its node list can lag this one;
59
- // every refusal raised below lists the ids of the envelope it actually merged.
60
- const { source: currentEnvelope } = await client.getKtd(name);
61
- const report = { proseHeadings: [] };
62
- const body = rewriteKtdDocument(currentEnvelope, hasSource ? source : undefined, args.shortTexts, report);
63
- // Report both changed nodes and headings retained as prose so a new body exposes its routing.
64
- const summary = formatKtdWriteReport(currentEnvelope, body, report, args.dryRun === true);
65
- // A KTD update is a merge: only the addressed nodes change. dryRun runs the identical
66
- // validation and reports the outcome without the PUT, so a 90-node edit can be checked
67
- // before it touches SAP.
68
- if (args.dryRun === true) {
69
- return textResult(`Dry run for ${type} ${name} — nothing was written.\n${summary}`);
70
- }
71
- await safeUpdateObject(client.http, client.safety, objectUrl, body, SKTD_V2_CONTENT_TYPE, transport, getCachedFeatures()?.abapRelease);
72
- invalidateWrittenObject(type, name);
73
- return textResult(`Successfully updated ${type} ${name}.\n${summary}`);
74
- }
75
- if (isMetadataWriteType(type)) {
76
- // Metadata updates are full-XML-replace — we must fetch existing metadata
77
- // and merge with provided fields so omitted fields keep their current values.
78
- // Without this, updating just labels would reset dataType/typeKind to defaults.
79
- const metadataProps = getMetadataWriteProperties(args);
80
- const mergedProps = await mergeMetadataWriteProperties(client, type, name, metadataProps);
81
- const description = String(args.description ?? mergedProps._description ?? name);
82
- const pkg = String(args.package ?? existingPackage ?? mergedProps._package ?? '$TMP');
83
- // Keep the full-XML-replace body cloud-correct on BTP (G-3); resolve the user from the JWT (G-5).
84
- const systemType = resolveWriteSystemType(config, client);
85
- const responsible = config.username || (await client.getEffectiveUser());
86
- const body = buildCreateXml(type, name, pkg, description, mergedProps, config.language, responsible, systemType === 'btp');
87
- await safeUpdateObject(client.http, client.safety, objectUrl, body, vendorContentTypeForType(type), transport, getCachedFeatures()?.abapRelease);
88
- invalidateWrittenObject(type, name);
89
- return textResult(`Successfully updated ${type} ${name}.`);
47
+ if (type === 'SKTD' || isMetadataWriteType(type)) {
48
+ return writeMetadataUpdate(ctx, existingPackage);
90
49
  }
91
50
  // RAP deterministic preflight validation
92
51
  const preflightWarnings = runRapPreflightValidation(source, type, name, getCachedFeatures(), config.systemType, preflightOverride);
@@ -104,59 +63,52 @@ export async function writeActionUpdate(ctx) {
104
63
  //
105
64
  // Issue #252: when `parameters` is supplied as a structured array, splice
106
65
  // it into the FM source as ABAP-source-based signature syntax. If `source`
107
- // is omitted entirely, fetch the existing source first to preserve the
66
+ // is omitted entirely, read the existing source under the lock to preserve the
108
67
  // body. The structured clause replaces any existing signature region.
109
68
  let effectiveSource = source;
110
69
  let fmParamStripWarning;
111
- let fmParamMergeWarning;
112
- if (type === 'FUNC') {
113
- const parameters = args.parameters;
114
- if (parameters !== undefined) {
115
- // If caller passed parameters but no source, fetch the current source so
116
- // the body is preserved (the parameters array re-emits only the signature).
117
- let baseSource = source;
118
- if (!baseSource || baseSource.trim() === '') {
119
- const groupName = String(args.group ?? '');
120
- const fetched = await client.getFunction(groupName, name).catch(() => null);
121
- baseSource = fetched?.source ?? `FUNCTION ${name}.\nENDFUNCTION.\n`;
122
- }
123
- else if (!/^\s*FUNCTION\s+/i.test(baseSource)) {
124
- // Body-only source: wrap in FUNCTION/ENDFUNCTION so the splicer has
125
- // something to work with. Common shape from LLMs: just the body.
126
- baseSource = `FUNCTION ${name}.\n${baseSource}\nENDFUNCTION.\n`;
127
- }
128
- try {
129
- effectiveSource = spliceFmSignature(baseSource, name, parameters);
130
- }
131
- catch {
132
- // No FUNCTION token in the supplied source — fall back to user's source.
133
- effectiveSource = baseSource;
134
- fmParamMergeWarning =
135
- 'Could not splice structured parameters: source did not start with FUNCTION keyword. Used the supplied source verbatim.';
136
- }
137
- }
138
- // Defense-in-depth: strip *" comment blocks even after splicing — the
139
- // user's body may contain them (e.g. pasted from SAPGUI).
140
- const stripped = stripFmParamCommentBlock(effectiveSource);
141
- effectiveSource = stripped.source;
70
+ const parameters = args.parameters;
71
+ const needsCurrentFunctionSource = type === 'FUNC' && parameters !== undefined && !source.trim();
72
+ const prepareFunctionSource = (baseSource) => {
73
+ if (parameters !== undefined)
74
+ baseSource = spliceFmSignature(baseSource, name, parameters);
75
+ const stripped = stripFmParamCommentBlock(baseSource);
142
76
  if (stripped.wasStripped) {
143
77
  fmParamStripWarning =
144
78
  'Stripped *"…IMPORTING/EXPORTING…*" parameter comment blocks (SAP rejects them on PUT — pass `parameters` as a structured array instead).';
145
79
  }
80
+ return stripped.source;
81
+ };
82
+ if (type === 'FUNC' && !needsCurrentFunctionSource) {
83
+ // Only caller-supplied body text may be wrapped. A fetched source must contain the real FUNCTION envelope.
84
+ const bodyOnly = parameters !== undefined && !/^\s*FUNCTION\s+/i.test(source);
85
+ effectiveSource = prepareFunctionSource(bodyOnly ? `FUNCTION ${name}.\n${source}\nENDFUNCTION.\n` : source);
86
+ }
87
+ if (!needsCurrentFunctionSource && !effectiveSource.trim()) {
88
+ return errorResult(`"source" is required for action="update" on ${type} ${name}; no write was made.`);
146
89
  }
147
90
  // Pre-write lint validation (uses sanitized source for FUNC)
148
91
  const lintWarnings = runPreWriteLint(effectiveSource, type, name, config, lintOverride);
149
92
  if (lintWarnings.blocked)
150
93
  return lintWarnings.result;
151
94
  // Pre-write server-side syntax check (opt-in; never blocks — warnings only).
152
- const checkNotes = await runPreWriteSyntaxCheck(client, type, effectiveSource, objectUrl, config, checkOverride);
95
+ let checkNotes = '';
96
+ const checkSource = async (candidate, http = client.http) => {
97
+ checkNotes = await runPreWriteSyntaxCheck({ http, safety: client.safety }, type, candidate, objectUrl, config, checkOverride);
98
+ return candidate;
99
+ };
100
+ // A signature-only FUNC edit derives its replacement from fresh bytes under the lock.
101
+ // A failed read aborts; there is no empty-body fallback or unlocked source read.
102
+ const replacement = needsCurrentFunctionSource
103
+ ? (current, session) => checkSource(prepareFunctionSource(current), session)
104
+ : await checkSource(effectiveSource);
153
105
  // If safeUpdateSource throws (lock conflict, network error, etc.), checkNotes
154
106
  // is intentionally discarded — pre-check warnings only matter when the write succeeded.
155
- await safeUpdateSource(client.http, client.safety, objectUrl, srcUrl, effectiveSource, transport, getCachedFeatures()?.abapRelease);
107
+ await safeUpdateSource(client.http, client.safety, objectUrl, srcUrl, replacement, transport, getCachedFeatures()?.abapRelease, args.expectedSourceHash);
156
108
  invalidateWrittenObject(type, name);
157
109
  const msg = `Successfully updated ${type} ${name}.`;
158
110
  const cdsUpdateHint = type === 'DDLS' ? await buildCdsUpdateCrudHint(client, name, objectUrl) : undefined;
159
- const warnings = mergePreWriteWarnings(preflightWarnings.warnings, lintWarnings.warnings, checkNotes, cdsUpdateHint, fmParamStripWarning, fmParamMergeWarning);
111
+ const warnings = mergePreWriteWarnings(preflightWarnings.warnings, lintWarnings.warnings, checkNotes, cdsUpdateHint, fmParamStripWarning);
160
112
  return warnings ? textResult(`${msg}\n\n${warnings}`) : textResult(msg);
161
113
  }
162
114
  export async function writeActionDelete(ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"update-delete.js","sourceRoot":"","sources":["../../../src/handlers/write/update-delete.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-delete.js","sourceRoot":"","sources":["../../../src/handlers/write/update-delete.ts"],"names":[],"mappings":"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"}
@@ -103,8 +103,8 @@ export declare function enforceAllowedPackageForObjectUrl(client: AdtClient, obj
103
103
  * (create gates the caller-supplied package like every create; update/delete resolve the object's true
104
104
  * package under the metadata Accept). The `source` param carries AFF JSON or DDL text per the type's
105
105
  * registry sourceFormat — the JSON ones are parse-validated before the
106
- * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. Create leaves the
107
- * object inactive — callers follow with SAPActivate (never auto-activated).
106
+ * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. SAP controls
107
+ * activation: APLO saves are immediately active; other types need SAPActivate.
108
108
  */
109
109
  export declare function handleServerDrivenObjectWrite(client: AdtClient, action: string, type: string, name: string, args: Record<string, unknown>, cachingLayer: CachingLayer | undefined, cacheSecurity: CacheSecurityContext): Promise<ToolResult>;
110
110
  /** Pre-write lint check result */
@@ -163,6 +163,7 @@ export declare function runPreWriteSyntaxCheck(client: Pick<AdtClient, 'http' |
163
163
  export declare function inactiveSyntaxDiagnostic(client: AdtClient, type: string, name: string): Promise<string>;
164
164
  export declare function tryPostSaveSyntaxCheck(client: AdtClient, type: string, name: string): Promise<string>;
165
165
  export declare const TABL_DT_WRITE_UNAVAILABLE_HINT: string;
166
+ export declare const ENQU_WRITE_UNAVAILABLE_HINT: string;
166
167
  export declare const TTYP_WRITE_UNAVAILABLE_HINT: string;
167
168
  export declare const DOMA_WRITE_UNAVAILABLE_HINT: string;
168
169
  export declare const DEVC_WRITE_UNAVAILABLE_HINT: string;
@@ -1 +1 @@
1
- {"version":3,"file":"write-helpers.d.ts","sourceRoot":"","sources":["../../src/handlers/write-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA6BlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,KAAK,oBAAoB,EAA0B,MAAM,qBAAqB,CAAC;AAIxF,OAAO,EAAe,KAAK,UAAU,EAAc,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAiB7G;AAID,eAAO,MAAM,sBAAsB,0DAA0D,CAAC;AAC9F,eAAO,MAAM,2BAA2B,+DAA+D,CAAC;AACxG,eAAO,MAAM,8BAA8B,kFACsC,CAAC;AAOlF,eAAO,MAAM,wBAAwB,mEAAmE,CAAC;AAGzG,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAWzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAgBD,wCAAwC;AACxC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,WAAW,UAAQ,GAAG,MAAM,CAYjG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B7D;AAaD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8ClG;AAiBD,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkFlC;AAED;;;;;;GAMG;AAEH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAItG;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,UAAQ,GACZ,MAAM,CAGR;AAwXD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAIjG;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,aAOlC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,UAAU,CAAC,CAuFrB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,UAAU,0BAA0B;IAClC,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,EAC5C,eAAe,CAAC,EAAE,OAAO,GACxB,0BAA0B,CAgC5B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAIhG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,eAAe,CAAC,EAAE,OAAO,GACxB,kBAAkB,CAkEpB;AAkBD;;;;;;mFAMmF;AACnF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,EAC1C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAKD;+EAC+E;AAC/E,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3G;AAID,eAAO,MAAM,8BAA8B,QAMQ,CAAC;AAEpD,eAAO,MAAM,2BAA2B,QAG+F,CAAC;AAGxI,eAAO,MAAM,2BAA2B,QAIwD,CAAC;AAEjG,eAAO,MAAM,2BAA2B,QAI0B,CAAC"}
1
+ {"version":3,"file":"write-helpers.d.ts","sourceRoot":"","sources":["../../src/handlers/write-helpers.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,8 @@
7
7
  */
8
8
  import { adtResponsibleAttr, buildDataElementXml, buildDomainXml, buildMessageClassXml, buildServiceBindingXml, buildTableTypeXml, normalizeAdtLanguage, normalizeAdtResponsible, } from '../adt/ddic-xml.js';
9
9
  import { syntaxCheck } from '../adt/devtools.js';
10
- import { AdtSafetyError } from '../adt/errors.js';
10
+ import { AdtError, AdtSafetyError } from '../adt/errors.js';
11
+ import { buildLockObjectXml, getLockObject, LOCKOBJECT_CONTENT_TYPE, mergeLockObjectDefinition, parseLockObjectDefinition, } from '../adt/lock-object.js';
11
12
  import { formatRapPreflightFindings, validateRapSource } from '../adt/rap-preflight.js';
12
13
  import { checkPackage } from '../adt/safety.js';
13
14
  import { createServerDrivenObject, deleteServerDrivenObject, ensureServerDrivenSupport, serverDrivenMetadataContentType, serverDrivenObjectUrl, serverDrivenSourceFormat, serverDrivenUnavailableMessage, updateServerDrivenObjectSource, } from '../adt/server-driven.js';
@@ -68,7 +69,7 @@ const FUNCTION_MODULE_CONTENT_TYPE = 'application/vnd.sap.adt.functions.fmodules
68
69
  // "Supported Media Types: …fincludes.v2+xml" — verified on npl 7.50 and a4h 758.
69
70
  const FUNCTION_INCLUDE_CONTENT_TYPE = 'application/vnd.sap.adt.functions.fincludes.v2+xml';
70
71
  export function isMetadataWriteType(type) {
71
- return type === 'DOMA' || type === 'DTEL' || type === 'MSAG' || type === 'SRVB' || type === 'TTYP';
72
+ return type === 'DOMA' || type === 'DTEL' || type === 'MSAG' || type === 'SRVB' || type === 'TTYP' || type === 'ENQU';
72
73
  }
73
74
  /** Types that require a specific vendor content type for creation (not application/*) */
74
75
  function needsVendorContentType(type) {
@@ -78,6 +79,7 @@ function needsVendorContentType(type) {
78
79
  type === 'MSAG' ||
79
80
  type === 'SKTD' ||
80
81
  type === 'TTYP' ||
82
+ type === 'ENQU' ||
81
83
  type === 'FUGR' ||
82
84
  type === 'FUNC');
83
85
  }
@@ -114,6 +116,8 @@ export function vendorContentTypeForType(type) {
114
116
  return SKTD_V2_CONTENT_TYPE;
115
117
  case 'TTYP':
116
118
  return TABLETYPE_CONTENT_TYPE;
119
+ case 'ENQU':
120
+ return LOCKOBJECT_CONTENT_TYPE;
117
121
  case 'FUGR':
118
122
  return FUNCTION_GROUP_CONTENT_TYPE;
119
123
  case 'FUNC':
@@ -182,6 +186,8 @@ export function getMetadataWriteProperties(input) {
182
186
  // /source/main. Preserve the ADT wire values exactly.
183
187
  processingType: input.processingType,
184
188
  updateTaskKind: input.updateTaskKind,
189
+ // ENQU carries its definition as JSON in "source" (the same shape SAPRead returns).
190
+ lockObjectSource: input.source,
185
191
  };
186
192
  return props;
187
193
  }
@@ -267,6 +273,19 @@ export async function mergeMetadataWriteProperties(client, type, name, provided)
267
273
  deactivateBIDIFiltering: existing.deactivateBIDIFiltering,
268
274
  };
269
275
  }
276
+ if (type === 'ENQU') {
277
+ // Merge over the developer view so consecutive unactivated edits accumulate.
278
+ const existing = await getLockObject(client.http, client.safety, name);
279
+ const source = provided.lockObjectSource;
280
+ const definition = source === undefined || source === null || String(source).trim() === ''
281
+ ? {}
282
+ : parseLockObjectDefinition(String(source));
283
+ return {
284
+ _description: existing.description,
285
+ _package: existing.package,
286
+ lockObjectDefinition: mergeLockObjectDefinition(existing, definition),
287
+ };
288
+ }
270
289
  if (type === 'SRVB') {
271
290
  const { source: existingRaw } = await client.getSrvb(name);
272
291
  const existing = JSON.parse(existingRaw);
@@ -280,6 +299,40 @@ export async function mergeMetadataWriteProperties(client, type, name, provided)
280
299
  odataVersion: provided.odataVersion ?? existing.odataVersion,
281
300
  };
282
301
  }
302
+ if (type === 'TTYP') {
303
+ const existing = await client.getTableType(name).catch((err) => {
304
+ // SAP and transport failures are reported as they are; an unreadable shape has to say why the update stops.
305
+ if (err instanceof AdtError)
306
+ throw err;
307
+ throw new Error(`Cannot update TTYP ${name}: ARC-1 could not read its stored metadata ` +
308
+ `(${err instanceof Error ? err.message : String(err)}) and will not overwrite it blind. ` +
309
+ 'Nothing was written. Change this table type in ADT or SE11.');
310
+ });
311
+ // The two row kinds buildTableTypeXml writes, as rowTypeKind values. Ref and range rows have none.
312
+ const storedKind = existing.rowTypeKind === 'predefinedAbapType'
313
+ ? 'builtin'
314
+ : existing.rowTypeKind === 'dictionaryType'
315
+ ? 'structure'
316
+ : undefined;
317
+ const requested = String(provided.rowType ?? '').trim();
318
+ // Without rowType the caller keeps the stored definition, so ARC-1 must be able to write it back unchanged.
319
+ if (!requested && !(storedKind && existing.plainStandardTable)) {
320
+ const lost = storedKind ? 'its access type, keys or initial row count' : `its ${existing.rowTypeKind} row type`;
321
+ throw new Error(`Cannot update TTYP ${name} without "rowType": ARC-1 rewrites a table type as a standard table with a ` +
322
+ `non-unique standard key and cannot keep ${lost}. Nothing was written. ` +
323
+ 'Pass rowType to accept that rewrite, or change this table type in ADT or SE11.');
324
+ }
325
+ // The stored kind and built-in length describe the stored row type: keep them only while it is unchanged.
326
+ const unchanged = !!storedKind && (!requested || requested.toUpperCase() === existing.rowType.toUpperCase());
327
+ return {
328
+ _description: existing.description,
329
+ _package: existing.package,
330
+ rowType: requested || existing.rowType,
331
+ rowTypeKind: provided.rowTypeKind ?? (unchanged ? storedKind : undefined),
332
+ rowTypeLength: unchanged ? existing.rowTypeLength : undefined,
333
+ rowTypeDecimals: unchanged ? existing.rowTypeDecimals : undefined,
334
+ };
335
+ }
283
336
  return provided;
284
337
  }
285
338
  /**
@@ -556,10 +609,18 @@ function buildCreateXmlBody(type, name, pkg, description, properties, language,
556
609
  package: pkg,
557
610
  rowType,
558
611
  rowTypeKind,
612
+ rowTypeLength: properties?.rowTypeLength,
613
+ rowTypeDecimals: properties?.rowTypeDecimals,
559
614
  language: masterLanguage,
560
615
  responsible: responsibleUser,
561
616
  });
562
617
  }
618
+ case 'ENQU': {
619
+ // Update passes the merged definition; create parses the caller's JSON source.
620
+ const definition = properties?.lockObjectDefinition ??
621
+ parseLockObjectDefinition(String(properties?.lockObjectSource ?? '{}'));
622
+ return buildLockObjectXml({ name, description, package: pkg, definition, masterLanguage, responsibleAttr });
623
+ }
563
624
  case 'DTEL': {
564
625
  const typeKindRaw = String(properties?.typeKind ?? '');
565
626
  const typeKind = typeKindRaw === 'domain' || typeKindRaw === 'predefinedAbapType' ? typeKindRaw : undefined;
@@ -699,6 +760,7 @@ export const NAME_CASE_GUARD_ACTIONS = new Set([
699
760
  'update',
700
761
  'edit_method',
701
762
  'edit_unit',
763
+ 'add_unit',
702
764
  'delete',
703
765
  'edit_text_symbols',
704
766
  ]);
@@ -732,8 +794,8 @@ export async function enforceAllowedPackageForObjectUrl(client, objectUrl, label
732
794
  * (create gates the caller-supplied package like every create; update/delete resolve the object's true
733
795
  * package under the metadata Accept). The `source` param carries AFF JSON or DDL text per the type's
734
796
  * registry sourceFormat — the JSON ones are parse-validated before the
735
- * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. Create leaves the
736
- * object inactive — callers follow with SAPActivate (never auto-activated).
797
+ * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. SAP controls
798
+ * activation: APLO saves are immediately active; other types need SAPActivate.
737
799
  */
738
800
  export async function handleServerDrivenObjectWrite(client, action, type, name, args, cachingLayer, cacheSecurity) {
739
801
  // Discovery gate — mirror handleSAPRead's server-driven branch.
@@ -743,6 +805,9 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
743
805
  const transport = args.transport;
744
806
  const objUrl = serverDrivenObjectUrl(type, name);
745
807
  const metadataAccept = serverDrivenMetadataContentType(type);
808
+ const activationHint = type === 'APLO'
809
+ ? 'APLO changes are active immediately; no activation is required.'
810
+ : `Next step: SAPActivate(type="${type}", name="${name}").`;
746
811
  const invalidate = () => {
747
812
  cachingLayer?.invalidate(type, name, 'all');
748
813
  invalidateInactiveList(cachingLayer, client, cacheSecurity);
@@ -770,25 +835,51 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
770
835
  case 'create': {
771
836
  const pkg = String(args.package ?? '$TMP');
772
837
  await checkPackage(client.safety, pkg, client.getPackageHierarchyResolver());
838
+ if (type === 'APLO' && name.length > 20) {
839
+ return errorResult('APLO names must be at most 20 characters. Nothing was created.');
840
+ }
773
841
  const description = String(args.description ?? name);
774
842
  // Validate BEFORE the create POST — validating after would leave an inactive orphan on SAP
775
843
  // that the caller never asked for and has to clean up by hand.
776
844
  const validated = hasSourceArg ? validateSource() : undefined;
777
845
  if (validated && !validated.ok)
778
846
  return validated.result;
847
+ // The job creation wizard requires this reference before the source PUT (notably on 758).
848
+ let creationProperties;
849
+ if (type === 'SAJC' || type === 'SAJT') {
850
+ const field = type === 'SAJC' ? 'className' : 'catalogName';
851
+ const reference = validated?.ok ? JSON.parse(validated.source)?.generalInformation?.[field] : undefined;
852
+ if (typeof reference !== 'string' || !reference.trim()) {
853
+ return errorResult(`Creating ${type} requires source.generalInformation.${field} in the AFF JSON source.`);
854
+ }
855
+ creationProperties = { [field]: reference };
856
+ }
779
857
  await createServerDrivenObject(client.http, client.safety, type, name, {
780
858
  package: pkg,
781
859
  description,
782
860
  transport,
861
+ creationProperties,
783
862
  });
784
- let wroteSource = false;
785
- if (validated?.ok) {
786
- await updateServerDrivenObjectSource(client.http, client.safety, type, name, validated.source, { transport });
787
- wroteSource = true;
863
+ try {
864
+ if (validated?.ok) {
865
+ await updateServerDrivenObjectSource(client.http, client.safety, type, name, validated.source, { transport });
866
+ }
788
867
  }
789
- invalidate();
790
- return textResult(`Created ${type} ${name} in package ${pkg}${wroteSource ? ' and wrote source' : ''}.\n` +
791
- `Next step: SAPActivate(type="${type}", name="${name}").`);
868
+ catch (cause) {
869
+ // The POST succeeded; both HTTP and network failures can leave the object with a partial source.
870
+ const err = cause instanceof AdtError ? cause : new AdtError(cause instanceof Error ? cause.message : String(cause));
871
+ err.extraHint = `${type} ${name} was created in package ${pkg}${type === 'APLO' ? ' and is active' : ''}, but the follow-up source step failed. Check it with SAPRead before using SAPWrite(action="update") — do not repeat create.`;
872
+ throw err;
873
+ }
874
+ finally {
875
+ try {
876
+ invalidate();
877
+ }
878
+ catch {
879
+ // Cache bookkeeping must not replace the confirmed create outcome or its original failure.
880
+ }
881
+ }
882
+ return textResult(`Created ${type} ${name} in package ${pkg}${validated?.ok ? ' and wrote source' : ''}.\n${activationHint}`);
792
883
  }
793
884
  case 'update': {
794
885
  if (!hasSourceArg) {
@@ -800,17 +891,26 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
800
891
  await enforceAllowedPackageForObjectUrl(client, objUrl, `Operations on ${type} '${name}'`, metadataAccept);
801
892
  await updateServerDrivenObjectSource(client.http, client.safety, type, name, v.source, { transport });
802
893
  invalidate();
803
- return textResult(`Updated source of ${type} ${name}.\nNext step: SAPActivate(type="${type}", name="${name}").`);
894
+ return textResult(`Updated source of ${type} ${name}.\n${activationHint}`);
804
895
  }
805
896
  case 'delete': {
806
897
  await enforceAllowedPackageForObjectUrl(client, objUrl, `Operations on ${type} '${name}'`, metadataAccept);
807
- await deleteServerDrivenObject(client.http, client.safety, type, name, { transport });
808
- invalidate();
898
+ try {
899
+ await deleteServerDrivenObject(client.http, client.safety, type, name, { transport });
900
+ }
901
+ finally {
902
+ try {
903
+ invalidate();
904
+ }
905
+ catch {
906
+ // Best-effort cleanup must not mask partial deletion or prevent the audit event.
907
+ }
908
+ }
809
909
  return textResult(`Deleted ${type} ${name}.`);
810
910
  }
811
911
  default:
812
912
  return errorResult(`Action "${action}" is not supported for server-driven object type ${type}. ` +
813
- 'Supported: create, update, delete — then SAPActivate to activate.');
913
+ 'Supported: create, update, delete.');
814
914
  }
815
915
  }
816
916
  /**
@@ -1018,6 +1118,9 @@ export const TABL_DT_WRITE_UNAVAILABLE_HINT = 'Transparent table writes via ADT
1018
1118
  'Use SE11 in SAPGUI, or connect ARC-1 to an SAP_BASIS ≥ 7.52 system. ' +
1019
1119
  'Writing the source via /sap/bc/adt/ddic/structures/ would silently flip ' +
1020
1120
  'DD02L-TABCLASS to INTTAB and corrupt the table.';
1121
+ export const ENQU_WRITE_UNAVAILABLE_HINT = 'Lock object (ENQU) writes are not available on this system ' +
1122
+ '(/sap/bc/adt/ddic/lockobjects/sources is not exposed by ADT discovery). ' +
1123
+ 'Use SE11 in SAPGUI, or connect ARC-1 to a system that exposes the lock-object endpoint.';
1021
1124
  export const TTYP_WRITE_UNAVAILABLE_HINT = 'Table type (TTYP) writes are not available on this system ' +
1022
1125
  '(/sap/bc/adt/ddic/tabletypes/ is not exposed by ADT discovery — verified absent on NW 7.50). ' +
1023
1126
  'Use SE11 in SAPGUI, or connect ARC-1 to a system that exposes the table-type endpoint (S/4HANA 2023 / ABAP Platform 2025 verified).';