openxiangda-contracts 2.77.0 → 2.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/ai.d.ts +31 -0
  2. package/dist/ai.d.ts.map +1 -1
  3. package/dist/ai.js +14 -0
  4. package/dist/ai.js.map +1 -1
  5. package/dist/browser.d.ts +11 -0
  6. package/dist/browser.d.ts.map +1 -1
  7. package/dist/browser.js +10 -0
  8. package/dist/browser.js.map +1 -1
  9. package/dist/cli.d.ts +5 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/data-field-validation.js +26 -23
  12. package/dist/data-field-validation.js.map +1 -1
  13. package/dist/index.d.ts +13 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +13 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/native-compiler/address-value.d.ts +13 -0
  18. package/dist/native-compiler/address-value.d.ts.map +1 -0
  19. package/dist/native-compiler/address-value.js +70 -0
  20. package/dist/native-compiler/address-value.js.map +1 -0
  21. package/dist/native-compiler/cascade-value.d.ts +6 -0
  22. package/dist/native-compiler/cascade-value.d.ts.map +1 -0
  23. package/dist/native-compiler/cascade-value.js +47 -0
  24. package/dist/native-compiler/cascade-value.js.map +1 -0
  25. package/dist/native-compiler/compiler.d.ts +1 -1
  26. package/dist/native-compiler/compiler.d.ts.map +1 -1
  27. package/dist/native-compiler/compiler.js +99 -54
  28. package/dist/native-compiler/compiler.js.map +1 -1
  29. package/dist/native-compiler/data-field.d.ts +3 -0
  30. package/dist/native-compiler/data-field.d.ts.map +1 -1
  31. package/dist/native-compiler/data-field.js +10 -2
  32. package/dist/native-compiler/data-field.js.map +1 -1
  33. package/dist/native-compiler/index.cjs +6 -6
  34. package/dist/native-compiler/index.d.ts +12 -0
  35. package/dist/native-compiler/index.d.ts.map +1 -1
  36. package/dist/native-compiler/index.js +6 -6
  37. package/dist/native-compiler/resource-query.d.ts +21 -0
  38. package/dist/native-compiler/resource-query.d.ts.map +1 -0
  39. package/dist/native-compiler/resource-query.js +154 -0
  40. package/dist/native-compiler/resource-query.js.map +1 -0
  41. package/dist/native-compiler/service-mutations.d.ts +13 -0
  42. package/dist/native-compiler/service-mutations.d.ts.map +1 -0
  43. package/dist/native-compiler/service-mutations.js +25 -0
  44. package/dist/native-compiler/service-mutations.js.map +1 -0
  45. package/dist/native-compiler/workflow-approval-empty.d.ts +1 -1
  46. package/dist/native-compiler/workflow-approval-empty.d.ts.map +1 -1
  47. package/dist/native-compiler/workflow-approval-empty.js +1 -1
  48. package/dist/native-compiler/workflow-approval-empty.js.map +1 -1
  49. package/dist/native-compiler/workflow-business-command.d.ts +10 -0
  50. package/dist/native-compiler/workflow-business-command.d.ts.map +1 -1
  51. package/dist/native-compiler/workflow-business-command.js +6 -0
  52. package/dist/native-compiler/workflow-business-command.js.map +1 -1
  53. package/dist/native-compiler/workflow-business-step.d.ts +8 -2
  54. package/dist/native-compiler/workflow-business-step.d.ts.map +1 -1
  55. package/dist/native-compiler/workflow-business-step.js +10 -5
  56. package/dist/native-compiler/workflow-business-step.js.map +1 -1
  57. package/dist/native-compiler/workflow-completion-deadline.d.ts +1 -0
  58. package/dist/native-compiler/workflow-completion-deadline.d.ts.map +1 -1
  59. package/dist/native-compiler/workflow-completion-deadline.js +1 -1
  60. package/dist/native-compiler/workflow-completion-deadline.js.map +1 -1
  61. package/dist/native-compiler/workflow-correction.d.ts +1 -0
  62. package/dist/native-compiler/workflow-correction.d.ts.map +1 -1
  63. package/dist/native-compiler/workflow-correction.js +5 -4
  64. package/dist/native-compiler/workflow-correction.js.map +1 -1
  65. package/dist/native-compiler/workflow-designer.d.ts +127 -0
  66. package/dist/native-compiler/workflow-designer.d.ts.map +1 -0
  67. package/dist/native-compiler/workflow-designer.js +397 -0
  68. package/dist/native-compiler/workflow-designer.js.map +1 -0
  69. package/dist/native-compiler/workflow-events.d.ts +8 -0
  70. package/dist/native-compiler/workflow-events.d.ts.map +1 -0
  71. package/dist/native-compiler/workflow-events.js +53 -0
  72. package/dist/native-compiler/workflow-events.js.map +1 -0
  73. package/dist/native-compiler/workflow-graph.d.ts +16 -1
  74. package/dist/native-compiler/workflow-graph.d.ts.map +1 -1
  75. package/dist/native-compiler/workflow-graph.js +27 -5
  76. package/dist/native-compiler/workflow-graph.js.map +1 -1
  77. package/dist/native-compiler/workflow-handle.d.ts +4 -0
  78. package/dist/native-compiler/workflow-handle.d.ts.map +1 -0
  79. package/dist/native-compiler/workflow-handle.js +20 -0
  80. package/dist/native-compiler/workflow-handle.js.map +1 -0
  81. package/dist/native-compiler/workflow-initiator-approval.d.ts +1 -0
  82. package/dist/native-compiler/workflow-initiator-approval.d.ts.map +1 -1
  83. package/dist/native-compiler/workflow-initiator-approval.js +1 -1
  84. package/dist/native-compiler/workflow-initiator-approval.js.map +1 -1
  85. package/dist/native-compiler/workflow-node-administration.d.ts +12 -1
  86. package/dist/native-compiler/workflow-node-administration.d.ts.map +1 -1
  87. package/dist/native-compiler/workflow-node-administration.js +66 -14
  88. package/dist/native-compiler/workflow-node-administration.js.map +1 -1
  89. package/dist/native-compiler/workflow-parallel.d.ts +69 -0
  90. package/dist/native-compiler/workflow-parallel.d.ts.map +1 -0
  91. package/dist/native-compiler/workflow-parallel.js +178 -0
  92. package/dist/native-compiler/workflow-parallel.js.map +1 -0
  93. package/dist/native-compiler/workflow-platform-notify.d.ts +41 -0
  94. package/dist/native-compiler/workflow-platform-notify.d.ts.map +1 -0
  95. package/dist/native-compiler/workflow-platform-notify.js +49 -0
  96. package/dist/native-compiler/workflow-platform-notify.js.map +1 -0
  97. package/dist/native-compiler/workflow-reminders.d.ts +11 -0
  98. package/dist/native-compiler/workflow-reminders.d.ts.map +1 -0
  99. package/dist/native-compiler/workflow-reminders.js +12 -0
  100. package/dist/native-compiler/workflow-reminders.js.map +1 -0
  101. package/dist/native-compiler/workflow-return-policy.d.ts +20 -0
  102. package/dist/native-compiler/workflow-return-policy.d.ts.map +1 -0
  103. package/dist/native-compiler/workflow-return-policy.js +37 -0
  104. package/dist/native-compiler/workflow-return-policy.js.map +1 -0
  105. package/dist/native-compiler/workflow-role-union.d.ts +5 -1
  106. package/dist/native-compiler/workflow-role-union.d.ts.map +1 -1
  107. package/dist/native-compiler/workflow-role-union.js +1 -1
  108. package/dist/native-compiler/workflow-role-union.js.map +1 -1
  109. package/dist/native-compiler/workflow-source-sync.d.ts +109 -0
  110. package/dist/native-compiler/workflow-source-sync.d.ts.map +1 -0
  111. package/dist/native-compiler/workflow-source-sync.js +120 -0
  112. package/dist/native-compiler/workflow-source-sync.js.map +1 -0
  113. package/dist/native-compiler/workflow-supervisor-chain.d.ts +16 -0
  114. package/dist/native-compiler/workflow-supervisor-chain.d.ts.map +1 -0
  115. package/dist/native-compiler/workflow-supervisor-chain.js +44 -0
  116. package/dist/native-compiler/workflow-supervisor-chain.js.map +1 -0
  117. package/dist/native-compiler/workflow-task-page.js +1 -1
  118. package/dist/native-compiler/workflow-task-page.js.map +1 -1
  119. package/dist/native-version.d.ts +7 -0
  120. package/dist/native-version.d.ts.map +1 -1
  121. package/dist/native-version.js +7 -0
  122. package/dist/native-version.js.map +1 -1
  123. package/dist/native.d.ts +12 -0
  124. package/dist/native.d.ts.map +1 -1
  125. package/dist/native.js.map +1 -1
  126. package/dist/references.d.ts +4 -0
  127. package/dist/references.d.ts.map +1 -1
  128. package/dist/schemas.d.ts +1266 -10
  129. package/dist/schemas.d.ts.map +1 -1
  130. package/dist/schemas.js +83 -8
  131. package/dist/schemas.js.map +1 -1
  132. package/dist/types.d.ts +54 -12
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js +1 -40
  135. package/dist/types.js.map +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1,47 @@
