@ottochain/sdk 1.7.0-beta.2 → 2.1.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 (113) hide show
  1. package/dist/cjs/apps/contracts/index.js +1 -1
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +272 -0
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +284 -0
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +93 -0
  5. package/dist/cjs/apps/contracts/state-machines/index.js +177 -1
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +1022 -0
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +671 -0
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +998 -0
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +1102 -0
  10. package/dist/cjs/apps/corporate/state-machines/index.js +20 -4440
  11. package/dist/cjs/apps/governance/index.js +7 -7
  12. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +467 -0
  13. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +458 -0
  14. package/dist/cjs/apps/governance/state-machines/dao-single.js +199 -0
  15. package/dist/cjs/apps/governance/state-machines/dao-token.js +503 -0
  16. package/dist/cjs/apps/governance/state-machines/governance-simple.js +482 -0
  17. package/dist/cjs/apps/governance/state-machines/governance-universal.js +138 -0
  18. package/dist/cjs/apps/governance/state-machines/index.js +16 -2934
  19. package/dist/cjs/apps/identity/constants.js +20 -20
  20. package/dist/cjs/apps/identity/index.js +13 -21
  21. package/dist/cjs/apps/identity/state-machines/identity-agent.js +256 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +321 -0
  23. package/dist/cjs/apps/identity/state-machines/identity-universal.js +106 -0
  24. package/dist/cjs/apps/identity/state-machines/index.js +15 -784
  25. package/dist/cjs/apps/markets/index.js +1 -1
  26. package/dist/cjs/apps/markets/state-machines/index.js +14 -2298
  27. package/dist/cjs/apps/markets/state-machines/market-auction.js +283 -0
  28. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +312 -0
  29. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +407 -0
  30. package/dist/cjs/apps/markets/state-machines/market-prediction.js +485 -0
  31. package/dist/cjs/apps/markets/state-machines/market-universal.js +129 -0
  32. package/dist/cjs/apps/oracles/index.js +36 -0
  33. package/dist/cjs/generated/index.js +14 -7
  34. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +197 -198
  35. package/dist/cjs/schema/fiber-app.js +55 -0
  36. package/dist/cjs/schema/index.js +20 -0
  37. package/dist/esm/apps/contracts/index.js +3 -3
  38. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +269 -0
  39. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +281 -0
  40. package/dist/esm/apps/contracts/state-machines/contract-universal.js +90 -0
  41. package/dist/esm/apps/contracts/state-machines/index.js +177 -1
  42. package/dist/esm/apps/corporate/index.js +3 -3
  43. package/dist/esm/apps/corporate/state-machines/corp-board.js +1019 -0
  44. package/dist/esm/apps/corporate/state-machines/corp-entity.js +668 -0
  45. package/dist/esm/apps/corporate/state-machines/corp-securities.js +995 -0
  46. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +1099 -0
  47. package/dist/esm/apps/corporate/state-machines/index.js +15 -4439
  48. package/dist/esm/apps/governance/index.js +9 -9
  49. package/dist/esm/apps/governance/state-machines/dao-multisig.js +464 -0
  50. package/dist/esm/apps/governance/state-machines/dao-reputation.js +455 -0
  51. package/dist/esm/apps/governance/state-machines/dao-single.js +196 -0
  52. package/dist/esm/apps/governance/state-machines/dao-token.js +500 -0
  53. package/dist/esm/apps/governance/state-machines/governance-simple.js +479 -0
  54. package/dist/esm/apps/governance/state-machines/governance-universal.js +135 -0
  55. package/dist/esm/apps/governance/state-machines/index.js +9 -2933
  56. package/dist/esm/apps/identity/constants.js +21 -21
  57. package/dist/esm/apps/identity/index.js +13 -22
  58. package/dist/esm/apps/identity/state-machines/identity-agent.js +253 -0
  59. package/dist/esm/apps/identity/state-machines/identity-oracle.js +318 -0
  60. package/dist/esm/apps/identity/state-machines/identity-universal.js +103 -0
  61. package/dist/esm/apps/identity/state-machines/index.js +11 -783
  62. package/dist/esm/apps/index.js +5 -5
  63. package/dist/esm/apps/markets/index.js +3 -3
  64. package/dist/esm/apps/markets/state-machines/index.js +8 -2297
  65. package/dist/esm/apps/markets/state-machines/market-auction.js +280 -0
  66. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +309 -0
  67. package/dist/esm/apps/markets/state-machines/market-group-buy.js +404 -0
  68. package/dist/esm/apps/markets/state-machines/market-prediction.js +482 -0
  69. package/dist/esm/apps/markets/state-machines/market-universal.js +126 -0
  70. package/dist/esm/apps/oracles/index.js +21 -0
  71. package/dist/esm/generated/index.js +8 -3
  72. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +196 -197
  73. package/dist/esm/schema/fiber-app.js +47 -0
  74. package/dist/esm/schema/index.js +4 -0
  75. package/dist/types/apps/contracts/index.d.ts +151 -2
  76. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +462 -0
  77. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +511 -0
  78. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +147 -0
  79. package/dist/types/apps/contracts/state-machines/index.d.ts +149 -0
  80. package/dist/types/apps/corporate/index.d.ts +5263 -3825
  81. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +1479 -0
  82. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +970 -0
  83. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +1381 -0
  84. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +1631 -0
  85. package/dist/types/apps/corporate/state-machines/index.d.ts +5245 -3802
  86. package/dist/types/apps/governance/index.d.ts +875 -37
  87. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +644 -0
  88. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +610 -0
  89. package/dist/types/apps/governance/state-machines/dao-single.d.ts +276 -0
  90. package/dist/types/apps/governance/state-machines/dao-token.d.ts +601 -0
  91. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +652 -0
  92. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +181 -0
  93. package/dist/types/apps/governance/state-machines/index.d.ts +9 -2136
  94. package/dist/types/apps/identity/constants.d.ts +4 -7
  95. package/dist/types/apps/identity/index.d.ts +1082 -592
  96. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +401 -0
  97. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +550 -0
  98. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +151 -0
  99. package/dist/types/apps/identity/state-machines/index.d.ts +1069 -567
  100. package/dist/types/apps/index.d.ts +5 -5
  101. package/dist/types/apps/markets/index.d.ts +535 -7
  102. package/dist/types/apps/markets/state-machines/index.d.ts +8 -1678
  103. package/dist/types/apps/markets/state-machines/market-auction.d.ts +392 -0
  104. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +443 -0
  105. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +539 -0
  106. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +651 -0
  107. package/dist/types/apps/markets/state-machines/market-universal.d.ts +191 -0
  108. package/dist/types/apps/oracles/index.d.ts +18 -0
  109. package/dist/types/generated/index.d.ts +3 -1
  110. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +43 -64
  111. package/dist/types/schema/fiber-app.d.ts +139 -0
  112. package/dist/types/schema/index.d.ts +4 -0
  113. package/package.json +1 -1
