@amaster.ai/bpm-client 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Amaster Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,303 @@
1
+ # @amaster.ai/bpm-client
2
+
3
+ Camunda 7 BPM process engine client with full TypeScript support.
4
+
5
+ ## Features
6
+
7
+ - 🔄 Process instance management (start, query, delete)
8
+ - ✅ Task management (query, complete, forms)
9
+ - 📊 History queries for processes and tasks
10
+ - 📅 Automatic date format conversion for Camunda
11
+ - 🔐 Type-safe variable handling
12
+ - 🌳 Tree-shakeable ESM/CJS builds
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ pnpm add @amaster.ai/bpm-client @amaster.ai/http-client axios
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ```typescript
23
+ import { createBpmClient } from "@amaster.ai/bpm-client";
24
+
25
+ const bpm = createBpmClient();
26
+
27
+ // Start a process
28
+ const result = await bpm.startProcess("order-process", {
29
+ orderId: "12345",
30
+ amount: 99.99,
31
+ dueDate: new Date(),
32
+ });
33
+
34
+ if (result.data) {
35
+ console.log("Process started:", result.data.id);
36
+ }
37
+ ```
38
+
39
+ ## API Reference
40
+
41
+ ### Process Instance Management
42
+
43
+ #### `startProcess(processKey, inputs?)`
44
+
45
+ Start a new process instance.
46
+
47
+ ```typescript
48
+ // Simple variables (auto-typed)
49
+ await bpm.startProcess("order-process", {
50
+ orderId: "12345",
51
+ amount: 99.99,
52
+ approved: false,
53
+ });
54
+
55
+ // Explicit variable types
56
+ await bpm.startProcess("order-process", {
57
+ variables: {
58
+ orderId: { value: "12345", type: "String" },
59
+ amount: { value: 99.99, type: "Double" },
60
+ dueDate: { value: new Date(), type: "Date" },
61
+ },
62
+ });
63
+ ```
64
+
65
+ #### `getProcessInstances(params?)`
66
+
67
+ Query process instances.
68
+
69
+ ```typescript
70
+ const result = await bpm.getProcessInstances({
71
+ processDefinitionKey: "order-process",
72
+ active: true,
73
+ firstResult: 0,
74
+ maxResults: 20,
75
+ });
76
+ ```
77
+
78
+ #### `getProcessInstance(processInstanceId)`
79
+
80
+ Get a single process instance.
81
+
82
+ ```typescript
83
+ const result = await bpm.getProcessInstance("process-123");
84
+ ```
85
+
86
+ #### `deleteProcessInstance(processInstanceId, params?)`
87
+
88
+ Delete a process instance.
89
+
90
+ ```typescript
91
+ await bpm.deleteProcessInstance("process-123", {
92
+ skipCustomListeners: true,
93
+ });
94
+ ```
95
+
96
+ #### `getActiveActivities(processInstanceId)`
97
+
98
+ Get active activities in a process.
99
+
100
+ ```typescript
101
+ const result = await bpm.getActiveActivities("process-123");
102
+ ```
103
+
104
+ ### Task Management
105
+
106
+ #### `getTasks(params?)`
107
+
108
+ Query tasks.
109
+
110
+ ```typescript
111
+ const result = await bpm.getTasks({
112
+ processInstanceId: "process-123",
113
+ assignee: "john",
114
+ sortBy: "created",
115
+ sortOrder: "desc",
116
+ });
117
+ ```
118
+
119
+ #### `getTaskCount(params?)`
120
+
121
+ Get task count.
122
+
123
+ ```typescript
124
+ const result = await bpm.getTaskCount({
125
+ assignee: "john",
126
+ });
127
+ ```
128
+
129
+ #### `getTask(taskId)`
130
+
131
+ Get a single task.
132
+
133
+ ```typescript
134
+ const result = await bpm.getTask("task-123");
135
+ ```
136
+
137
+ #### `getTaskFormSchema(taskId, opts?)`
138
+
139
+ Get task form schema.
140
+
141
+ ```typescript
142
+ const result = await bpm.getTaskFormSchema("task-123");
143
+ ```
144
+
145
+ #### `getTaskFormVariables(taskId)`
146
+
147
+ Get task form variables.
148
+
149
+ ```typescript
150
+ const result = await bpm.getTaskFormVariables("task-123");
151
+ ```
152
+
153
+ #### `completeTask(taskId, inputs)`
154
+
155
+ Complete a task.
156
+
157
+ ```typescript
158
+ await bpm.completeTask("task-123", {
159
+ approved: true,
160
+ comment: "Looks good",
161
+ });
162
+ ```
163
+
164
+ ### History Queries
165
+
166
+ #### `getHistoryTasks(params?)`
167
+
168
+ Query history tasks.
169
+
170
+ ```typescript
171
+ const result = await bpm.getHistoryTasks({
172
+ taskAssignee: "john",
173
+ finished: true,
174
+ processInstanceId: "process-123",
175
+ });
176
+ ```
177
+
178
+ #### `getHistoryProcessInstances(params?)`
179
+
180
+ Query history process instances.
181
+
182
+ ```typescript
183
+ const result = await bpm.getHistoryProcessInstances({
184
+ processDefinitionKey: "order-process",
185
+ finished: true,
186
+ startedBy: "john",
187
+ sortBy: "startTime",
188
+ sortOrder: "desc",
189
+ });
190
+ ```
191
+
192
+ #### `getHistoryProcessInstance(processInstanceId)`
193
+
194
+ Get a single history process instance.
195
+
196
+ ```typescript
197
+ const result = await bpm.getHistoryProcessInstance("process-123");
198
+ ```
199
+
200
+ #### `getProcessVariables(params)`
201
+
202
+ Get process variables.
203
+
204
+ ```typescript
205
+ const result = await bpm.getProcessVariables({
206
+ processInstanceId: "process-123",
207
+ variableName: "orderId", // optional
208
+ });
209
+ ```
210
+
211
+ ## Variable Types
212
+
213
+ Camunda supports the following variable types:
214
+
215
+ - `String` - Text values
216
+ - `Boolean` - true/false
217
+ - `Integer` - 32-bit integers
218
+ - `Long` - 64-bit integers (default for JS numbers)
219
+ - `Double` - Floating point numbers
220
+ - `Date` - Date/time values
221
+ - `Json` - Complex objects
222
+
223
+ ### Auto Type Inference
224
+
225
+ Variables are automatically typed based on their JavaScript type:
226
+
227
+ ```typescript
228
+ {
229
+ name: "John", // → String
230
+ age: 30, // → Long
231
+ price: 99.99, // → Double
232
+ active: true, // → Boolean
233
+ created: new Date(), // → Date
234
+ meta: { foo: 1 } // → Json
235
+ }
236
+ ```
237
+
238
+ ### Explicit Types
239
+
240
+ You can also specify types explicitly:
241
+
242
+ ```typescript
243
+ {
244
+ variables: {
245
+ orderId: { value: "12345", type: "String" },
246
+ amount: { value: 100, type: "Integer" }, // Force Integer instead of Long
247
+ }
248
+ }
249
+ ```
250
+
251
+ ## Date Handling
252
+
253
+ Dates are automatically converted to Camunda format:
254
+
255
+ ```typescript
256
+ // Input
257
+ { dueDate: new Date("2026-01-05T10:30:45.000Z") }
258
+
259
+ // Sent to Camunda as
260
+ { dueDate: { value: "2026-01-05T10:30:45.000+0000", type: "Date" } }
261
+ ```
262
+
263
+ ## TypeScript Support
264
+
265
+ Full type definitions for all operations:
266
+
267
+ ```typescript
268
+ import type { Task, ProcessInstance } from "@amaster.ai/bpm-client";
269
+
270
+ const tasks: Task[] = result.data || [];
271
+ const process: ProcessInstance | null = result.data;
272
+ ```
273
+
274
+ ## Error Handling
275
+
276
+ ```typescript
277
+ const result = await bpm.startProcess("order-process", { orderId: "123" });
278
+
279
+ if (result.error) {
280
+ console.error("Error:", result.error.message);
281
+ console.error("Status:", result.error.status);
282
+ }
283
+ ```
284
+
285
+ ## Custom HTTP Client
286
+
287
+ ```typescript
288
+ import { createHttpClient } from "@amaster.ai/http-client";
289
+ import { createBpmClient } from "@amaster.ai/bpm-client";
290
+ import axios from "axios";
291
+
292
+ const axiosInstance = axios.create({
293
+ baseURL: "https://api.example.com",
294
+ timeout: 5000,
295
+ });
296
+
297
+ const httpClient = createHttpClient(axiosInstance);
298
+ const bpmClient = createBpmClient(httpClient);
299
+ ```
300
+
301
+ ## License
302
+
303
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,298 @@
1
+ 'use strict';
2
+
3
+ var httpClient = require('@amaster.ai/http-client');
4
+
5
+ // src/bpm-client.ts
6
+ function isVariableSubmission(x) {
7
+ return x !== null && x !== void 0 && typeof x === "object" && "variables" in x && typeof x.variables === "object" && x.variables !== null;
8
+ }
9
+ function formatDateForCamunda(date) {
10
+ let isoString;
11
+ if (date instanceof Date) {
12
+ isoString = date.toISOString();
13
+ } else if (typeof date === "number") {
14
+ isoString = new Date(date).toISOString();
15
+ } else if (typeof date === "string") {
16
+ try {
17
+ isoString = new Date(date).toISOString();
18
+ } catch {
19
+ isoString = date;
20
+ }
21
+ } else {
22
+ isoString = new Date(date).toISOString();
23
+ }
24
+ return isoString.replace(/z$/i, "+0000");
25
+ }
26
+ function inferType(value) {
27
+ if (value === null || value === void 0) {
28
+ return void 0;
29
+ }
30
+ if (typeof value === "string") {
31
+ return "String";
32
+ }
33
+ if (typeof value === "boolean") {
34
+ return "Boolean";
35
+ }
36
+ if (typeof value === "number") {
37
+ return Number.isInteger(value) ? "Long" : "Double";
38
+ }
39
+ if (value instanceof Date) {
40
+ return "Date";
41
+ }
42
+ if (typeof value === "object") {
43
+ return "Json";
44
+ }
45
+ return void 0;
46
+ }
47
+ function processVariableValue(v) {
48
+ if (v && typeof v === "object" && "value" in v && ("type" in v || Object.keys(v).length <= 2)) {
49
+ const variable = v;
50
+ if (variable.value instanceof Date) {
51
+ return {
52
+ value: formatDateForCamunda(variable.value),
53
+ type: "Date"
54
+ };
55
+ }
56
+ if (variable.type === "Date" && (typeof variable.value === "string" || typeof variable.value === "number")) {
57
+ return {
58
+ value: formatDateForCamunda(variable.value),
59
+ type: "Date"
60
+ };
61
+ }
62
+ return variable;
63
+ }
64
+ if (v instanceof Date) {
65
+ return {
66
+ value: formatDateForCamunda(v),
67
+ type: "Date"
68
+ };
69
+ }
70
+ const camundaValue = v;
71
+ return { value: camundaValue, type: inferType(camundaValue) };
72
+ }
73
+ function toVariableSubmission(inputs) {
74
+ if (!inputs) {
75
+ return { variables: {} };
76
+ }
77
+ if (isVariableSubmission(inputs)) {
78
+ const variables2 = {};
79
+ for (const [k, v] of Object.entries(inputs.variables)) {
80
+ variables2[k] = processVariableValue(v);
81
+ }
82
+ return { variables: variables2 };
83
+ }
84
+ const variables = {};
85
+ for (const [k, v] of Object.entries(inputs)) {
86
+ variables[k] = processVariableValue(v);
87
+ }
88
+ return { variables };
89
+ }
90
+ function encodeQuery(params) {
91
+ if (!params) {
92
+ return "";
93
+ }
94
+ const sp = new URLSearchParams();
95
+ for (const [k, v] of Object.entries(params)) {
96
+ if (v === void 0 || v === null) {
97
+ continue;
98
+ }
99
+ sp.append(k, String(v));
100
+ }
101
+ const q = sp.toString();
102
+ return q ? `?${q}` : "";
103
+ }
104
+ function noContentToNull(r) {
105
+ if (r.status === 204) {
106
+ return { ...r, data: null };
107
+ }
108
+ return r;
109
+ }
110
+ function createBpmClient(http = httpClient.createHttpClient()) {
111
+ return {
112
+ startProcess(processKey, inputs) {
113
+ if (!processKey) {
114
+ return Promise.resolve({
115
+ data: null,
116
+ error: { message: "Process key is required", status: 400 },
117
+ status: 400
118
+ });
119
+ }
120
+ return http.request({
121
+ url: `/api/bpm/start/${processKey}`,
122
+ method: "post",
123
+ headers: { "Content-Type": "application/json" },
124
+ data: toVariableSubmission(inputs)
125
+ });
126
+ },
127
+ getProcessInstances(params) {
128
+ return http.request({
129
+ url: `/api/bpm/process-instance${encodeQuery(params)}`,
130
+ method: "get"
131
+ });
132
+ },
133
+ getProcessInstance(processInstanceId) {
134
+ if (!processInstanceId) {
135
+ return Promise.resolve({
136
+ data: null,
137
+ error: { message: "Process instance ID is required", status: 400 },
138
+ status: 400
139
+ });
140
+ }
141
+ return http.request({
142
+ url: `/api/bpm/process-instance/${processInstanceId}`,
143
+ method: "get"
144
+ });
145
+ },
146
+ async deleteProcessInstance(processInstanceId, params) {
147
+ if (!processInstanceId) {
148
+ return {
149
+ data: null,
150
+ error: { message: "Process instance ID is required", status: 400 },
151
+ status: 400
152
+ };
153
+ }
154
+ const q = params?.skipCustomListeners ? "?skipCustomListeners=true" : "";
155
+ const result = await http.request({
156
+ url: `/api/bpm/process-instance/${processInstanceId}${q}`,
157
+ method: "delete"
158
+ });
159
+ return noContentToNull(result);
160
+ },
161
+ getActiveActivities(processInstanceId) {
162
+ if (!processInstanceId) {
163
+ return Promise.resolve({
164
+ data: null,
165
+ error: { message: "Process instance ID is required", status: 400 },
166
+ status: 400
167
+ });
168
+ }
169
+ return http.request({
170
+ url: `/api/bpm/process-instance/${processInstanceId}/activity-instances`,
171
+ method: "get"
172
+ });
173
+ },
174
+ getTasks(params) {
175
+ return http.request({
176
+ url: `/api/bpm/task${encodeQuery(params)}`,
177
+ method: "get"
178
+ });
179
+ },
180
+ getTaskCount(params) {
181
+ return http.request({
182
+ url: `/api/bpm/task/count${encodeQuery(params)}`,
183
+ method: "get"
184
+ });
185
+ },
186
+ getTask(taskId) {
187
+ if (!taskId) {
188
+ return Promise.resolve({
189
+ data: null,
190
+ error: { message: "Task ID is required", status: 400 },
191
+ status: 400
192
+ });
193
+ }
194
+ return http.request({
195
+ url: `/api/bpm/task/${taskId}`,
196
+ method: "get"
197
+ });
198
+ },
199
+ getTaskFormSchema(taskId, opts) {
200
+ if (!taskId) {
201
+ return Promise.resolve({
202
+ data: null,
203
+ error: { message: "Task ID is required", status: 400 },
204
+ status: 400
205
+ });
206
+ }
207
+ const q = encodeQuery(opts?.redirect ? { redirect: opts.redirect } : void 0);
208
+ return http.request({
209
+ url: `/api/bpm/task/${taskId}/form-schema${q}`,
210
+ method: "get"
211
+ });
212
+ },
213
+ getTaskFormVariables(taskId) {
214
+ if (!taskId) {
215
+ return Promise.resolve({
216
+ data: null,
217
+ error: { message: "Task ID is required", status: 400 },
218
+ status: 400
219
+ });
220
+ }
221
+ return http.request({
222
+ url: `/api/bpm/task/${taskId}/form-variables`,
223
+ method: "get"
224
+ });
225
+ },
226
+ async completeTask(taskId, inputs) {
227
+ if (!taskId) {
228
+ return {
229
+ data: null,
230
+ error: { message: "Task ID is required", status: 400 },
231
+ status: 400
232
+ };
233
+ }
234
+ const r = await http.request({
235
+ url: `/api/bpm/task/${taskId}/complete`,
236
+ method: "post",
237
+ headers: { "Content-Type": "application/json" },
238
+ data: toVariableSubmission(inputs)
239
+ });
240
+ return noContentToNull(r);
241
+ },
242
+ getHistoryTasks(params) {
243
+ return http.request({
244
+ url: `/api/bpm/history/task${encodeQuery(params)}`,
245
+ method: "get"
246
+ });
247
+ },
248
+ getHistoryTaskCount(params) {
249
+ return http.request({
250
+ url: `/api/bpm/history/task/count${encodeQuery(params)}`,
251
+ method: "get"
252
+ });
253
+ },
254
+ getHistoryProcessInstances(params) {
255
+ return http.request({
256
+ url: `/api/bpm/history/process-instance${encodeQuery(params)}`,
257
+ method: "get"
258
+ });
259
+ },
260
+ getHistoryProcessInstanceCount(params) {
261
+ return http.request({
262
+ url: `/api/bpm/history/process-instance/count${encodeQuery(params)}`,
263
+ method: "get"
264
+ });
265
+ },
266
+ getHistoryProcessInstance(processInstanceId) {
267
+ if (!processInstanceId) {
268
+ return Promise.resolve({
269
+ data: null,
270
+ error: { message: "Process instance ID is required", status: 400 },
271
+ status: 400
272
+ });
273
+ }
274
+ return http.request({
275
+ url: `/api/bpm/history/process-instance/${processInstanceId}`,
276
+ method: "get"
277
+ });
278
+ },
279
+ getProcessVariables(params) {
280
+ if (!params.processInstanceId) {
281
+ return Promise.resolve({
282
+ data: null,
283
+ error: { message: "Process instance ID is required", status: 400 },
284
+ status: 400
285
+ });
286
+ }
287
+ const q = encodeQuery(params);
288
+ return http.request({
289
+ url: `/api/bpm/history/variable-instance${q}`,
290
+ method: "get"
291
+ });
292
+ }
293
+ };
294
+ }
295
+
296
+ exports.createBpmClient = createBpmClient;
297
+ //# sourceMappingURL=index.cjs.map
298
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bpm-client.ts"],"names":["variables","createHttpClient"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\n\nexport type CamundaVariableType =\n | \"String\"\n | \"Boolean\"\n | \"Integer\"\n | \"Long\"\n | \"Double\"\n | \"Date\"\n | \"Json\";\n\nexport type CamundaVariableValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | Record<string, unknown>\n | unknown[];\n\nexport type CamundaVariable = {\n value: CamundaVariableValue;\n type?: CamundaVariableType;\n};\n\nexport type VariableSubmission = {\n variables: Record<string, CamundaVariable>;\n};\n\nexport type ProcessInstance = {\n id: string;\n definitionId?: string;\n businessKey?: string;\n ended?: boolean;\n suspended?: boolean;\n};\n\nexport type ProcessInstanceQueryParams = {\n processDefinitionKey?: string;\n active?: boolean;\n firstResult?: number;\n maxResults?: number;\n};\n\nexport type HistoryProcessInstance = {\n id: string;\n businessKey: string;\n processDefinitionId: string;\n processDefinitionKey: string;\n processDefinitionName: string;\n processDefinitionVersion: number;\n startTime: string;\n endTime: string | null;\n durationInMillis: number | null;\n startUserId: string;\n startActivityId: string;\n deleteReason: string | null;\n state: string;\n superProcessInstanceId?: string;\n superCaseInstanceId?: string;\n};\n\nexport type HistoryProcessInstanceQueryParams = {\n startedBy?: string;\n finished?: boolean;\n processDefinitionKey?: string;\n sortBy?: string;\n sortOrder?: \"asc\" | \"desc\";\n firstResult?: number;\n maxResults?: number;\n};\n\nexport type ProcessVariable = {\n id: string;\n name: string;\n type: string;\n value: CamundaVariableValue;\n processInstanceId: string;\n createTime?: string;\n activityInstanceId?: string;\n taskId?: string;\n executionId?: string;\n errorMessage?: string;\n};\n\nexport type ActivityInstance = {\n id: string;\n activityId: string;\n activityName: string;\n activityType: string;\n processInstanceId: string;\n executionId: string;\n startTime: string;\n endTime?: string;\n};\n\nexport type Task = {\n id: string;\n name: string;\n description?: string | null;\n assignee?: string | null;\n created?: string | null;\n due?: string | null;\n priority?: number;\n processInstanceId?: string | null;\n processDefinitionId?: string | null;\n taskDefinitionKey?: string | null;\n businessKey?: string | null;\n taskState?: string | null;\n};\n\nexport type TaskCount = { count: number };\n\nexport type TaskFormField = {\n id: string;\n label?: string;\n type?: string;\n defaultValue?: CamundaVariableValue;\n properties?: Record<string, unknown>;\n validationConstraints?: Array<{\n name: string;\n config?: unknown;\n }>;\n [key: string]: unknown;\n};\n\nexport type TaskFormSchema = {\n key?: string;\n contextPath?: string;\n fields?: TaskFormField[];\n [key: string]: unknown;\n};\n\nexport type TaskFormVariable = {\n type: string;\n value: CamundaVariableValue;\n valueInfo?: Record<string, unknown>;\n};\n\nexport type TaskFormVariables = Record<string, TaskFormVariable>;\n\nexport type HistoryTask = {\n id: string;\n name: string;\n assignee: string;\n startTime: string;\n endTime: string;\n duration: number;\n taskState: string;\n processInstanceId: string;\n};\n\nexport type TaskQueryParams = {\n processInstanceId?: string;\n assignee?: string;\n candidateUser?: string;\n candidateGroup?: string;\n name?: string;\n nameLike?: string;\n taskDefinitionKey?: string;\n firstResult?: number;\n maxResults?: number;\n sortBy?: string;\n sortOrder?: \"asc\" | \"desc\";\n [key: string]: string | number | boolean | undefined;\n};\n\nexport type HistoryTaskQueryParams = {\n taskAssignee?: string;\n processInstanceId?: string;\n finished?: boolean;\n unfinished?: boolean;\n firstResult?: number;\n maxResults?: number;\n sortBy?: string;\n sortOrder?: \"asc\" | \"desc\";\n [key: string]: string | number | boolean | undefined;\n};\n\nexport type BpmClient = {\n startProcess(\n processKey: string,\n inputs?: Record<string, CamundaVariableValue> | VariableSubmission\n ): Promise<ClientResult<ProcessInstance>>;\n\n getProcessInstances(\n params?: ProcessInstanceQueryParams\n ): Promise<ClientResult<ProcessInstance[]>>;\n getProcessInstance(processInstanceId: string): Promise<ClientResult<ProcessInstance>>;\n deleteProcessInstance(\n processInstanceId: string,\n params?: { skipCustomListeners?: boolean }\n ): Promise<ClientResult<null>>;\n getActiveActivities(processInstanceId: string): Promise<ClientResult<ActivityInstance[]>>;\n\n getTasks(params?: TaskQueryParams): Promise<ClientResult<Task[]>>;\n getTaskCount(params?: TaskQueryParams): Promise<ClientResult<TaskCount>>;\n getTask(taskId: string): Promise<ClientResult<Task>>;\n getTaskFormSchema(\n taskId: string,\n opts?: { redirect?: string }\n ): Promise<ClientResult<TaskFormSchema>>;\n getTaskFormVariables(taskId: string): Promise<ClientResult<TaskFormVariables>>;\n completeTask(\n taskId: string,\n inputs: Record<string, CamundaVariableValue> | VariableSubmission\n ): Promise<ClientResult<null>>;\n\n getHistoryTasks(params?: HistoryTaskQueryParams): Promise<ClientResult<HistoryTask[]>>;\n getHistoryTaskCount(params?: HistoryTaskQueryParams): Promise<ClientResult<TaskCount>>;\n\n getHistoryProcessInstances(\n params?: HistoryProcessInstanceQueryParams\n ): Promise<ClientResult<HistoryProcessInstance[]>>;\n getHistoryProcessInstanceCount(\n params?: HistoryProcessInstanceQueryParams\n ): Promise<ClientResult<{ count: number }>>;\n getHistoryProcessInstance(\n processInstanceId: string\n ): Promise<ClientResult<HistoryProcessInstance>>;\n getProcessVariables(params: {\n processInstanceId: string;\n variableName?: string;\n }): Promise<ClientResult<ProcessVariable[]>>;\n};\n\nfunction isVariableSubmission(x: unknown): x is VariableSubmission {\n return (\n x !== null &&\n x !== undefined &&\n typeof x === \"object\" &&\n \"variables\" in x &&\n typeof (x as VariableSubmission).variables === \"object\" &&\n (x as VariableSubmission).variables !== null\n );\n}\n\n/**\n * Format Date value to Camunda-compatible ISO 8601 string\n */\nfunction formatDateForCamunda(date: Date | string | number): string {\n let isoString: string;\n\n if (date instanceof Date) {\n isoString = date.toISOString();\n } else if (typeof date === \"number\") {\n isoString = new Date(date).toISOString();\n } else if (typeof date === \"string\") {\n try {\n isoString = new Date(date).toISOString();\n } catch {\n isoString = date;\n }\n } else {\n isoString = new Date(date as number).toISOString();\n }\n\n return isoString.replace(/z$/i, \"+0000\");\n}\n\nfunction inferType(value: CamundaVariableValue): CamundaVariableType | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return \"String\";\n }\n if (typeof value === \"boolean\") {\n return \"Boolean\";\n }\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"Long\" : \"Double\";\n }\n if (value instanceof Date) {\n return \"Date\";\n }\n if (typeof value === \"object\") {\n return \"Json\";\n }\n return undefined;\n}\n\nfunction processVariableValue(v: unknown): CamundaVariable {\n if (v && typeof v === \"object\" && \"value\" in v && (\"type\" in v || Object.keys(v).length <= 2)) {\n const variable = v as CamundaVariable;\n\n if (variable.value instanceof Date) {\n return {\n value: formatDateForCamunda(variable.value),\n type: \"Date\",\n };\n }\n\n if (\n variable.type === \"Date\" &&\n (typeof variable.value === \"string\" || typeof variable.value === \"number\")\n ) {\n return {\n value: formatDateForCamunda(variable.value),\n type: \"Date\",\n };\n }\n\n return variable;\n }\n\n if (v instanceof Date) {\n return {\n value: formatDateForCamunda(v),\n type: \"Date\",\n };\n }\n\n const camundaValue = v as CamundaVariableValue;\n return { value: camundaValue, type: inferType(camundaValue) };\n}\n\nfunction toVariableSubmission(\n inputs?: Record<string, CamundaVariableValue> | VariableSubmission\n): VariableSubmission {\n if (!inputs) {\n return { variables: {} };\n }\n\n if (isVariableSubmission(inputs)) {\n const variables: Record<string, CamundaVariable> = {};\n for (const [k, v] of Object.entries(inputs.variables)) {\n variables[k] = processVariableValue(v);\n }\n return { variables };\n }\n\n const variables: Record<string, CamundaVariable> = {};\n for (const [k, v] of Object.entries(inputs)) {\n variables[k] = processVariableValue(v);\n }\n\n return { variables };\n}\n\nfunction encodeQuery(params?: Record<string, string | number | boolean | undefined>): string {\n if (!params) {\n return \"\";\n }\n const sp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) {\n continue;\n }\n sp.append(k, String(v));\n }\n const q = sp.toString();\n return q ? `?${q}` : \"\";\n}\n\nfunction noContentToNull<T>(r: ClientResult<T>): ClientResult<T | null> {\n if (r.status === 204) {\n return { ...r, data: null };\n }\n return r;\n}\n\nexport function createBpmClient(http: HttpClient = createHttpClient()): BpmClient {\n return {\n startProcess(\n processKey: string,\n inputs?: Record<string, CamundaVariableValue> | VariableSubmission\n ): Promise<ClientResult<ProcessInstance>> {\n if (!processKey) {\n return Promise.resolve({\n data: null,\n error: { message: \"Process key is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<ProcessInstance>({\n url: `/api/bpm/start/${processKey}`,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: toVariableSubmission(inputs),\n });\n },\n\n getProcessInstances(\n params?: ProcessInstanceQueryParams\n ): Promise<ClientResult<ProcessInstance[]>> {\n return http.request<ProcessInstance[]>({\n url: `/api/bpm/process-instance${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getProcessInstance(processInstanceId: string): Promise<ClientResult<ProcessInstance>> {\n if (!processInstanceId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Process instance ID is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<ProcessInstance>({\n url: `/api/bpm/process-instance/${processInstanceId}`,\n method: \"get\",\n });\n },\n\n async deleteProcessInstance(\n processInstanceId: string,\n params?: { skipCustomListeners?: boolean }\n ): Promise<ClientResult<null>> {\n if (!processInstanceId) {\n return {\n data: null,\n error: { message: \"Process instance ID is required\", status: 400 },\n status: 400,\n };\n }\n const q = params?.skipCustomListeners ? \"?skipCustomListeners=true\" : \"\";\n const result = await http.request<null>({\n url: `/api/bpm/process-instance/${processInstanceId}${q}`,\n method: \"delete\",\n });\n return noContentToNull(result) as ClientResult<null>;\n },\n\n getActiveActivities(processInstanceId: string): Promise<ClientResult<ActivityInstance[]>> {\n if (!processInstanceId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Process instance ID is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<ActivityInstance[]>({\n url: `/api/bpm/process-instance/${processInstanceId}/activity-instances`,\n method: \"get\",\n });\n },\n\n getTasks(params?: TaskQueryParams): Promise<ClientResult<Task[]>> {\n return http.request<Task[]>({\n url: `/api/bpm/task${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getTaskCount(params?: TaskQueryParams): Promise<ClientResult<TaskCount>> {\n return http.request<TaskCount>({\n url: `/api/bpm/task/count${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getTask(taskId: string): Promise<ClientResult<Task>> {\n if (!taskId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Task ID is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<Task>({\n url: `/api/bpm/task/${taskId}`,\n method: \"get\",\n });\n },\n\n getTaskFormSchema(\n taskId: string,\n opts?: { redirect?: string }\n ): Promise<ClientResult<TaskFormSchema>> {\n if (!taskId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Task ID is required\", status: 400 },\n status: 400,\n });\n }\n const q = encodeQuery(opts?.redirect ? { redirect: opts.redirect } : undefined);\n return http.request<TaskFormSchema>({\n url: `/api/bpm/task/${taskId}/form-schema${q}`,\n method: \"get\",\n });\n },\n\n getTaskFormVariables(taskId: string): Promise<ClientResult<TaskFormVariables>> {\n if (!taskId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Task ID is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<TaskFormVariables>({\n url: `/api/bpm/task/${taskId}/form-variables`,\n method: \"get\",\n });\n },\n\n async completeTask(\n taskId: string,\n inputs: Record<string, CamundaVariableValue> | VariableSubmission\n ): Promise<ClientResult<null>> {\n if (!taskId) {\n return {\n data: null,\n error: { message: \"Task ID is required\", status: 400 },\n status: 400,\n };\n }\n const r = await http.request<null>({\n url: `/api/bpm/task/${taskId}/complete`,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: toVariableSubmission(inputs),\n });\n return noContentToNull(r) as ClientResult<null>;\n },\n\n getHistoryTasks(params?: HistoryTaskQueryParams): Promise<ClientResult<HistoryTask[]>> {\n return http.request<HistoryTask[]>({\n url: `/api/bpm/history/task${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getHistoryTaskCount(params?: HistoryTaskQueryParams): Promise<ClientResult<TaskCount>> {\n return http.request<TaskCount>({\n url: `/api/bpm/history/task/count${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getHistoryProcessInstances(\n params?: HistoryProcessInstanceQueryParams\n ): Promise<ClientResult<HistoryProcessInstance[]>> {\n return http.request<HistoryProcessInstance[]>({\n url: `/api/bpm/history/process-instance${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getHistoryProcessInstanceCount(\n params?: HistoryProcessInstanceQueryParams\n ): Promise<ClientResult<{ count: number }>> {\n return http.request<{ count: number }>({\n url: `/api/bpm/history/process-instance/count${encodeQuery(params)}`,\n method: \"get\",\n });\n },\n\n getHistoryProcessInstance(\n processInstanceId: string\n ): Promise<ClientResult<HistoryProcessInstance>> {\n if (!processInstanceId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Process instance ID is required\", status: 400 },\n status: 400,\n });\n }\n return http.request<HistoryProcessInstance>({\n url: `/api/bpm/history/process-instance/${processInstanceId}`,\n method: \"get\",\n });\n },\n\n getProcessVariables(params: {\n processInstanceId: string;\n variableName?: string;\n }): Promise<ClientResult<ProcessVariable[]>> {\n if (!params.processInstanceId) {\n return Promise.resolve({\n data: null,\n error: { message: \"Process instance ID is required\", status: 400 },\n status: 400,\n });\n }\n const q = encodeQuery(params);\n return http.request<ProcessVariable[]>({\n url: `/api/bpm/history/variable-instance${q}`,\n method: \"get\",\n });\n },\n };\n}\n"]}