cxtms 1.9.13
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/README.md +384 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4784 -0
- package/dist/cli.js.map +1 -0
- package/dist/extractUtils.d.ts +11 -0
- package/dist/extractUtils.d.ts.map +1 -0
- package/dist/extractUtils.js +19 -0
- package/dist/extractUtils.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +129 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/schemaLoader.d.ts +17 -0
- package/dist/utils/schemaLoader.d.ts.map +1 -0
- package/dist/utils/schemaLoader.js +134 -0
- package/dist/utils/schemaLoader.js.map +1 -0
- package/dist/validator.d.ts +72 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +432 -0
- package/dist/validator.js.map +1 -0
- package/dist/workflowValidator.d.ts +103 -0
- package/dist/workflowValidator.d.ts.map +1 -0
- package/dist/workflowValidator.js +753 -0
- package/dist/workflowValidator.js.map +1 -0
- package/package.json +51 -0
- package/schemas/actions/all.json +27 -0
- package/schemas/actions/clipboard.json +46 -0
- package/schemas/actions/confirm.json +21 -0
- package/schemas/actions/consoleLog.json +16 -0
- package/schemas/actions/dialog.json +25 -0
- package/schemas/actions/fileDownload.json +16 -0
- package/schemas/actions/forEach.json +31 -0
- package/schemas/actions/if.json +12 -0
- package/schemas/actions/mutation.json +25 -0
- package/schemas/actions/navigate.json +18 -0
- package/schemas/actions/navigateBack.json +22 -0
- package/schemas/actions/navigateBackOrClose.json +21 -0
- package/schemas/actions/notification.json +19 -0
- package/schemas/actions/openBarcodeScanner.json +104 -0
- package/schemas/actions/query.json +32 -0
- package/schemas/actions/refresh.json +13 -0
- package/schemas/actions/resetDirtyState.json +22 -0
- package/schemas/actions/setFields.json +21 -0
- package/schemas/actions/setStore.json +13 -0
- package/schemas/actions/validateForm.json +15 -0
- package/schemas/actions/workflow.json +24 -0
- package/schemas/components/README.md +147 -0
- package/schemas/components/appComponent.json +58 -0
- package/schemas/components/barcodeScanner.json +69 -0
- package/schemas/components/button.json +123 -0
- package/schemas/components/calendar.json +489 -0
- package/schemas/components/card.json +176 -0
- package/schemas/components/collection.json +54 -0
- package/schemas/components/dataGrid.json +119 -0
- package/schemas/components/datasource.json +151 -0
- package/schemas/components/dropdown.json +57 -0
- package/schemas/components/field-collection.json +618 -0
- package/schemas/components/field.json +265 -0
- package/schemas/components/form.json +234 -0
- package/schemas/components/index.json +71 -0
- package/schemas/components/layout.json +69 -0
- package/schemas/components/module.json +167 -0
- package/schemas/components/navDropdown.json +36 -0
- package/schemas/components/navbar.json +78 -0
- package/schemas/components/navbarItem.json +28 -0
- package/schemas/components/navbarLink.json +36 -0
- package/schemas/components/row.json +31 -0
- package/schemas/components/slot.json +30 -0
- package/schemas/components/tab.json +34 -0
- package/schemas/components/tabs.json +35 -0
- package/schemas/components/timeline.json +172 -0
- package/schemas/components/timelineGrid.json +328 -0
- package/schemas/fields/README.md +66 -0
- package/schemas/fields/attachment.json +156 -0
- package/schemas/fields/autocomplete-googleplaces.json +130 -0
- package/schemas/fields/checkbox.json +82 -0
- package/schemas/fields/date.json +88 -0
- package/schemas/fields/datetime.json +75 -0
- package/schemas/fields/email.json +75 -0
- package/schemas/fields/index.json +53 -0
- package/schemas/fields/number.json +91 -0
- package/schemas/fields/password.json +70 -0
- package/schemas/fields/radio.json +94 -0
- package/schemas/fields/rangedatetime.json +56 -0
- package/schemas/fields/select-async.json +334 -0
- package/schemas/fields/select.json +115 -0
- package/schemas/fields/tel.json +79 -0
- package/schemas/fields/text.json +86 -0
- package/schemas/fields/textarea.json +95 -0
- package/schemas/fields/time.json +91 -0
- package/schemas/fields/url.json +74 -0
- package/schemas/schema.graphql +12248 -0
- package/schemas/schemas.json +610 -0
- package/schemas/workflows/activity.json +96 -0
- package/schemas/workflows/common/condition.json +48 -0
- package/schemas/workflows/common/expression.json +76 -0
- package/schemas/workflows/common/mapping.json +173 -0
- package/schemas/workflows/common/step.json +38 -0
- package/schemas/workflows/flow/aggregation.json +44 -0
- package/schemas/workflows/flow/entity.json +129 -0
- package/schemas/workflows/flow/state.json +105 -0
- package/schemas/workflows/flow/transition.json +143 -0
- package/schemas/workflows/input.json +122 -0
- package/schemas/workflows/output.json +61 -0
- package/schemas/workflows/schedule.json +26 -0
- package/schemas/workflows/tasks/accounting-transaction.json +95 -0
- package/schemas/workflows/tasks/action-event.json +65 -0
- package/schemas/workflows/tasks/all.json +152 -0
- package/schemas/workflows/tasks/appmodule.json +56 -0
- package/schemas/workflows/tasks/attachment.json +97 -0
- package/schemas/workflows/tasks/authentication.json +86 -0
- package/schemas/workflows/tasks/caching.json +68 -0
- package/schemas/workflows/tasks/charge.json +92 -0
- package/schemas/workflows/tasks/commodity.json +92 -0
- package/schemas/workflows/tasks/contact-address.json +72 -0
- package/schemas/workflows/tasks/contact-payment-method.json +72 -0
- package/schemas/workflows/tasks/contact.json +82 -0
- package/schemas/workflows/tasks/csv.json +81 -0
- package/schemas/workflows/tasks/document-render.json +105 -0
- package/schemas/workflows/tasks/document-send.json +84 -0
- package/schemas/workflows/tasks/edi.json +157 -0
- package/schemas/workflows/tasks/email-send.json +110 -0
- package/schemas/workflows/tasks/error.json +72 -0
- package/schemas/workflows/tasks/export.json +90 -0
- package/schemas/workflows/tasks/filetransfer.json +102 -0
- package/schemas/workflows/tasks/flow-transition.json +68 -0
- package/schemas/workflows/tasks/foreach.json +69 -0
- package/schemas/workflows/tasks/generic.json +47 -0
- package/schemas/workflows/tasks/graphql.json +78 -0
- package/schemas/workflows/tasks/httpRequest.json +161 -0
- package/schemas/workflows/tasks/import.json +64 -0
- package/schemas/workflows/tasks/inventory.json +67 -0
- package/schemas/workflows/tasks/job.json +88 -0
- package/schemas/workflows/tasks/log.json +73 -0
- package/schemas/workflows/tasks/map.json +58 -0
- package/schemas/workflows/tasks/movement.json +54 -0
- package/schemas/workflows/tasks/note.json +59 -0
- package/schemas/workflows/tasks/number.json +65 -0
- package/schemas/workflows/tasks/order-tracking-event.json +109 -0
- package/schemas/workflows/tasks/order.json +139 -0
- package/schemas/workflows/tasks/payment.json +85 -0
- package/schemas/workflows/tasks/pdf-document.json +60 -0
- package/schemas/workflows/tasks/postal-codes.json +92 -0
- package/schemas/workflows/tasks/resolve-timezone.json +65 -0
- package/schemas/workflows/tasks/setVariable.json +76 -0
- package/schemas/workflows/tasks/switch.json +75 -0
- package/schemas/workflows/tasks/template.json +73 -0
- package/schemas/workflows/tasks/tracking-event.json +137 -0
- package/schemas/workflows/tasks/transmission.json +185 -0
- package/schemas/workflows/tasks/unzip-file.json +68 -0
- package/schemas/workflows/tasks/user.json +70 -0
- package/schemas/workflows/tasks/validation.json +99 -0
- package/schemas/workflows/tasks/while.json +53 -0
- package/schemas/workflows/tasks/workflow-execute.json +82 -0
- package/schemas/workflows/trigger.json +90 -0
- package/schemas/workflows/variable.json +46 -0
- package/schemas/workflows/workflow.json +335 -0
- package/scripts/postinstall.js +291 -0
- package/scripts/setup-vscode.js +80 -0
- package/skills/cxtms-developer/SKILL.md +118 -0
- package/skills/cxtms-developer/ref-cli-auth.md +120 -0
- package/skills/cxtms-developer/ref-entity-accounting.md +180 -0
- package/skills/cxtms-developer/ref-entity-commodity.md +239 -0
- package/skills/cxtms-developer/ref-entity-contact.md +163 -0
- package/skills/cxtms-developer/ref-entity-geography.md +154 -0
- package/skills/cxtms-developer/ref-entity-job.md +77 -0
- package/skills/cxtms-developer/ref-entity-notification.md +85 -0
- package/skills/cxtms-developer/ref-entity-order-sub.md +160 -0
- package/skills/cxtms-developer/ref-entity-order.md +183 -0
- package/skills/cxtms-developer/ref-entity-organization.md +41 -0
- package/skills/cxtms-developer/ref-entity-rate.md +182 -0
- package/skills/cxtms-developer/ref-entity-shared.md +176 -0
- package/skills/cxtms-developer/ref-entity-warehouse.md +115 -0
- package/skills/cxtms-developer/ref-graphql-query.md +309 -0
- package/skills/cxtms-module-builder/SKILL.md +477 -0
- package/skills/cxtms-module-builder/ref-components-data.md +293 -0
- package/skills/cxtms-module-builder/ref-components-display.md +411 -0
- package/skills/cxtms-module-builder/ref-components-forms.md +369 -0
- package/skills/cxtms-module-builder/ref-components-interactive.md +317 -0
- package/skills/cxtms-module-builder/ref-components-layout.md +390 -0
- package/skills/cxtms-module-builder/ref-components-specialized.md +477 -0
- package/skills/cxtms-workflow-builder/SKILL.md +438 -0
- package/skills/cxtms-workflow-builder/ref-accounting.md +66 -0
- package/skills/cxtms-workflow-builder/ref-communication.md +169 -0
- package/skills/cxtms-workflow-builder/ref-entity.md +342 -0
- package/skills/cxtms-workflow-builder/ref-expressions-ncalc.md +128 -0
- package/skills/cxtms-workflow-builder/ref-expressions-template.md +161 -0
- package/skills/cxtms-workflow-builder/ref-filetransfer.md +80 -0
- package/skills/cxtms-workflow-builder/ref-flow.md +210 -0
- package/skills/cxtms-workflow-builder/ref-other.md +157 -0
- package/skills/cxtms-workflow-builder/ref-query.md +105 -0
- package/skills/cxtms-workflow-builder/ref-utilities.md +417 -0
- package/templates/module-configuration.yaml +44 -0
- package/templates/module-form.yaml +152 -0
- package/templates/module-grid.yaml +229 -0
- package/templates/module-select.yaml +139 -0
- package/templates/module.yaml +84 -0
- package/templates/workflow-api-tracking.yaml +189 -0
- package/templates/workflow-basic.yaml +76 -0
- package/templates/workflow-document.yaml +155 -0
- package/templates/workflow-entity-trigger.yaml +90 -0
- package/templates/workflow-ftp-edi.yaml +158 -0
- package/templates/workflow-ftp-tracking.yaml +161 -0
- package/templates/workflow-mcp-tool.yaml +112 -0
- package/templates/workflow-public-api.yaml +135 -0
- package/templates/workflow-scheduled-execute.yaml +75 -0
- package/templates/workflow-scheduled.yaml +125 -0
- package/templates/workflow-utility.yaml +96 -0
- package/templates/workflow-webhook.yaml +128 -0
- package/templates/workflow.yaml +140 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template mcp-tool
|
|
3
|
+
|
|
4
|
+
workflow:
|
|
5
|
+
workflowId: "{{uuid}}"
|
|
6
|
+
name: "{{displayName}}"
|
|
7
|
+
description: "{{displayName}} - MCP tool workflow"
|
|
8
|
+
version: "1.0"
|
|
9
|
+
executionMode: Sync
|
|
10
|
+
logLevel: Information
|
|
11
|
+
isActive: true
|
|
12
|
+
enableAudit: true
|
|
13
|
+
filePath: "{{fileName}}"
|
|
14
|
+
agentInstruction: |
|
|
15
|
+
Use this tool to {{displayName}}.
|
|
16
|
+
Inputs:
|
|
17
|
+
- orderId (required): The order ID to process
|
|
18
|
+
Returns:
|
|
19
|
+
- result: Processing outcome with success status
|
|
20
|
+
tags:
|
|
21
|
+
- "mcp-tool"
|
|
22
|
+
|
|
23
|
+
inputs:
|
|
24
|
+
- name: orderId
|
|
25
|
+
type: number
|
|
26
|
+
props:
|
|
27
|
+
displayName: "Order ID"
|
|
28
|
+
description: "The ID of the order to process"
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
outputs:
|
|
32
|
+
- name: result
|
|
33
|
+
mapping: "Main.SetResult.result"
|
|
34
|
+
|
|
35
|
+
activities:
|
|
36
|
+
- name: Main
|
|
37
|
+
events:
|
|
38
|
+
onActivityStarted:
|
|
39
|
+
- task: "Utilities/Log@1"
|
|
40
|
+
name: LogActivityStarted
|
|
41
|
+
inputs:
|
|
42
|
+
message: "Activity Main started"
|
|
43
|
+
level: Information
|
|
44
|
+
onActivityCompleted:
|
|
45
|
+
- task: "Utilities/Log@1"
|
|
46
|
+
name: LogActivityCompleted
|
|
47
|
+
inputs:
|
|
48
|
+
message: "Activity Main completed"
|
|
49
|
+
level: Information
|
|
50
|
+
onActivityFailed:
|
|
51
|
+
- task: "Utilities/Log@1"
|
|
52
|
+
name: LogActivityFailed
|
|
53
|
+
inputs:
|
|
54
|
+
message: "Activity Main failed: {{exception.message}}"
|
|
55
|
+
level: Error
|
|
56
|
+
steps:
|
|
57
|
+
- task: "Query/GraphQL"
|
|
58
|
+
name: GetOrder
|
|
59
|
+
inputs:
|
|
60
|
+
query: |
|
|
61
|
+
query($organizationId: Int!, $orderId: Int!) {
|
|
62
|
+
order(organizationId: $organizationId, orderId: $orderId) {
|
|
63
|
+
orderId
|
|
64
|
+
orderNumber
|
|
65
|
+
status
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
variables:
|
|
69
|
+
organizationId: "\{{int organizationId}}"
|
|
70
|
+
orderId: "\{{inputs.orderId}}"
|
|
71
|
+
outputs:
|
|
72
|
+
- name: order
|
|
73
|
+
mapping: "order?"
|
|
74
|
+
|
|
75
|
+
- task: "Utilities/Error@1"
|
|
76
|
+
name: ValidateOrder
|
|
77
|
+
conditions:
|
|
78
|
+
- expression: "isNullOrEmpty([Main?.GetOrder?.order?]) = true"
|
|
79
|
+
inputs:
|
|
80
|
+
message: "Order not found: \{{inputs.orderId}}"
|
|
81
|
+
|
|
82
|
+
# TODO: Add processing logic here
|
|
83
|
+
|
|
84
|
+
- task: "Utilities/SetVariable@1"
|
|
85
|
+
name: SetResult
|
|
86
|
+
inputs:
|
|
87
|
+
variables:
|
|
88
|
+
- name: result
|
|
89
|
+
value:
|
|
90
|
+
success: true
|
|
91
|
+
orderId: "\{{inputs.orderId}}"
|
|
92
|
+
orderNumber: "\{{Main?.GetOrder?.order?.orderNumber?}}"
|
|
93
|
+
|
|
94
|
+
events:
|
|
95
|
+
onWorkflowStarted:
|
|
96
|
+
- task: "Utilities/Log@1"
|
|
97
|
+
name: LogWorkflowStarted
|
|
98
|
+
inputs:
|
|
99
|
+
message: "{{displayName}} workflow started"
|
|
100
|
+
level: Information
|
|
101
|
+
onWorkflowCompleted:
|
|
102
|
+
- task: "Utilities/Log@1"
|
|
103
|
+
name: LogWorkflowCompleted
|
|
104
|
+
inputs:
|
|
105
|
+
message: "{{displayName}} workflow completed successfully"
|
|
106
|
+
level: Information
|
|
107
|
+
onWorkflowFailed:
|
|
108
|
+
- task: "Utilities/Log@1"
|
|
109
|
+
name: LogWorkflowFailed
|
|
110
|
+
inputs:
|
|
111
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
112
|
+
level: Error
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template public-api
|
|
3
|
+
#
|
|
4
|
+
# This workflow exposes a public REST API endpoint.
|
|
5
|
+
# The api section defines the route, method, authentication, and OpenAPI metadata.
|
|
6
|
+
# Inputs use props.in to specify parameter location (path, query, header, body).
|
|
7
|
+
# Outputs use props to describe the response schema for OpenAPI documentation.
|
|
8
|
+
|
|
9
|
+
api:
|
|
10
|
+
path: "/orders/{orderId}"
|
|
11
|
+
method: "GET"
|
|
12
|
+
summary: "{{displayName}}"
|
|
13
|
+
description: "{{displayName}} public API endpoint"
|
|
14
|
+
document: "public"
|
|
15
|
+
category: "Orders"
|
|
16
|
+
authentication: "bearer"
|
|
17
|
+
rateLimit:
|
|
18
|
+
perSecond: 10
|
|
19
|
+
perMinute: 100
|
|
20
|
+
|
|
21
|
+
workflow:
|
|
22
|
+
workflowId: "{{uuid}}"
|
|
23
|
+
name: "{{displayName}}"
|
|
24
|
+
description: "{{displayName}} - Public API endpoint"
|
|
25
|
+
version: "1.0"
|
|
26
|
+
workflowType: "PublicApi"
|
|
27
|
+
executionMode: Sync
|
|
28
|
+
logLevel: Information
|
|
29
|
+
isActive: true
|
|
30
|
+
enableAudit: true
|
|
31
|
+
filePath: "{{fileName}}"
|
|
32
|
+
tags:
|
|
33
|
+
- "public-api"
|
|
34
|
+
|
|
35
|
+
inputs:
|
|
36
|
+
- name: orderId
|
|
37
|
+
type: text
|
|
38
|
+
props:
|
|
39
|
+
in: path
|
|
40
|
+
required: true
|
|
41
|
+
description: "Order ID"
|
|
42
|
+
format: "uuid"
|
|
43
|
+
|
|
44
|
+
outputs:
|
|
45
|
+
- name: response
|
|
46
|
+
mapping: "Main.SetResponse.response"
|
|
47
|
+
props:
|
|
48
|
+
type: object
|
|
49
|
+
description: "Order details"
|
|
50
|
+
schema:
|
|
51
|
+
properties:
|
|
52
|
+
orderId:
|
|
53
|
+
type: integer
|
|
54
|
+
orderNumber:
|
|
55
|
+
type: string
|
|
56
|
+
status:
|
|
57
|
+
type: string
|
|
58
|
+
- name: statusCode
|
|
59
|
+
mapping: "Main.SetResponse.statusCode"
|
|
60
|
+
|
|
61
|
+
activities:
|
|
62
|
+
- name: Main
|
|
63
|
+
events:
|
|
64
|
+
onActivityStarted:
|
|
65
|
+
- task: "Utilities/Log@1"
|
|
66
|
+
name: LogActivityStarted
|
|
67
|
+
inputs:
|
|
68
|
+
message: "Activity Main started"
|
|
69
|
+
level: Information
|
|
70
|
+
onActivityCompleted:
|
|
71
|
+
- task: "Utilities/Log@1"
|
|
72
|
+
name: LogActivityCompleted
|
|
73
|
+
inputs:
|
|
74
|
+
message: "Activity Main completed"
|
|
75
|
+
level: Information
|
|
76
|
+
onActivityFailed:
|
|
77
|
+
- task: "Utilities/Log@1"
|
|
78
|
+
name: LogActivityFailed
|
|
79
|
+
inputs:
|
|
80
|
+
message: "Activity Main failed: {{exception.message}}"
|
|
81
|
+
level: Error
|
|
82
|
+
steps:
|
|
83
|
+
- task: "Query/GraphQL"
|
|
84
|
+
name: GetOrder
|
|
85
|
+
inputs:
|
|
86
|
+
query: |
|
|
87
|
+
query($organizationId: Int!, $orderId: String!) {
|
|
88
|
+
order(organizationId: $organizationId, orderId: $orderId) {
|
|
89
|
+
orderId
|
|
90
|
+
orderNumber
|
|
91
|
+
status
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
variables:
|
|
95
|
+
organizationId: "\{{int organizationId}}"
|
|
96
|
+
orderId: "\{{inputs.orderId}}"
|
|
97
|
+
outputs:
|
|
98
|
+
- name: order
|
|
99
|
+
mapping: "order?"
|
|
100
|
+
|
|
101
|
+
- task: "Utilities/Error@1"
|
|
102
|
+
name: ValidateOrder
|
|
103
|
+
conditions:
|
|
104
|
+
- expression: "isNullOrEmpty([Main?.GetOrder?.order?]) = true"
|
|
105
|
+
inputs:
|
|
106
|
+
message: "Order not found"
|
|
107
|
+
|
|
108
|
+
- task: "Utilities/SetVariable@1"
|
|
109
|
+
name: SetResponse
|
|
110
|
+
inputs:
|
|
111
|
+
variables:
|
|
112
|
+
- name: response
|
|
113
|
+
value: "\{{Main?.GetOrder?.order?}}"
|
|
114
|
+
- name: statusCode
|
|
115
|
+
value: 200
|
|
116
|
+
|
|
117
|
+
events:
|
|
118
|
+
onWorkflowStarted:
|
|
119
|
+
- task: "Utilities/Log@1"
|
|
120
|
+
name: LogWorkflowStarted
|
|
121
|
+
inputs:
|
|
122
|
+
message: "{{displayName}} workflow started"
|
|
123
|
+
level: Information
|
|
124
|
+
onWorkflowCompleted:
|
|
125
|
+
- task: "Utilities/Log@1"
|
|
126
|
+
name: LogWorkflowCompleted
|
|
127
|
+
inputs:
|
|
128
|
+
message: "{{displayName}} workflow completed successfully"
|
|
129
|
+
level: Information
|
|
130
|
+
onWorkflowFailed:
|
|
131
|
+
- task: "Utilities/Log@1"
|
|
132
|
+
name: LogWorkflowFailed
|
|
133
|
+
inputs:
|
|
134
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
135
|
+
level: Error
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template scheduled-execute
|
|
3
|
+
|
|
4
|
+
workflow:
|
|
5
|
+
workflowId: "{{uuid}}"
|
|
6
|
+
name: "{{displayName}}"
|
|
7
|
+
description: "{{displayName}} - schedules another workflow on a cron schedule"
|
|
8
|
+
version: "1.0"
|
|
9
|
+
executionMode: Async
|
|
10
|
+
logLevel: Information
|
|
11
|
+
isActive: true
|
|
12
|
+
enableAudit: true
|
|
13
|
+
filePath: "{{fileName}}"
|
|
14
|
+
tags:
|
|
15
|
+
- "generated"
|
|
16
|
+
- "scheduled"
|
|
17
|
+
|
|
18
|
+
schedules:
|
|
19
|
+
- cron: "0 * * * *"
|
|
20
|
+
displayName: "{{displayName}} - Hourly"
|
|
21
|
+
|
|
22
|
+
activities:
|
|
23
|
+
- name: ExecuteWorkflow
|
|
24
|
+
events:
|
|
25
|
+
onActivityStarted:
|
|
26
|
+
- task: "Utilities/Log@1"
|
|
27
|
+
name: LogActivityStarted
|
|
28
|
+
inputs:
|
|
29
|
+
message: "Activity ExecuteWorkflow started"
|
|
30
|
+
level: Information
|
|
31
|
+
onActivityCompleted:
|
|
32
|
+
- task: "Utilities/Log@1"
|
|
33
|
+
name: LogActivityCompleted
|
|
34
|
+
inputs:
|
|
35
|
+
message: "Activity ExecuteWorkflow completed"
|
|
36
|
+
level: Information
|
|
37
|
+
onActivityFailed:
|
|
38
|
+
- task: "Utilities/Log@1"
|
|
39
|
+
name: LogActivityFailed
|
|
40
|
+
inputs:
|
|
41
|
+
message: "Activity ExecuteWorkflow failed: {{exception.message}}"
|
|
42
|
+
level: Error
|
|
43
|
+
steps:
|
|
44
|
+
- task: "Workflow/Execute@1"
|
|
45
|
+
name: RunTargetWorkflow
|
|
46
|
+
inputs:
|
|
47
|
+
workflowName: "Target Workflow Name"
|
|
48
|
+
async: true
|
|
49
|
+
workflowInputs: {}
|
|
50
|
+
|
|
51
|
+
- task: "Utilities/Log@1"
|
|
52
|
+
name: LogComplete
|
|
53
|
+
inputs:
|
|
54
|
+
message: "{{displayName}} completed"
|
|
55
|
+
level: Information
|
|
56
|
+
|
|
57
|
+
events:
|
|
58
|
+
onWorkflowStarted:
|
|
59
|
+
- task: "Utilities/Log@1"
|
|
60
|
+
name: LogWorkflowStarted
|
|
61
|
+
inputs:
|
|
62
|
+
message: "{{displayName}} workflow started"
|
|
63
|
+
level: Information
|
|
64
|
+
onWorkflowCompleted:
|
|
65
|
+
- task: "Utilities/Log@1"
|
|
66
|
+
name: LogWorkflowCompleted
|
|
67
|
+
inputs:
|
|
68
|
+
message: "{{displayName}} workflow completed successfully"
|
|
69
|
+
level: Information
|
|
70
|
+
onWorkflowFailed:
|
|
71
|
+
- task: "Utilities/Log@1"
|
|
72
|
+
name: LogWorkflowFailed
|
|
73
|
+
inputs:
|
|
74
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
75
|
+
level: Error
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template scheduled
|
|
3
|
+
|
|
4
|
+
workflow:
|
|
5
|
+
workflowId: "{{uuid}}"
|
|
6
|
+
name: "{{displayName}}"
|
|
7
|
+
description: "{{displayName}} scheduled workflow"
|
|
8
|
+
version: "1.0"
|
|
9
|
+
executionMode: Async
|
|
10
|
+
logLevel: Information
|
|
11
|
+
isActive: true
|
|
12
|
+
enableAudit: true
|
|
13
|
+
filePath: "{{fileName}}"
|
|
14
|
+
tags:
|
|
15
|
+
- "generated"
|
|
16
|
+
- "scheduled"
|
|
17
|
+
|
|
18
|
+
variables:
|
|
19
|
+
- name: pageSize
|
|
20
|
+
value: 50
|
|
21
|
+
- name: offset
|
|
22
|
+
value: 0
|
|
23
|
+
- name: hasMorePages
|
|
24
|
+
value: true
|
|
25
|
+
|
|
26
|
+
schedules:
|
|
27
|
+
- cron: "0 * * * *"
|
|
28
|
+
displayName: "{{displayName}} - Hourly"
|
|
29
|
+
|
|
30
|
+
activities:
|
|
31
|
+
- name: BatchProcess
|
|
32
|
+
events:
|
|
33
|
+
onActivityStarted:
|
|
34
|
+
- task: "Utilities/Log@1"
|
|
35
|
+
name: LogActivityStarted
|
|
36
|
+
inputs:
|
|
37
|
+
message: "Activity BatchProcess started"
|
|
38
|
+
level: Information
|
|
39
|
+
onActivityCompleted:
|
|
40
|
+
- task: "Utilities/Log@1"
|
|
41
|
+
name: LogActivityCompleted
|
|
42
|
+
inputs:
|
|
43
|
+
message: "Activity BatchProcess completed"
|
|
44
|
+
level: Information
|
|
45
|
+
onActivityFailed:
|
|
46
|
+
- task: "Utilities/Log@1"
|
|
47
|
+
name: LogActivityFailed
|
|
48
|
+
inputs:
|
|
49
|
+
message: "Activity BatchProcess failed: {{exception.message}}"
|
|
50
|
+
level: Error
|
|
51
|
+
steps:
|
|
52
|
+
- task: "while"
|
|
53
|
+
name: PageLoop
|
|
54
|
+
conditions:
|
|
55
|
+
- expression: "[hasMorePages] = true"
|
|
56
|
+
maxIterations: 100
|
|
57
|
+
steps:
|
|
58
|
+
- task: "Query/GraphQL"
|
|
59
|
+
name: GetPage
|
|
60
|
+
inputs:
|
|
61
|
+
query: |
|
|
62
|
+
query($organizationId: Int!, $first: Int!, $offset: Int!) {
|
|
63
|
+
orders(organizationId: $organizationId, first: $first, offset: $offset, filter: "status:Active") {
|
|
64
|
+
totalCount
|
|
65
|
+
items {
|
|
66
|
+
orderId
|
|
67
|
+
orderNumber
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
variables:
|
|
72
|
+
organizationId: "\{{organizationId}}"
|
|
73
|
+
first: "\{{pageSize}}"
|
|
74
|
+
offset: "\{{offset}}"
|
|
75
|
+
outputs:
|
|
76
|
+
- name: result
|
|
77
|
+
mapping: "orders?"
|
|
78
|
+
|
|
79
|
+
- task: "foreach"
|
|
80
|
+
name: ProcessItems
|
|
81
|
+
collection: "BatchProcess?.PageLoop?.GetPage?.result?.items?"
|
|
82
|
+
item: "currentOrder"
|
|
83
|
+
steps:
|
|
84
|
+
- task: "Utilities/Log@1"
|
|
85
|
+
name: LogItem
|
|
86
|
+
inputs:
|
|
87
|
+
message: "Processing order: \{{currentOrder.orderNumber}}"
|
|
88
|
+
level: Information
|
|
89
|
+
|
|
90
|
+
- task: "Utilities/SetVariable@1"
|
|
91
|
+
name: UpdatePagination
|
|
92
|
+
inputs:
|
|
93
|
+
variables:
|
|
94
|
+
- name: offset
|
|
95
|
+
value:
|
|
96
|
+
expression: "[offset] + [pageSize]"
|
|
97
|
+
- name: hasMorePages
|
|
98
|
+
value:
|
|
99
|
+
expression: "[offset] < [BatchProcess?.PageLoop?.GetPage?.result?.totalCount?]"
|
|
100
|
+
|
|
101
|
+
- task: "Utilities/Log@1"
|
|
102
|
+
name: LogComplete
|
|
103
|
+
inputs:
|
|
104
|
+
message: "{{displayName}} completed"
|
|
105
|
+
level: Information
|
|
106
|
+
|
|
107
|
+
events:
|
|
108
|
+
onWorkflowStarted:
|
|
109
|
+
- task: "Utilities/Log@1"
|
|
110
|
+
name: LogWorkflowStarted
|
|
111
|
+
inputs:
|
|
112
|
+
message: "{{displayName}} workflow started"
|
|
113
|
+
level: Information
|
|
114
|
+
onWorkflowCompleted:
|
|
115
|
+
- task: "Utilities/Log@1"
|
|
116
|
+
name: LogWorkflowCompleted
|
|
117
|
+
inputs:
|
|
118
|
+
message: "{{displayName}} workflow completed successfully"
|
|
119
|
+
level: Information
|
|
120
|
+
onWorkflowFailed:
|
|
121
|
+
- task: "Utilities/Log@1"
|
|
122
|
+
name: LogWorkflowFailed
|
|
123
|
+
inputs:
|
|
124
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
125
|
+
level: Error
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template utility
|
|
3
|
+
|
|
4
|
+
workflow:
|
|
5
|
+
workflowId: "{{uuid}}"
|
|
6
|
+
name: "{{displayName}}"
|
|
7
|
+
description: "{{displayName}} reusable utility workflow"
|
|
8
|
+
version: "1.0"
|
|
9
|
+
executionMode: Sync
|
|
10
|
+
logLevel: Information
|
|
11
|
+
isActive: true
|
|
12
|
+
filePath: "{{fileName}}"
|
|
13
|
+
tags:
|
|
14
|
+
- "generated"
|
|
15
|
+
- "utility"
|
|
16
|
+
|
|
17
|
+
inputs:
|
|
18
|
+
- name: orderId
|
|
19
|
+
type: number
|
|
20
|
+
props:
|
|
21
|
+
displayName: "Order ID"
|
|
22
|
+
description: "The ID of the order to process"
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
outputs:
|
|
26
|
+
- name: result
|
|
27
|
+
mapping: "Main.Process.result"
|
|
28
|
+
|
|
29
|
+
activities:
|
|
30
|
+
- name: Main
|
|
31
|
+
events:
|
|
32
|
+
onActivityStarted:
|
|
33
|
+
- task: "Utilities/Log@1"
|
|
34
|
+
name: LogActivityStarted
|
|
35
|
+
inputs:
|
|
36
|
+
message: "Activity Main started"
|
|
37
|
+
level: Information
|
|
38
|
+
onActivityCompleted:
|
|
39
|
+
- task: "Utilities/Log@1"
|
|
40
|
+
name: LogActivityCompleted
|
|
41
|
+
inputs:
|
|
42
|
+
message: "Activity Main completed"
|
|
43
|
+
level: Information
|
|
44
|
+
onActivityFailed:
|
|
45
|
+
- task: "Utilities/Log@1"
|
|
46
|
+
name: LogActivityFailed
|
|
47
|
+
inputs:
|
|
48
|
+
message: "Activity Main failed: {{exception.message}}"
|
|
49
|
+
level: Error
|
|
50
|
+
steps:
|
|
51
|
+
- task: "Query/GraphQL"
|
|
52
|
+
name: GetData
|
|
53
|
+
inputs:
|
|
54
|
+
query: |
|
|
55
|
+
query($organizationId: Int!, $orderId: Int!) {
|
|
56
|
+
order(organizationId: $organizationId, orderId: $orderId) {
|
|
57
|
+
orderId
|
|
58
|
+
orderNumber
|
|
59
|
+
status
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
variables:
|
|
63
|
+
organizationId: "\{{organizationId}}"
|
|
64
|
+
orderId: "\{{inputs.orderId}}"
|
|
65
|
+
outputs:
|
|
66
|
+
- name: order
|
|
67
|
+
mapping: "order?"
|
|
68
|
+
|
|
69
|
+
- task: "Utilities/SetVariable@1"
|
|
70
|
+
name: Process
|
|
71
|
+
inputs:
|
|
72
|
+
variables:
|
|
73
|
+
- name: result
|
|
74
|
+
value:
|
|
75
|
+
success: true
|
|
76
|
+
orderId: "\{{inputs.orderId}}"
|
|
77
|
+
|
|
78
|
+
events:
|
|
79
|
+
onWorkflowStarted:
|
|
80
|
+
- task: "Utilities/Log@1"
|
|
81
|
+
name: LogWorkflowStarted
|
|
82
|
+
inputs:
|
|
83
|
+
message: "{{displayName}} workflow started"
|
|
84
|
+
level: Information
|
|
85
|
+
onWorkflowCompleted:
|
|
86
|
+
- task: "Utilities/Log@1"
|
|
87
|
+
name: LogWorkflowCompleted
|
|
88
|
+
inputs:
|
|
89
|
+
message: "{{displayName}} workflow completed successfully"
|
|
90
|
+
level: Information
|
|
91
|
+
onWorkflowFailed:
|
|
92
|
+
- task: "Utilities/Log@1"
|
|
93
|
+
name: LogWorkflowFailed
|
|
94
|
+
inputs:
|
|
95
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
96
|
+
level: Error
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# {{displayName}} Workflow
|
|
2
|
+
# Generated by cxtms create workflow --template webhook
|
|
3
|
+
#
|
|
4
|
+
# Endpoint: POST /api/v2/orgs/{organizationId}/webhooks/{workflowId}
|
|
5
|
+
# The endpoint is anonymous (no auth token required) and rate-limited (10/sec, 100/min per IP).
|
|
6
|
+
# The workflow receives two auto-injected inputs:
|
|
7
|
+
# - payload: parsed JSON body (or raw string if not JSON)
|
|
8
|
+
# - request: { headers, body, remoteIpAddress }
|
|
9
|
+
# The workflow controls the HTTP response via outputs:
|
|
10
|
+
# - response: the response body returned to the caller
|
|
11
|
+
# - statusCode: the HTTP status code (defaults to 200)
|
|
12
|
+
|
|
13
|
+
workflow:
|
|
14
|
+
workflowId: "{{uuid}}"
|
|
15
|
+
name: "{{displayName}}"
|
|
16
|
+
description: "{{displayName}} - Webhook endpoint"
|
|
17
|
+
version: "1.0"
|
|
18
|
+
workflowType: "Webhook"
|
|
19
|
+
executionMode: Sync
|
|
20
|
+
logLevel: Information
|
|
21
|
+
isActive: true
|
|
22
|
+
enableAudit: true
|
|
23
|
+
filePath: "{{fileName}}"
|
|
24
|
+
runAs: "system"
|
|
25
|
+
tags:
|
|
26
|
+
- "webhook"
|
|
27
|
+
additionalProperties:
|
|
28
|
+
cors:
|
|
29
|
+
allowedOrigins:
|
|
30
|
+
- "*"
|
|
31
|
+
|
|
32
|
+
inputs:
|
|
33
|
+
- name: payload
|
|
34
|
+
type: object
|
|
35
|
+
props:
|
|
36
|
+
displayName: "Payload"
|
|
37
|
+
description: "Parsed webhook request body (JSON object or raw string)"
|
|
38
|
+
- name: request
|
|
39
|
+
type: object
|
|
40
|
+
props:
|
|
41
|
+
displayName: "Request"
|
|
42
|
+
description: "HTTP request metadata: headers, body, remoteIpAddress"
|
|
43
|
+
|
|
44
|
+
outputs:
|
|
45
|
+
- name: response
|
|
46
|
+
mapping: "Main.SetResponse.response"
|
|
47
|
+
- name: statusCode
|
|
48
|
+
mapping: "Main.SetResponse.statusCode"
|
|
49
|
+
|
|
50
|
+
variables:
|
|
51
|
+
- name: webhookSecret
|
|
52
|
+
fromConfig:
|
|
53
|
+
configName: "apps.myApp.webhookSecret"
|
|
54
|
+
|
|
55
|
+
activities:
|
|
56
|
+
- name: Main
|
|
57
|
+
events:
|
|
58
|
+
onActivityStarted:
|
|
59
|
+
- task: "Utilities/Log@1"
|
|
60
|
+
name: LogActivityStarted
|
|
61
|
+
inputs:
|
|
62
|
+
message: "Activity Main started"
|
|
63
|
+
level: Information
|
|
64
|
+
onActivityCompleted:
|
|
65
|
+
- task: "Utilities/Log@1"
|
|
66
|
+
name: LogActivityCompleted
|
|
67
|
+
inputs:
|
|
68
|
+
message: "Activity Main completed"
|
|
69
|
+
level: Information
|
|
70
|
+
onActivityFailed:
|
|
71
|
+
- task: "Utilities/Log@1"
|
|
72
|
+
name: LogActivityFailed
|
|
73
|
+
inputs:
|
|
74
|
+
message: "Activity Main failed: {{exception.message}}"
|
|
75
|
+
level: Error
|
|
76
|
+
steps:
|
|
77
|
+
- task: "Utilities/Log@1"
|
|
78
|
+
name: LogRequest
|
|
79
|
+
inputs:
|
|
80
|
+
message: "{{displayName}} webhook received from \{{request.remoteIpAddress}}"
|
|
81
|
+
level: Information
|
|
82
|
+
|
|
83
|
+
# Validate webhook secret — customize with your verification method
|
|
84
|
+
# Common patterns:
|
|
85
|
+
# - Header secret: request.headers.x-webhook-secret vs config secret
|
|
86
|
+
# - HMAC signature: compute HMAC of request.body, compare to X-Hub-Signature header
|
|
87
|
+
- task: "Utilities/Error@1"
|
|
88
|
+
name: ValidateWebhook
|
|
89
|
+
conditions:
|
|
90
|
+
- expression: "isNullOrEmpty([webhookSecret?]) = false and [request?.headers?.x-webhook-secret?] != [webhookSecret?]"
|
|
91
|
+
inputs:
|
|
92
|
+
message: "Unauthorized webhook request"
|
|
93
|
+
|
|
94
|
+
# TODO: Add processing logic here
|
|
95
|
+
# Access payload fields: \{{payload.fieldName}}
|
|
96
|
+
# Access raw body: \{{request.body}}
|
|
97
|
+
# Access headers: \{{request.headers.headerName}}
|
|
98
|
+
|
|
99
|
+
- task: "Utilities/SetVariable@1"
|
|
100
|
+
name: SetResponse
|
|
101
|
+
inputs:
|
|
102
|
+
variables:
|
|
103
|
+
- name: response
|
|
104
|
+
value:
|
|
105
|
+
success: true
|
|
106
|
+
message: "Webhook processed successfully"
|
|
107
|
+
- name: statusCode
|
|
108
|
+
value: 200
|
|
109
|
+
|
|
110
|
+
events:
|
|
111
|
+
onWorkflowStarted:
|
|
112
|
+
- task: "Utilities/Log@1"
|
|
113
|
+
name: LogWorkflowStarted
|
|
114
|
+
inputs:
|
|
115
|
+
message: "{{displayName}} workflow started"
|
|
116
|
+
level: Information
|
|
117
|
+
onWorkflowCompleted:
|
|
118
|
+
- task: "Utilities/Log@1"
|
|
119
|
+
name: LogWorkflowCompleted
|
|
120
|
+
inputs:
|
|
121
|
+
message: "{{displayName}} workflow completed successfully"
|
|
122
|
+
level: Information
|
|
123
|
+
onWorkflowFailed:
|
|
124
|
+
- task: "Utilities/Log@1"
|
|
125
|
+
name: LogWorkflowFailed
|
|
126
|
+
inputs:
|
|
127
|
+
message: "{{displayName}} workflow failed: {{exception.message}}"
|
|
128
|
+
level: Error
|