1
+ function optionSnapshot(option) {
2
+ return {
3
+ value: option.value,
4
+ label: option.label,
5
+ ...(option.description ? { description: option.description } : {}),
6
+ ...(option.color ? { color: option.color } : {}),
7
+ };
8
+ }
9
+ function resolvePath(options, ids, index = 0) {
10
+ const option = options.find(item => item.value === ids[index]);
11
+ if (!option)
12
+ return undefined;
13
+ if (index === ids.length - 1)
14
+ return [optionSnapshot(option)];
15
+ const child = resolvePath(option.children || [], ids, index + 1);
16
+ return child ? [optionSnapshot(option), ...child] : undefined;
17
+ }
18
+ export function cascadeControlValue(value, multiple) {
19
+ if (multiple) {
20
+ return (Array.isArray(value) ? value : [])
21
+ .filter((path) => Array.isArray(path))
22
+ .map(path => path.map(item => item.value));
23
+ }
24
+ return (Array.isArray(value) ? value : [])
25
+ .filter((item) => !Array.isArray(item))
26
+ .map(item => item.value);
27
+ }
28
+ export function cascadeStoredValue(options, value, multiple) {
29
+ const paths = multiple
30
+ ? (Array.isArray(value) ? value : []).filter(Array.isArray)
31
+ : Array.isArray(value) && value.length ? [value.map(String)] : [];
32
+ const snapshots = paths
33
+ .map(path => resolvePath(options, path.map(String)))
34
+ .filter((path) => Boolean(path));
35
+ return multiple ? snapshots : snapshots[0];
36
+ }
37
+ export function cascadeTerminalValues(value, multiple) {
38
+ const paths = multiple
39
+ ? (Array.isArray(value) ? value : []).filter(Array.isArray)
40
+ : [Array.isArray(value)
41
+ ? value.filter(item => !Array.isArray(item))
42
+ : []];
43
+ return paths
44
+ .map(path => path[path.length - 1]?.value)
45
+ .filter((item) => Boolean(item));
46
+ }
47
+ //# sourceMappingURL=cascade-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-value.js","sourceRoot":"","sources":["../../src/native-compiler/cascade-value.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ declare const COMPILER_CONTRACT_VERSION: "native-4";
4
4
  export { NATIVE_CONTRACT_CAPACITY_V2, requiresExtendedDeclarationCapacity, requiresExtendedRoleCapacity, generatedCrudCapabilityOperations } from './declaration-capacity.js';
