@x12i/graphenix-executable-format 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/README.md +341 -0
  2. package/dist/adapter/build-graph-execution-request-from-studio-execute.d.ts +6 -0
  3. package/dist/adapter/build-graph-execution-request-from-studio-execute.d.ts.map +1 -0
  4. package/dist/adapter/build-graph-execution-request-from-studio-execute.js +41 -0
  5. package/dist/adapter/build-graph-execution-request-from-studio-execute.js.map +1 -0
  6. package/dist/api.d.ts +36 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +99 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/case-condition/allowed-paths.d.ts +4 -0
  11. package/dist/case-condition/allowed-paths.d.ts.map +1 -0
  12. package/dist/case-condition/allowed-paths.js +74 -0
  13. package/dist/case-condition/allowed-paths.js.map +1 -0
  14. package/dist/case-condition/evaluate-case-condition.d.ts +4 -0
  15. package/dist/case-condition/evaluate-case-condition.d.ts.map +1 -0
  16. package/dist/case-condition/evaluate-case-condition.js +106 -0
  17. package/dist/case-condition/evaluate-case-condition.js.map +1 -0
  18. package/dist/case-condition/select-graph-model-case.d.ts +6 -0
  19. package/dist/case-condition/select-graph-model-case.d.ts.map +1 -0
  20. package/dist/case-condition/select-graph-model-case.js +40 -0
  21. package/dist/case-condition/select-graph-model-case.js.map +1 -0
  22. package/dist/case-condition/select-node-model-case.d.ts +4 -0
  23. package/dist/case-condition/select-node-model-case.d.ts.map +1 -0
  24. package/dist/case-condition/select-node-model-case.js +34 -0
  25. package/dist/case-condition/select-node-model-case.js.map +1 -0
  26. package/dist/case-condition/validate-case-condition.d.ts +5 -0
  27. package/dist/case-condition/validate-case-condition.d.ts.map +1 -0
  28. package/dist/case-condition/validate-case-condition.js +118 -0
  29. package/dist/case-condition/validate-case-condition.js.map +1 -0
  30. package/dist/compile/build-node-execution-units.d.ts +6 -0
  31. package/dist/compile/build-node-execution-units.d.ts.map +1 -0
  32. package/dist/compile/build-node-execution-units.js +77 -0
  33. package/dist/compile/build-node-execution-units.js.map +1 -0
  34. package/dist/compile/compile-executable-plan.d.ts +5 -0
  35. package/dist/compile/compile-executable-plan.d.ts.map +1 -0
  36. package/dist/compile/compile-executable-plan.js +142 -0
  37. package/dist/compile/compile-executable-plan.js.map +1 -0
  38. package/dist/constants.d.ts +12 -0
  39. package/dist/constants.d.ts.map +1 -0
  40. package/dist/constants.js +19 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/explain/explain-executable-graph-error.d.ts +4 -0
  43. package/dist/explain/explain-executable-graph-error.d.ts.map +1 -0
  44. package/dist/explain/explain-executable-graph-error.js +14 -0
  45. package/dist/explain/explain-executable-graph-error.js.map +1 -0
  46. package/dist/explain/explain-node-inheritance.d.ts +3 -0
  47. package/dist/explain/explain-node-inheritance.d.ts.map +1 -0
  48. package/dist/explain/explain-node-inheritance.js +41 -0
  49. package/dist/explain/explain-node-inheritance.js.map +1 -0
  50. package/dist/fixtures/minimal-executable-graph.d.ts +4 -0
  51. package/dist/fixtures/minimal-executable-graph.d.ts.map +1 -0
  52. package/dist/fixtures/minimal-executable-graph.js +170 -0
  53. package/dist/fixtures/minimal-executable-graph.js.map +1 -0
  54. package/dist/helpers/add-finalizer-node.d.ts +5 -0
  55. package/dist/helpers/add-finalizer-node.d.ts.map +1 -0
  56. package/dist/helpers/add-finalizer-node.js +13 -0
  57. package/dist/helpers/add-finalizer-node.js.map +1 -0
  58. package/dist/helpers/add-task-node.d.ts +5 -0
  59. package/dist/helpers/add-task-node.d.ts.map +1 -0
  60. package/dist/helpers/add-task-node.js +13 -0
  61. package/dist/helpers/add-task-node.js.map +1 -0
  62. package/dist/helpers/connect-task-to-task.d.ts +10 -0
  63. package/dist/helpers/connect-task-to-task.d.ts.map +1 -0
  64. package/dist/helpers/connect-task-to-task.js +23 -0
  65. package/dist/helpers/connect-task-to-task.js.map +1 -0
  66. package/dist/helpers/set-graph-model-config.d.ts +5 -0
  67. package/dist/helpers/set-graph-model-config.d.ts.map +1 -0
  68. package/dist/helpers/set-graph-model-config.js +30 -0
  69. package/dist/helpers/set-graph-model-config.js.map +1 -0
  70. package/dist/helpers/set-node-model-config.d.ts +5 -0
  71. package/dist/helpers/set-node-model-config.d.ts.map +1 -0
  72. package/dist/helpers/set-node-model-config.js +25 -0
  73. package/dist/helpers/set-node-model-config.js.map +1 -0
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +18 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/internal/hash.d.ts +4 -0
  79. package/dist/internal/hash.d.ts.map +1 -0
  80. package/dist/internal/hash.js +26 -0
  81. package/dist/internal/hash.js.map +1 -0
  82. package/dist/internal/utils.d.ts +16 -0
  83. package/dist/internal/utils.d.ts.map +1 -0
  84. package/dist/internal/utils.js +80 -0
  85. package/dist/internal/utils.js.map +1 -0
  86. package/dist/migration/migrate-legacy-graph-model-object.d.ts +4 -0
  87. package/dist/migration/migrate-legacy-graph-model-object.d.ts.map +1 -0
  88. package/dist/migration/migrate-legacy-graph-model-object.js +217 -0
  89. package/dist/migration/migrate-legacy-graph-model-object.js.map +1 -0
  90. package/dist/normalize/normalize-executable-graph.d.ts +3 -0
  91. package/dist/normalize/normalize-executable-graph.d.ts.map +1 -0
  92. package/dist/normalize/normalize-executable-graph.js +34 -0
  93. package/dist/normalize/normalize-executable-graph.js.map +1 -0
  94. package/dist/normalize/normalize-model-config.d.ts +4 -0
  95. package/dist/normalize/normalize-model-config.d.ts.map +1 -0
  96. package/dist/normalize/normalize-model-config.js +64 -0
  97. package/dist/normalize/normalize-model-config.js.map +1 -0
  98. package/dist/profile-choice/known-profile-choices.d.ts +10 -0
  99. package/dist/profile-choice/known-profile-choices.d.ts.map +1 -0
  100. package/dist/profile-choice/known-profile-choices.js +19 -0
  101. package/dist/profile-choice/known-profile-choices.js.map +1 -0
  102. package/dist/profile-choice/validate-profile-choice.d.ts +8 -0
  103. package/dist/profile-choice/validate-profile-choice.d.ts.map +1 -0
  104. package/dist/profile-choice/validate-profile-choice.js +55 -0
  105. package/dist/profile-choice/validate-profile-choice.js.map +1 -0
  106. package/dist/resolution/build-deterministic-case-context.d.ts +9 -0
  107. package/dist/resolution/build-deterministic-case-context.d.ts.map +1 -0
  108. package/dist/resolution/build-deterministic-case-context.js +26 -0
  109. package/dist/resolution/build-deterministic-case-context.js.map +1 -0
  110. package/dist/resolution/resolve-graph-model-config.d.ts +12 -0
  111. package/dist/resolution/resolve-graph-model-config.d.ts.map +1 -0
  112. package/dist/resolution/resolve-graph-model-config.js +28 -0
  113. package/dist/resolution/resolve-graph-model-config.js.map +1 -0
  114. package/dist/resolution/resolve-node-ai-plan.d.ts +7 -0
  115. package/dist/resolution/resolve-node-ai-plan.d.ts.map +1 -0
  116. package/dist/resolution/resolve-node-ai-plan.js +64 -0
  117. package/dist/resolution/resolve-node-ai-plan.js.map +1 -0
  118. package/dist/resolution/resolve-node-model-config.d.ts +15 -0
  119. package/dist/resolution/resolve-node-model-config.d.ts.map +1 -0
  120. package/dist/resolution/resolve-node-model-config.js +37 -0
  121. package/dist/resolution/resolve-node-model-config.js.map +1 -0
  122. package/dist/resolution/resolve-node-model-slot.d.ts +7 -0
  123. package/dist/resolution/resolve-node-model-slot.d.ts.map +1 -0
  124. package/dist/resolution/resolve-node-model-slot.js +65 -0
  125. package/dist/resolution/resolve-node-model-slot.js.map +1 -0
  126. package/dist/test/executable-format.test.d.ts +2 -0
  127. package/dist/test/executable-format.test.d.ts.map +1 -0
  128. package/dist/test/executable-format.test.js +844 -0
  129. package/dist/test/executable-format.test.js.map +1 -0
  130. package/dist/trace/append-execution-event.d.ts +5 -0
  131. package/dist/trace/append-execution-event.d.ts.map +1 -0
  132. package/dist/trace/append-execution-event.js +9 -0
  133. package/dist/trace/append-execution-event.js.map +1 -0
  134. package/dist/trace/create-execution-trace.d.ts +5 -0
  135. package/dist/trace/create-execution-trace.d.ts.map +1 -0
  136. package/dist/trace/create-execution-trace.js +56 -0
  137. package/dist/trace/create-execution-trace.js.map +1 -0
  138. package/dist/types/case-condition.d.ts +50 -0
  139. package/dist/types/case-condition.d.ts.map +1 -0
  140. package/dist/types/case-condition.js +3 -0
  141. package/dist/types/case-condition.js.map +1 -0
  142. package/dist/types/errors.d.ts +16 -0
  143. package/dist/types/errors.d.ts.map +1 -0
  144. package/dist/types/errors.js +3 -0
  145. package/dist/types/errors.js.map +1 -0
  146. package/dist/types/executable-graph.d.ts +19 -0
  147. package/dist/types/executable-graph.d.ts.map +1 -0
  148. package/dist/types/executable-graph.js +3 -0
  149. package/dist/types/executable-graph.js.map +1 -0
  150. package/dist/types/executable-nodes.d.ts +54 -0
  151. package/dist/types/executable-nodes.d.ts.map +1 -0
  152. package/dist/types/executable-nodes.js +3 -0
  153. package/dist/types/executable-nodes.js.map +1 -0
  154. package/dist/types/executable-plan.d.ts +78 -0
  155. package/dist/types/executable-plan.d.ts.map +1 -0
  156. package/dist/types/executable-plan.js +5 -0
  157. package/dist/types/executable-plan.js.map +1 -0
  158. package/dist/types/executable-profile.d.ts +18 -0
  159. package/dist/types/executable-profile.d.ts.map +1 -0
  160. package/dist/types/executable-profile.js +3 -0
  161. package/dist/types/executable-profile.js.map +1 -0
  162. package/dist/types/execution-trace.d.ts +278 -0
  163. package/dist/types/execution-trace.d.ts.map +1 -0
  164. package/dist/types/execution-trace.js +5 -0
  165. package/dist/types/execution-trace.js.map +1 -0
  166. package/dist/types/execution-unit.d.ts +19 -0
  167. package/dist/types/execution-unit.d.ts.map +1 -0
  168. package/dist/types/execution-unit.js +3 -0
  169. package/dist/types/execution-unit.js.map +1 -0
  170. package/dist/types/index.d.ts +16 -0
  171. package/dist/types/index.d.ts.map +1 -0
  172. package/dist/types/index.js +8 -0
  173. package/dist/types/index.js.map +1 -0
  174. package/dist/types/legacy.d.ts +21 -0
  175. package/dist/types/legacy.d.ts.map +1 -0
  176. package/dist/types/legacy.js +3 -0
  177. package/dist/types/legacy.js.map +1 -0
  178. package/dist/types/model-config.d.ts +80 -0
  179. package/dist/types/model-config.d.ts.map +1 -0
  180. package/dist/types/model-config.js +3 -0
  181. package/dist/types/model-config.js.map +1 -0
  182. package/dist/types/resolution.d.ts +55 -0
  183. package/dist/types/resolution.d.ts.map +1 -0
  184. package/dist/types/resolution.js +3 -0
  185. package/dist/types/resolution.js.map +1 -0
  186. package/dist/types/runtime.d.ts +19 -0
  187. package/dist/types/runtime.d.ts.map +1 -0
  188. package/dist/types/runtime.js +3 -0
  189. package/dist/types/runtime.js.map +1 -0
  190. package/dist/types/studio-execute.d.ts +25 -0
  191. package/dist/types/studio-execute.d.ts.map +1 -0
  192. package/dist/types/studio-execute.js +3 -0
  193. package/dist/types/studio-execute.js.map +1 -0
  194. package/dist/validators/assert-executable-graph.d.ts +3 -0
  195. package/dist/validators/assert-executable-graph.d.ts.map +1 -0
  196. package/dist/validators/assert-executable-graph.js +14 -0
  197. package/dist/validators/assert-executable-graph.js.map +1 -0
  198. package/dist/validators/assert-normalized-executable-graph.d.ts +3 -0
  199. package/dist/validators/assert-normalized-executable-graph.d.ts.map +1 -0
  200. package/dist/validators/assert-normalized-executable-graph.js +14 -0
  201. package/dist/validators/assert-normalized-executable-graph.js.map +1 -0
  202. package/dist/validators/validate-authoring-executable-graph.d.ts +3 -0
  203. package/dist/validators/validate-authoring-executable-graph.d.ts.map +1 -0
  204. package/dist/validators/validate-authoring-executable-graph.js +134 -0
  205. package/dist/validators/validate-authoring-executable-graph.js.map +1 -0
  206. package/dist/validators/validate-authoring-graph.d.ts +2 -0
  207. package/dist/validators/validate-authoring-graph.d.ts.map +1 -0
  208. package/dist/validators/validate-authoring-graph.js +6 -0
  209. package/dist/validators/validate-authoring-graph.js.map +1 -0
  210. package/dist/validators/validate-executable-graph.d.ts +4 -0
  211. package/dist/validators/validate-executable-graph.d.ts.map +1 -0
  212. package/dist/validators/validate-executable-graph.js +9 -0
  213. package/dist/validators/validate-executable-graph.js.map +1 -0
  214. package/dist/validators/validate-executable-plan.d.ts +3 -0
  215. package/dist/validators/validate-executable-plan.d.ts.map +1 -0
  216. package/dist/validators/validate-executable-plan.js +211 -0
  217. package/dist/validators/validate-executable-plan.js.map +1 -0
  218. package/dist/validators/validate-execution-trace.d.ts +4 -0
  219. package/dist/validators/validate-execution-trace.d.ts.map +1 -0
  220. package/dist/validators/validate-execution-trace.js +158 -0
  221. package/dist/validators/validate-execution-trace.js.map +1 -0
  222. package/dist/validators/validate-finalizer-node.d.ts +4 -0
  223. package/dist/validators/validate-finalizer-node.d.ts.map +1 -0
  224. package/dist/validators/validate-finalizer-node.js +36 -0
  225. package/dist/validators/validate-finalizer-node.js.map +1 -0
  226. package/dist/validators/validate-model-config.d.ts +7 -0
  227. package/dist/validators/validate-model-config.d.ts.map +1 -0
  228. package/dist/validators/validate-model-config.js +197 -0
  229. package/dist/validators/validate-model-config.js.map +1 -0
  230. package/dist/validators/validate-normalized-executable-graph.d.ts +3 -0
  231. package/dist/validators/validate-normalized-executable-graph.d.ts.map +1 -0
  232. package/dist/validators/validate-normalized-executable-graph.js +26 -0
  233. package/dist/validators/validate-normalized-executable-graph.js.map +1 -0
  234. package/dist/validators/validate-runtime-object.d.ts +10 -0
  235. package/dist/validators/validate-runtime-object.d.ts.map +1 -0
  236. package/dist/validators/validate-runtime-object.js +63 -0
  237. package/dist/validators/validate-runtime-object.js.map +1 -0
  238. package/dist/validators/validate-studio-execute-request.d.ts +5 -0
  239. package/dist/validators/validate-studio-execute-request.d.ts.map +1 -0
  240. package/dist/validators/validate-studio-execute-request.js +37 -0
  241. package/dist/validators/validate-studio-execute-request.js.map +1 -0
  242. package/dist/validators/validate-task-actions.d.ts +4 -0
  243. package/dist/validators/validate-task-actions.d.ts.map +1 -0
  244. package/dist/validators/validate-task-actions.js +93 -0
  245. package/dist/validators/validate-task-actions.js.map +1 -0
  246. package/dist/validators/validate-task-node.d.ts +6 -0
  247. package/dist/validators/validate-task-node.d.ts.map +1 -0
  248. package/dist/validators/validate-task-node.js +43 -0
  249. package/dist/validators/validate-task-node.js.map +1 -0
  250. package/docs/IMPLEMENTATION-REPORT.md +200 -0
  251. package/package.json +56 -0
  252. package/schema/graphenix-executable-format-1.0.0.schema.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-studio-execute-request.js","sourceRoot":"","sources":["../../src/validators/validate-studio-execute-request.ts"],"names":[],"mappings":";;AAQA,oEA+DC;AAED,kEAIC;AAxED,mDAA2D;AAC3D,iFAAyE;AAEzE,SAAgB,4BAA4B,CAC1C,OAAgB;IAEhB,MAAM,MAAM,GAAqC,EAAE,CAAC;IAEpD,IAAI,CAAC,IAAA,mBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE;gBACN,IAAA,oBAAS,EACP,gCAAgC,EAChC,2CAA2C,EAC3C,EAAE,CACH;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,gCAAgC,EAChC,4CAA4C,EAC5C,OAAO,CACR,CACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,gCAAgC,EAChC,2CAA2C,EAC3C,QAAQ,CACT,CACF,CAAC;IACJ,CAAC;IAED,IAAI,mBAAmB,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,sCAAsC,EACtC,+FAA+F,EAC/F,oBAAoB,CACrB,CACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,gCAAgC,EAChC,2CAA2C,EAC3C,QAAQ,CACT,CACF,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,sDAAuB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAgB,2BAA2B,CACzC,KAAc;IAEd,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACnD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ExecutableGraphValidationError } from "../types/errors.js";
