@headless-lms/core 0.1.0 → 0.3.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 (249) hide show
  1. package/dist/assets/events.d.ts +90 -9
  2. package/dist/assets/events.js +19 -3
  3. package/dist/assets/events.js.map +1 -1
  4. package/dist/assets/file-urls.d.ts +20 -0
  5. package/dist/assets/file-urls.js +25 -0
  6. package/dist/assets/file-urls.js.map +1 -0
  7. package/dist/assets/index.d.ts +5 -4
  8. package/dist/assets/index.js +3 -2
  9. package/dist/assets/model.d.ts +2 -2
  10. package/dist/assets/ports.d.ts +45 -15
  11. package/dist/assets/service.d.ts +39 -7
  12. package/dist/assets/service.js +292 -37
  13. package/dist/assets/service.js.map +1 -1
  14. package/dist/automations/actions.d.ts +12 -15
  15. package/dist/automations/actions.js +188 -30
  16. package/dist/automations/actions.js.map +1 -1
  17. package/dist/automations/catalog.d.ts +5 -1
  18. package/dist/automations/catalog.js +514 -197
  19. package/dist/automations/catalog.js.map +1 -1
  20. package/dist/automations/community-derivations.d.ts +14 -0
  21. package/dist/automations/community-derivations.js +439 -0
  22. package/dist/automations/community-derivations.js.map +1 -0
  23. package/dist/automations/community-mail.d.ts +112 -0
  24. package/dist/automations/community-mail.js +90 -0
  25. package/dist/automations/community-mail.js.map +1 -0
  26. package/dist/automations/community-notifications.d.ts +16 -0
  27. package/dist/automations/community-notifications.js +84 -0
  28. package/dist/automations/community-notifications.js.map +1 -0
  29. package/dist/automations/events.d.ts +74 -24
  30. package/dist/automations/events.js +5 -5
  31. package/dist/automations/events.js.map +1 -1
  32. package/dist/automations/index.d.ts +7 -5
  33. package/dist/automations/index.js +3 -2
  34. package/dist/automations/model.d.ts +20 -3
  35. package/dist/automations/model.js +36 -3
  36. package/dist/automations/model.js.map +1 -1
  37. package/dist/automations/ports.d.ts +27 -8
  38. package/dist/automations/schedule.d.ts +6 -0
  39. package/dist/automations/schedule.js +41 -0
  40. package/dist/automations/schedule.js.map +1 -0
  41. package/dist/automations/seeds.d.ts +17 -0
  42. package/dist/automations/seeds.js +235 -0
  43. package/dist/automations/seeds.js.map +1 -0
  44. package/dist/automations/service.d.ts +41 -6
  45. package/dist/automations/service.js +542 -59
  46. package/dist/automations/service.js.map +1 -1
  47. package/dist/automations/types.d.ts +2 -2
  48. package/dist/automations/webhook-signing.d.ts +7 -0
  49. package/dist/automations/webhook-signing.js +22 -0
  50. package/dist/automations/webhook-signing.js.map +1 -0
  51. package/dist/content/events.d.ts +1013 -25
  52. package/dist/content/events.js +168 -19
  53. package/dist/content/events.js.map +1 -1
  54. package/dist/content/index.d.ts +5 -5
  55. package/dist/content/index.js +2 -2
  56. package/dist/content/model.d.ts +2 -2
  57. package/dist/content/ports.d.ts +109 -25
  58. package/dist/content/service.d.ts +68 -23
  59. package/dist/content/service.js +647 -60
  60. package/dist/content/service.js.map +1 -1
  61. package/dist/content/types.d.ts +2 -2
  62. package/dist/discussion/authors.d.ts +10 -0
  63. package/dist/discussion/authors.js +23 -0
  64. package/dist/discussion/authors.js.map +1 -0
  65. package/dist/discussion/chats.d.ts +104 -0
  66. package/dist/discussion/chats.js +798 -0
  67. package/dist/discussion/chats.js.map +1 -0
  68. package/dist/discussion/events.d.ts +633 -14
  69. package/dist/discussion/events.js +134 -5
  70. package/dist/discussion/events.js.map +1 -1
  71. package/dist/discussion/index.d.ts +7 -3
  72. package/dist/discussion/index.js +4 -1
  73. package/dist/discussion/model.d.ts +1 -2
  74. package/dist/discussion/ports.d.ts +288 -27
  75. package/dist/discussion/ports.js +6 -1
  76. package/dist/discussion/ports.js.map +1 -0
  77. package/dist/discussion/posts.d.ts +103 -0
  78. package/dist/discussion/posts.js +723 -0
  79. package/dist/discussion/posts.js.map +1 -0
  80. package/dist/discussion/service.d.ts +33 -11
  81. package/dist/discussion/service.js +297 -81
  82. package/dist/discussion/service.js.map +1 -1
  83. package/dist/entitlements/events.d.ts +264 -13
  84. package/dist/entitlements/events.js +49 -5
  85. package/dist/entitlements/events.js.map +1 -1
  86. package/dist/entitlements/index.d.ts +5 -4
  87. package/dist/entitlements/index.js +2 -1
  88. package/dist/entitlements/model.d.ts +3 -2
  89. package/dist/entitlements/ports.d.ts +124 -11
  90. package/dist/entitlements/rules.d.ts +12 -0
  91. package/dist/entitlements/rules.js +17 -0
  92. package/dist/entitlements/rules.js.map +1 -0
  93. package/dist/entitlements/service.d.ts +54 -3
  94. package/dist/entitlements/service.js +473 -2
  95. package/dist/entitlements/service.js.map +1 -1
  96. package/dist/identity/access.d.ts +6 -0
  97. package/dist/identity/access.js +7 -0
  98. package/dist/identity/access.js.map +1 -0
  99. package/dist/identity/events.d.ts +17 -3
  100. package/dist/identity/events.js +12 -2
  101. package/dist/identity/events.js.map +1 -1
  102. package/dist/identity/index.d.ts +6 -4
  103. package/dist/identity/index.js +3 -1
  104. package/dist/identity/model.d.ts +2 -1
  105. package/dist/identity/notifications.d.ts +27 -0
  106. package/dist/identity/notifications.js +101 -0
  107. package/dist/identity/notifications.js.map +1 -0
  108. package/dist/identity/ports.d.ts +76 -3
  109. package/dist/identity/service.d.ts +17 -3
  110. package/dist/identity/service.js +73 -5
  111. package/dist/identity/service.js.map +1 -1
  112. package/dist/integrations/events.d.ts +27 -3
  113. package/dist/integrations/events.js +15 -3
  114. package/dist/integrations/events.js.map +1 -1
  115. package/dist/integrations/model.js +1 -1
  116. package/dist/integrations/model.js.map +1 -1
  117. package/dist/integrations/service.js +2 -2
  118. package/dist/integrations/service.js.map +1 -1
  119. package/dist/organizations/access-scopes.d.ts +19 -0
  120. package/dist/organizations/access-scopes.js +89 -0
  121. package/dist/organizations/access-scopes.js.map +1 -0
  122. package/dist/organizations/events.d.ts +234 -25
  123. package/dist/organizations/events.js +58 -9
  124. package/dist/organizations/events.js.map +1 -1
  125. package/dist/organizations/index.d.ts +8 -7
  126. package/dist/organizations/index.js +4 -3
  127. package/dist/organizations/members.d.ts +8 -5
  128. package/dist/organizations/members.js.map +1 -1
  129. package/dist/organizations/ports.d.ts +20 -21
  130. package/dist/organizations/roles.d.ts +6 -10
  131. package/dist/organizations/roles.js +19 -7
  132. package/dist/organizations/roles.js.map +1 -1
  133. package/dist/organizations/service.d.ts +28 -14
  134. package/dist/organizations/service.js +274 -105
  135. package/dist/organizations/service.js.map +1 -1
  136. package/dist/organizations/types.d.ts +2 -11
  137. package/dist/progress/events.d.ts +34 -2
  138. package/dist/progress/events.js +15 -2
  139. package/dist/progress/events.js.map +1 -1
  140. package/dist/progress/index.d.ts +2 -2
  141. package/dist/progress/ports.d.ts +6 -1
  142. package/dist/progress/service.d.ts +5 -3
  143. package/dist/progress/service.js +9 -3
  144. package/dist/progress/service.js.map +1 -1
  145. package/dist/reporting/admin/index.d.ts +4 -0
  146. package/dist/reporting/admin/index.js +2 -0
  147. package/dist/reporting/admin/model.d.ts +108 -0
  148. package/dist/reporting/admin/ports.d.ts +27 -0
  149. package/dist/reporting/admin/service.d.ts +22 -0
  150. package/dist/reporting/admin/service.js +38 -0
  151. package/dist/reporting/admin/service.js.map +1 -0
  152. package/dist/reporting/member/index.d.ts +5 -0
  153. package/dist/reporting/member/index.js +2 -0
  154. package/dist/reporting/member/model.d.ts +124 -0
  155. package/dist/reporting/member/ports.d.ts +45 -0
  156. package/dist/reporting/member/service.d.ts +73 -0
  157. package/dist/reporting/member/service.js +286 -0
  158. package/dist/reporting/member/service.js.map +1 -0
  159. package/dist/shared/actor.d.ts +9 -0
  160. package/dist/shared/errors.d.ts +7 -1
  161. package/dist/shared/errors.js +10 -1
  162. package/dist/shared/errors.js.map +1 -1
  163. package/dist/shared/events.d.ts +5 -3
  164. package/dist/shared/events.js +1 -0
  165. package/dist/shared/events.js.map +1 -1
  166. package/dist/shared/id.d.ts +12 -0
  167. package/dist/shared/id.js +13 -1
  168. package/dist/shared/id.js.map +1 -1
  169. package/dist/shared/mailer.d.ts +6 -1
  170. package/dist/shared/mailer.js.map +1 -1
  171. package/dist/shared/network.d.ts +10 -0
  172. package/dist/shared/network.js +211 -0
  173. package/dist/shared/network.js.map +1 -0
  174. package/dist/shared/settings.js.map +1 -1
  175. package/dist/types/assets.d.ts +2 -2
  176. package/dist/types/automations.d.ts +21 -2
  177. package/dist/types/content.d.ts +2 -2
  178. package/dist/types/discussion.d.ts +12 -3
  179. package/dist/types/email-templates.d.ts +124 -1
  180. package/dist/types/entitlements.d.ts +2 -2
  181. package/dist/types/events.d.ts +3 -3
  182. package/dist/types/identity.d.ts +48 -2
  183. package/dist/types/index.d.ts +10 -10
  184. package/dist/types/organizations.d.ts +2 -2
  185. package/dist/types/ports.d.ts +7 -1
  186. package/dist/types/schemas/assets.d.ts +67 -36
  187. package/dist/types/schemas/assets.js +19 -13
  188. package/dist/types/schemas/assets.js.map +1 -1
  189. package/dist/types/schemas/automations.d.ts +88 -4
  190. package/dist/types/schemas/automations.js +46 -6
  191. package/dist/types/schemas/automations.js.map +1 -1
  192. package/dist/types/schemas/content.d.ts +385 -20
  193. package/dist/types/schemas/content.js +178 -15
  194. package/dist/types/schemas/content.js.map +1 -1
  195. package/dist/types/schemas/credentials.js.map +1 -1
  196. package/dist/types/schemas/discussion.d.ts +379 -4
  197. package/dist/types/schemas/discussion.js +209 -7
  198. package/dist/types/schemas/discussion.js.map +1 -1
  199. package/dist/types/schemas/entitlements.d.ts +44 -4
  200. package/dist/types/schemas/entitlements.js +32 -4
  201. package/dist/types/schemas/entitlements.js.map +1 -1
  202. package/dist/types/schemas/identity.d.ts +115 -5
  203. package/dist/types/schemas/identity.js +59 -6
  204. package/dist/types/schemas/identity.js.map +1 -1
  205. package/dist/types/schemas/index.d.ts +9 -9
  206. package/dist/types/schemas/index.js +9 -9
  207. package/dist/types/schemas/integrations.js.map +1 -1
  208. package/dist/types/schemas/organizations.d.ts +27 -5
  209. package/dist/types/schemas/organizations.js +14 -7
  210. package/dist/types/schemas/organizations.js.map +1 -1
  211. package/dist/types/schemas/outbox.d.ts +1 -0
  212. package/dist/types/schemas/outbox.js +1 -0
  213. package/dist/types/schemas/outbox.js.map +1 -1
  214. package/dist/types/schemas/progress.d.ts +1 -0
  215. package/dist/types/schemas/progress.js +1 -0
  216. package/dist/types/schemas/progress.js.map +1 -1
  217. package/dist/types/schemas/settings.js.map +1 -1
  218. package/dist/types/schemas/shared.d.ts +4 -1
  219. package/dist/types/schemas/shared.js +7 -1
  220. package/dist/types/schemas/shared.js.map +1 -1
  221. package/dist/types/shared.d.ts +1 -1
  222. package/package.json +2 -2
  223. package/dist/reporting/dashboard/index.d.ts +0 -4
  224. package/dist/reporting/dashboard/index.js +0 -2
  225. package/dist/reporting/dashboard/model.d.ts +0 -14
  226. package/dist/reporting/dashboard/ports.d.ts +0 -13
  227. package/dist/reporting/dashboard/service.d.ts +0 -19
  228. package/dist/reporting/dashboard/service.js +0 -20
  229. package/dist/reporting/dashboard/service.js.map +0 -1
  230. package/dist/reporting/learn/index.d.ts +0 -5
  231. package/dist/reporting/learn/index.js +0 -2
  232. package/dist/reporting/learn/model.d.ts +0 -23
  233. package/dist/reporting/learn/ports.d.ts +0 -42
  234. package/dist/reporting/learn/service.d.ts +0 -48
  235. package/dist/reporting/learn/service.js +0 -111
  236. package/dist/reporting/learn/service.js.map +0 -1
  237. package/dist/reporting/students/index.d.ts +0 -4
  238. package/dist/reporting/students/index.js +0 -2
  239. package/dist/reporting/students/model.d.ts +0 -31
  240. package/dist/reporting/students/ports.d.ts +0 -13
  241. package/dist/reporting/students/ports.js +0 -1
  242. package/dist/reporting/students/service.d.ts +0 -19
  243. package/dist/reporting/students/service.js +0 -20
  244. package/dist/reporting/students/service.js.map +0 -1
  245. /package/dist/reporting/{dashboard → admin}/model.js +0 -0
  246. /package/dist/reporting/{dashboard → admin}/ports.js +0 -0
  247. /package/dist/reporting/{learn → member}/model.js +0 -0
  248. /package/dist/reporting/{learn → member}/ports.js +0 -0
  249. /package/dist/{reporting/students/model.js → shared/actor.js} +0 -0