5
5
  export { NATIVE_ARTIFACT_CAPACITY_V2, NATIVE_HIGH_DENSITY_ARTIFACT_CAPACITY_V2, requiresHighDensityArtifactCapacity, requiresExtendedArtifactCapacity, requiresExtendedConfigurationBytes } from './artifact-capacity.js';
6
6
  export declare const DATA_EVENT_TYPES_V2: readonly ["openxiangda.data.record.created.v2", "openxiangda.data.record.updated.v2", "openxiangda.data.record.deleted.v2"];
7
- export declare const WORKFLOW_EVENT_TYPES_V2: readonly ["openxiangda.workflow.node.skipped.v2", "openxiangda.workflow.step.requested.v2", "openxiangda.workflow.step.result_received.v2", "openxiangda.workflow.step.completed.v2", "openxiangda.workflow.step.continuation_failed.v2", "openxiangda.workflow.instance.started.v2", "openxiangda.workflow.instance.cc_added.v2", "openxiangda.workflow.instance.completed.v2", "openxiangda.workflow.instance.rejected.v2", "openxiangda.workflow.instance.returned.v2", "openxiangda.workflow.instance.resumed.v2", "openxiangda.workflow.instance.withdrawn.v2", "openxiangda.workflow.instance.terminated.v2", "openxiangda.workflow.task.created.v2", "openxiangda.workflow.task.assigned.v2", "openxiangda.workflow.task.assignment_pending.v2", "openxiangda.workflow.task.assignment_resolution_failed.v2", "openxiangda.workflow.task.approved.v2", "openxiangda.workflow.task.completed.v2", "openxiangda.workflow.task.rejected.v2", "openxiangda.workflow.task.returned.v2", "openxiangda.workflow.task.resubmitted.v2", "openxiangda.workflow.task.transferred.v2", "openxiangda.workflow.task.reassigned.v2", "openxiangda.workflow.task.delegated.v2", "openxiangda.workflow.task.assignee_added.v2", "openxiangda.workflow.task.cancelled.v2", "openxiangda.workflow.participant.activated.v2", "openxiangda.workflow.participant.completed.v2", "openxiangda.workflow.participant.rejected.v2", "openxiangda.workflow.participant.returned.v2", "openxiangda.workflow.participant.transferred.v2", "openxiangda.workflow.participant.reassigned.v2", "openxiangda.workflow.participant.delegated.v2", "openxiangda.workflow.participant.added.v2", "openxiangda.workflow.participant.suspended.v2", "openxiangda.workflow.participant.resumed.v2", "openxiangda.workflow.participant.cancelled.v2"];
7
+ export { WORKFLOW_EVENT_TYPES_V2 } from './workflow-events.js';
8
8
  type JsonObject = Record<string, any>;