@@ -0,0 +1,1019 @@
1
+ import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ /**
3
+ * Board of directors state machine managing director seats, meetings, quorum, and formal board actions.
4
+ * Supports staggered boards with classified directors.
5
+ */
6
+ export const corpBoardDef = defineFiberApp({
7
+ metadata: {
8
+ name: "CorpBoard",
9
+ app: "corporate",
10
+ type: "board",
11
+ version: "1.0.0",
12
+ description: "Board of directors state machine managing director seats, meetings, quorum, and formal board actions. Supports staggered boards with classified directors.",
13
+ crossReferences: {
14
+ entity: {
15
+ machine: "corporate-entity",
16
+ description: "Parent corporate entity",
17
+ foreignKey: "entityId",
18
+ },
19
+ resolutions: {
20
+ machine: "corporate-resolution",
21
+ description: "Board resolutions",
22
+ foreignKey: "boardId",
23
+ },
24
+ committees: {
25
+ machine: "corporate-committee",
26
+ description: "Board committees",
27
+ foreignKey: "boardId",
28
+ },
29
+ officers: {
30
+ machine: "corporate-officers",
31
+ description: "Officers appointed by board",
32
+ foreignKey: "entityId",
33
+ },
34
+ },
35
+ },
36
+ createSchema: {
37
+ required: ["boardId", "entityId", "seats"],
38
+ properties: {
39
+ boardId: {
40
+ type: "string",
41
+ description: "Unique identifier for this board instance",
42
+ immutable: true,
43
+ },
44
+ entityId: {
45
+ type: "string",
46
+ description: "Reference to parent corporate-entity",
47
+ immutable: true,
48
+ },
49
+ seats: {
50
+ type: "object",
51
+ properties: {
52
+ authorized: {
53
+ type: "integer",
54
+ description: "Number of board seats authorized by bylaws",
55
+ },
56
+ filled: { type: "integer" },
57
+ vacant: { type: "integer" },
58
+ },
59
+ },
60
+ boardStructure: {
61
+ type: "object",
62
+ properties: {
63
+ isClassified: {
64
+ type: "boolean",
65
+ description: "Whether board has staggered terms",
66
+ },
67
+ termYears: {
68
+ type: "integer",
69
+ default: 1,
70
+ description: "Director term length",
71
+ },
72
+ classTerms: {
73
+ type: "object",
74
+ properties: {
75
+ CLASS_I: { type: "integer" },
76
+ CLASS_II: { type: "integer" },
77
+ CLASS_III: { type: "integer" },
78
+ },
79
+ },
80
+ },
81
+ },
82
+ quorumRules: {
83
+ type: "object",
84
+ properties: {
85
+ type: {
86
+ type: "string",
87
+ enum: ["MAJORITY", "SUPERMAJORITY", "FIXED_NUMBER"],
88
+ default: "MAJORITY",
89
+ },
90
+ threshold: {
91
+ type: "number",
92
+ description: "Fraction for majority/super, or count for fixed",
93
+ },
94
+ minimumRequired: {
95
+ type: "integer",
96
+ description: "Absolute minimum regardless of formula",
97
+ },
98
+ },
99
+ },
100
+ votingRules: {
101
+ type: "object",
102
+ properties: {
103
+ standardApproval: {
104
+ type: "string",
105
+ enum: ["MAJORITY_PRESENT", "MAJORITY_FULL_BOARD"],
106
+ default: "MAJORITY_PRESENT",
107
+ },
108
+ supermajorityMatters: {
109
+ type: "array",
110
+ items: { type: "string" },
111
+ description: "Action types requiring supermajority",
112
+ },
113
+ supermajorityThreshold: { type: "number", default: 0.6667 },
114
+ },
115
+ },
116
+ },
117
+ },
118
+ stateSchema: {
119
+ properties: {
120
+ boardId: { type: "string", immutable: true },
121
+ entityId: { type: "string", immutable: true },
122
+ directors: {
123
+ type: "array",
124
+ items: { $ref: "#/definitions/Director" },
125
+ computed: true,
126
+ },
127
+ seats: { type: "object" },
128
+ boardStructure: { type: "object" },
129
+ quorumRules: { type: "object" },
130
+ votingRules: { type: "object" },
131
+ currentMeeting: {
132
+ $ref: "#/definitions/Meeting",
133
+ nullable: true,
134
+ computed: true,
135
+ },
136
+ meetingHistory: {
137
+ type: "array",
138
+ items: { $ref: "#/definitions/MeetingRecord" },
139
+ computed: true,
140
+ },
141
+ status: {
142
+ type: "string",
143
+ enum: ["ACTIVE", "IN_MEETING", "QUORUM_LOST"],
144
+ computed: true,
145
+ },
146
+ createdAt: { type: "timestamp", computed: true },
147
+ updatedAt: { type: "timestamp", computed: true },
148
+ },
149
+ },
150
+ eventSchemas: {
151
+ elect_director: {
152
+ description: "Add a new director to the board (election typically done at shareholder meeting or by board to fill vacancy)",
153
+ required: [
154
+ "directorId",
155
+ "name",
156
+ "termStart",
157
+ "termEnd",
158
+ "isIndependent",
159
+ "electionResolutionRef",
160
+ ],
161
+ properties: {
162
+ directorId: { type: "string" },
163
+ name: { type: "string" },
164
+ email: { type: "string" },
165
+ termStart: { type: "string", format: "date" },
166
+ termEnd: { type: "string", format: "date" },
167
+ class: {
168
+ type: "string",
169
+ enum: ["CLASS_I", "CLASS_II", "CLASS_III", "UNCLASSIFIED"],
170
+ },
171
+ isIndependent: { type: "boolean" },
172
+ electionResolutionRef: {
173
+ type: "string",
174
+ description: "Shareholder or board resolution",
175
+ },
176
+ isFillingVacancy: { type: "boolean", default: false },
177
+ },
178
+ },
179
+ resign_director: {
180
+ description: "Director resigns from the board",
181
+ required: ["directorId", "effectiveDate"],
182
+ properties: {
183
+ directorId: { type: "string" },
184
+ effectiveDate: { type: "string", format: "date" },
185
+ reason: { type: "string" },
186
+ resignationLetter: {
187
+ type: "string",
188
+ description: "Document reference",
189
+ },
190
+ },
191
+ },
192
+ remove_for_cause: {
193
+ description: "Remove a director for cause (requires board or shareholder action depending on bylaws)",
194
+ required: [
195
+ "directorId",
196
+ "cause",
197
+ "removalResolutionRef",
198
+ "effectiveDate",
199
+ ],
200
+ properties: {
201
+ directorId: { type: "string" },
202
+ cause: { type: "string" },
203
+ removalResolutionRef: { type: "string" },
204
+ effectiveDate: { type: "string", format: "date" },
205
+ },
206
+ },
207
+ designate_chair: {
208
+ description: "Designate a director as board chair",
209
+ required: ["directorId", "resolutionRef"],
210
+ properties: {
211
+ directorId: { type: "string" },
212
+ resolutionRef: { type: "string" },
213
+ },
214
+ },
215
+ call_meeting: {
216
+ description: "Schedule a board meeting (can be called by chair, CEO, or directors per bylaws)",
217
+ required: [
218
+ "meetingId",
219
+ "type",
220
+ "scheduledDate",
221
+ "calledBy",
222
+ "noticeDate",
223
+ ],
224
+ properties: {
225
+ meetingId: { type: "string" },
226
+ type: {
227
+ type: "string",
228
+ enum: ["REGULAR", "SPECIAL", "ANNUAL", "ORGANIZATIONAL"],
229
+ },
230
+ scheduledDate: { type: "string", format: "date-time" },
231
+ location: { type: "string" },
232
+ isVirtual: { type: "boolean", default: false },
233
+ calledBy: {
234
+ type: "string",
235
+ description: "Director ID or officer title",
236
+ },
237
+ noticeDate: { type: "string", format: "date" },
238
+ agenda: { type: "array", items: { type: "string" } },
239
+ waiverOfNotice: {
240
+ type: "boolean",
241
+ default: false,
242
+ description: "If all directors waive notice",
243
+ },
244
+ },
245
+ },
246
+ record_attendance: {
247
+ description: "Record a director's attendance before meeting opens",
248
+ required: ["directorId", "present"],
249
+ properties: {
250
+ directorId: { type: "string" },
251
+ present: { type: "boolean" },
252
+ arrivedAt: { type: "string", format: "date-time" },
253
+ },
254
+ },
255
+ open_meeting: {
256
+ description: "Officially open the board meeting once quorum is established",
257
+ required: ["openedAt"],
258
+ properties: {
259
+ openedAt: { type: "string", format: "date-time" },
260
+ chairPresiding: {
261
+ type: "string",
262
+ description: "Director ID presiding",
263
+ },
264
+ },
265
+ },
266
+ director_departs: {
267
+ description: "Record a director leaving the meeting (may affect quorum)",
268
+ required: ["directorId", "departedAt"],
269
+ properties: {
270
+ directorId: { type: "string" },
271
+ departedAt: { type: "string", format: "date-time" },
272
+ },
273
+ },
274
+ quorum_lost: {
275
+ description: "Automatic transition when quorum is lost during meeting",
276
+ required: ["lostAt"],
277
+ properties: {
278
+ lostAt: { type: "string", format: "date-time" },
279
+ },
280
+ },
281
+ quorum_restored: {
282
+ description: "Quorum restored after additional director(s) join",
283
+ required: ["restoredAt", "directorId"],
284
+ properties: {
285
+ restoredAt: { type: "string", format: "date-time" },
286
+ directorId: { type: "string", description: "Joining director" },
287
+ },
288
+ },
289
+ adjourn: {
290
+ description: "Adjourn the board meeting",
291
+ required: ["closedAt"],
292
+ properties: {
293
+ closedAt: { type: "string", format: "date-time" },
294
+ minutesRef: {
295
+ type: "string",
296
+ description: "Reference to meeting minutes document",
297
+ },
298
+ resolutionsPassed: { type: "array", items: { type: "string" } },
299
+ adjournedTo: {
300
+ type: "string",
301
+ format: "date-time",
302
+ nullable: true,
303
+ description: "If adjourning to later date",
304
+ },
305
+ },
306
+ },
307
+ update_seats: {
308
+ description: "Change the number of authorized board seats (requires bylaw amendment)",
309
+ required: ["newAuthorizedSeats", "bylawAmendmentRef"],
310
+ properties: {
311
+ newAuthorizedSeats: { type: "integer" },
312
+ bylawAmendmentRef: { type: "string" },
313
+ },
314
+ },
315
+ },
316
+ definitions: {
317
+ Director: {
318
+ type: "object",
319
+ properties: {
320
+ directorId: { type: "string" },
321
+ name: { type: "string" },
322
+ email: { type: "string" },
323
+ termStart: { type: "string", format: "date" },
324
+ termEnd: { type: "string", format: "date" },
325
+ class: {
326
+ type: "string",
327
+ enum: ["CLASS_I", "CLASS_II", "CLASS_III", "UNCLASSIFIED"],
328
+ },
329
+ status: {
330
+ type: "string",
331
+ enum: ["ACTIVE", "RESIGNED", "REMOVED", "TERM_EXPIRED"],
332
+ },
333
+ isIndependent: {
334
+ type: "boolean",
335
+ description: "Independence under applicable rules",
336
+ },
337
+ isChair: { type: "boolean", default: false },
338
+ isLeadIndependent: { type: "boolean", default: false },
339
+ committees: {
340
+ type: "array",
341
+ items: { type: "string" },
342
+ description: "Committee memberships by committee ID",
343
+ },
344
+ electedBy: {
345
+ type: "string",
346
+ description: "Resolution reference for election",
347
+ },
348
+ compensationAgreementRef: { type: "string", nullable: true },
349
+ },
350
+ },
351
+ Meeting: {
352
+ type: "object",
353
+ nullable: true,
354
+ properties: {
355
+ meetingId: { type: "string" },
356
+ type: {
357
+ type: "string",
358
+ enum: ["REGULAR", "SPECIAL", "ANNUAL", "ORGANIZATIONAL"],
359
+ },
360
+ scheduledDate: { type: "string", format: "date-time" },
361
+ location: { type: "string" },
362
+ isVirtual: { type: "boolean" },
363
+ calledBy: { type: "string" },
364
+ noticeDate: { type: "string", format: "date" },
365
+ agenda: { type: "array", items: { type: "string" } },
366
+ attendees: { type: "array", items: { $ref: "#/definitions/Attendee" } },
367
+ quorumPresent: { type: "boolean" },
368
+ quorumCount: { type: "integer" },
369
+ openedAt: { type: "string", format: "date-time", nullable: true },
370
+ closedAt: { type: "string", format: "date-time", nullable: true },
371
+ minutesRef: { type: "string", nullable: true },
372
+ },
373
+ },
374
+ Attendee: {
375
+ type: "object",
376
+ properties: {
377
+ directorId: { type: "string" },
378
+ present: { type: "boolean" },
379
+ arrivedAt: { type: "string", format: "date-time", nullable: true },
380
+ departedAt: { type: "string", format: "date-time", nullable: true },
381
+ viaProxy: { type: "boolean", default: false },
382
+ },
383
+ },
384
+ MeetingRecord: {
385
+ type: "object",
386
+ properties: {
387
+ meetingId: { type: "string" },
388
+ type: { type: "string" },
389
+ date: { type: "string", format: "date" },
390
+ quorumAchieved: { type: "boolean" },
391
+ attendeeCount: { type: "integer" },
392
+ resolutionsPassed: { type: "array", items: { type: "string" } },
393
+ minutesRef: { type: "string" },
394
+ },
395
+ },
396
+ },
397
+ states: {
398
+ ACTIVE: {
399
+ id: "ACTIVE",
400
+ isFinal: false,
401
+ description: "Board is constituted and able to conduct business. Default state between meetings.",
402
+ },
403
+ IN_MEETING: {
404
+ id: "IN_MEETING",
405
+ isFinal: false,
406
+ description: "Board meeting is in session with quorum present. Can take formal actions.",
407
+ },
408
+ QUORUM_LOST: {
409
+ id: "QUORUM_LOST",
410
+ isFinal: false,
411
+ description: "Meeting in progress but quorum lost due to departures. No further action until quorum restored or adjourned.",
412
+ },
413
+ },
414
+ initialState: "ACTIVE",
415
+ transitions: [
416
+ // ACTIVE -> ACTIVE (elect_director)
417
+ {
418
+ from: "ACTIVE",
419
+ to: "ACTIVE",
420
+ eventName: "elect_director",
421
+ guard: {
422
+ and: [
423
+ {
424
+ or: [
425
+ { ">": [{ var: "state.seats.vacant" }, 0] },
426
+ { "==": [{ var: "event.isFillingVacancy" }, true] },
427
+ ],
428
+ },
429
+ { "!=": [{ var: "event.electionResolutionRef" }, null] },
430
+ {
431
+ "!": {
432
+ some: [
433
+ { var: "state.directors" },
434
+ {
435
+ and: [
436
+ {
437
+ "==": [
438
+ { var: ".directorId" },
439
+ { var: "event.directorId" },
440
+ ],
441
+ },
442
+ { "==": [{ var: ".status" }, "ACTIVE"] },
443
+ ],
444
+ },
445
+ ],
446
+ },
447
+ },
448
+ ],
449
+ },
450
+ effect: {
451
+ merge: [
452
+ { var: "state" },
453
+ {
454
+ directors: {
455
+ cat: [
456
+ { var: "state.directors" },
457
+ [
458
+ {
459
+ directorId: { var: "event.directorId" },
460
+ name: { var: "event.name" },
461
+ email: { var: "event.email" },
462
+ termStart: { var: "event.termStart" },
463
+ termEnd: { var: "event.termEnd" },
464
+ class: { var: "event.class" },
465
+ status: "ACTIVE",
466
+ isIndependent: { var: "event.isIndependent" },
467
+ isChair: false,
468
+ isLeadIndependent: false,
469
+ committees: [],
470
+ electedBy: { var: "event.electionResolutionRef" },
471
+ },
472
+ ],
473
+ ],
474
+ },
475
+ seats: {
476
+ merge: [
477
+ { var: "state.seats" },
478
+ {
479
+ filled: { "+": [{ var: "state.seats.filled" }, 1] },
480
+ vacant: { "-": [{ var: "state.seats.vacant" }, 1] },
481
+ },
482
+ ],
483
+ },
484
+ },
485
+ ],
486
+ },
487
+ emits: ["DIRECTOR_ELECTED"],
488
+ },
489
+ // ACTIVE -> ACTIVE (resign_director) and IN_MEETING -> ACTIVE (resign_director)
490
+ {
491
+ from: "ACTIVE",
492
+ to: "ACTIVE",
493
+ eventName: "resign_director",
494
+ guard: {
495
+ some: [
496
+ { var: "state.directors" },
497
+ {
498
+ and: [
499
+ { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
500
+ { "==": [{ var: ".status" }, "ACTIVE"] },
501
+ ],
502
+ },
503
+ ],
504
+ },
505
+ effect: {
506
+ merge: [
507
+ { var: "state" },
508
+ {
509
+ directors: {
510
+ map: [
511
+ { var: "state.directors" },
512
+ {
513
+ if: [
514
+ {
515
+ "==": [
516
+ { var: ".directorId" },
517
+ { var: "event.directorId" },
518
+ ],
519
+ },
520
+ {
521
+ merge: [
522
+ { var: "" },
523
+ {
524
+ status: "RESIGNED",
525
+ termEnd: { var: "event.effectiveDate" },
526
+ },
527
+ ],
528
+ },
529
+ { var: "" },
530
+ ],
531
+ },
532
+ ],
533
+ },
534
+ seats: {
535
+ merge: [
536
+ { var: "state.seats" },
537
+ {
538
+ filled: { "-": [{ var: "state.seats.filled" }, 1] },
539
+ vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
540
+ },
541
+ ],
542
+ },
543
+ },
544
+ ],
545
+ },
546
+ emits: ["DIRECTOR_RESIGNED"],
547
+ },
548
+ {
549
+ from: "IN_MEETING",
550
+ to: "ACTIVE",
551
+ eventName: "resign_director",
552
+ guard: {
553
+ some: [
554
+ { var: "state.directors" },
555
+ {
556
+ and: [
557
+ { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
558
+ { "==": [{ var: ".status" }, "ACTIVE"] },
559
+ ],
560
+ },
561
+ ],
562
+ },
563
+ effect: {
564
+ merge: [
565
+ { var: "state" },
566
+ {
567
+ directors: {
568
+ map: [
569
+ { var: "state.directors" },
570
+ {
571
+ if: [
572
+ {
573
+ "==": [
574
+ { var: ".directorId" },
575
+ { var: "event.directorId" },
576
+ ],
577
+ },
578
+ {
579
+ merge: [
580
+ { var: "" },
581
+ {
582
+ status: "RESIGNED",
583
+ termEnd: { var: "event.effectiveDate" },
584
+ },
585
+ ],
586
+ },
587
+ { var: "" },
588
+ ],
589
+ },
590
+ ],
591
+ },
592
+ seats: {
593
+ merge: [
594
+ { var: "state.seats" },
595
+ {
596
+ filled: { "-": [{ var: "state.seats.filled" }, 1] },
597
+ vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
598
+ },
599
+ ],
600
+ },
601
+ },
602
+ ],
603
+ },
604
+ emits: ["DIRECTOR_RESIGNED"],
605
+ },
606
+ // ACTIVE -> ACTIVE (remove_for_cause)
607
+ {
608
+ from: "ACTIVE",
609
+ to: "ACTIVE",
610
+ eventName: "remove_for_cause",
611
+ guard: {
612
+ some: [
613
+ { var: "state.directors" },
614
+ {
615
+ and: [
616
+ { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
617
+ { "==": [{ var: ".status" }, "ACTIVE"] },
618
+ ],
619
+ },
620
+ ],
621
+ },
622
+ dependencies: [
623
+ {
624
+ machine: "corporate-resolution",
625
+ instanceRef: { var: "event.removalResolutionRef" },
626
+ requiredState: "EXECUTED",
627
+ },
628
+ ],
629
+ effect: {
630
+ merge: [
631
+ { var: "state" },
632
+ {
633
+ directors: {
634
+ map: [
635
+ { var: "state.directors" },
636
+ {
637
+ if: [
638
+ {
639
+ "==": [
640
+ { var: ".directorId" },
641
+ { var: "event.directorId" },
642
+ ],
643
+ },
644
+ {
645
+ merge: [
646
+ { var: "" },
647
+ {
648
+ status: "REMOVED",
649
+ termEnd: { var: "event.effectiveDate" },
650
+ },
651
+ ],
652
+ },
653
+ { var: "" },
654
+ ],
655
+ },
656
+ ],
657
+ },
658
+ seats: {
659
+ merge: [
660
+ { var: "state.seats" },
661
+ {
662
+ filled: { "-": [{ var: "state.seats.filled" }, 1] },
663
+ vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
664
+ },
665
+ ],
666
+ },
667
+ },
668
+ ],
669
+ },
670
+ emits: ["DIRECTOR_REMOVED"],
671
+ },
672
+ // ACTIVE -> ACTIVE (designate_chair)
673
+ {
674
+ from: "ACTIVE",
675
+ to: "ACTIVE",
676
+ eventName: "designate_chair",
677
+ guard: {
678
+ some: [
679
+ { var: "state.directors" },
680
+ {
681
+ and: [
682
+ { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
683
+ { "==": [{ var: ".status" }, "ACTIVE"] },
684
+ ],
685
+ },
686
+ ],
687
+ },
688
+ effect: {
689
+ merge: [
690
+ { var: "state" },
691
+ {
692
+ directors: {
693
+ map: [
694
+ { var: "state.directors" },
695
+ {
696
+ merge: [
697
+ { var: "" },
698
+ {
699
+ isChair: {
700
+ "==": [
701
+ { var: ".directorId" },
702
+ { var: "event.directorId" },
703
+ ],
704
+ },
705
+ },
706
+ ],
707
+ },
708
+ ],
709
+ },
710
+ },
711
+ ],
712
+ },
713
+ },
714
+ // ACTIVE -> ACTIVE (call_meeting)
715
+ {
716
+ from: "ACTIVE",
717
+ to: "ACTIVE",
718
+ eventName: "call_meeting",
719
+ guard: {
720
+ and: [
721
+ {
722
+ or: [
723
+ { "==": [{ var: "event.waiverOfNotice" }, true] },
724
+ {
725
+ ">=": [
726
+ {
727
+ "-": [
728
+ { var: "event.scheduledDate" },
729
+ { var: "event.noticeDate" },
730
+ ],
731
+ },
732
+ 172800000, // 2 days in ms
733
+ ],
734
+ },
735
+ ],
736
+ },
737
+ {
738
+ or: [
739
+ { "==": [{ var: "state.currentMeeting" }, null] },
740
+ { "!=": [{ var: "state.currentMeeting.closedAt" }, null] },
741
+ ],
742
+ },
743
+ ],
744
+ },
745
+ effect: {
746
+ merge: [
747
+ { var: "state" },
748
+ {
749
+ currentMeeting: {
750
+ meetingId: { var: "event.meetingId" },
751
+ type: { var: "event.type" },
752
+ scheduledDate: { var: "event.scheduledDate" },
753
+ location: { var: "event.location" },
754
+ isVirtual: { var: "event.isVirtual" },
755
+ calledBy: { var: "event.calledBy" },
756
+ noticeDate: { var: "event.noticeDate" },
757
+ agenda: { var: "event.agenda" },
758
+ attendees: [],
759
+ quorumPresent: false,
760
+ quorumCount: 0,
761
+ },
762
+ },
763
+ ],
764
+ },
765
+ emits: ["BOARD_MEETING_SCHEDULED"],
766
+ },
767
+ // ACTIVE -> ACTIVE (record_attendance)
768
+ {
769
+ from: "ACTIVE",
770
+ to: "ACTIVE",
771
+ eventName: "record_attendance",
772
+ guard: {
773
+ and: [
774
+ { "!=": [{ var: "state.currentMeeting" }, null] },
775
+ { "==": [{ var: "state.currentMeeting.openedAt" }, null] },
776
+ {
777
+ some: [
778
+ { var: "state.directors" },
779
+ {
780
+ and: [
781
+ {
782
+ "==": [{ var: ".directorId" }, { var: "event.directorId" }],
783
+ },
784
+ { "==": [{ var: ".status" }, "ACTIVE"] },
785
+ ],
786
+ },
787
+ ],
788
+ },
789
+ ],
790
+ },
791
+ effect: {
792
+ merge: [
793
+ { var: "state" },
794
+ {
795
+ currentMeeting: {
796
+ merge: [
797
+ { var: "state.currentMeeting" },
798
+ {
799
+ attendees: {
800
+ cat: [
801
+ { var: "state.currentMeeting.attendees" },
802
+ [
803
+ {
804
+ directorId: { var: "event.directorId" },
805
+ present: { var: "event.present" },
806
+ arrivedAt: { var: "event.arrivedAt" },
807
+ viaProxy: false,
808
+ },
809
+ ],
810
+ ],
811
+ },
812
+ },
813
+ ],
814
+ },
815
+ },
816
+ ],
817
+ },
818
+ },
819
+ // ACTIVE -> IN_MEETING (open_meeting)
820
+ {
821
+ from: "ACTIVE",
822
+ to: "IN_MEETING",
823
+ eventName: "open_meeting",
824
+ guard: {
825
+ and: [
826
+ { "!=": [{ var: "state.currentMeeting" }, null] },
827
+ { "==": [{ var: "state.currentMeeting.openedAt" }, null] },
828
+ { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
829
+ ],
830
+ },
831
+ effect: {
832
+ merge: [
833
+ { var: "state" },
834
+ {
835
+ status: "IN_MEETING",
836
+ currentMeeting: {
837
+ merge: [
838
+ { var: "state.currentMeeting" },
839
+ { openedAt: { var: "event.openedAt" } },
840
+ ],
841
+ },
842
+ },
843
+ ],
844
+ },
845
+ emits: ["BOARD_MEETING_OPENED"],
846
+ },
847
+ // IN_MEETING -> IN_MEETING (director_departs)
848
+ {
849
+ from: "IN_MEETING",
850
+ to: "IN_MEETING",
851
+ eventName: "director_departs",
852
+ guard: { "==": [1, 1] },
853
+ effect: {
854
+ merge: [
855
+ { var: "state" },
856
+ {
857
+ currentMeeting: {
858
+ merge: [
859
+ { var: "state.currentMeeting" },
860
+ {
861
+ attendees: {
862
+ map: [
863
+ { var: "state.currentMeeting.attendees" },
864
+ {
865
+ if: [
866
+ {
867
+ "==": [
868
+ { var: ".directorId" },
869
+ { var: "event.directorId" },
870
+ ],
871
+ },
872
+ {
873
+ merge: [
874
+ { var: "" },
875
+ {
876
+ present: false,
877
+ departedAt: { var: "event.departedAt" },
878
+ },
879
+ ],
880
+ },
881
+ { var: "" },
882
+ ],
883
+ },
884
+ ],
885
+ },
886
+ },
887
+ ],
888
+ },
889
+ },
890
+ ],
891
+ },
892
+ },
893
+ // IN_MEETING -> QUORUM_LOST
894
+ {
895
+ from: "IN_MEETING",
896
+ to: "QUORUM_LOST",
897
+ eventName: "quorum_lost",
898
+ guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, false] },
899
+ effect: {
900
+ merge: [{ var: "state" }, { status: "QUORUM_LOST" }],
901
+ },
902
+ emits: ["BOARD_QUORUM_LOST"],
903
+ },
904
+ // QUORUM_LOST -> IN_MEETING
905
+ {
906
+ from: "QUORUM_LOST",
907
+ to: "IN_MEETING",
908
+ eventName: "quorum_restored",
909
+ guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
910
+ effect: {
911
+ merge: [{ var: "state" }, { status: "IN_MEETING" }],
912
+ },
913
+ emits: ["BOARD_QUORUM_RESTORED"],
914
+ },
915
+ // IN_MEETING -> ACTIVE (adjourn)
916
+ {
917
+ from: "IN_MEETING",
918
+ to: "ACTIVE",
919
+ eventName: "adjourn",
920
+ guard: { "==": [1, 1] },
921
+ effect: {
922
+ merge: [
923
+ { var: "state" },
924
+ {
925
+ status: "ACTIVE",
926
+ currentMeeting: null,
927
+ meetingHistory: {
928
+ cat: [
929
+ { var: "state.meetingHistory" },
930
+ [
931
+ {
932
+ meetingId: { var: "state.currentMeeting.meetingId" },
933
+ type: { var: "state.currentMeeting.type" },
934
+ date: { var: "state.currentMeeting.scheduledDate" },
935
+ quorumAchieved: {
936
+ var: "state.currentMeeting.quorumPresent",
937
+ },
938
+ attendeeCount: { var: "state.currentMeeting.quorumCount" },
939
+ resolutionsPassed: { var: "event.resolutionsPassed" },
940
+ minutesRef: { var: "event.minutesRef" },
941
+ },
942
+ ],
943
+ ],
944
+ },
945
+ },
946
+ ],
947
+ },
948
+ emits: ["BOARD_MEETING_ADJOURNED"],
949
+ },
950
+ // QUORUM_LOST -> ACTIVE (adjourn)
951
+ {
952
+ from: "QUORUM_LOST",
953
+ to: "ACTIVE",
954
+ eventName: "adjourn",
955
+ guard: { "==": [1, 1] },
956
+ effect: {
957
+ merge: [
958
+ { var: "state" },
959
+ {
960
+ status: "ACTIVE",
961
+ currentMeeting: null,
962
+ meetingHistory: {
963
+ cat: [
964
+ { var: "state.meetingHistory" },
965
+ [
966
+ {
967
+ meetingId: { var: "state.currentMeeting.meetingId" },
968
+ type: { var: "state.currentMeeting.type" },
969
+ date: { var: "state.currentMeeting.scheduledDate" },
970
+ quorumAchieved: {
971
+ var: "state.currentMeeting.quorumPresent",
972
+ },
973
+ attendeeCount: { var: "state.currentMeeting.quorumCount" },
974
+ resolutionsPassed: { var: "event.resolutionsPassed" },
975
+ minutesRef: { var: "event.minutesRef" },
976
+ },
977
+ ],
978
+ ],
979
+ },
980
+ },
981
+ ],
982
+ },
983
+ emits: ["BOARD_MEETING_ADJOURNED"],
984
+ },
985
+ // ACTIVE -> ACTIVE (update_seats)
986
+ {
987
+ from: "ACTIVE",
988
+ to: "ACTIVE",
989
+ eventName: "update_seats",
990
+ guard: {
991
+ ">=": [
992
+ { var: "event.newAuthorizedSeats" },
993
+ { var: "state.seats.filled" },
994
+ ],
995
+ },
996
+ effect: {
997
+ merge: [
998
+ { var: "state" },
999
+ {
1000
+ seats: {
1001
+ merge: [
1002
+ { var: "state.seats" },
1003
+ {
1004
+ authorized: { var: "event.newAuthorizedSeats" },
1005
+ vacant: {
1006
+ "-": [
1007
+ { var: "event.newAuthorizedSeats" },
1008
+ { var: "state.seats.filled" },
1009
+ ],
1010
+ },
1011
+ },
1012
+ ],
1013
+ },
1014
+ },
1015
+ ],
1016
+ },
1017
+ },
1018
+ ],
1019
+ });