mlform 0.1.2 → 0.1.4

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 (299) hide show
  1. package/README.md +241 -88
  2. package/dist/design-system-CrrSGfFB.js +1352 -0
  3. package/dist/engine-nnhWPT2L.js +5301 -0
  4. package/dist/kit-Dt_1Fxlc.js +76 -0
  5. package/dist/mlform/design-system.mjs +2 -0
  6. package/dist/mlform/engine.mjs +3 -0
  7. package/dist/mlform/kit.mjs +3 -0
  8. package/dist/mlform/primitives.mjs +2 -0
  9. package/dist/mlform/questionnaire.mjs +640 -0
  10. package/dist/mlform/transport.mjs +2 -0
  11. package/dist/mlform.mjs +4 -709
  12. package/dist/primitives-Pi-ztAr6.js +5063 -0
  13. package/dist/transport-A1RsnZhD.js +2143 -0
  14. package/dist/types/src/design-system/constants.d.ts +34 -0
  15. package/dist/types/src/design-system/contract/component-keys.d.ts +2 -0
  16. package/dist/types/src/design-system/contract/component-tokens.d.ts +5 -0
  17. package/dist/types/src/design-system/contract/global-tokens.d.ts +7 -0
  18. package/dist/types/src/design-system/contract/index.d.ts +4 -0
  19. package/dist/types/src/design-system/contract/token-keys.d.ts +12 -0
  20. package/dist/types/src/design-system/index.d.ts +8 -0
  21. package/dist/types/src/design-system/recipes/contrast.d.ts +2 -0
  22. package/dist/types/src/design-system/recipes/default.d.ts +2 -0
  23. package/dist/types/src/design-system/recipes/index.d.ts +4 -0
  24. package/dist/types/src/design-system/recipes/minimal.d.ts +2 -0
  25. package/dist/types/src/design-system/recipes/soft.d.ts +2 -0
  26. package/dist/types/src/design-system/registry/builtins.d.ts +5 -0
  27. package/dist/types/src/design-system/registry/create-registry.d.ts +2 -0
  28. package/dist/types/src/design-system/registry/deep-freeze.d.ts +5 -0
  29. package/dist/types/src/design-system/registry/define-recipe.d.ts +2 -0
  30. package/dist/types/src/design-system/registry/define-theme.d.ts +2 -0
  31. package/dist/types/src/design-system/registry/define-token-maps.d.ts +6 -0
  32. package/dist/types/src/design-system/registry/index.d.ts +5 -0
  33. package/dist/types/src/design-system/resolve/diagnostics.d.ts +9 -0
  34. package/dist/types/src/design-system/resolve/index.d.ts +5 -0
  35. package/dist/types/src/design-system/resolve/merge-config.d.ts +2 -0
  36. package/dist/types/src/design-system/resolve/migrate-tokens.d.ts +44 -0
  37. package/dist/types/src/design-system/resolve/resolve-mode.d.ts +6 -0
  38. package/dist/types/src/design-system/resolve/resolve-recipe.d.ts +2 -0
  39. package/dist/types/src/design-system/resolve/resolve-theme.d.ts +2 -0
  40. package/dist/types/src/design-system/resolve/resolve-tokens.d.ts +2 -0
  41. package/dist/types/src/design-system/runtime/apply-tokens.d.ts +4 -0
  42. package/dist/types/src/design-system/runtime/attach-design-system.d.ts +11 -0
  43. package/dist/types/src/design-system/runtime/create-stylesheet.d.ts +11 -0
  44. package/dist/types/src/design-system/runtime/declarations.d.ts +5 -0
  45. package/dist/types/src/design-system/runtime/design-system-controller.d.ts +9 -0
  46. package/dist/types/src/design-system/runtime/host-state.d.ts +3 -0
  47. package/dist/types/src/design-system/runtime/hydrate-design-system.d.ts +25 -0
  48. package/dist/types/src/design-system/runtime/index.d.ts +8 -0
  49. package/dist/types/src/design-system/themes/cobalt.d.ts +2 -0
  50. package/dist/types/src/design-system/themes/graphite.d.ts +2 -0
  51. package/dist/types/src/design-system/themes/index.d.ts +5 -0
  52. package/dist/types/src/design-system/themes/neutral.d.ts +2 -0
  53. package/dist/types/src/design-system/themes/sage.d.ts +2 -0
  54. package/dist/types/src/design-system/themes/sunset.d.ts +2 -0
  55. package/dist/types/src/design-system/tokens/base.d.ts +5 -0
  56. package/dist/types/src/design-system/tokens/contrast.d.ts +8 -0
  57. package/dist/types/src/design-system/tokens/density.d.ts +9 -0
  58. package/dist/types/src/design-system/tokens/forced-colors.d.ts +12 -0
  59. package/dist/types/src/design-system/tokens/index.d.ts +5 -0
  60. package/dist/types/src/design-system/tokens/motion.d.ts +2 -0
  61. package/dist/types/src/design-system/types.d.ts +225 -0
  62. package/dist/types/src/engine/builtins/fields/boolean.d.ts +8 -0
  63. package/dist/types/src/engine/builtins/fields/category.d.ts +11 -0
  64. package/dist/types/src/engine/builtins/fields/date.d.ts +9 -0
  65. package/dist/types/src/engine/builtins/fields/long-text.d.ts +10 -0
  66. package/dist/types/src/engine/builtins/fields/multi-choice.d.ts +12 -0
  67. package/dist/types/src/engine/builtins/fields/number.d.ts +11 -0
  68. package/dist/types/src/engine/builtins/fields/rating.d.ts +9 -0
  69. package/dist/types/src/engine/builtins/fields/series.d.ts +20 -0
  70. package/dist/types/src/engine/builtins/fields/single-choice.d.ts +12 -0
  71. package/dist/types/src/engine/builtins/fields/text.d.ts +10 -0
  72. package/dist/types/src/engine/builtins/index.d.ts +97 -0
  73. package/dist/types/src/engine/builtins/reports/classifier.d.ts +8 -0
  74. package/dist/types/src/engine/builtins/reports/regressor.d.ts +8 -0
  75. package/dist/types/src/engine/builtins/shared.d.ts +49 -0
  76. package/dist/types/src/engine/comparison.d.ts +2 -0
  77. package/dist/types/src/engine/constants.d.ts +51 -0
  78. package/dist/types/src/engine/declarative/explanation.d.ts +2 -0
  79. package/dist/types/src/engine/declarative/field.d.ts +2 -0
  80. package/dist/types/src/engine/declarative/presentation.d.ts +61 -0
  81. package/dist/types/src/engine/declarative/report.d.ts +2 -0
  82. package/dist/types/src/engine/equality.d.ts +4 -0
  83. package/dist/types/src/engine/errors.d.ts +28 -0
  84. package/dist/types/src/engine/explanations/controller.d.ts +13 -0
  85. package/dist/types/src/engine/explanations/index.d.ts +1 -0
  86. package/dist/types/src/engine/fields/controller.d.ts +30 -0
  87. package/dist/types/src/engine/fields/index.d.ts +1 -0
  88. package/dist/types/src/engine/form.d.ts +2 -0
  89. package/dist/types/src/engine/index.d.ts +11 -0
  90. package/dist/types/src/engine/paths.d.ts +2 -0
  91. package/dist/types/src/engine/registry/index.d.ts +26 -0
  92. package/dist/types/src/engine/reports/controller.d.ts +19 -0
  93. package/dist/types/src/engine/reports/index.d.ts +1 -0
  94. package/dist/types/src/engine/schema/index.d.ts +7 -0
  95. package/dist/types/src/engine/state/engine.d.ts +60 -0
  96. package/dist/types/src/engine/state/index.d.ts +3 -0
  97. package/dist/types/src/engine/state/snapshots.d.ts +5 -0
  98. package/dist/types/src/engine/state/store.d.ts +13 -0
  99. package/dist/types/src/engine/submission/abort.d.ts +15 -0
  100. package/dist/types/src/engine/submission/explanations.d.ts +2 -0
  101. package/dist/types/src/engine/submission/index.d.ts +5 -0
  102. package/dist/types/src/engine/submission/lifecycle.d.ts +16 -0
  103. package/dist/types/src/engine/submission/pipeline.d.ts +2 -0
  104. package/dist/types/src/engine/submission/reports.d.ts +12 -0
  105. package/dist/types/src/engine/submission/request.d.ts +23 -0
  106. package/dist/types/src/engine/submission/result.d.ts +4 -0
  107. package/dist/types/src/engine/submission/submitter.d.ts +40 -0
  108. package/dist/types/src/engine/types/explanation.d.ts +109 -0
  109. package/dist/types/src/engine/types/field.d.ts +172 -0
  110. package/dist/types/src/engine/types/form.d.ts +120 -0
  111. package/dist/types/src/engine/types/index.d.ts +9 -0
  112. package/dist/types/src/engine/types/pipeline.d.ts +31 -0
  113. package/dist/types/src/engine/types/registry.d.ts +17 -0
  114. package/dist/types/src/engine/types/report.d.ts +87 -0
  115. package/dist/types/src/engine/types/transport.d.ts +41 -0
  116. package/dist/types/src/engine/utils.d.ts +9 -0
  117. package/dist/types/src/engine/validation/conditions.d.ts +11 -0
  118. package/dist/types/src/engine/validation/field.d.ts +29 -0
  119. package/dist/types/src/engine/validation/form.d.ts +35 -0
  120. package/dist/types/src/engine/validation/index.d.ts +3 -0
  121. package/dist/types/src/engine/values.d.ts +2 -0
  122. package/dist/types/src/index.d.ts +7 -0
  123. package/dist/types/src/kit/constants.d.ts +4 -0
  124. package/dist/types/src/kit/defaults.d.ts +11 -0
  125. package/dist/types/src/kit/index.d.ts +4 -0
  126. package/dist/types/src/kit/mount-form.d.ts +3 -0
  127. package/dist/types/src/kit/types.d.ts +52 -0
  128. package/dist/types/src/primitives/base-async-report-element.d.ts +19 -0
  129. package/dist/types/src/primitives/base-explanation-element.d.ts +21 -0
  130. package/dist/types/src/primitives/base-field-element.d.ts +21 -0
  131. package/dist/types/src/primitives/base-report-element.d.ts +15 -0
  132. package/dist/types/src/primitives/components/declarative-explanation.d.ts +5 -0
  133. package/dist/types/src/primitives/components/declarative-field.d.ts +6 -0
  134. package/dist/types/src/primitives/components/declarative-report.d.ts +5 -0
  135. package/dist/types/src/primitives/components/explanation-panel.d.ts +22 -0
  136. package/dist/types/src/primitives/components/field-frame.d.ts +21 -0
  137. package/dist/types/src/primitives/components/form-errors.d.ts +19 -0
  138. package/dist/types/src/primitives/components/form-root.d.ts +29 -0
  139. package/dist/types/src/primitives/components/presentation.d.ts +4 -0
  140. package/dist/types/src/primitives/components/report-frame.d.ts +22 -0
  141. package/dist/types/src/primitives/components/submit-button.d.ts +21 -0
  142. package/dist/types/src/primitives/components/unsupported-component.d.ts +14 -0
  143. package/dist/types/src/primitives/constants.d.ts +94 -0
  144. package/dist/types/src/primitives/controller-binding.d.ts +32 -0
  145. package/dist/types/src/primitives/fields/boolean-field.d.ts +6 -0
  146. package/dist/types/src/primitives/fields/category-field.d.ts +6 -0
  147. package/dist/types/src/primitives/fields/date-field.d.ts +6 -0
  148. package/dist/types/src/primitives/fields/long-text-field.d.ts +6 -0
  149. package/dist/types/src/primitives/fields/multi-choice-field.d.ts +6 -0
  150. package/dist/types/src/primitives/fields/number-field.d.ts +8 -0
  151. package/dist/types/src/primitives/fields/rating-field.d.ts +6 -0
  152. package/dist/types/src/primitives/fields/series-field.d.ts +8 -0
  153. package/dist/types/src/primitives/fields/single-choice-field.d.ts +6 -0
  154. package/dist/types/src/primitives/fields/text-field.d.ts +6 -0
  155. package/dist/types/src/primitives/index.d.ts +8 -0
  156. package/dist/types/src/primitives/mount-form.d.ts +4 -0
  157. package/dist/types/src/primitives/register.d.ts +0 -0
  158. package/dist/types/src/primitives/registry.d.ts +3 -0
  159. package/dist/types/src/primitives/reports/classifier-report.d.ts +5 -0
  160. package/dist/types/src/primitives/reports/regressor-report.d.ts +5 -0
  161. package/dist/types/src/primitives/types.d.ts +128 -0
  162. package/dist/types/src/primitives/utils.d.ts +3 -0
  163. package/dist/types/src/questionnaire/constants.d.ts +31 -0
  164. package/dist/types/src/questionnaire/defaults.d.ts +8 -0
  165. package/dist/types/src/questionnaire/engine/controller.d.ts +12 -0
  166. package/dist/types/src/questionnaire/engine/schema.d.ts +9 -0
  167. package/dist/types/src/questionnaire/errors.d.ts +3 -0
  168. package/dist/types/src/questionnaire/index.d.ts +6 -0
  169. package/dist/types/src/questionnaire/mount.d.ts +3 -0
  170. package/dist/types/src/questionnaire/primitives/components/questionnaire-root.d.ts +23 -0
  171. package/dist/types/src/questionnaire/primitives/components/step-indicator.d.ts +14 -0
  172. package/dist/types/src/questionnaire/primitives/register.d.ts +0 -0
  173. package/dist/types/src/questionnaire/types.d.ts +69 -0
  174. package/dist/types/src/shared/errors.d.ts +3 -0
  175. package/dist/types/src/shared/index.d.ts +1 -0
  176. package/dist/types/src/transport/capabilities.d.ts +7 -0
  177. package/dist/types/src/transport/clone.d.ts +6 -0
  178. package/dist/types/src/transport/composition/fallback.d.ts +2 -0
  179. package/dist/types/src/transport/composition/fanout.d.ts +3 -0
  180. package/dist/types/src/transport/composition/hedged.d.ts +2 -0
  181. package/dist/types/src/transport/composition/index.d.ts +7 -0
  182. package/dist/types/src/transport/composition/load-balancing.d.ts +2 -0
  183. package/dist/types/src/transport/composition/pipeline.d.ts +2 -0
  184. package/dist/types/src/transport/composition/racing.d.ts +2 -0
  185. package/dist/types/src/transport/composition/routing.d.ts +3 -0
  186. package/dist/types/src/transport/constants.d.ts +34 -0
  187. package/dist/types/src/transport/errors.d.ts +36 -0
  188. package/dist/types/src/transport/index.d.ts +9 -0
  189. package/dist/types/src/transport/internal.d.ts +110 -0
  190. package/dist/types/src/transport/middleware/auth.d.ts +2 -0
  191. package/dist/types/src/transport/middleware/cache.d.ts +2 -0
  192. package/dist/types/src/transport/middleware/circuit-breaker.d.ts +2 -0
  193. package/dist/types/src/transport/middleware/dedup.d.ts +2 -0
  194. package/dist/types/src/transport/middleware/index.d.ts +12 -0
  195. package/dist/types/src/transport/middleware/logging.d.ts +2 -0
  196. package/dist/types/src/transport/middleware/metrics.d.ts +2 -0
  197. package/dist/types/src/transport/middleware/pipe.d.ts +2 -0
  198. package/dist/types/src/transport/middleware/rate-limit.d.ts +2 -0
  199. package/dist/types/src/transport/middleware/retry.d.ts +2 -0
  200. package/dist/types/src/transport/middleware/timeout.d.ts +2 -0
  201. package/dist/types/src/transport/middleware/tracing.d.ts +2 -0
  202. package/dist/types/src/transport/middleware/transform.d.ts +3 -0
  203. package/dist/types/src/transport/policy-context.d.ts +3 -0
  204. package/dist/types/src/transport/protocols/graphql.d.ts +2 -0
  205. package/dist/types/src/transport/protocols/grpc.d.ts +5 -0
  206. package/dist/types/src/transport/protocols/index.d.ts +5 -0
  207. package/dist/types/src/transport/protocols/json.d.ts +2 -0
  208. package/dist/types/src/transport/protocols/sse.d.ts +2 -0
  209. package/dist/types/src/transport/protocols/websocket.d.ts +2 -0
  210. package/dist/types/src/transport/runtime.d.ts +4 -0
  211. package/dist/types/src/transport/state/cache-store.d.ts +2 -0
  212. package/dist/types/src/transport/state/circuit-breaker.d.ts +2 -0
  213. package/dist/types/src/transport/state/health.d.ts +2 -0
  214. package/dist/types/src/transport/state/index.d.ts +5 -0
  215. package/dist/types/src/transport/state/rate-limiter.d.ts +2 -0
  216. package/dist/types/src/transport/state/session.d.ts +2 -0
  217. package/dist/types/src/transport/types/capabilities.d.ts +35 -0
  218. package/dist/types/src/transport/types/core.d.ts +57 -0
  219. package/dist/types/src/transport/types/events.d.ts +50 -0
  220. package/dist/types/src/transport/types/index.d.ts +7 -0
  221. package/dist/types/src/transport/types/middleware.d.ts +3 -0
  222. package/dist/types/src/transport/types/options.d.ts +258 -0
  223. package/dist/types/src/transport/types/session.d.ts +48 -0
  224. package/dist/types/src/transport/types/state.d.ts +46 -0
  225. package/package.json +93 -37
  226. package/dist/FieldStrategy-pPekBtH-.js +0 -2318
  227. package/dist/ModelTypes-B9_veCKB.js +0 -5
  228. package/dist/ReportStrategy-DY3GC_mJ.js +0 -23
  229. package/dist/boolean-field-Cd3uhIPj.js +0 -104
  230. package/dist/category-field-D_Ms1x9u.js +0 -73
  231. package/dist/classifier-prediction-C5QzorTo.js +0 -193
  232. package/dist/custom-element-ttkHUa8w.js +0 -13
  233. package/dist/date-field-Cg_ja679.js +0 -162
  234. package/dist/error-card-BwjPChwf.js +0 -195
  235. package/dist/field-wrapper-DqIQl76d.js +0 -177
  236. package/dist/ml-layout-Dx63KKf7.js +0 -332
  237. package/dist/mlform/extensions.mjs +0 -38
  238. package/dist/mlform/strategies.mjs +0 -292
  239. package/dist/number-field-CC2DrVEb.js +0 -165
  240. package/dist/property-jKFNMQpR.js +0 -561
  241. package/dist/range-field-Cr7LEtsJ.js +0 -98
  242. package/dist/regressor-prediction-C18dHlfK.js +0 -236
  243. package/dist/src/core/app/DescriptorItem.d.ts +0 -6
  244. package/dist/src/core/app/DescriptorRegistry.d.ts +0 -13
  245. package/dist/src/core/app/DescriptorService.d.ts +0 -22
  246. package/dist/src/core/app/DescriptorStrategy.d.ts +0 -11
  247. package/dist/src/core/app/index.d.ts +0 -4
  248. package/dist/src/core/domain/index.d.ts +0 -24
  249. package/dist/src/core/index.d.ts +0 -3
  250. package/dist/src/core/ui/error-card.d.ts +0 -38
  251. package/dist/src/core/ui/field-wrapper.d.ts +0 -23
  252. package/dist/src/core/ui/index.d.ts +0 -3
  253. package/dist/src/core/ui/ml-layout.d.ts +0 -23
  254. package/dist/src/extensions/app/FieldStrategy.d.ts +0 -10
  255. package/dist/src/extensions/app/ReportStrategy.d.ts +0 -9
  256. package/dist/src/extensions/app/index.d.ts +0 -2
  257. package/dist/src/extensions/domain/BaseField.d.ts +0 -7
  258. package/dist/src/extensions/domain/BaseModel.d.ts +0 -6
  259. package/dist/src/extensions/domain/index.d.ts +0 -2
  260. package/dist/src/extensions/index.d.ts +0 -3
  261. package/dist/src/extensions/ui/field-element.d.ts +0 -9
  262. package/dist/src/extensions/ui/index.d.ts +0 -1
  263. package/dist/src/index.d.ts +0 -1
  264. package/dist/src/mlform/index.d.ts +0 -1
  265. package/dist/src/mlform/mlform.d.ts +0 -27
  266. package/dist/src/mlform/mlform.types.d.ts +0 -11
  267. package/dist/src/strategies/app/BooleanStrategy.d.ts +0 -12
  268. package/dist/src/strategies/app/CategoryStrategy.d.ts +0 -13
  269. package/dist/src/strategies/app/ClassifierStrategy.d.ts +0 -15
  270. package/dist/src/strategies/app/DateStrategy.d.ts +0 -15
  271. package/dist/src/strategies/app/NumberStrategy.d.ts +0 -29
  272. package/dist/src/strategies/app/RegressorStrategy.d.ts +0 -15
  273. package/dist/src/strategies/app/TextStrategy.d.ts +0 -16
  274. package/dist/src/strategies/app/index.d.ts +0 -7
  275. package/dist/src/strategies/domain/BooleanField.d.ts +0 -10
  276. package/dist/src/strategies/domain/CategoryField.d.ts +0 -11
  277. package/dist/src/strategies/domain/ClassifierModel.d.ts +0 -11
  278. package/dist/src/strategies/domain/DateField.d.ts +0 -13
  279. package/dist/src/strategies/domain/FieldTypes.d.ts +0 -7
  280. package/dist/src/strategies/domain/ModelTypes.d.ts +0 -4
  281. package/dist/src/strategies/domain/NumberField.d.ts +0 -15
  282. package/dist/src/strategies/domain/RegressorModel.d.ts +0 -11
  283. package/dist/src/strategies/domain/TextField.d.ts +0 -14
  284. package/dist/src/strategies/domain/index.d.ts +0 -9
  285. package/dist/src/strategies/index.d.ts +0 -1
  286. package/dist/src/strategies/ui/boolean-field.d.ts +0 -13
  287. package/dist/src/strategies/ui/category-field.d.ts +0 -14
  288. package/dist/src/strategies/ui/classifier-prediction.d.ts +0 -39
  289. package/dist/src/strategies/ui/date-field.d.ts +0 -18
  290. package/dist/src/strategies/ui/index.d.ts +0 -8
  291. package/dist/src/strategies/ui/number-field.d.ts +0 -19
  292. package/dist/src/strategies/ui/range-field.d.ts +0 -17
  293. package/dist/src/strategies/ui/regressor-prediction.d.ts +0 -29
  294. package/dist/src/strategies/ui/text-field.d.ts +0 -17
  295. package/dist/state-CLlTRyl1.js +0 -12
  296. package/dist/test/_fixtures/DummyField.d.ts +0 -9
  297. package/dist/test/setup.d.ts +0 -1
  298. package/dist/test/unit/DummyField.test.d.ts +0 -1
  299. package/dist/text-field-DwP-Fa1w.js +0 -114