9
9
  export interface NativeConfigurationCompilerInput {
10
10
  appCode: string;
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/native-compiler/compiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/native-compiler/compiler.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ import { validateWorkflowSupervisorChains, validateWorkflowSupervisorChainBinding } from './workflow-supervisor-chain.js';
2
+ import { validateWorkflowReminders } from './workflow-reminders.js';
3
+ import { isWorkflowPlatformNotify } from './workflow-platform-notify.js';
4
+ import { validateWorkflowParallel } from './workflow-parallel.js';
5
+ import { validateWorkflowReturnPolicies, workflowReturnTargets } from './workflow-return-policy.js';
6
+ import { validateWorkflowHandlingNodes } from './workflow-handle.js';
7
+ import { normalizeDataMutationGrants } from './service-mutations.js';
1
8
  import { hasNativeParentReadPolicy, resolveNativeParentReadBinding, validateNativeParentReadPolicies, NativeParentReadPolicyError } from './parent-read-policy.js';
2
9
  import { requiresExtendedFieldCapacity, WORKFLOW_LAUNCH_MAX_INPUTS } from './data-capacity.js';
3
10
  import { assertWorkflowNativeStagePolicy } from './workflow-native-stage.js';
@@ -25,7 +32,7 @@ import { validateWorkflowCorrections } from './workflow-correction.js';
25
32
  import { dateEventProjectionFieldsV2 } from './date-event-projection.js';
26
33
  import { validateWorkflowTaskPages } from './workflow-task-page.js';
27
34
  import { requiresExtendedOwnedSubtableCapacity, requiresAggregateOwnedSubtableCapacity, dataOwnedRowLimit, isDataOwnedRowLimit } from './data-capacity.js';
28
- import { validateWorkflowBusinessSteps, compileWorkflowBusinessStepHandlers, validateWorkflowBusinessStepSubscriptions, WORKFLOW_BUSINESS_STEP_EVENT, WORKFLOW_BUSINESS_STEP_EVENTS } from './workflow-business-step.js';
35
+ import { validateWorkflowBusinessSteps, compileWorkflowBusinessStepHandlers, validateWorkflowBusinessStepSubscriptions } from './workflow-business-step.js';
29
36
  import { validateWorkflowAssignmentRoutingBindings, validateWorkflowAssignmentRoutingPolicy } from './workflow-assignment-routing.js';
30
37
  import { requiresWorkflowRoleUnion, validateWorkflowRoleUnion, requiresWorkflowRoleInputSelection, validateWorkflowRoleInputSelection } from './workflow-role-union.js';
31
38
  import { assertWorkflowOwnedSubjectCreate, assertWorkflowOwnedSubjectCreateResources } from './workflow-owned-subject.js';
@@ -90,6 +97,8 @@ const ADMIN_NAVIGATION_ICONS = new Set([
90
97
  'settings',
91
98
  ]);
92
99
  const WORKFLOW_OPERATIONS = new Set([
100
+ 'complete',
101
+ 'save_form',
93
102
  'approve',
94
103
  'reject',
95
104
  'return',
@@ -127,46 +136,8 @@ export const DATA_EVENT_TYPES_V2 = [
127
136
  'openxiangda.data.record.updated.v2',
128
137
  'openxiangda.data.record.deleted.v2',
129
138
  ];
130
- export const WORKFLOW_EVENT_TYPES_V2 = [
131
- 'openxiangda.workflow.node.skipped.v2',
132
- WORKFLOW_BUSINESS_STEP_EVENT,
133
- 'openxiangda.workflow.step.result_received.v2',
134
- 'openxiangda.workflow.step.completed.v2',
135
- 'openxiangda.workflow.step.continuation_failed.v2',
136
- 'openxiangda.workflow.instance.started.v2',
137
- 'openxiangda.workflow.instance.cc_added.v2',
138
- 'openxiangda.workflow.instance.completed.v2',
139
- 'openxiangda.workflow.instance.rejected.v2',
140
- 'openxiangda.workflow.instance.returned.v2',
141
- 'openxiangda.workflow.instance.resumed.v2',
142
- 'openxiangda.workflow.instance.withdrawn.v2',
143
- 'openxiangda.workflow.instance.terminated.v2',
144
- 'openxiangda.workflow.task.created.v2',
145
- 'openxiangda.workflow.task.assigned.v2',
146
- 'openxiangda.workflow.task.assignment_pending.v2',
147
- 'openxiangda.workflow.task.assignment_resolution_failed.v2',
148
- 'openxiangda.workflow.task.approved.v2',
149
- 'openxiangda.workflow.task.completed.v2',
150
- 'openxiangda.workflow.task.rejected.v2',
151
- 'openxiangda.workflow.task.returned.v2',
152
- 'openxiangda.workflow.task.resubmitted.v2',
153
- 'openxiangda.workflow.task.transferred.v2',
154
- 'openxiangda.workflow.task.reassigned.v2',
155
- 'openxiangda.workflow.task.delegated.v2',
156
- 'openxiangda.workflow.task.assignee_added.v2',
157
- 'openxiangda.workflow.task.cancelled.v2',
158
- 'openxiangda.workflow.participant.activated.v2',
159
- 'openxiangda.workflow.participant.completed.v2',
160
- 'openxiangda.workflow.participant.rejected.v2',
161
- 'openxiangda.workflow.participant.returned.v2',
162
- 'openxiangda.workflow.participant.transferred.v2',
163
- 'openxiangda.workflow.participant.reassigned.v2',
164
- 'openxiangda.workflow.participant.delegated.v2',
165
- 'openxiangda.workflow.participant.added.v2',
166
- 'openxiangda.workflow.participant.suspended.v2',
167
- 'openxiangda.workflow.participant.resumed.v2',
168
- 'openxiangda.workflow.participant.cancelled.v2',
169
- ];
139
+ export { WORKFLOW_EVENT_TYPES_V2 } from './workflow-events.js';
140
+ import { WORKFLOW_EVENT_TYPES_V2, workflowProducedEventTypes } from './workflow-events.js';
170
141
  const WORKFLOW_EVENT_TYPE_SET_V2 = new Set(WORKFLOW_EVENT_TYPES_V2);
171
142
  export class NativeConfigurationCompilerError extends Error {
172
143
  code;
@@ -492,6 +463,11 @@ export function compileRequiredPlatformCapabilitiesV3(config) {
492
463
  ...(resources.some(hasDataAuditReadPolicy)
493
464
  ? [{ code: 'data.audit-read-access', declaration: dataUsage }]
494
465
  : []),
466
+ ...(resources.some(resource => resource.schema.fields.some((field) => /^(resource-ref|user|department)\.(single|multiple)$/.test(field.type))) || config.authz.scopeDimensions.some((dimension) => dimension.valueSource)
467
+ ? [{ code: 'data.field-source-contexts', declaration: {
468
+ resources: resources.map(resource => ({ code: resource.code, fields: resource.schema.fields.filter((field) => /^(resource-ref|user|department)\.(single|multiple)$/.test(field.type)) })),
469
+ dimensions: config.authz.scopeDimensions.filter((dimension) => dimension.valueSource),
470
+ } }] : []),
495
471
  ...(requiresDirectoryV2
496
472
  ? [
497
473
  {
@@ -663,6 +639,14 @@ export function compileRequiredPlatformCapabilitiesV3(config) {
663
639
  ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'approval' && node.emptyPolicy !== undefined))
664
640
  ? [{ code: 'workflow.approval-empty-policy', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'approval' && node.emptyPolicy !== undefined)) }]
665
641
  : []),
642
+ ...(config.workflows.bindings.some((item) => Object.values(item.binding.bindings).some((entry) => entry.provider === 'supervisor_chain')) ? [{ code: 'workflow.supervisor-chain', declaration: config.workflows.bindings.filter((item) => Object.values(item.binding.bindings).some((entry) => entry.provider === 'supervisor_chain')) }] : []),
643
+ ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.reminders)) ? [{ code: 'workflow.reminders', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.reminders)) }] : []),
644
+ ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => isWorkflowPlatformNotify(node)))
645
+ ? [{ code: 'workflow.platform-notify', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => isWorkflowPlatformNotify(node))) }] : []),
646
+ ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.returnPolicy !== undefined))
647
+ ? [{ code: 'workflow.return-policy', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.returnPolicy !== undefined)) }] : []),
648
+ ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'handle'))
649
+ ? [{ code: 'workflow.handling-nodes', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'handle')) }] : []),
666
650
  ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.completionDeadline !== undefined))
