@contractspec/example.workflow-system 1.57.0 → 1.58.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.
Files changed (209) hide show
  1. package/dist/approval/approval.enum.d.ts +2 -7
  2. package/dist/approval/approval.enum.d.ts.map +1 -1
  3. package/dist/approval/approval.enum.js +20 -26
  4. package/dist/approval/approval.event.d.ts +108 -114
  5. package/dist/approval/approval.event.d.ts.map +1 -1
  6. package/dist/approval/approval.event.js +103 -210
  7. package/dist/approval/approval.handler.d.ts +17 -18
  8. package/dist/approval/approval.handler.d.ts.map +1 -1
  9. package/dist/approval/approval.operations.d.ts +429 -435
  10. package/dist/approval/approval.operations.d.ts.map +1 -1
  11. package/dist/approval/approval.operations.js +364 -339
  12. package/dist/approval/approval.schema.d.ts +86 -91
  13. package/dist/approval/approval.schema.d.ts.map +1 -1
  14. package/dist/approval/approval.schema.js +71 -107
  15. package/dist/approval/index.d.ts +8 -5
  16. package/dist/approval/index.d.ts.map +1 -0
  17. package/dist/approval/index.js +484 -5
  18. package/dist/browser/approval/approval.enum.js +22 -0
  19. package/dist/browser/approval/approval.event.js +112 -0
  20. package/dist/browser/approval/approval.operations.js +369 -0
  21. package/dist/browser/approval/approval.schema.js +73 -0
  22. package/dist/browser/approval/index.js +484 -0
  23. package/dist/browser/docs/index.js +103 -0
  24. package/dist/browser/docs/workflow-system.docblock.js +103 -0
  25. package/dist/browser/entities/approval.js +119 -0
  26. package/dist/browser/entities/index.js +508 -0
  27. package/dist/browser/entities/instance.js +161 -0
  28. package/dist/browser/entities/step.js +124 -0
  29. package/dist/browser/entities/workflow.js +82 -0
  30. package/dist/browser/example.js +42 -0
  31. package/dist/browser/handlers/index.js +253 -0
  32. package/dist/browser/handlers/workflow.handlers.js +253 -0
  33. package/dist/browser/index.js +3120 -0
  34. package/dist/browser/instance/index.js +677 -0
  35. package/dist/browser/instance/instance.enum.js +15 -0
  36. package/dist/browser/instance/instance.event.js +164 -0
  37. package/dist/browser/instance/instance.handler.js +356 -0
  38. package/dist/browser/instance/instance.operations.js +9 -0
  39. package/dist/browser/instance/instance.schema.js +101 -0
  40. package/dist/browser/presentations/index.js +109 -0
  41. package/dist/browser/seeders/index.js +3 -0
  42. package/dist/browser/shared/index.js +3 -0
  43. package/dist/browser/shared/mock-data.js +11 -0
  44. package/dist/browser/shared/types.js +0 -0
  45. package/dist/browser/state-machine/index.js +6 -0
  46. package/dist/browser/tests/operations.test-spec.js +6 -0
  47. package/dist/browser/ui/WorkflowDashboard.js +3 -0
  48. package/dist/browser/ui/hooks/index.js +50 -0
  49. package/dist/browser/ui/hooks/useWorkflowList.js +50 -0
  50. package/dist/browser/ui/index.js +54 -0
  51. package/dist/browser/ui/renderers/index.js +227 -0
  52. package/dist/browser/ui/renderers/workflow.markdown.js +227 -0
  53. package/dist/browser/workflow/index.js +21 -0
  54. package/dist/browser/workflow/workflow.enum.js +36 -0
  55. package/dist/browser/workflow/workflow.event.js +6 -0
  56. package/dist/browser/workflow/workflow.handler.js +5 -0
  57. package/dist/browser/workflow/workflow.operations.js +8 -0
  58. package/dist/browser/workflow/workflow.schema.js +151 -0
  59. package/dist/browser/workflow-system.capability.js +5 -0
  60. package/dist/browser/workflow-system.feature.js +3 -0
  61. package/dist/docs/index.d.ts +2 -1
  62. package/dist/docs/index.d.ts.map +1 -0
  63. package/dist/docs/index.js +104 -1
  64. package/dist/docs/workflow-system.docblock.d.ts +2 -1
  65. package/dist/docs/workflow-system.docblock.d.ts.map +1 -0
  66. package/dist/docs/workflow-system.docblock.js +45 -56
  67. package/dist/entities/approval.d.ts +35 -40
  68. package/dist/entities/approval.d.ts.map +1 -1
  69. package/dist/entities/approval.js +116 -124
  70. package/dist/entities/index.d.ts +132 -137
  71. package/dist/entities/index.d.ts.map +1 -1
  72. package/dist/entities/index.js +506 -29
  73. package/dist/entities/instance.d.ts +46 -51
  74. package/dist/entities/instance.d.ts.map +1 -1
  75. package/dist/entities/instance.js +158 -164
  76. package/dist/entities/step.d.ts +31 -36
  77. package/dist/entities/step.d.ts.map +1 -1
  78. package/dist/entities/step.js +122 -132
  79. package/dist/entities/workflow.d.ts +22 -27
  80. package/dist/entities/workflow.d.ts.map +1 -1
  81. package/dist/entities/workflow.js +80 -99
  82. package/dist/example.d.ts +2 -6
  83. package/dist/example.d.ts.map +1 -1
  84. package/dist/example.js +41 -55
  85. package/dist/handlers/index.d.ts +2 -2
  86. package/dist/handlers/index.d.ts.map +1 -0
  87. package/dist/handlers/index.js +254 -3
  88. package/dist/handlers/workflow.handlers.d.ts +107 -106
  89. package/dist/handlers/workflow.handlers.d.ts.map +1 -1
  90. package/dist/handlers/workflow.handlers.js +237 -246
  91. package/dist/index.d.ts +15 -26
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +3121 -26
  94. package/dist/instance/index.d.ts +8 -5
  95. package/dist/instance/index.d.ts.map +1 -0
  96. package/dist/instance/index.js +677 -5
  97. package/dist/instance/instance.enum.d.ts +1 -6
  98. package/dist/instance/instance.enum.d.ts.map +1 -1
  99. package/dist/instance/instance.enum.js +14 -18
  100. package/dist/instance/instance.event.d.ts +313 -319
  101. package/dist/instance/instance.event.d.ts.map +1 -1
  102. package/dist/instance/instance.event.js +151 -279
  103. package/dist/instance/instance.handler.d.ts +21 -22
  104. package/dist/instance/instance.handler.d.ts.map +1 -1
  105. package/dist/instance/instance.handler.js +352 -89
  106. package/dist/instance/instance.operations.d.ts +819 -825
  107. package/dist/instance/instance.operations.d.ts.map +1 -1
  108. package/dist/instance/instance.operations.js +10 -464
  109. package/dist/instance/instance.schema.d.ts +196 -201
  110. package/dist/instance/instance.schema.d.ts.map +1 -1
  111. package/dist/instance/instance.schema.js +97 -167
  112. package/dist/presentations/index.d.ts +23 -28
  113. package/dist/presentations/index.d.ts.map +1 -1
  114. package/dist/presentations/index.js +104 -334
  115. package/dist/seeders/index.d.ts +4 -8
  116. package/dist/seeders/index.d.ts.map +1 -1
  117. package/dist/seeders/index.js +4 -19
  118. package/dist/shared/index.d.ts +6 -3
  119. package/dist/shared/index.d.ts.map +1 -0
  120. package/dist/shared/index.js +4 -3
  121. package/dist/shared/mock-data.d.ts +16 -16
  122. package/dist/shared/mock-data.d.ts.map +1 -1
  123. package/dist/shared/mock-data.js +11 -11
  124. package/dist/shared/types.d.ts +69 -72
  125. package/dist/shared/types.d.ts.map +1 -1
  126. package/dist/shared/types.js +1 -0
  127. package/dist/state-machine/index.d.ts +92 -95
  128. package/dist/state-machine/index.d.ts.map +1 -1
  129. package/dist/state-machine/index.js +6 -157
  130. package/dist/tests/operations.test-spec.d.ts +4 -9
  131. package/dist/tests/operations.test-spec.d.ts.map +1 -1
  132. package/dist/tests/operations.test-spec.js +7 -123
  133. package/dist/ui/WorkflowDashboard.d.ts +1 -6
  134. package/dist/ui/WorkflowDashboard.d.ts.map +1 -1
  135. package/dist/ui/WorkflowDashboard.js +3 -222
  136. package/dist/ui/hooks/index.d.ts +2 -2
  137. package/dist/ui/hooks/index.d.ts.map +1 -0
  138. package/dist/ui/hooks/index.js +51 -5
  139. package/dist/ui/hooks/useWorkflowList.d.ts +15 -19
  140. package/dist/ui/hooks/useWorkflowList.d.ts.map +1 -1
  141. package/dist/ui/hooks/useWorkflowList.js +47 -51
  142. package/dist/ui/index.d.ts +7 -6
  143. package/dist/ui/index.d.ts.map +1 -0
  144. package/dist/ui/index.js +55 -6
  145. package/dist/ui/renderers/index.d.ts +2 -2
  146. package/dist/ui/renderers/index.d.ts.map +1 -0
  147. package/dist/ui/renderers/index.js +227 -2
  148. package/dist/ui/renderers/workflow.markdown.d.ts +13 -14
  149. package/dist/ui/renderers/workflow.markdown.d.ts.map +1 -1
  150. package/dist/ui/renderers/workflow.markdown.js +223 -229
  151. package/dist/workflow/index.d.ts +8 -5
  152. package/dist/workflow/index.d.ts.map +1 -0
  153. package/dist/workflow/index.js +22 -6
  154. package/dist/workflow/workflow.enum.d.ts +4 -9
  155. package/dist/workflow/workflow.enum.d.ts.map +1 -1
  156. package/dist/workflow/workflow.enum.js +32 -42
  157. package/dist/workflow/workflow.event.d.ts +112 -118
  158. package/dist/workflow/workflow.event.d.ts.map +1 -1
  159. package/dist/workflow/workflow.event.js +7 -150
  160. package/dist/workflow/workflow.handler.d.ts +23 -24
  161. package/dist/workflow/workflow.handler.d.ts.map +1 -1
  162. package/dist/workflow/workflow.handler.js +6 -66
  163. package/dist/workflow/workflow.operations.d.ts +847 -853
  164. package/dist/workflow/workflow.operations.d.ts.map +1 -1
  165. package/dist/workflow/workflow.operations.js +9 -345
  166. package/dist/workflow/workflow.schema.d.ts +229 -234
  167. package/dist/workflow/workflow.schema.d.ts.map +1 -1
  168. package/dist/workflow/workflow.schema.js +146 -243
  169. package/dist/workflow-system.capability.d.ts +3 -8
  170. package/dist/workflow-system.capability.d.ts.map +1 -1
  171. package/dist/workflow-system.capability.js +6 -34
  172. package/dist/workflow-system.feature.d.ts +1 -6
  173. package/dist/workflow-system.feature.d.ts.map +1 -1
  174. package/dist/workflow-system.feature.js +4 -346
  175. package/package.json +415 -93
  176. package/dist/approval/approval.enum.js.map +0 -1
  177. package/dist/approval/approval.event.js.map +0 -1
  178. package/dist/approval/approval.handler.js +0 -72
  179. package/dist/approval/approval.handler.js.map +0 -1
  180. package/dist/approval/approval.operations.js.map +0 -1
  181. package/dist/approval/approval.schema.js.map +0 -1
  182. package/dist/docs/workflow-system.docblock.js.map +0 -1
  183. package/dist/entities/approval.js.map +0 -1
  184. package/dist/entities/index.js.map +0 -1
  185. package/dist/entities/instance.js.map +0 -1
  186. package/dist/entities/step.js.map +0 -1
  187. package/dist/entities/workflow.js.map +0 -1
  188. package/dist/example.js.map +0 -1
  189. package/dist/handlers/workflow.handlers.js.map +0 -1
  190. package/dist/instance/instance.enum.js.map +0 -1
  191. package/dist/instance/instance.event.js.map +0 -1
  192. package/dist/instance/instance.handler.js.map +0 -1
  193. package/dist/instance/instance.operations.js.map +0 -1
  194. package/dist/instance/instance.schema.js.map +0 -1
  195. package/dist/presentations/index.js.map +0 -1
  196. package/dist/seeders/index.js.map +0 -1
  197. package/dist/shared/mock-data.js.map +0 -1
  198. package/dist/state-machine/index.js.map +0 -1
  199. package/dist/tests/operations.test-spec.js.map +0 -1
  200. package/dist/ui/WorkflowDashboard.js.map +0 -1
  201. package/dist/ui/hooks/useWorkflowList.js.map +0 -1
  202. package/dist/ui/renderers/workflow.markdown.js.map +0 -1
  203. package/dist/workflow/workflow.enum.js.map +0 -1
  204. package/dist/workflow/workflow.event.js.map +0 -1
  205. package/dist/workflow/workflow.handler.js.map +0 -1
  206. package/dist/workflow/workflow.operations.js.map +0 -1
  207. package/dist/workflow/workflow.schema.js.map +0 -1
  208. package/dist/workflow-system.capability.js.map +0 -1
  209. package/dist/workflow-system.feature.js.map +0 -1