@@ -0,0 +1,28 @@
1
+ import { MLFormError } from '../../shared';
2
+ import { FormValidationResult } from './types';
3
+ export declare class EngineError extends MLFormError {
4
+ constructor(message: string);
5
+ }
6
+ export declare class RegistryError extends EngineError {
7
+ constructor(message: string);
8
+ }
9
+ export declare class ValidationError extends EngineError {
10
+ readonly result: FormValidationResult;
11
+ constructor(result: FormValidationResult);
12
+ }
13
+ export declare class SubmitError extends EngineError {
14
+ readonly cause: unknown;
15
+ constructor(message: string, cause: unknown);
16
+ }
17
+ export declare class ReportPayloadError extends SubmitError {
18
+ readonly reportId: string;
19
+ constructor(reportId: string, message: string, cause: unknown);
20
+ }
21
+ export declare class SubmissionAbortedError extends SubmitError {
22
+ readonly code: "ABORTED";
23
+ constructor(message?: string, cause?: unknown);
24
+ }
25
+ export declare const createAbortError: (reason?: string) => SubmissionAbortedError;
26
+ export declare const isAbortLikeError: (error: unknown) => boolean;
27
+ export { TransportError, transportErrorCodes } from '../../transport';
28
+ export type { TransportErrorCode } from '../../transport';
@@ -0,0 +1,13 @@
1
+ import { EngineStore } from '../state';
2
+ import { ExplanationController, ExplanationDefinition, FormHooks, NormalizedExplanationConfig } from '../types';
3
+ type CreateExplanationControllerOptions = {
4
+ config: NormalizedExplanationConfig;
5
+ definition: ExplanationDefinition;
6
+ store: EngineStore;
7
+ hooks: FormHooks | undefined;
8
+ };
9
+ export type InternalExplanationController = ExplanationController & {
10
+ reset(): void;
11
+ };
12
+ export declare const createExplanationController: ({ config, definition, store, hooks, }: CreateExplanationControllerOptions) => InternalExplanationController;
13
+ export {};
@@ -0,0 +1 @@
1
+ export * from './controller';
@@ -0,0 +1,30 @@
1
+ import { EngineStore, InternalFieldState } from '../state';
2
+ import { FieldController, FieldDefinition, FieldValidationResult, FormStatus, InactiveFieldPolicy, NormalizedFieldConfig } from '../types';
3
+ type CreateFieldControllerOptions = {
4
+ config: NormalizedFieldConfig;
5
+ definition: FieldDefinition;
6
+ store: EngineStore;
7
+ getValues: () => Record<string, unknown>;
8
+ getSubmitCount: () => number;
9
+ getFormStatus: () => FormStatus;
10
+ onValueChange?: (fieldId: string, values: Record<string, unknown>) => void;
11
+ };
12
+ export type RefreshOptions = {
13
+ values?: Record<string, unknown>;
14
+ preserveValidationErrors?: boolean;
15
+ preserveExternalErrors?: boolean;
16
+ resetInactiveToInitial?: boolean;
17
+ inactiveFieldPolicy?: InactiveFieldPolicy;
18
+ };
19
+ export type InternalFieldController = FieldController & {
20
+ serialize(): unknown;
21
+ refresh(options?: RefreshOptions): InternalFieldState;
22
+ applyValue(value: unknown, values: Record<string, unknown>): void;
23
+ prepareValue(value: unknown, values: Record<string, unknown>): InternalFieldState;
24
+ commitState(state: InternalFieldState): void;
25
+ setExternalErrors(errors: string[]): void;
26
+ coerceValue(value: unknown): unknown;
27
+ validate(validationVersion?: number): Promise<FieldValidationResult>;
28
+ };
29
+ export declare const createFieldController: ({ config, definition, store, getValues, getSubmitCount, getFormStatus, onValueChange, }: CreateFieldControllerOptions) => InternalFieldController;
30
+ export {};
@@ -0,0 +1 @@
1
+ export * from './controller';
@@ -0,0 +1,2 @@
1
+ import { CreateFormConfig, FormController } from './types';
2
+ export declare const createForm: (config: CreateFormConfig) => FormController;
@@ -0,0 +1,11 @@
1
+ export { createBuiltinRegistry } from './builtins';
2
+ export { booleanFieldDefinition, categoryFieldDefinition, classifierReportDefinition, dateFieldDefinition, longTextFieldDefinition, multiChoiceFieldDefinition, numberFieldDefinition, ratingFieldDefinition, regressorReportDefinition, seriesFieldDefinition, singleChoiceFieldDefinition, textFieldDefinition, } from './builtins';
3
+ export { createExplanationController } from './explanations';
4
+ export { executeExplanations, executeFormPipeline } from './submission';
5
+ export { EngineError, ReportPayloadError, RegistryError, SubmissionAbortedError, SubmitError, TransportError, transportErrorCodes, ValidationError, } from './errors';
6
+ export type { TransportErrorCode } from './errors';
7
+ export { createForm } from './form';
8
+ export { createRegistry, defineExplanationDefinition, defineExplanationKind, defineFieldKind, defineFieldDefinition, defineReportKind, defineReportDefinition, EngineRegistry, } from './registry';
9
+ export { defaultEquality, shallowArrayEquality, shallowEquality, shallowObjectEquality, } from './equality';
10
+ export { identity, isPromiseLike } from './utils';
11
+ export type { AfterExplanationContext, AllConditions, AfterSubmitContext, AfterValidateContext, AnyConditions, BaseExplanationConfig, BaseFieldConfig, BaseReportConfig, DeclarativeExplanationKind, DeclarativeFieldKind, DeclarativeReportKind, BeforeSubmitContext, BeforeValidateContext, ExplanationFetchContext, ExplanationFetchFactory, CreateFormConfig, DeclarativeFieldCondition, ExplanationConfig, ExplanationController, ExplanationDefinition, ExplanationDescriptor, ExplanationDescriptorContext, ExplanationErrorContext, ExplanationExecutionContext, ExplanationExecutionResult, ExplanationFetchRequest, ExplanationFetchTransport, ExplanationRenderSpec, ExplanationRenderSpecContext, ExplanationStateSnapshot, ExplanationStatus, FieldRenderHints, FieldRenderSpec, FieldRenderSpecContext, FieldValidationFnContext, FieldValueAdapter, FieldWidget, FieldConfig, FieldComparisonCondition, FieldCondition, FieldConditionContext, FieldController, FieldDefinition, FieldDescriptor, FieldStateSnapshot, FieldStatus, FieldValueCondition, FieldValidationContext, FieldValidationResult, FormController, FormHooks, FormSchema, FormState, FormStatusCondition, FormStatus, FormValidator, FormValidationContext, FormValidationIssue, FormValidationResult, InactiveFieldPolicy, MaybePromise, NormalizedExplanationConfig, NormalizedFieldConfig, NormalizedReportConfig, Registry, ReportConfig, ReportController, ReportDefinition, ReportDescriptor, ReportRenderSpec, ReportRenderSpecContext, ReportResolveContext, ReportStateSnapshot, ReportStatus, PresentationNode, PresentationSummary, PipelineArtifactAdapter, PipelineArtifactContext, PipelineResult, ExecuteFormPipelineOptions, SelectorSubscriptionOptions, SubmitCountCondition, SubmitErrorContext, SubmitOptions, SubmitRequest, SubmitRequestTransportContext, SubmitResult, Transport, TransportAuthKind, TransportBackpressureMode, TransportCapabilities, TransportConsistency, TransportDeliveryMode, TransportPolicyContext, TransportSession, TransportSessionEvent, TransportSessionMessage, TransportStreamEvent, TransportResponse, NotCondition, } from './types';
@@ -0,0 +1,2 @@
1
+ export declare const normalizeValuePath: (path: string | string[] | undefined, fallback: string) => string[];
2
+ export declare const setPathValue: (target: Record<string, unknown>, path: readonly string[], value: unknown) => void;
@@ -0,0 +1,26 @@
1
+ import { defineExplanationKind } from '../declarative/explanation';
2
+ import { defineFieldKind } from '../declarative/field';
3
+ import { defineReportKind } from '../declarative/report';
4
+ import { ExplanationConfig, ExplanationDefinition, FieldConfig, FieldDefinition, Registry, ReportConfig, ReportDefinition } from '../types';
5
+ export declare class EngineRegistry implements Registry {
6
+ private readonly fieldDefinitions;
7
+ private readonly reportDefinitions;
8
+ private readonly explanationDefinitions;
9
+ registerField<TConfig extends FieldConfig, TValue>(definition: FieldDefinition<TConfig, TValue>): Registry;
10
+ unregisterField(kind: string): Registry;
11
+ registerReport<TConfig extends ReportConfig>(definition: ReportDefinition<TConfig>): Registry;
12
+ unregisterReport(kind: string): Registry;
13
+ registerExplanation<TConfig extends ExplanationConfig>(definition: ExplanationDefinition<TConfig>): Registry;
14
+ unregisterExplanation(kind: string): Registry;
15
+ getField<TConfig extends FieldConfig = FieldConfig, TValue = unknown>(kind: string): FieldDefinition<TConfig, TValue> | undefined;
16
+ getReport<TConfig extends ReportConfig = ReportConfig>(kind: string): ReportDefinition<TConfig> | undefined;
17
+ getExplanation<TConfig extends ExplanationConfig = ExplanationConfig>(kind: string): ExplanationDefinition<TConfig> | undefined;
18
+ listFields(): FieldDefinition<FieldConfig, unknown>[];
19
+ listReports(): ReportDefinition<ReportConfig>[];
20
+ listExplanations(): ExplanationDefinition<ExplanationConfig>[];
21
+ }
22
+ export declare const createRegistry: () => Registry;
23
+ export declare const defineFieldDefinition: <TConfig extends FieldConfig, TValue>(definition: FieldDefinition<TConfig, TValue>) => FieldDefinition<TConfig, TValue>;
24
+ export declare const defineReportDefinition: <TConfig extends ReportConfig>(definition: ReportDefinition<TConfig>) => ReportDefinition<TConfig>;
25
+ export declare const defineExplanationDefinition: <TConfig extends ExplanationConfig>(definition: ExplanationDefinition<TConfig>) => ExplanationDefinition<TConfig>;
26
+ export { defineExplanationKind, defineFieldKind, defineReportKind };
@@ -0,0 +1,19 @@
1
+ import { EngineStore } from '../state';
2
+ import { NormalizedReportConfig, PartialReportUpdatePolicy, ReportController, ReportDefinition, ReportStateSnapshot, SubmitResult } from '../types';
3
+ type CreateReportControllerOptions = {
4
+ config: NormalizedReportConfig;
5
+ definition: ReportDefinition;
6
+ store: EngineStore;
7
+ };
8
+ export declare const cloneReportStateSnapshot: (definition: ReportDefinition, config: NormalizedReportConfig, state: ReportStateSnapshot) => ReportStateSnapshot;
9
+ export type InternalReportController = ReportController & {
10
+ cloneState(state: ReportStateSnapshot): ReportStateSnapshot;
11
+ prepareState(result: SubmitResult): Promise<ReportStateSnapshot>;
12
+ commitState(state: ReportStateSnapshot): void;
13
+ update(result: SubmitResult): Promise<void>;
14
+ markLoading(): void;
15
+ reset(): void;
16
+ readonly partialUpdatePolicy: PartialReportUpdatePolicy;
17
+ };
18
+ export declare const createReportController: ({ config, definition, store, }: CreateReportControllerOptions) => InternalReportController;
19
+ export {};
@@ -0,0 +1 @@
1
+ export * from './controller';
@@ -0,0 +1,7 @@
1
+ import { FormSchema, NormalizedExplanationConfig, NormalizedFieldConfig, NormalizedReportConfig, Registry } from '../types';
2
+ export interface NormalizedFormSchema {
3
+ fields: NormalizedFieldConfig[];
4
+ reports: NormalizedReportConfig[];
5
+ explanations: NormalizedExplanationConfig[];
6
+ }
7
+ export declare const normalizeSchema: (schema: FormSchema, registry: Registry) => NormalizedFormSchema;
@@ -0,0 +1,60 @@
1
+ import { ExplanationStateSnapshot, FieldStateSnapshot, FormStatus, ReportStateSnapshot, SubmissionProgressState, SubmitResult } from '../types';
2
+ import { Store } from './store';
3
+ export interface InternalFieldState extends FieldStateSnapshot {
4
+ syncErrors: string[];
5
+ validationErrors: string[];
6
+ externalErrors: string[];
7
+ validationVersion: number;
8
+ }
9
+ export interface EngineState {
10
+ status: FormStatus;
11
+ submitCount: number;
12
+ lastResult: SubmitResult | null;
13
+ formErrors: string[];
14
+ fieldStates: Record<string, InternalFieldState>;
15
+ reportStates: Record<string, ReportStateSnapshot>;
16
+ explanationStates: Record<string, ExplanationStateSnapshot>;
17
+ submissionProgress: SubmissionProgressState | null;
18
+ lifecycleVersion: number;
19
+ activeValidationVersion: number;
20
+ activeSubmissionVersion: number | null;
21
+ }
22
+ export type EngineStore = Store<EngineState>;
23
+ export type EngineTransition = {
24
+ type: "bump-lifecycle";
25
+ } | {
26
+ type: "rest";
27
+ status: "idle" | "editing";
28
+ } | {
29
+ type: "editing";
30
+ clearFormErrors?: boolean;
31
+ bumpLifecycle?: boolean;
32
+ } | {
33
+ type: "start-validation";
34
+ validationVersion: number;
35
+ } | {
36
+ type: "validation-error";
37
+ message: string;
38
+ } | {
39
+ type: "start-submission";
40
+ submissionVersion: number;
41
+ } | {
42
+ type: "submission-stream-update";
43
+ progress: SubmissionProgressState;
44
+ } | {
45
+ type: "submission-success";
46
+ result: SubmitResult;
47
+ } | {
48
+ type: "submission-aborted";
49
+ message: string;
50
+ } | {
51
+ type: "submission-error";
52
+ message: string;
53
+ } | {
54
+ type: "clear-active-submission";
55
+ submissionVersion: number;
56
+ } | {
57
+ type: "reset";
58
+ };
59
+ export declare const createInitialEngineState: () => EngineState;
60
+ export declare const transitionEngineState: (current: EngineState, transition: EngineTransition) => EngineState;
@@ -0,0 +1,3 @@
1
+ export * from './engine';
2
+ export * from './snapshots';
3
+ export * from './store';
@@ -0,0 +1,5 @@
1
+ import { FieldStateSnapshot, FormState } from '../types';
2
+ import { EngineState, InternalFieldState } from './engine';
3
+ export declare const toFieldStateSnapshot: (state: InternalFieldState) => FieldStateSnapshot;
4
+ export declare const toFieldStateSnapshots: (fieldStates: Record<string, InternalFieldState>) => Record<string, FieldStateSnapshot>;
5
+ export declare const toFormState: (state: EngineState) => FormState;
@@ -0,0 +1,13 @@
1
+ export interface Store<T> {
2
+ getState(): T;
3
+ setState(nextState: T): void;
4
+ update(updater: (current: T) => T): void;
5
+ batch(callback: () => void): void;
6
+ subscribe(listener: (state: T) => void): () => void;
7
+ }
8
+ type StoreOptions<T> = {
9
+ listenerErrorPolicy?: "ignore" | "throw-aggregate";
10
+ onListenerError?: (error: unknown, state: T) => void;
11
+ };
12
+ export declare const createStore: <T>(initialState: T, options?: StoreOptions<T>) => Store<T>;
13
+ export {};
@@ -0,0 +1,15 @@
1
+ import { SubmitOptions } from '../types';
2
+ export type SubmissionAbortManager = {
3
+ ensureIdle(): void;
4
+ begin(): number;
5
+ getCurrentRequestId(): number | null;
6
+ getAbortReason(requestId: number): string;
7
+ isAborted(requestId: number): boolean;
8
+ setActiveController(requestId: number, controller: AbortController | null): void;
9
+ createSignal(options?: SubmitOptions): AbortSignal;
10
+ attachExternalSignal(options: SubmitOptions | undefined, requestId: number): void;
11
+ abort(reason?: string): void;
12
+ clear(requestId: number): void;
13
+ reset(): void;
14
+ };
15
+ export declare const createSubmissionAbortManager: () => SubmissionAbortManager;
@@ -0,0 +1,2 @@
1
+ import { ExplanationExecutionContext, ExplanationExecutionResult } from '../types';
2
+ export declare const executeExplanations: ({ explanations, request, }: ExplanationExecutionContext) => Promise<ExplanationExecutionResult>;
@@ -0,0 +1,5 @@
1
+ export * from './explanations';
2
+ export * from './pipeline';
3
+ export * from './request';
4
+ export * from './reports';
5
+ export * from './submitter';
@@ -0,0 +1,16 @@
1
+ import { EngineStore } from '../state';
2
+ import { SubmitResult } from '../types';
3
+ type SubmissionTransitionOptions = {
4
+ store: EngineStore;
5
+ resetReports: () => void;
6
+ resetExplanations: () => void;
7
+ syncAfterSubmissionTransition: () => void;
8
+ };
9
+ export declare const createSubmissionLifecycle: ({ store, resetReports, resetExplanations, syncAfterSubmissionTransition, }: SubmissionTransitionOptions) => {
10
+ start(submissionVersion: number): void;
11
+ succeed(result: SubmitResult): void;
12
+ abort(message: string): void;
13
+ fail(message: string): void;
14
+ clear(submissionVersion: number): void;
15
+ };
16
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ExecuteFormPipelineOptions, PipelineResult } from '../types';
2
+ export declare const executeFormPipeline: <TArtifacts extends Record<string, unknown> = Record<string, never>>({ form, submit, artifactAdapter, explanationMode, }: ExecuteFormPipelineOptions<TArtifacts>) => Promise<PipelineResult<TArtifacts>>;
@@ -0,0 +1,12 @@
1
+ import { NormalizedReportConfig, PartialReportUpdatePolicy, ReportStateSnapshot, SubmitResult } from '../types';
2
+ export type SubmissionReport = {
3
+ readonly id: string;
4
+ readonly config: NormalizedReportConfig;
5
+ readonly partialUpdatePolicy: PartialReportUpdatePolicy;
6
+ cloneState(state: ReportStateSnapshot): ReportStateSnapshot;
7
+ prepareState(result: SubmitResult): Promise<ReportStateSnapshot>;
8
+ commitState(state: ReportStateSnapshot): void;
9
+ };
10
+ export declare const prepareReportStates: (reports: readonly SubmissionReport[], baseResult: SubmitResult) => Promise<Map<string, ReportStateSnapshot>>;
11
+ export declare const commitReportStates: (reports: readonly SubmissionReport[], nextReportStates: Map<string, ReportStateSnapshot>) => void;
12
+ export declare const toSubmissionReportStates: (reports: readonly SubmissionReport[], nextReportStates: Map<string, ReportStateSnapshot>) => Record<string, ReportStateSnapshot>;
@@ -0,0 +1,23 @@
1
+ import { NormalizedFieldConfig, TransportResponse } from '../types';
2
+ type SubmissionField = {
3
+ readonly id: string;
4
+ readonly config: NormalizedFieldConfig;
5
+ readonly state: {
6
+ value: unknown;
7
+ visible: boolean;
8
+ disabled: boolean;
9
+ };
10
+ serialize(): unknown;
11
+ };
12
+ export type SubmissionValueRecords = {
13
+ values: Record<string, unknown>;
14
+ fieldValues: Record<string, unknown>;
15
+ serializedValues: Record<string, unknown>;
16
+ serializedFieldValues: Record<string, unknown>;
17
+ };
18
+ export declare const estimatePayloadBytes: (value: unknown) => number | undefined;
19
+ export declare const cloneSubmissionValueRecords: (records: SubmissionValueRecords) => SubmissionValueRecords;
20
+ export declare const shouldIncludeFieldInSubmission: (field: SubmissionField, resolveInactiveFieldPolicy: (field: SubmissionField) => "include" | "omit" | "reset-on-hide") => boolean;
21
+ export declare const buildSubmissionValueRecords: (fields: readonly SubmissionField[], resolveInactiveFieldPolicy: (field: SubmissionField) => "include" | "omit" | "reset-on-hide") => SubmissionValueRecords;
22
+ export declare const normalizeTransportResponse: (response: unknown) => TransportResponse;
23
+ export {};
@@ -0,0 +1,4 @@
1
+ import { SubmitResult } from '../types';
2
+ import { SubmissionReport } from './reports';
3
+ export declare const createSubmissionResult: (reports: readonly SubmissionReport[], baseResult: Omit<SubmitResult, "reportStates">, nextReportStates: Map<string, SubmitResult["reportStates"][string]>) => SubmitResult;
4
+ export declare const cloneSubmissionResult: (reports: readonly SubmissionReport[], result: SubmitResult) => SubmitResult;
@@ -0,0 +1,40 @@
1
+ import { NormalizedFormSchema } from '../schema';
2
+ import { EngineStore } from '../state';
3
+ import { FormHooks, FormValidationResult, InactiveFieldPolicy, SubmitOptions, SubmitResult, Transport } from '../types';
4
+ import { buildSubmissionValueRecords } from './request';
5
+ import { SubmissionReport } from './reports';
6
+ type SubmissionField = Parameters<typeof buildSubmissionValueRecords>[0][number];
7
+ type SyncDerivedFieldStateOptions = {
8
+ values?: Record<string, unknown>;
9
+ preserveValidationErrors?: boolean;
10
+ preserveExternalErrors?: boolean;
11
+ resetInactiveToInitial?: boolean;
12
+ inactiveFieldPolicy?: InactiveFieldPolicy;
13
+ };
14
+ type CreateFormSubmitterOptions = {
15
+ store: EngineStore;
16
+ transport: Transport;
17
+ hooks?: FormHooks;
18
+ hookFailurePolicy?: {
19
+ afterSubmit?: "fail-submit" | "preserve-success";
20
+ };
21
+ normalizedSchema: NormalizedFormSchema;
22
+ fields: readonly SubmissionField[];
23
+ reports: readonly SubmissionReport[];
24
+ validate: () => Promise<FormValidationResult>;
25
+ getSubmitCount: () => number;
26
+ markReportsLoading: () => void;
27
+ resetReports: () => void;
28
+ resetExplanations: () => void;
29
+ syncDerivedFieldState: (options?: SyncDerivedFieldStateOptions) => void;
30
+ shouldResetInactiveFields: () => boolean;
31
+ resolveInactiveFieldPolicy: (field: SubmissionField) => InactiveFieldPolicy;
32
+ inactiveFieldPolicy?: InactiveFieldPolicy;
33
+ };
34
+ export type FormSubmitter = {
35
+ submit(options?: SubmitOptions): Promise<SubmitResult>;
36
+ abort(reason?: string): void;
37
+ reset(): void;
38
+ };
39
+ export declare const createFormSubmitter: ({ store, transport, hooks, hookFailurePolicy, normalizedSchema, fields, reports, validate, getSubmitCount, markReportsLoading, resetReports, resetExplanations, syncDerivedFieldState, shouldResetInactiveFields, resolveInactiveFieldPolicy, inactiveFieldPolicy, }: CreateFormSubmitterOptions) => FormSubmitter;
40
+ export {};
@@ -0,0 +1,109 @@
1
+ import { ZodType } from 'zod';
2
+ import { PresentationContent, PresentationSummary } from '../declarative/presentation';
3
+ export type ExplanationStatus = "idle" | "loading" | "done" | "error";
4
+ export interface BaseExplanationConfig {
5
+ id?: string;
6
+ kind: string;
7
+ label?: string;
8
+ description?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ export type ExplanationConfig = BaseExplanationConfig;
12
+ export type NormalizedExplanationConfig<TConfig extends ExplanationConfig = ExplanationConfig> = TConfig & {
13
+ id: string;
14
+ };
15
+ export interface ExplanationStateSnapshot {
16
+ status: ExplanationStatus;
17
+ result: unknown;
18
+ error: string | null;
19
+ }
20
+ export interface ExplanationDescriptor {
21
+ component: string;
22
+ props: Record<string, unknown>;
23
+ meta?: Record<string, unknown>;
24
+ }
25
+ export interface ExplanationDescriptorContext {
26
+ explanationId: string;
27
+ state: ExplanationStateSnapshot;
28
+ }
29
+ export interface ExplanationFetchContext<TConfig extends ExplanationConfig = ExplanationConfig> {
30
+ config: NormalizedExplanationConfig<TConfig>;
31
+ explanationId: string;
32
+ }
33
+ /**
34
+ * Minimal transport interface used to fetch explanation data from an external
35
+ * service. Defined in engine types so ExplanationController can reference it
36
+ * without a circular dependency on the primitives layer.
37
+ */
38
+ export interface ExplanationFetchRequest {
39
+ explanationId: string;
40
+ backend?: string;
41
+ values: Record<string, unknown>;
42
+ fieldValues: Record<string, unknown>;
43
+ serializedValues: Record<string, unknown>;
44
+ serializedFieldValues: Record<string, unknown>;
45
+ reports: Record<string, unknown>;
46
+ meta: Record<string, unknown>;
47
+ raw: unknown;
48
+ signal?: AbortSignal;
49
+ }
50
+ export interface ExplanationFetchTransport {
51
+ submit: (request: ExplanationFetchRequest) => Promise<unknown>;
52
+ }
53
+ export type ExplanationFetchFactory<TConfig extends ExplanationConfig = ExplanationConfig> = (context: ExplanationFetchContext<TConfig>) => ExplanationFetchTransport;
54
+ export interface ExplanationRenderSpecContext<TConfig extends ExplanationConfig = ExplanationConfig, TResult = unknown> {
55
+ config: NormalizedExplanationConfig<TConfig>;
56
+ explanationId: string;
57
+ state: ExplanationStateSnapshot;
58
+ result: TResult;
59
+ }
60
+ export interface ExplanationRenderSpec<TConfig extends ExplanationConfig = ExplanationConfig, TResult = unknown> {
61
+ summary?: (context: ExplanationRenderSpecContext<TConfig, TResult>) => PresentationSummary | undefined;
62
+ content: (context: ExplanationRenderSpecContext<TConfig, TResult>) => PresentationContent;
63
+ }
64
+ export interface DeclarativeExplanationKind<TConfig extends ExplanationConfig = ExplanationConfig, TResult = unknown> {
65
+ kind: string;
66
+ schema: ZodType<TConfig>;
67
+ fetch: ExplanationFetchFactory<TConfig>;
68
+ render: ExplanationRenderSpec<TConfig, TResult>;
69
+ }
70
+ /**
71
+ * Plugin definition for an explanation kind. Each explanation plugin must
72
+ * provide a Zod schema for its config, a transport factory, and a describe
73
+ * function that returns a descriptor for primitive rendering.
74
+ */
75
+ export interface ExplanationDefinition<TConfig extends ExplanationConfig = ExplanationConfig> {
76
+ kind: string;
77
+ schema: ZodType<TConfig>;
78
+ /**
79
+ * Factory that returns the transport used to fetch this explanation's data.
80
+ * Called with the normalized explanation config when a fetch is triggered.
81
+ */
82
+ transport: (config: TConfig) => ExplanationFetchTransport;
83
+ describe: (config: TConfig, context: ExplanationDescriptorContext) => ExplanationDescriptor | null;
84
+ }
85
+ /**
86
+ * Runtime controller for a single explanation instance. Tracks fetch
87
+ * lifecycle state and exposes a subscribe API consistent with
88
+ * FieldController / ReportController.
89
+ */
90
+ export interface ExplanationController {
91
+ readonly id: string;
92
+ readonly kind: string;
93
+ readonly config: NormalizedExplanationConfig;
94
+ readonly state: ExplanationStateSnapshot;
95
+ readonly descriptor: ExplanationDescriptor | null;
96
+ /**
97
+ * Trigger an explanation fetch using the definition's transport. The
98
+ * request must contain the full submit result context; the controller
99
+ * appends an AbortSignal internally and combines it with any caller-provided
100
+ * signal.
101
+ * Idempotent when status is not "idle" — call reset() first to refetch.
102
+ */
103
+ fetch(request: ExplanationFetchRequest): Promise<void>;
104
+ /** Abort any in-flight fetch and reset state to "idle". */
105
+ abort(): void;
106
+ /** Reset state to "idle" without aborting (use before re-submission). */
107
+ reset(): void;
108
+ subscribe(listener: (state: ExplanationStateSnapshot) => void): () => void;
109
+ }