667
651
  ? [{ code: 'workflow.completion-deadline', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.completionDeadline !== undefined)) }]
668
652
  : []),
@@ -683,8 +667,8 @@ export function compileRequiredPlatformCapabilitiesV3(config) {
683
667
  ? [{ code: 'workflow.task-rich-fields', declaration: taskRichFieldDefinitions }] : []),
684
668
  ...(config.workflows.definitions.some((item) => Object.values(item.definition.taskPages || {}).some((page) => page.fields.some((field) => field.subtable)))
685
669
  ? [{ code: 'workflow.task-owned-subtables', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.taskPages || {}).some((page) => page.fields.some((field) => field.subtable))) }] : []),
686
- ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action'))
687
- ? [{ code: 'workflow.durable-business-step', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action')) }]
670
+ ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action' && !isWorkflowPlatformNotify(node)))
671
+ ? [{ code: 'workflow.durable-business-step', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action' && !isWorkflowPlatformNotify(node))) }]
688
672
  : []),
689
673
  ...(config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action' && node.handler.dataTransaction))
690
674
  ? [{ code: 'workflow.step-data-transaction', declaration: config.workflows.definitions.filter((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action' && node.handler.dataTransaction)) }]
@@ -709,6 +693,8 @@ export function compileRequiredPlatformCapabilitiesV3(config) {
709
693
  },
710
694
  ]
711
695
  : []),
696
+ ...(operations.some(op => op.platformAccess?.dataMutations) || config.events.subscriptions.some((sub) => sub.platformAccess?.dataMutations)
697
+ ? [{ code: 'data.service-mutations', declaration: { operations: operations.filter(op => op.platformAccess?.dataMutations).map(op => ({ code: op.code, grants: op.platformAccess.dataMutations })), subscriptions: config.events.subscriptions.filter((sub) => sub.platformAccess?.dataMutations).map((sub) => ({ code: sub.code, grants: sub.platformAccess.dataMutations })) } }] : []),
712
698
  ...(usesNotification
713
699
  ? [
714
700
  {
@@ -1173,7 +1159,7 @@ function compileExpectedContract(config, configDigest, generatorVersion) {
1173
1159
  field: trigger.field,
1174
1160
  })),
1175
1161
  ...(config.workflows.activations.length
1176
- ? WORKFLOW_EVENT_TYPES_V2.filter(eventType => !WORKFLOW_BUSINESS_STEP_EVENTS.includes(eventType) || config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'action'))).filter(eventType => eventType !== 'openxiangda.workflow.node.skipped.v2' || config.workflows.definitions.some((item) => Object.values(item.definition.nodes).some((node) => node.kind === 'approval' && node.emptyPolicy === 'skip'))).map(eventType => ({
1162
+ ? workflowProducedEventTypes(config.workflows.definitions).map(eventType => ({
1177
1163
  code: `workflow:${eventType}`,
1178
1164
  source: 'workflow',
1179
1165
  eventType,
@@ -1264,8 +1250,16 @@ function validateEventSubscriptionPlatformAccess(value, pointer, declaredResourc
1264
1250
  if (value === undefined)
1265
1251
  return undefined;
1266
1252
  const access = object(value, pointer);
1267
- exactKeys(access, ['notification', 'managedFileCopies', 'decimalReservation'], pointer, true);
1253
+ exactKeys(access, ['notification', 'managedFileCopies', 'decimalReservation', 'dataMutations'], pointer, true);
1268
1254
  const result = {};
1255
+ if (access.dataMutations !== undefined) {
1256
+ try {
1257
+ result.dataMutations = normalizeDataMutationGrants(access.dataMutations, declaredResources);
1258
+ }
1259
+ catch {
1260
+ fail('NATIVE_EVENT_DATA_MUTATIONS_INVALID', `${pointer}/dataMutations`);
1261
+ }
1262
+ }
1269
1263
  if (access.decimalReservation !== undefined) {
1270
1264
  try {
1271
1265
  result.decimalReservation = normalizeDecimalReservationEventDeclaration(access.decimalReservation, decimalReservationEventContext(config, subscription));
@@ -1921,11 +1915,19 @@ function validateOperationPlatformAccess(value, pointer, declaredResources, decl
1921
1915
  if (value === undefined)
1922
1916
  return null;
1923
1917
  const access = object(value, pointer);
1924
- exactKeys(access, ['directory', 'selectedDepartments', 'managedFiles', 'managedFileCopies', 'notification', 'workflow', 'roleAssertions', 'decimalReservation', 'dataCommands', 'recordEdit', 'ownedSubject', 'workflowStage'], pointer, true);
1918
+ exactKeys(access, ['directory', 'selectedDepartments', 'managedFiles', 'managedFileCopies', 'notification', 'workflow', 'roleAssertions', 'decimalReservation', 'dataCommands', 'recordEdit', 'ownedSubject', 'workflowStage', 'dataMutations'], pointer, true);
1925
1919
  if (Object.keys(access).length === 0) {
1926
1920
  fail('NATIVE_OPERATION_PLATFORM_ACCESS_EMPTY', pointer);
1927
1921
  }
1928
1922
  const result = {};
1923
+ if (access.dataMutations !== undefined) {
1924
+ try {
1925
+ result.dataMutations = normalizeDataMutationGrants(access.dataMutations, declaredResourceFields);
1926
+ }
1927
+ catch {
1928
+ fail('NATIVE_OPERATION_DATA_MUTATIONS_INVALID', `${pointer}/dataMutations`);
1929
+ }
1930
+ }
1929
1931
  if (access.dataCommands !== undefined) {
1930
1932
  const commands = object(access.dataCommands, `${pointer}/dataCommands`);
1931
1933
  exactKeys(commands, ['mode'], `${pointer}/dataCommands`);
@@ -3627,7 +3629,7 @@ function compileWorkflows(config) {
3627
3629
  const nodes = object(item.definition.nodes, '/config/workflows/definitions/nodes');
3628
3630
  for (const nodeValue of Object.values(nodes)) {
3629
3631
  const node = object(nodeValue, '/config/workflows/definitions/nodes/*');
3630
- if (node.kind !== 'approval')
3632
+ if (node.kind !== 'approval' && node.kind !== 'handle')
3631
3633
  continue;
3632
3634
  for (const operation of uniqueStrings(node.allowedOperations || [], '/config/workflows/definitions/nodes/*/allowedOperations', 20)) {
3633
3635
  operations.add(operation);
@@ -4739,11 +4741,18 @@ function validateWorkflowReferences(config) {
4739
4741
  'definitionVersion',
4740
4742
  'bindingVersion',
4741
4743
  'acceptedCommandDeactivationPolicy',
4742
- ], pointer, ['environmentKey']);
4744
+ ], pointer, ['environmentKey', 'sourceBase']);
4743
4745
  const code = stableCode(activation.workflowCode, `${pointer}/workflowCode`);
4744
4746
  if (activationCodes.has(code))
4745
4747
  fail('NATIVE_WORKFLOW_ACTIVATION_DUPLICATE', pointer);
4746
4748
  activationCodes.add(code);
4749
+ if (activation.sourceBase !== undefined) {
4750
+ const base = object(activation.sourceBase, `${pointer}/sourceBase`);
4751
+ exactKeys(base, ['definitionDigest', 'bindingDigest'], `${pointer}/sourceBase`);
4752
+ for (const key of ['definitionDigest', 'bindingDigest'])
4753
+ if (!/^(sha256:)?[a-f0-9]{64}$/.test(String(base[key] || '')))
4754
+ fail('NATIVE_WORKFLOW_SOURCE_BASE_INVALID', `${pointer}/sourceBase/${key}`);
4755
+ }
4747
4756
  const definitionKey = `${code}:${positiveInteger(activation.definitionVersion, `${pointer}/definitionVersion`)}`;
4748
4757
  const bindingKey = `${code}:${positiveInteger(activation.bindingVersion, `${pointer}/bindingVersion`)}`;
4749
4758
  if (!definitions.has(definitionKey)) {
@@ -4970,6 +4979,18 @@ function validateWorkflowDefinition(definition, pointer) {
4970
4979
  const taskPageErrors = validateWorkflowTaskPages(definition);
4971
4980
  if (taskPageErrors.length)
4972
4981
  fail(taskPageErrors[0], `${pointer}/taskPages`);
4982
+ const returnErrors = validateWorkflowReturnPolicies(definition);
4983
+ if (returnErrors.length)
4984
+ fail(returnErrors[0], `${pointer}/nodes`);
4985
+ const reminderErrors = validateWorkflowReminders(definition);
4986
+ if (reminderErrors.length)
4987
+ fail(reminderErrors[0], `${pointer}/nodes`);
4988
+ const handleErrors = validateWorkflowHandlingNodes(definition);
4989
+ if (handleErrors.length)
4990
+ fail(handleErrors[0], `${pointer}/nodes`);
4991
+ const parallelErrors = validateWorkflowParallel(definition);
4992
+ if (parallelErrors.length)
4993
+ fail(parallelErrors[0], `${pointer}/nodes`);
4973
4994
  const stepErrors = validateWorkflowBusinessSteps(definition);
4974
4995
  if (stepErrors.length)
4975
4996
  fail(stepErrors[0], `${pointer}/nodes`);
@@ -4980,17 +5001,20 @@ function validateWorkflowDefinition(definition, pointer) {
4980
5001
  const nodePointer = `${pointer}/nodes/${nodeId}`;
4981
5002
  const node = object(rawNode, nodePointer);
4982
5003
  equal(node.id, nodeId, `${nodePointer}/id`);
4983
- if (!['approval', 'condition', 'end', 'cc', 'action', 'correction'].includes(node.kind)) {
5004
+ if (!['approval', 'handle', 'condition', 'end', 'cc', 'action', 'correction', 'parallel', 'join'].includes(node.kind)) {
4984
5005
  fail('NATIVE_WORKFLOW_NODE_KIND_INVALID', `${nodePointer}/kind`);
4985
5006
  }
4986
5007
  const targets = [];
4987
- if (node.kind === 'approval') {
5008
+ if (node.kind === 'approval' || node.kind === 'handle') {
4988
5009
  requiredString(node.title, `${nodePointer}/title`, 255);
4989
5010
  workflowBindingCode(node.binding, `${nodePointer}/binding`);
4990
5011
  if (!['single', 'any', 'all', 'sequence'].includes(node.mode)) {
4991
5012
  fail('NATIVE_WORKFLOW_APPROVAL_MODE_INVALID', `${nodePointer}/mode`);
4992
5013
  }
4993
- targets.push(requiredString(node.onApprove, `${nodePointer}/onApprove`, 128), requiredString(node.onReject, `${nodePointer}/onReject`, 128));
5014
+ if (node.kind === 'handle')
5015
+ targets.push(requiredString(node.next, `${nodePointer}/next`, 128));
5016
+ else
5017
+ targets.push(requiredString(node.onApprove, `${nodePointer}/onApprove`, 128), requiredString(node.onReject, `${nodePointer}/onReject`, 128));
4994
5018
  for (const returnTarget of uniqueStrings(node.returnTargets || [], `${nodePointer}/returnTargets`, 200)) {
4995
5019
  if (!nodes[returnTarget]) {
4996
5020
  fail('NATIVE_WORKFLOW_TARGET_MISSING', `${nodePointer}/returnTargets`);
@@ -5015,6 +5039,20 @@ function validateWorkflowDefinition(definition, pointer) {
5015
5039
  workflowBindingCode(node.binding, `${nodePointer}/binding`);
5016
5040
  targets.push(requiredString(node.next, `${nodePointer}/next`, 128));
5017
5041
  }
5042
+ else if (node.kind === 'parallel') {
5043
+ requiredString(node.title, `${nodePointer}/title`, 255);
5044
+ targets.push(requiredString(node.join, `${nodePointer}/join`, 128));
5045
+ for (const [index, raw] of boundedArray(node.branches, `${nodePointer}/branches`, 8).entries()) {
5046
+ const branch = object(raw, `${nodePointer}/branches/${index}`);
5047
+ if (branch.when !== undefined)
5048
+ validateWorkflowExpression(branch.when, `${nodePointer}/branches/${index}/when`, 0);
5049
+ targets.push(requiredString(branch.target, `${nodePointer}/branches/${index}/target`, 128));
5050
+ }
5051
+ }
5052
+ else if (node.kind === 'join') {
5053
+ requiredString(node.title, `${nodePointer}/title`, 255);
5054
+ targets.push(requiredString(node.next, `${nodePointer}/next`, 128));
5055
+ }
5018
5056
  else if (node.kind === 'condition') {
5019
5057
  const branches = boundedArray(node.branches, `${nodePointer}/branches`, 100);
5020
5058
  if (branches.length === 0) {
@@ -5053,8 +5091,8 @@ function validateWorkflowDefinition(definition, pointer) {
5053
5091
  walk(startAt);
5054
5092
  for (const id of [...reachable]) {
5055
5093
  const current = nodes[id];
5056
- if (current?.kind === 'approval')
5057
- for (const target of current.returnTargets || [])
5094
+ if (current?.kind === 'approval' || current?.kind === 'handle')
5095
+ for (const target of workflowReturnTargets(current))
5058
5096
  if (nodes[target]?.kind === 'correction')
5059
5097
  reachable.add(target);
5060
5098
  }
@@ -5104,6 +5142,9 @@ function validateWorkflowBinding(binding, pointer) {
5104
5142
  for (const [code, raw] of Object.entries(entries)) {
5105
5143
  workflowBindingCode(code, `${pointer}/bindings/${code}`);
5106
5144
  const entry = object(raw, `${pointer}/bindings/${code}`);
5145
+ const chainErrors = validateWorkflowSupervisorChainBinding(entry);
5146
+ if (chainErrors.length)
5147
+ fail(chainErrors[0], `${pointer}/bindings/${code}`);
5107
5148
  const selectionErrors = validateWorkflowRoleInputSelection(entry);
5108
5149
  if (selectionErrors.length)
5109
5150
  fail(selectionErrors[0], `${pointer}/bindings/${code}/selectedInputPath`);
@@ -5117,6 +5158,7 @@ function validateWorkflowBinding(binding, pointer) {
5117
5158
  'input_users',
5118
5159
  'form_field_users',
5119
5160
  'department_supervisor',
5161
+ 'supervisor_chain',
5120
5162
  'app_role',
5121
5163
  'app_role_in_scope',
5122
5164
  'business_relation',
@@ -5151,6 +5193,9 @@ function validateWorkflowBinding(binding, pointer) {
5151
5193
  }
5152
5194
  }
5153
5195
  function validateWorkflowDefinitionBinding(definition, binding, pointer) {
5196
+ const chainErrors = validateWorkflowSupervisorChains(definition, binding);
5197
+ if (chainErrors.length)
5198
+ fail(chainErrors[0], pointer);
5154
5199
  equal(binding.workflowCode, definition.code, `${pointer}/workflowCode`);
5155
5200
  const entries = object(binding.bindings, `${pointer}/bindings`);
5156
5201
  for (const [code, entry] of Object.entries(entries)) {
@@ -5168,7 +5213,7 @@ function validateWorkflowDefinitionBinding(definition, binding, pointer) {
5168
5213
  fail(stepErrors[0], pointer);
5169
5214
  for (const [nodeId, rawNode] of Object.entries(object(definition.nodes, `${pointer}/nodes`))) {
5170
5215
  const node = object(rawNode, `${pointer}/nodes/${nodeId}`);
5171
- if (['approval', 'cc'].includes(node.kind) && !entries[node.binding]) {
5216
+ if (['approval', 'handle', 'cc'].includes(node.kind) && !entries[node.binding]) {
5172
5217
  fail('NATIVE_WORKFLOW_BINDING_REFERENCE_MISSING', `${pointer}/nodes/${nodeId}/binding`);
5173
5218
  }
5174
5219
  }