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