@cohesivesystems/presentation-react 0.1.0-alpha.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 (252) hide show
  1. package/LICENSE +55 -0
  2. package/dist/collection-chrome-slot-renderer-registry.d.ts +12 -0
  3. package/dist/collection-chrome-slot-renderer-registry.d.ts.map +1 -0
  4. package/dist/collection-chrome-slot-renderer-registry.js +12 -0
  5. package/dist/collection-chrome-slot-renderer-registry.js.map +1 -0
  6. package/dist/collection-selection-state-context.d.ts +6 -0
  7. package/dist/collection-selection-state-context.d.ts.map +1 -0
  8. package/dist/collection-selection-state-context.js +25 -0
  9. package/dist/collection-selection-state-context.js.map +1 -0
  10. package/dist/collection-selection-state.d.ts +3 -0
  11. package/dist/collection-selection-state.d.ts.map +1 -0
  12. package/dist/collection-selection-state.js +52 -0
  13. package/dist/collection-selection-state.js.map +1 -0
  14. package/dist/document-workspace-runtime.d.ts +262 -0
  15. package/dist/document-workspace-runtime.d.ts.map +1 -0
  16. package/dist/document-workspace-runtime.js +699 -0
  17. package/dist/document-workspace-runtime.js.map +1 -0
  18. package/dist/index.d.ts +51 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +51 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/input-form-endpoint-runtime.d.ts +140 -0
  23. package/dist/input-form-endpoint-runtime.d.ts.map +1 -0
  24. package/dist/input-form-endpoint-runtime.js +280 -0
  25. package/dist/input-form-endpoint-runtime.js.map +1 -0
  26. package/dist/local-flow-state-data-source-projection.d.ts +21 -0
  27. package/dist/local-flow-state-data-source-projection.d.ts.map +1 -0
  28. package/dist/local-flow-state-data-source-projection.js +65 -0
  29. package/dist/local-flow-state-data-source-projection.js.map +1 -0
  30. package/dist/navigation-runtime-context.d.ts +22 -0
  31. package/dist/navigation-runtime-context.d.ts.map +1 -0
  32. package/dist/navigation-runtime-context.js +23 -0
  33. package/dist/navigation-runtime-context.js.map +1 -0
  34. package/dist/navigation-shell-frame-renderer-registry.d.ts +20 -0
  35. package/dist/navigation-shell-frame-renderer-registry.d.ts.map +1 -0
  36. package/dist/navigation-shell-frame-renderer-registry.js +9 -0
  37. package/dist/navigation-shell-frame-renderer-registry.js.map +1 -0
  38. package/dist/navigation-shell-region-component-registry.d.ts +50 -0
  39. package/dist/navigation-shell-region-component-registry.d.ts.map +1 -0
  40. package/dist/navigation-shell-region-component-registry.js +44 -0
  41. package/dist/navigation-shell-region-component-registry.js.map +1 -0
  42. package/dist/navigation-shell-slot-renderer-registry.d.ts +22 -0
  43. package/dist/navigation-shell-slot-renderer-registry.d.ts.map +1 -0
  44. package/dist/navigation-shell-slot-renderer-registry.js +9 -0
  45. package/dist/navigation-shell-slot-renderer-registry.js.map +1 -0
  46. package/dist/page-host-projection.d.ts +127 -0
  47. package/dist/page-host-projection.d.ts.map +1 -0
  48. package/dist/page-host-projection.js +59 -0
  49. package/dist/page-host-projection.js.map +1 -0
  50. package/dist/page-host-renderer-registry.d.ts +72 -0
  51. package/dist/page-host-renderer-registry.d.ts.map +1 -0
  52. package/dist/page-host-renderer-registry.js +63 -0
  53. package/dist/page-host-renderer-registry.js.map +1 -0
  54. package/dist/presentation-action-group-runtime-options.d.ts +36 -0
  55. package/dist/presentation-action-group-runtime-options.d.ts.map +1 -0
  56. package/dist/presentation-action-group-runtime-options.js +50 -0
  57. package/dist/presentation-action-group-runtime-options.js.map +1 -0
  58. package/dist/presentation-action-runtime.d.ts +52 -0
  59. package/dist/presentation-action-runtime.d.ts.map +1 -0
  60. package/dist/presentation-action-runtime.js +78 -0
  61. package/dist/presentation-action-runtime.js.map +1 -0
  62. package/dist/presentation-data-source-binding-runtime.d.ts +3 -0
  63. package/dist/presentation-data-source-binding-runtime.d.ts.map +1 -0
  64. package/dist/presentation-data-source-binding-runtime.js +65 -0
  65. package/dist/presentation-data-source-binding-runtime.js.map +1 -0
  66. package/dist/presentation-data-source-binding.d.ts +12 -0
  67. package/dist/presentation-data-source-binding.d.ts.map +1 -0
  68. package/dist/presentation-data-source-binding.js +13 -0
  69. package/dist/presentation-data-source-binding.js.map +1 -0
  70. package/dist/presentation-flow-runtime.d.ts +139 -0
  71. package/dist/presentation-flow-runtime.d.ts.map +1 -0
  72. package/dist/presentation-flow-runtime.js +514 -0
  73. package/dist/presentation-flow-runtime.js.map +1 -0
  74. package/dist/presentation-module-context.d.ts +4 -0
  75. package/dist/presentation-module-context.d.ts.map +1 -0
  76. package/dist/presentation-module-context.js +6 -0
  77. package/dist/presentation-module-context.js.map +1 -0
  78. package/dist/presentation-module-provider.d.ts +7 -0
  79. package/dist/presentation-module-provider.d.ts.map +1 -0
  80. package/dist/presentation-module-provider.js +7 -0
  81. package/dist/presentation-module-provider.js.map +1 -0
  82. package/dist/presentation-projection-diagnostics-context.d.ts +8 -0
  83. package/dist/presentation-projection-diagnostics-context.d.ts.map +1 -0
  84. package/dist/presentation-projection-diagnostics-context.js +3 -0
  85. package/dist/presentation-projection-diagnostics-context.js.map +1 -0
  86. package/dist/presentation-projection-diagnostics-hooks.d.ts +4 -0
  87. package/dist/presentation-projection-diagnostics-hooks.d.ts.map +1 -0
  88. package/dist/presentation-projection-diagnostics-hooks.js +17 -0
  89. package/dist/presentation-projection-diagnostics-hooks.js.map +1 -0
  90. package/dist/presentation-projection-diagnostics-runtime.d.ts +12 -0
  91. package/dist/presentation-projection-diagnostics-runtime.d.ts.map +1 -0
  92. package/dist/presentation-projection-diagnostics-runtime.js +54 -0
  93. package/dist/presentation-projection-diagnostics-runtime.js.map +1 -0
  94. package/dist/presentation-projection-trace.d.ts +27 -0
  95. package/dist/presentation-projection-trace.d.ts.map +1 -0
  96. package/dist/presentation-projection-trace.js +54 -0
  97. package/dist/presentation-projection-trace.js.map +1 -0
  98. package/dist/presentation-query-form-runtime.d.ts +30 -0
  99. package/dist/presentation-query-form-runtime.d.ts.map +1 -0
  100. package/dist/presentation-query-form-runtime.js +75 -0
  101. package/dist/presentation-query-form-runtime.js.map +1 -0
  102. package/dist/presentation-query-form-state-adapter-registry.d.ts +4 -0
  103. package/dist/presentation-query-form-state-adapter-registry.d.ts.map +1 -0
  104. package/dist/presentation-query-form-state-adapter-registry.js +13 -0
  105. package/dist/presentation-query-form-state-adapter-registry.js.map +1 -0
  106. package/dist/presentation-query-form-state-context.d.ts +20 -0
  107. package/dist/presentation-query-form-state-context.d.ts.map +1 -0
  108. package/dist/presentation-query-form-state-context.js +20 -0
  109. package/dist/presentation-query-form-state-context.js.map +1 -0
  110. package/dist/presentation-query-form-state.d.ts +29 -0
  111. package/dist/presentation-query-form-state.d.ts.map +1 -0
  112. package/dist/presentation-query-form-state.js +99 -0
  113. package/dist/presentation-query-form-state.js.map +1 -0
  114. package/dist/presentation-renderer-registry.d.ts +109 -0
  115. package/dist/presentation-renderer-registry.d.ts.map +1 -0
  116. package/dist/presentation-renderer-registry.js +25 -0
  117. package/dist/presentation-renderer-registry.js.map +1 -0
  118. package/dist/presentation-standards-context.d.ts +4 -0
  119. package/dist/presentation-standards-context.d.ts.map +1 -0
  120. package/dist/presentation-standards-context.js +12 -0
  121. package/dist/presentation-standards-context.js.map +1 -0
  122. package/dist/presentation-standards-provider.d.ts +14 -0
  123. package/dist/presentation-standards-provider.d.ts.map +1 -0
  124. package/dist/presentation-standards-provider.js +16 -0
  125. package/dist/presentation-standards-provider.js.map +1 -0
  126. package/dist/projected-document-action-runtime-bindings.d.ts +20 -0
  127. package/dist/projected-document-action-runtime-bindings.d.ts.map +1 -0
  128. package/dist/projected-document-action-runtime-bindings.js +88 -0
  129. package/dist/projected-document-action-runtime-bindings.js.map +1 -0
  130. package/dist/projected-document-action-runtime.d.ts +76 -0
  131. package/dist/projected-document-action-runtime.d.ts.map +1 -0
  132. package/dist/projected-document-action-runtime.js +224 -0
  133. package/dist/projected-document-action-runtime.js.map +1 -0
  134. package/dist/projected-document-process-preview-action-runtime-bindings.d.ts +26 -0
  135. package/dist/projected-document-process-preview-action-runtime-bindings.d.ts.map +1 -0
  136. package/dist/projected-document-process-preview-action-runtime-bindings.js +106 -0
  137. package/dist/projected-document-process-preview-action-runtime-bindings.js.map +1 -0
  138. package/dist/projected-document-process-preview-action-runtime.d.ts +321 -0
  139. package/dist/projected-document-process-preview-action-runtime.d.ts.map +1 -0
  140. package/dist/projected-document-process-preview-action-runtime.js +729 -0
  141. package/dist/projected-document-process-preview-action-runtime.js.map +1 -0
  142. package/dist/projected-document-process-preview-capability-runtime.d.ts +47 -0
  143. package/dist/projected-document-process-preview-capability-runtime.d.ts.map +1 -0
  144. package/dist/projected-document-process-preview-capability-runtime.js +49 -0
  145. package/dist/projected-document-process-preview-capability-runtime.js.map +1 -0
  146. package/dist/projected-document-workspace-action-runtime.d.ts +87 -0
  147. package/dist/projected-document-workspace-action-runtime.d.ts.map +1 -0
  148. package/dist/projected-document-workspace-action-runtime.js +150 -0
  149. package/dist/projected-document-workspace-action-runtime.js.map +1 -0
  150. package/dist/projected-document-workspace-projection-renderer-diagnostics.d.ts +18 -0
  151. package/dist/projected-document-workspace-projection-renderer-diagnostics.d.ts.map +1 -0
  152. package/dist/projected-document-workspace-projection-renderer-diagnostics.js +207 -0
  153. package/dist/projected-document-workspace-projection-renderer-diagnostics.js.map +1 -0
  154. package/dist/projected-document-workspace-runtime-binding-diagnostics.d.ts +19 -0
  155. package/dist/projected-document-workspace-runtime-binding-diagnostics.d.ts.map +1 -0
  156. package/dist/projected-document-workspace-runtime-binding-diagnostics.js +124 -0
  157. package/dist/projected-document-workspace-runtime-binding-diagnostics.js.map +1 -0
  158. package/dist/projected-navigation-provider.d.ts +16 -0
  159. package/dist/projected-navigation-provider.d.ts.map +1 -0
  160. package/dist/projected-navigation-provider.js +51 -0
  161. package/dist/projected-navigation-provider.js.map +1 -0
  162. package/dist/projected-presentation-flow-host.d.ts +16 -0
  163. package/dist/projected-presentation-flow-host.d.ts.map +1 -0
  164. package/dist/projected-presentation-flow-host.js +14 -0
  165. package/dist/projected-presentation-flow-host.js.map +1 -0
  166. package/dist/projected-query-form-state-adapter.d.ts +12 -0
  167. package/dist/projected-query-form-state-adapter.d.ts.map +1 -0
  168. package/dist/projected-query-form-state-adapter.js +361 -0
  169. package/dist/projected-query-form-state-adapter.js.map +1 -0
  170. package/dist/react-router-binding.d.ts +133 -0
  171. package/dist/react-router-binding.d.ts.map +1 -0
  172. package/dist/react-router-binding.js +76 -0
  173. package/dist/react-router-binding.js.map +1 -0
  174. package/dist/react-router-path.d.ts +4 -0
  175. package/dist/react-router-path.d.ts.map +1 -0
  176. package/dist/react-router-path.js +11 -0
  177. package/dist/react-router-path.js.map +1 -0
  178. package/dist/scope-selection-context.d.ts +28 -0
  179. package/dist/scope-selection-context.d.ts.map +1 -0
  180. package/dist/scope-selection-context.js +13 -0
  181. package/dist/scope-selection-context.js.map +1 -0
  182. package/dist/scope-selection-provider.d.ts +33 -0
  183. package/dist/scope-selection-provider.d.ts.map +1 -0
  184. package/dist/scope-selection-provider.js +162 -0
  185. package/dist/scope-selection-provider.js.map +1 -0
  186. package/dist/scope-selection-request.d.ts +6 -0
  187. package/dist/scope-selection-request.d.ts.map +1 -0
  188. package/dist/scope-selection-request.js +12 -0
  189. package/dist/scope-selection-request.js.map +1 -0
  190. package/dist/standard-navigation-shell-frame-renderers.d.ts +15 -0
  191. package/dist/standard-navigation-shell-frame-renderers.d.ts.map +1 -0
  192. package/dist/standard-navigation-shell-frame-renderers.js +22 -0
  193. package/dist/standard-navigation-shell-frame-renderers.js.map +1 -0
  194. package/dist/standard-navigation-shell-slot-renderers.d.ts +59 -0
  195. package/dist/standard-navigation-shell-slot-renderers.d.ts.map +1 -0
  196. package/dist/standard-navigation-shell-slot-renderers.js +67 -0
  197. package/dist/standard-navigation-shell-slot-renderers.js.map +1 -0
  198. package/dist/view-chrome-slot-renderer-registry.d.ts +12 -0
  199. package/dist/view-chrome-slot-renderer-registry.d.ts.map +1 -0
  200. package/dist/view-chrome-slot-renderer-registry.js +12 -0
  201. package/dist/view-chrome-slot-renderer-registry.js.map +1 -0
  202. package/package.json +60 -0
  203. package/src/collection-chrome-slot-renderer-registry.ts +66 -0
  204. package/src/collection-selection-state-context.ts +51 -0
  205. package/src/collection-selection-state.tsx +101 -0
  206. package/src/document-workspace-runtime.tsx +1505 -0
  207. package/src/index.ts +50 -0
  208. package/src/input-form-endpoint-runtime.ts +632 -0
  209. package/src/local-flow-state-data-source-projection.ts +133 -0
  210. package/src/navigation-runtime-context.ts +40 -0
  211. package/src/navigation-shell-frame-renderer-registry.ts +54 -0
  212. package/src/navigation-shell-region-component-registry.tsx +127 -0
  213. package/src/navigation-shell-slot-renderer-registry.ts +88 -0
  214. package/src/page-host-projection.ts +356 -0
  215. package/src/page-host-renderer-registry.tsx +353 -0
  216. package/src/presentation-action-group-runtime-options.ts +121 -0
  217. package/src/presentation-action-runtime.ts +190 -0
  218. package/src/presentation-data-source-binding-runtime.ts +109 -0
  219. package/src/presentation-data-source-binding.tsx +24 -0
  220. package/src/presentation-flow-runtime.tsx +835 -0
  221. package/src/presentation-module-context.ts +10 -0
  222. package/src/presentation-module-provider.tsx +19 -0
  223. package/src/presentation-projection-diagnostics-context.ts +17 -0
  224. package/src/presentation-projection-diagnostics-hooks.ts +29 -0
  225. package/src/presentation-projection-diagnostics-runtime.tsx +95 -0
  226. package/src/presentation-projection-trace.ts +117 -0
  227. package/src/presentation-query-form-runtime.ts +148 -0
  228. package/src/presentation-query-form-state-adapter-registry.ts +25 -0
  229. package/src/presentation-query-form-state-context.ts +56 -0
  230. package/src/presentation-query-form-state.tsx +250 -0
  231. package/src/presentation-renderer-registry.ts +214 -0
  232. package/src/presentation-standards-context.ts +21 -0
  233. package/src/presentation-standards-provider.tsx +44 -0
  234. package/src/projected-document-action-runtime-bindings.ts +132 -0
  235. package/src/projected-document-action-runtime.ts +414 -0
  236. package/src/projected-document-process-preview-action-runtime-bindings.ts +231 -0
  237. package/src/projected-document-process-preview-action-runtime.ts +1725 -0
  238. package/src/projected-document-process-preview-capability-runtime.ts +216 -0
  239. package/src/projected-document-workspace-action-runtime.ts +402 -0
  240. package/src/projected-document-workspace-projection-renderer-diagnostics.ts +342 -0
  241. package/src/projected-document-workspace-runtime-binding-diagnostics.ts +208 -0
  242. package/src/projected-navigation-provider.tsx +104 -0
  243. package/src/projected-presentation-flow-host.tsx +46 -0
  244. package/src/projected-query-form-state-adapter.ts +578 -0
  245. package/src/react-router-binding.tsx +417 -0
  246. package/src/react-router-path.ts +16 -0
  247. package/src/scope-selection-context.ts +58 -0
  248. package/src/scope-selection-provider.tsx +324 -0
  249. package/src/scope-selection-request.ts +21 -0
  250. package/src/standard-navigation-shell-frame-renderers.tsx +106 -0
  251. package/src/standard-navigation-shell-slot-renderers.tsx +289 -0
  252. package/src/view-chrome-slot-renderer-registry.ts +66 -0
