@aventara/core 1.0.0-rc.0 → 1.0.0-rc.2

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 (267) hide show
  1. package/CHANGELOG.md +1434 -0
  2. package/ERRORS.md +142 -0
  3. package/README.md +247 -57
  4. package/dist/adapters/adapter-discovery-diagnostic.d.ts +4 -4
  5. package/dist/adapters/adapter-discovery-diagnostic.guidance.d.ts +6 -0
  6. package/dist/adapters/adapter-discovery-diagnostic.guidance.js +7 -0
  7. package/dist/adapters/adapter-field.d.ts +25 -11
  8. package/dist/adapters/adapter-identifier.d.ts +6 -6
  9. package/dist/adapters/adapter-model.d.ts +18 -9
  10. package/dist/adapters/adapter-operation-executor.interface.d.ts +4 -4
  11. package/dist/adapters/adapter-operation.d.ts +3 -3
  12. package/dist/adapters/adapter-resource.d.ts +18 -9
  13. package/dist/adapters/adapter-sql-statement.d.ts +19 -0
  14. package/dist/adapters/adapter-transaction-executor.interface.d.ts +19 -0
  15. package/dist/adapters/adapter.interface.d.ts +59 -29
  16. package/dist/avz/avz-check.factory.d.ts +83 -0
  17. package/dist/avz/avz-check.factory.js +116 -0
  18. package/dist/avz/avz-check.registry.d.ts +35 -0
  19. package/dist/avz/avz-check.registry.js +9 -0
  20. package/dist/avz/avz.d.ts +203 -0
  21. package/dist/{json → avz}/avz.js +150 -8
  22. package/dist/{json → avz}/index.d.ts +2 -1
  23. package/dist/{json → avz}/json-shape.registry.d.ts +7 -7
  24. package/dist/{json → avz}/zod-issue.translator.d.ts +8 -2
  25. package/dist/{json → avz}/zod-issue.translator.js +7 -0
  26. package/dist/compiler/contract-compiler-diagnostic.d.ts +31 -5
  27. package/dist/compiler/contract-compiler-diagnostic.guidance.d.ts +6 -0
  28. package/dist/compiler/contract-compiler-diagnostic.guidance.js +97 -0
  29. package/dist/compiler/contract.compiler.d.ts +18 -18
  30. package/dist/compiler/contract.compiler.js +637 -442
  31. package/dist/compiler/create-requirements.projector.d.ts +49 -0
  32. package/dist/compiler/create-requirements.projector.js +423 -0
  33. package/dist/compiler/field-validator.compiler.d.ts +47 -0
  34. package/dist/compiler/field-validator.compiler.js +238 -0
  35. package/dist/config/any-framework-config.d.ts +19 -12
  36. package/dist/config/computed-fields.d.ts +62 -0
  37. package/dist/config/computed-fields.js +80 -0
  38. package/dist/config/config-diagnostic.d.ts +11 -4
  39. package/dist/config/config-diagnostic.guidance.d.ts +6 -0
  40. package/dist/config/config-diagnostic.guidance.js +32 -0
  41. package/dist/config/config-layer.d.ts +15 -6
  42. package/dist/config/config.resolver.d.ts +74 -31
  43. package/dist/config/config.resolver.js +108 -44
  44. package/dist/config/config.validator.d.ts +7 -7
  45. package/dist/config/config.validator.js +581 -72
  46. package/dist/config/define-resource.d.ts +57 -0
  47. package/dist/config/define-resource.js +14 -0
  48. package/dist/config/effective-fields.d.ts +19 -23
  49. package/dist/config/entrypoint.normalizer.d.ts +1 -1
  50. package/dist/config/exact-framework-config.d.ts +308 -0
  51. package/dist/config/field-compute.resolver.d.ts +21 -0
  52. package/dist/config/field-compute.resolver.js +123 -0
  53. package/dist/config/field-pipeline-config.d.ts +47 -0
  54. package/dist/config/forced-operation.validator.d.ts +10 -0
  55. package/dist/config/forced-operation.validator.js +66 -0
  56. package/dist/config/framework-config.d.ts +111 -39
  57. package/dist/config/framework-exemptions-config.d.ts +91 -0
  58. package/dist/config/framework-exemptions-config.js +1 -0
  59. package/dist/config/framework-field-definition.d.ts +78 -0
  60. package/dist/config/framework-field-definition.js +28 -0
  61. package/dist/config/framework-resources-config.d.ts +122 -0
  62. package/dist/config/framework-resources-config.js +1 -0
  63. package/dist/config/pipeline-config.d.ts +56 -20
  64. package/dist/config/pipeline-tree.resolver.d.ts +79 -0
  65. package/dist/config/pipeline-tree.resolver.js +220 -0
  66. package/dist/config/stage-type.eraser.d.ts +65 -0
  67. package/dist/config/stage-type.eraser.js +1 -0
  68. package/dist/contracts/capability.d.ts +21 -12
  69. package/dist/contracts/capability.js +2 -0
  70. package/dist/contracts/client-contract-structure.validator.d.ts +388 -63
  71. package/dist/contracts/client-contract-structure.validator.js +156 -10
  72. package/dist/contracts/contract-canonicalizer.d.ts +26 -3
  73. package/dist/contracts/contract-canonicalizer.js +156 -29
  74. package/dist/contracts/contract-hash.d.ts +12 -7
  75. package/dist/contracts/contract-hash.js +3 -2
  76. package/dist/contracts/contract-limits.d.ts +4 -1
  77. package/dist/contracts/contract-limits.js +1 -0
  78. package/dist/contracts/contract-lookup.d.ts +5 -5
  79. package/dist/contracts/contract-protocol.d.ts +4 -4
  80. package/dist/contracts/contract.d.ts +24 -16
  81. package/dist/contracts/create-requirements.d.ts +35 -0
  82. package/dist/contracts/create-requirements.js +1 -0
  83. package/dist/contracts/enum-definition.d.ts +1 -1
  84. package/dist/contracts/field-check.d.ts +101 -0
  85. package/dist/contracts/field-check.js +1 -0
  86. package/dist/contracts/field.d.ts +81 -42
  87. package/dist/contracts/identifier.d.ts +4 -4
  88. package/dist/contracts/json-shape.d.ts +12 -1
  89. package/dist/contracts/lifecycle-trait.d.ts +2 -2
  90. package/dist/contracts/resource-operations.d.ts +28 -28
  91. package/dist/contracts/resource.d.ts +15 -9
  92. package/dist/contracts/scalar-value-type.d.ts +15 -15
  93. package/dist/contracts/scalar.d.ts +3 -3
  94. package/dist/contracts/transaction-capability.d.ts +1 -1
  95. package/dist/contracts/wire-scalar-format.d.ts +4 -4
  96. package/dist/framework/contract-view.d.ts +213 -147
  97. package/dist/framework/framework-construction.error.d.ts +19 -10
  98. package/dist/framework/framework-construction.error.js +7 -3
  99. package/dist/framework/framework.d.ts +47 -23
  100. package/dist/framework/framework.factory.d.ts +8 -6
  101. package/dist/framework/framework.factory.js +49 -22
  102. package/dist/framework/operation-facade.d.ts +123 -52
  103. package/dist/framework/operation-facade.js +9 -1
  104. package/dist/index.d.ts +57 -50
  105. package/dist/index.js +7 -6
  106. package/dist/internal.d.ts +17 -10
  107. package/dist/internal.js +4 -1
  108. package/dist/operations/database-refusal.d.ts +51 -0
  109. package/dist/operations/database-refusal.js +45 -0
  110. package/dist/operations/operation-arguments.d.ts +343 -207
  111. package/dist/operations/operation-call.d.ts +27 -28
  112. package/dist/operations/operation-identity.d.ts +10 -10
  113. package/dist/operations/operation-result.d.ts +21 -21
  114. package/dist/operations/operation-validator-core.d.ts +6 -6
  115. package/dist/operations/operation-validator-core.js +99 -6
  116. package/dist/operations/operation-validator.d.ts +9 -9
  117. package/dist/operations/projection-scope.resolver.d.ts +6 -6
  118. package/dist/operations/structural-limits.walker.d.ts +6 -6
  119. package/dist/operations/structural-limits.walker.js +145 -0
  120. package/dist/operations/validation-code.d.ts +11 -6
  121. package/dist/operations/validation-code.guidance.d.ts +6 -0
  122. package/dist/operations/validation-code.guidance.js +90 -0
  123. package/dist/operations/validation-code.js +4 -0
  124. package/dist/operations/write-scope.resolver.d.ts +10 -6
  125. package/dist/operations/write-scope.resolver.js +2 -0
  126. package/dist/protocol/absent-route.responder.d.ts +13 -12
  127. package/dist/protocol/absent-route.responder.js +19 -19
  128. package/dist/protocol/contract-document.responder.d.ts +3 -3
  129. package/dist/protocol/contract-document.responder.js +2 -2
  130. package/dist/protocol/http-request.decoder.d.ts +17 -13
  131. package/dist/protocol/http-request.decoder.js +10 -10
  132. package/dist/protocol/http-request.reader.d.ts +3 -3
  133. package/dist/protocol/http-response.encoder.d.ts +4 -4
  134. package/dist/protocol/http-response.encoder.js +94 -55
  135. package/dist/protocol/http-status.table.d.ts +2 -2
  136. package/dist/protocol/operation-response.guard.d.ts +2 -2
  137. package/dist/protocol/protocol-surface.d.ts +4 -4
  138. package/dist/protocol/protocol.binder.d.ts +50 -27
  139. package/dist/protocol/protocol.binder.js +12 -9
  140. package/dist/protocol/protocol.handler.d.ts +22 -13
  141. package/dist/protocol/protocol.handler.js +91 -17
  142. package/dist/protocol/unmounted-route.error.d.ts +4 -4
  143. package/dist/protocol/unmounted-route.error.js +2 -2
  144. package/dist/runtime/caller-data.copier.d.ts +22 -5
  145. package/dist/runtime/caller-data.copier.js +31 -14
  146. package/dist/runtime/caller-data.door.d.ts +17 -11
  147. package/dist/runtime/caller-data.door.js +6 -4
  148. package/dist/runtime/computed-read-runtime.d.ts +7 -6
  149. package/dist/runtime/computed-read-runtime.js +76 -50
  150. package/dist/runtime/computed-value.error.d.ts +7 -6
  151. package/dist/runtime/computed-value.error.js +5 -4
  152. package/dist/runtime/context-executor.runtime.d.ts +59 -0
  153. package/dist/runtime/context-executor.runtime.js +275 -0
  154. package/dist/runtime/create-requirement.d.ts +44 -79
  155. package/dist/runtime/create-requirement.js +213 -73
  156. package/dist/runtime/decimal.d.ts +2 -2
  157. package/dist/runtime/decimal.js +1 -1
  158. package/dist/runtime/diagnostics-reporter.d.ts +54 -27
  159. package/dist/runtime/diagnostics-reporter.js +24 -0
  160. package/dist/runtime/error-boundary.d.ts +65 -8
  161. package/dist/runtime/error-boundary.js +49 -19
  162. package/dist/runtime/error-guidance.d.ts +12 -0
  163. package/dist/runtime/error-guidance.js +1 -0
  164. package/dist/runtime/error.catalog.d.ts +49 -0
  165. package/dist/runtime/error.catalog.js +49 -0
  166. package/dist/runtime/execution-options.d.ts +10 -2
  167. package/dist/runtime/field-check.evaluator.d.ts +29 -0
  168. package/dist/runtime/field-check.evaluator.js +521 -0
  169. package/dist/runtime/field-compute.d.ts +64 -0
  170. package/dist/runtime/field-compute.js +1 -0
  171. package/dist/runtime/field-stage.plan.d.ts +15 -0
  172. package/dist/runtime/field-stage.plan.js +27 -0
  173. package/dist/runtime/field-stage.runtime.d.ts +37 -0
  174. package/dist/runtime/field-stage.runtime.js +147 -0
  175. package/dist/runtime/field-validator.runtime.d.ts +19 -0
  176. package/dist/runtime/field-validator.runtime.js +92 -0
  177. package/dist/runtime/framework-error-class.table.d.ts +33 -0
  178. package/dist/runtime/framework-error-class.table.js +25 -0
  179. package/dist/runtime/framework-error.d.ts +68 -8
  180. package/dist/runtime/framework-error.factory.d.ts +4 -0
  181. package/dist/runtime/framework-error.factory.js +15 -0
  182. package/dist/runtime/framework-error.js +23 -2
  183. package/dist/runtime/interceptor-next.error.d.ts +5 -0
  184. package/dist/runtime/interceptor-next.error.js +6 -0
  185. package/dist/runtime/json-value.d.ts +11 -6
  186. package/dist/runtime/level-lifecycle.runtime.d.ts +25 -0
  187. package/dist/runtime/level-lifecycle.runtime.js +39 -0
  188. package/dist/runtime/misuse-reporter.d.ts +12 -12
  189. package/dist/runtime/mutation-planner.d.ts +19 -10
  190. package/dist/runtime/mutation-planner.js +48 -35
  191. package/dist/runtime/nested-write.walker.d.ts +32 -0
  192. package/dist/runtime/nested-write.walker.js +73 -0
  193. package/dist/runtime/operation-code.guidance.d.ts +6 -0
  194. package/dist/runtime/operation-code.guidance.js +167 -0
  195. package/dist/runtime/operation-request.d.ts +33 -6
  196. package/dist/runtime/operation-response.d.ts +17 -17
  197. package/dist/runtime/operation-runtime.d.ts +127 -25
  198. package/dist/runtime/operation-runtime.js +441 -78
  199. package/dist/runtime/outcome-mapper.d.ts +16 -5
  200. package/dist/runtime/outcome-mapper.js +23 -6
  201. package/dist/runtime/output-validator.d.ts +10 -10
  202. package/dist/runtime/output-validator.js +3 -3
  203. package/dist/runtime/owned-execution.registry.d.ts +16 -6
  204. package/dist/runtime/pipe-output.validator.d.ts +43 -18
  205. package/dist/runtime/pipe-output.validator.js +15 -13
  206. package/dist/runtime/pipeline.d.ts +223 -34
  207. package/dist/runtime/readonly-value.d.ts +43 -0
  208. package/dist/runtime/readonly-value.js +150 -0
  209. package/dist/runtime/request-envelope.validator.d.ts +3 -3
  210. package/dist/runtime/request-envelope.validator.js +12 -7
  211. package/dist/runtime/request-id.d.ts +1 -1
  212. package/dist/runtime/request-state.d.ts +14 -0
  213. package/dist/runtime/request-state.js +1 -0
  214. package/dist/runtime/request-state.resolver.d.ts +12 -0
  215. package/dist/runtime/request-state.resolver.js +20 -0
  216. package/dist/runtime/scalar-runtime.d.ts +35 -16
  217. package/dist/runtime/scalar-runtime.js +102 -34
  218. package/dist/runtime/unsent-value.normalizer.d.ts +15 -0
  219. package/dist/runtime/unsent-value.normalizer.js +128 -0
  220. package/dist/transactions/deferred-operation.d.ts +35 -20
  221. package/dist/transactions/operation-arguments-encoder.d.ts +3 -3
  222. package/dist/transactions/operation-arguments-encoder.js +2 -2
  223. package/dist/transactions/operation-fingerprint.js +2 -2
  224. package/dist/transactions/sql-statement.d.ts +85 -0
  225. package/dist/transactions/sql-statement.js +47 -0
  226. package/dist/transactions/sql-statement.validator.d.ts +44 -0
  227. package/dist/transactions/sql-statement.validator.js +167 -0
  228. package/dist/transactions/transaction-envelope.d.ts +4 -4
  229. package/dist/transactions/transaction-integrity-error.d.ts +6 -6
  230. package/dist/transactions/transaction-integrity-error.js +5 -2
  231. package/dist/transactions/transaction-plan-assembler.d.ts +21 -11
  232. package/dist/transactions/transaction-plan-assembler.js +169 -32
  233. package/dist/transactions/transaction-plan-validator.d.ts +45 -20
  234. package/dist/transactions/transaction-plan-validator.js +96 -38
  235. package/dist/transactions/transaction-reference-collector.d.ts +5 -5
  236. package/dist/transactions/transaction-reference-resolver.d.ts +19 -2
  237. package/dist/transactions/transaction-reference-resolver.js +26 -14
  238. package/dist/transactions/transaction-reference-validator.d.ts +76 -4
  239. package/dist/transactions/transaction-reference-validator.js +129 -71
  240. package/dist/transactions/transaction-reference.d.ts +13 -13
  241. package/dist/transactions/transaction-reference.js +5 -0
  242. package/dist/transactions/transaction-request.d.ts +18 -5
  243. package/dist/transactions/transaction-response.d.ts +6 -6
  244. package/dist/transactions/transaction-runtime.d.ts +8 -7
  245. package/dist/transactions/transaction-runtime.js +191 -50
  246. package/dist/transactions/transaction-settlement.runtime.d.ts +51 -0
  247. package/dist/transactions/transaction-settlement.runtime.js +120 -0
  248. package/dist/transactions/transaction-slot-path-error.d.ts +4 -4
  249. package/dist/transactions/transaction-slot-path-error.js +2 -2
  250. package/dist/transactions/transaction-slot-writer.js +2 -2
  251. package/dist/transactions/transaction-stage.runtime.d.ts +82 -0
  252. package/dist/transactions/transaction-stage.runtime.js +126 -0
  253. package/package.json +9 -7
  254. package/src/runtime/field-check.evaluator.ts +720 -0
  255. package/dist/config/define-fields.d.ts +0 -42
  256. package/dist/config/define-fields.js +0 -3
  257. package/dist/config/framework-behaviors-config.d.ts +0 -30
  258. package/dist/config/framework-fields-config.d.ts +0 -42
  259. package/dist/config/framework-restrictions-config.d.ts +0 -142
  260. package/dist/json/avz.d.ts +0 -96
  261. package/dist/runtime/field-behavior.d.ts +0 -48
  262. /package/dist/{config/framework-behaviors-config.js → adapters/adapter-sql-statement.js} +0 -0
  263. /package/dist/{config/framework-fields-config.js → adapters/adapter-transaction-executor.interface.js} +0 -0
  264. /package/dist/{json → avz}/index.js +0 -0
  265. /package/dist/{json → avz}/json-shape.registry.js +0 -0
  266. /package/dist/config/{framework-restrictions-config.js → exact-framework-config.js} +0 -0
  267. /package/dist/{runtime/field-behavior.js → config/field-pipeline-config.js} +0 -0
