@innovatorstack/harness 0.0.0-stage → 0.1.1

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 (1060) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -2
  3. package/assets/brand/icon-on-dark.png +0 -0
  4. package/assets/brand/icon.png +0 -0
  5. package/assets/brand/mark-on-dark.svg +6 -0
  6. package/assets/brand/mark.svg +6 -0
  7. package/assets/brand/social-preview.png +0 -0
  8. package/assets/brand/social-preview.svg +13 -0
  9. package/dist/baseline/catalog.d.ts +5 -0
  10. package/dist/baseline/catalog.d.ts.map +1 -0
  11. package/dist/baseline/catalog.js +32 -0
  12. package/dist/baseline/catalog.js.map +1 -0
  13. package/dist/baseline/data/item-types.json +1062 -0
  14. package/dist/baseline/data/properties.json +31286 -0
  15. package/dist/baseline/data/records.json +6666 -0
  16. package/dist/baseline/data/relationships.json +393 -0
  17. package/dist/baseline/database.bin +0 -0
  18. package/dist/baseline/database.d.ts +4 -0
  19. package/dist/baseline/database.d.ts.map +1 -0
  20. package/dist/baseline/database.js +33 -0
  21. package/dist/baseline/database.js.map +1 -0
  22. package/dist/baseline/source.d.ts +5 -0
  23. package/dist/baseline/source.d.ts.map +1 -0
  24. package/dist/baseline/source.js +13 -0
  25. package/dist/baseline/source.js.map +1 -0
  26. package/dist/compatibility/capabilities.d.ts +49 -0
  27. package/dist/compatibility/capabilities.d.ts.map +1 -0
  28. package/dist/compatibility/capabilities.js +605 -0
  29. package/dist/compatibility/capabilities.js.map +1 -0
  30. package/dist/compatibility/check.d.ts +5 -0
  31. package/dist/compatibility/check.d.ts.map +1 -0
  32. package/dist/compatibility/check.js +332 -0
  33. package/dist/compatibility/check.js.map +1 -0
  34. package/dist/compatibility/executions.d.ts +11 -0
  35. package/dist/compatibility/executions.d.ts.map +1 -0
  36. package/dist/compatibility/executions.js +79 -0
  37. package/dist/compatibility/executions.js.map +1 -0
  38. package/dist/compatibility/executors.d.ts +21 -0
  39. package/dist/compatibility/executors.d.ts.map +1 -0
  40. package/dist/compatibility/executors.js +151 -0
  41. package/dist/compatibility/executors.js.map +1 -0
  42. package/dist/compatibility/index.d.ts +6 -0
  43. package/dist/compatibility/index.d.ts.map +1 -0
  44. package/dist/compatibility/index.js +4 -0
  45. package/dist/compatibility/index.js.map +1 -0
  46. package/dist/compatibility/metadata.d.ts +6 -0
  47. package/dist/compatibility/metadata.d.ts.map +1 -0
  48. package/dist/compatibility/metadata.js +137 -0
  49. package/dist/compatibility/metadata.js.map +1 -0
  50. package/dist/compatibility/mocks.d.ts +4 -0
  51. package/dist/compatibility/mocks.d.ts.map +1 -0
  52. package/dist/compatibility/mocks.js +22 -0
  53. package/dist/compatibility/mocks.js.map +1 -0
  54. package/dist/compatibility/revisions.d.ts +5 -0
  55. package/dist/compatibility/revisions.d.ts.map +1 -0
  56. package/dist/compatibility/revisions.js +34 -0
  57. package/dist/compatibility/revisions.js.map +1 -0
  58. package/dist/compatibility/security.d.ts +6 -0
  59. package/dist/compatibility/security.d.ts.map +1 -0
  60. package/dist/compatibility/security.js +74 -0
  61. package/dist/compatibility/security.js.map +1 -0
  62. package/dist/compatibility/sources.d.ts +6 -0
  63. package/dist/compatibility/sources.d.ts.map +1 -0
  64. package/dist/compatibility/sources.js +20 -0
  65. package/dist/compatibility/sources.js.map +1 -0
  66. package/dist/compatibility/types.d.ts +130 -0
  67. package/dist/compatibility/types.d.ts.map +1 -0
  68. package/dist/compatibility/types.js +48 -0
  69. package/dist/compatibility/types.js.map +1 -0
  70. package/dist/controls/clock.d.ts +23 -0
  71. package/dist/controls/clock.d.ts.map +1 -0
  72. package/dist/controls/clock.js +74 -0
  73. package/dist/controls/clock.js.map +1 -0
  74. package/dist/controls/execution.d.ts +8 -0
  75. package/dist/controls/execution.d.ts.map +1 -0
  76. package/dist/controls/execution.js +36 -0
  77. package/dist/controls/execution.js.map +1 -0
  78. package/dist/controls/failure-types.d.ts +52 -0
  79. package/dist/controls/failure-types.d.ts.map +1 -0
  80. package/dist/controls/failure-types.js +15 -0
  81. package/dist/controls/failure-types.js.map +1 -0
  82. package/dist/controls/failure-validation.d.ts +17 -0
  83. package/dist/controls/failure-validation.d.ts.map +1 -0
  84. package/dist/controls/failure-validation.js +63 -0
  85. package/dist/controls/failure-validation.js.map +1 -0
  86. package/dist/controls/failures.d.ts +20 -0
  87. package/dist/controls/failures.d.ts.map +1 -0
  88. package/dist/controls/failures.js +128 -0
  89. package/dist/controls/failures.js.map +1 -0
  90. package/dist/controls/ids.d.ts +24 -0
  91. package/dist/controls/ids.d.ts.map +1 -0
  92. package/dist/controls/ids.js +63 -0
  93. package/dist/controls/ids.js.map +1 -0
  94. package/dist/controls/observers.d.ts +20 -0
  95. package/dist/controls/observers.d.ts.map +1 -0
  96. package/dist/controls/observers.js +80 -0
  97. package/dist/controls/observers.js.map +1 -0
  98. package/dist/controls/state.d.ts +10 -0
  99. package/dist/controls/state.d.ts.map +1 -0
  100. package/dist/controls/state.js +50 -0
  101. package/dist/controls/state.js.map +1 -0
  102. package/dist/controls/targets.d.ts +19 -0
  103. package/dist/controls/targets.d.ts.map +1 -0
  104. package/dist/controls/targets.js +82 -0
  105. package/dist/controls/targets.js.map +1 -0
  106. package/dist/controls/values.d.ts +23 -0
  107. package/dist/controls/values.d.ts.map +1 -0
  108. package/dist/controls/values.js +27 -0
  109. package/dist/controls/values.js.map +1 -0
  110. package/dist/controls/world.d.ts +18 -0
  111. package/dist/controls/world.d.ts.map +1 -0
  112. package/dist/controls/world.js +26 -0
  113. package/dist/controls/world.js.map +1 -0
  114. package/dist/core/budget.d.ts +9 -0
  115. package/dist/core/budget.d.ts.map +1 -0
  116. package/dist/core/budget.js +23 -0
  117. package/dist/core/budget.js.map +1 -0
  118. package/dist/core/context.d.ts +8 -0
  119. package/dist/core/context.d.ts.map +1 -0
  120. package/dist/core/context.js +38 -0
  121. package/dist/core/context.js.map +1 -0
  122. package/dist/core/data.d.ts +16 -0
  123. package/dist/core/data.d.ts.map +1 -0
  124. package/dist/core/data.js +197 -0
  125. package/dist/core/data.js.map +1 -0
  126. package/dist/core/deadline.d.ts +12 -0
  127. package/dist/core/deadline.d.ts.map +1 -0
  128. package/dist/core/deadline.js +38 -0
  129. package/dist/core/deadline.js.map +1 -0
  130. package/dist/core/errors.d.ts +7 -0
  131. package/dist/core/errors.d.ts.map +1 -0
  132. package/dist/core/errors.js +15 -0
  133. package/dist/core/errors.js.map +1 -0
  134. package/dist/core/files.d.ts +8 -0
  135. package/dist/core/files.d.ts.map +1 -0
  136. package/dist/core/files.js +98 -0
  137. package/dist/core/files.js.map +1 -0
  138. package/dist/core/index.d.ts +7 -0
  139. package/dist/core/index.d.ts.map +1 -0
  140. package/dist/core/index.js +4 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/limits.d.ts +15 -0
  143. package/dist/core/limits.d.ts.map +1 -0
  144. package/dist/core/limits.js +15 -0
  145. package/dist/core/limits.js.map +1 -0
  146. package/dist/core/modules.d.ts +3 -0
  147. package/dist/core/modules.d.ts.map +1 -0
  148. package/dist/core/modules.js +68 -0
  149. package/dist/core/modules.js.map +1 -0
  150. package/dist/core/operation.d.ts +18 -0
  151. package/dist/core/operation.d.ts.map +1 -0
  152. package/dist/core/operation.js +21 -0
  153. package/dist/core/operation.js.map +1 -0
  154. package/dist/core/process.d.ts +3 -0
  155. package/dist/core/process.d.ts.map +1 -0
  156. package/dist/core/process.js +44 -0
  157. package/dist/core/process.js.map +1 -0
  158. package/dist/core/resources.d.ts +3 -0
  159. package/dist/core/resources.d.ts.map +1 -0
  160. package/dist/core/resources.js +28 -0
  161. package/dist/core/resources.js.map +1 -0
  162. package/dist/core/runtime.d.ts +54 -0
  163. package/dist/core/runtime.d.ts.map +1 -0
  164. package/dist/core/runtime.js +565 -0
  165. package/dist/core/runtime.js.map +1 -0
  166. package/dist/core/types.d.ts +61 -0
  167. package/dist/core/types.d.ts.map +1 -0
  168. package/dist/core/types.js +1 -0
  169. package/dist/core/types.js.map +1 -0
  170. package/dist/diagnostics/source-location.d.ts +7 -0
  171. package/dist/diagnostics/source-location.d.ts.map +1 -0
  172. package/dist/diagnostics/source-location.js +1 -0
  173. package/dist/diagnostics/source-location.js.map +1 -0
  174. package/dist/engine/instance.d.ts +57 -0
  175. package/dist/engine/instance.d.ts.map +1 -0
  176. package/dist/engine/instance.js +281 -0
  177. package/dist/engine/instance.js.map +1 -0
  178. package/dist/engine.d.ts +5 -0
  179. package/dist/engine.d.ts.map +1 -0
  180. package/dist/engine.js +6 -0
  181. package/dist/engine.js.map +1 -0
  182. package/dist/fixtures/module.d.ts +5 -0
  183. package/dist/fixtures/module.d.ts.map +1 -0
  184. package/dist/fixtures/module.js +112 -0
  185. package/dist/fixtures/module.js.map +1 -0
  186. package/dist/fixtures/types.d.ts +7 -0
  187. package/dist/fixtures/types.d.ts.map +1 -0
  188. package/dist/fixtures/types.js +1 -0
  189. package/dist/fixtures/types.js.map +1 -0
  190. package/dist/harness/configuration.d.ts +53 -0
  191. package/dist/harness/configuration.d.ts.map +1 -0
  192. package/dist/harness/configuration.js +279 -0
  193. package/dist/harness/configuration.js.map +1 -0
  194. package/dist/harness/create.d.ts +5 -0
  195. package/dist/harness/create.d.ts.map +1 -0
  196. package/dist/harness/create.js +156 -0
  197. package/dist/harness/create.js.map +1 -0
  198. package/dist/harness/extensions.d.ts +8 -0
  199. package/dist/harness/extensions.d.ts.map +1 -0
  200. package/dist/harness/extensions.js +58 -0
  201. package/dist/harness/extensions.js.map +1 -0
  202. package/dist/harness/fixtures.d.ts +9 -0
  203. package/dist/harness/fixtures.d.ts.map +1 -0
  204. package/dist/harness/fixtures.js +130 -0
  205. package/dist/harness/fixtures.js.map +1 -0
  206. package/dist/harness/runtime-identity.d.ts +3 -0
  207. package/dist/harness/runtime-identity.d.ts.map +1 -0
  208. package/dist/harness/runtime-identity.js +30 -0
  209. package/dist/harness/runtime-identity.js.map +1 -0
  210. package/dist/harness/setup-cache.d.ts +11 -0
  211. package/dist/harness/setup-cache.d.ts.map +1 -0
  212. package/dist/harness/setup-cache.js +40 -0
  213. package/dist/harness/setup-cache.js.map +1 -0
  214. package/dist/harness/setup-image.d.ts +5 -0
  215. package/dist/harness/setup-image.d.ts.map +1 -0
  216. package/dist/harness/setup-image.js +118 -0
  217. package/dist/harness/setup-image.js.map +1 -0
  218. package/dist/harness/setup-imports.d.ts +3 -0
  219. package/dist/harness/setup-imports.d.ts.map +1 -0
  220. package/dist/harness/setup-imports.js +30 -0
  221. package/dist/harness/setup-imports.js.map +1 -0
  222. package/dist/harness/setup-inputs.d.ts +12 -0
  223. package/dist/harness/setup-inputs.d.ts.map +1 -0
  224. package/dist/harness/setup-inputs.js +47 -0
  225. package/dist/harness/setup-inputs.js.map +1 -0
  226. package/dist/harness/setup-module.d.ts +3 -0
  227. package/dist/harness/setup-module.d.ts.map +1 -0
  228. package/dist/harness/setup-module.js +150 -0
  229. package/dist/harness/setup-module.js.map +1 -0
  230. package/dist/harness/world.d.ts +36 -0
  231. package/dist/harness/world.d.ts.map +1 -0
  232. package/dist/harness/world.js +171 -0
  233. package/dist/harness/world.js.map +1 -0
  234. package/dist/index.d.ts +30 -0
  235. package/dist/index.d.ts.map +1 -0
  236. package/dist/index.js +13 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/instrumentation/failures.d.ts +5 -0
  239. package/dist/instrumentation/failures.d.ts.map +1 -0
  240. package/dist/instrumentation/failures.js +94 -0
  241. package/dist/instrumentation/failures.js.map +1 -0
  242. package/dist/instrumentation/recorder.d.ts +38 -0
  243. package/dist/instrumentation/recorder.d.ts.map +1 -0
  244. package/dist/instrumentation/recorder.js +372 -0
  245. package/dist/instrumentation/recorder.js.map +1 -0
  246. package/dist/instrumentation/snapshots.d.ts +20 -0
  247. package/dist/instrumentation/snapshots.d.ts.map +1 -0
  248. package/dist/instrumentation/snapshots.js +177 -0
  249. package/dist/instrumentation/snapshots.js.map +1 -0
  250. package/dist/instrumentation/types.d.ts +107 -0
  251. package/dist/instrumentation/types.d.ts.map +1 -0
  252. package/dist/instrumentation/types.js +25 -0
  253. package/dist/instrumentation/types.js.map +1 -0
  254. package/dist/items/codec.d.ts +4 -0
  255. package/dist/items/codec.d.ts.map +1 -0
  256. package/dist/items/codec.js +137 -0
  257. package/dist/items/codec.js.map +1 -0
  258. package/dist/items/item.d.ts +58 -0
  259. package/dist/items/item.d.ts.map +1 -0
  260. package/dist/items/item.js +145 -0
  261. package/dist/items/item.js.map +1 -0
  262. package/dist/items/logical.d.ts +23 -0
  263. package/dist/items/logical.d.ts.map +1 -0
  264. package/dist/items/logical.js +92 -0
  265. package/dist/items/logical.js.map +1 -0
  266. package/dist/items/origins.d.ts +7 -0
  267. package/dist/items/origins.d.ts.map +1 -0
  268. package/dist/items/origins.js +102 -0
  269. package/dist/items/origins.js.map +1 -0
  270. package/dist/items/xml.d.ts +7 -0
  271. package/dist/items/xml.d.ts.map +1 -0
  272. package/dist/items/xml.js +134 -0
  273. package/dist/items/xml.js.map +1 -0
  274. package/dist/methods/csharp/base-input.d.ts +30 -0
  275. package/dist/methods/csharp/base-input.d.ts.map +1 -0
  276. package/dist/methods/csharp/base-input.js +140 -0
  277. package/dist/methods/csharp/base-input.js.map +1 -0
  278. package/dist/methods/csharp/cache.d.ts +3 -0
  279. package/dist/methods/csharp/cache.d.ts.map +1 -0
  280. package/dist/methods/csharp/cache.js +52 -0
  281. package/dist/methods/csharp/cache.js.map +1 -0
  282. package/dist/methods/csharp/callbacks.d.ts +12 -0
  283. package/dist/methods/csharp/callbacks.d.ts.map +1 -0
  284. package/dist/methods/csharp/callbacks.js +75 -0
  285. package/dist/methods/csharp/callbacks.js.map +1 -0
  286. package/dist/methods/csharp/compiler.d.ts +26 -0
  287. package/dist/methods/csharp/compiler.d.ts.map +1 -0
  288. package/dist/methods/csharp/compiler.js +253 -0
  289. package/dist/methods/csharp/compiler.js.map +1 -0
  290. package/dist/methods/csharp/context.d.ts +17 -0
  291. package/dist/methods/csharp/context.d.ts.map +1 -0
  292. package/dist/methods/csharp/context.js +65 -0
  293. package/dist/methods/csharp/context.js.map +1 -0
  294. package/dist/methods/csharp/documents.d.ts +13 -0
  295. package/dist/methods/csharp/documents.d.ts.map +1 -0
  296. package/dist/methods/csharp/documents.js +128 -0
  297. package/dist/methods/csharp/documents.js.map +1 -0
  298. package/dist/methods/csharp/executor.d.ts +35 -0
  299. package/dist/methods/csharp/executor.d.ts.map +1 -0
  300. package/dist/methods/csharp/executor.js +363 -0
  301. package/dist/methods/csharp/executor.js.map +1 -0
  302. package/dist/methods/csharp/index.d.ts +4 -0
  303. package/dist/methods/csharp/index.d.ts.map +1 -0
  304. package/dist/methods/csharp/index.js +3 -0
  305. package/dist/methods/csharp/index.js.map +1 -0
  306. package/dist/methods/csharp/managed/CallContext.cs +21 -0
  307. package/dist/methods/csharp/managed/Connections.cs +27 -0
  308. package/dist/methods/csharp/managed/ContextSafety.cs +219 -0
  309. package/dist/methods/csharp/managed/DomChanges.cs +39 -0
  310. package/dist/methods/csharp/managed/ErrorLookup.cs +28 -0
  311. package/dist/methods/csharp/managed/EventMetadata.cs +45 -0
  312. package/dist/methods/csharp/managed/GlobalUsings.cs.template +9 -0
  313. package/dist/methods/csharp/managed/Identity.cs +30 -0
  314. package/dist/methods/csharp/managed/InOut.cs.template +42 -0
  315. package/dist/methods/csharp/managed/InOutInvocation.cs +41 -0
  316. package/dist/methods/csharp/managed/Innovator.cs +106 -0
  317. package/dist/methods/csharp/managed/Item.cs +515 -0
  318. package/dist/methods/csharp/managed/ItemDocuments.cs +62 -0
  319. package/dist/methods/csharp/managed/ItemXml.cs +465 -0
  320. package/dist/methods/csharp/managed/LogicalData.cs +20 -0
  321. package/dist/methods/csharp/managed/LogicalXml.cs +181 -0
  322. package/dist/methods/csharp/managed/ManagedDocuments.cs +48 -0
  323. package/dist/methods/csharp/managed/Method.cs.template +30 -0
  324. package/dist/methods/csharp/managed/MethodAssemblies.cs +83 -0
  325. package/dist/methods/csharp/managed/MethodContext.cs +44 -0
  326. package/dist/methods/csharp/managed/MethodEventArgs.cs +64 -0
  327. package/dist/methods/csharp/managed/MethodInvocation.cs +201 -0
  328. package/dist/methods/csharp/managed/NuGet.Config +6 -0
  329. package/dist/methods/csharp/managed/PayloadXml.cs +38 -0
  330. package/dist/methods/csharp/managed/Permissions.cs +47 -0
  331. package/dist/methods/csharp/managed/Program.cs +83 -0
  332. package/dist/methods/csharp/managed/PropertyItems.cs +46 -0
  333. package/dist/methods/csharp/managed/Protocol.cs +204 -0
  334. package/dist/methods/csharp/managed/ProtocolInput.cs +67 -0
  335. package/dist/methods/csharp/managed/ProtocolJson.cs +13 -0
  336. package/dist/methods/csharp/managed/RemoteContext.cs +33 -0
  337. package/dist/methods/csharp/managed/RequestOrigins.cs +207 -0
  338. package/dist/methods/csharp/managed/RequestRelationships.cs +129 -0
  339. package/dist/methods/csharp/managed/RequestXml.cs +237 -0
  340. package/dist/methods/csharp/managed/ResponseXml.cs +114 -0
  341. package/dist/methods/csharp/managed/ServerEventArgs.cs +223 -0
  342. package/dist/methods/csharp/managed/WorkLimits.cs +11 -0
  343. package/dist/methods/csharp/managed/Worker.csproj +23 -0
  344. package/dist/methods/csharp/managed/XmlProperties.cs +32 -0
  345. package/dist/methods/csharp/managed/XmlTraversal.cs +138 -0
  346. package/dist/methods/csharp/method-build.d.ts +11 -0
  347. package/dist/methods/csharp/method-build.d.ts.map +1 -0
  348. package/dist/methods/csharp/method-build.js +96 -0
  349. package/dist/methods/csharp/method-build.js.map +1 -0
  350. package/dist/methods/csharp/origins.d.ts +17 -0
  351. package/dist/methods/csharp/origins.d.ts.map +1 -0
  352. package/dist/methods/csharp/origins.js +78 -0
  353. package/dist/methods/csharp/origins.js.map +1 -0
  354. package/dist/methods/csharp/protocol.d.ts +6 -0
  355. package/dist/methods/csharp/protocol.d.ts.map +1 -0
  356. package/dist/methods/csharp/protocol.js +78 -0
  357. package/dist/methods/csharp/protocol.js.map +1 -0
  358. package/dist/methods/csharp/relationship-order.d.ts +8 -0
  359. package/dist/methods/csharp/relationship-order.d.ts.map +1 -0
  360. package/dist/methods/csharp/relationship-order.js +51 -0
  361. package/dist/methods/csharp/relationship-order.js.map +1 -0
  362. package/dist/methods/csharp/request-change.d.ts +27 -0
  363. package/dist/methods/csharp/request-change.d.ts.map +1 -0
  364. package/dist/methods/csharp/request-change.js +238 -0
  365. package/dist/methods/csharp/request-change.js.map +1 -0
  366. package/dist/methods/csharp/retained-items.d.ts +9 -0
  367. package/dist/methods/csharp/retained-items.d.ts.map +1 -0
  368. package/dist/methods/csharp/retained-items.js +95 -0
  369. package/dist/methods/csharp/retained-items.js.map +1 -0
  370. package/dist/methods/csharp/security.d.ts +13 -0
  371. package/dist/methods/csharp/security.d.ts.map +1 -0
  372. package/dist/methods/csharp/security.js +82 -0
  373. package/dist/methods/csharp/security.js.map +1 -0
  374. package/dist/methods/csharp/templates.d.ts +5 -0
  375. package/dist/methods/csharp/templates.d.ts.map +1 -0
  376. package/dist/methods/csharp/templates.js +66 -0
  377. package/dist/methods/csharp/templates.js.map +1 -0
  378. package/dist/methods/csharp/worker.d.ts +31 -0
  379. package/dist/methods/csharp/worker.d.ts.map +1 -0
  380. package/dist/methods/csharp/worker.js +172 -0
  381. package/dist/methods/csharp/worker.js.map +1 -0
  382. package/dist/methods/event-data.d.ts +31 -0
  383. package/dist/methods/event-data.d.ts.map +1 -0
  384. package/dist/methods/event-data.js +8 -0
  385. package/dist/methods/event-data.js.map +1 -0
  386. package/dist/methods/types.d.ts +47 -0
  387. package/dist/methods/types.d.ts.map +1 -0
  388. package/dist/methods/types.js +2 -0
  389. package/dist/methods/types.js.map +1 -0
  390. package/dist/mocks/configuration.d.ts +5 -0
  391. package/dist/mocks/configuration.d.ts.map +1 -0
  392. package/dist/mocks/configuration.js +102 -0
  393. package/dist/mocks/configuration.js.map +1 -0
  394. package/dist/mocks/parameters.d.ts +3 -0
  395. package/dist/mocks/parameters.d.ts.map +1 -0
  396. package/dist/mocks/parameters.js +16 -0
  397. package/dist/mocks/parameters.js.map +1 -0
  398. package/dist/mocks/registry.d.ts +39 -0
  399. package/dist/mocks/registry.d.ts.map +1 -0
  400. package/dist/mocks/registry.js +129 -0
  401. package/dist/mocks/registry.js.map +1 -0
  402. package/dist/mocks/response.d.ts +10 -0
  403. package/dist/mocks/response.d.ts.map +1 -0
  404. package/dist/mocks/response.js +94 -0
  405. package/dist/mocks/response.js.map +1 -0
  406. package/dist/mocks/types.d.ts +34 -0
  407. package/dist/mocks/types.d.ts.map +1 -0
  408. package/dist/mocks/types.js +1 -0
  409. package/dist/mocks/types.js.map +1 -0
  410. package/dist/packages/bootstrap.d.ts +10 -0
  411. package/dist/packages/bootstrap.d.ts.map +1 -0
  412. package/dist/packages/bootstrap.js +66 -0
  413. package/dist/packages/bootstrap.js.map +1 -0
  414. package/dist/packages/candidates.d.ts +13 -0
  415. package/dist/packages/candidates.d.ts.map +1 -0
  416. package/dist/packages/candidates.js +43 -0
  417. package/dist/packages/candidates.js.map +1 -0
  418. package/dist/packages/defaults.d.ts +11 -0
  419. package/dist/packages/defaults.d.ts.map +1 -0
  420. package/dist/packages/defaults.js +104 -0
  421. package/dist/packages/defaults.js.map +1 -0
  422. package/dist/packages/diagnostics.d.ts +22 -0
  423. package/dist/packages/diagnostics.d.ts.map +1 -0
  424. package/dist/packages/diagnostics.js +25 -0
  425. package/dist/packages/diagnostics.js.map +1 -0
  426. package/dist/packages/draft.d.ts +66 -0
  427. package/dist/packages/draft.d.ts.map +1 -0
  428. package/dist/packages/draft.js +186 -0
  429. package/dist/packages/draft.js.map +1 -0
  430. package/dist/packages/elements.d.ts +11 -0
  431. package/dist/packages/elements.d.ts.map +1 -0
  432. package/dist/packages/elements.js +58 -0
  433. package/dist/packages/elements.js.map +1 -0
  434. package/dist/packages/evaluation.d.ts +16 -0
  435. package/dist/packages/evaluation.d.ts.map +1 -0
  436. package/dist/packages/evaluation.js +71 -0
  437. package/dist/packages/evaluation.js.map +1 -0
  438. package/dist/packages/files.d.ts +21 -0
  439. package/dist/packages/files.d.ts.map +1 -0
  440. package/dist/packages/files.js +214 -0
  441. package/dist/packages/files.js.map +1 -0
  442. package/dist/packages/importer.d.ts +23 -0
  443. package/dist/packages/importer.d.ts.map +1 -0
  444. package/dist/packages/importer.js +791 -0
  445. package/dist/packages/importer.js.map +1 -0
  446. package/dist/packages/index.d.ts +8 -0
  447. package/dist/packages/index.d.ts.map +1 -0
  448. package/dist/packages/index.js +6 -0
  449. package/dist/packages/index.js.map +1 -0
  450. package/dist/packages/manifest.d.ts +3 -0
  451. package/dist/packages/manifest.d.ts.map +1 -0
  452. package/dist/packages/manifest.js +84 -0
  453. package/dist/packages/manifest.js.map +1 -0
  454. package/dist/packages/module.d.ts +11 -0
  455. package/dist/packages/module.d.ts.map +1 -0
  456. package/dist/packages/module.js +14 -0
  457. package/dist/packages/module.js.map +1 -0
  458. package/dist/packages/parser.d.ts +12 -0
  459. package/dist/packages/parser.d.ts.map +1 -0
  460. package/dist/packages/parser.js +258 -0
  461. package/dist/packages/parser.js.map +1 -0
  462. package/dist/packages/plan.d.ts +55 -0
  463. package/dist/packages/plan.d.ts.map +1 -0
  464. package/dist/packages/plan.js +542 -0
  465. package/dist/packages/plan.js.map +1 -0
  466. package/dist/packages/schema.d.ts +9 -0
  467. package/dist/packages/schema.d.ts.map +1 -0
  468. package/dist/packages/schema.js +347 -0
  469. package/dist/packages/schema.js.map +1 -0
  470. package/dist/packages/selector.d.ts +9 -0
  471. package/dist/packages/selector.d.ts.map +1 -0
  472. package/dist/packages/selector.js +61 -0
  473. package/dist/packages/selector.js.map +1 -0
  474. package/dist/packages/state.d.ts +6 -0
  475. package/dist/packages/state.d.ts.map +1 -0
  476. package/dist/packages/state.js +62 -0
  477. package/dist/packages/state.js.map +1 -0
  478. package/dist/packages/types.d.ts +22 -0
  479. package/dist/packages/types.d.ts.map +1 -0
  480. package/dist/packages/types.js +1 -0
  481. package/dist/packages/types.js.map +1 -0
  482. package/dist/platform/action-responses.d.ts +14 -0
  483. package/dist/platform/action-responses.d.ts.map +1 -0
  484. package/dist/platform/action-responses.js +85 -0
  485. package/dist/platform/action-responses.js.map +1 -0
  486. package/dist/platform/actions.d.ts +12 -0
  487. package/dist/platform/actions.d.ts.map +1 -0
  488. package/dist/platform/actions.js +13 -0
  489. package/dist/platform/actions.js.map +1 -0
  490. package/dist/platform/catalog.d.ts +20 -0
  491. package/dist/platform/catalog.d.ts.map +1 -0
  492. package/dist/platform/catalog.js +155 -0
  493. package/dist/platform/catalog.js.map +1 -0
  494. package/dist/platform/classifications.d.ts +14 -0
  495. package/dist/platform/classifications.d.ts.map +1 -0
  496. package/dist/platform/classifications.js +100 -0
  497. package/dist/platform/classifications.js.map +1 -0
  498. package/dist/platform/creation.d.ts +4 -0
  499. package/dist/platform/creation.d.ts.map +1 -0
  500. package/dist/platform/creation.js +23 -0
  501. package/dist/platform/creation.js.map +1 -0
  502. package/dist/platform/engine.d.ts +127 -0
  503. package/dist/platform/engine.d.ts.map +1 -0
  504. package/dist/platform/engine.js +1210 -0
  505. package/dist/platform/engine.js.map +1 -0
  506. package/dist/platform/errors.d.ts +20 -0
  507. package/dist/platform/errors.d.ts.map +1 -0
  508. package/dist/platform/errors.js +28 -0
  509. package/dist/platform/errors.js.map +1 -0
  510. package/dist/platform/events/after.d.ts +22 -0
  511. package/dist/platform/events/after.d.ts.map +1 -0
  512. package/dist/platform/events/after.js +86 -0
  513. package/dist/platform/events/after.js.map +1 -0
  514. package/dist/platform/events/base-updates.d.ts +11 -0
  515. package/dist/platform/events/base-updates.d.ts.map +1 -0
  516. package/dist/platform/events/base-updates.js +43 -0
  517. package/dist/platform/events/base-updates.js.map +1 -0
  518. package/dist/platform/events/bindings.d.ts +13 -0
  519. package/dist/platform/events/bindings.d.ts.map +1 -0
  520. package/dist/platform/events/bindings.js +76 -0
  521. package/dist/platform/events/bindings.js.map +1 -0
  522. package/dist/platform/events/data.d.ts +5 -0
  523. package/dist/platform/events/data.d.ts.map +1 -0
  524. package/dist/platform/events/data.js +17 -0
  525. package/dist/platform/events/data.js.map +1 -0
  526. package/dist/platform/events/inheritance.d.ts +4 -0
  527. package/dist/platform/events/inheritance.d.ts.map +1 -0
  528. package/dist/platform/events/inheritance.js +56 -0
  529. package/dist/platform/events/inheritance.js.map +1 -0
  530. package/dist/platform/events/input.d.ts +5 -0
  531. package/dist/platform/events/input.d.ts.map +1 -0
  532. package/dist/platform/events/input.js +9 -0
  533. package/dist/platform/events/input.js.map +1 -0
  534. package/dist/platform/events/replacement.d.ts +14 -0
  535. package/dist/platform/events/replacement.d.ts.map +1 -0
  536. package/dist/platform/events/replacement.js +60 -0
  537. package/dist/platform/events/replacement.js.map +1 -0
  538. package/dist/platform/events/types.d.ts +31 -0
  539. package/dist/platform/events/types.d.ts.map +1 -0
  540. package/dist/platform/events/types.js +6 -0
  541. package/dist/platform/events/types.js.map +1 -0
  542. package/dist/platform/events/version.d.ts +5 -0
  543. package/dist/platform/events/version.d.ts.map +1 -0
  544. package/dist/platform/events/version.js +22 -0
  545. package/dist/platform/events/version.js.map +1 -0
  546. package/dist/platform/graph-actions.d.ts +18 -0
  547. package/dist/platform/graph-actions.d.ts.map +1 -0
  548. package/dist/platform/graph-actions.js +109 -0
  549. package/dist/platform/graph-actions.js.map +1 -0
  550. package/dist/platform/lifecycle.d.ts +40 -0
  551. package/dist/platform/lifecycle.d.ts.map +1 -0
  552. package/dist/platform/lifecycle.js +309 -0
  553. package/dist/platform/lifecycle.js.map +1 -0
  554. package/dist/platform/locks.d.ts +29 -0
  555. package/dist/platform/locks.d.ts.map +1 -0
  556. package/dist/platform/locks.js +150 -0
  557. package/dist/platform/locks.js.map +1 -0
  558. package/dist/platform/projection.d.ts +8 -0
  559. package/dist/platform/projection.d.ts.map +1 -0
  560. package/dist/platform/projection.js +165 -0
  561. package/dist/platform/projection.js.map +1 -0
  562. package/dist/platform/queries/conditions.d.ts +4 -0
  563. package/dist/platform/queries/conditions.d.ts.map +1 -0
  564. package/dist/platform/queries/conditions.js +48 -0
  565. package/dist/platform/queries/conditions.js.map +1 -0
  566. package/dist/platform/queries/engine.d.ts +16 -0
  567. package/dist/platform/queries/engine.d.ts.map +1 -0
  568. package/dist/platform/queries/engine.js +41 -0
  569. package/dist/platform/queries/engine.js.map +1 -0
  570. package/dist/platform/queries/fields.d.ts +7 -0
  571. package/dist/platform/queries/fields.d.ts.map +1 -0
  572. package/dist/platform/queries/fields.js +88 -0
  573. package/dist/platform/queries/fields.js.map +1 -0
  574. package/dist/platform/queries/order.d.ts +5 -0
  575. package/dist/platform/queries/order.d.ts.map +1 -0
  576. package/dist/platform/queries/order.js +69 -0
  577. package/dist/platform/queries/order.js.map +1 -0
  578. package/dist/platform/queries/paging.d.ts +9 -0
  579. package/dist/platform/queries/paging.d.ts.map +1 -0
  580. package/dist/platform/queries/paging.js +39 -0
  581. package/dist/platform/queries/paging.js.map +1 -0
  582. package/dist/platform/queries/planner.d.ts +8 -0
  583. package/dist/platform/queries/planner.d.ts.map +1 -0
  584. package/dist/platform/queries/planner.js +145 -0
  585. package/dist/platform/queries/planner.js.map +1 -0
  586. package/dist/platform/queries/relationships.d.ts +16 -0
  587. package/dist/platform/queries/relationships.d.ts.map +1 -0
  588. package/dist/platform/queries/relationships.js +84 -0
  589. package/dist/platform/queries/relationships.js.map +1 -0
  590. package/dist/platform/queries/validation.d.ts +5 -0
  591. package/dist/platform/queries/validation.d.ts.map +1 -0
  592. package/dist/platform/queries/validation.js +79 -0
  593. package/dist/platform/queries/validation.js.map +1 -0
  594. package/dist/platform/query.d.ts +10 -0
  595. package/dist/platform/query.d.ts.map +1 -0
  596. package/dist/platform/query.js +93 -0
  597. package/dist/platform/query.js.map +1 -0
  598. package/dist/platform/references/behavior.d.ts +11 -0
  599. package/dist/platform/references/behavior.d.ts.map +1 -0
  600. package/dist/platform/references/behavior.js +25 -0
  601. package/dist/platform/references/behavior.js.map +1 -0
  602. package/dist/platform/references/catalog.d.ts +23 -0
  603. package/dist/platform/references/catalog.d.ts.map +1 -0
  604. package/dist/platform/references/catalog.js +153 -0
  605. package/dist/platform/references/catalog.js.map +1 -0
  606. package/dist/platform/references/deletion.d.ts +20 -0
  607. package/dist/platform/references/deletion.d.ts.map +1 -0
  608. package/dist/platform/references/deletion.js +86 -0
  609. package/dist/platform/references/deletion.js.map +1 -0
  610. package/dist/platform/references/maintenance.d.ts +22 -0
  611. package/dist/platform/references/maintenance.d.ts.map +1 -0
  612. package/dist/platform/references/maintenance.js +113 -0
  613. package/dist/platform/references/maintenance.js.map +1 -0
  614. package/dist/platform/references/policy.d.ts +14 -0
  615. package/dist/platform/references/policy.d.ts.map +1 -0
  616. package/dist/platform/references/policy.js +76 -0
  617. package/dist/platform/references/policy.js.map +1 -0
  618. package/dist/platform/references/sessions.d.ts +20 -0
  619. package/dist/platform/references/sessions.d.ts.map +1 -0
  620. package/dist/platform/references/sessions.js +98 -0
  621. package/dist/platform/references/sessions.js.map +1 -0
  622. package/dist/platform/relationship-copy-policy.d.ts +10 -0
  623. package/dist/platform/relationship-copy-policy.d.ts.map +1 -0
  624. package/dist/platform/relationship-copy-policy.js +41 -0
  625. package/dist/platform/relationship-copy-policy.js.map +1 -0
  626. package/dist/platform/relationship-copy.d.ts +21 -0
  627. package/dist/platform/relationship-copy.d.ts.map +1 -0
  628. package/dist/platform/relationship-copy.js +146 -0
  629. package/dist/platform/relationship-copy.js.map +1 -0
  630. package/dist/platform/relationship-type.d.ts +3 -0
  631. package/dist/platform/relationship-type.d.ts.map +1 -0
  632. package/dist/platform/relationship-type.js +11 -0
  633. package/dist/platform/relationship-type.js.map +1 -0
  634. package/dist/platform/request.d.ts +7 -0
  635. package/dist/platform/request.d.ts.map +1 -0
  636. package/dist/platform/request.js +86 -0
  637. package/dist/platform/request.js.map +1 -0
  638. package/dist/platform/revisions/policy.d.ts +13 -0
  639. package/dist/platform/revisions/policy.d.ts.map +1 -0
  640. package/dist/platform/revisions/policy.js +69 -0
  641. package/dist/platform/revisions/policy.js.map +1 -0
  642. package/dist/platform/revisions/sequences.d.ts +12 -0
  643. package/dist/platform/revisions/sequences.d.ts.map +1 -0
  644. package/dist/platform/revisions/sequences.js +38 -0
  645. package/dist/platform/revisions/sequences.js.map +1 -0
  646. package/dist/platform/security/grants.d.ts +14 -0
  647. package/dist/platform/security/grants.d.ts.map +1 -0
  648. package/dist/platform/security/grants.js +83 -0
  649. package/dist/platform/security/grants.js.map +1 -0
  650. package/dist/platform/security/identities.d.ts +16 -0
  651. package/dist/platform/security/identities.d.ts.map +1 -0
  652. package/dist/platform/security/identities.js +99 -0
  653. package/dist/platform/security/identities.js.map +1 -0
  654. package/dist/platform/security/inherited-relationships.d.ts +15 -0
  655. package/dist/platform/security/inherited-relationships.d.ts.map +1 -0
  656. package/dist/platform/security/inherited-relationships.js +70 -0
  657. package/dist/platform/security/inherited-relationships.js.map +1 -0
  658. package/dist/platform/security/method-execution.d.ts +12 -0
  659. package/dist/platform/security/method-execution.d.ts.map +1 -0
  660. package/dist/platform/security/method-execution.js +24 -0
  661. package/dist/platform/security/method-execution.js.map +1 -0
  662. package/dist/platform/security/permissions.d.ts +34 -0
  663. package/dist/platform/security/permissions.d.ts.map +1 -0
  664. package/dist/platform/security/permissions.js +188 -0
  665. package/dist/platform/security/permissions.js.map +1 -0
  666. package/dist/platform/security/policy.d.ts +39 -0
  667. package/dist/platform/security/policy.d.ts.map +1 -0
  668. package/dist/platform/security/policy.js +168 -0
  669. package/dist/platform/security/policy.js.map +1 -0
  670. package/dist/platform/security/source-access.d.ts +19 -0
  671. package/dist/platform/security/source-access.d.ts.map +1 -0
  672. package/dist/platform/security/source-access.js +72 -0
  673. package/dist/platform/security/source-access.js.map +1 -0
  674. package/dist/platform/security/source-inheritance.d.ts +19 -0
  675. package/dist/platform/security/source-inheritance.d.ts.map +1 -0
  676. package/dist/platform/security/source-inheritance.js +87 -0
  677. package/dist/platform/security/source-inheritance.js.map +1 -0
  678. package/dist/platform/security/system-identities.d.ts +4 -0
  679. package/dist/platform/security/system-identities.d.ts.map +1 -0
  680. package/dist/platform/security/system-identities.js +12 -0
  681. package/dist/platform/security/system-identities.js.map +1 -0
  682. package/dist/platform/security/teams.d.ts +15 -0
  683. package/dist/platform/security/teams.d.ts.map +1 -0
  684. package/dist/platform/security/teams.js +68 -0
  685. package/dist/platform/security/teams.js.map +1 -0
  686. package/dist/platform/security/time.d.ts +4 -0
  687. package/dist/platform/security/time.d.ts.map +1 -0
  688. package/dist/platform/security/time.js +26 -0
  689. package/dist/platform/security/time.js.map +1 -0
  690. package/dist/platform/security/types.d.ts +12 -0
  691. package/dist/platform/security/types.d.ts.map +1 -0
  692. package/dist/platform/security/types.js +6 -0
  693. package/dist/platform/security/types.js.map +1 -0
  694. package/dist/platform/trace.d.ts +41 -0
  695. package/dist/platform/trace.d.ts.map +1 -0
  696. package/dist/platform/trace.js +46 -0
  697. package/dist/platform/trace.js.map +1 -0
  698. package/dist/platform/unlocking.d.ts +27 -0
  699. package/dist/platform/unlocking.d.ts.map +1 -0
  700. package/dist/platform/unlocking.js +192 -0
  701. package/dist/platform/unlocking.js.map +1 -0
  702. package/dist/platform/values.d.ts +17 -0
  703. package/dist/platform/values.d.ts.map +1 -0
  704. package/dist/platform/values.js +105 -0
  705. package/dist/platform/values.js.map +1 -0
  706. package/dist/platform/version-policy.d.ts +4 -0
  707. package/dist/platform/version-policy.d.ts.map +1 -0
  708. package/dist/platform/version-policy.js +11 -0
  709. package/dist/platform/version-policy.js.map +1 -0
  710. package/dist/platform/versioned-request.d.ts +18 -0
  711. package/dist/platform/versioned-request.d.ts.map +1 -0
  712. package/dist/platform/versioned-request.js +95 -0
  713. package/dist/platform/versioned-request.js.map +1 -0
  714. package/dist/platform/versioning.d.ts +57 -0
  715. package/dist/platform/versioning.d.ts.map +1 -0
  716. package/dist/platform/versioning.js +441 -0
  717. package/dist/platform/versioning.js.map +1 -0
  718. package/dist/queries/date.d.ts +3 -0
  719. package/dist/queries/date.d.ts.map +1 -0
  720. package/dist/queries/date.js +20 -0
  721. package/dist/queries/date.js.map +1 -0
  722. package/dist/queries/decimal.d.ts +9 -0
  723. package/dist/queries/decimal.d.ts.map +1 -0
  724. package/dist/queries/decimal.js +42 -0
  725. package/dist/queries/decimal.js.map +1 -0
  726. package/dist/queries/evaluate.d.ts +9 -0
  727. package/dist/queries/evaluate.d.ts.map +1 -0
  728. package/dist/queries/evaluate.js +122 -0
  729. package/dist/queries/evaluate.js.map +1 -0
  730. package/dist/queries/lexer.d.ts +14 -0
  731. package/dist/queries/lexer.d.ts.map +1 -0
  732. package/dist/queries/lexer.js +87 -0
  733. package/dist/queries/lexer.js.map +1 -0
  734. package/dist/queries/like.d.ts +3 -0
  735. package/dist/queries/like.d.ts.map +1 -0
  736. package/dist/queries/like.js +35 -0
  737. package/dist/queries/like.js.map +1 -0
  738. package/dist/queries/parser.d.ts +28 -0
  739. package/dist/queries/parser.d.ts.map +1 -0
  740. package/dist/queries/parser.js +271 -0
  741. package/dist/queries/parser.js.map +1 -0
  742. package/dist/queries/predicates.d.ts +7 -0
  743. package/dist/queries/predicates.d.ts.map +1 -0
  744. package/dist/queries/predicates.js +62 -0
  745. package/dist/queries/predicates.js.map +1 -0
  746. package/dist/queries/types.d.ts +65 -0
  747. package/dist/queries/types.d.ts.map +1 -0
  748. package/dist/queries/types.js +25 -0
  749. package/dist/queries/types.js.map +1 -0
  750. package/dist/queries/values.d.ts +5 -0
  751. package/dist/queries/values.d.ts.map +1 -0
  752. package/dist/queries/values.js +77 -0
  753. package/dist/queries/values.js.map +1 -0
  754. package/dist/storage/documents.d.ts +5 -0
  755. package/dist/storage/documents.d.ts.map +1 -0
  756. package/dist/storage/documents.js +12 -0
  757. package/dist/storage/documents.js.map +1 -0
  758. package/dist/storage/metadata-epoch.d.ts +6 -0
  759. package/dist/storage/metadata-epoch.d.ts.map +1 -0
  760. package/dist/storage/metadata-epoch.js +15 -0
  761. package/dist/storage/metadata-epoch.js.map +1 -0
  762. package/dist/storage/package-transaction.d.ts +5 -0
  763. package/dist/storage/package-transaction.d.ts.map +1 -0
  764. package/dist/storage/package-transaction.js +12 -0
  765. package/dist/storage/package-transaction.js.map +1 -0
  766. package/dist/storage/properties.d.ts +4 -0
  767. package/dist/storage/properties.d.ts.map +1 -0
  768. package/dist/storage/properties.js +21 -0
  769. package/dist/storage/properties.js.map +1 -0
  770. package/dist/storage/sqlite/catalog.d.ts +19 -0
  771. package/dist/storage/sqlite/catalog.d.ts.map +1 -0
  772. package/dist/storage/sqlite/catalog.js +62 -0
  773. package/dist/storage/sqlite/catalog.js.map +1 -0
  774. package/dist/storage/sqlite/connections.d.ts +5 -0
  775. package/dist/storage/sqlite/connections.d.ts.map +1 -0
  776. package/dist/storage/sqlite/connections.js +36 -0
  777. package/dist/storage/sqlite/connections.js.map +1 -0
  778. package/dist/storage/sqlite/errors.d.ts +7 -0
  779. package/dist/storage/sqlite/errors.d.ts.map +1 -0
  780. package/dist/storage/sqlite/errors.js +9 -0
  781. package/dist/storage/sqlite/errors.js.map +1 -0
  782. package/dist/storage/sqlite/index.d.ts +5 -0
  783. package/dist/storage/sqlite/index.d.ts.map +1 -0
  784. package/dist/storage/sqlite/index.js +3 -0
  785. package/dist/storage/sqlite/index.js.map +1 -0
  786. package/dist/storage/sqlite/metadata.d.ts +8 -0
  787. package/dist/storage/sqlite/metadata.d.ts.map +1 -0
  788. package/dist/storage/sqlite/metadata.js +157 -0
  789. package/dist/storage/sqlite/metadata.js.map +1 -0
  790. package/dist/storage/sqlite/predicate.d.ts +9 -0
  791. package/dist/storage/sqlite/predicate.d.ts.map +1 -0
  792. package/dist/storage/sqlite/predicate.js +214 -0
  793. package/dist/storage/sqlite/predicate.js.map +1 -0
  794. package/dist/storage/sqlite/queries.d.ts +12 -0
  795. package/dist/storage/sqlite/queries.d.ts.map +1 -0
  796. package/dist/storage/sqlite/queries.js +30 -0
  797. package/dist/storage/sqlite/queries.js.map +1 -0
  798. package/dist/storage/sqlite/schema.d.ts +16 -0
  799. package/dist/storage/sqlite/schema.d.ts.map +1 -0
  800. package/dist/storage/sqlite/schema.js +197 -0
  801. package/dist/storage/sqlite/schema.js.map +1 -0
  802. package/dist/storage/sqlite/statements.d.ts +13 -0
  803. package/dist/storage/sqlite/statements.d.ts.map +1 -0
  804. package/dist/storage/sqlite/statements.js +35 -0
  805. package/dist/storage/sqlite/statements.js.map +1 -0
  806. package/dist/storage/sqlite/storage.d.ts +61 -0
  807. package/dist/storage/sqlite/storage.d.ts.map +1 -0
  808. package/dist/storage/sqlite/storage.js +644 -0
  809. package/dist/storage/sqlite/storage.js.map +1 -0
  810. package/dist/storage/sqlite/transactions.d.ts +23 -0
  811. package/dist/storage/sqlite/transactions.d.ts.map +1 -0
  812. package/dist/storage/sqlite/transactions.js +84 -0
  813. package/dist/storage/sqlite/transactions.js.map +1 -0
  814. package/dist/storage/types.d.ts +62 -0
  815. package/dist/storage/types.d.ts.map +1 -0
  816. package/dist/storage/types.js +1 -0
  817. package/dist/storage/types.js.map +1 -0
  818. package/dist/verification/diagnostics.d.ts +4 -0
  819. package/dist/verification/diagnostics.d.ts.map +1 -0
  820. package/dist/verification/diagnostics.js +106 -0
  821. package/dist/verification/diagnostics.js.map +1 -0
  822. package/dist/verification/index.d.ts +4 -0
  823. package/dist/verification/index.d.ts.map +1 -0
  824. package/dist/verification/index.js +3 -0
  825. package/dist/verification/index.js.map +1 -0
  826. package/dist/verification/inspection.d.ts +13 -0
  827. package/dist/verification/inspection.d.ts.map +1 -0
  828. package/dist/verification/inspection.js +87 -0
  829. package/dist/verification/inspection.js.map +1 -0
  830. package/dist/verification/inventory.d.ts +7 -0
  831. package/dist/verification/inventory.d.ts.map +1 -0
  832. package/dist/verification/inventory.js +55 -0
  833. package/dist/verification/inventory.js.map +1 -0
  834. package/dist/verification/types.d.ts +53 -0
  835. package/dist/verification/types.d.ts.map +1 -0
  836. package/dist/verification/types.js +12 -0
  837. package/dist/verification/types.js.map +1 -0
  838. package/dist/verification/verify.d.ts +4 -0
  839. package/dist/verification/verify.d.ts.map +1 -0
  840. package/dist/verification/verify.js +69 -0
  841. package/dist/verification/verify.js.map +1 -0
  842. package/examples/basic/.harness/fixtures.ts +5 -0
  843. package/examples/basic/.harness/packages/documents.xml +16 -0
  844. package/examples/basic/README.md +13 -0
  845. package/examples/basic/package.json +12 -0
  846. package/examples/basic/tests/documents.test.ts +19 -0
  847. package/examples/basic/tsconfig.json +15 -0
  848. package/examples/server-methods/.harness/fixtures.ts +18 -0
  849. package/examples/server-methods/.harness/mocks.json +6 -0
  850. package/examples/server-methods/.harness/packages/review.xml +69 -0
  851. package/examples/server-methods/README.md +14 -0
  852. package/examples/server-methods/package.json +12 -0
  853. package/examples/server-methods/tests/submission.test.ts +60 -0
  854. package/examples/server-methods/tsconfig.json +15 -0
  855. package/package.json +106 -5
  856. package/skills/innovator-harness/SKILL.md +109 -0
  857. package/skills/innovator-harness/agents/openai.yaml +7 -0
  858. package/skills/innovator-harness/assets/icon-small.png +0 -0
  859. package/skills/innovator-harness/assets/icon.png +0 -0
  860. package/src/baseline/catalog.ts +42 -0
  861. package/src/baseline/data/item-types.json +1062 -0
  862. package/src/baseline/data/properties.json +31286 -0
  863. package/src/baseline/data/records.json +6666 -0
  864. package/src/baseline/data/relationships.json +393 -0
  865. package/src/baseline/database.ts +39 -0
  866. package/src/baseline/source.ts +16 -0
  867. package/src/compatibility/capabilities.ts +626 -0
  868. package/src/compatibility/check.ts +483 -0
  869. package/src/compatibility/executions.ts +120 -0
  870. package/src/compatibility/executors.ts +180 -0
  871. package/src/compatibility/index.ts +22 -0
  872. package/src/compatibility/metadata.ts +219 -0
  873. package/src/compatibility/mocks.ts +32 -0
  874. package/src/compatibility/revisions.ts +45 -0
  875. package/src/compatibility/security.ts +102 -0
  876. package/src/compatibility/sources.ts +38 -0
  877. package/src/compatibility/types.ts +153 -0
  878. package/src/controls/clock.ts +108 -0
  879. package/src/controls/execution.ts +53 -0
  880. package/src/controls/failure-types.ts +61 -0
  881. package/src/controls/failure-validation.ts +99 -0
  882. package/src/controls/failures.ts +192 -0
  883. package/src/controls/ids.ts +87 -0
  884. package/src/controls/observers.ts +107 -0
  885. package/src/controls/state.ts +91 -0
  886. package/src/controls/targets.ts +123 -0
  887. package/src/controls/values.ts +44 -0
  888. package/src/controls/world.ts +31 -0
  889. package/src/core/budget.ts +25 -0
  890. package/src/core/context.ts +68 -0
  891. package/src/core/data.ts +273 -0
  892. package/src/core/deadline.ts +47 -0
  893. package/src/core/errors.ts +32 -0
  894. package/src/core/files.ts +45 -0
  895. package/src/core/index.ts +17 -0
  896. package/src/core/limits.ts +14 -0
  897. package/src/core/modules.ts +102 -0
  898. package/src/core/operation.ts +43 -0
  899. package/src/core/process.ts +55 -0
  900. package/src/core/resources.ts +34 -0
  901. package/src/core/runtime.ts +883 -0
  902. package/src/core/types.ts +80 -0
  903. package/src/diagnostics/source-location.ts +6 -0
  904. package/src/engine/instance.ts +428 -0
  905. package/src/engine.ts +9 -0
  906. package/src/fixtures/module.ts +182 -0
  907. package/src/fixtures/types.ts +9 -0
  908. package/src/harness/configuration.ts +426 -0
  909. package/src/harness/create.ts +214 -0
  910. package/src/harness/extensions.ts +86 -0
  911. package/src/harness/fixtures.ts +186 -0
  912. package/src/harness/runtime-identity.ts +41 -0
  913. package/src/harness/setup-cache.ts +56 -0
  914. package/src/harness/setup-image.ts +155 -0
  915. package/src/harness/setup-imports.ts +40 -0
  916. package/src/harness/setup-inputs.ts +80 -0
  917. package/src/harness/setup-module.ts +118 -0
  918. package/src/harness/world.ts +248 -0
  919. package/src/index.ts +84 -0
  920. package/src/instrumentation/failures.ts +148 -0
  921. package/src/instrumentation/recorder.ts +547 -0
  922. package/src/instrumentation/snapshots.ts +247 -0
  923. package/src/instrumentation/types.ts +126 -0
  924. package/src/items/codec.ts +198 -0
  925. package/src/items/item.ts +218 -0
  926. package/src/items/logical.ts +145 -0
  927. package/src/items/origins.ts +139 -0
  928. package/src/items/xml.ts +187 -0
  929. package/src/methods/csharp/base-input.ts +215 -0
  930. package/src/methods/csharp/cache.ts +67 -0
  931. package/src/methods/csharp/callbacks.ts +121 -0
  932. package/src/methods/csharp/compiler.ts +284 -0
  933. package/src/methods/csharp/context.ts +88 -0
  934. package/src/methods/csharp/documents.ts +186 -0
  935. package/src/methods/csharp/executor.ts +504 -0
  936. package/src/methods/csharp/index.ts +3 -0
  937. package/src/methods/csharp/method-build.ts +141 -0
  938. package/src/methods/csharp/origins.ts +126 -0
  939. package/src/methods/csharp/protocol.ts +104 -0
  940. package/src/methods/csharp/relationship-order.ts +76 -0
  941. package/src/methods/csharp/request-change.ts +349 -0
  942. package/src/methods/csharp/retained-items.ts +128 -0
  943. package/src/methods/csharp/security.ts +121 -0
  944. package/src/methods/csharp/templates.ts +92 -0
  945. package/src/methods/csharp/worker.ts +234 -0
  946. package/src/methods/event-data.ts +39 -0
  947. package/src/methods/types.ts +59 -0
  948. package/src/mocks/configuration.ts +158 -0
  949. package/src/mocks/parameters.ts +20 -0
  950. package/src/mocks/registry.ts +214 -0
  951. package/src/mocks/response.ts +128 -0
  952. package/src/mocks/types.ts +56 -0
  953. package/src/packages/bootstrap.ts +73 -0
  954. package/src/packages/candidates.ts +55 -0
  955. package/src/packages/defaults.ts +145 -0
  956. package/src/packages/diagnostics.ts +47 -0
  957. package/src/packages/draft.ts +280 -0
  958. package/src/packages/elements.ts +88 -0
  959. package/src/packages/evaluation.ts +89 -0
  960. package/src/packages/files.ts +332 -0
  961. package/src/packages/importer.ts +1257 -0
  962. package/src/packages/index.ts +7 -0
  963. package/src/packages/manifest.ts +158 -0
  964. package/src/packages/module.ts +36 -0
  965. package/src/packages/parser.ts +367 -0
  966. package/src/packages/plan.ts +872 -0
  967. package/src/packages/schema.ts +617 -0
  968. package/src/packages/selector.ts +104 -0
  969. package/src/packages/state.ts +82 -0
  970. package/src/packages/types.ts +25 -0
  971. package/src/platform/action-responses.ts +127 -0
  972. package/src/platform/actions.ts +11 -0
  973. package/src/platform/catalog.ts +220 -0
  974. package/src/platform/classifications.ts +165 -0
  975. package/src/platform/creation.ts +37 -0
  976. package/src/platform/engine.ts +2055 -0
  977. package/src/platform/errors.ts +39 -0
  978. package/src/platform/events/after.ts +149 -0
  979. package/src/platform/events/base-updates.ts +68 -0
  980. package/src/platform/events/bindings.ts +129 -0
  981. package/src/platform/events/data.ts +26 -0
  982. package/src/platform/events/inheritance.ts +98 -0
  983. package/src/platform/events/input.ts +12 -0
  984. package/src/platform/events/replacement.ts +109 -0
  985. package/src/platform/events/types.ts +56 -0
  986. package/src/platform/events/version.ts +38 -0
  987. package/src/platform/graph-actions.ts +198 -0
  988. package/src/platform/lifecycle.ts +549 -0
  989. package/src/platform/locks.ts +251 -0
  990. package/src/platform/projection.ts +262 -0
  991. package/src/platform/queries/conditions.ts +69 -0
  992. package/src/platform/queries/engine.ts +69 -0
  993. package/src/platform/queries/fields.ts +160 -0
  994. package/src/platform/queries/order.ts +105 -0
  995. package/src/platform/queries/paging.ts +66 -0
  996. package/src/platform/queries/planner.ts +244 -0
  997. package/src/platform/queries/relationships.ts +130 -0
  998. package/src/platform/queries/validation.ts +105 -0
  999. package/src/platform/query.ts +178 -0
  1000. package/src/platform/references/behavior.ts +36 -0
  1001. package/src/platform/references/catalog.ts +256 -0
  1002. package/src/platform/references/deletion.ts +130 -0
  1003. package/src/platform/references/maintenance.ts +175 -0
  1004. package/src/platform/references/policy.ts +115 -0
  1005. package/src/platform/references/sessions.ts +148 -0
  1006. package/src/platform/relationship-copy-policy.ts +66 -0
  1007. package/src/platform/relationship-copy.ts +218 -0
  1008. package/src/platform/relationship-type.ts +23 -0
  1009. package/src/platform/request.ts +139 -0
  1010. package/src/platform/revisions/policy.ts +126 -0
  1011. package/src/platform/revisions/sequences.ts +67 -0
  1012. package/src/platform/security/grants.ts +116 -0
  1013. package/src/platform/security/identities.ts +136 -0
  1014. package/src/platform/security/inherited-relationships.ts +103 -0
  1015. package/src/platform/security/method-execution.ts +34 -0
  1016. package/src/platform/security/permissions.ts +337 -0
  1017. package/src/platform/security/policy.ts +286 -0
  1018. package/src/platform/security/source-access.ts +148 -0
  1019. package/src/platform/security/source-inheritance.ts +134 -0
  1020. package/src/platform/security/system-identities.ts +16 -0
  1021. package/src/platform/security/teams.ts +100 -0
  1022. package/src/platform/security/time.ts +30 -0
  1023. package/src/platform/security/types.ts +17 -0
  1024. package/src/platform/trace.ts +111 -0
  1025. package/src/platform/unlocking.ts +295 -0
  1026. package/src/platform/values.ts +217 -0
  1027. package/src/platform/version-policy.ts +17 -0
  1028. package/src/platform/versioned-request.ts +154 -0
  1029. package/src/platform/versioning.ts +798 -0
  1030. package/src/queries/date.ts +28 -0
  1031. package/src/queries/decimal.ts +59 -0
  1032. package/src/queries/evaluate.ts +168 -0
  1033. package/src/queries/lexer.ts +109 -0
  1034. package/src/queries/like.ts +47 -0
  1035. package/src/queries/parser.ts +352 -0
  1036. package/src/queries/predicates.ts +85 -0
  1037. package/src/queries/types.ts +82 -0
  1038. package/src/queries/values.ts +104 -0
  1039. package/src/storage/documents.ts +20 -0
  1040. package/src/storage/metadata-epoch.ts +20 -0
  1041. package/src/storage/package-transaction.ts +25 -0
  1042. package/src/storage/properties.ts +31 -0
  1043. package/src/storage/sqlite/catalog.ts +89 -0
  1044. package/src/storage/sqlite/connections.ts +49 -0
  1045. package/src/storage/sqlite/errors.ts +23 -0
  1046. package/src/storage/sqlite/index.ts +13 -0
  1047. package/src/storage/sqlite/metadata.ts +216 -0
  1048. package/src/storage/sqlite/predicate.ts +301 -0
  1049. package/src/storage/sqlite/queries.ts +48 -0
  1050. package/src/storage/sqlite/schema.ts +288 -0
  1051. package/src/storage/sqlite/statements.ts +51 -0
  1052. package/src/storage/sqlite/storage.ts +949 -0
  1053. package/src/storage/sqlite/transactions.ts +108 -0
  1054. package/src/storage/types.ts +69 -0
  1055. package/src/verification/diagnostics.ts +124 -0
  1056. package/src/verification/index.ts +10 -0
  1057. package/src/verification/inspection.ts +108 -0
  1058. package/src/verification/inventory.ts +76 -0
  1059. package/src/verification/types.ts +61 -0
  1060. package/src/verification/verify.ts +11 -0