@@ -0,0 +1,1725 @@
1
+ import { useMemo, useState } from 'react'
2
+
3
+ import type {
4
+ ProjectedDocumentResource,
5
+ PresentationNavigationHrefFactory,
6
+ } from '@cohesivesystems/presentation-core'
7
+ import { useProjectedInputFormEndpointRuntime } from './input-form-endpoint-runtime'
8
+ import type {
9
+ ActionDefinition,
10
+ ActionPlacementDefinition,
11
+ FlowDefinition,
12
+ InputFormDefinition,
13
+ PresentationModuleDefinition,
14
+ PromptDocumentPreviewDefinition,
15
+ ProcessTaskSelectorDefinition,
16
+ ViewDefinition,
17
+ } from '@cohesivesystems/presentation-core'
18
+ import {
19
+ findPresentationFlow,
20
+ findPresentationInputFormForView,
21
+ findPresentationView,
22
+ } from '@cohesivesystems/presentation-core'
23
+ import {
24
+ getPresentationViewProjectedActionPlacements,
25
+ } from '@cohesivesystems/presentation-core'
26
+ import {
27
+ projectRequiredPresentationActionEndpointRequest,
28
+ } from '@cohesivesystems/presentation-core'
29
+ import {
30
+ projectDocumentLocalActionEnablement,
31
+ type ProjectedDocumentActionEnablement,
32
+ type ProjectedDocumentLocalActionEnablementContext,
33
+ } from '@cohesivesystems/presentation-core'
34
+ import type {
35
+ PresentationActionEndpointExecutionRequest,
36
+ PresentationActionEndpointExecutor,
37
+ PresentationActionSuccessContext,
38
+ } from './presentation-action-runtime'
39
+ import {
40
+ usePresentationActionExecutor,
41
+ } from './presentation-action-runtime'
42
+ import {
43
+ advancePresentationFlowToStateKind,
44
+ findPresentationFlowTransition,
45
+ findPresentationFlowSurfaceState,
46
+ isPresentationFlowSurfaceOpenForData,
47
+ resolvePresentationActionPreparedFlow,
48
+ type PresentationFlowRuntimeRegistrySnapshot,
49
+ type PresentationFlowRuntimeSnapshot,
50
+ } from './presentation-flow-runtime'
51
+ import type {
52
+ PresentationProjectionDiagnostic,
53
+ ProjectedInputFormActionContext,
54
+ ProjectedInputFormRuntime,
55
+ } from '@cohesivesystems/presentation-core'
56
+ import {
57
+ findDocumentProcessPreviewAction,
58
+ findInputFormActionPlacement,
59
+ findPromptCommitAction,
60
+ findPromptDismissAction,
61
+ } from '@cohesivesystems/presentation-core'
62
+ import {
63
+ findPromptDocumentPreviewView,
64
+ projectPromptDocumentPreviewData,
65
+ type ProjectedPromptDocumentPreviewData,
66
+ type ProjectedPromptDocumentPreviewResource,
67
+ } from '@cohesivesystems/presentation-core'
68
+ import {
69
+ type ProcessTask,
70
+ type ProcessTaskSelector,
71
+ type ProcessTaskStartRegistration,
72
+ } from '@cohesivesystems/presentation-core'
73
+ import {
74
+ projectProcessTaskActionEnablement,
75
+ projectProcessTaskStartRegistration,
76
+ projectProcessTaskSelector,
77
+ type ProjectedProcessTaskActionEnablement,
78
+ } from '@cohesivesystems/presentation-core'
79
+ import { flowStateKinds } from '@cohesivesystems/presentation-contracts'
80
+
81
+ /**
82
+ * Active preview data produced by a document-scoped process preview action.
83
+ *
84
+ * The state includes the preview endpoint request/response, the projected
85
+ * preview resource, formatted document text, caller-provided preview values,
86
+ * and the document `resourceKey` used to correlate the preview with the active
87
+ * workspace resource.
88
+ *
89
+ * @typeParam TPreviewResponse - Response returned by the preview endpoint.
90
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
91
+ * @typeParam TPreviewValues - Additional values projected by the host runtime.
92
+ * @typeParam TPreviewResource - Resource shape rendered by the prompt preview.
93
+ */
94
+ export type ProjectedDocumentProcessPreviewState<
95
+ TPreviewResponse = unknown,
96
+ TPreviewRequest extends object = object,
97
+ TPreviewValues extends Readonly<Record<string, unknown>> =
98
+ Readonly<Record<string, never>>,
99
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource =
100
+ ProjectedPromptDocumentPreviewResource,
101
+ > = ProjectedPromptDocumentPreviewData<
102
+ TPreviewResponse,
103
+ TPreviewRequest,
104
+ TPreviewResource,
105
+ TPreviewValues & { readonly resourceKey: string }
106
+ >
107
+
108
+ /**
109
+ * Success callback context for the action that starts a process after the user
110
+ * accepts a document preview.
111
+ *
112
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
113
+ * @typeParam TPreviewResponse - Response returned by the preview endpoint.
114
+ * @typeParam TStartInput - Input sent to the start endpoint.
115
+ * @typeParam TStartResult - Result returned by the start endpoint.
116
+ * @typeParam TPreviewValues - Additional values projected by the host runtime.
117
+ * @typeParam TPreviewResource - Resource shape rendered by the prompt preview.
118
+ */
119
+ export type ProjectedDocumentProcessStartSuccessContext<
120
+ TPreviewRequest extends object,
121
+ TPreviewResponse,
122
+ TStartInput,
123
+ TStartResult,
124
+ TPreviewValues extends Readonly<Record<string, unknown>>,
125
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
126
+ > = PresentationActionSuccessContext<TStartInput, TStartResult> & {
127
+ readonly preview: ProjectedDocumentProcessPreviewState<
128
+ TPreviewResponse,
129
+ TPreviewRequest,
130
+ TPreviewValues,
131
+ TPreviewResource
132
+ > | null
133
+ }
134
+
135
+ /**
136
+ * Context used to register a started process task after the start endpoint
137
+ * succeeds.
138
+ *
139
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
140
+ * @typeParam TPreviewResponse - Response returned by the preview endpoint.
141
+ * @typeParam TStartInput - Input sent to the start endpoint.
142
+ * @typeParam TStartResult - Result returned by the start endpoint.
143
+ * @typeParam TPreviewValues - Additional values projected by the host runtime.
144
+ * @typeParam TPreviewResource - Resource shape rendered by the prompt preview.
145
+ */
146
+ export type ProjectedDocumentProcessTaskStartRegistrationContext<
147
+ TPreviewRequest extends object,
148
+ TPreviewResponse,
149
+ TStartInput,
150
+ TStartResult,
151
+ TPreviewValues extends Readonly<Record<string, unknown>>,
152
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
153
+ > = ProjectedDocumentProcessStartSuccessContext<
154
+ TPreviewRequest,
155
+ TPreviewResponse,
156
+ TStartInput,
157
+ TStartResult,
158
+ TPreviewValues,
159
+ TPreviewResource
160
+ > & {
161
+ readonly actionEnablement: ProjectedProcessTaskActionEnablement
162
+ readonly selector: ProcessTaskSelectorDefinition | null
163
+ }
164
+
165
+ /**
166
+ * Options for the document process-preview action runtime hook.
167
+ *
168
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
169
+ * @typeParam TPreviewResponse - Response returned by the preview endpoint.
170
+ * @typeParam TStartInput - Input sent to the start endpoint.
171
+ * @typeParam TStartResult - Result returned by the start endpoint.
172
+ * @typeParam TPreviewValues - Additional values projected by the host runtime.
173
+ * @typeParam TResource - Document resource shape owned by the workspace.
174
+ * @typeParam TPreviewResource - Resource shape rendered by the prompt preview.
175
+ */
176
+ export interface UseProjectedDocumentProcessPreviewActionRuntimeOptions<
177
+ TPreviewRequest extends object,
178
+ TPreviewResponse,
179
+ TStartInput,
180
+ TStartResult,
181
+ TPreviewValues extends Readonly<Record<string, unknown>> =
182
+ Readonly<Record<string, never>>,
183
+ TResource extends ProjectedDocumentResource = ProjectedDocumentResource,
184
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource =
185
+ ProjectedPromptDocumentPreviewResource,
186
+ > {
187
+ /** Optional process-preview action id override. */
188
+ readonly actionId?: string | null
189
+
190
+ /** Action placements declared for the document workspace or active surface. */
191
+ readonly actionPlacements: readonly ActionPlacementDefinition[]
192
+
193
+ /** Creates flow data used when advancing from process start success. */
194
+ readonly createProcessFlowData?: (
195
+ context: ProjectedDocumentProcessStartSuccessContext<
196
+ TPreviewRequest,
197
+ TPreviewResponse,
198
+ TStartInput,
199
+ TStartResult,
200
+ TPreviewValues,
201
+ TPreviewResource
202
+ >,
203
+ ) => Readonly<Record<string, unknown>>
204
+
205
+ /** Creates the start endpoint input from the accepted preview. */
206
+ readonly createStartInput?: (
207
+ preview: ProjectedDocumentProcessPreviewState<
208
+ TPreviewResponse,
209
+ TPreviewRequest,
210
+ TPreviewValues,
211
+ TPreviewResource
212
+ >,
213
+ ) => TStartInput
214
+
215
+ /** Creates flow data dispatched when the user accepts the preview. */
216
+ readonly createStartFlowData?: (
217
+ preview: ProjectedDocumentProcessPreviewState<
218
+ TPreviewResponse,
219
+ TPreviewRequest,
220
+ TPreviewValues,
221
+ TPreviewResource
222
+ >,
223
+ ) => Readonly<Record<string, unknown>>
224
+
225
+ /** Creates a process task registration from a successful start action. */
226
+ readonly createProcessTaskStartRegistration?: (
227
+ context: ProjectedDocumentProcessTaskStartRegistrationContext<
228
+ TPreviewRequest,
229
+ TPreviewResponse,
230
+ TStartInput,
231
+ TStartResult,
232
+ TPreviewValues,
233
+ TPreviewResource
234
+ >,
235
+ ) => ProcessTaskStartRegistration | null
236
+
237
+ /** Data source id associated with the preview/start action bindings. */
238
+ readonly dataSourceId: string
239
+
240
+ /** Query key factory used for action invalidation and process task links. */
241
+ readonly dataSourceQueryKey?: (dataSourceId: string) => readonly unknown[]
242
+
243
+ /** Default value or value factory for the prompt input form. */
244
+ readonly defaultValue?: TPreviewRequest | (() => TPreviewRequest)
245
+
246
+ /** Host endpoint executor used by both preview and start actions. */
247
+ readonly executeEndpoint: PresentationActionEndpointExecutor
248
+
249
+ /** Finds an already-active process task matching a projected selector. */
250
+ readonly findActiveTask?: (selector: ProcessTaskSelector) => ProcessTask | null
251
+
252
+ /** Optional flow id override for the process-preview flow. */
253
+ readonly flowId?: string | null
254
+
255
+ /** Runtime registry that owns flow instances for prompt/process transitions. */
256
+ readonly flowRegistry: PresentationFlowRuntimeRegistrySnapshot
257
+
258
+ /** Optional href factory used when projecting process task links. */
259
+ readonly createHref?: PresentationNavigationHrefFactory | null
260
+
261
+ /** Optional state key for persisting prompt input form state. */
262
+ readonly inputStateKey?: string | null
263
+
264
+ /** Whether the process-preview action is available for the current document. */
265
+ readonly isActionAvailable?: boolean
266
+
267
+ /** Whether preview execution is temporarily blocked by the host. */
268
+ readonly isPreviewBlocked?: boolean
269
+
270
+ /** Whether confirmed process start is temporarily blocked by the host. */
271
+ readonly isStartBlocked?: boolean
272
+
273
+ /** Local document action enablement context for preview/start actions. */
274
+ readonly localActionEnablement?: ProjectedDocumentLocalActionEnablementContext | null
275
+
276
+ /** Active presentation module containing actions, flows, forms, and views. */
277
+ readonly module: PresentationModuleDefinition | null
278
+
279
+ /** Hook called after the process start action succeeds. */
280
+ readonly processStartResult?: (
281
+ context: ProjectedDocumentProcessStartSuccessContext<
282
+ TPreviewRequest,
283
+ TPreviewResponse,
284
+ TStartInput,
285
+ TStartResult,
286
+ TPreviewValues,
287
+ TPreviewResource
288
+ >,
289
+ ) => void
290
+
291
+ /** Projects the preview resource rendered in the prompt document preview. */
292
+ readonly projectPreviewResource?: (context: {
293
+ readonly request: TPreviewRequest
294
+ readonly resource: TResource
295
+ readonly resourceKey: string
296
+ readonly response: TPreviewResponse
297
+ }) => TPreviewResource | null | undefined
298
+
299
+ /** Projects additional preview data available to preview templates. */
300
+ readonly projectPreviewValues?: (context: {
301
+ readonly request: TPreviewRequest
302
+ readonly resource: TResource
303
+ readonly resourceKey: string
304
+ readonly response: TPreviewResponse
305
+ }) => TPreviewValues
306
+
307
+ /** Host context used to project process task selectors and enablement. */
308
+ readonly processTaskContext?: unknown
309
+
310
+ /** Process task selector definitions declared for the preview action. */
311
+ readonly processTaskSelectors?: readonly ProcessTaskSelectorDefinition[]
312
+
313
+ /** Converts selector definitions into runtime process task selectors. */
314
+ readonly projectProcessTaskSelector?: (
315
+ selector: ProcessTaskSelectorDefinition | null | undefined,
316
+ context: unknown,
317
+ ) => ProcessTaskSelector | null
318
+
319
+ /** Prepares the preview endpoint request from prompt input form state. */
320
+ readonly preparePreviewRequest?: (
321
+ context: ProjectedDocumentProcessPreviewRequestContext<
322
+ TPreviewRequest,
323
+ TResource
324
+ >,
325
+ ) => PresentationActionEndpointExecutionRequest
326
+
327
+ /** Prepares the process start endpoint request from accepted preview input. */
328
+ readonly prepareStartRequest?: (
329
+ context: ProjectedDocumentProcessStartRequestContext<TStartInput, TResource>,
330
+ ) => PresentationActionEndpointExecutionRequest
331
+
332
+ /** Current document resource, when loaded. */
333
+ readonly resource: TResource | undefined
334
+
335
+ /** Stable document resource id from the active route or workspace. */
336
+ readonly resourceId: string
337
+
338
+ /** Stable document resource key used to correlate flow instances and preview state. */
339
+ readonly resourceKey: string | null
340
+
341
+ /** Registers a started process task with the host process task runtime. */
342
+ readonly registerProcessTaskStart?: (started: ProcessTaskStartRegistration) => void
343
+
344
+ /** Message used when the preview action is unavailable. */
345
+ readonly unavailableMessage?: string
346
+
347
+ /** Host validation hook run immediately before preview request projection. */
348
+ readonly validatePreviewRequest?: () => void
349
+
350
+ /** Host validation hook run immediately before start request projection. */
351
+ readonly validateStartRequest?: () => void
352
+ }
353
+
354
+ /**
355
+ * Request-preparation context for the preview endpoint.
356
+ *
357
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
358
+ * @typeParam TResource - Document resource shape owned by the workspace.
359
+ */
360
+ export interface ProjectedDocumentProcessPreviewRequestContext<
361
+ TPreviewRequest extends object,
362
+ TResource extends ProjectedDocumentResource,
363
+ > {
364
+ /** Preview action definition resolved from the presentation module. */
365
+ readonly action: ActionDefinition | null
366
+
367
+ /** Input form action context captured from the projected form runtime. */
368
+ readonly actionContext: ProjectedInputFormActionContext<TPreviewRequest>
369
+
370
+ /** Preview action id used for endpoint request projection. */
371
+ readonly actionId: string
372
+
373
+ /** Data source id associated with the preview action binding. */
374
+ readonly dataSourceId: string
375
+
376
+ /** Endpoint id selected by the active action target binding. */
377
+ readonly endpointId: string
378
+
379
+ /** Input form definition rendered in the process preview prompt. */
380
+ readonly inputForm: InputFormDefinition
381
+
382
+ /** Active presentation module used for endpoint request projection. */
383
+ readonly module: PresentationModuleDefinition | null
384
+
385
+ /** Current document resource. */
386
+ readonly resource: TResource
387
+
388
+ /** Stable document resource id from the active route or workspace. */
389
+ readonly resourceId: string
390
+
391
+ /** Stable document resource key used to correlate preview state. */
392
+ readonly resourceKey: string
393
+
394
+ /** Current prompt input form value. */
395
+ readonly value: TPreviewRequest
396
+ }
397
+
398
+ /**
399
+ * Request-preparation context for the confirmed process start endpoint.
400
+ *
401
+ * @typeParam TStartInput - Input sent to the start endpoint.
402
+ * @typeParam TResource - Document resource shape owned by the workspace.
403
+ */
404
+ export interface ProjectedDocumentProcessStartRequestContext<
405
+ TStartInput,
406
+ TResource extends ProjectedDocumentResource,
407
+ > {
408
+ /** Start action definition resolved from the prompt commit action. */
409
+ readonly action: ActionDefinition | null
410
+
411
+ /** Start action id used for endpoint request projection. */
412
+ readonly actionId: string
413
+
414
+ /** Data source id associated with the start action binding. */
415
+ readonly dataSourceId: string
416
+
417
+ /** Endpoint id selected by the active action target binding. */
418
+ readonly endpointId: string
419
+
420
+ /** Start endpoint input projected from the accepted preview. */
421
+ readonly input: TStartInput
422
+
423
+ /** Active presentation module used for endpoint request projection. */
424
+ readonly module: PresentationModuleDefinition | null
425
+
426
+ /** Current document resource. */
427
+ readonly resource: TResource
428
+
429
+ /** Stable document resource id from the active route or workspace. */
430
+ readonly resourceId: string
431
+ }
432
+
433
+ /**
434
+ * Runtime state and commands for a document process-preview action.
435
+ *
436
+ * @typeParam TPreviewRequest - Request object submitted to the preview endpoint.
437
+ * @typeParam TPreviewResponse - Response returned by the preview endpoint.
438
+ * @typeParam TPreviewValues - Additional values projected by the host runtime.
439
+ * @typeParam TPreviewResource - Resource shape rendered by the prompt preview.
440
+ */
441
+ export interface ProjectedDocumentProcessPreviewActionRuntime<
442
+ TPreviewRequest extends object,
443
+ TPreviewResponse,
444
+ TPreviewValues extends Readonly<Record<string, unknown>>,
445
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
446
+ > {
447
+ /** Resolved presentation actions participating in the preview prompt flow. */
448
+ readonly actions: {
449
+ /** Prompt dismiss action. */
450
+ readonly dismiss: ActionDefinition | null
451
+
452
+ /** Action that requests the preview. */
453
+ readonly preview: ActionDefinition | null
454
+
455
+ /** Prompt commit action that starts the process. */
456
+ readonly start: ActionDefinition | null
457
+ }
458
+
459
+ /** Local enablement results for preview and start actions. */
460
+ readonly actionEnablement: {
461
+ /** Enablement result for the preview action. */
462
+ readonly preview: ProjectedDocumentActionEnablement
463
+
464
+ /** Enablement result for the process start action. */
465
+ readonly start: ProjectedDocumentActionEnablement
466
+ }
467
+
468
+ /** Stable action ids used for flow transitions and diagnostics. */
469
+ readonly actionIds: {
470
+ /** Dismiss action id or a diagnostic fallback id. */
471
+ readonly dismiss: string
472
+
473
+ /** Preview action id or a diagnostic fallback id. */
474
+ readonly preview: string
475
+
476
+ /** Start action id or a diagnostic fallback id. */
477
+ readonly start: string
478
+ }
479
+
480
+ /** Accepts the active preview and invokes the process start action. */
481
+ readonly acceptPreview: () => void
482
+
483
+ /** Preview data for the active resource key, or `null` when none is active. */
484
+ readonly activePreview: ProjectedDocumentProcessPreviewState<
485
+ TPreviewResponse,
486
+ TPreviewRequest,
487
+ TPreviewValues,
488
+ TPreviewResource
489
+ > | null
490
+
491
+ /** Whether the preview request action can currently execute. */
492
+ readonly canExecuteAction: boolean
493
+
494
+ /** Whether the active preview can currently be accepted. */
495
+ readonly canAcceptPreview: boolean
496
+
497
+ /** Cancels the active preview and clears preview state. */
498
+ readonly cancelPreview: () => void
499
+
500
+ /** Cancels the prompt flow without accepting the preview. */
501
+ readonly cancelPrompt: () => void
502
+
503
+ /** Action placements used for projection diagnostics in the prompt view. */
504
+ readonly diagnosticActionPlacements: readonly ActionPlacementDefinition[]
505
+
506
+ /** Projection diagnostics for missing action, flow, form, and endpoint pieces. */
507
+ readonly diagnostics: readonly PresentationProjectionDiagnostic[]
508
+
509
+ /** User-facing disabled reasons for preview and start commands. */
510
+ readonly disabledReasons: {
511
+ /** Reason preview execution is disabled, or `null` when enabled. */
512
+ readonly preview: string | null
513
+
514
+ /** Reason process start is disabled, or `null` when enabled. */
515
+ readonly start: string | null
516
+ }
517
+
518
+ /** Process-preview flow definition resolved from the action or override. */
519
+ readonly flow: FlowDefinition | null
520
+
521
+ /** Process-preview flow id used by the runtime. */
522
+ readonly flowId: string
523
+
524
+ /** Runtime snapshot for the active process-preview flow instance. */
525
+ readonly flowRuntime: PresentationFlowRuntimeSnapshot
526
+
527
+ /** Whether a process-preview action was resolved. */
528
+ readonly hasAction: boolean
529
+
530
+ /** Prompt input form definition and projected runtime adapter. */
531
+ readonly input: {
532
+ /** Input form definition used by the preview prompt. */
533
+ readonly form: InputFormDefinition | null
534
+
535
+ /** Input form runtime adapter, or `null` when no form is projected. */
536
+ readonly runtime: ProjectedInputFormRuntime<TPreviewRequest> | null
537
+ }
538
+
539
+ /** Whether the preview prompt surface is currently open for the active resource. */
540
+ readonly isPromptOpen: boolean
541
+
542
+ /** Preview endpoint execution state. */
543
+ readonly preview: {
544
+ /** Preview endpoint id selected by action target bindings. */
545
+ readonly endpointId: string | null
546
+
547
+ /** Last preview endpoint execution error. */
548
+ readonly error: unknown
549
+
550
+ /** Whether the preview endpoint is currently executing. */
551
+ readonly isPending: boolean
552
+
553
+ /** Resets preview form/runtime state. */
554
+ readonly reset: () => void
555
+
556
+ /** Resets only the preview endpoint execution state. */
557
+ readonly resetExecution: () => void
558
+ }
559
+
560
+ /** Process task selector and active-task enablement projection. */
561
+ readonly processTask: ProjectedProcessTaskActionEnablement
562
+
563
+ /** Prompt view resolved for the process-preview flow. */
564
+ readonly promptView: ViewDefinition | null
565
+
566
+ /** Starts preview request execution, optionally with an explicit form action context. */
567
+ readonly requestPreview: (
568
+ actionContext?: ProjectedInputFormActionContext<TPreviewRequest>,
569
+ ) => void
570
+
571
+ /** Resets preview endpoint state, start action state, flow state, and active preview. */
572
+ readonly reset: () => void
573
+
574
+ /** Process start endpoint execution state. */
575
+ readonly start: {
576
+ /** Start action definition resolved from the prompt commit action. */
577
+ readonly action: ActionDefinition | null
578
+
579
+ /** Start endpoint id selected by action target bindings. */
580
+ readonly endpointId: string | null
581
+
582
+ /** Last start endpoint execution error. */
583
+ readonly error: unknown
584
+
585
+ /** Whether the start endpoint is currently executing. */
586
+ readonly isPending: boolean
587
+
588
+ /** Resets the start endpoint execution state. */
589
+ readonly reset: () => void
590
+ }
591
+ }
592
+
593
+ /**
594
+ * Generic runtime for document-scoped process-preview flows declared in the
595
+ * presentation IR.
596
+ *
597
+ * It resolves the preview flow, projects the prompt input form, executes the
598
+ * preview endpoint, manages prompt preview state, and starts the confirmed
599
+ * process. Product code supplies domain validation and process-result
600
+ * interpretation.
601
+ */
602
+ export function useProjectedDocumentProcessPreviewActionRuntime<
603
+ TPreviewRequest extends object,
604
+ TPreviewResponse,
605
+ TStartInput,
606
+ TStartResult,
607
+ TPreviewValues extends Readonly<Record<string, unknown>> =
608
+ Readonly<Record<string, never>>,
609
+ TResource extends ProjectedDocumentResource = ProjectedDocumentResource,
610
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource =
611
+ ProjectedPromptDocumentPreviewResource,
612
+ >({
613
+ actionId: runtimeActionId,
614
+ actionPlacements,
615
+ createProcessFlowData = createDefaultProcessFlowData,
616
+ createProcessTaskStartRegistration,
617
+ createStartInput,
618
+ createStartFlowData = createDefaultStartFlowData,
619
+ dataSourceId,
620
+ dataSourceQueryKey,
621
+ defaultValue,
622
+ executeEndpoint,
623
+ findActiveTask,
624
+ flowId: runtimeFlowId,
625
+ flowRegistry,
626
+ createHref,
627
+ inputStateKey,
628
+ isActionAvailable = true,
629
+ isPreviewBlocked = false,
630
+ isStartBlocked = false,
631
+ localActionEnablement,
632
+ module,
633
+ processStartResult,
634
+ processTaskContext,
635
+ processTaskSelectors = emptyProcessTaskSelectors,
636
+ projectPreviewResource,
637
+ projectPreviewValues,
638
+ projectProcessTaskSelector: projectTaskSelector = projectProcessTaskSelector,
639
+ preparePreviewRequest,
640
+ prepareStartRequest,
641
+ resource,
642
+ resourceId,
643
+ resourceKey,
644
+ registerProcessTaskStart,
645
+ unavailableMessage = 'This document does not expose a process preview action.',
646
+ validatePreviewRequest,
647
+ validateStartRequest,
648
+ }: UseProjectedDocumentProcessPreviewActionRuntimeOptions<
649
+ TPreviewRequest,
650
+ TPreviewResponse,
651
+ TStartInput,
652
+ TStartResult,
653
+ TPreviewValues,
654
+ TResource,
655
+ TPreviewResource
656
+ >): ProjectedDocumentProcessPreviewActionRuntime<
657
+ TPreviewRequest,
658
+ TPreviewResponse,
659
+ TPreviewValues,
660
+ TPreviewResource
661
+ > {
662
+ const [preview, setPreview] = useState<ProjectedDocumentProcessPreviewState<
663
+ TPreviewResponse,
664
+ TPreviewRequest,
665
+ TPreviewValues,
666
+ TPreviewResource
667
+ > | null>(null)
668
+ const previewAction = useMemo(
669
+ () =>
670
+ findDocumentProcessPreviewAction({
671
+ actionId: runtimeActionId,
672
+ actionPlacements,
673
+ dataSourceId,
674
+ flowId: runtimeFlowId,
675
+ module,
676
+ }),
677
+ [actionPlacements, dataSourceId, module, runtimeActionId, runtimeFlowId],
678
+ )
679
+ const actionFlow = useMemo(
680
+ () => resolvePresentationActionPreparedFlow(previewAction),
681
+ [previewAction],
682
+ )
683
+ const flowId = runtimeFlowId ?? actionFlow?.flowId ?? ''
684
+ const flow = useMemo(
685
+ () => findPresentationFlow<FlowDefinition>(module, flowId),
686
+ [flowId, module],
687
+ )
688
+ const promptView = useMemo(() => {
689
+ const promptViewId =
690
+ actionFlow?.promptViewId ??
691
+ findPresentationFlowSurfaceState(flow)?.ViewId
692
+
693
+ return promptViewId
694
+ ? findPresentationView<ViewDefinition>(module, promptViewId)
695
+ : null
696
+ }, [actionFlow?.promptViewId, flow, module])
697
+ const diagnosticActionPlacements = useMemo(
698
+ () => getPresentationViewProjectedActionPlacements(promptView),
699
+ [promptView],
700
+ )
701
+ const inputForm = useMemo(
702
+ () => findPresentationInputFormForView(module, promptView),
703
+ [module, promptView],
704
+ )
705
+ const previewDefinition = useMemo(
706
+ () => findPromptDocumentPreviewView(module, promptView)?.PromptDocumentPreview ?? null,
707
+ [module, promptView],
708
+ )
709
+ const startAction = useMemo(
710
+ () => findPromptCommitAction({ module, view: promptView }),
711
+ [module, promptView],
712
+ )
713
+ const dismissAction = useMemo(
714
+ () => findPromptDismissAction({ module, view: promptView }),
715
+ [module, promptView],
716
+ )
717
+ const inputFormActionPlacement = useMemo(
718
+ () => findInputFormActionPlacement(inputForm, previewAction),
719
+ [inputForm, previewAction],
720
+ )
721
+ const flowRuntime = flowRegistry.getRuntime(flowId)
722
+ const activePreview =
723
+ resourceKey !== null && preview?.resourceKey === resourceKey
724
+ ? preview
725
+ : null
726
+ const isPromptOpen = isPresentationFlowSurfaceOpenForData({
727
+ dataKey: 'resourceKey',
728
+ dataValue: resourceKey,
729
+ flowId,
730
+ runtime: flowRuntime,
731
+ })
732
+ const previewActionId = optionalActionId(previewAction, 'document-process-preview')
733
+ const startActionId = optionalActionId(startAction, 'document-process-start')
734
+ const dismissActionId = optionalActionId(dismissAction, 'document-process-dismiss')
735
+ const hasAction = Boolean(previewAction)
736
+ const processTaskActionEnablement = projectProcessTaskActionEnablement({
737
+ action: previewAction,
738
+ context: processTaskContext ?? {
739
+ resource,
740
+ resourceId,
741
+ route: { id: resourceId },
742
+ },
743
+ findActiveTask: findActiveTask ?? noActiveProcessTask,
744
+ projectSelector: projectTaskSelector,
745
+ selectors: processTaskSelectors,
746
+ })
747
+ const previewActionEnablement = projectDocumentLocalActionEnablement({
748
+ action: previewAction,
749
+ context: localActionEnablement,
750
+ })
751
+ const startActionEnablement = projectDocumentLocalActionEnablement({
752
+ action: startAction,
753
+ context: localActionEnablement,
754
+ })
755
+
756
+ const processStart = usePresentationActionExecutor<TStartInput, TStartResult>({
757
+ actionId: startActionId,
758
+ dataSourceId,
759
+ dataSourceQueryKey,
760
+ executeEndpoint,
761
+ module,
762
+ prepareRequest: ({ action, actionId, endpointId, input, module: requestModule }) => {
763
+ if (!hasAction || !isActionAvailable || !resource) {
764
+ throw new Error(unavailableMessage)
765
+ }
766
+ if (startActionEnablement.isDisabled) {
767
+ throw new Error(startActionEnablement.message ?? unavailableMessage)
768
+ }
769
+
770
+ validateStartRequest?.()
771
+
772
+ return prepareStartRequest?.({
773
+ action,
774
+ actionId,
775
+ dataSourceId,
776
+ endpointId,
777
+ input,
778
+ module: requestModule,
779
+ resource,
780
+ resourceId,
781
+ }) ?? projectRequiredPresentationActionEndpointRequest({
782
+ action,
783
+ actionId,
784
+ dataSourceId,
785
+ endpointId,
786
+ sources: {
787
+ input,
788
+ resource,
789
+ route: { id: resourceId },
790
+ },
791
+ })
792
+ },
793
+ processResult: (context) => {
794
+ const successContext = {
795
+ ...context,
796
+ preview: activePreview,
797
+ } satisfies ProjectedDocumentProcessStartSuccessContext<
798
+ TPreviewRequest,
799
+ TPreviewResponse,
800
+ TStartInput,
801
+ TStartResult,
802
+ TPreviewValues,
803
+ TPreviewResource
804
+ >
805
+ const registration = createProcessTaskStartRegistration?.({
806
+ ...successContext,
807
+ actionEnablement: processTaskActionEnablement,
808
+ selector: processTaskActionEnablement.selector,
809
+ }) ?? projectProcessTaskStartRegistration({
810
+ action: context.action,
811
+ context: {
812
+ input: context.input,
813
+ resource,
814
+ resourceId,
815
+ result: context.result,
816
+ route: { id: resourceId },
817
+ },
818
+ createHref,
819
+ dataSourceQueryKey,
820
+ result: context.result,
821
+ selector: processTaskActionEnablement.selector,
822
+ })
823
+ if (registration) {
824
+ registerProcessTaskStart?.(registration)
825
+ }
826
+
827
+ processStartResult?.(successContext)
828
+ advancePresentationFlowToStateKind({
829
+ allowStateFallback: false,
830
+ data: createProcessFlowData(successContext),
831
+ flow,
832
+ runtime: flowRuntime,
833
+ stateKinds: [flowStateKinds.process],
834
+ })
835
+ },
836
+ onSuccess: () => {
837
+ setPreview(null)
838
+ },
839
+ })
840
+
841
+ const previewEndpoint = useProjectedInputFormEndpointRuntime<
842
+ TPreviewRequest,
843
+ TPreviewResponse
844
+ >({
845
+ dataSourceId,
846
+ defaultValue,
847
+ defaultValueSources: {
848
+ resource,
849
+ route: { id: resourceId },
850
+ },
851
+ executeEndpoint,
852
+ inputForm,
853
+ invalidateDataSourceIds: [],
854
+ module,
855
+ prepareRequest: (context) => {
856
+ if (!hasAction || !isActionAvailable || !resource || !resourceKey) {
857
+ throw new Error(unavailableMessage)
858
+ }
859
+ if (previewActionEnablement.isDisabled) {
860
+ throw new Error(previewActionEnablement.message ?? unavailableMessage)
861
+ }
862
+
863
+ validatePreviewRequest?.()
864
+
865
+ return preparePreviewRequest?.({
866
+ action: context.action,
867
+ actionContext: context.actionContext,
868
+ actionId: previewActionId,
869
+ dataSourceId,
870
+ endpointId: context.endpointId,
871
+ inputForm: context.inputForm,
872
+ module: context.module,
873
+ resource,
874
+ resourceId,
875
+ resourceKey,
876
+ value: context.value,
877
+ }) ?? projectRequiredPresentationActionEndpointRequest({
878
+ action: context.action,
879
+ actionId: previewActionId,
880
+ dataSourceId,
881
+ endpointId: context.endpointId,
882
+ sources: {
883
+ input: context.value,
884
+ resource,
885
+ route: { id: resourceId },
886
+ },
887
+ })
888
+ },
889
+ onSuccess: ({ result, value }) => {
890
+ if (!resource || !resourceKey) {
891
+ return
892
+ }
893
+
894
+ const projectedPreview = projectPromptDocumentPreviewData({
895
+ definition: previewDefinition,
896
+ request: value,
897
+ resource: projectPreviewResource?.({
898
+ request: value,
899
+ resource,
900
+ resourceKey,
901
+ response: result,
902
+ }) ?? undefined,
903
+ response: result,
904
+ values: {
905
+ ...(projectPreviewValues?.({
906
+ request: value,
907
+ resource,
908
+ resourceKey,
909
+ response: result,
910
+ }) ?? {}),
911
+ resourceKey,
912
+ } as TPreviewValues & { readonly resourceKey: string },
913
+ })
914
+
915
+ advancePresentationFlowToStateKind({
916
+ allowStateFallback: false,
917
+ data: projectedPreview,
918
+ flow,
919
+ runtime: flowRuntime,
920
+ stateKinds: [flowStateKinds.prompt],
921
+ })
922
+ setPreview(projectedPreview)
923
+ },
924
+ stateKey: inputStateKey ?? null,
925
+ })
926
+
927
+ const canStartPreviewTransition = Boolean(
928
+ resourceKey &&
929
+ canStartFlowAction({
930
+ action: previewAction,
931
+ actionId: previewActionId,
932
+ data: { resourceKey },
933
+ flow,
934
+ }),
935
+ )
936
+ const previewDisabledReason = resolveProcessPreviewDisabledReason({
937
+ canStartPreviewTransition,
938
+ flow,
939
+ inputForm,
940
+ inputFormActionPlacement,
941
+ isActionAvailable,
942
+ previewAction,
943
+ previewActionEnablement,
944
+ previewDefinition,
945
+ previewEndpointId: previewEndpoint.endpointId,
946
+ processStartEndpointId: processStart.endpointId,
947
+ processTaskActionEnablement,
948
+ promptView,
949
+ resourceKey,
950
+ })
951
+ const activePreviewStartFlowData = activePreview
952
+ ? createStartFlowData(activePreview)
953
+ : null
954
+ const canDispatchStartTransition = Boolean(
955
+ activePreviewStartFlowData &&
956
+ canDispatchFlowAction({
957
+ action: startAction,
958
+ actionId: startActionId,
959
+ data: activePreviewStartFlowData,
960
+ flow,
961
+ runtime: flowRuntime,
962
+ }),
963
+ )
964
+ const startDisabledReason = resolveProcessStartDisabledReason({
965
+ activePreview,
966
+ canDispatchStartTransition,
967
+ isStartBlocked,
968
+ processStartEndpointId: processStart.endpointId,
969
+ processTaskActionEnablement,
970
+ startAction,
971
+ startActionEnablement,
972
+ })
973
+ const diagnostics = projectProcessPreviewRuntimeDiagnostics({
974
+ actionId: runtimeActionId,
975
+ dismissAction,
976
+ flow,
977
+ flowId,
978
+ inputForm,
979
+ inputFormActionPlacement,
980
+ previewAction,
981
+ previewDefinition,
982
+ previewEndpointId: previewEndpoint.endpointId,
983
+ promptView,
984
+ source: 'document-process-preview-action-runtime',
985
+ startAction,
986
+ startEndpointId: processStart.endpointId,
987
+ })
988
+ const canExecuteAction = previewDisabledReason === null
989
+ const canAcceptPreview = Boolean(activePreview && startDisabledReason === null)
990
+ const inputRuntime = previewEndpoint.runtime
991
+ ? {
992
+ invokeAction: requestPreview,
993
+ setValue: previewEndpoint.runtime.setValue,
994
+ value: previewEndpoint.runtime.value,
995
+ } satisfies ProjectedInputFormRuntime<TPreviewRequest>
996
+ : null
997
+
998
+ function reset() {
999
+ processStart.reset()
1000
+ previewEndpoint.reset()
1001
+ flowRuntime.clearFlow()
1002
+ setPreview(null)
1003
+ }
1004
+
1005
+ function requestPreview(
1006
+ actionContext?: ProjectedInputFormActionContext<TPreviewRequest>,
1007
+ ) {
1008
+ if (
1009
+ !hasAction ||
1010
+ !isActionAvailable ||
1011
+ !canExecuteAction ||
1012
+ !resource ||
1013
+ !resourceKey ||
1014
+ isPreviewBlocked ||
1015
+ previewEndpoint.isPending ||
1016
+ processStart.isPending
1017
+ ) {
1018
+ return
1019
+ }
1020
+
1021
+ processStart.reset()
1022
+ previewEndpoint.resetExecution()
1023
+ setPreview(null)
1024
+
1025
+ const started = flowRuntime.startFlow({
1026
+ actionId: previewActionId,
1027
+ data: { resourceKey },
1028
+ flowId,
1029
+ })
1030
+ if (!started) {
1031
+ return
1032
+ }
1033
+
1034
+ requestInputFormPreview(actionContext)
1035
+ }
1036
+
1037
+ function cancelPrompt() {
1038
+ previewEndpoint.reset()
1039
+ if (!flowRuntime.dispatchAction(dismissActionId)) {
1040
+ flowRuntime.clearFlow()
1041
+ return
1042
+ }
1043
+ flowRuntime.clearFlow()
1044
+ }
1045
+
1046
+ function cancelPreview() {
1047
+ processStart.reset()
1048
+ if (!flowRuntime.dispatchAction(dismissActionId)) {
1049
+ flowRuntime.clearFlow()
1050
+ setPreview(null)
1051
+ return
1052
+ }
1053
+ flowRuntime.clearFlow()
1054
+ setPreview(null)
1055
+ }
1056
+
1057
+ function acceptPreview() {
1058
+ if (processStart.isPending || !canAcceptPreview || !activePreview) {
1059
+ return
1060
+ }
1061
+
1062
+ const startFlowData = createStartFlowData(activePreview)
1063
+ if (!flowRuntime.dispatchAction(startActionId, { data: startFlowData })) {
1064
+ return
1065
+ }
1066
+
1067
+ processStart.execute(
1068
+ createStartInput?.(activePreview) ??
1069
+ projectDefaultProcessStartInput<
1070
+ TStartInput,
1071
+ TPreviewResponse,
1072
+ TPreviewRequest,
1073
+ TPreviewValues,
1074
+ TPreviewResource
1075
+ >(activePreview),
1076
+ )
1077
+ }
1078
+
1079
+ function requestInputFormPreview(
1080
+ actionContext?: ProjectedInputFormActionContext<TPreviewRequest>,
1081
+ ) {
1082
+ if (!inputForm || !previewEndpoint.runtime) {
1083
+ return
1084
+ }
1085
+
1086
+ if (!inputFormActionPlacement) {
1087
+ return
1088
+ }
1089
+
1090
+ previewEndpoint.runtime.invokeAction(
1091
+ actionContext ?? {
1092
+ action: previewAction,
1093
+ choiceValuesByFieldId: Object.fromEntries(
1094
+ inputForm.Fields.map((field) => [field.Id, []]),
1095
+ ),
1096
+ inputForm,
1097
+ placement: inputFormActionPlacement,
1098
+ target: {
1099
+ stateId:
1100
+ inputForm.SharedStateId ??
1101
+ inputForm.Target.Id ??
1102
+ inputForm.StateDataSourceId,
1103
+ },
1104
+ value: previewEndpoint.value,
1105
+ },
1106
+ )
1107
+ }
1108
+
1109
+ return {
1110
+ actions: {
1111
+ dismiss: dismissAction,
1112
+ preview: previewAction,
1113
+ start: processStart.action,
1114
+ },
1115
+ actionEnablement: {
1116
+ preview: previewActionEnablement,
1117
+ start: startActionEnablement,
1118
+ },
1119
+ actionIds: {
1120
+ dismiss: dismissActionId,
1121
+ preview: previewActionId,
1122
+ start: startActionId,
1123
+ },
1124
+ acceptPreview,
1125
+ activePreview,
1126
+ canAcceptPreview,
1127
+ canExecuteAction,
1128
+ cancelPreview,
1129
+ cancelPrompt,
1130
+ diagnosticActionPlacements,
1131
+ diagnostics,
1132
+ disabledReasons: {
1133
+ preview: previewDisabledReason,
1134
+ start: startDisabledReason,
1135
+ },
1136
+ flow,
1137
+ flowId,
1138
+ flowRuntime,
1139
+ hasAction,
1140
+ input: {
1141
+ form: inputForm,
1142
+ runtime: inputRuntime,
1143
+ },
1144
+ isPromptOpen,
1145
+ preview: {
1146
+ endpointId: previewEndpoint.endpointId,
1147
+ error: previewEndpoint.error,
1148
+ isPending: previewEndpoint.isPending,
1149
+ reset: previewEndpoint.reset,
1150
+ resetExecution: previewEndpoint.resetExecution,
1151
+ },
1152
+ processTask: processTaskActionEnablement,
1153
+ promptView,
1154
+ requestPreview,
1155
+ reset,
1156
+ start: {
1157
+ action: processStart.action,
1158
+ endpointId: processStart.endpointId,
1159
+ error: processStart.error,
1160
+ isPending: processStart.isPending,
1161
+ reset: processStart.reset,
1162
+ },
1163
+ }
1164
+ }
1165
+
1166
+ function createDefaultStartFlowData<
1167
+ TPreviewResponse,
1168
+ TPreviewRequest extends object,
1169
+ TPreviewValues extends Readonly<Record<string, unknown>>,
1170
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
1171
+ >(
1172
+ preview: ProjectedDocumentProcessPreviewState<
1173
+ TPreviewResponse,
1174
+ TPreviewRequest,
1175
+ TPreviewValues,
1176
+ TPreviewResource
1177
+ >,
1178
+ ) {
1179
+ return {
1180
+ request: preview.request,
1181
+ resourceKey: preview.resourceKey,
1182
+ ...readRecord(preview.response),
1183
+ }
1184
+ }
1185
+
1186
+ function createDefaultProcessFlowData<
1187
+ TPreviewRequest extends object,
1188
+ TPreviewResponse,
1189
+ TStartInput,
1190
+ TStartResult,
1191
+ TPreviewValues extends Readonly<Record<string, unknown>>,
1192
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
1193
+ >(
1194
+ context: ProjectedDocumentProcessStartSuccessContext<
1195
+ TPreviewRequest,
1196
+ TPreviewResponse,
1197
+ TStartInput,
1198
+ TStartResult,
1199
+ TPreviewValues,
1200
+ TPreviewResource
1201
+ >,
1202
+ ) {
1203
+ return readRecord(context.result) ?? { result: context.result }
1204
+ }
1205
+
1206
+ function readRecord(value: unknown) {
1207
+ return value && typeof value === 'object' && !Array.isArray(value)
1208
+ ? value as Readonly<Record<string, unknown>>
1209
+ : null
1210
+ }
1211
+
1212
+ function projectDefaultProcessStartInput<
1213
+ TStartInput,
1214
+ TPreviewResponse,
1215
+ TPreviewRequest extends object,
1216
+ TPreviewValues extends Readonly<Record<string, unknown>>,
1217
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
1218
+ >(
1219
+ preview: ProjectedDocumentProcessPreviewState<
1220
+ TPreviewResponse,
1221
+ TPreviewRequest,
1222
+ TPreviewValues,
1223
+ TPreviewResource
1224
+ >,
1225
+ ): TStartInput {
1226
+ const response = readRecord(preview.response)
1227
+ const startRequest =
1228
+ readCaseInsensitiveField(response, 'StartRequest') ??
1229
+ readCaseInsensitiveField(response, 'Request')
1230
+
1231
+ return (startRequest ?? preview.request) as TStartInput
1232
+ }
1233
+
1234
+ function readCaseInsensitiveField(
1235
+ record: Readonly<Record<string, unknown>> | null,
1236
+ field: string,
1237
+ ) {
1238
+ if (!record) {
1239
+ return undefined
1240
+ }
1241
+
1242
+ if (Object.prototype.hasOwnProperty.call(record, field)) {
1243
+ return record[field]
1244
+ }
1245
+
1246
+ const match = Object.keys(record).find(
1247
+ (candidate) => candidate.toLowerCase() === field.toLowerCase(),
1248
+ )
1249
+ return match ? record[match] : undefined
1250
+ }
1251
+
1252
+ function optionalActionId(
1253
+ action: Pick<ActionDefinition, 'Id'> | null | undefined,
1254
+ fallback: string,
1255
+ ) {
1256
+ return action?.Id ?? `missing:${fallback}`
1257
+ }
1258
+
1259
+ const emptyProcessTaskSelectors: readonly ProcessTaskSelectorDefinition[] = []
1260
+
1261
+ function noActiveProcessTask() {
1262
+ return null
1263
+ }
1264
+
1265
+ function resolveProcessPreviewDisabledReason({
1266
+ canStartPreviewTransition,
1267
+ flow,
1268
+ inputForm,
1269
+ inputFormActionPlacement,
1270
+ isActionAvailable,
1271
+ previewAction,
1272
+ previewActionEnablement,
1273
+ previewDefinition,
1274
+ previewEndpointId,
1275
+ processStartEndpointId,
1276
+ processTaskActionEnablement,
1277
+ promptView,
1278
+ resourceKey,
1279
+ }: {
1280
+ readonly canStartPreviewTransition: boolean
1281
+ readonly flow: FlowDefinition | null
1282
+ readonly inputForm: InputFormDefinition | null
1283
+ readonly inputFormActionPlacement: ActionPlacementDefinition | null
1284
+ readonly isActionAvailable: boolean
1285
+ readonly previewAction: ActionDefinition | null
1286
+ readonly previewActionEnablement: ProjectedDocumentActionEnablement
1287
+ readonly previewDefinition: PromptDocumentPreviewDefinition | null
1288
+ readonly previewEndpointId: string | null
1289
+ readonly processStartEndpointId: string | null
1290
+ readonly processTaskActionEnablement: ProjectedProcessTaskActionEnablement
1291
+ readonly promptView: ViewDefinition | null
1292
+ readonly resourceKey: string | null
1293
+ }) {
1294
+ if (!previewAction || !isActionAvailable) {
1295
+ return 'This document does not expose a process preview action.'
1296
+ }
1297
+
1298
+ if (!flow) {
1299
+ return `Action '${previewAction.Name}' does not resolve a preview flow.`
1300
+ }
1301
+
1302
+ if (!promptView) {
1303
+ return `Preview flow '${flow.Name}' does not resolve a prompt view.`
1304
+ }
1305
+
1306
+ if (!inputForm) {
1307
+ return `Prompt view '${promptView.Name}' does not resolve an input form.`
1308
+ }
1309
+
1310
+ if (!inputFormActionPlacement) {
1311
+ return `Input form '${inputForm.Name}' does not place the preview action.`
1312
+ }
1313
+
1314
+ if (!previewDefinition) {
1315
+ return `Prompt view '${promptView.Name}' does not declare a document preview surface.`
1316
+ }
1317
+
1318
+ if (!previewEndpointId) {
1319
+ return `No preview endpoint is bound for action '${previewAction.Name}'.`
1320
+ }
1321
+
1322
+ if (!processStartEndpointId) {
1323
+ return 'No process start endpoint is bound for the preview confirmation action.'
1324
+ }
1325
+
1326
+ if (!resourceKey) {
1327
+ return 'A loaded resource is required before previewing this process.'
1328
+ }
1329
+
1330
+ if (!canStartPreviewTransition) {
1331
+ return `Preview flow '${flow.Name}' cannot start from its initial state.`
1332
+ }
1333
+
1334
+ if (previewActionEnablement.isDisabled) {
1335
+ return previewActionEnablement.message
1336
+ }
1337
+
1338
+ if (processTaskActionEnablement.isDisabled) {
1339
+ return processTaskActionEnablement.message
1340
+ }
1341
+
1342
+ return null
1343
+ }
1344
+
1345
+ function resolveProcessStartDisabledReason<
1346
+ TPreviewResponse,
1347
+ TPreviewRequest extends object,
1348
+ TPreviewValues extends Readonly<Record<string, unknown>>,
1349
+ TPreviewResource extends ProjectedPromptDocumentPreviewResource,
1350
+ >({
1351
+ activePreview,
1352
+ canDispatchStartTransition,
1353
+ isStartBlocked,
1354
+ processStartEndpointId,
1355
+ processTaskActionEnablement,
1356
+ startAction,
1357
+ startActionEnablement,
1358
+ }: {
1359
+ readonly activePreview: ProjectedDocumentProcessPreviewState<
1360
+ TPreviewResponse,
1361
+ TPreviewRequest,
1362
+ TPreviewValues,
1363
+ TPreviewResource
1364
+ > | null
1365
+ readonly canDispatchStartTransition: boolean
1366
+ readonly isStartBlocked: boolean
1367
+ readonly processStartEndpointId: string | null
1368
+ readonly processTaskActionEnablement: ProjectedProcessTaskActionEnablement
1369
+ readonly startAction: ActionDefinition | null
1370
+ readonly startActionEnablement: ProjectedDocumentActionEnablement
1371
+ }) {
1372
+ if (!activePreview) {
1373
+ return 'A preview is required before starting this process.'
1374
+ }
1375
+
1376
+ if (!startAction) {
1377
+ return 'The preview prompt does not declare a process start action.'
1378
+ }
1379
+
1380
+ if (!processStartEndpointId) {
1381
+ return `No process start endpoint is bound for action '${startAction.Name}'.`
1382
+ }
1383
+
1384
+ if (!canDispatchStartTransition) {
1385
+ return 'The preview flow is not in a startable state.'
1386
+ }
1387
+
1388
+ if (startActionEnablement.isDisabled) {
1389
+ return startActionEnablement.message
1390
+ }
1391
+
1392
+ if (processTaskActionEnablement.isDisabled) {
1393
+ return processTaskActionEnablement.message
1394
+ }
1395
+
1396
+ if (isStartBlocked) {
1397
+ return 'Starting this process is currently blocked.'
1398
+ }
1399
+
1400
+ return null
1401
+ }
1402
+
1403
+ function canDispatchFlowAction({
1404
+ action,
1405
+ actionId,
1406
+ data,
1407
+ flow,
1408
+ runtime,
1409
+ }: {
1410
+ readonly action: ActionDefinition | null
1411
+ readonly actionId: string
1412
+ readonly data: Readonly<Record<string, unknown>>
1413
+ readonly flow: FlowDefinition | null
1414
+ readonly runtime: PresentationFlowRuntimeSnapshot
1415
+ }) {
1416
+ const instance = runtime.activeInstance
1417
+ if (!flow || !instance || instance.flowId !== flow.Id) {
1418
+ return false
1419
+ }
1420
+
1421
+ return Boolean(
1422
+ findPresentationFlowTransition({
1423
+ actionId,
1424
+ data: {
1425
+ ...instance.data,
1426
+ ...data,
1427
+ },
1428
+ event: action?.Binding.Id ?? actionId,
1429
+ flow,
1430
+ fromStateId: instance.stateId,
1431
+ }),
1432
+ )
1433
+ }
1434
+
1435
+ function canStartFlowAction({
1436
+ action,
1437
+ actionId,
1438
+ data,
1439
+ flow,
1440
+ }: {
1441
+ readonly action: ActionDefinition | null
1442
+ readonly actionId: string
1443
+ readonly data: Readonly<Record<string, unknown>>
1444
+ readonly flow: FlowDefinition | null
1445
+ }) {
1446
+ if (!flow) {
1447
+ return false
1448
+ }
1449
+
1450
+ return Boolean(
1451
+ findPresentationFlowTransition({
1452
+ actionId,
1453
+ data,
1454
+ event: action?.Binding.Id ?? actionId,
1455
+ flow,
1456
+ fromStateId: flow.InitialStateId,
1457
+ }),
1458
+ )
1459
+ }
1460
+
1461
+ function projectProcessPreviewRuntimeDiagnostics({
1462
+ actionId,
1463
+ dismissAction,
1464
+ flow,
1465
+ flowId,
1466
+ inputForm,
1467
+ inputFormActionPlacement,
1468
+ previewAction,
1469
+ previewDefinition,
1470
+ previewEndpointId,
1471
+ promptView,
1472
+ source,
1473
+ startAction,
1474
+ startEndpointId,
1475
+ }: {
1476
+ readonly actionId?: string | null
1477
+ readonly dismissAction: ActionDefinition | null
1478
+ readonly flow: FlowDefinition | null
1479
+ readonly flowId: string
1480
+ readonly inputForm: InputFormDefinition | null
1481
+ readonly inputFormActionPlacement: ActionPlacementDefinition | null
1482
+ readonly previewAction: ActionDefinition | null
1483
+ readonly previewDefinition: PromptDocumentPreviewDefinition | null
1484
+ readonly previewEndpointId: string | null
1485
+ readonly promptView: ViewDefinition | null
1486
+ readonly source: string
1487
+ readonly startAction: ActionDefinition | null
1488
+ readonly startEndpointId: string | null
1489
+ }): readonly PresentationProjectionDiagnostic[] {
1490
+ if (!actionId && !previewAction) {
1491
+ return []
1492
+ }
1493
+
1494
+ return [
1495
+ ...diagnoseProcessPreviewAction({ actionId, previewAction, source }),
1496
+ ...diagnoseProcessPreviewFlow({
1497
+ flow,
1498
+ flowId,
1499
+ inputForm,
1500
+ inputFormActionPlacement,
1501
+ previewAction,
1502
+ previewDefinition,
1503
+ previewEndpointId,
1504
+ promptView,
1505
+ source,
1506
+ startAction,
1507
+ startEndpointId,
1508
+ }),
1509
+ ...diagnoseProcessPreviewDismissAction({
1510
+ dismissAction,
1511
+ promptView,
1512
+ source,
1513
+ }),
1514
+ ]
1515
+ }
1516
+
1517
+ function diagnoseProcessPreviewAction({
1518
+ actionId,
1519
+ previewAction,
1520
+ source,
1521
+ }: {
1522
+ readonly actionId?: string | null
1523
+ readonly previewAction: ActionDefinition | null
1524
+ readonly source: string
1525
+ }) {
1526
+ if (!actionId || previewAction) {
1527
+ return []
1528
+ }
1529
+
1530
+ return [
1531
+ createProcessPreviewRuntimeDiagnostic({
1532
+ details: { actionId },
1533
+ id: `process-preview.${actionId}.missing-action`,
1534
+ message:
1535
+ `Document action runtime profile references process preview action '${actionId}', ` +
1536
+ 'but the action is not placed or cannot be interpreted as a document process preview.',
1537
+ severity: 'error',
1538
+ source,
1539
+ subject: {
1540
+ id: actionId,
1541
+ kind: 'action',
1542
+ },
1543
+ }),
1544
+ ]
1545
+ }
1546
+
1547
+ function diagnoseProcessPreviewFlow({
1548
+ flow,
1549
+ flowId,
1550
+ inputForm,
1551
+ inputFormActionPlacement,
1552
+ previewAction,
1553
+ previewDefinition,
1554
+ previewEndpointId,
1555
+ promptView,
1556
+ source,
1557
+ startAction,
1558
+ startEndpointId,
1559
+ }: {
1560
+ readonly flow: FlowDefinition | null
1561
+ readonly flowId: string
1562
+ readonly inputForm: InputFormDefinition | null
1563
+ readonly inputFormActionPlacement: ActionPlacementDefinition | null
1564
+ readonly previewAction: ActionDefinition | null
1565
+ readonly previewDefinition: PromptDocumentPreviewDefinition | null
1566
+ readonly previewEndpointId: string | null
1567
+ readonly promptView: ViewDefinition | null
1568
+ readonly source: string
1569
+ readonly startAction: ActionDefinition | null
1570
+ readonly startEndpointId: string | null
1571
+ }) {
1572
+ if (!previewAction) {
1573
+ return []
1574
+ }
1575
+
1576
+ const diagnostics: PresentationProjectionDiagnostic[] = []
1577
+ if (!flow) {
1578
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1579
+ details: { actionId: previewAction.Id, flowId },
1580
+ id: `process-preview.${previewAction.Id}.missing-flow`,
1581
+ message:
1582
+ `Process preview action '${previewAction.Name}' references flow '${flowId}', ` +
1583
+ 'but that flow is not present in the presentation module.',
1584
+ severity: 'error',
1585
+ source,
1586
+ subject: { id: previewAction.Id, kind: 'action', name: previewAction.Name },
1587
+ }))
1588
+ return diagnostics
1589
+ }
1590
+
1591
+ if (!promptView) {
1592
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1593
+ details: { actionId: previewAction.Id, flowId: flow.Id },
1594
+ id: `process-preview.${previewAction.Id}.missing-prompt-view`,
1595
+ message:
1596
+ `Process preview flow '${flow.Name}' does not resolve a prompt view for ` +
1597
+ `action '${previewAction.Name}'.`,
1598
+ severity: 'error',
1599
+ source,
1600
+ subject: { id: flow.Id, kind: 'flow', name: flow.Name },
1601
+ }))
1602
+ }
1603
+
1604
+ if (!inputForm) {
1605
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1606
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
1607
+ id: `process-preview.${previewAction.Id}.missing-input-form`,
1608
+ message:
1609
+ `Process preview prompt '${promptView?.Name ?? flow.Name}' does not resolve ` +
1610
+ 'an input form.',
1611
+ severity: 'error',
1612
+ source,
1613
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
1614
+ }))
1615
+ }
1616
+
1617
+ if (inputForm && !inputFormActionPlacement) {
1618
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1619
+ details: { actionId: previewAction.Id, inputFormId: inputForm.Id },
1620
+ id: `process-preview.${previewAction.Id}.missing-input-form-action`,
1621
+ message:
1622
+ `Input form '${inputForm.Name}' does not place process preview action ` +
1623
+ `'${previewAction.Name}'.`,
1624
+ severity: 'error',
1625
+ source,
1626
+ subject: { id: inputForm.Id, kind: 'input-form', name: inputForm.Name },
1627
+ }))
1628
+ }
1629
+
1630
+ if (!previewDefinition) {
1631
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1632
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
1633
+ id: `process-preview.${previewAction.Id}.missing-preview-surface`,
1634
+ message:
1635
+ `Process preview prompt '${promptView?.Name ?? flow.Name}' does not declare ` +
1636
+ 'a document preview surface.',
1637
+ severity: 'error',
1638
+ source,
1639
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
1640
+ }))
1641
+ }
1642
+
1643
+ if (!previewEndpointId) {
1644
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1645
+ details: { actionId: previewAction.Id, inputFormId: inputForm?.Id },
1646
+ id: `process-preview.${previewAction.Id}.missing-preview-endpoint`,
1647
+ message:
1648
+ `No endpoint binding is registered for process preview action ` +
1649
+ `'${previewAction.Name}'.`,
1650
+ severity: 'error',
1651
+ source,
1652
+ subject: { id: previewAction.Id, kind: 'action', name: previewAction.Name },
1653
+ }))
1654
+ }
1655
+
1656
+ if (!startAction) {
1657
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1658
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
1659
+ id: `process-preview.${previewAction.Id}.missing-start-action`,
1660
+ message:
1661
+ `Process preview prompt '${promptView?.Name ?? flow.Name}' does not declare ` +
1662
+ 'a process start action.',
1663
+ severity: 'error',
1664
+ source,
1665
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
1666
+ }))
1667
+ } else if (!startEndpointId) {
1668
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
1669
+ details: { actionId: startAction.Id, flowId: flow.Id },
1670
+ id: `process-preview.${startAction.Id}.missing-start-endpoint`,
1671
+ message:
1672
+ `No endpoint binding is registered for process start action ` +
1673
+ `'${startAction.Name}'.`,
1674
+ severity: 'error',
1675
+ source,
1676
+ subject: { id: startAction.Id, kind: 'action', name: startAction.Name },
1677
+ }))
1678
+ }
1679
+
1680
+ return diagnostics
1681
+ }
1682
+
1683
+ function diagnoseProcessPreviewDismissAction({
1684
+ dismissAction,
1685
+ promptView,
1686
+ source,
1687
+ }: {
1688
+ readonly dismissAction: ActionDefinition | null
1689
+ readonly promptView: ViewDefinition | null
1690
+ readonly source: string
1691
+ }) {
1692
+ if (!promptView || dismissAction) {
1693
+ return []
1694
+ }
1695
+
1696
+ return [
1697
+ createProcessPreviewRuntimeDiagnostic({
1698
+ details: { viewId: promptView.Id },
1699
+ id: `process-preview.${promptView.Id}.missing-dismiss-action`,
1700
+ message:
1701
+ `Process preview prompt '${promptView.Name}' does not declare a dismiss action.`,
1702
+ severity: 'warning',
1703
+ source,
1704
+ subject: { id: promptView.Id, kind: 'view', name: promptView.Name },
1705
+ }),
1706
+ ]
1707
+ }
1708
+
1709
+ function createProcessPreviewRuntimeDiagnostic({
1710
+ details,
1711
+ id,
1712
+ message,
1713
+ severity,
1714
+ source,
1715
+ subject,
1716
+ }: PresentationProjectionDiagnostic): PresentationProjectionDiagnostic {
1717
+ return {
1718
+ details,
1719
+ id,
1720
+ message,
1721
+ severity,
1722
+ source,
1723
+ subject,
1724
+ }
1725
+ }