@ram_28/kf-ai-sdk 2.0.1 → 2.0.3

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 (193) hide show
  1. package/README.md +36 -39
  2. package/dist/BaseField-B6da88U7.js +40 -0
  3. package/dist/BaseField-Drp0-OxL.cjs +1 -0
  4. package/dist/api/client.d.ts +7 -0
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/index.d.ts +1 -1
  7. package/dist/api/index.d.ts.map +1 -1
  8. package/dist/api/metadata.d.ts +26 -22
  9. package/dist/api/metadata.d.ts.map +1 -1
  10. package/dist/api.cjs +1 -1
  11. package/dist/api.mjs +3 -3
  12. package/dist/auth.cjs +1 -1
  13. package/dist/auth.mjs +2 -2
  14. package/dist/base-types.d.ts +1 -1
  15. package/dist/base-types.d.ts.map +1 -1
  16. package/dist/bdo/core/BaseBdo.d.ts +12 -20
  17. package/dist/bdo/core/BaseBdo.d.ts.map +1 -1
  18. package/dist/bdo/core/Item.d.ts +8 -44
  19. package/dist/bdo/core/Item.d.ts.map +1 -1
  20. package/dist/bdo/core/types.d.ts +124 -41
  21. package/dist/bdo/core/types.d.ts.map +1 -1
  22. package/dist/bdo/fields/ArrayField.d.ts +5 -4
  23. package/dist/bdo/fields/ArrayField.d.ts.map +1 -1
  24. package/dist/bdo/fields/BaseField.d.ts +14 -19
  25. package/dist/bdo/fields/BaseField.d.ts.map +1 -1
  26. package/dist/bdo/fields/BooleanField.d.ts +3 -4
  27. package/dist/bdo/fields/BooleanField.d.ts.map +1 -1
  28. package/dist/bdo/fields/DateField.d.ts +3 -4
  29. package/dist/bdo/fields/DateField.d.ts.map +1 -1
  30. package/dist/bdo/fields/DateTimeField.d.ts +5 -4
  31. package/dist/bdo/fields/DateTimeField.d.ts.map +1 -1
  32. package/dist/bdo/fields/FileField.d.ts +18 -0
  33. package/dist/bdo/fields/FileField.d.ts.map +1 -0
  34. package/dist/bdo/fields/NumberField.d.ts +6 -4
  35. package/dist/bdo/fields/NumberField.d.ts.map +1 -1
  36. package/dist/bdo/fields/ObjectField.d.ts +5 -4
  37. package/dist/bdo/fields/ObjectField.d.ts.map +1 -1
  38. package/dist/bdo/fields/ReferenceField.d.ts +13 -14
  39. package/dist/bdo/fields/ReferenceField.d.ts.map +1 -1
  40. package/dist/bdo/fields/SelectField.d.ts +9 -16
  41. package/dist/bdo/fields/SelectField.d.ts.map +1 -1
  42. package/dist/bdo/fields/StringField.d.ts +6 -4
  43. package/dist/bdo/fields/StringField.d.ts.map +1 -1
  44. package/dist/bdo/fields/TextAreaField.d.ts +1 -18
  45. package/dist/bdo/fields/TextAreaField.d.ts.map +1 -1
  46. package/dist/bdo/fields/TextField.d.ts +22 -0
  47. package/dist/bdo/fields/TextField.d.ts.map +1 -0
  48. package/dist/bdo/fields/UserField.d.ts +20 -0
  49. package/dist/bdo/fields/UserField.d.ts.map +1 -0
  50. package/dist/bdo/fields/index.d.ts +5 -2
  51. package/dist/bdo/fields/index.d.ts.map +1 -1
  52. package/dist/bdo/index.d.ts +2 -2
  53. package/dist/bdo/index.d.ts.map +1 -1
  54. package/dist/bdo.cjs +1 -1
  55. package/dist/bdo.d.ts +1 -5
  56. package/dist/bdo.d.ts.map +1 -1
  57. package/dist/bdo.mjs +286 -243
  58. package/dist/bdo.types.d.ts +2 -3
  59. package/dist/bdo.types.d.ts.map +1 -1
  60. package/dist/{client-BIkaIr2y.js → client-BULEEaCP.js} +84 -79
  61. package/dist/client-DtPpfJc1.cjs +1 -0
  62. package/dist/components/hooks/useFilter/useFilter.d.ts.map +1 -1
  63. package/dist/components/hooks/useForm/createItemProxy.d.ts.map +1 -1
  64. package/dist/components/hooks/useForm/createResolver.d.ts +12 -2
  65. package/dist/components/hooks/useForm/createResolver.d.ts.map +1 -1
  66. package/dist/components/hooks/useForm/index.d.ts +1 -1
  67. package/dist/components/hooks/useForm/index.d.ts.map +1 -1
  68. package/dist/components/hooks/useForm/types.d.ts +77 -8
  69. package/dist/components/hooks/useForm/types.d.ts.map +1 -1
  70. package/dist/components/hooks/useForm/useDraftInteraction.d.ts +26 -0
  71. package/dist/components/hooks/useForm/useDraftInteraction.d.ts.map +1 -0
  72. package/dist/components/hooks/useForm/useForm.d.ts +2 -27
  73. package/dist/components/hooks/useForm/useForm.d.ts.map +1 -1
  74. package/dist/components/hooks/useTable/useTable.d.ts.map +1 -1
  75. package/dist/{constants-DaX7GLgl.js → constants-BQrBcCON.js} +37 -13
  76. package/dist/constants-D0J69if5.cjs +1 -0
  77. package/dist/error-handling-CAoD0Kwb.cjs +1 -0
  78. package/dist/error-handling-CrhTtD88.js +14 -0
  79. package/dist/filter.cjs +1 -1
  80. package/dist/filter.mjs +2 -2
  81. package/dist/form.cjs +1 -1
  82. package/dist/form.d.ts +1 -1
  83. package/dist/form.d.ts.map +1 -1
  84. package/dist/form.mjs +333 -1142
  85. package/dist/form.types.d.ts +1 -1
  86. package/dist/form.types.d.ts.map +1 -1
  87. package/dist/index.d.ts +2 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.esm-Cj63v5ny.js +1014 -0
  90. package/dist/index.esm-DuwT11sx.cjs +1 -0
  91. package/dist/{metadata-Bz8zJqC1.cjs → metadata-BJWukIqS.cjs} +1 -1
  92. package/dist/{metadata-VbQzyD2C.js → metadata-CJuFxytC.js} +1 -1
  93. package/dist/table.cjs +1 -1
  94. package/dist/table.mjs +116 -122
  95. package/dist/types/base-fields.d.ts +24 -59
  96. package/dist/types/base-fields.d.ts.map +1 -1
  97. package/dist/types/constants.d.ts +2 -2
  98. package/dist/types/constants.d.ts.map +1 -1
  99. package/dist/useFilter-Bg0jvIL6.cjs +1 -0
  100. package/dist/useFilter-DPNLKY3H.js +118 -0
  101. package/dist/utils/formatting.d.ts +10 -1
  102. package/dist/utils/formatting.d.ts.map +1 -1
  103. package/dist/workflow/Activity.d.ts +85 -0
  104. package/dist/workflow/Activity.d.ts.map +1 -0
  105. package/dist/workflow/ActivityInstance.d.ts +96 -0
  106. package/dist/workflow/ActivityInstance.d.ts.map +1 -0
  107. package/dist/workflow/client.d.ts +39 -0
  108. package/dist/workflow/client.d.ts.map +1 -0
  109. package/dist/workflow/components/useActivityForm/createActivityItemProxy.d.ts +16 -0
  110. package/dist/workflow/components/useActivityForm/createActivityItemProxy.d.ts.map +1 -0
  111. package/dist/workflow/components/useActivityForm/createActivityResolver.d.ts +22 -0
  112. package/dist/workflow/components/useActivityForm/createActivityResolver.d.ts.map +1 -0
  113. package/dist/workflow/components/useActivityForm/index.d.ts +3 -0
  114. package/dist/workflow/components/useActivityForm/index.d.ts.map +1 -0
  115. package/dist/workflow/components/useActivityForm/types.d.ts +80 -0
  116. package/dist/workflow/components/useActivityForm/types.d.ts.map +1 -0
  117. package/dist/workflow/components/useActivityForm/useActivityForm.d.ts +4 -0
  118. package/dist/workflow/components/useActivityForm/useActivityForm.d.ts.map +1 -0
  119. package/dist/workflow/index.d.ts +8 -0
  120. package/dist/workflow/index.d.ts.map +1 -0
  121. package/dist/workflow/types.d.ts +53 -0
  122. package/dist/workflow/types.d.ts.map +1 -0
  123. package/dist/workflow.cjs +1 -0
  124. package/dist/workflow.d.ts +8 -0
  125. package/dist/workflow.d.ts.map +1 -0
  126. package/dist/workflow.mjs +565 -0
  127. package/dist/workflow.types.cjs +1 -0
  128. package/dist/workflow.types.d.ts +2 -0
  129. package/dist/workflow.types.d.ts.map +1 -0
  130. package/dist/workflow.types.mjs +1 -0
  131. package/docs/api.md +140 -572
  132. package/docs/bdo.md +742 -0
  133. package/docs/useAuth.md +10 -4
  134. package/docs/useFilter.md +40 -40
  135. package/docs/useForm.md +91 -62
  136. package/docs/useTable.md +38 -38
  137. package/docs/workflow.md +703 -0
  138. package/package.json +21 -1
  139. package/sdk/api/client.ts +77 -57
  140. package/sdk/api/index.ts +1 -0
  141. package/sdk/api/metadata.ts +22 -20
  142. package/sdk/base-types.ts +5 -9
  143. package/sdk/bdo/core/BaseBdo.ts +23 -38
  144. package/sdk/bdo/core/Item.ts +34 -56
  145. package/sdk/bdo/core/types.ts +147 -45
  146. package/sdk/bdo/fields/ArrayField.ts +9 -5
  147. package/sdk/bdo/fields/BaseField.ts +19 -29
  148. package/sdk/bdo/fields/BooleanField.ts +4 -5
  149. package/sdk/bdo/fields/DateField.ts +4 -5
  150. package/sdk/bdo/fields/DateTimeField.ts +9 -5
  151. package/sdk/bdo/fields/FileField.ts +39 -0
  152. package/sdk/bdo/fields/NumberField.ts +8 -5
  153. package/sdk/bdo/fields/ObjectField.ts +9 -5
  154. package/sdk/bdo/fields/ReferenceField.ts +22 -28
  155. package/sdk/bdo/fields/SelectField.ts +13 -26
  156. package/sdk/bdo/fields/StringField.ts +10 -5
  157. package/sdk/bdo/fields/TextAreaField.ts +3 -32
  158. package/sdk/bdo/fields/TextField.ts +42 -0
  159. package/sdk/bdo/fields/UserField.ts +52 -0
  160. package/sdk/bdo/fields/index.ts +5 -2
  161. package/sdk/bdo/index.ts +19 -4
  162. package/sdk/bdo.ts +4 -31
  163. package/sdk/bdo.types.ts +26 -21
  164. package/sdk/components/hooks/useFilter/useFilter.ts +13 -30
  165. package/sdk/components/hooks/useForm/createItemProxy.ts +47 -11
  166. package/sdk/components/hooks/useForm/createResolver.ts +65 -6
  167. package/sdk/components/hooks/useForm/index.ts +4 -0
  168. package/sdk/components/hooks/useForm/types.ts +92 -9
  169. package/sdk/components/hooks/useForm/useDraftInteraction.ts +251 -0
  170. package/sdk/components/hooks/useForm/useForm.ts +132 -60
  171. package/sdk/components/hooks/useTable/useTable.ts +10 -2
  172. package/sdk/form.ts +1 -12
  173. package/sdk/form.types.ts +1 -0
  174. package/sdk/index.ts +9 -3
  175. package/sdk/types/base-fields.ts +28 -72
  176. package/sdk/types/constants.ts +2 -2
  177. package/sdk/utils/formatting.ts +13 -1
  178. package/sdk/workflow/Activity.ts +181 -0
  179. package/sdk/workflow/ActivityInstance.ts +339 -0
  180. package/sdk/workflow/client.ts +208 -0
  181. package/sdk/workflow/components/useActivityForm/createActivityItemProxy.ts +126 -0
  182. package/sdk/workflow/components/useActivityForm/createActivityResolver.ts +61 -0
  183. package/sdk/workflow/components/useActivityForm/index.ts +5 -0
  184. package/sdk/workflow/components/useActivityForm/types.ts +166 -0
  185. package/sdk/workflow/components/useActivityForm/useActivityForm.ts +386 -0
  186. package/sdk/workflow/index.ts +20 -0
  187. package/sdk/workflow/types.ts +84 -0
  188. package/sdk/workflow.ts +25 -0
  189. package/sdk/workflow.types.ts +11 -0
  190. package/dist/client-DxjRcEtN.cjs +0 -1
  191. package/dist/constants-C49b9Exc.cjs +0 -1
  192. package/dist/useFilter-DzpP_ag0.cjs +0 -1
  193. package/dist/useFilter-H5bgAZQF.js +0 -120