@@ -0,0 +1,112 @@
1
+ import { DomainEvent, JsonValue } from "../types/shared.js";
2
+ import { Logger } from "../types/ports.js";
3
+ import { EmailTemplateId, EmailTemplateParams } from "../types/email-templates.js";
4
+ import { GrantEntitlementInput } from "../types/schemas/entitlements.js";
5
+ import { WebhookSender } from "../types/automations.js";
6
+ import { ChatStatus } from "../types/schemas/discussion.js";
7
+ import "../types/index.js";
8
+ import { CredentialStore } from "../shared/ports.js";
9
+ import { NotificationDesk } from "../identity/ports.js";
10
+ import { Mailer, MailerLookups } from "../shared/mailer.js";
11
+ import "../identity/index.js";
12
+ import "../entitlements/index.js";
13
+ import "./ports.js";
14
+ //#region src/automations/community-mail.d.ts
15
+ declare const MESSAGE_EXCERPT = 140;
16
+ declare const POST_EXCERPT = 280;
17
+ declare const MESSAGE_BATCH_MS: number;
18
+ interface EmailRecipient<K extends EmailTemplateId = EmailTemplateId> {
19
+ to: string;
20
+ orgUserId: string;
21
+ userId: string;
22
+ params: EmailTemplateParams[K];
23
+ }
24
+ interface CommunityMailReads {
25
+ communityTitle(orgId: string, communityId: string): Promise<string | null>;
26
+ space(orgId: string, spaceId: string): Promise<{
27
+ name: string;
28
+ communityId: string;
29
+ capacity: number | null;
30
+ } | null>;
31
+ openSpaceNames(orgId: string, orgUserId: string, communityId: string): Promise<string[]>;
32
+ communitiesOpenedBy(orgId: string, grant: {
33
+ contentId: string | null;
34
+ bundleId: string | null;
35
+ }): Promise<string[]>;
36
+ communityMembersAmong(orgId: string, communityId: string, ids: string[]): Promise<string[]>;
37
+ spaceOpenersAmong(orgId: string, spaceId: string, ids: string[]): Promise<string[]>;
38
+ spaceOpeners(orgId: string, spaceId: string): Promise<string[]>;
39
+ moderationAudience(orgId: string, communityId: string): Promise<string[]>;
40
+ staffIds(orgId: string): Promise<string[]>;
41
+ displayName(orgId: string, orgUserId: string): Promise<string>;
42
+ followerIds(orgId: string, postId: string): Promise<string[]>;
43
+ comment(orgId: string, commentId: string): Promise<{
44
+ orgUserId: string;
45
+ postId: string | null;
46
+ body: string;
47
+ } | null>;
48
+ post(orgId: string, postId: string): Promise<{
49
+ title: string;
50
+ body: string;
51
+ spaceId: string;
52
+ orgUserId: string;
53
+ communityId: string;
54
+ } | null>;
55
+ chat(orgId: string, chatId: string): Promise<{
56
+ communityId: string;
57
+ kind: 'direct' | 'group';
58
+ status: ChatStatus;
59
+ createdBy: string | null;
60
+ participants: {
61
+ orgUserId: string;
62
+ muted: boolean;
63
+ mutedUntil: Date | null;
64
+ leftAt: Date | null;
65
+ }[];
66
+ } | null>;
67
+ latestMessageBody(orgId: string, chatId: string): Promise<string | null>;
68
+ pairBlocked(orgId: string, communityId: string, a: string, b: string): Promise<boolean>;
69
+ activeMemberCount(orgId: string, spaceId: string): Promise<number>;
70
+ memberCommunityTitles(orgId: string, orgUserId: string): Promise<{
71
+ id: string;
72
+ title: string;
73
+ }[]>;
74
+ recentMessageRecipients(orgId: string, automationId: string, chatId: string, since: Date): Promise<string[]>;
75
+ }
76
+ interface ScheduledWork {
77
+ publishDuePosts(orgId: string, now: Date): Promise<void>;
78
+ expireDueGrants(orgId: string, now: Date): Promise<void>;
79
+ sendDigest(orgId: string, now: Date): Promise<void>;
80
+ hasDuePosts(orgId: string, now: Date): Promise<boolean>;
81
+ hasDueGrants(orgId: string, now: Date): Promise<boolean>;
82
+ removeUnattachedUploads(orgId: string, now: Date): Promise<void>;
83
+ hasUnattachedUploads(orgId: string, now: Date): Promise<boolean>;
84
+ }
85
+ interface GrantWriter {
86
+ grant(orgId: string, input: GrantEntitlementInput): Promise<unknown>;
87
+ }
88
+ interface ActionDeps {
89
+ mailer: Pick<Mailer, 'send'>;
90
+ lookups: MailerLookups;
91
+ credentials: Pick<CredentialStore, 'reveal'>;
92
+ webhooks: WebhookSender;
93
+ mail: CommunityMailReads;
94
+ grants: GrantWriter;
95
+ desk: NotificationDesk;
96
+ scheduledWork: ScheduledWork;
97
+ automationId: string;
98
+ actionInput: Record<string, JsonValue>;
99
+ logger?: Logger;
100
+ }
101
+ declare const emptyCommunityMail: CommunityMailReads;
102
+ declare const emptyNotificationDesk: NotificationDesk;
103
+ declare const emptyScheduledWork: ScheduledWork;
104
+ declare function actorOf(event: DomainEvent): string | undefined;
105
+ declare function previousStatusOf(event: DomainEvent): string | undefined;
106
+ declare function excerpt(value: string, max: number): string;
107
+ declare function seededCommunityId(deps: ActionDeps): string | null;
108
+ declare function firedAtOf(event: DomainEvent): Date;
109
+ declare function address<K extends EmailTemplateId>(deps: ActionDeps, event: DomainEvent, orgId: string, orgUserIds: string[], params: EmailTemplateParams[K]): Promise<EmailRecipient<K>[] | undefined>;
110
+ //#endregion
111
+ export { ActionDeps, CommunityMailReads, EmailRecipient, GrantWriter, MESSAGE_BATCH_MS, MESSAGE_EXCERPT, POST_EXCERPT, ScheduledWork, actorOf, address, emptyCommunityMail, emptyNotificationDesk, emptyScheduledWork, excerpt, firedAtOf, previousStatusOf, seededCommunityId };
112
+ //# sourceMappingURL=community-mail.d.ts.map
@@ -0,0 +1,90 @@
1
+ import { noopLogger } from "../shared/logger.js";
2
+ //#region src/automations/community-mail.ts
3
+ const MESSAGE_EXCERPT = 140;
4
+ const POST_EXCERPT = 280;
5
+ const MESSAGE_BATCH_MS = 900 * 1e3;
6
+ const emptyCommunityMail = {
7
+ communityTitle: async () => null,
8
+ space: async () => null,
9
+ openSpaceNames: async () => [],
10
+ communitiesOpenedBy: async () => [],
11
+ communityMembersAmong: async () => [],
12
+ spaceOpenersAmong: async () => [],
13
+ spaceOpeners: async () => [],
14
+ moderationAudience: async () => [],
15
+ staffIds: async () => [],
16
+ displayName: async () => "A member",
17
+ followerIds: async () => [],
18
+ comment: async () => null,
19
+ post: async () => null,
20
+ chat: async () => null,
21
+ latestMessageBody: async () => null,
22
+ pairBlocked: async () => false,
23
+ activeMemberCount: async () => 0,
24
+ memberCommunityTitles: async () => [],
25
+ recentMessageRecipients: async () => []
26
+ };
27
+ const emptyNotificationDesk = {
28
+ notify: async () => {},
29
+ preferencesFor: async () => ({})
30
+ };
31
+ const emptyScheduledWork = {
32
+ publishDuePosts: async () => {},
33
+ expireDueGrants: async () => {},
34
+ sendDigest: async () => {},
35
+ hasDuePosts: async () => false,
36
+ hasDueGrants: async () => false,
37
+ removeUnattachedUploads: async () => {},
38
+ hasUnattachedUploads: async () => false
39
+ };
40
+ function actorOf(event) {
41
+ const value = event.metadata?.actorOrgUserId;
42
+ return typeof value === "string" ? value : void 0;
43
+ }
44
+ function previousStatusOf(event) {
45
+ const value = event.metadata?.previousStatus;
46
+ return typeof value === "string" ? value : void 0;
47
+ }
48
+ function excerpt(value, max) {
49
+ const flat = value.replace(/\s+/g, " ").trim();
50
+ return flat.length <= max ? flat : flat.slice(0, max);
51
+ }
52
+ function seededCommunityId(deps) {
53
+ const id = deps.actionInput["communityId"];
54
+ return typeof id === "string" ? id : null;
55
+ }
56
+ function firedAtOf(event) {
57
+ if (typeof event.data === "object" && event.data !== null && "firedAt" in event.data) {
58
+ const firedAt = event.data.firedAt;
59
+ if (typeof firedAt === "string") return new Date(firedAt);
60
+ }
61
+ return new Date(event.occurredAt);
62
+ }
63
+ async function address(deps, event, orgId, orgUserIds, params) {
64
+ const actor = actorOf(event);
65
+ const wanted = [...new Set(orgUserIds)].filter((id) => id !== actor);
66
+ if (wanted.length === 0) return [];
67
+ const recipients = [];
68
+ const logger = deps.logger ?? noopLogger;
69
+ for (const orgUserId of wanted) {
70
+ const person = await deps.lookups.orgUserPerson(orgId, orgUserId);
71
+ if (!person) {
72
+ logger.warn("email skipped: recipient has no address", {
73
+ orgId,
74
+ orgUserId
75
+ });
76
+ continue;
77
+ }
78
+ recipients.push({
79
+ to: person.email,
80
+ orgUserId,
81
+ userId: person.userId,
82
+ params
83
+ });
84
+ }
85
+ return recipients;
86
+ }
87
+ //#endregion
88
+ export { MESSAGE_BATCH_MS, MESSAGE_EXCERPT, POST_EXCERPT, actorOf, address, emptyCommunityMail, emptyNotificationDesk, emptyScheduledWork, excerpt, firedAtOf, previousStatusOf, seededCommunityId };
89
+
90
+ //# sourceMappingURL=community-mail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-mail.js","names":[],"sources":["../../src/automations/community-mail.ts"],"sourcesContent":["import type { GrantEntitlementInput } from '../entitlements/index.js';\nimport type { NotificationDesk } from '../identity/index.js';\nimport type {\n ChatStatus,\n EmailTemplateId,\n EmailTemplateParams,\n JsonValue,\n} from '../types/index.js';\nimport type { Mailer, MailerLookups } from '../shared/mailer.js';\nimport type { CredentialStore, DomainEvent, Logger } from '../shared/ports.js';\nimport { noopLogger } from '../shared/logger.js';\nimport type { WebhookSender } from './ports.js';\n\nexport const MESSAGE_EXCERPT = 140;\nexport const POST_EXCERPT = 280;\nexport const MESSAGE_BATCH_MS = 15 * 60 * 1000;\n\nexport interface EmailRecipient<K extends EmailTemplateId = EmailTemplateId> {\n to: string;\n orgUserId: string;\n userId: string;\n params: EmailTemplateParams[K];\n}\n\nexport interface CommunityMailReads {\n communityTitle(orgId: string, communityId: string): Promise<string | null>;\n space(\n orgId: string,\n spaceId: string,\n ): Promise<{ name: string; communityId: string; capacity: number | null } | null>;\n openSpaceNames(orgId: string, orgUserId: string, communityId: string): Promise<string[]>;\n communitiesOpenedBy(\n orgId: string,\n grant: { contentId: string | null; bundleId: string | null },\n ): Promise<string[]>;\n communityMembersAmong(orgId: string, communityId: string, ids: string[]): Promise<string[]>;\n spaceOpenersAmong(orgId: string, spaceId: string, ids: string[]): Promise<string[]>;\n spaceOpeners(orgId: string, spaceId: string): Promise<string[]>;\n moderationAudience(orgId: string, communityId: string): Promise<string[]>;\n staffIds(orgId: string): Promise<string[]>;\n displayName(orgId: string, orgUserId: string): Promise<string>;\n followerIds(orgId: string, postId: string): Promise<string[]>;\n comment(\n orgId: string,\n commentId: string,\n ): Promise<{ orgUserId: string; postId: string | null; body: string } | null>;\n post(\n orgId: string,\n postId: string,\n ): Promise<{\n title: string;\n body: string;\n spaceId: string;\n orgUserId: string;\n communityId: string;\n } | null>;\n chat(\n orgId: string,\n chatId: string,\n ): Promise<{\n communityId: string;\n kind: 'direct' | 'group';\n status: ChatStatus;\n createdBy: string | null;\n participants: {\n orgUserId: string;\n muted: boolean;\n mutedUntil: Date | null;\n leftAt: Date | null;\n }[];\n } | null>;\n latestMessageBody(orgId: string, chatId: string): Promise<string | null>;\n pairBlocked(orgId: string, communityId: string, a: string, b: string): Promise<boolean>;\n activeMemberCount(orgId: string, spaceId: string): Promise<number>;\n memberCommunityTitles(orgId: string, orgUserId: string): Promise<{ id: string; title: string }[]>;\n recentMessageRecipients(\n orgId: string,\n automationId: string,\n chatId: string,\n since: Date,\n ): Promise<string[]>;\n}\n\nexport interface ScheduledWork {\n publishDuePosts(orgId: string, now: Date): Promise<void>;\n expireDueGrants(orgId: string, now: Date): Promise<void>;\n sendDigest(orgId: string, now: Date): Promise<void>;\n hasDuePosts(orgId: string, now: Date): Promise<boolean>;\n hasDueGrants(orgId: string, now: Date): Promise<boolean>;\n removeUnattachedUploads(orgId: string, now: Date): Promise<void>;\n hasUnattachedUploads(orgId: string, now: Date): Promise<boolean>;\n}\n\nexport interface GrantWriter {\n grant(orgId: string, input: GrantEntitlementInput): Promise<unknown>;\n}\n\nexport interface ActionDeps {\n mailer: Pick<Mailer, 'send'>;\n lookups: MailerLookups;\n credentials: Pick<CredentialStore, 'reveal'>;\n webhooks: WebhookSender;\n mail: CommunityMailReads;\n grants: GrantWriter;\n desk: NotificationDesk;\n scheduledWork: ScheduledWork;\n automationId: string;\n actionInput: Record<string, JsonValue>;\n logger?: Logger;\n}\n\nexport const emptyCommunityMail: CommunityMailReads = {\n communityTitle: async () => null,\n space: async () => null,\n openSpaceNames: async () => [],\n communitiesOpenedBy: async () => [],\n communityMembersAmong: async () => [],\n spaceOpenersAmong: async () => [],\n spaceOpeners: async () => [],\n moderationAudience: async () => [],\n staffIds: async () => [],\n displayName: async () => 'A member',\n followerIds: async () => [],\n comment: async () => null,\n post: async () => null,\n chat: async () => null,\n latestMessageBody: async () => null,\n pairBlocked: async () => false,\n activeMemberCount: async () => 0,\n memberCommunityTitles: async () => [],\n recentMessageRecipients: async () => [],\n};\n\nexport const emptyNotificationDesk: NotificationDesk = {\n notify: async () => {},\n preferencesFor: async () => ({}),\n};\n\nexport const emptyScheduledWork: ScheduledWork = {\n publishDuePosts: async () => {},\n expireDueGrants: async () => {},\n sendDigest: async () => {},\n hasDuePosts: async () => false,\n hasDueGrants: async () => false,\n removeUnattachedUploads: async () => {},\n hasUnattachedUploads: async () => false,\n};\n\nexport function actorOf(event: DomainEvent): string | undefined {\n const value = event.metadata?.actorOrgUserId;\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function previousStatusOf(event: DomainEvent): string | undefined {\n const value = event.metadata?.previousStatus;\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function excerpt(value: string, max: number): string {\n const flat = value.replace(/\\s+/g, ' ').trim();\n return flat.length <= max ? flat : flat.slice(0, max);\n}\n\nexport function seededCommunityId(deps: ActionDeps): string | null {\n const id = deps.actionInput['communityId'];\n return typeof id === 'string' ? id : null;\n}\n\nexport function firedAtOf(event: DomainEvent): Date {\n if (typeof event.data === 'object' && event.data !== null && 'firedAt' in event.data) {\n const firedAt = (event.data as { firedAt?: unknown }).firedAt;\n if (typeof firedAt === 'string') {\n return new Date(firedAt);\n }\n }\n return new Date(event.occurredAt);\n}\n\nexport async function address<K extends EmailTemplateId>(\n deps: ActionDeps,\n event: DomainEvent,\n orgId: string,\n orgUserIds: string[],\n params: EmailTemplateParams[K],\n): Promise<EmailRecipient<K>[] | undefined> {\n const actor = actorOf(event);\n const wanted = [...new Set(orgUserIds)].filter((id) => id !== actor);\n if (wanted.length === 0) {\n return [];\n }\n const recipients: EmailRecipient<K>[] = [];\n const logger = deps.logger ?? noopLogger;\n for (const orgUserId of wanted) {\n const person = await deps.lookups.orgUserPerson(orgId, orgUserId);\n if (!person) {\n logger.warn('email skipped: recipient has no address', { orgId, orgUserId });\n continue;\n }\n recipients.push({ to: person.email, orgUserId, userId: person.userId, params });\n }\n return recipients;\n}\n"],"mappings":";;AAaA,MAAa,kBAAkB;AAC/B,MAAa,eAAe;AAC5B,MAAa,mBAAmB,MAAU;AAgG1C,MAAa,qBAAyC;CACpD,gBAAgB,YAAY;CAC5B,OAAO,YAAY;CACnB,gBAAgB,YAAY,CAAC;CAC7B,qBAAqB,YAAY,CAAC;CAClC,uBAAuB,YAAY,CAAC;CACpC,mBAAmB,YAAY,CAAC;CAChC,cAAc,YAAY,CAAC;CAC3B,oBAAoB,YAAY,CAAC;CACjC,UAAU,YAAY,CAAC;CACvB,aAAa,YAAY;CACzB,aAAa,YAAY,CAAC;CAC1B,SAAS,YAAY;CACrB,MAAM,YAAY;CAClB,MAAM,YAAY;CAClB,mBAAmB,YAAY;CAC/B,aAAa,YAAY;CACzB,mBAAmB,YAAY;CAC/B,uBAAuB,YAAY,CAAC;CACpC,yBAAyB,YAAY,CAAC;AACxC;AAEA,MAAa,wBAA0C;CACrD,QAAQ,YAAY,CAAC;CACrB,gBAAgB,aAAa,CAAC;AAChC;AAEA,MAAa,qBAAoC;CAC/C,iBAAiB,YAAY,CAAC;CAC9B,iBAAiB,YAAY,CAAC;CAC9B,YAAY,YAAY,CAAC;CACzB,aAAa,YAAY;CACzB,cAAc,YAAY;CAC1B,yBAAyB,YAAY,CAAC;CACtC,sBAAsB,YAAY;AACpC;AAEA,SAAgB,QAAQ,OAAwC;CAC9D,MAAM,QAAQ,MAAM,UAAU;CAC9B,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;AAEA,SAAgB,iBAAiB,OAAwC;CACvE,MAAM,QAAQ,MAAM,UAAU;CAC9B,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;AAEA,SAAgB,QAAQ,OAAe,KAAqB;CAC1D,MAAM,OAAO,MAAM,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CAC7C,OAAO,KAAK,UAAU,MAAM,OAAO,KAAK,MAAM,GAAG,GAAG;AACtD;AAEA,SAAgB,kBAAkB,MAAiC;CACjE,MAAM,KAAK,KAAK,YAAY;CAC5B,OAAO,OAAO,OAAO,WAAW,KAAK;AACvC;AAEA,SAAgB,UAAU,OAA0B;CAClD,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,QAAQ,aAAa,MAAM,MAAM;EACpF,MAAM,UAAW,MAAM,KAA+B;EACtD,IAAI,OAAO,YAAY,UACrB,OAAO,IAAI,KAAK,OAAO;CAE3B;CACA,OAAO,IAAI,KAAK,MAAM,UAAU;AAClC;AAEA,eAAsB,QACpB,MACA,OACA,OACA,YACA,QAC0C;CAC1C,MAAM,QAAQ,QAAQ,KAAK;CAC3B,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,QAAQ,OAAO,OAAO,KAAK;CACnE,IAAI,OAAO,WAAW,GACpB,OAAO,CAAC;CAEV,MAAM,aAAkC,CAAC;CACzC,MAAM,SAAS,KAAK,UAAU;CAC9B,KAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,SAAS,MAAM,KAAK,QAAQ,cAAc,OAAO,SAAS;EAChE,IAAI,CAAC,QAAQ;GACX,OAAO,KAAK,2CAA2C;IAAE;IAAO;GAAU,CAAC;GAC3E;EACF;EACA,WAAW,KAAK;GAAE,IAAI,OAAO;GAAO;GAAW,QAAQ,OAAO;GAAQ;EAAO,CAAC;CAChF;CACA,OAAO;AACT"}
@@ -0,0 +1,16 @@
1
+ import { DomainEvent } from "../types/shared.js";
2
+ import { NotificationKind } from "../types/schemas/identity.js";
3
+ import "../types/index.js";
4
+ import "../shared/ports.js";
5
+ import { NewNotification } from "../identity/ports.js";
6
+ import "../identity/index.js";
7
+ import { ActionDeps, EmailRecipient } from "./community-mail.js";
8
+ //#region src/automations/community-notifications.d.ts
9
+ type Placement = Omit<NewNotification, 'userId' | 'kind'>;
10
+ interface NotificationPlacement<K extends NotificationKind> {
11
+ place(event: DomainEvent, recipient: EmailRecipient<K>, deps: ActionDeps): Promise<Placement[]>;
12
+ }
13
+ declare const NOTIFICATION_PLACEMENTS: { [K in NotificationKind]: NotificationPlacement<K>; };
14
+ //#endregion
15
+ export { NOTIFICATION_PLACEMENTS, NotificationPlacement };
16
+ //# sourceMappingURL=community-notifications.d.ts.map
@@ -0,0 +1,84 @@
1
+ import { actorOf } from "./community-mail.js";
2
+ //#region src/automations/community-notifications.ts
3
+ function text(event, key) {
4
+ if (typeof event.data !== "object" || event.data === null) return null;
5
+ const value = event.data[key];
6
+ return typeof value === "string" ? value : null;
7
+ }
8
+ function at(communityId, actorOrgUserId, about) {
9
+ return [{
10
+ communityId,
11
+ actorOrgUserId,
12
+ spaceId: about.spaceId ?? null,
13
+ postId: about.postId ?? null,
14
+ commentId: about.commentId ?? null,
15
+ chatId: about.chatId ?? null,
16
+ messageId: about.messageId ?? null
17
+ }];
18
+ }
19
+ function actor(event) {
20
+ return actorOf(event) ?? null;
21
+ }
22
+ async function spaceOfPost(deps, event, postId) {
23
+ return postId ? (await deps.mail.post(event.orgId, postId))?.spaceId ?? null : null;
24
+ }
25
+ const NOTIFICATION_PLACEMENTS = {
26
+ newPostInSpace: { place: async (event, { params }) => at(params.communityId, text(event, "orgUserId"), {
27
+ postId: params.postId,
28
+ spaceId: text(event, "spaceId")
29
+ }) },
30
+ newCommentOnPost: { place: async (event, { params }, deps) => at(params.communityId, text(event, "orgUserId"), {
31
+ postId: params.postId,
32
+ commentId: params.commentId,
33
+ spaceId: await spaceOfPost(deps, event, params.postId)
34
+ }) },
35
+ replyToYourComment: { place: async (event, { params }, deps) => at(params.communityId, text(event, "orgUserId"), {
36
+ postId: params.postId,
37
+ commentId: params.commentId,
38
+ spaceId: await spaceOfPost(deps, event, params.postId)
39
+ }) },
40
+ yourPostWasPublished: { place: async (event, { params }) => at(params.communityId, actor(event), {
41
+ postId: params.postId,
42
+ spaceId: text(event, "spaceId")
43
+ }) },
44
+ yourPostWasRemoved: { place: async (event, { params }) => at(params.communityId, text(event, "removedBy"), {
45
+ postId: text(event, "id"),
46
+ spaceId: params.spaceId
47
+ }) },
48
+ yourCommentWasRemoved: { place: async (event, { params }, deps) => at(params.communityId, text(event, "removedBy"), {
49
+ postId: params.postId,
50
+ commentId: text(event, "id"),
51
+ spaceId: await spaceOfPost(deps, event, params.postId)
52
+ }) },
53
+ requestApproved: { place: async (event, { params }) => at(params.communityId, actor(event), { spaceId: params.spaceId }) },
54
+ requestDeclined: { place: async (event, { params }) => at(params.communityId, actor(event), { spaceId: text(event, "spaceId") }) },
55
+ invitedToSpace: { place: async (event, { params }) => at(params.communityId, actor(event), { spaceId: params.spaceId }) },
56
+ newMessage: { place: async (event, { params }) => at(params.communityId, text(event, "orgUserId"), {
57
+ chatId: params.chatId,
58
+ messageId: text(event, "id")
59
+ }) },
60
+ messageRequest: { place: async (event, { params }) => at(params.communityId, text(event, "createdBy"), { chatId: params.chatId }) },
61
+ addedToGroupChat: { place: async (event, { params }) => at(params.communityId, text(event, "addedBy"), { chatId: params.chatId }) },
62
+ youAreNowAModerator: { place: async (event) => at(null, actor(event), {}) },
63
+ membershipEndingSoon: { place: async (_event, { params }) => at(params.communityId, null, {}) },
64
+ welcomeToCommunity: { place: async (event, { params }) => at(params.communityId, actor(event), {}) },
65
+ postAwaitingReview: { place: async (event, { params }) => at(params.communityId, text(event, "orgUserId"), {
66
+ postId: text(event, "id"),
67
+ spaceId: params.spaceId
68
+ }) },
69
+ joinRequest: { place: async (event, { params }) => at(params.communityId, text(event, "orgUserId"), { spaceId: params.spaceId }) },
70
+ somethingWasFlagged: { place: async (event, { params }, deps) => {
71
+ const commentId = text(event, "commentId");
72
+ const postId = commentId ? (await deps.mail.comment(event.orgId, commentId))?.postId ?? null : text(event, "postId");
73
+ return at(params.communityId, text(event, "orgUserId"), {
74
+ spaceId: params.spaceId,
75
+ postId,
76
+ commentId
77
+ });
78
+ } },
79
+ messageWasFlagged: { place: async (event, { params }) => at(params.communityId, text(event, "orgUserId"), { messageId: text(event, "messageId") }) }
80
+ };
81
+ //#endregion
82
+ export { NOTIFICATION_PLACEMENTS };
83
+
84
+ //# sourceMappingURL=community-notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-notifications.js","names":[],"sources":["../../src/automations/community-notifications.ts"],"sourcesContent":["import type { NewNotification } from '../identity/index.js';\nimport type { NotificationKind } from '../types/index.js';\nimport type { DomainEvent } from '../shared/ports.js';\nimport { actorOf, type ActionDeps, type EmailRecipient } from './community-mail.js';\n\ntype Placement = Omit<NewNotification, 'userId' | 'kind'>;\n\nexport interface NotificationPlacement<K extends NotificationKind> {\n place(event: DomainEvent, recipient: EmailRecipient<K>, deps: ActionDeps): Promise<Placement[]>;\n}\n\ntype About = Partial<Pick<Placement, 'spaceId' | 'postId' | 'commentId' | 'chatId' | 'messageId'>>;\n\nfunction text(event: DomainEvent, key: string): string | null {\n if (typeof event.data !== 'object' || event.data === null) {\n return null;\n }\n const value = (event.data as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : null;\n}\n\nfunction at(communityId: string | null, actorOrgUserId: string | null, about: About): Placement[] {\n return [\n {\n communityId,\n actorOrgUserId,\n spaceId: about.spaceId ?? null,\n postId: about.postId ?? null,\n commentId: about.commentId ?? null,\n chatId: about.chatId ?? null,\n messageId: about.messageId ?? null,\n },\n ];\n}\n\nfunction actor(event: DomainEvent): string | null {\n return actorOf(event) ?? null;\n}\n\nasync function spaceOfPost(\n deps: ActionDeps,\n event: DomainEvent,\n postId: string | null,\n): Promise<string | null> {\n return postId ? ((await deps.mail.post(event.orgId, postId))?.spaceId ?? null) : null;\n}\n\nexport const NOTIFICATION_PLACEMENTS: {\n [K in NotificationKind]: NotificationPlacement<K>;\n} = {\n newPostInSpace: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'orgUserId'), {\n postId: params.postId,\n spaceId: text(event, 'spaceId'),\n }),\n },\n newCommentOnPost: {\n place: async (event, { params }, deps) =>\n at(params.communityId, text(event, 'orgUserId'), {\n postId: params.postId,\n commentId: params.commentId,\n spaceId: await spaceOfPost(deps, event, params.postId),\n }),\n },\n replyToYourComment: {\n place: async (event, { params }, deps) =>\n at(params.communityId, text(event, 'orgUserId'), {\n postId: params.postId,\n commentId: params.commentId,\n spaceId: await spaceOfPost(deps, event, params.postId),\n }),\n },\n yourPostWasPublished: {\n place: async (event, { params }) =>\n at(params.communityId, actor(event), {\n postId: params.postId,\n spaceId: text(event, 'spaceId'),\n }),\n },\n yourPostWasRemoved: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'removedBy'), {\n postId: text(event, 'id'),\n spaceId: params.spaceId,\n }),\n },\n yourCommentWasRemoved: {\n place: async (event, { params }, deps) =>\n at(params.communityId, text(event, 'removedBy'), {\n postId: params.postId,\n commentId: text(event, 'id'),\n spaceId: await spaceOfPost(deps, event, params.postId),\n }),\n },\n requestApproved: {\n place: async (event, { params }) =>\n at(params.communityId, actor(event), { spaceId: params.spaceId }),\n },\n requestDeclined: {\n place: async (event, { params }) =>\n at(params.communityId, actor(event), { spaceId: text(event, 'spaceId') }),\n },\n invitedToSpace: {\n place: async (event, { params }) =>\n at(params.communityId, actor(event), { spaceId: params.spaceId }),\n },\n newMessage: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'orgUserId'), {\n chatId: params.chatId,\n messageId: text(event, 'id'),\n }),\n },\n messageRequest: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'createdBy'), { chatId: params.chatId }),\n },\n addedToGroupChat: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'addedBy'), { chatId: params.chatId }),\n },\n youAreNowAModerator: {\n place: async (event) => at(null, actor(event), {}),\n },\n membershipEndingSoon: {\n place: async (_event, { params }) => at(params.communityId, null, {}),\n },\n welcomeToCommunity: {\n place: async (event, { params }) => at(params.communityId, actor(event), {}),\n },\n postAwaitingReview: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'orgUserId'), {\n postId: text(event, 'id'),\n spaceId: params.spaceId,\n }),\n },\n joinRequest: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'orgUserId'), { spaceId: params.spaceId }),\n },\n somethingWasFlagged: {\n place: async (event, { params }, deps) => {\n const commentId = text(event, 'commentId');\n const postId = commentId\n ? ((await deps.mail.comment(event.orgId, commentId))?.postId ?? null)\n : text(event, 'postId');\n return at(params.communityId, text(event, 'orgUserId'), {\n spaceId: params.spaceId,\n postId,\n commentId,\n });\n },\n },\n messageWasFlagged: {\n place: async (event, { params }) =>\n at(params.communityId, text(event, 'orgUserId'), { messageId: text(event, 'messageId') }),\n },\n};\n"],"mappings":"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"}
@@ -7,137 +7,167 @@ declare const automationEvents: {
7
7
  orgId: string;
8
8
  id: string;
9
9
  name: string;
10
+ kind: "workflow" | "webhook";
10
11
  description: string | null;
11
- trigger: string;
12
+ triggers: string[];
12
13
  actions: {
13
14
  type: string;
14
15
  input: Record<string, JsonValue>;
15
16
  }[];
16
17
  enabled: boolean;
18
+ filter: Record<string, JsonValue> | null;
19
+ source: "system" | "user";
17
20
  createdAt: Date;
18
21
  updatedAt: Date;
19
- }, "automation.created", 1>, {
22
+ }, "automation.created", 2>, {
20
23
  orgId: string;
21
24
  id: string;
22
25
  name: string;
26
+ kind: "workflow" | "webhook";
23
27
  description: string | null;
24
- trigger: string;
28
+ triggers: string[];
25
29
  actions: {
26
30
  type: string;
27
31
  input: Record<string, unknown>;
28
32
  }[];
29
33
  enabled: boolean;
34
+ filter: Record<string, unknown> | null;
35
+ source: "system" | "user";
30
36
  createdAt: unknown;
31
37
  updatedAt: unknown;
32
- }>;
38
+ }, undefined>;
33
39
  automationUpdated: RuntimeEventDefinition<VersionedDomainEvent<{
34
40
  orgId: string;
35
41
  id: string;
36
42
  name: string;
43
+ kind: "workflow" | "webhook";
37
44
  description: string | null;
38
- trigger: string;
45
+ triggers: string[];
39
46
  actions: {
40
47
  type: string;
41
48
  input: Record<string, JsonValue>;
42
49
  }[];
43
50
  enabled: boolean;
51
+ filter: Record<string, JsonValue> | null;
52
+ source: "system" | "user";
44
53
  createdAt: Date;
45
54
  updatedAt: Date;
46
- }, "automation.updated", 1>, {
55
+ }, "automation.updated", 2>, {
47
56
  orgId: string;
48
57
  id: string;
49
58
  name: string;
59
+ kind: "workflow" | "webhook";
50
60
  description: string | null;
51
- trigger: string;
61
+ triggers: string[];
52
62
  actions: {
53
63
  type: string;
54
64
  input: Record<string, unknown>;
55
65
  }[];
56
66
  enabled: boolean;
67
+ filter: Record<string, unknown> | null;
68
+ source: "system" | "user";
57
69
  createdAt: unknown;
58
70
  updatedAt: unknown;
59
- }>;
71
+ }, undefined>;
60
72
  automationDeleted: RuntimeEventDefinition<VersionedDomainEvent<{
61
73
  orgId: string;
62
74
  id: string;
63
75
  name: string;
76
+ kind: "workflow" | "webhook";
64
77
  description: string | null;
65
- trigger: string;
78
+ triggers: string[];
66
79
  actions: {
67
80
  type: string;
68
81
  input: Record<string, JsonValue>;
69
82
  }[];
70
83
  enabled: boolean;
84
+ filter: Record<string, JsonValue> | null;
85
+ source: "system" | "user";
71
86
  createdAt: Date;
72
87
  updatedAt: Date;
73
- }, "automation.deleted", 1>, {
88
+ }, "automation.deleted", 2>, {
74
89
  orgId: string;
75
90
  id: string;
76
91
  name: string;
92
+ kind: "workflow" | "webhook";
77
93
  description: string | null;
78
- trigger: string;
94
+ triggers: string[];
79
95
  actions: {
80
96
  type: string;
81
97
  input: Record<string, unknown>;
82
98
  }[];
83
99
  enabled: boolean;
100
+ filter: Record<string, unknown> | null;
101
+ source: "system" | "user";
84
102
  createdAt: unknown;
85
103
  updatedAt: unknown;
86
- }>;
104
+ }, undefined>;
87
105
  automationEnabled: RuntimeEventDefinition<VersionedDomainEvent<{
88
106
  orgId: string;
89
107
  id: string;
90
108
  name: string;
109
+ kind: "workflow" | "webhook";
91
110
  description: string | null;
92
- trigger: string;
111
+ triggers: string[];
93
112
  actions: {
94
113
  type: string;
95
114
  input: Record<string, JsonValue>;
96
115
  }[];
97
116
  enabled: boolean;
117
+ filter: Record<string, JsonValue> | null;
118
+ source: "system" | "user";
98
119
  createdAt: Date;
99
120
  updatedAt: Date;
100
- }, "automation.enabled", 1>, {
121
+ }, "automation.enabled", 2>, {
101
122
  orgId: string;
102
123
  id: string;
103
124
  name: string;
125
+ kind: "workflow" | "webhook";
104
126
  description: string | null;
105
- trigger: string;
127
+ triggers: string[];
106
128
  actions: {
107
129
  type: string;
108
130
  input: Record<string, unknown>;
109
131
  }[];
110
132
  enabled: boolean;
133
+ filter: Record<string, unknown> | null;
134
+ source: "system" | "user";
111
135
  createdAt: unknown;
112
136
  updatedAt: unknown;
113
- }>;
137
+ }, undefined>;
114
138
  automationDisabled: RuntimeEventDefinition<VersionedDomainEvent<{
115
139
  orgId: string;
116
140
  id: string;
117
141
  name: string;
142
+ kind: "workflow" | "webhook";
118
143
  description: string | null;
119
- trigger: string;
144
+ triggers: string[];
120
145
  actions: {
121
146
  type: string;
122
147
  input: Record<string, JsonValue>;
123
148
  }[];
124
149
  enabled: boolean;
150
+ filter: Record<string, JsonValue> | null;
151
+ source: "system" | "user";
125
152
  createdAt: Date;
126
153
  updatedAt: Date;
127
- }, "automation.disabled", 1>, {
154
+ }, "automation.disabled", 2>, {
128
155
  orgId: string;
129
156
  id: string;
130
157
  name: string;
158
+ kind: "workflow" | "webhook";
131
159
  description: string | null;
132
- trigger: string;
160
+ triggers: string[];
133
161
  actions: {
134
162
  type: string;
135
163
  input: Record<string, unknown>;
136
164
  }[];
137
165
  enabled: boolean;
166
+ filter: Record<string, unknown> | null;
167
+ source: "system" | "user";
138
168
  createdAt: unknown;
139
169
  updatedAt: unknown;
140
- }>;
170
+ }, undefined>;
141
171
  runStarted: RuntimeEventDefinition<VersionedDomainEvent<{
142
172
  orgId: string;
143
173
  id: string;
@@ -151,9 +181,12 @@ declare const automationEvents: {
151
181
  type: string;
152
182
  status: "completed" | "failed";
153
183
  error?: string | undefined;
184
+ recipients?: string[] | undefined;
154
185
  }[];
155
186
  startedAt: Date;
156
187
  finishedAt: Date | null;
188
+ createdAt: Date;
189
+ updatedAt: Date;
157
190
  }, "automation.run.started", 1>, {
158
191
  orgId: string;
159
192
  id: string;
@@ -167,10 +200,13 @@ declare const automationEvents: {
167
200
  type: string;
168
201
  status: "completed" | "failed";
169
202
  error?: string | undefined;
203
+ recipients?: string[] | undefined;
170
204
  }[];
171
205
  startedAt: unknown;
172
206
  finishedAt: unknown;
173
- }>;
207
+ createdAt: unknown;
208
+ updatedAt: unknown;
209
+ }, undefined>;
174
210
  runCompleted: RuntimeEventDefinition<VersionedDomainEvent<{
175
211
  orgId: string;
176
212
  id: string;
@@ -184,9 +220,12 @@ declare const automationEvents: {
184
220
  type: string;
185
221
  status: "completed" | "failed";
186
222
  error?: string | undefined;
223
+ recipients?: string[] | undefined;
187
224
  }[];
188
225
  startedAt: Date;
189
226
  finishedAt: Date | null;
227
+ createdAt: Date;
228
+ updatedAt: Date;
190
229
  }, "automation.run.completed", 1>, {
191
230
  orgId: string;
192
231
  id: string;
@@ -200,10 +239,13 @@ declare const automationEvents: {
200
239
  type: string;
201
240
  status: "completed" | "failed";
202
241
  error?: string | undefined;
242
+ recipients?: string[] | undefined;
203
243
  }[];
204
244
  startedAt: unknown;
205
245
  finishedAt: unknown;
206
- }>;
246
+ createdAt: unknown;
247
+ updatedAt: unknown;
248
+ }, undefined>;
207
249
  runFailed: RuntimeEventDefinition<VersionedDomainEvent<{
208
250
  orgId: string;
209
251
  id: string;
@@ -217,9 +259,12 @@ declare const automationEvents: {
217
259
  type: string;
218
260
  status: "completed" | "failed";
219
261
  error?: string | undefined;
262
+ recipients?: string[] | undefined;
220
263
  }[];
221
264
  startedAt: Date;
222
265
  finishedAt: Date | null;
266
+ createdAt: Date;
267
+ updatedAt: Date;
223
268
  }, "automation.run.failed", 1>, {
224
269
  orgId: string;
225
270
  id: string;
@@ -233,21 +278,26 @@ declare const automationEvents: {
233
278
  type: string;
234
279
  status: "completed" | "failed";
235
280
  error?: string | undefined;
281
+ recipients?: string[] | undefined;
236
282
  }[];
237
283
  startedAt: unknown;
238
284
  finishedAt: unknown;
239
- }>;
285
+ createdAt: unknown;
286
+ updatedAt: unknown;
287
+ }, undefined>;
240
288
  actionFailed: RuntimeEventDefinition<VersionedDomainEvent<{
241
289
  index: number;
242
290
  type: string;
243
291
  status: "completed" | "failed";
244
292
  error?: string | undefined;
293
+ recipients?: string[] | undefined;
245
294
  }, "automation.action.failed", 1>, {
246
295
  index: number;
247
296
  type: string;
248
297
  status: "completed" | "failed";
249
298
  error?: string | undefined;
250
- }>;
299
+ recipients?: string[] | undefined;
300
+ }, undefined>;
251
301
  };
252
302
  type AutomationCreated = EventOf<typeof automationEvents.automationCreated>;
253
303
  type AutomationUpdated = EventOf<typeof automationEvents.automationUpdated>;
@@ -4,27 +4,27 @@ import { defineEvent } from "../shared/events.js";
4
4
  const automationEvents = {
5
5
  automationCreated: defineEvent({
6
6
  type: "automation.created",
7
- version: 1,
7
+ version: 2,
8
8
  data: automationSchema
9
9
  }),
10
10
  automationUpdated: defineEvent({
11
11
  type: "automation.updated",
12
- version: 1,
12
+ version: 2,
13
13
  data: automationSchema
14
14
  }),
15
15
  automationDeleted: defineEvent({
16
16
  type: "automation.deleted",
17
- version: 1,
17
+ version: 2,
18
18
  data: automationSchema
19
19
  }),
20
20
  automationEnabled: defineEvent({
21
21
  type: "automation.enabled",
22
- version: 1,
22
+ version: 2,
23
23
  data: automationSchema
24
24
  }),
25
25
  automationDisabled: defineEvent({
26
26
  type: "automation.disabled",
27
- version: 1,
27
+ version: 2,
28
28
  data: automationSchema
29
29
  }),
30
30
  runStarted: defineEvent({