@@ -1,10 +1,15 @@
1
- import { validationIssue } from "../operations/validation-code.js";
1
+ import { VALIDATION_CODE_MESSAGES, validationIssue, } from "../operations/validation-code.js";
2
+ import { AvCallerDataError, } from "../runtime/caller-data.copier.js";
2
3
  import { copyAtDoor, refuseCallerData } from "../runtime/caller-data.door.js";
3
4
  import { operationFailure } from "../runtime/operation-response.js";
4
5
  import { mapValidationOutcome } from "../runtime/outcome-mapper.js";
6
+ import { withoutUnsentWriteValues } from "../runtime/unsent-value.normalizer.js";
5
7
  import { encodeOperationArgumentsForWire } from "./operation-arguments-encoder.js";
6
8
  import { computeOperationFingerprint } from "./operation-fingerprint.js";
9
+ import { readSqlTemplate } from "./sql-statement.js";
10
+ import { routeTransactionReferenceCandidate } from "./transaction-reference.js";
7
11
  import { transactionOperationFailure } from "./transaction-response.js";
12
+ const SQL_STEP_NODE = Object.freeze({ fingerprint: null });
8
13
  function isPlainRecord(value) {
9
14
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
10
15
  return false;
@@ -13,26 +18,76 @@ function isPlainRecord(value) {
13
18
  return prototype === Object.prototype || prototype === null;
14
19
  }
15
20
  const KEEP = Symbol("keep");
16
- function rebuildArguments(value, path, leaf, ancestors = new Set()) {
17
- const replaced = leaf(value, path);
18
- if (replaced !== KEEP) {
19
- return replaced;
20
- }
21
- if (!Array.isArray(value) && !isPlainRecord(value)) {
22
- return value;
21
+ function rebuildArguments(root, leaf) {
22
+ const pathOf = (parent, key) => () => {
23
+ const segments = [];
24
+ if (key !== undefined) {
25
+ segments.push(key);
26
+ }
27
+ for (let frame = parent; frame?.key !== undefined; frame = frame.parent) {
28
+ segments.push(frame.key);
29
+ }
30
+ return segments.reverse();
31
+ };
32
+ const ancestors = new Set();
33
+ const finish = (frame) => {
34
+ ancestors.delete(frame.source);
35
+ if (!Array.isArray(frame.source)) {
36
+ return Object.fromEntries(frame.built);
37
+ }
38
+ const rebuilt = new Array(frame.source.length);
39
+ for (const [index, value] of frame.built) {
40
+ rebuilt[index] = value;
41
+ }
42
+ return rebuilt;
43
+ };
44
+ const enter = (value, parent, key) => {
45
+ const replaced = leaf(value, pathOf(parent, key));
46
+ if (replaced !== KEEP) {
47
+ return { value: replaced };
48
+ }
49
+ if (!Array.isArray(value) && !isPlainRecord(value)) {
50
+ return { value };
51
+ }
52
+ if (Object.hasOwn(value, "$ref")) {
53
+ return { value };
54
+ }
55
+ if (ancestors.has(value)) {
56
+ return { value };
57
+ }
58
+ ancestors.add(value);
59
+ const keys = Array.isArray(value)
60
+ ? Object.keys(value).map(Number)
61
+ : Object.keys(value);
62
+ return { source: value, keys, built: [], parent, key, next: 0 };
63
+ };
64
+ const first = enter(root, undefined, undefined);
65
+ if (!("source" in first)) {
66
+ return first.value;
23
67
  }
24
- if (ancestors.has(value)) {
25
- return value;
68
+ let frame = first;
69
+ for (;;) {
70
+ if (frame.next < frame.keys.length) {
71
+ const key = frame.keys[frame.next];
72
+ frame.next += 1;
73
+ const entry = frame.source[key];
74
+ const child = enter(entry, frame, key);
75
+ if ("source" in child) {
76
+ frame = child;
77
+ }
78
+ else {
79
+ frame.built.push([key, child.value]);
80
+ }
81
+ continue;
82
+ }
83
+ const rebuilt = finish(frame);
84
+ const parent = frame.parent;
85
+ if (parent === undefined) {
86
+ return rebuilt;
87
+ }
88
+ parent.built.push([frame.key, rebuilt]);
89
+ frame = parent;
26
90
  }
27
- ancestors.add(value);
28
- const rebuilt = Array.isArray(value)
29
- ? value.map((entry, index) => rebuildArguments(entry, [...path, index], leaf, ancestors))
30
- : Object.fromEntries(Object.entries(value).map(([key, entry]) => [
31
- key,
32
- rebuildArguments(entry, [...path, key], leaf, ancestors),
33
- ]));
34
- ancestors.delete(value);
35
- return rebuilt;
36
91
  }
37
92
  function operationEntryFailure(operation, message) {
38
93
  return transactionOperationFailure(operationFailure("A2004", {
@@ -43,33 +98,35 @@ function operationEntryFailure(operation, message) {
43
98
  function referenceFailure(issue, operation) {
44
99
  return transactionOperationFailure(mapValidationOutcome([issue]), operation);
45
100
  }
101
+ const STEP_REFERENCE_MIRROR = (value) => Object.hasOwn(value, "$ref");
46
102
  export function createTransactionPlanAssembler(contracts, protocol, misuse) {
47
103
  const handles = new WeakMap();
48
104
  const placeholders = new WeakMap();
49
105
  const originOf = (origin) => origin === "application"
50
106
  ? { origin: "application" }
51
107
  : { origin: "client", protocol };
52
- const snapshot = (args) => {
108
+ const snapshot = (args, mirror) => {
53
109
  const copy = copyAtDoor(args, {
54
110
  keep: (value) => placeholders.has(value),
111
+ ...(mirror === undefined ? {} : { mirror }),
55
112
  });
56
113
  return copy.ok ? { args: copy.value } : { args: {}, refused: copy.error };
57
114
  };
58
115
  const placeholderSites = (args) => {
59
116
  const sites = [];
60
- rebuildArguments(args, [], (value, path) => {
117
+ rebuildArguments(args, (value, pathOf) => {
61
118
  const placeholder = typeof value === "object" && value !== null
62
119
  ? placeholders.get(value)
63
120
  : undefined;
64
121
  if (placeholder === undefined) {
65
122
  return KEEP;
66
123
  }
67
- sites.push({ path, object: value, placeholder });
124
+ sites.push({ path: pathOf(), object: value, placeholder });
68
125
  return value;
69
126
  });
70
127
  return sites;
71
128
  };
72
- const defer = (origin, resource, identity, args) => {
129
+ const createHandle = (record) => {
73
130
  const handle = Object.freeze({
74
131
  $ref: (field) => {
75
132
  const placeholder = Object.freeze({
@@ -79,13 +136,62 @@ export function createTransactionPlanAssembler(contracts, protocol, misuse) {
79
136
  return placeholder;
80
137
  },
81
138
  });
82
- handles.set(handle, {
139
+ handles.set(handle, record);
140
+ return handle;
141
+ };
142
+ const defer = (origin, resource, identity, args) => {
143
+ const copy = snapshot(args, STEP_REFERENCE_MIRROR);
144
+ let sent = copy.args;
145
+ try {
146
+ sent = withoutUnsentWriteValues(origin === "application" ? contracts.application : contracts.client, { resource, family: identity.family }, copy.args);
147
+ }
148
+ catch (error) {
149
+ if (!(error instanceof AvCallerDataError)) {
150
+ throw error;
151
+ }
152
+ }
153
+ return createHandle({
154
+ kind: "operation",
83
155
  origin,
84
156
  resource,
85
157
  identity,
86
- ...snapshot(args),
158
+ ...copy,
159
+ args: sent,
87
160
  });
88
- return handle;
161
+ };
162
+ const deferSql = (strings, values) => {
163
+ const copy = snapshot(values, STEP_REFERENCE_MIRROR);
164
+ return createHandle({
165
+ kind: "sql",
166
+ strings: readSqlTemplate(strings, values.length),
167
+ values: Array.isArray(copy.args) ? copy.args : [],
168
+ ...(copy.refused === undefined ? {} : { refused: copy.refused }),
169
+ });
170
+ };
171
+ const recordPlaceholderSites = (record) => placeholderSites(record.kind === "sql" ? record.values : record.args);
172
+ const planSqlStatement = (record, positions) => {
173
+ const values = record.values.map((value) => {
174
+ const sites = placeholderSites(value);
175
+ const [site] = sites;
176
+ if (site === undefined) {
177
+ return routeTransactionReferenceCandidate(value).kind === "ordinary"
178
+ ? { kind: "value", value }
179
+ : { kind: "candidate", candidate: value };
180
+ }
181
+ if (site.path.length > 0) {
182
+ return { kind: "misplaced-reference", path: site.path };
183
+ }
184
+ return {
185
+ kind: "reference",
186
+ operation: positions.get(site.placeholder.source),
187
+ field: site.placeholder.field,
188
+ };
189
+ });
190
+ return {
191
+ strings: record.strings,
192
+ values,
193
+ ...(record.refused === undefined ? {} : { refused: record.refused }),
194
+ };
89
195
  };
90
196
  const assemble = async (input) => {
91
197
  const list = copyAtDoor(input, { keep: (value) => value !== input });
@@ -131,12 +237,35 @@ export function createTransactionPlanAssembler(contracts, protocol, misuse) {
131
237
  positions.set(entry, index);
132
238
  records.push(record);
133
239
  }
240
+ const originOfRecord = (record) => record.kind === "sql" ? "application" : record.origin;
241
+ const [first] = records;
242
+ if (first !== undefined) {
243
+ const planOrigin = originOfRecord(first);
244
+ const other = records.findIndex((record) => originOfRecord(record) !== planOrigin);
245
+ if (other !== -1) {
246
+ return {
247
+ ok: false,
248
+ response: transactionOperationFailure(operationFailure("A2004", {
249
+ message: "Transaction plan failed framework validation.",
250
+ issues: [
251
+ validationIssue("V1020", [], VALIDATION_CODE_MESSAGES.V1020),
252
+ ],
253
+ }), other),
254
+ };
255
+ }
256
+ }
134
257
  for (const [index, record] of records.entries()) {
135
- for (const { path, placeholder } of placeholderSites(record.args)) {
258
+ for (const { path, placeholder } of recordPlaceholderSites(record)) {
136
259
  if (!positions.has(placeholder.source)) {
137
260
  return {
138
261
  ok: false,
139
- response: referenceFailure(validationIssue("V1010", ["operations", index, "args", ...path, "$ref"], "Transaction reference names an operation that is not in this transaction."), index),
262
+ response: referenceFailure(validationIssue("V1010", [
263
+ "operations",
264
+ index,
265
+ record.kind === "sql" ? "values" : "args",
266
+ ...path,
267
+ "$ref",
268
+ ], "Transaction reference names an operation that is not in this transaction."), index),
140
269
  };
141
270
  }
142
271
  }
@@ -152,6 +281,9 @@ export function createTransactionPlanAssembler(contracts, protocol, misuse) {
152
281
  };
153
282
  const materialize = async (index) => {
154
283
  const record = records[index];
284
+ if (record.kind === "sql") {
285
+ return SQL_STEP_NODE;
286
+ }
155
287
  const bound = new Map();
156
288
  await Promise.all(placeholderSites(record.args).map(async ({ object, placeholder }) => {
157
289
  const operation = positions.get(placeholder.source);
@@ -160,7 +292,7 @@ export function createTransactionPlanAssembler(contracts, protocol, misuse) {
160
292
  $ref: { operation, fingerprint, path: [placeholder.field] },
161
293
  });
162
294
  }));
163
- const args = rebuildArguments(record.args, [], (value) => typeof value === "object" && value !== null && bound.has(value)
295
+ const args = rebuildArguments(record.args, (value) => typeof value === "object" && value !== null && bound.has(value)
164
296
  ? bound.get(value)
165
297
  : KEEP);
166
298
  return {
@@ -192,9 +324,14 @@ export function createTransactionPlanAssembler(contracts, protocol, misuse) {
192
324
  plan: {
193
325
  operations: await Promise.all(records.map((_, index) => nodeAt(index))),
194
326
  },
195
- origins: records.map((record) => originOf(record.origin)),
196
- refused: new Map(records.flatMap((record, index) => record.refused === undefined ? [] : [[index, record.refused]])),
327
+ origins: records.map((record) => originOf(record.kind === "sql" ? "application" : record.origin)),
328
+ refused: new Map(records.flatMap((record, index) => record.kind === "sql" || record.refused === undefined
329
+ ? []
330
+ : [[index, record.refused]])),
331
+ statements: new Map(records.flatMap((record, index) => record.kind === "sql"
332
+ ? [[index, planSqlStatement(record, positions)]]
333
+ : [])),
197
334
  };
198
335
  };
199
- return { defer, assemble };
336
+ return { defer, deferSql, assemble };
200
337
  }
@@ -1,15 +1,16 @@
1
- import type { AdapterModel } from "../adapters/adapter-model.js";
2
- import type { Contract } from "../contracts/contract.js";
3
- import type { ScalarField } from "../contracts/field.js";
1
+ import type { AvAdapterModel } from "../adapters/adapter-model.js";
2
+ import type { AvContract } from "../contracts/contract.js";
3
+ import type { AvScalarField } from "../contracts/field.js";
4
4
  import type { SemanticOperationArguments } from "../operations/operation-validator.js";
5
- import { CallerDataError } from "../runtime/caller-data.copier.js";
5
+ import { AvCallerDataError } from "../runtime/caller-data.copier.js";
6
6
  import { type ReadProjectionPlan } from "../runtime/computed-read-runtime.js";
7
7
  import type { FrameworkOperationRequest } from "../runtime/operation-request.js";
8
- import type { OperationFailureResponse } from "../runtime/operation-response.js";
8
+ import type { AvOperationFailureResponse } from "../runtime/operation-response.js";
9
9
  import type { OperationPipelineDependencies } from "../runtime/operation-runtime.js";
10
10
  import type { CascadeClosure } from "../runtime/referential-action.js";
11
11
  import type { OperationFingerprint } from "./deferred-operation.js";
12
- import type { TransactionReference } from "./transaction-reference.js";
12
+ import type { PlannedSqlStatement, ValidatedSqlStatement } from "./sql-statement.js";
13
+ import type { AvTransactionReference } from "./transaction-reference.js";
13
14
  import { type TransactionSlotShape } from "./transaction-reference.js";
14
15
  import { type TransactionReferenceCandidateSlot } from "./transaction-reference-collector.js";
15
16
  import type { FrameworkTransactionRequest, TransactionOperationOrigin } from "./transaction-request.js";
@@ -22,26 +23,45 @@ import type { FrameworkTransactionRequest, TransactionOperationOrigin } from "./
22
23
  * await, so a step revoked or changed after the call is never read again;
23
24
  * - `"owned"` — a plan the protocol decoder parsed, or the typed runner assembled
24
25
  * from its builders' copies; `refused` names the steps whose arguments a builder
25
- * could not copy, answered at their turn.
26
+ * could not copy, answered at their turn, and `statements` the steps that are
27
+ * `appTx.$sql` statements, which only the typed runner builds: they have no wire
28
+ * form, so no plan a caller or a remote client hands in can hold one.
26
29
  */
27
30
  export type PlanArguments = {
28
31
  readonly source: "caller";
29
32
  } | {
30
33
  readonly source: "owned";
31
- readonly refused?: ReadonlyMap<number, CallerDataError>;
34
+ readonly refused?: ReadonlyMap<number, AvCallerDataError>;
35
+ readonly statements?: ReadonlyMap<number, PlannedSqlStatement>;
32
36
  };
37
+ /** A plan taken at a call, and the steps whose arguments could not be copied. */
38
+ export type CapturedPlan = {
39
+ readonly plan: unknown;
40
+ readonly refused: ReadonlyMap<number, AvCallerDataError>;
41
+ };
42
+ /**
43
+ * A host's parsed plan taken at `protocol.handleTransaction`'s call, before its first
44
+ * await (rc.2, e2e batch 2): its structure mirrored by descriptors, which is how this
45
+ * validator inspects it — so no getter it refuses runs, and every accessor stays one
46
+ * for it to refuse — and each step's `args` copied as {@link captureSteps} copies a
47
+ * caller's, its `$ref` control objects mirrored. Run as an `"owned"` plan with
48
+ * `refused`, it is answered exactly as the plan the host held at the call. A plan
49
+ * that is no object, or cannot be reflected, is returned as it is: nothing in it can
50
+ * change.
51
+ */
52
+ export declare function capturePlanAtCall(plan: unknown): CapturedPlan;
33
53
  export type { TransactionReferenceCandidateSlot } from "./transaction-reference-collector.js";
34
54
  /** One validated Transaction Slot: where it is, what it holds, and its reference. */
35
55
  export type TransactionReferenceSlot = {
36
56
  readonly path: readonly (string | number)[];
37
57
  /** The destination field. */
38
- readonly field: ScalarField<Contract>;
58
+ readonly field: AvScalarField<AvContract>;
39
59
  readonly shape: TransactionSlotShape;
40
60
  /** The slot is a scalar value of mutation data: what it resolves to is written. */
41
61
  readonly written: boolean;
42
62
  /** The source field, under its own step's Contract: what the slot receives. */
43
- readonly source: ScalarField<Contract>;
44
- readonly reference: TransactionReference;
63
+ readonly source: AvScalarField<AvContract>;
64
+ readonly reference: AvTransactionReference;
45
65
  };
46
66
  export type CandidateTransactionOperation = {
47
67
  readonly index: number;
@@ -52,21 +72,24 @@ export type CandidateTransactionOperation = {
52
72
  readonly candidates: readonly TransactionReferenceCandidateSlot[];
53
73
  };
54
74
  export type ValidatedTransactionOperation = {
75
+ readonly kind: "operation";
55
76
  readonly index: number;
56
77
  readonly request: FrameworkOperationRequest;
57
78
  /**
58
- * The Contract of this operation's own origin: the one it was validated
59
- * against, the one it runs under, and the one a later `$ref` reads its source
60
- * field from. One plan may carry steps of both origins.
79
+ * The Contract of this operation's origin, which is the plan's: the one it was
80
+ * validated against, the one it runs under, and the one a later `$ref` reads its
81
+ * source field from.
61
82
  */
62
- readonly contract: Contract;
83
+ readonly contract: AvContract;
63
84
  readonly arguments: SemanticOperationArguments;
64
85
  readonly projection: ReadProjectionPlan | undefined;
65
86
  readonly fingerprint: OperationFingerprint;
66
87
  readonly references: readonly TransactionReferenceSlot[];
67
88
  };
89
+ /** One validated plan step: a standard operation, or an `appTx.$sql` statement. */
90
+ export type ValidatedTransactionStep = ValidatedTransactionOperation | ValidatedSqlStatement;
68
91
  export type ValidatedTransactionPlan = {
69
- readonly operations: readonly ValidatedTransactionOperation[];
92
+ readonly operations: readonly ValidatedTransactionStep[];
70
93
  };
71
94
  /**
72
95
  * What validating a plan needs beyond one operation's pipeline: the cascade
@@ -74,23 +97,25 @@ export type ValidatedTransactionPlan = {
74
97
  * Framework is constructed. The record-write facts are not among them: they
75
98
  * are checked when each operation runs, after its pipes.
76
99
  */
77
- export type TransactionPlanDependencies<M extends AdapterModel> = Omit<OperationPipelineDependencies<M>, "recordWrites"> & {
100
+ export type TransactionPlanDependencies<M extends AvAdapterModel> = Omit<OperationPipelineDependencies<M>, "recordWrites" | "contexts" | "fieldStages"> & {
78
101
  readonly cascades: CascadeClosure;
102
+ /** Whether the Adapter declares `sqlStatements`: read once, at construction. */
103
+ readonly sqlStatements: boolean;
79
104
  };
80
105
  export type TransactionPlanValidationResult = {
81
106
  readonly ok: true;
82
107
  readonly plan: ValidatedTransactionPlan;
83
108
  } | {
84
109
  readonly ok: false;
85
- readonly response: OperationFailureResponse;
110
+ readonly response: AvOperationFailureResponse;
86
111
  };
87
112
  /**
88
113
  * The refusal of a plan on a Contract without transaction plans (`A2002`, one `V1006`
89
114
  * at `["operations"]`). The one spelling — the protocol's absence answer for
90
115
  * `/_transactions` is this envelope too.
91
116
  */
92
- export declare function transactionsUnavailableFailure(): OperationFailureResponse;
117
+ export declare function transactionsUnavailableFailure(): AvOperationFailureResponse;
93
118
  /**
94
119
  * Whole-plan Framework Validation Layer for transaction structure and identity.
95
120
  */
96
- export declare function validateTransactionPlan<M extends AdapterModel>(dependencies: TransactionPlanDependencies<M>, request: FrameworkTransactionRequest, origins?: readonly TransactionOperationOrigin[], planArguments?: PlanArguments): Promise<TransactionPlanValidationResult>;
121
+ export declare function validateTransactionPlan<M extends AvAdapterModel>(dependencies: TransactionPlanDependencies<M>, request: FrameworkTransactionRequest, origins?: readonly TransactionOperationOrigin[], planArguments?: PlanArguments): Promise<TransactionPlanValidationResult>;