@@ -0,0 +1,2055 @@
1
+ import { capabilityForLanguage } from "../compatibility/capabilities.js";
2
+ import { assertActiveContext, spendContext } from "../core/context.js";
3
+ import { cloneFrozenData, setOwn } from "../core/data.js";
4
+ import { defineOperation } from "../core/operation.js";
5
+ import type { ExecutionContext, HarnessModule, ModuleRegistrar } from "../core/types.js";
6
+ import type { SourceLocation } from "../diagnostics/source-location.js";
7
+ import { Item, itemNode } from "../items/item.js";
8
+ import type { ItemNode } from "../items/item.js";
9
+ import { parseItems } from "../items/xml.js";
10
+ import { MethodEventDataKind } from "../methods/event-data.js";
11
+ import type { MethodEventData } from "../methods/event-data.js";
12
+ import type { MethodDefinition, MethodExecutor, MethodPorts } from "../methods/types.js";
13
+ import { properties } from "../mocks/registry.js";
14
+ import type { MockMatch, MockRegistry } from "../mocks/registry.js";
15
+ import type { MockValue } from "../mocks/types.js";
16
+ import type { SelectQuery } from "../queries/types.js";
17
+ import type {
18
+ CatalogEntry,
19
+ HarnessStorage,
20
+ ItemTypeDefinition,
21
+ StorageValue,
22
+ StoredItem,
23
+ } from "../storage/types.js";
24
+ import { ActionResponses } from "./action-responses.js";
25
+ import { ItemAction } from "./actions.js";
26
+ import { PlatformCatalog } from "./catalog.js";
27
+ import { creationDefaults } from "./creation.js";
28
+ import { ApplicationError, PlatformError, requireSuccess } from "./errors.js";
29
+ import { AfterEvents } from "./events/after.js";
30
+ import { BaseUpdates } from "./events/base-updates.js";
31
+ import { afterAddFrames, afterUpdateFrames } from "./events/data.js";
32
+ import { requestDocument } from "./events/input.js";
33
+ import { EventReplacements } from "./events/replacement.js";
34
+ import type { ApplyEventBase } from "./events/replacement.js";
35
+ import { ServerEventVersion } from "./events/types.js";
36
+ import type { ApplyUpdateBase, EventBinding, EventRunners } from "./events/types.js";
37
+ import { GraphActions } from "./graph-actions.js";
38
+ import { LifeCycles } from "./lifecycle.js";
39
+ import type { ClassificationChange } from "./lifecycle.js";
40
+ import { ItemLocks } from "./locks.js";
41
+ import { compileProjection } from "./projection.js";
42
+ import { ItemQueries } from "./queries/engine.js";
43
+ import { matches, projectedProperties, selectedProperties } from "./query.js";
44
+ import { DependentDeletion } from "./references/deletion.js";
45
+ import { ReferenceMaintenance } from "./references/maintenance.js";
46
+ import { relationshipType } from "./relationship-type.js";
47
+ import { validateRequest } from "./request.js";
48
+ import { Revisions } from "./revisions/policy.js";
49
+ import { NativeSecurity } from "./security/policy.js";
50
+ import { AuthorizationMode } from "./security/types.js";
51
+ import type { AuthorizationPolicy, AuthorizationRequest } from "./security/types.js";
52
+ import { PlatformTrace } from "./trace.js";
53
+ import type { SourceDefinition } from "./trace.js";
54
+ import { normalizeProperties } from "./values.js";
55
+ import type { ItemReference, SeedValue } from "./values.js";
56
+ import { manualVersioning } from "./version-policy.js";
57
+ import { Versioning } from "./versioning.js";
58
+
59
+ interface CallSource {
60
+ readonly source: SourceLocation;
61
+ readonly sourceHash?: string;
62
+ readonly definition: SourceDefinition;
63
+ }
64
+
65
+ interface MethodCall {
66
+ readonly name: string;
67
+ readonly context: Item;
68
+ readonly eventData?: MethodEventData;
69
+ }
70
+
71
+ interface SeedCall {
72
+ readonly type: string;
73
+ readonly properties: Readonly<Record<string, SeedValue>>;
74
+ }
75
+
76
+ interface SeedRecord extends SeedCall {
77
+ readonly id: string;
78
+ }
79
+
80
+ interface SqlCall {
81
+ readonly query: string;
82
+ readonly method: string;
83
+ readonly values: Readonly<Record<string, MockValue>>;
84
+ }
85
+
86
+ interface MutationResult {
87
+ readonly response: Item;
88
+ readonly replaced: boolean;
89
+ }
90
+
91
+ interface BaseItemCall {
92
+ readonly item: Item;
93
+ readonly event: string;
94
+ }
95
+
96
+ export const applyItemOperation = defineOperation<Item, Item>("platform.apply");
97
+ const applyBaseItemOperation = defineOperation<BaseItemCall, Item>("platform.event-base");
98
+ export const callMethodOperation = defineOperation<MethodCall, Item>("platform.method");
99
+ export const seedOperation = defineOperation<SeedCall, ItemReference>("platform.seed");
100
+ export const seedRecordsOperation = defineOperation<readonly SeedRecord[], void>(
101
+ "platform.seedRecords",
102
+ );
103
+ export const applyAMLOperation = defineOperation<string, Item>("platform.aml");
104
+ const applySqlOperation = defineOperation<SqlCall, Item>("platform.sql");
105
+ const deleteOwnedItemOperation = defineOperation<
106
+ { readonly parent: StoredItem; readonly child: StoredItem; readonly enabled: boolean },
107
+ Item
108
+ >("platform.delete-owned");
109
+
110
+ export type { AuthorizationRequest } from "./security/types.js";
111
+
112
+ export interface PlatformOptions {
113
+ readonly userId?: () => string;
114
+ readonly executors?: readonly MethodExecutor[];
115
+ readonly authorization?: AuthorizationPolicy;
116
+ readonly nextId?: () => string;
117
+ readonly mocks?: MockRegistry;
118
+ }
119
+
120
+ const actions = new Set<string>(Object.values(ItemAction));
121
+ const reservedActions = new Set(["copy", "clone", "merge", "purge", "create", "SQL Process"]);
122
+ const claimedExecutors = new WeakSet<MethodExecutor>();
123
+
124
+ enum BoundMethodKind {
125
+ Replacement = "replacement",
126
+ Callback = "callback",
127
+ }
128
+
129
+ function dispatchItem(item: Item, context: ExecutionContext): Promise<Item> {
130
+ return context.execute(applyItemOperation, item);
131
+ }
132
+
133
+ export class Platform {
134
+ private readonly catalog: PlatformCatalog;
135
+ private readonly executors = new Map<string, MethodExecutor>();
136
+ private readonly ownedExecutors = new Set<MethodExecutor>();
137
+ private readonly identity = Symbol("Harness world");
138
+ private generation = 0;
139
+ private readonly nextId: () => string;
140
+ private readonly locks: ItemLocks;
141
+ private readonly versioning: Versioning;
142
+ private readonly lifeCycles: LifeCycles;
143
+ private readonly revisions: Revisions;
144
+ private readonly queries: ItemQueries;
145
+ private readonly graph: GraphActions;
146
+ private readonly references: ReferenceMaintenance;
147
+ private readonly deletion: DependentDeletion;
148
+ private readonly security: NativeSecurity;
149
+ private readonly responses: ActionResponses;
150
+ private readonly replacements = new EventReplacements();
151
+ private readonly boundMethods = new WeakMap<MethodCall, BoundMethodKind>();
152
+ private readonly baseOverrides = new WeakMap<BaseItemCall, ApplyEventBase>();
153
+ private readonly baseUpdates = new BaseUpdates();
154
+ private readonly afterEvents: AfterEvents;
155
+
156
+ constructor(
157
+ private readonly storage: HarnessStorage,
158
+ private readonly options: PlatformOptions = {},
159
+ readonly trace = new PlatformTrace(),
160
+ private readonly now: () => Date = () => new Date(),
161
+ select?: SelectQuery,
162
+ ) {
163
+ this.catalog = new PlatformCatalog(storage);
164
+ this.responses = new ActionResponses(dispatchItem, (type) => this.hasAfterEvents(type));
165
+ this.security = new NativeSecurity(
166
+ storage,
167
+ options.authorization,
168
+ options.userId,
169
+ now,
170
+ this.trace,
171
+ this.catalog.classifications,
172
+ );
173
+ this.references = new ReferenceMaintenance(storage, this.trace);
174
+ this.deletion = this.createDependentDeletion();
175
+ this.graph = new GraphActions(storage, dispatchItem);
176
+ this.queries = new ItemQueries(
177
+ storage,
178
+ dispatchItem,
179
+ select,
180
+ (definition, records, context) => this.security.readable(definition, records, context),
181
+ );
182
+ this.nextId =
183
+ options.nextId ?? (() => crypto.randomUUID().replaceAll("-", "").toUpperCase());
184
+ this.afterEvents = this.createAfterEvents();
185
+ const runners = this.eventRunners();
186
+ const events = runners.item;
187
+ this.locks = new ItemLocks(
188
+ storage,
189
+ this.trace,
190
+ events,
191
+ options.userId,
192
+ dispatchItem,
193
+ this.references.catalog,
194
+ select,
195
+ );
196
+ this.lifeCycles = new LifeCycles(
197
+ storage,
198
+ this.trace,
199
+ events,
200
+ (name, item, context) => context.execute(callMethodOperation, { name, context: item }),
201
+ this.references,
202
+ this.security,
203
+ this.catalog.classifications,
204
+ );
205
+ this.revisions = new Revisions(storage);
206
+ this.versioning = new Versioning(
207
+ storage,
208
+ this.trace,
209
+ this.locks,
210
+ runners,
211
+ this.nextId,
212
+ this.graph,
213
+ this.references,
214
+ this.deletion,
215
+ this.revisions,
216
+ this.lifeCycles,
217
+ this.security,
218
+ );
219
+
220
+ this.registerExecutors(options.executors ?? []);
221
+ }
222
+
223
+ private createDependentDeletion(): DependentDeletion {
224
+ return new DependentDeletion(
225
+ this.storage,
226
+ this.references.catalog,
227
+ this.references.sessions,
228
+ dispatchItem,
229
+ (parent, child, enabled, context) =>
230
+ context.execute(deleteOwnedItemOperation, { parent, child, enabled }),
231
+ );
232
+ }
233
+
234
+ private createAfterEvents(): AfterEvents {
235
+ return new AfterEvents(
236
+ (definition, name, enabled, version) =>
237
+ this.eventBindings(definition, name, enabled, version),
238
+ (binding, name, item, context, data) =>
239
+ this.invokeEvent(binding, name, item, context, data),
240
+ dispatchItem,
241
+ );
242
+ }
243
+
244
+ private eventRunners(): EventRunners {
245
+ return {
246
+ item: (definition, name, item, enabled, context, data) =>
247
+ this.events(
248
+ definition,
249
+ name,
250
+ item,
251
+ enabled,
252
+ context,
253
+ ServerEventVersion.Item,
254
+ data,
255
+ ),
256
+
257
+ after: (definition, name, items, enabled, context) =>
258
+ this.afterEvents.run(definition, name, items, enabled, context),
259
+
260
+ update: (definition, request, context, applyBase) =>
261
+ this.updateEvent(definition, request, context, applyBase),
262
+ };
263
+ }
264
+
265
+ private registerExecutors(executors: readonly MethodExecutor[]): void {
266
+ for (const executor of executors) {
267
+ const language = executor.language.toLowerCase();
268
+
269
+ if (this.executors.has(language)) {
270
+ throw new PlatformError(
271
+ "DuplicateExecutor",
272
+ `Multiple executors for '${executor.language}'.`,
273
+ );
274
+ }
275
+
276
+ this.executors.set(language, executor);
277
+ }
278
+ }
279
+
280
+ module(): HarnessModule {
281
+ return {
282
+ id: "platform",
283
+ requires: ["packages"],
284
+
285
+ setup: (registrar) => {
286
+ this.setupPlatform(registrar);
287
+ },
288
+
289
+ reset: () => {
290
+ this.generation += 1;
291
+ this.security.reset();
292
+ this.trace.reset();
293
+
294
+ for (const executor of this.ownedExecutors) {
295
+ executor.reset?.();
296
+ }
297
+ },
298
+
299
+ dispose: () => {
300
+ const errors: unknown[] = [];
301
+
302
+ for (const executor of this.ownedExecutors) {
303
+ try {
304
+ executor.dispose?.();
305
+ } catch (error) {
306
+ errors.push(error);
307
+ } finally {
308
+ claimedExecutors.delete(executor);
309
+ }
310
+ }
311
+
312
+ this.ownedExecutors.clear();
313
+
314
+ if (errors.length) {
315
+ throw new AggregateError(errors, "Executor cleanup failed.");
316
+ }
317
+ },
318
+ };
319
+ }
320
+
321
+ inspect(reference: ItemReference): StoredItem {
322
+ this.assertReference(reference);
323
+ const item = this.storage.getItem(reference.type, reference.id);
324
+
325
+ if (!item) {
326
+ throw new PlatformError(
327
+ "MissingItem",
328
+ `Record '${reference.type}:${reference.id}' no longer exists.`,
329
+ );
330
+ }
331
+
332
+ return item;
333
+ }
334
+
335
+ item(reference: ItemReference, action = "get"): Item {
336
+ const stored = this.inspect(reference);
337
+
338
+ return new Item({
339
+ items: [
340
+ {
341
+ ...itemNode(stored.type, action),
342
+ attributes: { id: stored.id, action },
343
+ properties: { ...stored.properties },
344
+ },
345
+ ],
346
+ });
347
+ }
348
+
349
+ find(type: string, properties: Readonly<Record<string, StorageValue>>): ItemReference {
350
+ const definition = this.catalog.itemType(type);
351
+
352
+ for (const name of Object.keys(properties)) {
353
+ if (
354
+ name !== "id" &&
355
+ !definition.properties.some((property) => property.name === name)
356
+ ) {
357
+ throw new PlatformError(
358
+ "UnknownProperty",
359
+ `Unknown selector '${definition.name}.${name}'.`,
360
+ );
361
+ }
362
+ }
363
+
364
+ const records = this.storage
365
+ .listItems(definition.name)
366
+ .filter((record) =>
367
+ Object.entries(properties).every(([name, value]) =>
368
+ matches(this.storage, definition, record, { name, value }),
369
+ ),
370
+ );
371
+ const record = records[0];
372
+
373
+ if (records.length !== 1 || !record) {
374
+ throw new PlatformError(
375
+ "ItemResolution",
376
+ `Inspection of '${definition.name}' matched ${records.length} records; expected one.`,
377
+ );
378
+ }
379
+
380
+ return Object.freeze({
381
+ id: record.id,
382
+ type: definition.name,
383
+ world: this.identity,
384
+ generation: this.generation,
385
+ });
386
+ }
387
+
388
+ private assertReference(reference: ItemReference): void {
389
+ if (reference.world !== this.identity || reference.generation !== this.generation) {
390
+ throw new PlatformError(
391
+ "InvalidReference",
392
+ "Record reference belongs to a different world or a baseline before reset. Resolve it again from the current world.",
393
+ );
394
+ }
395
+ }
396
+
397
+ private seed(
398
+ input: SeedCall,
399
+ context: ExecutionContext,
400
+ graph?: { readonly id: string; readonly targets: ReadonlySet<string> },
401
+ ): ItemReference {
402
+ const definition = this.catalog.itemType(input.type);
403
+ this.catalog.assertMutable(definition);
404
+ const properties: Record<string, StorageValue> = {};
405
+
406
+ this.resolveSeedProperties(definition, input.properties, properties, context);
407
+
408
+ const id = graph?.id ?? this.nextId();
409
+ const defaults = { config_id: id, generation: 1, is_current: 1 };
410
+
411
+ for (const [name, value] of Object.entries(defaults)) {
412
+ if (
413
+ definition.properties.some((property) => property.name === name) &&
414
+ properties[name] === undefined
415
+ ) {
416
+ setOwn(properties, name, value);
417
+ }
418
+ }
419
+
420
+ const item = {
421
+ id,
422
+ type: definition.name,
423
+ properties: normalizeProperties(
424
+ this.storage,
425
+ definition,
426
+ this.lifeCycles.seedProperties(definition, {
427
+ ...this.revisions.initial(definition, properties),
428
+ ...properties,
429
+ }),
430
+ {
431
+ creating: true,
432
+ id,
433
+ ...(graph ? { pendingReferences: graph.targets } : {}),
434
+ },
435
+ ),
436
+ };
437
+ assertActiveContext(context);
438
+ this.storage.insertItem(item);
439
+ this.trace.record(context, {
440
+ kind: "seed",
441
+ name: definition.name,
442
+ after: item,
443
+ });
444
+
445
+ return Object.freeze({
446
+ id,
447
+ type: definition.name,
448
+ world: this.identity,
449
+ generation: this.generation,
450
+ });
451
+ }
452
+
453
+ private resolveSeedProperties(
454
+ definition: ItemTypeDefinition,
455
+ input: Readonly<Record<string, SeedValue>>,
456
+ properties: Record<string, StorageValue>,
457
+ context: ExecutionContext,
458
+ ): void {
459
+ for (const [name, value] of Object.entries(input)) {
460
+ spendContext(context);
461
+
462
+ if (typeof value === "object" && value !== null) {
463
+ this.assertReference(value);
464
+ this.inspect(value);
465
+ const property = definition.properties.find((property) => property.name === name);
466
+ const target = property?.dataSource
467
+ ? this.storage.listItemTypes().find((type) => type.id === property.dataSource)
468
+ : undefined;
469
+
470
+ if (
471
+ property?.dataType !== "item" ||
472
+ (target && target.name.toLowerCase() !== value.type.toLowerCase())
473
+ ) {
474
+ throw new PlatformError(
475
+ "InvalidReference",
476
+ `Record reference is not valid for '${definition.name}.${name}'.`,
477
+ );
478
+ }
479
+
480
+ setOwn(properties, name, value.id);
481
+ } else {
482
+ setOwn(properties, name, value);
483
+ }
484
+ }
485
+ }
486
+
487
+ private async authorize(
488
+ request: AuthorizationRequest,
489
+ restricted: boolean,
490
+ context: ExecutionContext,
491
+ ): Promise<void> {
492
+ if (this.options.authorization === AuthorizationMode.Native) {
493
+ this.security.authorize(request, context);
494
+ } else if (this.options.authorization === AuthorizationMode.Unchecked) {
495
+ this.trace.record(context, {
496
+ kind: "authorization",
497
+ name: "explicitly unchecked",
498
+ });
499
+ } else if (this.options.authorization) {
500
+ await this.options.authorization(request);
501
+ } else if (restricted) {
502
+ throw new PlatformError(
503
+ "AuthorizationRequired",
504
+ `Authorization rules exist for '${request.name}'. Supply an authorization policy or explicitly choose unchecked execution for a behavior-only test.`,
505
+ );
506
+ }
507
+ }
508
+
509
+ private async callBoundMethod(
510
+ input: MethodCall,
511
+ context: ExecutionContext,
512
+ kind = BoundMethodKind.Replacement,
513
+ ): Promise<Item> {
514
+ assertActiveContext(context);
515
+ this.boundMethods.set(input, kind);
516
+
517
+ try {
518
+ return await context.execute(callMethodOperation, input);
519
+ } finally {
520
+ this.boundMethods.delete(input);
521
+ }
522
+ }
523
+
524
+ private async authorizeMethod(
525
+ input: MethodCall,
526
+ name: string,
527
+ entry: CatalogEntry | undefined,
528
+ context: ExecutionContext,
529
+ checkExecutionIdentity: boolean,
530
+ ): Promise<void> {
531
+ if (!checkExecutionIdentity && this.security.enabled) {
532
+ this.security.authorizeMethodSession(context);
533
+ this.trace.record(context, { kind: "authorization", name: "native Method NoCheck" });
534
+
535
+ return;
536
+ }
537
+
538
+ await this.authorize(
539
+ { kind: "method", name, item: input.context },
540
+ checkExecutionIdentity && Boolean(entry?.properties.execution_allowed_to),
541
+ context,
542
+ );
543
+ }
544
+
545
+ private async callMethod(input: MethodCall, context: ExecutionContext): Promise<Item> {
546
+ using permissions = this.security.methods.enter(context, this.boundMethods.has(input));
547
+ const entry = this.catalog.methodEntry(input.name);
548
+ const name =
549
+ typeof entry?.properties.name === "string" ? entry.properties.name : input.name;
550
+ const names = [input.name, name];
551
+
552
+ if (entry) {
553
+ names.push(entry.id);
554
+ }
555
+
556
+ const mocked = this.options.mocks?.method(names, input.context);
557
+
558
+ if (mocked) {
559
+ await this.authorizeMethod(
560
+ input,
561
+ name,
562
+ entry,
563
+ context,
564
+ permissions.checkExecutionIdentity,
565
+ );
566
+
567
+ return this.checkedMethodResult(
568
+ input,
569
+ this.mockedMethodResult(name, entry, mocked, context),
570
+ );
571
+ }
572
+
573
+ const definition = this.catalog.method(input.name);
574
+ const source: CallSource = {
575
+ source: definition.source,
576
+ sourceHash: definition.hash,
577
+ definition: { type: "Method", id: definition.id },
578
+ };
579
+ this.trace.record(context, { kind: "method", name: definition.name, ...source });
580
+ await this.authorizeMethod(
581
+ input,
582
+ definition.name,
583
+ entry,
584
+ context,
585
+ permissions.checkExecutionIdentity,
586
+ );
587
+ const executor = this.executorFor(definition);
588
+
589
+ return this.checkedMethodResult(
590
+ input,
591
+ await this.executeMethod(
592
+ executor,
593
+ definition,
594
+ input.context,
595
+ source,
596
+ context,
597
+ input.eventData,
598
+ ),
599
+ );
600
+ }
601
+
602
+ private checkedMethodResult(input: MethodCall, result: Item): Item {
603
+ if (this.boundMethods.get(input) === BoundMethodKind.Callback && result.isError()) {
604
+ throw new ApplicationError(result);
605
+ }
606
+
607
+ return result;
608
+ }
609
+
610
+ private async executeMethod(
611
+ executor: MethodExecutor,
612
+ definition: MethodDefinition,
613
+ item: Item,
614
+ source: CallSource,
615
+ context: ExecutionContext,
616
+ data?: MethodEventData,
617
+ ): Promise<Item> {
618
+ let executed = false;
619
+ let acceptingSignals = true;
620
+ using identityScope = this.security.grants.scope(context);
621
+ using eventScope = this.replacements.scope(definition.id, context);
622
+ const executionStarted = (): void => {
623
+ if (acceptingSignals && !executed) {
624
+ executed = true;
625
+ this.trace.record(context, { kind: "execution", name: definition.name, ...source });
626
+ }
627
+ };
628
+
629
+ try {
630
+ const result = await executor.execute(definition, item, {
631
+ ...this.methodPorts(definition, item, context, executionStarted),
632
+ security: identityScope,
633
+ ...(eventScope ? { serverEvent: eventScope } : {}),
634
+ ...(data ? { eventData: cloneFrozenData(data) } : {}),
635
+ });
636
+ // An adapter that completes execution provides evidence even without an early-start
637
+ // signal.
638
+ executionStarted();
639
+
640
+ if (result.isError() && result.getErrorCode() !== "0") {
641
+ this.trace.record(context, {
642
+ kind: "result",
643
+ name: definition.name,
644
+ result: result.payload,
645
+ });
646
+ }
647
+
648
+ return requireSuccess(result);
649
+ } finally {
650
+ acceptingSignals = false;
651
+ }
652
+ }
653
+
654
+ private executorFor(definition: MethodDefinition): MethodExecutor {
655
+ const executor = this.executors.get(definition.language.toLowerCase());
656
+ const capability = capabilityForLanguage(definition.language);
657
+
658
+ if (!executor) {
659
+ throw new PlatformError(
660
+ "MissingExecutor",
661
+ `Method '${definition.name}' requires a '${definition.language}' executor ` +
662
+ `(${definition.source.file}:${definition.source.line}).`,
663
+ capability !== undefined ? { capability } : undefined,
664
+ );
665
+ }
666
+
667
+ return executor;
668
+ }
669
+
670
+ private mockResult(
671
+ name: string,
672
+ mock: MockMatch,
673
+ context: ExecutionContext,
674
+ source?: CallSource,
675
+ ): Item {
676
+ this.trace.record(context, {
677
+ kind: "mock",
678
+ name,
679
+ ...source,
680
+ result: mock.result.payload,
681
+ mock: {
682
+ definition: mock.definition,
683
+ responseHash: mock.responseHash,
684
+ parameters: mock.parameters,
685
+ ...(mock.responseFile ? { responseFile: mock.responseFile } : {}),
686
+ },
687
+ });
688
+
689
+ return requireSuccess(mock.result);
690
+ }
691
+
692
+ private eventBindings(
693
+ definition: ItemTypeDefinition,
694
+ name: string,
695
+ enabled: boolean,
696
+ version = ServerEventVersion.Item,
697
+ ) {
698
+ return this.catalog.events(definition, name, enabled, version);
699
+ }
700
+
701
+ private hasAfterEvents(type: string): boolean {
702
+ const definition = this.catalog.itemType(type);
703
+ const names = [
704
+ "onAfterAdd",
705
+ "onAfterUpdate",
706
+ "onAfterMethod",
707
+ "onAfterLock",
708
+ "onAfterUnlock",
709
+ ];
710
+
711
+ return names.some((name) =>
712
+ [ServerEventVersion.Item, ServerEventVersion.Collection].some(
713
+ (version) => this.eventBindings(definition, name, true, version).length > 0,
714
+ ),
715
+ );
716
+ }
717
+
718
+ private async events(
719
+ definition: ItemTypeDefinition,
720
+ name: string,
721
+ item: Item,
722
+ enabled: boolean,
723
+ context: ExecutionContext,
724
+ version = ServerEventVersion.Item,
725
+ data?: MethodEventData,
726
+ ): Promise<void> {
727
+ const bindings = [...this.eventBindings(definition, name, enabled, version)];
728
+
729
+ if (data?.kind === MethodEventDataKind.BeforeUpdate) {
730
+ bindings.push(
731
+ ...this.eventBindings(definition, name, enabled, ServerEventVersion.Collection),
732
+ );
733
+ bindings.sort(
734
+ (left, right) =>
735
+ Number(left.entry.properties.sort_order ?? 0) -
736
+ Number(right.entry.properties.sort_order ?? 0),
737
+ );
738
+ }
739
+
740
+ for (const binding of bindings) {
741
+ if (binding.version === ServerEventVersion.Collection && data) {
742
+ await this.invokeEvent(binding, name, Item.create(""), context, data);
743
+
744
+ continue;
745
+ }
746
+
747
+ if (version === ServerEventVersion.Item) {
748
+ await this.hydrateEventItem(name, item, context);
749
+ }
750
+
751
+ await this.invokeEvent(binding, name, item, context, data);
752
+ }
753
+ }
754
+
755
+ private async invokeEvent(
756
+ binding: EventBinding,
757
+ name: string,
758
+ item: Item,
759
+ context: ExecutionContext,
760
+ data?: MethodEventData,
761
+ ): Promise<void> {
762
+ this.trace.record(context, { kind: "event", name, source: binding.entry.source });
763
+ // Callbacks share their input; the separate response supplies faults, not input patches.
764
+ await this.callBoundMethod(
765
+ {
766
+ name: binding.methodId,
767
+ context: item,
768
+ ...(data ? { eventData: data } : {}),
769
+ },
770
+ context,
771
+ BoundMethodKind.Callback,
772
+ );
773
+ }
774
+
775
+ private async hydrateEventItem(
776
+ name: string,
777
+ item: Item,
778
+ context: ExecutionContext,
779
+ ): Promise<void> {
780
+ if (name === "onAfterGet") {
781
+ return;
782
+ }
783
+
784
+ if (item.getItemCount() !== 1) {
785
+ throw new PlatformError(
786
+ "InvalidServerEventContext",
787
+ `Event '${name}' requires one current document Item.`,
788
+ );
789
+ }
790
+
791
+ const node = item.node;
792
+
793
+ if (
794
+ !node.attributes.id ||
795
+ Object.keys(node.attributes).length !== 1 ||
796
+ Object.keys(node.properties).length > 0 ||
797
+ Object.keys(node.propertyItems).length > 0 ||
798
+ Object.keys(node.propertyAttributes).length > 0 ||
799
+ node.relationships.length > 0 ||
800
+ (node.logical?.length ?? 0) > 0
801
+ ) {
802
+ return;
803
+ }
804
+
805
+ const request = Item.create(node.type, "get");
806
+ request.setProperty("id", node.attributes.id);
807
+ const result = requireSuccess(await dispatchItem(request, context));
808
+
809
+ if (result.isError() || result.getItemCount() === 0) {
810
+ throw new ApplicationError(
811
+ Item.error(
812
+ `Cannot load '${node.type}:${node.attributes.id}' for '${name}'.`,
813
+ "ItemNotFound",
814
+ ),
815
+ );
816
+ }
817
+
818
+ item.payload.items = result.getItemByIndex(0).clone().payload.items;
819
+ }
820
+
821
+ private async apply(item: Item, context: ExecutionContext, baseEvent?: string): Promise<Item> {
822
+ const request = item.node;
823
+ const action = request.attributes.action ?? "get";
824
+
825
+ if (request.type.toLowerCase() === "sql" && /^sql\s+process$/i.test(action)) {
826
+ return this.applySqlProcess(item, context);
827
+ }
828
+
829
+ if (reservedActions.has(action)) {
830
+ throw new PlatformError(
831
+ "UnsupportedAction",
832
+ `Platform action '${action}' is not implemented.`,
833
+ );
834
+ }
835
+
836
+ if (!actions.has(action)) {
837
+ return await context.execute(callMethodOperation, {
838
+ name: action,
839
+ context: item,
840
+ });
841
+ }
842
+
843
+ const definition = this.catalog.itemType(request.type);
844
+ validateRequest(request, action);
845
+
846
+ if (action !== "get") {
847
+ this.responses.prepare(request, context);
848
+ }
849
+
850
+ this.traceAction(definition, item, action, context);
851
+ const enabled = this.baseUpdates.enabled(item) ?? request.attributes.serverEvents !== "0";
852
+ this.assertActionSupported(definition, action);
853
+ await this.authorizeAction(definition, action, item, context);
854
+
855
+ if (["lock", "unlock", "promoteItem"].includes(action)) {
856
+ return await this.applyStateAction(definition, item, context, baseEvent);
857
+ }
858
+
859
+ const verb = ["edit", "version"].includes(action)
860
+ ? "Update"
861
+ : action[0]?.toUpperCase() + action.slice(1);
862
+
863
+ if (
864
+ !["get", "add"].includes(action) &&
865
+ !(definition.isVersionable && ["edit", "update", "version"].includes(action))
866
+ ) {
867
+ return await this.mutateExisting(definition, item, verb, enabled, context, baseEvent);
868
+ }
869
+
870
+ return await this.applyStandardAction(definition, item, verb, enabled, context, baseEvent);
871
+ }
872
+
873
+ private async applyStandardAction(
874
+ definition: ItemTypeDefinition,
875
+ item: Item,
876
+ verb: string,
877
+ enabled: boolean,
878
+ context: ExecutionContext,
879
+ baseEvent?: string,
880
+ ): Promise<Item> {
881
+ const action = item.getAction();
882
+
883
+ if (definition.isVersionable && ["edit", "update", "version"].includes(action)) {
884
+ return await this.applyVersionedUpdate(definition, item, context);
885
+ }
886
+
887
+ const replacement = await this.replaceAction(
888
+ definition,
889
+ item,
890
+ verb,
891
+ enabled,
892
+ context,
893
+ baseEvent,
894
+ );
895
+
896
+ if (replacement) {
897
+ return replacement;
898
+ }
899
+
900
+ // The default action retains this node while callbacks share its changing document.
901
+ const request = item.node;
902
+
903
+ if (action === "add") {
904
+ this.prepareAddId(request, context);
905
+ }
906
+
907
+ const targetId = request.attributes.id;
908
+ const responseRequest = { ...request, attributes: { ...request.attributes } };
909
+ await this.events(definition, `onBefore${verb}`, requestDocument(item), enabled, context);
910
+ validateRequest(request, action);
911
+
912
+ this.assertActionContext(definition, request, action, targetId);
913
+
914
+ if (action === "get") {
915
+ return await this.get(definition, request, enabled, context);
916
+ }
917
+
918
+ return await this.add(
919
+ definition,
920
+ new Item({ items: [request] }),
921
+ enabled,
922
+ responseRequest,
923
+ context,
924
+ );
925
+ }
926
+
927
+ private prepareAddId(request: ItemNode, context: ExecutionContext): void {
928
+ assertActiveContext(context);
929
+
930
+ if (request.attributes.id) {
931
+ return;
932
+ }
933
+
934
+ request.attributes.id = this.nextId();
935
+ }
936
+
937
+ private assertActionContext(
938
+ definition: ItemTypeDefinition,
939
+ request: ItemNode,
940
+ action: string,
941
+ targetId: string | undefined,
942
+ ): void {
943
+ if (
944
+ request.type.toLowerCase() !== definition.name.toLowerCase() ||
945
+ (request.attributes.action ?? "get") !== action ||
946
+ (action !== "get" && targetId !== undefined && request.attributes.id !== targetId)
947
+ ) {
948
+ throw new PlatformError(
949
+ "UnsupportedContextChange",
950
+ "A before event cannot change the ItemType, action or captured target ID.",
951
+ );
952
+ }
953
+ }
954
+
955
+ private async authorizeAction(
956
+ definition: ItemTypeDefinition,
957
+ action: string,
958
+ item: Item,
959
+ context: ExecutionContext,
960
+ ): Promise<void> {
961
+ let restricted = false;
962
+
963
+ if (this.options.authorization === undefined) {
964
+ const metadata = this.storage.getCatalogEntry("ItemType", definition.id);
965
+ restricted =
966
+ this.storage
967
+ .listCatalogEntries("Allowed Permission")
968
+ .some((entry) => entry.properties.source_id === definition.id) ||
969
+ metadata?.properties.use_src_access === "1";
970
+ }
971
+
972
+ await this.authorize(
973
+ { kind: "action", name: `${definition.name}.${action}`, item },
974
+ restricted,
975
+ context,
976
+ );
977
+ }
978
+
979
+ private traceAction(
980
+ definition: ItemTypeDefinition,
981
+ item: Item,
982
+ action: string,
983
+ context: ExecutionContext,
984
+ ): void {
985
+ this.trace.record(context, {
986
+ kind: "action",
987
+ name: `${definition.name}.${action}`,
988
+ request: item.payload,
989
+ ...(definition.source ? { source: definition.source } : {}),
990
+ });
991
+ }
992
+
993
+ private async applyStateAction(
994
+ definition: ItemTypeDefinition,
995
+ item: Item,
996
+ context: ExecutionContext,
997
+ baseEvent?: string,
998
+ ): Promise<Item> {
999
+ const action = item.getAction();
1000
+ let verb = "Unlock";
1001
+
1002
+ if (action === "promoteItem") {
1003
+ verb = "Promote";
1004
+ } else if (action === "lock") {
1005
+ verb = "Lock";
1006
+ }
1007
+
1008
+ const replacement = await this.replaceAction(
1009
+ definition,
1010
+ item,
1011
+ verb,
1012
+ item.getAttribute("serverEvents") !== "0",
1013
+ context,
1014
+ baseEvent,
1015
+ );
1016
+
1017
+ if (replacement) {
1018
+ return replacement;
1019
+ }
1020
+
1021
+ const records = await this.query(definition, item.node, context);
1022
+
1023
+ if (!records.length) {
1024
+ throw new ApplicationError(
1025
+ Item.error(
1026
+ `No '${definition.name}' records match this ${action} request.`,
1027
+ "NoItems",
1028
+ ),
1029
+ );
1030
+ }
1031
+
1032
+ const result: ItemNode[] = [];
1033
+
1034
+ for (const record of records) {
1035
+ const response = await this.applyStateTarget(definition, record, item, context);
1036
+ result.push(...response.payload.items);
1037
+ }
1038
+
1039
+ return await this.responses.complete(item.node, new Item({ items: result }), context);
1040
+ }
1041
+
1042
+ private async applyStateTarget(
1043
+ definition: ItemTypeDefinition,
1044
+ record: StoredItem,
1045
+ item: Item,
1046
+ context: ExecutionContext,
1047
+ ): Promise<Item> {
1048
+ const action = item.getAction();
1049
+ this.security.assertMutation(definition, record, action, context);
1050
+
1051
+ if (definition.isVersionable) {
1052
+ this.versioning.assertCurrent(record);
1053
+ }
1054
+
1055
+ if (action === "promoteItem") {
1056
+ this.locks.assertAvailable(record);
1057
+
1058
+ return await this.lifeCycles.promote(definition, record, item, context, (transition) =>
1059
+ this.authorizeTransition(transition, record, item, context),
1060
+ );
1061
+ }
1062
+
1063
+ return await this.locks.base(
1064
+ definition,
1065
+ record,
1066
+ action === "lock" ? "lock" : "unlock",
1067
+ context,
1068
+ item,
1069
+ );
1070
+ }
1071
+
1072
+ private async authorizeTransition(
1073
+ transition: CatalogEntry,
1074
+ record: StoredItem,
1075
+ item: Item,
1076
+ context: ExecutionContext,
1077
+ ): Promise<void> {
1078
+ if (this.security.enabled) {
1079
+ this.security.transition(transition, record, context);
1080
+
1081
+ return;
1082
+ }
1083
+
1084
+ await this.authorize(
1085
+ { kind: "transition", name: transition.id, item },
1086
+ Boolean(transition.properties.role),
1087
+ context,
1088
+ );
1089
+ }
1090
+
1091
+ private applySqlProcess(item: Item, context: ExecutionContext): Item {
1092
+ const name = item.getProperty("name");
1093
+ const mocked = this.options.mocks?.sql(name, properties(item));
1094
+
1095
+ if (mocked) {
1096
+ return this.mockResult(`SQL Process: ${name}`, mocked, context, this.sqlSource(name));
1097
+ }
1098
+
1099
+ return this.unsupportedSqlProcess(item, context);
1100
+ }
1101
+
1102
+ private unsupportedSqlProcess(item: Item, context: ExecutionContext): never {
1103
+ const name = item.getProperty("name");
1104
+ const definitions = this.storage
1105
+ .listCatalogEntries("SQL")
1106
+ .filter(
1107
+ (definition) =>
1108
+ String(definition.properties.name).toLowerCase() === name.toLowerCase(),
1109
+ );
1110
+ const definition = definitions[0];
1111
+
1112
+ if (definitions.length !== 1 || !definition) {
1113
+ throw new PlatformError(
1114
+ "SqlResolution",
1115
+ `SQL '${name}' resolved to ${definitions.length} imported definitions.`,
1116
+ );
1117
+ }
1118
+
1119
+ const body = definition.properties.sqlserver_body;
1120
+
1121
+ if (typeof body !== "string") {
1122
+ throw new PlatformError(
1123
+ "InvalidSqlDefinition",
1124
+ `SQL '${name}' has no sqlserver_body source.`,
1125
+ );
1126
+ }
1127
+
1128
+ this.trace.record(context, {
1129
+ kind: "action",
1130
+ name: `SQL Process: ${name}`,
1131
+ source: definition.source,
1132
+ sourceHash: new Bun.CryptoHasher("sha256").update(body).digest("hex"),
1133
+ definition: { type: "SQL", id: definition.id },
1134
+ });
1135
+
1136
+ throw new PlatformError(
1137
+ "UnsupportedSQL",
1138
+ `T-SQL execution is not implemented for '${name}' (${definition.source.file}:${definition.source.line}).`,
1139
+ );
1140
+ }
1141
+
1142
+ private sqlSource(name: string): CallSource | undefined {
1143
+ const definitions = this.storage
1144
+ .listCatalogEntries("SQL")
1145
+ .filter((entry) => String(entry.properties.name).toLowerCase() === name.toLowerCase());
1146
+ const entry = definitions[0];
1147
+
1148
+ if (definitions.length !== 1 || !entry) {
1149
+ return undefined;
1150
+ }
1151
+
1152
+ const body = entry.properties.sqlserver_body;
1153
+
1154
+ return {
1155
+ source: entry.source,
1156
+ definition: { type: "SQL", id: entry.id },
1157
+ ...(typeof body === "string"
1158
+ ? { sourceHash: new Bun.CryptoHasher("sha256").update(body).digest("hex") }
1159
+ : {}),
1160
+ };
1161
+ }
1162
+
1163
+ private async query(
1164
+ definition: ItemTypeDefinition,
1165
+ request: ItemNode,
1166
+ context: ExecutionContext,
1167
+ ): Promise<readonly StoredItem[]> {
1168
+ return (await this.queries.run(definition, request, context)).records;
1169
+ }
1170
+
1171
+ private async add(
1172
+ definition: ItemTypeDefinition,
1173
+ item: Item,
1174
+ enabled: boolean,
1175
+ responseRequest: ItemNode,
1176
+ context: ExecutionContext,
1177
+ ): Promise<Item> {
1178
+ const request = item.node;
1179
+ const id = request.attributes.id;
1180
+
1181
+ if (!id) {
1182
+ throw new Error("The default Add must allocate its ID before running before hooks.");
1183
+ }
1184
+
1185
+ if (request.attributes.where) {
1186
+ throw new PlatformError("InvalidAdd", "add cannot contain a where selector.");
1187
+ }
1188
+
1189
+ await this.graph.properties(definition, request, context);
1190
+ this.assertAddProperties(definition, request);
1191
+ const properties = this.creationProperties(definition, request, id, context);
1192
+ Object.assign(properties, this.security.creation(definition, properties, context));
1193
+ const record = this.references.initialize(definition, {
1194
+ id,
1195
+ type: definition.name,
1196
+ properties: normalizeProperties(this.storage, definition, properties, {
1197
+ creating: true,
1198
+ id,
1199
+ }),
1200
+ });
1201
+ assertActiveContext(context);
1202
+ this.storage.insertItem(record);
1203
+ this.references.sessions.created(record, context);
1204
+ this.trace.record(context, {
1205
+ kind: "mutation",
1206
+ name: "add",
1207
+ after: record,
1208
+ });
1209
+ const children = await this.graph.relationships(definition, request, id, context);
1210
+
1211
+ const response = this.recordResponse(definition, record, request, children);
1212
+ await this.afterEvents.run(
1213
+ definition,
1214
+ "onAfterAdd",
1215
+ afterAddFrames(definition.id, id),
1216
+ enabled,
1217
+ context,
1218
+ );
1219
+
1220
+ return await this.responses.complete(responseRequest, response, context);
1221
+ }
1222
+
1223
+ private setupPlatform(registrar: ModuleRegistrar): void {
1224
+ registrar.handleAsync(deleteOwnedItemOperation, (input, context) =>
1225
+ this.deleteOwned(input.parent, input.child, input.enabled, context),
1226
+ );
1227
+
1228
+ for (const executor of this.executors.values()) {
1229
+ if (claimedExecutors.has(executor)) {
1230
+ throw new PlatformError(
1231
+ "ExecutorAlreadyAttached",
1232
+ "Create a separate executor instance for each harness world.",
1233
+ );
1234
+ }
1235
+ }
1236
+
1237
+ for (const executor of this.executors.values()) {
1238
+ claimedExecutors.add(executor);
1239
+ this.ownedExecutors.add(executor);
1240
+ }
1241
+
1242
+ this.registerSeedOperations(registrar);
1243
+ registrar.handleAsync(applyBaseItemOperation, (input, context) =>
1244
+ this.references.sessions.run(context, () => this.applyBaseItem(input, context)),
1245
+ );
1246
+ registrar.handleAsync(applyItemOperation, (item, context) =>
1247
+ this.references.sessions.run(context, () => this.apply(item.clone(), context)),
1248
+ );
1249
+ registrar.handleAsync(callMethodOperation, (input, context) =>
1250
+ this.references.sessions.run(context, () => this.callMethod(input, context)),
1251
+ );
1252
+ registrar.handleAsync(applySqlOperation, async (input, context) => {
1253
+ const mocked = this.options.mocks?.sql(true, {
1254
+ ...input.values,
1255
+ method: input.method,
1256
+ query: input.query,
1257
+ });
1258
+
1259
+ if (mocked) {
1260
+ return this.mockResult(`SQL: ${input.method}`, mocked, context);
1261
+ }
1262
+
1263
+ throw new PlatformError(
1264
+ "UnsupportedSQL",
1265
+ `T-SQL execution is not implemented (called by '${input.method}').`,
1266
+ );
1267
+ });
1268
+ registrar.handleAsync(applyAMLOperation, (xml, context) =>
1269
+ this.references.sessions.run(context, () => this.applyAML(xml, context)),
1270
+ );
1271
+ }
1272
+
1273
+ private async deleteOwned(
1274
+ parent: StoredItem,
1275
+ child: StoredItem,
1276
+ enabled: boolean,
1277
+ context: ExecutionContext,
1278
+ ): Promise<Item> {
1279
+ const owner = this.storage.getItem(parent.type, parent.id);
1280
+ const record = this.storage.getItem(child.type, child.id);
1281
+
1282
+ if (
1283
+ !owner ||
1284
+ !record ||
1285
+ String(record.properties.source_id).toLowerCase() !== owner.id.toLowerCase()
1286
+ ) {
1287
+ throw new PlatformError(
1288
+ "RelationshipSource",
1289
+ "An owned deletion requires its persisted parent.",
1290
+ );
1291
+ }
1292
+
1293
+ relationshipType(this.storage, this.catalog.itemType(parent.type), child.type);
1294
+ const request = Item.create(child.type, "delete");
1295
+ request.setAttribute("id", child.id);
1296
+
1297
+ if (!enabled) {
1298
+ request.setAttribute("serverEvents", "0");
1299
+ }
1300
+
1301
+ return await this.security.deletingOwned(record, context, () =>
1302
+ context.execute(applyBaseItemOperation, { item: request, event: "onDelete" }),
1303
+ );
1304
+ }
1305
+
1306
+ private async applyAML(xml: string, context: ExecutionContext): Promise<Item> {
1307
+ const nodes: ItemNode[] = [];
1308
+ const requests = parseItems(xml);
1309
+
1310
+ for (const item of requests) {
1311
+ const result = requireSuccess(await context.execute(applyItemOperation, item));
1312
+
1313
+ if (requests.length === 1) {
1314
+ return result;
1315
+ }
1316
+
1317
+ if (result.isError()) {
1318
+ throw new PlatformError(
1319
+ "UnsupportedBatchResult",
1320
+ "Batch AML with a no-items result is not supported.",
1321
+ );
1322
+ }
1323
+
1324
+ for (const node of result.payload.items) {
1325
+ spendContext(context);
1326
+ nodes.push(node);
1327
+ }
1328
+ }
1329
+
1330
+ return new Item({ items: nodes });
1331
+ }
1332
+
1333
+ private registerSeedOperations(registrar: ModuleRegistrar): void {
1334
+ registrar.handleSync(seedOperation, (input, context) => this.seed(input, context));
1335
+ registrar.handleSync(seedRecordsOperation, (records, context) => {
1336
+ const targets = new Set(
1337
+ records.map((record) =>
1338
+ JSON.stringify([record.type.toLowerCase(), record.id.toLowerCase()]),
1339
+ ),
1340
+ );
1341
+
1342
+ for (const record of records) {
1343
+ this.seed(record, context, { id: record.id, targets });
1344
+ }
1345
+ });
1346
+ }
1347
+
1348
+ private assertActionSupported(definition: ItemTypeDefinition, action: string): void {
1349
+ if (action !== "get") {
1350
+ this.catalog.assertMutable(definition);
1351
+ }
1352
+
1353
+ if (action === "version" && !definition.isVersionable) {
1354
+ throw new PlatformError(
1355
+ "NotVersionable",
1356
+ `ItemType '${definition.name}' is not versionable.`,
1357
+ );
1358
+ }
1359
+
1360
+ if (
1361
+ action === "edit" &&
1362
+ !definition.isVersionable &&
1363
+ this.storage
1364
+ .listCatalogEntries("Server Event")
1365
+ .some(
1366
+ (event) =>
1367
+ event.properties.source_id === definition.id &&
1368
+ /lock/i.test(String(event.properties.server_event)),
1369
+ )
1370
+ ) {
1371
+ throw new PlatformError(
1372
+ "UnsupportedLocking",
1373
+ `edit on '${definition.name}' requires lock event semantics that are not implemented.`,
1374
+ );
1375
+ }
1376
+ }
1377
+
1378
+ private async replaceAction(
1379
+ definition: ItemTypeDefinition,
1380
+ item: Item,
1381
+ verb: string,
1382
+ enabled: boolean,
1383
+ context: ExecutionContext,
1384
+ baseEvent?: string,
1385
+ applyBase?: ApplyEventBase,
1386
+ ): Promise<Item | undefined> {
1387
+ if (baseEvent === `on${verb}`) {
1388
+ return undefined;
1389
+ }
1390
+
1391
+ const replacement = this.eventBindings(definition, `on${verb}`, enabled);
1392
+
1393
+ if (replacement.length) {
1394
+ if (replacement.length !== 1) {
1395
+ throw new PlatformError(
1396
+ "AmbiguousReplacement",
1397
+ `Multiple replacement handlers for '${definition.name}.on${verb}' are not supported.`,
1398
+ );
1399
+ }
1400
+
1401
+ const binding = replacement[0];
1402
+
1403
+ if (!binding) {
1404
+ throw new PlatformError("InvalidEvent", "Missing replacement binding.");
1405
+ }
1406
+
1407
+ this.trace.record(context, {
1408
+ kind: "event",
1409
+ name: `on${verb}`,
1410
+ source: binding.entry.source,
1411
+ });
1412
+
1413
+ return await this.replacements.invoke(
1414
+ binding,
1415
+ `on${verb}`,
1416
+ item,
1417
+ context,
1418
+ (request, nested) => this.delegateBase(request, `on${verb}`, nested, applyBase),
1419
+ () => this.callBoundMethod({ name: binding.methodId, context: item }, context),
1420
+ );
1421
+ }
1422
+
1423
+ return undefined;
1424
+ }
1425
+
1426
+ private async delegateBase(
1427
+ item: Item,
1428
+ event: string,
1429
+ context: ExecutionContext,
1430
+ applyBase?: ApplyEventBase,
1431
+ ): Promise<Item> {
1432
+ const input = { item, event };
1433
+
1434
+ if (applyBase) {
1435
+ this.baseOverrides.set(input, applyBase);
1436
+ }
1437
+
1438
+ try {
1439
+ return await context.execute(applyBaseItemOperation, input);
1440
+ } finally {
1441
+ this.baseOverrides.delete(input);
1442
+ }
1443
+ }
1444
+
1445
+ private async applyBaseItem(input: BaseItemCall, context: ExecutionContext): Promise<Item> {
1446
+ const applyBase = this.baseOverrides.get(input);
1447
+
1448
+ if (applyBase) {
1449
+ return await applyBase(input.item, context);
1450
+ }
1451
+
1452
+ return await this.apply(input.item, context, input.event);
1453
+ }
1454
+
1455
+ private async updateEvent(
1456
+ definition: ItemTypeDefinition,
1457
+ request: Item,
1458
+ context: ExecutionContext,
1459
+ applyBase: ApplyUpdateBase,
1460
+ ): Promise<Item> {
1461
+ await this.authorizeAction(definition, request.getAction(), request, context);
1462
+ const attributes = { ...request.node.attributes };
1463
+ const complete: ApplyEventBase = async (item, nested) => {
1464
+ // Native delegates capture these flags before the replacement mutates its DOM.
1465
+ for (const name of ["serverEvents", "doGetItem"]) {
1466
+ delete item.node.attributes[name];
1467
+
1468
+ if (attributes[name] !== undefined) {
1469
+ item.node.attributes[name] = attributes[name];
1470
+ }
1471
+ }
1472
+
1473
+ const result = await applyBase(item, nested);
1474
+
1475
+ if (result.completed) {
1476
+ return result.response;
1477
+ }
1478
+
1479
+ const responseRequest = {
1480
+ ...item.node,
1481
+ attributes: { ...item.node.attributes, action: "update" },
1482
+ };
1483
+
1484
+ return await this.responses.complete(responseRequest, result.response, nested);
1485
+ };
1486
+ const replacement = await this.replaceAction(
1487
+ definition,
1488
+ request,
1489
+ "Update",
1490
+ request.getAttribute("serverEvents") !== "0",
1491
+ context,
1492
+ undefined,
1493
+ complete,
1494
+ );
1495
+
1496
+ return replacement ?? (await complete(request, context));
1497
+ }
1498
+
1499
+ private async applyVersionedUpdate(
1500
+ definition: ItemTypeDefinition,
1501
+ item: Item,
1502
+ context: ExecutionContext,
1503
+ ): Promise<Item> {
1504
+ const request = item.node;
1505
+ const action = item.getAction();
1506
+ const records = await this.query(definition, request, context);
1507
+
1508
+ if (!records.length) {
1509
+ throw new ApplicationError(
1510
+ Item.error(
1511
+ `No '${definition.name}' records match this ${action} request.`,
1512
+ "NoItems",
1513
+ ),
1514
+ );
1515
+ }
1516
+
1517
+ const result = await this.versioning.applyBatch(definition, records, item, context);
1518
+
1519
+ if (result.completed) {
1520
+ return result.response;
1521
+ }
1522
+
1523
+ return await this.responses.complete(request, result.response, context);
1524
+ }
1525
+
1526
+ private async get(
1527
+ definition: ItemTypeDefinition,
1528
+ request: ItemNode,
1529
+ enabled: boolean,
1530
+ context: ExecutionContext,
1531
+ ): Promise<Item> {
1532
+ const project = compileProjection(
1533
+ this.storage,
1534
+ definition,
1535
+ request.attributes.select,
1536
+ (type, record) => this.security.readable(type, [record], context).length === 1,
1537
+ );
1538
+ const selection = await this.queries.run(definition, request, context);
1539
+ const records = selection.records;
1540
+
1541
+ if (!records.length) {
1542
+ const empty = Item.error(`No items of type '${definition.name}' found.`, "0");
1543
+
1544
+ if (selection.messages) {
1545
+ empty.payload.messages = selection.messages;
1546
+ }
1547
+
1548
+ return empty;
1549
+ }
1550
+
1551
+ const result = new Item({
1552
+ items: records.map((record) => ({
1553
+ ...project(record),
1554
+ relationships: [...(selection.relationships?.get(record.id) ?? [])],
1555
+ })),
1556
+ ...(selection.messages ? { messages: selection.messages } : {}),
1557
+ });
1558
+ await this.events(definition, "onAfterGet", result, enabled, context);
1559
+
1560
+ return result;
1561
+ }
1562
+
1563
+ private async mutateExisting(
1564
+ definition: ItemTypeDefinition,
1565
+ item: Item,
1566
+ verb: string,
1567
+ enabled: boolean,
1568
+ context: ExecutionContext,
1569
+ baseEvent?: string,
1570
+ ): Promise<Item> {
1571
+ const action = item.getAction();
1572
+ const records = await this.mutationTargets(definition, item, context);
1573
+ const result: ItemNode[] = [];
1574
+ const updated: string[] = [];
1575
+ let replaced = false;
1576
+
1577
+ const ids = records.map((record) => record.id);
1578
+
1579
+ for (const record of records) {
1580
+ if (action === "delete" && !this.storage.getItem(record.type, record.id)) {
1581
+ continue;
1582
+ }
1583
+
1584
+ const mutate = () =>
1585
+ this.mutateTarget(definition, record, item, verb, enabled, context, baseEvent, ids);
1586
+ const response =
1587
+ action === "delete"
1588
+ ? await this.references.sessions.deleting(record, context, mutate)
1589
+ : await mutate();
1590
+
1591
+ if (response.replaced && records.length === 1) {
1592
+ return response.response;
1593
+ }
1594
+
1595
+ if (response.replaced && response.response.payload.result !== undefined) {
1596
+ throw new PlatformError(
1597
+ "UnsupportedBatchResult",
1598
+ "A collection replacement cannot combine text responses.",
1599
+ );
1600
+ }
1601
+
1602
+ result.push(...response.response.payload.items);
1603
+ replaced ||= response.replaced;
1604
+
1605
+ if (!response.replaced) {
1606
+ updated.push(record.id);
1607
+ }
1608
+ }
1609
+
1610
+ const response = new Item({ items: result });
1611
+
1612
+ if (verb === "Update") {
1613
+ await this.afterEvents.run(
1614
+ definition,
1615
+ "onAfterUpdate",
1616
+ afterUpdateFrames(definition.id, Object.fromEntries(updated.map((id) => [id, id]))),
1617
+ enabled,
1618
+ context,
1619
+ );
1620
+ }
1621
+
1622
+ return replaced
1623
+ ? response
1624
+ : await this.responses.complete(this.baseUpdates.response(item), response, context);
1625
+ }
1626
+
1627
+ private async mutationTargets(
1628
+ definition: ItemTypeDefinition,
1629
+ item: Item,
1630
+ context: ExecutionContext,
1631
+ ): Promise<readonly StoredItem[]> {
1632
+ const pinned = this.baseUpdates.targets(item);
1633
+ const records = pinned
1634
+ ? this.pinnedMutationTargets(definition, pinned, context)
1635
+ : await this.query(definition, item.node, context);
1636
+ const action = item.getAction();
1637
+
1638
+ if (records.length === 0) {
1639
+ throw new ApplicationError(
1640
+ Item.error(
1641
+ `No '${definition.name}' records match this ${action} request.`,
1642
+ "NoItems",
1643
+ ),
1644
+ );
1645
+ }
1646
+
1647
+ return action === "delete" ? this.deletionTargets(definition, records, context) : records;
1648
+ }
1649
+
1650
+ private pinnedMutationTargets(
1651
+ definition: ItemTypeDefinition,
1652
+ ids: readonly string[],
1653
+ context: ExecutionContext,
1654
+ ): StoredItem[] {
1655
+ return ids.map((id) => {
1656
+ spendContext(context);
1657
+ const record = this.storage.getItem(definition.name, id);
1658
+
1659
+ if (!record) {
1660
+ throw new ApplicationError(
1661
+ Item.error(`Captured '${definition.name}:${id}' no longer exists.`, "NoItems"),
1662
+ );
1663
+ }
1664
+
1665
+ return record;
1666
+ });
1667
+ }
1668
+
1669
+ private deletionTargets(
1670
+ definition: ItemTypeDefinition,
1671
+ records: readonly StoredItem[],
1672
+ context: ExecutionContext,
1673
+ ): readonly StoredItem[] {
1674
+ let targets = records;
1675
+
1676
+ if (definition.isVersionable) {
1677
+ targets = [
1678
+ ...new Map(
1679
+ records
1680
+ .flatMap((record) => this.versioning.family(record))
1681
+ .map((record) => [record.id, record]),
1682
+ ).values(),
1683
+ ];
1684
+ }
1685
+
1686
+ this.deletion.prepare(targets, context);
1687
+
1688
+ return targets;
1689
+ }
1690
+
1691
+ private async mutateTarget(
1692
+ definition: ItemTypeDefinition,
1693
+ record: StoredItem,
1694
+ original: Item,
1695
+ verb: string,
1696
+ enabled: boolean,
1697
+ context: ExecutionContext,
1698
+ baseEvent?: string,
1699
+ idList: readonly string[] = [record.id],
1700
+ ): Promise<MutationResult> {
1701
+ this.security.assertMutation(definition, record, original.getAction(), context);
1702
+ const item = original.clone();
1703
+ item.node.attributes.id = record.id;
1704
+ delete item.node.attributes.where;
1705
+ delete item.node.attributes.idlist;
1706
+ const attributes = { ...item.node.attributes };
1707
+ const applyBase: ApplyEventBase | undefined =
1708
+ verb === "Update"
1709
+ ? (pending, nested) =>
1710
+ this.applyCapturedMutation(pending, record.id, attributes, nested)
1711
+ : undefined;
1712
+ const replacement = await this.replaceAction(
1713
+ definition,
1714
+ item,
1715
+ verb,
1716
+ enabled,
1717
+ context,
1718
+ baseEvent,
1719
+ applyBase,
1720
+ );
1721
+
1722
+ if (replacement) {
1723
+ return { response: replacement, replaced: true };
1724
+ }
1725
+
1726
+ return {
1727
+ response: await this.mutateTargetBase(
1728
+ definition,
1729
+ record,
1730
+ item,
1731
+ verb,
1732
+ enabled,
1733
+ context,
1734
+ idList,
1735
+ ),
1736
+ replaced: false,
1737
+ };
1738
+ }
1739
+
1740
+ private async applyCapturedMutation(
1741
+ item: Item,
1742
+ id: string,
1743
+ attributes: Readonly<Record<string, string>>,
1744
+ context: ExecutionContext,
1745
+ ): Promise<Item> {
1746
+ using _scope = this.baseUpdates.enter(item, id, attributes, context);
1747
+
1748
+ return await this.apply(item, context, "onUpdate");
1749
+ }
1750
+
1751
+ private async mutateTargetBase(
1752
+ definition: ItemTypeDefinition,
1753
+ record: StoredItem,
1754
+ item: Item,
1755
+ verb: string,
1756
+ enabled: boolean,
1757
+ context: ExecutionContext,
1758
+ idList: readonly string[],
1759
+ ): Promise<Item> {
1760
+ const action = item.getAction();
1761
+ const captured = item.node;
1762
+ await this.events(
1763
+ definition,
1764
+ `onBefore${verb}`,
1765
+ item,
1766
+ enabled,
1767
+ context,
1768
+ ServerEventVersion.Item,
1769
+ verb === "Update"
1770
+ ? { kind: MethodEventDataKind.BeforeUpdate, id: record.id, idList }
1771
+ : undefined,
1772
+ );
1773
+ const request = verb === "Update" ? captured : item.node;
1774
+ validateRequest(request, action);
1775
+ this.assertActionContext(definition, request, action, record.id);
1776
+ const classification =
1777
+ action === "delete"
1778
+ ? undefined
1779
+ : this.lifeCycles.classificationChange(
1780
+ definition,
1781
+ record,
1782
+ request.properties,
1783
+ context,
1784
+ );
1785
+ await this.graph.properties(definition, request, context);
1786
+
1787
+ if (action === "delete") {
1788
+ await this.deletion.children(record, enabled, context);
1789
+ }
1790
+
1791
+ this.mutateRecord(definition, record, request, action, context, classification);
1792
+ let stored =
1793
+ action === "delete" ? record : this.storage.getItem(definition.name, record.id);
1794
+
1795
+ if (!stored) {
1796
+ throw new PlatformError("MissingItem", "Action result is missing.");
1797
+ }
1798
+
1799
+ await this.deletion.changed(
1800
+ record,
1801
+ action === "delete" ? undefined : stored,
1802
+ enabled,
1803
+ context,
1804
+ );
1805
+ const children = await this.graph.relationships(definition, request, record.id, context);
1806
+ stored = this.lifeCycles.applyClassification(stored, classification, context);
1807
+ const response = this.recordResponse(definition, stored, request, children);
1808
+ this.security.changed(record, stored, context);
1809
+
1810
+ if (verb !== "Update") {
1811
+ await this.events(definition, `onAfter${verb}`, response, enabled, context);
1812
+ }
1813
+
1814
+ return response;
1815
+ }
1816
+
1817
+ private recordResponse(
1818
+ definition: ItemTypeDefinition,
1819
+ record: StoredItem,
1820
+ request: ItemNode,
1821
+ children: ItemNode[],
1822
+ ): Item {
1823
+ return new Item({
1824
+ items: [
1825
+ {
1826
+ ...itemNode(definition.name),
1827
+ attributes: { id: record.id },
1828
+ properties: projectedProperties(
1829
+ this.storage,
1830
+ definition,
1831
+ record,
1832
+ selectedProperties(request),
1833
+ ),
1834
+ relationships: children,
1835
+ },
1836
+ ],
1837
+ });
1838
+ }
1839
+
1840
+ private mutateRecord(
1841
+ definition: ItemTypeDefinition,
1842
+ record: StoredItem,
1843
+ request: ItemNode,
1844
+ action: string,
1845
+ context: ExecutionContext,
1846
+ classification: ClassificationChange | undefined,
1847
+ ): void {
1848
+ if (Boolean(record.properties.locked_by_id)) {
1849
+ throw new PlatformError(
1850
+ "UnsupportedLocking",
1851
+ `Cannot mutate locked '${definition.name}' record '${record.id}' without lock ownership support.`,
1852
+ );
1853
+ }
1854
+
1855
+ if (action === "delete") {
1856
+ this.deletion.assertRemovable(record, context);
1857
+ assertActiveContext(context);
1858
+ this.storage.deleteItem(definition.name, record.id);
1859
+ this.references.sessions.deleted(record, context);
1860
+ this.trace.record(context, {
1861
+ kind: "mutation",
1862
+ name: "delete",
1863
+ before: record,
1864
+ });
1865
+ } else {
1866
+ this.updateRecord(definition, record, request, context, classification);
1867
+ }
1868
+ }
1869
+
1870
+ private updateRecord(
1871
+ definition: ItemTypeDefinition,
1872
+ record: StoredItem,
1873
+ request: ItemNode,
1874
+ context: ExecutionContext,
1875
+ classification: ClassificationChange | undefined,
1876
+ ): void {
1877
+ const normalized = normalizeProperties(this.storage, definition, request.properties, {
1878
+ creating: false,
1879
+ current: record,
1880
+ });
1881
+ const values = this.lifeCycles.authorizeUpdate(
1882
+ definition,
1883
+ record,
1884
+ normalized,
1885
+ classification,
1886
+ context,
1887
+ );
1888
+
1889
+ if (definition.isRelationship) {
1890
+ const prepared = this.references.initialize(definition, {
1891
+ ...record,
1892
+ properties: { ...record.properties, ...values },
1893
+ });
1894
+ const behavior = prepared.properties.behavior;
1895
+
1896
+ if (typeof behavior !== "string") {
1897
+ throw new TypeError("A relationship must retain its resolved behavior.");
1898
+ }
1899
+
1900
+ values.behavior = behavior;
1901
+ }
1902
+
1903
+ assertActiveContext(context);
1904
+ this.storage.updateItem(
1905
+ definition.name,
1906
+ record.id,
1907
+ this.security.auditedChanges(record, values),
1908
+ );
1909
+ const after = this.storage.getItem(definition.name, record.id);
1910
+
1911
+ if (!after) {
1912
+ throw new PlatformError("MissingItem", "Updated record disappeared.");
1913
+ }
1914
+
1915
+ this.trace.record(context, { kind: "mutation", name: "update", before: record, after });
1916
+ }
1917
+
1918
+ private assertAddProperties(definition: ItemTypeDefinition, request: ItemNode): void {
1919
+ if (definition.isVersionable) {
1920
+ for (const name of [
1921
+ "config_id",
1922
+ "generation",
1923
+ "is_current",
1924
+ "new_version",
1925
+ "locked_by_id",
1926
+ ]) {
1927
+ if (request.properties[name] !== undefined) {
1928
+ throw new PlatformError(
1929
+ "ReadOnlyProperty",
1930
+ `Version property '${definition.name}.${name}' is managed by add. Use fixtures to seed existing generations.`,
1931
+ );
1932
+ }
1933
+ }
1934
+ }
1935
+ }
1936
+
1937
+ private creationProperties(
1938
+ definition: ItemTypeDefinition,
1939
+ request: ItemNode,
1940
+ id: string,
1941
+ context: ExecutionContext,
1942
+ ): Record<string, StorageValue> {
1943
+ const classification =
1944
+ request.properties.classification === undefined
1945
+ ? definition.properties.find((property) => property.name === "classification")
1946
+ ?.defaultValue
1947
+ : request.properties.classification;
1948
+ this.catalog.classifications.assertValue(definition, classification, context);
1949
+ const properties: Record<string, StorageValue> = {
1950
+ config_id: id,
1951
+ generation: 1,
1952
+ is_current: 1,
1953
+ new_version:
1954
+ definition.isVersionable && !manualVersioning(this.storage, definition) ? 0 : 1,
1955
+ ...this.revisions.initial(definition, request.properties),
1956
+ ...(classification === undefined ? {} : { classification }),
1957
+ ...request.properties,
1958
+ ...this.lifeCycles.initialProperties(definition, classification),
1959
+ ...creationDefaults(definition, request.properties, this.options.userId, this.now),
1960
+ };
1961
+ this.revisions.assertValue(definition, properties.major_rev);
1962
+
1963
+ return properties;
1964
+ }
1965
+
1966
+ private methodPorts(
1967
+ definition: MethodDefinition,
1968
+ item: Item,
1969
+ context: ExecutionContext,
1970
+ executionStarted: () => void,
1971
+ ): MethodPorts {
1972
+ const capability = capabilityForLanguage(definition.language);
1973
+
1974
+ return {
1975
+ executionStarted,
1976
+
1977
+ getNewId: () => {
1978
+ assertActiveContext(context);
1979
+
1980
+ return this.nextId();
1981
+ },
1982
+
1983
+ apply: (item) => context.execute(applyItemOperation, item),
1984
+
1985
+ applyMethod: (name, item) =>
1986
+ context.execute(callMethodOperation, { name, context: item }),
1987
+
1988
+ applyAML: (xml) => context.execute(applyAMLOperation, xml),
1989
+
1990
+ applySQL: (query, parameters) =>
1991
+ context.execute(applySqlOperation, {
1992
+ query,
1993
+ method: definition.name,
1994
+ values: {
1995
+ ...properties(item),
1996
+ ...(parameters === undefined ? {} : { parameters }),
1997
+ },
1998
+ }),
1999
+
2000
+ getUserId: () => {
2001
+ assertActiveContext(context);
2002
+
2003
+ if (!this.options.userId) {
2004
+ throw new PlatformError(
2005
+ "SessionRequired",
2006
+ "This Method requires a configured User session.",
2007
+ );
2008
+ }
2009
+
2010
+ return this.options.userId();
2011
+ },
2012
+
2013
+ fail: (message) =>
2014
+ context.fail(
2015
+ new PlatformError(
2016
+ "UnsupportedCapability",
2017
+ `${definition.name}: ${message} ` +
2018
+ `(${definition.source.file}:${definition.source.line})`,
2019
+ {
2020
+ source: definition.source,
2021
+ ...(capability !== undefined ? { capability } : {}),
2022
+ },
2023
+ ),
2024
+ ),
2025
+ };
2026
+ }
2027
+
2028
+ private mockedMethodResult(
2029
+ name: string,
2030
+ entry: CatalogEntry | undefined,
2031
+ mocked: MockMatch,
2032
+ context: ExecutionContext,
2033
+ ): Item {
2034
+ const code = entry?.properties.method_code;
2035
+
2036
+ return this.mockResult(
2037
+ name,
2038
+ mocked,
2039
+ context,
2040
+ entry
2041
+ ? {
2042
+ source: entry.source,
2043
+ definition: { type: "Method", id: entry.id },
2044
+ ...(typeof code === "string"
2045
+ ? {
2046
+ sourceHash: new Bun.CryptoHasher("sha256")
2047
+ .update(code)
2048
+ .digest("hex"),
2049
+ }
2050
+ : {}),
2051
+ }
2052
+ : undefined,
2053
+ );
2054
+ }
2055
+ }