@@ -0,0 +1,386 @@
1
+ // ============================================================
2
+ // USE ACTIVITY FORM HOOK
3
+ // ============================================================
4
+ // React hook for building forms bound to workflow activity input fields.
5
+ // Accepts an Activity class instance and integrates with
6
+ // react-hook-form and the Workflow API client.
7
+
8
+ import { useState, useEffect, useCallback, useMemo, useRef } from "react";
9
+ import { useForm as useReactHookForm } from "react-hook-form";
10
+ import type { Path, FieldValues } from "react-hook-form";
11
+
12
+ import type { Activity } from "../../Activity";
13
+ import type {
14
+ UseActivityFormOptions,
15
+ UseActivityFormReturn,
16
+ AllActivityFields,
17
+ } from "./types";
18
+
19
+ import { createActivityResolver } from "./createActivityResolver";
20
+ import { createActivityItemProxy } from "./createActivityItemProxy";
21
+ import { toError } from "../../../utils/error-handling";
22
+
23
+ // ============================================================
24
+ // MAIN HOOK
25
+ // ============================================================
26
+
27
+ export function useActivityForm<
28
+ A extends Activity<any, any, any>,
29
+ >(
30
+ activity: A,
31
+ options: UseActivityFormOptions<A>,
32
+ ): UseActivityFormReturn<A> {
33
+ const {
34
+ activity_instance_id,
35
+ defaultValues = {},
36
+ mode = "onBlur",
37
+ enabled = true,
38
+ } = options;
39
+
40
+ // ============================================================
41
+ // STATE
42
+ // ============================================================
43
+
44
+ const [isLoading, setIsLoading] = useState(false);
45
+ const [loadError, setLoadError] = useState<Error | null>(null);
46
+ const [isSubmitting, setIsSubmitting] = useState(false);
47
+
48
+ // Prevent concurrent draft calls
49
+ const isComputingRef = useRef(false);
50
+ const computeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
51
+
52
+ // ============================================================
53
+ // FIELD DISCOVERY (memoized)
54
+ // ============================================================
55
+
56
+ const fields = useMemo(
57
+ () => activity._getFields(),
58
+ [activity],
59
+ );
60
+
61
+ // Identify readonly fields (editable: false) — these are "computed" in workflow context
62
+ const readonlyFieldNames = useMemo<string[]>(
63
+ () =>
64
+ Object.keys(fields).filter(
65
+ (k) => fields[k].readOnly,
66
+ ),
67
+ [fields],
68
+ );
69
+
70
+ // ============================================================
71
+ // RESOLVER (field type validation)
72
+ // ============================================================
73
+
74
+ const resolver = useMemo(
75
+ () => createActivityResolver(activity),
76
+ [activity],
77
+ );
78
+
79
+ // ============================================================
80
+ // REACT HOOK FORM
81
+ // ============================================================
82
+
83
+ const rhf = useReactHookForm({
84
+ mode,
85
+ defaultValues: defaultValues as any,
86
+ resolver,
87
+ });
88
+
89
+ // ============================================================
90
+ // ITEM PROXY (always in sync with RHF state)
91
+ // ============================================================
92
+
93
+ const item = useMemo(
94
+ () => createActivityItemProxy(activity, rhf as any),
95
+ [activity, rhf],
96
+ );
97
+
98
+ // ============================================================
99
+ // ACTIVITY OPERATIONS
100
+ // ============================================================
101
+
102
+ const activityRef = useMemo(
103
+ () => activity._getOps(),
104
+ [activity],
105
+ );
106
+
107
+ // ============================================================
108
+ // LOAD EXISTING DATA — activity.read() on mount
109
+ // ============================================================
110
+
111
+ useEffect(() => {
112
+ if (!enabled) return;
113
+
114
+ let active = true;
115
+
116
+ const loadData = async () => {
117
+ setIsLoading(true);
118
+ setLoadError(null);
119
+
120
+ try {
121
+ const data = await activityRef.read(activity_instance_id);
122
+
123
+ if (!active) return;
124
+
125
+ // Populate form with existing data
126
+ if (data && typeof data === "object") {
127
+ rhf.reset({ ...defaultValues, ...data } as any);
128
+ }
129
+ } catch (error) {
130
+ if (!active) return;
131
+ console.error("Failed to read activity data:", error);
132
+ setLoadError(toError(error));
133
+ } finally {
134
+ if (active) {
135
+ setIsLoading(false);
136
+ }
137
+ }
138
+ };
139
+
140
+ loadData();
141
+
142
+ return () => {
143
+ active = false;
144
+ };
145
+ }, [enabled, activityRef, activity_instance_id]);
146
+
147
+ // ============================================================
148
+ // DRAFT COMPUTATION ON BLUR
149
+ // ============================================================
150
+
151
+ const triggerDraftComputation = useCallback(
152
+ async (_fieldName: string) => {
153
+ // Only trigger if there are readonly/computed fields that might need updating
154
+ if (readonlyFieldNames.length === 0) return;
155
+ if (isComputingRef.current) return;
156
+
157
+ if (computeTimeoutRef.current) {
158
+ clearTimeout(computeTimeoutRef.current);
159
+ }
160
+
161
+ computeTimeoutRef.current = setTimeout(async () => {
162
+ if (isComputingRef.current) return;
163
+ isComputingRef.current = true;
164
+
165
+ try {
166
+ const currentValues = rhf.getValues();
167
+
168
+ // Build payload excluding readonly/computed fields
169
+ const payload: Record<string, unknown> = {};
170
+ const readonlySet = new Set(readonlyFieldNames);
171
+
172
+ Object.keys(currentValues).forEach((key) => {
173
+ if (!readonlySet.has(key)) {
174
+ (payload as any)[key] = (currentValues as any)[key];
175
+ }
176
+ });
177
+
178
+ const response = await activityRef.draftStart(activity_instance_id, payload as any);
179
+
180
+ // Apply computed fields returned from the server
181
+ if (response && typeof response === "object") {
182
+ Object.entries(response).forEach(([key, value]) => {
183
+ if (readonlySet.has(key)) {
184
+ const current = rhf.getValues(key as any);
185
+ if (current !== value) {
186
+ rhf.setValue(key as Path<FieldValues>, value as any, {
187
+ shouldDirty: false,
188
+ shouldValidate: false,
189
+ });
190
+ }
191
+ }
192
+ });
193
+ }
194
+ } catch (error) {
195
+ console.warn("Draft computation failed:", error);
196
+ } finally {
197
+ isComputingRef.current = false;
198
+ }
199
+ }, 300);
200
+ },
201
+ [activityRef, readonlyFieldNames, rhf],
202
+ );
203
+
204
+ // ============================================================
205
+ // REGISTER (enhanced with onBlur draft computation + auto-disable)
206
+ // ============================================================
207
+
208
+ const register = useCallback(
209
+ (name: string, registerOptions?: any) => {
210
+ const field = fields[name];
211
+ const isReadonly = field ? field.readOnly : false;
212
+
213
+ const originalOnBlur = registerOptions?.onBlur;
214
+
215
+ const enhancedOnBlur = async (e: any) => {
216
+ if (originalOnBlur) {
217
+ await originalOnBlur(e);
218
+ }
219
+
220
+ // Mode-aware validation
221
+ let isValid = true;
222
+ const shouldTriggerOnBlur =
223
+ mode === "onBlur" || mode === "onTouched" || mode === "all";
224
+
225
+ if (shouldTriggerOnBlur) {
226
+ isValid = await rhf.trigger(name as Path<FieldValues>);
227
+ } else {
228
+ const fieldState = rhf.getFieldState(name as any, rhf.formState);
229
+ isValid = !fieldState.error;
230
+ }
231
+
232
+ // Fire draft computation if field is valid
233
+ if (isValid) {
234
+ await triggerDraftComputation(name);
235
+ }
236
+ };
237
+
238
+ const result = rhf.register(name as Path<FieldValues>, {
239
+ ...registerOptions,
240
+ onBlur: enhancedOnBlur,
241
+ ...(isReadonly ? { disabled: true } : {}),
242
+ });
243
+
244
+ // For readonly fields, add disabled flag to the return
245
+ if (isReadonly) {
246
+ return { ...result, disabled: true as const };
247
+ }
248
+
249
+ return result;
250
+ },
251
+ [rhf, fields, triggerDraftComputation, mode],
252
+ ) as UseActivityFormReturn<A>["register"];
253
+
254
+ // ============================================================
255
+ // HANDLE SUBMIT — activity.update() + activity.draftEnd()
256
+ // ============================================================
257
+
258
+ const handleSubmit = useCallback(
259
+ (
260
+ onSuccess?: (
261
+ data: AllActivityFields<A>,
262
+ e?: React.BaseSyntheticEvent,
263
+ ) => void | Promise<void>,
264
+ onError?: (
265
+ error: any,
266
+ e?: React.BaseSyntheticEvent,
267
+ ) => void | Promise<void>,
268
+ ) => {
269
+ return rhf.handleSubmit(
270
+ async (data, event) => {
271
+ setIsSubmitting(true);
272
+
273
+ try {
274
+ // Build clean payload (exclude readonly/computed fields)
275
+ const cleanedData: Record<string, unknown> = {};
276
+ const readonlySet = new Set(readonlyFieldNames);
277
+
278
+ Object.keys(data).forEach((key) => {
279
+ if (!readonlySet.has(key) && (data as any)[key] !== undefined) {
280
+ cleanedData[key] = (data as any)[key];
281
+ }
282
+ });
283
+
284
+ // Save via activity.update() then activity.draftEnd()
285
+ await activityRef.update(activity_instance_id, cleanedData as any);
286
+ await activityRef.draftEnd(activity_instance_id, cleanedData as any);
287
+
288
+ await onSuccess?.(data as AllActivityFields<A>, event);
289
+ } catch (error) {
290
+ onError?.(toError(error), event);
291
+ } finally {
292
+ setIsSubmitting(false);
293
+ }
294
+ },
295
+ (errors, event) => {
296
+ onError?.(errors, event);
297
+ },
298
+ );
299
+ },
300
+ [rhf, activityRef, readonlyFieldNames],
301
+ ) as UseActivityFormReturn<A>["handleSubmit"];
302
+
303
+ // ============================================================
304
+ // HANDLE COMPLETE — activity.complete()
305
+ // ============================================================
306
+
307
+ const handleComplete = useCallback(
308
+ (
309
+ onSuccess?: (
310
+ data: AllActivityFields<A>,
311
+ e?: React.BaseSyntheticEvent,
312
+ ) => void | Promise<void>,
313
+ onError?: (
314
+ error: any,
315
+ e?: React.BaseSyntheticEvent,
316
+ ) => void | Promise<void>,
317
+ ) => {
318
+ return rhf.handleSubmit(
319
+ async (data, event) => {
320
+ setIsSubmitting(true);
321
+
322
+ try {
323
+ await activityRef.complete(activity_instance_id);
324
+ await onSuccess?.(data as AllActivityFields<A>, event);
325
+ } catch (error) {
326
+ onError?.(toError(error), event);
327
+ } finally {
328
+ setIsSubmitting(false);
329
+ }
330
+ },
331
+ (errors, event) => {
332
+ onError?.(errors, event);
333
+ },
334
+ );
335
+ },
336
+ [rhf, activityRef],
337
+ ) as UseActivityFormReturn<A>["handleComplete"];
338
+
339
+ // ============================================================
340
+ // CLEAR ERRORS
341
+ // ============================================================
342
+
343
+ const clearErrors = useCallback((): void => {
344
+ rhf.clearErrors();
345
+ }, [rhf]);
346
+
347
+ // ============================================================
348
+ // RETURN
349
+ // ============================================================
350
+
351
+ const hasError = !!loadError;
352
+
353
+ return {
354
+ // Item proxy
355
+ item,
356
+
357
+ // Activity reference
358
+ activity,
359
+
360
+ // Form methods
361
+ register,
362
+ handleSubmit,
363
+ handleComplete,
364
+ watch: rhf.watch as any,
365
+ setValue: rhf.setValue as any,
366
+ getValues: rhf.getValues as any,
367
+ reset: rhf.reset as any,
368
+ trigger: rhf.trigger as any,
369
+ control: rhf.control as any,
370
+
371
+ // Flattened form state
372
+ errors: rhf.formState.errors as any,
373
+ isValid: rhf.formState.isValid,
374
+ isDirty: rhf.formState.isDirty,
375
+ isSubmitting: rhf.formState.isSubmitting || isSubmitting,
376
+ isSubmitSuccessful: rhf.formState.isSubmitSuccessful,
377
+
378
+ // Loading
379
+ isLoading,
380
+ loadError,
381
+ hasError,
382
+
383
+ // Operations
384
+ clearErrors,
385
+ };
386
+ }
@@ -0,0 +1,20 @@
1
+ export { Workflow } from './client';
2
+ export { Activity } from './Activity';
3
+ export { ActivityInstance } from './ActivityInstance';
4
+ export type {
5
+ ActivityInstanceType,
6
+ EditableFieldAccessor,
7
+ ReadonlyFieldAccessor,
8
+ } from './ActivityInstance';
9
+ export type {
10
+ ActivityInstanceFieldsType,
11
+ ActivityOperations,
12
+ ActivityProgressType,
13
+ WorkflowStartResponseType,
14
+ } from './types';
15
+
16
+ export { useActivityForm } from './components/useActivityForm';
17
+ export type {
18
+ UseActivityFormOptions,
19
+ UseActivityFormReturn,
20
+ } from './components/useActivityForm';
@@ -0,0 +1,84 @@
1
+ // ============================================================
2
+ // Workflow Types - Business Process / Activity Operations
3
+ // ============================================================
4
+
5
+ import type {
6
+ ListOptionsType,
7
+ ListResponseType,
8
+ MetricOptionsType,
9
+ MetricResponseType,
10
+ DraftResponseType,
11
+ CreateUpdateResponseType,
12
+ } from "../types/common";
13
+
14
+ import type {
15
+ StringFieldType,
16
+ SelectFieldType,
17
+ DateTimeFieldType,
18
+ ReferenceFieldType,
19
+ } from "../types/base-fields";
20
+ import type { UserRefType } from "../types/base-fields";
21
+
22
+ /**
23
+ * Response from Workflow.start()
24
+ */
25
+ export interface WorkflowStartResponseType {
26
+ activityId: string;
27
+ activityInstanceId: string;
28
+ }
29
+
30
+ /**
31
+ * Response from the activity progress endpoint
32
+ */
33
+ export interface ActivityProgressType {
34
+ Stage?: string;
35
+ Progress?: number;
36
+ [key: string]: any;
37
+ }
38
+
39
+ /**
40
+ * System fields present on every activity instance response.
41
+ * Returned alongside activity-specific fields from `list()` and `read()`.
42
+ */
43
+ export type ActivityInstanceFieldsType = {
44
+ _id: StringFieldType;
45
+ Status: SelectFieldType<"InProgress" | "Completed">;
46
+ AssignedTo: ReferenceFieldType<UserRefType>;
47
+ CompletedAt: DateTimeFieldType;
48
+ };
49
+
50
+ /**
51
+ * Unified activity operations — returned by Workflow.activity(activityId)
52
+ *
53
+ * List-level methods operate on the activity as a whole.
54
+ * Instance-level methods accept `instanceId` as their first parameter.
55
+ */
56
+ export interface ActivityOperations<T> {
57
+ // ── List-level ──────────────────────────────────────────────
58
+
59
+ /** List activity instances (POST .../list) */
60
+ list(options?: ListOptionsType): Promise<ListResponseType<ActivityInstanceFieldsType & T>>;
61
+
62
+ /** Get activity metrics (POST .../metric) */
63
+ metric(options: Omit<MetricOptionsType, "Type">): Promise<MetricResponseType>;
64
+
65
+ // ── Instance-level ──────────────────────────────────────────
66
+
67
+ /** Read the activity instance data (GET .../read) */
68
+ read(instanceId: string): Promise<ActivityInstanceFieldsType & T>;
69
+
70
+ /** Update the activity instance (POST .../update) */
71
+ update(instanceId: string, data: Partial<T>): Promise<CreateUpdateResponseType>;
72
+
73
+ /** Start a draft edit session (PATCH .../draft) */
74
+ draftStart(instanceId: string, data: Partial<T>): Promise<DraftResponseType>;
75
+
76
+ /** End a draft edit session and commit (POST .../draft) */
77
+ draftEnd(instanceId: string, data: Partial<T>): Promise<CreateUpdateResponseType>;
78
+
79
+ /** Complete the activity (POST .../done) */
80
+ complete(instanceId: string): Promise<CreateUpdateResponseType>;
81
+
82
+ /** Get activity progress (GET .../progress) */
83
+ progress(instanceId: string): Promise<ActivityProgressType>;
84
+ }
@@ -0,0 +1,25 @@
1
+ // ============================================================
2
+ // WORKFLOW MODULE - Main Entry Point
3
+ // @ram_28/kf-ai-sdk/workflow
4
+ // ============================================================
5
+
6
+ export { Workflow } from './workflow/client';
7
+ export { Activity } from './workflow/Activity';
8
+ export { ActivityInstance } from './workflow/ActivityInstance';
9
+ export type {
10
+ ActivityInstanceType,
11
+ EditableFieldAccessor,
12
+ ReadonlyFieldAccessor,
13
+ } from './workflow/ActivityInstance';
14
+ export type {
15
+ ActivityInstanceFieldsType,
16
+ ActivityOperations,
17
+ ActivityProgressType,
18
+ WorkflowStartResponseType,
19
+ } from './workflow/types';
20
+
21
+ export { useActivityForm } from './workflow/components/useActivityForm';
22
+ export type {
23
+ UseActivityFormOptions,
24
+ UseActivityFormReturn,
25
+ } from './workflow/components/useActivityForm';
@@ -0,0 +1,11 @@
1
+ // ============================================================
2
+ // WORKFLOW MODULE - Type Exports
3
+ // @ram_28/kf-ai-sdk/workflow/types
4
+ // ============================================================
5
+
6
+ export type {
7
+ ActivityInstanceFieldsType,
8
+ ActivityOperations,
9
+ ActivityProgressType,
10
+ WorkflowStartResponseType,
11
+ } from './workflow/types';
@@ -1 +0,0 @@
1
- "use strict";let n={baseUrl:"",headers:{"Content-Type":"application/json"}};function f(r){n.baseUrl=r}function $(r){n.headers={...n.headers,...r}}function d(){return{...n.headers}}function h(){return n.baseUrl||""}function u(r){const s=n.baseUrl,o=n.headers;return{async get(t){const e=await fetch(`${s}/api/app/${r}/${t}/read`,{method:"GET",headers:o});if(!e.ok)throw new Error(`Failed to get ${r} ${t}: ${e.statusText}`);return(await e.json()).Data},async create(t){const e=await fetch(`${s}/api/app/${r}/create`,{method:"POST",headers:o,body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to create ${r}: ${e.statusText}`);return e.json()},async update(t,e){const a=await fetch(`${s}/api/app/${r}/${t}/update`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to update ${r} ${t}: ${a.statusText}`);return a.json()},async delete(t){const e=await fetch(`${s}/api/app/${r}/${t}/delete`,{method:"DELETE",headers:o});if(!e.ok)throw new Error(`Failed to delete ${r} ${t}: ${e.statusText}`);return e.json()},async list(t){const e={Type:"List",...t},a=await fetch(`${s}/api/app/${r}/list`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to list ${r}: ${a.statusText}`);return await a.json()},async count(t){var c,p;const e={Type:"Metric",GroupBy:[],Metric:[{Field:"_id",Type:"Count"}],...(t==null?void 0:t.Filter)&&{Filter:t.Filter}},a=await fetch(`${s}/api/app/${r}/metric`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to count ${r}: ${a.statusText}`);return{Count:((p=(c=(await a.json()).Data)==null?void 0:c[0])==null?void 0:p.count__id)??0}},async draft(t){const e=await fetch(`${s}/api/app/${r}/draft`,{method:"POST",headers:o,body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to create draft for ${r}: ${e.statusText}`);return e.json()},async draftUpdate(t,e){const a=await fetch(`${s}/api/app/${r}/${t}/draft`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to update draft for ${r} ${t}: ${a.statusText}`);return a.json()},async draftPatch(t,e){const a=await fetch(`${s}/api/app/${r}/${t}/draft`,{method:"PATCH",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to patch draft for ${r} ${t}: ${a.statusText}`);return a.json()},async draftInteraction(t){const e=await fetch(`${s}/api/app/${r}/draft`,{method:"PATCH",headers:o,body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to create interactive draft for ${r}: ${e.statusText}`);const a=await e.json();return{...a.Data,_id:a.Data._id}},async metric(t){const e={Type:"Metric",...t},a=await fetch(`${s}/api/app/${r}/metric`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to get metrics for ${r}: ${a.statusText}`);return a.json()},async pivot(t){const e={Type:"Pivot",...t},a=await fetch(`${s}/api/app/${r}/pivot`,{method:"POST",headers:o,body:JSON.stringify(e)});if(!a.ok)throw new Error(`Failed to get pivot data for ${r}: ${a.statusText}`);return a.json()},async fields(){const t=await fetch(`${s}/api/app/${r}/fields`,{method:"GET",headers:o});if(!t.ok)throw new Error(`Failed to get fields for ${r}: ${t.statusText}`);return t.json()},async fetchField(t,e){const a=await fetch(`${s}/api/app/${r}/${t}/field/${e}/fetch`,{method:"GET",headers:o});if(!a.ok)throw new Error(`Failed to fetch field ${e} for ${r}: ${a.statusText}`);return(await a.json()).Data}}}exports.api=u;exports.getApiBaseUrl=h;exports.getDefaultHeaders=d;exports.setApiBaseUrl=f;exports.setDefaultHeaders=$;
@@ -1 +0,0 @@
1
- "use strict";const t={EQ:"EQ",NE:"NE",GT:"GT",GTE:"GTE",LT:"LT",LTE:"LTE",Between:"Between",NotBetween:"NotBetween",IN:"IN",NIN:"NIN",Empty:"Empty",NotEmpty:"NotEmpty",Contains:"Contains",NotContains:"NotContains",MinLength:"MinLength",MaxLength:"MaxLength"},e={And:"And",Or:"Or",Not:"Not"},o={Constant:"Constant",BOField:"BOField",AppVariable:"AppVariable"},n={ASC:"ASC",DESC:"DESC"},i={Sum:"Sum",Avg:"Avg",Count:"Count",Max:"Max",Min:"Min",DistinctCount:"DistinctCount",BlankCount:"BlankCount",NotBlankCount:"NotBlankCount",Concat:"Concat",DistinctConcat:"DistinctConcat"},a={List:"List",Metric:"Metric",Pivot:"Pivot"},s={Loading:"loading",Authenticated:"authenticated",Unauthenticated:"unauthenticated"},c={Google:"google",Microsoft:"microsoft",GitHub:"github",Custom:"custom"},r={Id:"_id",CreatedAt:"_created_at",ModifiedAt:"_modified_at",CreatedBy:"_created_by",ModifiedBy:"_modified_by",Version:"_version",MergeVersion:"_m_version"},d={GET:"GET",POST:"POST",PATCH:"PATCH",DELETE:"DELETE"},u={SEARCH_DEBOUNCE_MS:300,PAGE_SIZE:10,PAGE:1,SEARCH_MAX_LENGTH:255},C={Date:"$__d__",DateTime:"$__dt__"},E={Success:"success"};exports.AuthProviderName=c;exports.AuthStatus=s;exports.ConditionOperator=t;exports.DateEncodingKey=C;exports.Defaults=u;exports.DeleteStatus=E;exports.GroupOperator=e;exports.HttpMethod=d;exports.MetricType=i;exports.QueryType=a;exports.RHSType=o;exports.SortDirection=n;exports.SystemField=r;
@@ -1 +0,0 @@
1
- "use strict";const u=require("react"),d=t=>"Condition"in t,y=t=>"LHSField"in t;let A=0;const l=()=>{const t=Math.random().toString(36).substring(2,9);return`filter_${Date.now()}_${t}_${++A}`},M=t=>t.id?t:{...t,id:l()},k=t=>t.map(o=>{const n=M(o);return d(n)?{...n,Condition:k(n.Condition)}:n}),g=t=>t.map(o=>{if(d(o)){const{id:b,...C}=o;return{...C,Condition:g(o.Condition)}}const{id:n,...r}=o;return r}),h=(t,o)=>{for(const n of t){if(n.id===o)return n;if(d(n)){const r=h(n.Condition,o);if(r)return r}}},f=(t,o,n)=>t.map(r=>r.id===o?n(r):d(r)?{...r,Condition:f(r.Condition,o,n)}:r),O=(t,o)=>t.filter(n=>n.id!==o).map(n=>d(n)?{...n,Condition:O(n.Condition,o)}:n),p=(t,o,n)=>t.map(r=>r.id===o&&d(r)?{...r,Condition:[...r.Condition,n]}:d(r)?{...r,Condition:p(r.Condition,o,n)}:r);function R(t={}){const[o,n]=u.useState(()=>k(t.conditions||[])),[r,b]=u.useState(t.operator||"And"),C=u.useMemo(()=>{if(o.length!==0)return{Operator:r,Condition:g(o)}},[o,r]),G=o.length>0,S=u.useCallback((i,s)=>{const c=l(),e={...i,id:c};return n(s?a=>p(a,s,e):a=>[...a,e]),c},[]),v=u.useCallback((i,s)=>{const c=l(),e={id:c,Operator:i,Condition:[]};return n(s?a=>p(a,s,e):a=>[...a,e]),c},[]),F=u.useCallback((i,s)=>{n(c=>f(c,i,e=>d(e)?e:{...e,...s}))},[]),I=u.useCallback((i,s)=>{n(c=>f(c,i,e=>d(e)?{...e,Operator:s}:e))},[]),w=u.useCallback(i=>{n(s=>O(s,i))},[]),T=u.useCallback(i=>h(o,i),[o]),_=u.useCallback(()=>{n([])},[]),$=u.useCallback(i=>{b(i)},[]);return{operator:r,items:o,payload:C,hasConditions:G,addCondition:S,addConditionGroup:v,updateCondition:F,updateGroupOperator:I,removeCondition:w,getCondition:T,clearAllConditions:_,setRootOperator:$}}exports.isCondition=y;exports.isConditionGroup=d;exports.useFilter=R;
@@ -1,120 +0,0 @@
1
- import { useState as h, useMemo as M, useCallback as c } from "react";
2
- const u = (r) => "Condition" in r, D = (r) => "LHSField" in r;
3
- let k = 0;
4
- const f = () => {
5
- const r = Math.random().toString(36).substring(2, 9);
6
- return `filter_${Date.now()}_${r}_${++k}`;
7
- }, x = (r) => r.id ? r : { ...r, id: f() }, O = (r) => r.map((o) => {
8
- const n = x(o);
9
- return u(n) ? {
10
- ...n,
11
- Condition: O(n.Condition)
12
- } : n;
13
- }), v = (r) => r.map((o) => {
14
- if (u(o)) {
15
- const { id: g, ...C } = o;
16
- return {
17
- ...C,
18
- Condition: v(o.Condition)
19
- };
20
- }
21
- const { id: n, ...t } = o;
22
- return t;
23
- }), G = (r, o) => {
24
- for (const n of r) {
25
- if (n.id === o)
26
- return n;
27
- if (u(n)) {
28
- const t = G(n.Condition, o);
29
- if (t) return t;
30
- }
31
- }
32
- }, p = (r, o, n) => r.map((t) => t.id === o ? n(t) : u(t) ? {
33
- ...t,
34
- Condition: p(t.Condition, o, n)
35
- } : t), I = (r, o) => r.filter((n) => n.id !== o).map((n) => u(n) ? {
36
- ...n,
37
- Condition: I(n.Condition, o)
38
- } : n), l = (r, o, n) => r.map((t) => t.id === o && u(t) ? {
39
- ...t,
40
- Condition: [...t.Condition, n]
41
- } : u(t) ? {
42
- ...t,
43
- Condition: l(t.Condition, o, n)
44
- } : t);
45
- function H(r = {}) {
46
- const [o, n] = h(
47
- () => O(r.conditions || [])
48
- ), [t, g] = h(
49
- r.operator || "And"
50
- ), C = M(() => {
51
- if (o.length !== 0)
52
- return {
53
- Operator: t,
54
- Condition: v(o)
55
- };
56
- }, [o, t]), S = o.length > 0, w = c(
57
- (i, s) => {
58
- const d = f(), e = { ...i, id: d };
59
- return n(s ? (a) => l(a, s, e) : (a) => [...a, e]), d;
60
- },
61
- []
62
- ), F = c(
63
- (i, s) => {
64
- const d = f(), e = {
65
- id: d,
66
- Operator: i,
67
- Condition: []
68
- };
69
- return n(s ? (a) => l(a, s, e) : (a) => [...a, e]), d;
70
- },
71
- []
72
- ), T = c(
73
- (i, s) => {
74
- n(
75
- (d) => p(d, i, (e) => u(e) ? e : { ...e, ...s })
76
- );
77
- },
78
- []
79
- ), _ = c(
80
- (i, s) => {
81
- n(
82
- (d) => p(d, i, (e) => u(e) ? { ...e, Operator: s } : e)
83
- );
84
- },
85
- []
86
- ), $ = c((i) => {
87
- n((s) => I(s, i));
88
- }, []), b = c(
89
- (i) => G(o, i),
90
- [o]
91
- ), y = c(() => {
92
- n([]);
93
- }, []), A = c((i) => {
94
- g(i);
95
- }, []);
96
- return {
97
- // State
98
- operator: t,
99
- items: o,
100
- payload: C,
101
- hasConditions: S,
102
- // Add operations
103
- addCondition: w,
104
- addConditionGroup: F,
105
- // Update operations
106
- updateCondition: T,
107
- updateGroupOperator: _,
108
- // Remove & access
109
- removeCondition: $,
110
- getCondition: b,
111
- // Utility
112
- clearAllConditions: y,
113
- setRootOperator: A
114
- };
115
- }
116
- export {
117
- u as a,
118
- D as i,
119
- H as u
120
- };