@@ -1,345 +1,370 @@
1
- import { ApprovalDecisionEnum, ApprovalStatusEnum } from "./approval.enum.js";
2
- import { ApprovalCommentModel, ApprovalRequestModel } from "./approval.schema.js";
3
- import { ScalarTypeEnum, defineSchemaModel } from "@contractspec/lib.schema";
4
- import { defineCommand, defineQuery } from "@contractspec/lib.contracts/operations";
1
+ // @bun
2
+ // src/approval/approval.enum.ts
3
+ import { defineEnum } from "@contractspec/lib.schema";
4
+ var ApprovalStatusEnum = defineEnum("ApprovalStatus", [
5
+ "PENDING",
6
+ "APPROVED",
7
+ "REJECTED",
8
+ "DELEGATED",
9
+ "ESCALATED",
10
+ "WITHDRAWN",
11
+ "EXPIRED"
12
+ ]);
13
+ var ApprovalDecisionEnum = defineEnum("ApprovalDecision", [
14
+ "APPROVE",
15
+ "REJECT",
16
+ "REQUEST_CHANGES",
17
+ "DELEGATE",
18
+ "ABSTAIN"
19
+ ]);
5
20
 
6
- //#region src/approval/approval.operations.ts
7
- const OWNERS = ["@example.workflow-system"];
8
- /**
9
- * Approve or reject an approval request.
10
- */
11
- const SubmitDecisionContract = defineCommand({
12
- meta: {
13
- key: "workflow.approval.decide",
14
- version: "1.0.0",
15
- stability: "stable",
16
- owners: [...OWNERS],
17
- tags: [
18
- "workflow",
19
- "approval",
20
- "decision"
21
- ],
22
- description: "Submit an approval decision (approve/reject).",
23
- goal: "Allow approvers to make decisions on requests.",
24
- context: "Approval inbox, workflow detail."
25
- },
26
- io: {
27
- input: defineSchemaModel({
28
- name: "ApproveRejectInput",
29
- fields: {
30
- requestId: {
31
- type: ScalarTypeEnum.String_unsecure(),
32
- isOptional: false
33
- },
34
- decision: {
35
- type: ApprovalDecisionEnum,
36
- isOptional: false
37
- },
38
- comment: {
39
- type: ScalarTypeEnum.String_unsecure(),
40
- isOptional: true
41
- },
42
- data: {
43
- type: ScalarTypeEnum.JSON(),
44
- isOptional: true
45
- }
46
- }
47
- }),
48
- output: ApprovalRequestModel
49
- },
50
- policy: { auth: "user" },
51
- sideEffects: {
52
- emits: [{
53
- key: "workflow.approval.decided",
54
- version: "1.0.0",
55
- when: "Decision is made",
56
- payload: ApprovalRequestModel
57
- }],
58
- audit: ["workflow.approval.decided"]
59
- },
60
- acceptance: {
61
- scenarios: [{
62
- key: "approve-request-happy-path",
63
- given: ["Approval request is pending", "User is assignee"],
64
- when: ["User approves request"],
65
- then: ["Request is approved", "ApprovalDecided event is emitted"]
66
- }],
67
- examples: [{
68
- key: "approve-basic",
69
- input: {
70
- requestId: "req-123",
71
- decision: "approve",
72
- comment: "Looks good"
73
- },
74
- output: {
75
- id: "req-123",
76
- status: "approved"
77
- }
78
- }]
79
- }
21
+ // src/approval/approval.schema.ts
22
+ import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
23
+ var ApprovalRequestModel = defineSchemaModel({
24
+ name: "ApprovalRequestModel",
25
+ description: "An approval request",
26
+ fields: {
27
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
28
+ workflowInstanceId: {
29
+ type: ScalarTypeEnum.String_unsecure(),
30
+ isOptional: false
31
+ },
32
+ stepExecutionId: {
33
+ type: ScalarTypeEnum.String_unsecure(),
34
+ isOptional: false
35
+ },
36
+ approverId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
37
+ approverRole: {
38
+ type: ScalarTypeEnum.String_unsecure(),
39
+ isOptional: true
40
+ },
41
+ title: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
42
+ description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
43
+ status: { type: ApprovalStatusEnum, isOptional: false },
44
+ decision: { type: ApprovalDecisionEnum, isOptional: true },
45
+ decisionComment: {
46
+ type: ScalarTypeEnum.String_unsecure(),
47
+ isOptional: true
48
+ },
49
+ decidedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
50
+ dueAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
51
+ contextSnapshot: { type: ScalarTypeEnum.JSON(), isOptional: true },
52
+ sequenceOrder: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
53
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false }
54
+ }
80
55
  });
81
- /**
82
- * Delegate an approval to another user.
83
- */
84
- const DelegateApprovalContract = defineCommand({
85
- meta: {
86
- key: "workflow.approval.delegate",
87
- version: "1.0.0",
88
- stability: "stable",
89
- owners: [...OWNERS],
90
- tags: [
91
- "workflow",
92
- "approval",
93
- "delegate"
94
- ],
95
- description: "Delegate an approval request to another user.",
96
- goal: "Allow approvers to pass approval to others.",
97
- context: "Approval inbox."
98
- },
99
- io: {
100
- input: defineSchemaModel({
101
- name: "DelegateInput",
102
- fields: {
103
- requestId: {
104
- type: ScalarTypeEnum.String_unsecure(),
105
- isOptional: false
106
- },
107
- delegateTo: {
108
- type: ScalarTypeEnum.String_unsecure(),
109
- isOptional: false
110
- },
111
- reason: {
112
- type: ScalarTypeEnum.String_unsecure(),
113
- isOptional: true
114
- }
115
- }
116
- }),
117
- output: ApprovalRequestModel
118
- },
119
- policy: { auth: "user" },
120
- sideEffects: {
121
- emits: [{
122
- key: "workflow.approval.delegated",
123
- version: "1.0.0",
124
- when: "Approval is delegated",
125
- payload: ApprovalRequestModel
126
- }],
127
- audit: ["workflow.approval.delegated"]
128
- },
129
- acceptance: {
130
- scenarios: [{
131
- key: "delegate-approval-happy-path",
132
- given: ["Approval request is pending", "User is assignee"],
133
- when: ["User delegates to another user"],
134
- then: ["Assignee is updated", "ApprovalDelegated event is emitted"]
135
- }],
136
- examples: [{
137
- key: "delegate-to-manager",
138
- input: {
139
- requestId: "req-123",
140
- delegateTo: "user-456",
141
- reason: "Out of office"
142
- },
143
- output: {
144
- id: "req-123",
145
- assigneeId: "user-456"
146
- }
147
- }]
148
- }
56
+ var ApprovalCommentModel = defineSchemaModel({
57
+ name: "ApprovalCommentModel",
58
+ description: "A comment on an approval",
59
+ fields: {
60
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
61
+ approvalRequestId: {
62
+ type: ScalarTypeEnum.String_unsecure(),
63
+ isOptional: false
64
+ },
65
+ authorId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
66
+ content: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
67
+ isInternal: { type: ScalarTypeEnum.Boolean(), isOptional: false },
68
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false }
69
+ }
149
70
  });
150
- /**
151
- * Add a comment to an approval request.
152
- */
153
- const AddApprovalCommentContract = defineCommand({
154
- meta: {
155
- key: "workflow.approval.comment.add",
156
- version: "1.0.0",
157
- stability: "stable",
158
- owners: [...OWNERS],
159
- tags: [
160
- "workflow",
161
- "approval",
162
- "comment"
163
- ],
164
- description: "Add a comment to an approval request.",
165
- goal: "Allow discussion on approval requests.",
166
- context: "Approval detail view."
167
- },
168
- io: {
169
- input: defineSchemaModel({
170
- name: "AddCommentInput",
171
- fields: {
172
- requestId: {
173
- type: ScalarTypeEnum.String_unsecure(),
174
- isOptional: false
175
- },
176
- content: {
177
- type: ScalarTypeEnum.NonEmptyString(),
178
- isOptional: false
179
- },
180
- isInternal: {
181
- type: ScalarTypeEnum.Boolean(),
182
- isOptional: true
183
- }
184
- }
185
- }),
186
- output: ApprovalCommentModel
187
- },
188
- policy: { auth: "user" },
189
- sideEffects: { emits: [{
190
- key: "workflow.approval.comment.added",
191
- version: "1.0.0",
192
- when: "Comment is added",
193
- payload: ApprovalCommentModel
194
- }] },
195
- acceptance: {
196
- scenarios: [{
197
- key: "add-comment-happy-path",
198
- given: ["Approval request exists"],
199
- when: ["User adds a comment"],
200
- then: ["Comment is added", "CommentAdded event is emitted"]
201
- }],
202
- examples: [{
203
- key: "add-question",
204
- input: {
205
- requestId: "req-123",
206
- content: "Can you clarify budget?",
207
- isInternal: false
208
- },
209
- output: {
210
- id: "com-789",
211
- content: "Can you clarify budget?"
212
- }
213
- }]
214
- }
71
+
72
+ // src/approval/approval.operations.ts
73
+ import {
74
+ defineCommand,
75
+ defineQuery
76
+ } from "@contractspec/lib.contracts/operations";
77
+ import { defineSchemaModel as defineSchemaModel2, ScalarTypeEnum as ScalarTypeEnum2 } from "@contractspec/lib.schema";
78
+ var OWNERS = ["@example.workflow-system"];
79
+ var SubmitDecisionContract = defineCommand({
80
+ meta: {
81
+ key: "workflow.approval.decide",
82
+ version: "1.0.0",
83
+ stability: "stable",
84
+ owners: [...OWNERS],
85
+ tags: ["workflow", "approval", "decision"],
86
+ description: "Submit an approval decision (approve/reject).",
87
+ goal: "Allow approvers to make decisions on requests.",
88
+ context: "Approval inbox, workflow detail."
89
+ },
90
+ io: {
91
+ input: defineSchemaModel2({
92
+ name: "ApproveRejectInput",
93
+ fields: {
94
+ requestId: {
95
+ type: ScalarTypeEnum2.String_unsecure(),
96
+ isOptional: false
97
+ },
98
+ decision: { type: ApprovalDecisionEnum, isOptional: false },
99
+ comment: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
100
+ data: { type: ScalarTypeEnum2.JSON(), isOptional: true }
101
+ }
102
+ }),
103
+ output: ApprovalRequestModel
104
+ },
105
+ policy: { auth: "user" },
106
+ sideEffects: {
107
+ emits: [
108
+ {
109
+ key: "workflow.approval.decided",
110
+ version: "1.0.0",
111
+ when: "Decision is made",
112
+ payload: ApprovalRequestModel
113
+ }
114
+ ],
115
+ audit: ["workflow.approval.decided"]
116
+ },
117
+ acceptance: {
118
+ scenarios: [
119
+ {
120
+ key: "approve-request-happy-path",
121
+ given: ["Approval request is pending", "User is assignee"],
122
+ when: ["User approves request"],
123
+ then: ["Request is approved", "ApprovalDecided event is emitted"]
124
+ }
125
+ ],
126
+ examples: [
127
+ {
128
+ key: "approve-basic",
129
+ input: {
130
+ requestId: "req-123",
131
+ decision: "approve",
132
+ comment: "Looks good"
133
+ },
134
+ output: { id: "req-123", status: "approved" }
135
+ }
136
+ ]
137
+ }
215
138
  });
216
- /**
217
- * List approvals assigned to the current user.
218
- */
219
- const ListMyApprovalsContract = defineQuery({
220
- meta: {
221
- key: "workflow.approval.list.mine",
222
- version: "1.0.0",
223
- stability: "stable",
224
- owners: [...OWNERS],
225
- tags: [
226
- "workflow",
227
- "approval",
228
- "list",
229
- "inbox"
230
- ],
231
- description: "List approval requests assigned to current user.",
232
- goal: "Show pending approvals in user inbox.",
233
- context: "Approval inbox, dashboard widget."
234
- },
235
- io: {
236
- input: defineSchemaModel({
237
- name: "ListMyApprovalsInput",
238
- fields: {
239
- status: {
240
- type: ApprovalStatusEnum,
241
- isOptional: true
242
- },
243
- limit: {
244
- type: ScalarTypeEnum.Int_unsecure(),
245
- isOptional: true,
246
- defaultValue: 20
247
- },
248
- offset: {
249
- type: ScalarTypeEnum.Int_unsecure(),
250
- isOptional: true,
251
- defaultValue: 0
252
- }
253
- }
254
- }),
255
- output: defineSchemaModel({
256
- name: "ListMyApprovalsOutput",
257
- fields: {
258
- requests: {
259
- type: ApprovalRequestModel,
260
- isArray: true,
261
- isOptional: false
262
- },
263
- total: {
264
- type: ScalarTypeEnum.Int_unsecure(),
265
- isOptional: false
266
- },
267
- pendingCount: {
268
- type: ScalarTypeEnum.Int_unsecure(),
269
- isOptional: false
270
- }
271
- }
272
- })
273
- },
274
- policy: { auth: "user" },
275
- acceptance: {
276
- scenarios: [{
277
- key: "list-approvals-happy-path",
278
- given: ["User has assigned approvals"],
279
- when: ["User lists approvals"],
280
- then: ["List of requests is returned"]
281
- }],
282
- examples: [{
283
- key: "list-pending",
284
- input: {
285
- status: "pending",
286
- limit: 10
287
- },
288
- output: {
289
- requests: [],
290
- total: 2,
291
- pendingCount: 2
292
- }
293
- }]
294
- }
139
+ var DelegateApprovalContract = defineCommand({
140
+ meta: {
141
+ key: "workflow.approval.delegate",
142
+ version: "1.0.0",
143
+ stability: "stable",
144
+ owners: [...OWNERS],
145
+ tags: ["workflow", "approval", "delegate"],
146
+ description: "Delegate an approval request to another user.",
147
+ goal: "Allow approvers to pass approval to others.",
148
+ context: "Approval inbox."
149
+ },
150
+ io: {
151
+ input: defineSchemaModel2({
152
+ name: "DelegateInput",
153
+ fields: {
154
+ requestId: {
155
+ type: ScalarTypeEnum2.String_unsecure(),
156
+ isOptional: false
157
+ },
158
+ delegateTo: {
159
+ type: ScalarTypeEnum2.String_unsecure(),
160
+ isOptional: false
161
+ },
162
+ reason: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true }
163
+ }
164
+ }),
165
+ output: ApprovalRequestModel
166
+ },
167
+ policy: { auth: "user" },
168
+ sideEffects: {
169
+ emits: [
170
+ {
171
+ key: "workflow.approval.delegated",
172
+ version: "1.0.0",
173
+ when: "Approval is delegated",
174
+ payload: ApprovalRequestModel
175
+ }
176
+ ],
177
+ audit: ["workflow.approval.delegated"]
178
+ },
179
+ acceptance: {
180
+ scenarios: [
181
+ {
182
+ key: "delegate-approval-happy-path",
183
+ given: ["Approval request is pending", "User is assignee"],
184
+ when: ["User delegates to another user"],
185
+ then: ["Assignee is updated", "ApprovalDelegated event is emitted"]
186
+ }
187
+ ],
188
+ examples: [
189
+ {
190
+ key: "delegate-to-manager",
191
+ input: {
192
+ requestId: "req-123",
193
+ delegateTo: "user-456",
194
+ reason: "Out of office"
195
+ },
196
+ output: { id: "req-123", assigneeId: "user-456" }
197
+ }
198
+ ]
199
+ }
295
200
  });
296
- /**
297
- * Get a single approval request.
298
- */
299
- const GetApprovalContract = defineQuery({
300
- meta: {
301
- key: "workflow.approval.get",
302
- version: "1.0.0",
303
- stability: "stable",
304
- owners: [...OWNERS],
305
- tags: [
306
- "workflow",
307
- "approval",
308
- "get"
309
- ],
310
- description: "Get an approval request with details.",
311
- goal: "View approval request details.",
312
- context: "Approval detail view."
313
- },
314
- io: {
315
- input: defineSchemaModel({
316
- name: "GetApprovalInput",
317
- fields: { requestId: {
318
- type: ScalarTypeEnum.String_unsecure(),
319
- isOptional: false
320
- } }
321
- }),
322
- output: ApprovalRequestModel
323
- },
324
- policy: { auth: "user" },
325
- acceptance: {
326
- scenarios: [{
327
- key: "get-approval-happy-path",
328
- given: ["Approval request exists"],
329
- when: ["User requests approval details"],
330
- then: ["Approval details are returned"]
331
- }],
332
- examples: [{
333
- key: "get-basic",
334
- input: { requestId: "req-123" },
335
- output: {
336
- id: "req-123",
337
- status: "pending"
338
- }
339
- }]
340
- }
201
+ var AddApprovalCommentContract = defineCommand({
202
+ meta: {
203
+ key: "workflow.approval.comment.add",
204
+ version: "1.0.0",
205
+ stability: "stable",
206
+ owners: [...OWNERS],
207
+ tags: ["workflow", "approval", "comment"],
208
+ description: "Add a comment to an approval request.",
209
+ goal: "Allow discussion on approval requests.",
210
+ context: "Approval detail view."
211
+ },
212
+ io: {
213
+ input: defineSchemaModel2({
214
+ name: "AddCommentInput",
215
+ fields: {
216
+ requestId: {
217
+ type: ScalarTypeEnum2.String_unsecure(),
218
+ isOptional: false
219
+ },
220
+ content: { type: ScalarTypeEnum2.NonEmptyString(), isOptional: false },
221
+ isInternal: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
222
+ }
223
+ }),
224
+ output: ApprovalCommentModel
225
+ },
226
+ policy: { auth: "user" },
227
+ sideEffects: {
228
+ emits: [
229
+ {
230
+ key: "workflow.approval.comment.added",
231
+ version: "1.0.0",
232
+ when: "Comment is added",
233
+ payload: ApprovalCommentModel
234
+ }
235
+ ]
236
+ },
237
+ acceptance: {
238
+ scenarios: [
239
+ {
240
+ key: "add-comment-happy-path",
241
+ given: ["Approval request exists"],
242
+ when: ["User adds a comment"],
243
+ then: ["Comment is added", "CommentAdded event is emitted"]
244
+ }
245
+ ],
246
+ examples: [
247
+ {
248
+ key: "add-question",
249
+ input: {
250
+ requestId: "req-123",
251
+ content: "Can you clarify budget?",
252
+ isInternal: false
253
+ },
254
+ output: { id: "com-789", content: "Can you clarify budget?" }
255
+ }
256
+ ]
257
+ }
341
258
  });
342
-
343
- //#endregion
344
- export { AddApprovalCommentContract, DelegateApprovalContract, GetApprovalContract, ListMyApprovalsContract, SubmitDecisionContract };
345
- //# sourceMappingURL=approval.operations.js.map
259
+ var ListMyApprovalsContract = defineQuery({
260
+ meta: {
261
+ key: "workflow.approval.list.mine",
262
+ version: "1.0.0",
263
+ stability: "stable",
264
+ owners: [...OWNERS],
265
+ tags: ["workflow", "approval", "list", "inbox"],
266
+ description: "List approval requests assigned to current user.",
267
+ goal: "Show pending approvals in user inbox.",
268
+ context: "Approval inbox, dashboard widget."
269
+ },
270
+ io: {
271
+ input: defineSchemaModel2({
272
+ name: "ListMyApprovalsInput",
273
+ fields: {
274
+ status: { type: ApprovalStatusEnum, isOptional: true },
275
+ limit: {
276
+ type: ScalarTypeEnum2.Int_unsecure(),
277
+ isOptional: true,
278
+ defaultValue: 20
279
+ },
280
+ offset: {
281
+ type: ScalarTypeEnum2.Int_unsecure(),
282
+ isOptional: true,
283
+ defaultValue: 0
284
+ }
285
+ }
286
+ }),
287
+ output: defineSchemaModel2({
288
+ name: "ListMyApprovalsOutput",
289
+ fields: {
290
+ requests: {
291
+ type: ApprovalRequestModel,
292
+ isArray: true,
293
+ isOptional: false
294
+ },
295
+ total: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: false },
296
+ pendingCount: {
297
+ type: ScalarTypeEnum2.Int_unsecure(),
298
+ isOptional: false
299
+ }
300
+ }
301
+ })
302
+ },
303
+ policy: { auth: "user" },
304
+ acceptance: {
305
+ scenarios: [
306
+ {
307
+ key: "list-approvals-happy-path",
308
+ given: ["User has assigned approvals"],
309
+ when: ["User lists approvals"],
310
+ then: ["List of requests is returned"]
311
+ }
312
+ ],
313
+ examples: [
314
+ {
315
+ key: "list-pending",
316
+ input: { status: "pending", limit: 10 },
317
+ output: { requests: [], total: 2, pendingCount: 2 }
318
+ }
319
+ ]
320
+ }
321
+ });
322
+ var GetApprovalContract = defineQuery({
323
+ meta: {
324
+ key: "workflow.approval.get",
325
+ version: "1.0.0",
326
+ stability: "stable",
327
+ owners: [...OWNERS],
328
+ tags: ["workflow", "approval", "get"],
329
+ description: "Get an approval request with details.",
330
+ goal: "View approval request details.",
331
+ context: "Approval detail view."
332
+ },
333
+ io: {
334
+ input: defineSchemaModel2({
335
+ name: "GetApprovalInput",
336
+ fields: {
337
+ requestId: {
338
+ type: ScalarTypeEnum2.String_unsecure(),
339
+ isOptional: false
340
+ }
341
+ }
342
+ }),
343
+ output: ApprovalRequestModel
344
+ },
345
+ policy: { auth: "user" },
346
+ acceptance: {
347
+ scenarios: [
348
+ {
349
+ key: "get-approval-happy-path",
350
+ given: ["Approval request exists"],
351
+ when: ["User requests approval details"],
352
+ then: ["Approval details are returned"]
353
+ }
354
+ ],
355
+ examples: [
356
+ {
357
+ key: "get-basic",
358
+ input: { requestId: "req-123" },
359
+ output: { id: "req-123", status: "pending" }
360
+ }
361
+ ]
362
+ }
363
+ });
364
+ export {
365
+ SubmitDecisionContract,
366
+ ListMyApprovalsContract,
367
+ GetApprovalContract,
368
+ DelegateApprovalContract,
369
+ AddApprovalCommentContract
370
+ };