2
+ export declare function validateTaskActionList(nodeId: string, actions: unknown, listPath: string, allowActionLevelModelOverride: boolean): ExecutableGraphValidationError[];
3
+ export declare function validateTaskNodeActions(nodeId: string, taskConfiguration: unknown, allowActionLevelModelOverride: boolean): ExecutableGraphValidationError[];
4
+ //# sourceMappingURL=validate-task-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-task-actions.d.ts","sourceRoot":"","sources":["../../src/validators/validate-task-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AA2BzE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,6BAA6B,EAAE,OAAO,GACrC,8BAA8B,EAAE,CA4GlC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,OAAO,EAC1B,6BAA6B,EAAE,OAAO,GACrC,8BAA8B,EAAE,CAqDlC"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTaskActionList = validateTaskActionList;
4
+ exports.validateTaskNodeActions = validateTaskNodeActions;
5
+ const utils_js_1 = require("../internal/utils.js");
6
+ const validate_profile_choice_js_1 = require("../profile-choice/validate-profile-choice.js");
7
+ function validateActionConfigObject(value, path, label) {
8
+ if (value === undefined) {
9
+ return [];
10
+ }
11
+ if (!(0, utils_js_1.isRecord)(value)) {
12
+ return [
13
+ (0, utils_js_1.execError)("TASK_ACTION_INVALID", `${label} must be a JSON object.`, path)
14
+ ];
15
+ }
16
+ return [];
17
+ }
18
+ function validateTaskActionList(nodeId, actions, listPath, allowActionLevelModelOverride) {
19
+ const errors = [];
20
+ if (actions === undefined) {
21
+ return errors;
22
+ }
23
+ if (!Array.isArray(actions)) {
24
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_INVALID", `${listPath} must be an array.`, listPath));
25
+ return errors;
26
+ }
27
+ const seenIds = new Set();
28
+ for (const [index, action] of actions.entries()) {
29
+ const path = `${listPath}/${index}`;
30
+ if (!(0, utils_js_1.isRecord)(action)) {
31
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_INVALID", `Action ${index} on node ${nodeId} must be an object.`, path));
32
+ continue;
33
+ }
34
+ const actionConfig = action;
35
+ if (typeof actionConfig.id !== "string" || actionConfig.id.length === 0) {
36
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_INVALID", `Action ${index} on node ${nodeId} must define id.`, `${path}/id`));
37
+ }
38
+ else if (seenIds.has(actionConfig.id)) {
39
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_ID_DUPLICATE", `Duplicate action id "${actionConfig.id}" on node ${nodeId}.`, `${path}/id`));
40
+ }
41
+ else {
42
+ seenIds.add(actionConfig.id);
43
+ }
44
+ if (typeof actionConfig.actionKey !== "string" ||
45
+ actionConfig.actionKey.length === 0) {
46
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_MISSING_ACTION_KEY", `Action ${actionConfig.id ?? index} on node ${nodeId} must define actionKey.`, `${path}/actionKey`));
47
+ }
48
+ errors.push(...validateActionConfigObject(actionConfig.config, `${path}/config`, "config"));
49
+ errors.push(...validateActionConfigObject(actionConfig.inputsConfig, `${path}/inputsConfig`, "inputsConfig"));
50
+ errors.push(...validateActionConfigObject(actionConfig.outputMapping, `${path}/outputMapping`, "outputMapping"));
51
+ if (actionConfig.modelSelection !== undefined) {
52
+ if (!allowActionLevelModelOverride) {
53
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_MODEL_OVERRIDE_FORBIDDEN", `Action ${actionConfig.id ?? index} on node ${nodeId} defines modelSelection but graph policy allowActionLevelModelOverride is false.`, `${path}/modelSelection`));
54
+ }
55
+ else {
56
+ errors.push(...(0, validate_profile_choice_js_1.validateAiModelSelection)(actionConfig.modelSelection, `${path}/modelSelection`));
57
+ }
58
+ }
59
+ }
60
+ return errors;
61
+ }
62
+ function validateTaskNodeActions(nodeId, taskConfiguration, allowActionLevelModelOverride) {
63
+ if (!(0, utils_js_1.isRecord)(taskConfiguration)) {
64
+ return [];
65
+ }
66
+ const preActions = taskConfiguration.preActions;
67
+ const postActions = taskConfiguration.postActions;
68
+ const basePath = `/graph/nodes/${nodeId}/parameters/taskConfiguration`;
69
+ const errors = [];
70
+ errors.push(...validateTaskActionList(nodeId, preActions, `${basePath}/preActions`, allowActionLevelModelOverride));
71
+ errors.push(...validateTaskActionList(nodeId, postActions, `${basePath}/postActions`, allowActionLevelModelOverride));
72
+ if (Array.isArray(preActions) && Array.isArray(postActions)) {
73
+ const ids = new Set();
74
+ for (const [listName, list] of [
75
+ ["preActions", preActions],
76
+ ["postActions", postActions]
77
+ ]) {
78
+ for (const [index, action] of list.entries()) {
79
+ if (!(0, utils_js_1.isRecord)(action) || typeof action.id !== "string") {
80
+ continue;
81
+ }
82
+ if (ids.has(action.id)) {
83
+ errors.push((0, utils_js_1.execError)("TASK_ACTION_ID_DUPLICATE", `Duplicate action id "${action.id}" on node ${nodeId}.`, `${basePath}/${listName}/${index}/id`));
84
+ }
85
+ else {
86
+ ids.add(action.id);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ return errors;
92
+ }
93
+ //# sourceMappingURL=validate-task-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-task-actions.js","sourceRoot":"","sources":["../../src/validators/validate-task-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Node } from "@x12i/graphenix-core";
2
+ import type { ExecutableGraphValidationError } from "../types/errors.js";
3
+ import type { GraphDocument } from "@x12i/graphenix-core";
4
+ export declare function validateTaskNode(node: Node, doc?: GraphDocument): ExecutableGraphValidationError[];
5
+ export declare function isTaskNodeParameters(value: unknown): boolean;
6
+ //# sourceMappingURL=validate-task-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-task-node.d.ts","sourceRoot":"","sources":["../../src/validators/validate-task-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAazE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,GAAG,CAAC,EAAE,aAAa,GAClB,8BAA8B,EAAE,CAyElC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM5D"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTaskNode = validateTaskNode;
4
+ exports.isTaskNodeParameters = isTaskNodeParameters;
5
+ const constants_js_1 = require("../constants.js");
6
+ const utils_js_1 = require("../internal/utils.js");
7
+ const validate_model_config_js_1 = require("./validate-model-config.js");
8
+ const validate_task_actions_js_1 = require("./validate-task-actions.js");
9
+ function validateTaskNode(node, doc) {
10
+ const errors = [];
11
+ const basePath = `/graph/nodes/${node.id}`;
12
+ if (node.kind !== constants_js_1.TASK_NODE_KIND) {
13
+ errors.push((0, utils_js_1.execError)("TASK_NODE_INVALID", `Node ${node.id} must use kind ${constants_js_1.TASK_NODE_KIND}.`, `${basePath}/kind`));
14
+ return errors;
15
+ }
16
+ const params = (0, utils_js_1.getTaskNodeConfig)(node);
17
+ if (!params) {
18
+ errors.push((0, utils_js_1.execError)("TASK_NODE_MISSING_PARAMETERS", `Task node ${node.id} must define executable task parameters.`, `${basePath}/parameters`));
19
+ return errors;
20
+ }
21
+ if (params.profile !== constants_js_1.EXECUTABLE_NODE_PROFILE) {
22
+ errors.push((0, utils_js_1.execError)("TASK_NODE_INVALID", `Task node ${node.id} parameters.profile must be ${constants_js_1.EXECUTABLE_NODE_PROFILE}.`, `${basePath}/parameters/profile`));
23
+ }
24
+ if (params.nodeType !== "task") {
25
+ errors.push((0, utils_js_1.execError)("TASK_NODE_INVALID", `Task node ${node.id} parameters.nodeType must be task.`, `${basePath}/parameters/nodeType`));
26
+ }
27
+ if (typeof params.skillKey !== "string" || params.skillKey.length === 0) {
28
+ errors.push((0, utils_js_1.execError)("TASK_NODE_MISSING_SKILL_KEY", `Task node ${node.id} must define skillKey.`, `${basePath}/parameters/skillKey`));
29
+ }
30
+ const nodeModelConfig = params.taskConfiguration?.modelConfig;
31
+ const inherit = nodeModelConfig?.inherit !== false;
32
+ errors.push(...(0, validate_model_config_js_1.validateNodeModelConfig)(node.id, nodeModelConfig, inherit));
33
+ const allowActionLevelModelOverride = (doc ? (0, utils_js_1.getExecutableProfile)(doc)?.policies?.allowActionLevelModelOverride : undefined) ??
34
+ false;
35
+ errors.push(...(0, validate_task_actions_js_1.validateTaskNodeActions)(node.id, params.taskConfiguration, allowActionLevelModelOverride));
36
+ return errors;
37
+ }
38
+ function isTaskNodeParameters(value) {
39
+ return ((0, utils_js_1.isRecord)(value) &&
40
+ value.profile === constants_js_1.EXECUTABLE_NODE_PROFILE &&
41
+ value.nodeType === "task");
42
+ }
43
+ //# sourceMappingURL=validate-task-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-task-node.js","sourceRoot":"","sources":["../../src/validators/validate-task-node.ts"],"names":[],"mappings":";;AAgBA,4CA4EC;AAED,oDAMC;AAlGD,kDAGyB;AACzB,mDAK8B;AAC9B,yEAAqE;AACrE,yEAAqE;AAGrE,SAAgB,gBAAgB,CAC9B,IAAU,EACV,GAAmB;IAEnB,MAAM,MAAM,GAAqC,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,6BAAc,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,mBAAmB,EACnB,QAAQ,IAAI,CAAC,EAAE,kBAAkB,6BAAc,GAAG,EAClD,GAAG,QAAQ,OAAO,CACnB,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,8BAA8B,EAC9B,aAAa,IAAI,CAAC,EAAE,0CAA0C,EAC9D,GAAG,QAAQ,aAAa,CACzB,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,sCAAuB,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,mBAAmB,EACnB,aAAa,IAAI,CAAC,EAAE,+BAA+B,sCAAuB,GAAG,EAC7E,GAAG,QAAQ,qBAAqB,CACjC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,mBAAmB,EACnB,aAAa,IAAI,CAAC,EAAE,oCAAoC,EACxD,GAAG,QAAQ,sBAAsB,CAClC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CACT,IAAA,oBAAS,EACP,6BAA6B,EAC7B,aAAa,IAAI,CAAC,EAAE,wBAAwB,EAC5C,GAAG,QAAQ,sBAAsB,CAClC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC;IAC9D,MAAM,OAAO,GAAG,eAAe,EAAE,OAAO,KAAK,KAAK,CAAC;IACnD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,kDAAuB,EAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3E,MAAM,6BAA6B,GACjC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,+BAAoB,EAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,6BAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,KAAK,CAAC;IACR,MAAM,CAAC,IAAI,CACT,GAAG,IAAA,kDAAuB,EACxB,IAAI,CAAC,EAAE,EACP,MAAM,CAAC,iBAAiB,EACxB,6BAA6B,CAC9B,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,IAAA,mBAAQ,EAAC,KAAK,CAAC;QACf,KAAK,CAAC,OAAO,KAAK,sCAAuB;QACzC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,200 @@
1
+ # Implementation Report: Deterministic Case-Based Model Configuration
2
+
3
+ **Package:** `@x12i/graphenix-executable-format`
4
+ **Status:** Ready for publish
5
+ **Date:** 2026-06-06
6
+ **Related packages:** `@x12i/graphenix-core`, `@x12i/ai-profiles`
7
+
8
+ ---
9
+
10
+ ## 1. Goal
11
+
12
+ Support **conditional model configuration cases** in executable Graphenix graphs while ensuring model/profile selection remains:
13
+
14
+ - deterministic
15
+ - auditable
16
+ - non-AI selected
17
+ - validated
18
+ - explainable
19
+ - safe for execution
20
+
21
+ **Core rule:** Cases may choose stronger or weaker `profileChoice` keys. AI may never choose which case applies.
22
+
23
+ ---
24
+
25
+ ## 2. What was implemented
26
+
27
+ ### 2.1 Case condition DSL
28
+
29
+ | Component | Location |
30
+ | --------- | -------- |
31
+ | Types (`CaseCondition`, predicates) | `src/types/case-condition.ts` |
32
+ | Validation | `src/case-condition/validate-case-condition.ts` |
33
+ | Evaluation | `src/case-condition/evaluate-case-condition.ts` |
34
+ | Allowed/forbidden paths | `src/case-condition/allowed-paths.ts` |
35
+
36
+ Supports `all`, `any`, `not`, and path predicates (`eq`, `neq`, `in`, `notIn`, `exists`, `notExists`, `gt`, `gte`, `lt`, `lte`, `matches`).
37
+
38
+ Rejects AI/LLM/semantic/function-based selectors and forbidden path roots (`ai.*`, `node.output.*`, `executionMemory.ai.*`, etc.).
39
+
40
+ ### 2.2 Profile choice via `@x12i/ai-profiles`
41
+
42
+ | Component | Location |
43
+ | --------- | -------- |
44
+ | `kind: "profileChoice"` type | `src/types/model-config.ts` |
45
+ | Format + known-key validation | `src/profile-choice/known-profile-choices.ts` |
46
+ | Selection validation | `src/profile-choice/validate-profile-choice.ts` |
47
+
48
+ - Delegates `isProfileChoiceKeyFormat` and `isKnownProfileChoice` to `@x12i/ai-profiles` bundled registry.
49
+ - Rejects deprecated `kind: "profile"`.
50
+ - Does **not** resolve `profileChoice` → vendor/model during normalization.
51
+
52
+ **Dependency:** `"@x12i/ai-profiles": "^3.2.0"` in `package.json`.
53
+
54
+ ### 2.3 Case selection
55
+
56
+ | Component | Location |
57
+ | --------- | -------- |
58
+ | Graph case selection | `src/case-condition/select-graph-model-case.ts` |
59
+ | Node case selection | `src/case-condition/select-node-model-case.ts` |
60
+ | Resolution | `src/resolution/resolve-node-ai-plan.ts` |
61
+
62
+ Rules enforced:
63
+
64
+ 1. Graph cases evaluated before node cases.
65
+ 2. First matching conditional case wins.
66
+ 3. Fallback to `id: "default"` when no conditional case matches.
67
+ 4. Exactly one default graph case (validated).
68
+ 5. Graph cases require full model triplet.
69
+ 6. Node cases may be partial when `inherit: true`.
70
+ 7. `caseSelection` with matched condition explanations on resolved plans.
71
+
72
+ ### 2.4 Authoring vs normalized forms
73
+
74
+ | Component | Location |
75
+ | --------- | -------- |
76
+ | Graph `default` → `cases[]` | `src/normalize/normalize-model-config.ts` |
77
+ | Node `modelConfig` → `cases[]` | same |
78
+ | Full graph normalize | `src/normalize/normalize-executable-graph.ts` |
79
+ | Authoring validation | `src/validators/validate-authoring-executable-graph.ts` |
80
+ | Normalized validation | `src/validators/validate-normalized-executable-graph.ts` |
81
+ | Assert normalized | `src/validators/assert-normalized-executable-graph.ts` |
82
+
83
+ `compileExecutablePlan` now calls `assertNormalizedExecutableGraph()` after normalization.
84
+
85
+ ### 2.5 Compile, studio adapter, trace
86
+
87
+ | Component | Location |
88
+ | --------- | -------- |
89
+ | Plan compilation | `src/compile/compile-executable-plan.ts` |
90
+ | Studio adapter | `src/adapter/build-graph-execution-request-from-studio-execute.ts` |
91
+ | Execution trace | `src/trace/` |
92
+ | Execution units | `src/compile/build-node-execution-units.ts` |
93
+
94
+ Engine receives `{ plan, runtime }` — not raw authoring graph.
95
+
96
+ ### 2.6 Fallback
97
+
98
+ `src/resolution/resolve-node-model-slot.ts` — same-slot fallback only, from selected graph case triplet. Policy-gated via `fallbackPolicy`.
99
+
100
+ ---
101
+
102
+ ## 3. Error codes (section 14)
103
+
104
+ All CR/FR error codes are defined in `src/types/errors.ts` and emitted by validators except:
105
+
106
+ | Code | Status |
107
+ | ---- | ------ |
108
+ | `CASE_SELECTION_UNRESOLVED` | Reserved — runtime always falls back to default case; authoring validation catches missing default via `CASE_SELECTION_DEFAULT_MISSING` |
109
+
110
+ ---
111
+
112
+ ## 4. Acceptance test coverage
113
+
114
+ **44 tests pass** in `src/test/executable-format.test.ts`.
115
+
116
+ ### Explicitly covered (section 18)
117
+
118
+ | AC | Test |
119
+ | -- | ---- |
120
+ | AC-001 | `runtime.mode eq simulate` accepted |
121
+ | AC-004–006 | `all`, `any`, `not` evaluation |
122
+ | AC-007–008 | First matching case / default fallback |
123
+ | AC-009 | Missing default case fails |
124
+ | AC-020, 024–025 | Forbidden AI selectors / paths |
125
+ | AC-030–039 | Profile choice validation |
126
+ | AC-060, AC-066 | Graph normalization |
127
+ | Section 12 example | Full resolution with graph + node cases |
128
+ | AC-070 partial | Studio adapter compiles plan |
129
+ | AC-075–076 | Forbidden runtime/request model defaults |
130
+ | Fallback partial | Same-slot fallback test |
131
+
132
+ ### Covered indirectly (integration tests)
133
+
134
+ - Graph inheritance (AC-044, AC-053)
135
+ - Node partial override (AC-050, AC-054)
136
+ - Compile lifecycle (AC-P001, AC-E003)
137
+ - Execution units + trace (separate CR)
138
+
139
+ ### Not yet dedicated tests
140
+
141
+ AC-002, AC-003, AC-010, AC-021–023, AC-026–027, AC-041–043, AC-051, AC-061–065, AC-082.
142
+
143
+ Core logic for these exists in validators; tests can be added incrementally.
144
+
145
+ ---
146
+
147
+ ## 5. Known limitations
148
+
149
+ | Item | Notes |
150
+ | ---- | ----- |
151
+ | JSON Schema | `schema/graphenix-executable-format-1.0.0.schema.json` is a structural subset; full semantics enforced by TS validators |
152
+ | Studio UI | Case preview / resolved plan display is Studio responsibility (out of package scope) |
153
+ | AC-037 | `openai/gpt-4o-mini` passes format check per `@x12i/ai-profiles`; rejected as `PROFILE_CHOICE_KEY_UNKNOWN` |
154
+ | Node authoring shorthand | Uses `modelConfig` field (not `default`); normalizes to `cases[0].id = "default"` |
155
+
156
+ ---
157
+
158
+ ## 5. Non-goals (per CR/FR section 19)
159
+
160
+ Not added to `@x12i/graphenix-core`:
161
+
162
+ - AI model profiles
163
+ - profileChoice validation
164
+ - Case selection for models
165
+ - Fallback policies
166
+ - Runtime object / studio envelope
167
+ - LLM invocation
168
+
169
+ These belong only in `@x12i/graphenix-executable-format` (+ `@x12i/ai-profiles` for registry).
170
+
171
+ ---
172
+
173
+ ## 6. Publish readiness
174
+
175
+ | Check | Status |
176
+ | ----- | ------ |
177
+ | Build passes | ✅ |
178
+ | 44 tests pass | ✅ |
179
+ | `@x12i/ai-profiles` dependency declared | ✅ |
180
+ | README updated | ✅ |
181
+ | `compileExecutablePlan` asserts normalized graph | ✅ |
182
+ | First npm publish (`@x12i/graphenix-core@2.0.0`, `@x12i/graphenix-executable-format@1.0.0`) | Pending |
183
+
184
+ **Publish order:** `@x12i/graphenix-core` first, then `@x12i/graphenix-executable-format`.
185
+
186
+ ---
187
+
188
+ ## 7. Final rule (enforced)
189
+
190
+ ```txt
191
+ The graph may contain conditional model/profile cases.
192
+ Those cases may select stronger or weaker profileChoice keys.
193
+ Case selection must be deterministic and based only on allowed runtime/graph context.
194
+ AI is never allowed to choose which AI model/profile case applies.
195
+ All profile-based slots must use explicit @x12i/ai-profiles composite keys: profile/choice.
196
+ The saved graph is Design/Edit (Authoring) form.
197
+ The engine uses Normalized/Executable form via ExecutableGraphPlan.
198
+ Graph-level selected case is the inheritance and fallback source.
199
+ Node-level selected case may partially override it.
200
+ ```
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@x12i/graphenix-executable-format",
3
+ "version": "1.0.0",
4
+ "description": "X12i executable graph profile: deterministic model cases, profileChoice validation via @x12i/ai-profiles, compile/trace lifecycle, studio adapter.",
5
+ "license": "MIT",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.ts",
9
+ "scripts": {
10
+ "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json",
11
+ "clean": "rimraf dist",
12
+ "test": "npm run build && node --test dist/test/*.test.js",
13
+ "prepare": "npm run build"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "schema",
18
+ "docs"
19
+ ],
20
+ "keywords": [
21
+ "graph",
22
+ "graphenix",
23
+ "executable",
24
+ "workflow",
25
+ "validation",
26
+ "ai-profiles",
27
+ "profileChoice",
28
+ "deterministic"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/x12i/graphenix-format.git",
33
+ "directory": "packages/executable-format"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/x12i/graphenix-format/issues"
37
+ },
38
+ "homepage": "https://github.com/x12i/graphenix-format/tree/master/packages/executable-format#readme",
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "registry": "https://registry.npmjs.org/"
42
+ },
43
+ "peerDependencies": {
44
+ "@x12i/graphenix-core": "^2.0.0"
45
+ },
46
+ "dependencies": {
47
+ "@x12i/ai-profiles": "^3.2.0",
48
+ "@x12i/graphenix-core": "^2.0.0",
49
+ "ajv": "^8.17.1"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^22.10.1",
53
+ "rimraf": "^6.0.1",
54
+ "typescript": "^5.6.3"
55
+ }
56
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://graphenix.dev/schema/graphenix-executable-format-1.0.0.json",
4
+ "title": "Graphenix Executable Profile 1.0.0",
5
+ "description": "JSON Schema fragment for x12i.executable/v1 profile under graph.metadata.extensions.",
6
+ "type": "object",
7
+ "required": ["profileVersion", "modelConfig"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "profileVersion": {
11
+ "const": "x12i.executable/v1"
12
+ },
13
+ "modelConfig": {
14
+ "type": "object",
15
+ "required": ["version", "cases"],
16
+ "properties": {
17
+ "version": { "const": "graph-model-config/v1" },
18
+ "cases": {
19
+ "type": "array",
20
+ "minItems": 1,
21
+ "items": {
22
+ "type": "object",
23
+ "required": ["id", "modelConfig"],
24
+ "properties": {
25
+ "id": { "type": "string" },
26
+ "modelConfig": {
27
+ "type": "object",
28
+ "required": [
29
+ "preActionModel",
30
+ "skillModel",
31
+ "postActionModel"
32
+ ]
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }