@oomol-lab/open-connector 1.7.0 → 1.8.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 (288) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +916 -76
  4. package/assets/open-connector/catalog/apps/cal.json +24 -6
  5. package/assets/open-connector/catalog/apps/discordbot.json +2 -2
  6. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  7. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  8. package/assets/open-connector/catalog/apps/github.json +275 -0
  9. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  10. package/assets/open-connector/catalog/apps/gmail.json +151 -0
  11. package/assets/open-connector/catalog/apps/googlecalendar.json +206 -0
  12. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  13. package/assets/open-connector/catalog/apps/googlesheets.json +144 -0
  14. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  15. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  16. package/assets/open-connector/catalog/apps/linear.json +116 -0
  17. package/assets/open-connector/catalog/apps/notion.json +142 -0
  18. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  19. package/assets/open-connector/catalog/apps/outlook.json +182 -0
  20. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  21. package/assets/open-connector/catalog/apps/slack.json +182 -0
  22. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  23. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  24. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  25. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  26. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  27. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  28. package/assets/open-connector/catalog/apps/zerotier.json +9 -9
  29. package/assets/open-connector/catalog/apps-index.json +1 -1
  30. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  31. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  32. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  33. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  34. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  35. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  36. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  37. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  38. package/package.json +2 -2
  39. package/src/connection-service.d.ts +40 -7
  40. package/src/connection-service.js +60 -18
  41. package/src/core/action-policy.d.ts +8 -1
  42. package/src/core/action-policy.js +51 -0
  43. package/src/core/cast.d.ts +3 -0
  44. package/src/core/cast.js +4 -1
  45. package/src/core/guarded-fetch.d.ts +5 -0
  46. package/src/core/guarded-fetch.js +13 -4
  47. package/src/core/remote-http.d.ts +33 -0
  48. package/src/core/remote-http.js +104 -0
  49. package/src/core/request.d.ts +1 -0
  50. package/src/core/request.js +7 -0
  51. package/src/core/types.d.ts +4 -0
  52. package/src/marketplace/marketplace-service.d.ts +0 -1
  53. package/src/marketplace/marketplace-service.js +80 -92
  54. package/src/mcp.js +19 -5
  55. package/src/oauth/oauth-flow-service.d.ts +8 -1
  56. package/src/oauth/oauth-flow-service.js +10 -4
  57. package/src/providers/action-contracts.generated.d.ts +4 -2
  58. package/src/providers/airtable/executors.d.ts +3 -0
  59. package/src/providers/airtable/executors.js +2 -0
  60. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  61. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  62. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  63. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  64. package/src/providers/aisa/executors.js +196 -22
  65. package/src/providers/cal/actions.js +5 -1
  66. package/src/providers/enormail/executors.d.ts +4 -0
  67. package/src/providers/enormail/executors.js +97 -0
  68. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  69. package/src/providers/feishu_app_bot/executors.js +2 -0
  70. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  71. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  72. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  73. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  74. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  75. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  76. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  77. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  78. package/src/providers/github/executors.d.ts +3 -0
  79. package/src/providers/github/executors.js +6 -0
  80. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  81. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  82. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  83. package/src/providers/github/trigger-on-repo-event.js +168 -0
  84. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  85. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  86. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  87. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  88. package/src/providers/gitlab/executors.d.ts +3 -0
  89. package/src/providers/gitlab/executors.js +2 -0
  90. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  91. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  92. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  93. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  94. package/src/providers/gmail/executors.d.ts +3 -0
  95. package/src/providers/gmail/executors.js +2 -0
  96. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  97. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  98. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  99. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  100. package/src/providers/googlecalendar/executors.d.ts +3 -0
  101. package/src/providers/googlecalendar/executors.js +2 -0
  102. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  103. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  104. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  105. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  106. package/src/providers/googledrive/executors.d.ts +3 -0
  107. package/src/providers/googledrive/executors.js +7 -0
  108. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  109. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  110. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  111. package/src/providers/googledrive/trigger-changes.js +452 -0
  112. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  113. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  114. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  115. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  116. package/src/providers/googlesheets/executors.d.ts +3 -0
  117. package/src/providers/googlesheets/executors.js +2 -0
  118. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  119. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  120. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  121. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  122. package/src/providers/hithink_finance/runtime.js +1 -1
  123. package/src/providers/indexed/executors.d.ts +4 -0
  124. package/src/providers/indexed/executors.js +16 -0
  125. package/src/providers/indexed/runtime.d.ts +26 -0
  126. package/src/providers/indexed/runtime.js +129 -0
  127. package/src/providers/linear/executors.d.ts +3 -0
  128. package/src/providers/linear/executors.js +2 -0
  129. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  130. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  131. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  132. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  133. package/src/providers/notion/executors.d.ts +3 -0
  134. package/src/providers/notion/executors.js +2 -0
  135. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  136. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  137. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  138. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  139. package/src/providers/one_drive/executors.d.ts +3 -0
  140. package/src/providers/one_drive/executors.js +2 -0
  141. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  142. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  143. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  144. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  145. package/src/providers/outlook/executors.d.ts +3 -0
  146. package/src/providers/outlook/executors.js +2 -0
  147. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  148. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  149. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  150. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  151. package/src/providers/outlook_calendar/executors.js +6 -0
  152. package/src/providers/provider-loader.d.ts +5 -0
  153. package/src/providers/provider-loader.js +4 -0
  154. package/src/providers/registry.generated.js +2 -0
  155. package/src/providers/shopify/executors.d.ts +3 -0
  156. package/src/providers/shopify/executors.js +2 -0
  157. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  158. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  159. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  160. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  161. package/src/providers/slack/executors.d.ts +3 -0
  162. package/src/providers/slack/executors.js +2 -0
  163. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  164. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  165. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  166. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  167. package/src/providers/spotify/runtime.js +15 -4
  168. package/src/providers/stripe/executors.d.ts +3 -0
  169. package/src/providers/stripe/executors.js +2 -0
  170. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  171. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  172. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  173. package/src/providers/stripe/trigger-on-event.js +212 -0
  174. package/src/providers/telegram/executors.d.ts +3 -0
  175. package/src/providers/telegram/executors.js +2 -0
  176. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  177. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  178. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  179. package/src/providers/telegram/trigger-on-update.js +141 -0
  180. package/src/providers/weixin_store/access-token.d.ts +2 -1
  181. package/src/providers/weixin_store/access-token.js +15 -4
  182. package/src/providers/weixin_store/executors.js +97 -12
  183. package/src/providers/woocommerce/executors.d.ts +3 -0
  184. package/src/providers/woocommerce/executors.js +2 -0
  185. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  186. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  187. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  188. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  189. package/src/providers/zendesk/executors.d.ts +3 -0
  190. package/src/providers/zendesk/executors.js +2 -0
  191. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  192. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  193. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  194. package/src/providers/zendesk/trigger-on-event.js +188 -0
  195. package/src/saas/saas-cleanup-service.d.ts +26 -0
  196. package/src/saas/saas-cleanup-service.js +124 -0
  197. package/src/saas/saas-client.d.ts +86 -0
  198. package/src/saas/saas-client.js +369 -0
  199. package/src/saas/saas-execution-service.d.ts +15 -0
  200. package/src/saas/saas-execution-service.js +21 -0
  201. package/src/saas/saas-oauth-service.d.ts +25 -0
  202. package/src/saas/saas-oauth-service.js +197 -0
  203. package/src/saas/saas-project-service.d.ts +61 -0
  204. package/src/saas/saas-project-service.js +211 -0
  205. package/src/server/actions/action-idempotency.d.ts +1 -0
  206. package/src/server/actions/action-idempotency.js +1 -0
  207. package/src/server/actions/action-runner.d.ts +7 -0
  208. package/src/server/actions/action-runner.js +43 -7
  209. package/src/server/actions/run-log-summary.js +9 -0
  210. package/src/server/api/auth.d.ts +1 -0
  211. package/src/server/api/auth.js +13 -2
  212. package/src/server/api/cache-policy.js +4 -1
  213. package/src/server/api/connection-input.d.ts +7 -1
  214. package/src/server/api/connection-input.js +7 -1
  215. package/src/server/api/connection-routes.d.ts +3 -1
  216. package/src/server/api/connection-routes.js +21 -3
  217. package/src/server/api/http-utils.d.ts +4 -3
  218. package/src/server/api/oauth-completion-page.d.ts +124 -0
  219. package/src/server/api/oauth-completion-page.js +113 -18
  220. package/src/server/api/openapi.js +112 -14
  221. package/src/server/api/policy-input.js +6 -0
  222. package/src/server/api/runtime-api.d.ts +10 -2
  223. package/src/server/api/runtime-api.js +17 -4
  224. package/src/server/api/saas-completion-page.d.ts +2 -0
  225. package/src/server/api/saas-completion-page.js +103 -0
  226. package/src/server/connect-app.d.ts +5 -0
  227. package/src/server/connect-app.js +50 -0
  228. package/src/server/connect-server.d.ts +12 -0
  229. package/src/server/connect-server.js +147 -13
  230. package/src/server/connector-runtime.d.ts +3 -1
  231. package/src/server/connector-runtime.js +5 -2
  232. package/src/server/files/transit-files.js +16 -7
  233. package/src/server/proxy/proxy-runner.d.ts +5 -1
  234. package/src/server/proxy/proxy-runner.js +72 -26
  235. package/src/server/storage/connection-request-store.d.ts +41 -1
  236. package/src/server/storage/connection-request-store.js +245 -20
  237. package/src/server/storage/connection-store.d.ts +16 -0
  238. package/src/server/storage/connection-store.js +119 -0
  239. package/src/server/storage/node-runtime-database.js +3 -3
  240. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  241. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  242. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  243. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  244. package/src/server/storage/runtime-database.d.ts +4 -0
  245. package/src/server/storage/runtime-sql.d.ts +1 -1
  246. package/src/server/storage/runtime-sql.js +2 -1
  247. package/src/server/storage/runtime-store.d.ts +1 -0
  248. package/src/server/storage/runtime-token-service.d.ts +2 -0
  249. package/src/server/storage/runtime-token-service.js +3 -0
  250. package/src/server/storage/saas-project-store.d.ts +77 -0
  251. package/src/server/storage/saas-project-store.js +273 -0
  252. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  253. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  254. package/src/server/storage/trigger-store.d.ts +16 -0
  255. package/src/server/storage/trigger-store.js +96 -0
  256. package/src/triggers/common/config.d.ts +2 -0
  257. package/src/triggers/common/config.js +17 -0
  258. package/src/triggers/common/configOptions.d.ts +13 -0
  259. package/src/triggers/common/configOptions.js +1 -0
  260. package/src/triggers/common/encoding.d.ts +3 -0
  261. package/src/triggers/common/encoding.js +19 -0
  262. package/src/triggers/common/integration.d.ts +115 -0
  263. package/src/triggers/common/integration.js +31 -0
  264. package/src/triggers/common/json.d.ts +6 -0
  265. package/src/triggers/common/json.js +91 -0
  266. package/src/triggers/common/poll.d.ts +41 -0
  267. package/src/triggers/common/poll.js +15 -0
  268. package/src/triggers/common/proxy.d.ts +14 -0
  269. package/src/triggers/common/proxy.js +1 -0
  270. package/src/triggers/common/types.d.ts +42 -0
  271. package/src/triggers/common/types.js +1 -0
  272. package/src/triggers/maintenance.d.ts +40 -0
  273. package/src/triggers/maintenance.js +120 -0
  274. package/src/triggers/metadata.d.ts +8 -0
  275. package/src/triggers/metadata.js +1 -0
  276. package/src/triggers/request.d.ts +33 -0
  277. package/src/triggers/request.js +52 -0
  278. package/src/triggers/resources.d.ts +12 -0
  279. package/src/triggers/resources.js +121 -0
  280. package/src/triggers/signature.d.ts +4 -0
  281. package/src/triggers/signature.js +48 -0
  282. package/src/triggers/store.d.ts +29 -0
  283. package/src/triggers/store.js +1 -0
  284. package/src/triggers/subscriptions.d.ts +22 -0
  285. package/src/triggers/subscriptions.js +220 -0
  286. package/src/triggers/trigger-runner.d.ts +34 -0
  287. package/src/triggers/trigger-runner.js +169 -0
  288. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
@@ -0,0 +1,93 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const defaultFolder = "inbox";
3
+ const defaultPageSize = 25;
4
+ const eventSchema = s.object({
5
+ bodyPreview: s.string(),
6
+ categories: s.array(s.string()),
7
+ conversationId: s.string(),
8
+ from: s.string(),
9
+ fromName: s.string(),
10
+ hasAttachments: s.boolean(),
11
+ importance: s.string(),
12
+ internetMessageId: s.string(),
13
+ isDraft: s.boolean(),
14
+ isRead: s.boolean(),
15
+ messageId: s.string(),
16
+ parentFolderId: s.string(),
17
+ receivedDateTime: s.string(),
18
+ subject: s.string(),
19
+ to: s.array(s.string()),
20
+ webLink: s.string(),
21
+ }, {
22
+ additionalProperties: false,
23
+ required: [
24
+ "messageId",
25
+ "internetMessageId",
26
+ "conversationId",
27
+ "subject",
28
+ "bodyPreview",
29
+ "from",
30
+ "fromName",
31
+ "to",
32
+ "receivedDateTime",
33
+ "hasAttachments",
34
+ "isRead",
35
+ "isDraft",
36
+ "importance",
37
+ "categories",
38
+ "parentFolderId",
39
+ "webLink",
40
+ ],
41
+ });
42
+ export const snapshot = {
43
+ configInputs: [
44
+ {
45
+ handle: "folder",
46
+ jsonSchema: s.string({ pattern: "^[A-Za-z0-9_=-]*$" }),
47
+ nullable: false,
48
+ value: defaultFolder,
49
+ description: "A well-known mail folder name, folder ID, or an empty string for the whole mailbox.",
50
+ },
51
+ { handle: "includeDrafts", jsonSchema: s.boolean(), nullable: false, value: false },
52
+ {
53
+ handle: "maxMessagesPerPoll",
54
+ jsonSchema: s.integer({ maximum: 100, minimum: 1 }),
55
+ nullable: false,
56
+ value: defaultPageSize,
57
+ },
58
+ {
59
+ handle: "readStatus",
60
+ jsonSchema: s.stringEnum(["All", "Read", "Unread"]),
61
+ nullable: false,
62
+ value: "All",
63
+ },
64
+ {
65
+ handle: "senderAddress",
66
+ jsonSchema: s.string(),
67
+ nullable: false,
68
+ value: "",
69
+ description: "Exact sender address, or empty for any sender.",
70
+ },
71
+ {
72
+ handle: "subjectContains",
73
+ jsonSchema: s.string(),
74
+ nullable: false,
75
+ value: "",
76
+ description: "Case-insensitive subject text.",
77
+ },
78
+ {
79
+ handle: "withAttachmentsOnly",
80
+ jsonSchema: s.boolean(),
81
+ nullable: false,
82
+ value: false,
83
+ },
84
+ ],
85
+ definitionVersion: 2,
86
+ description: "Polls a Microsoft Outlook mail folder and triggers when a new message arrives.",
87
+ displayName: "New Message Received",
88
+ key: "outlook.on_message_received",
89
+ name: "on_message_received",
90
+ outputs: [{ handle: "events", jsonSchema: s.array(eventSchema), nullable: false }],
91
+ provider: "outlook",
92
+ type: "poll",
93
+ };
@@ -0,0 +1,226 @@
1
+ import { eventsPollOutputs, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
2
+ import { snapshot } from "./trigger-on-message-received.definition.js";
3
+ const markerPageSize = 100;
4
+ const seedAnchor = "1970-01-01T00:00:00Z";
5
+ const select = "id,internetMessageId,conversationId,subject,bodyPreview,from,toRecipients,receivedDateTime,hasAttachments,isRead,isDraft,importance,categories,parentFolderId,webLink";
6
+ export const outlookMessageReceived = {
7
+ buildOutputs: eventsPollOutputs,
8
+ snapshot,
9
+ async poll(context) {
10
+ const config = resolveConfig(context.config);
11
+ if (context.checkpoint === null)
12
+ return { checkpoint: (await seed(context, config)), events: [] };
13
+ const checkpoint = readCheckpoint(context.checkpoint);
14
+ const result = await get(context, endpoint(config.folder), {
15
+ $filter: filter(config, checkpoint.lastReceivedDateTime),
16
+ $orderby: "receivedDateTime asc",
17
+ $select: select,
18
+ $top: config.maxMessagesPerPoll,
19
+ });
20
+ success(result, "message list");
21
+ const rows = messages(result.data);
22
+ if (rows.length == 0)
23
+ return { checkpoint: checkpoint, events: [] };
24
+ const previousMs = Date.parse(checkpoint.lastReceivedDateTime);
25
+ let watermarkMs = previousMs;
26
+ let watermark = checkpoint.lastReceivedDateTime;
27
+ for (const row of rows) {
28
+ const ms = isoMs(row.receivedDateTime);
29
+ if (row.receivedDateTime != null && ms != null && ms > watermarkMs) {
30
+ watermarkMs = ms;
31
+ watermark = row.receivedDateTime;
32
+ }
33
+ }
34
+ const moved = watermarkMs > previousMs;
35
+ const processed = new Set(checkpoint.boundaryMessageIds);
36
+ const full = rows.length >= config.maxMessagesPerPoll;
37
+ if (full && !moved && rows.every((row) => typeof row.id == "string" && processed.has(row.id))) {
38
+ throw new PermanentPollError("Outlook cursor is stuck on a full timestamp boundary; increase maxMessagesPerPoll and resume the Trigger.");
39
+ }
40
+ const boundary = new Set(moved ? [] : checkpoint.boundaryMessageIds);
41
+ const events = [];
42
+ let filtered = 0;
43
+ for (const row of rows) {
44
+ if (row.id == null || row.id.length == 0)
45
+ continue;
46
+ if (isoMs(row.receivedDateTime) == watermarkMs)
47
+ boundary.add(row.id);
48
+ if (processed.has(row.id))
49
+ continue;
50
+ if (!matches(row, config)) {
51
+ filtered += 1;
52
+ continue;
53
+ }
54
+ events.push(event(row, row.id));
55
+ }
56
+ const hasMore = full && (moved || events.length > 0);
57
+ return {
58
+ checkpoint: { boundaryMessageIds: [...boundary], lastReceivedDateTime: watermark },
59
+ events,
60
+ filtered,
61
+ ...(hasMore ? { hasMore: true } : {}),
62
+ };
63
+ },
64
+ };
65
+ function resolveConfig(value) {
66
+ return {
67
+ folder: value.folder,
68
+ includeDrafts: value.includeDrafts,
69
+ maxMessagesPerPoll: value.maxMessagesPerPoll,
70
+ readStatus: value.readStatus,
71
+ senderAddress: value.senderAddress.trim(),
72
+ subjectContains: value.subjectContains.trim(),
73
+ withAttachmentsOnly: value.withAttachmentsOnly,
74
+ };
75
+ }
76
+ async function seed(context, config) {
77
+ const marker = await get(context, endpoint(config.folder), {
78
+ $orderby: "receivedDateTime desc",
79
+ $select: "id,receivedDateTime",
80
+ $top: markerPageSize,
81
+ });
82
+ success(marker, "seed marker fetch");
83
+ const shape = await get(context, endpoint(config.folder), {
84
+ $filter: filter(config, seedAnchor),
85
+ $orderby: "receivedDateTime desc",
86
+ $top: 1,
87
+ });
88
+ success(shape, "seed filter shape check");
89
+ const newest = newestMessage(messages(marker.data));
90
+ if (newest == null)
91
+ return { boundaryMessageIds: [], lastReceivedDateTime: context.now.toISOString() };
92
+ const boundary = messages(marker.data).filter((row) => isoMs(row.receivedDateTime) == newest.ms);
93
+ if (boundary.length >= config.maxMessagesPerPoll) {
94
+ return {
95
+ boundaryMessageIds: [],
96
+ lastReceivedDateTime: new Date(newest.ms + 1_000).toISOString(),
97
+ };
98
+ }
99
+ return {
100
+ boundaryMessageIds: boundary.flatMap((row) => (row.id == null || row.id.length == 0 ? [] : [row.id])),
101
+ lastReceivedDateTime: newest.iso,
102
+ };
103
+ }
104
+ function readCheckpoint(value) {
105
+ const checkpoint = record(value);
106
+ const watermark = checkpoint?.lastReceivedDateTime;
107
+ if (typeof watermark != "string" || isoMs(watermark) == null) {
108
+ throw new PermanentPollError("Outlook checkpoint is invalid; recreate the Trigger.");
109
+ }
110
+ const boundary = checkpoint?.boundaryMessageIds;
111
+ return {
112
+ boundaryMessageIds: Array.isArray(boundary)
113
+ ? boundary.filter((id) => typeof id == "string" && id.length > 0)
114
+ : [],
115
+ lastReceivedDateTime: watermark,
116
+ };
117
+ }
118
+ function endpoint(folder) {
119
+ return folder.length == 0 ? "/me/messages" : `/me/mailFolders/${encodeURIComponent(folder)}/messages`;
120
+ }
121
+ function filter(config, watermark) {
122
+ const clauses = [`receivedDateTime ge ${watermark}`];
123
+ if (config.readStatus == "Unread")
124
+ clauses.push("isRead eq false");
125
+ if (config.readStatus == "Read")
126
+ clauses.push("isRead eq true");
127
+ if (config.withAttachmentsOnly)
128
+ clauses.push("hasAttachments eq true");
129
+ if (config.senderAddress.length > 0)
130
+ clauses.push(`from/emailAddress/address eq '${config.senderAddress.replaceAll("'", "''")}'`);
131
+ return clauses.join(" and ");
132
+ }
133
+ function matches(message, config) {
134
+ if (message.isDraft === true && !config.includeDrafts)
135
+ return false;
136
+ return (config.subjectContains.length == 0 ||
137
+ (message.subject ?? "").toLowerCase().includes(config.subjectContains.toLowerCase()));
138
+ }
139
+ function event(message, id) {
140
+ return {
141
+ dedupeKey: id,
142
+ payload: {
143
+ bodyPreview: message.bodyPreview ?? "",
144
+ categories: message.categories ?? [],
145
+ conversationId: message.conversationId ?? "",
146
+ from: message.from?.emailAddress?.address ?? "",
147
+ fromName: message.from?.emailAddress?.name ?? "",
148
+ hasAttachments: message.hasAttachments ?? false,
149
+ importance: message.importance ?? "",
150
+ internetMessageId: message.internetMessageId ?? "",
151
+ isDraft: message.isDraft ?? false,
152
+ isRead: message.isRead ?? false,
153
+ messageId: id,
154
+ parentFolderId: message.parentFolderId ?? "",
155
+ receivedDateTime: message.receivedDateTime ?? "",
156
+ subject: message.subject ?? "",
157
+ to: (message.toRecipients ?? []).flatMap(({ emailAddress }) => emailAddress?.address == null ? [] : [emailAddress.address]),
158
+ webLink: message.webLink ?? "",
159
+ },
160
+ };
161
+ }
162
+ async function get(context, path, query) {
163
+ try {
164
+ return await context.connector.execute({ endpoint: path, headers: { Prefer: 'IdType="ImmutableId"' }, method: "GET", query }, context.signal);
165
+ }
166
+ catch (cause) {
167
+ throw new TransientPollError(`Outlook proxy request to ${path} failed.`, { cause });
168
+ }
169
+ }
170
+ function success(result, operation) {
171
+ if (result.status >= 200 && result.status < 300)
172
+ return;
173
+ const codes = errorCodes(result.data);
174
+ if (result.status == 401)
175
+ throw new PollConnectionError(`Outlook ${operation} rejected the Connection.`);
176
+ if (result.status == 403 && codes.has("mailboxnotenabledforrestapi")) {
177
+ throw new PermanentPollError("The Outlook mailbox is not reachable through the Graph mail APIs.");
178
+ }
179
+ if (result.status == 403 && (codes.has("accessdenied") || codes.has("erroraccessdenied"))) {
180
+ throw new PollConnectionError(`Outlook ${operation} rejected the Connection.`);
181
+ }
182
+ if (result.status == 404 && (codes.has("erroritemnotfound") || codes.has("itemnotfound"))) {
183
+ throw new PermanentPollError("The configured Outlook folder does not exist.");
184
+ }
185
+ if (result.status == 400 && (codes.has("errorinvalididmalformed") || codes.has("inefficientfilter"))) {
186
+ throw new PermanentPollError("Outlook rejected the configured folder or filters.");
187
+ }
188
+ throw new TransientPollError(`Outlook ${operation} failed with status ${result.status}.`);
189
+ }
190
+ function errorCodes(data) {
191
+ const codes = new Set();
192
+ let value = record(data)?.error;
193
+ for (let depth = 0; depth < 4; depth += 1) {
194
+ const error = record(value);
195
+ if (error == null)
196
+ break;
197
+ if (typeof error.code == "string" && error.code.length > 0)
198
+ codes.add(error.code.toLowerCase());
199
+ value = error.innerError ?? error.innererror;
200
+ }
201
+ return codes;
202
+ }
203
+ function messages(data) {
204
+ const value = record(data)?.value;
205
+ return Array.isArray(value) ? value : [];
206
+ }
207
+ function newestMessage(rows) {
208
+ let newest = null;
209
+ for (const row of rows) {
210
+ const ms = isoMs(row.receivedDateTime);
211
+ if (row.receivedDateTime != null && ms != null && (newest == null || ms > newest.ms))
212
+ newest = { iso: row.receivedDateTime, ms };
213
+ }
214
+ return newest;
215
+ }
216
+ function isoMs(value) {
217
+ if (value == null || value.length == 0)
218
+ return null;
219
+ const milliseconds = Date.parse(value);
220
+ return Number.isNaN(milliseconds) ? null : milliseconds;
221
+ }
222
+ function record(value) {
223
+ return value != null && typeof value == "object" && !Array.isArray(value)
224
+ ? value
225
+ : undefined;
226
+ }
@@ -1,6 +1,7 @@
1
1
  import { compactObject, looseArray, optionalBoolean, optionalNumber, optionalRawString, optionalRecord, optionalString, requiredString, } from "../../core/cast.js";
2
2
  import { compactJson, encodePathSegment } from "../../core/request.js";
3
3
  import { microsoftGraphJson, microsoftGraphRequest } from "../outlook/microsoft-graph.js";
4
+ import { providerInputError } from "../provider-runtime.js";
4
5
  import { defineOAuthProviderExecutors, defineProviderProxy, requiredInputString } from "../provider-runtime.js";
5
6
  const service = "outlook_calendar";
6
7
  const graphBaseUrl = "https://graph.microsoft.com/v1.0";
@@ -102,6 +103,11 @@ async function listEvents(input, context, calendarView) {
102
103
  // a deltaLink starts the next one.
103
104
  const followUpLink = optionalString(input.nextLink) ?? (calendarView ? optionalString(input.deltaLink) : undefined);
104
105
  const delta = calendarView && input.delta === true;
106
+ if (delta &&
107
+ !followUpLink &&
108
+ [input.select, input.filter, input.orderby, input.expand].some((value) => value !== undefined)) {
109
+ throw providerInputError("Calendar view delta does not support select, filter, orderby or expand.");
110
+ }
105
111
  const calendar = optionalString(input.calendarId);
106
112
  const collection = calendarView ? "calendarView" : "events";
107
113
  const path = `${calendar ? `me/calendars/${encodePathSegment(calendar)}/${collection}` : `me/${collection}`}${delta ? "/delta" : ""}`;
@@ -1,6 +1,9 @@
1
1
  import type { ActionExecutor, CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../core/types.ts";
2
2
  import type { ProviderOAuthRuntime } from "../oauth/oauth-token.ts";
3
+ import type { IntegrationDefinition } from "../triggers/common/integration.ts";
4
+ import type { PollDefinition } from "../triggers/common/poll.ts";
3
5
  export interface ExecutorModule {
6
+ triggers?: readonly (IntegrationDefinition | PollDefinition)[];
4
7
  credentialValidators?: CredentialValidators;
5
8
  executors: ProviderExecutors;
6
9
  oauth?: ProviderOAuthRuntime;
@@ -30,6 +33,7 @@ export interface IProviderLoader {
30
33
  * Load a provider credential validator only when a connection is created.
31
34
  */
32
35
  loadCredentialValidators(service: string): Promise<CredentialValidators | undefined>;
36
+ loadTriggerDefinitions?(service: string): Promise<readonly (IntegrationDefinition | PollDefinition)[]>;
33
37
  /** Load provider-specific OAuth operations when the provider defines them. */
34
38
  loadProviderOAuthRuntime?(service: string): Promise<ProviderOAuthRuntime | undefined>;
35
39
  }
@@ -43,5 +47,6 @@ export declare class ProviderLoader implements IProviderLoader {
43
47
  loadProxyExecutor(service: string, _providerDisplayName?: string): Promise<ProviderProxyExecutor | undefined>;
44
48
  loadCredentialValidators(service: string): Promise<CredentialValidators | undefined>;
45
49
  loadProviderOAuthRuntime(service: string): Promise<ProviderOAuthRuntime | undefined>;
50
+ loadTriggerDefinitions(service: string): Promise<readonly (IntegrationDefinition | PollDefinition)[]>;
46
51
  private _findActionExecutor;
47
52
  }
@@ -39,6 +39,10 @@ export class ProviderLoader {
39
39
  }
40
40
  return (await loadRuntime()).oauth;
41
41
  }
42
+ async loadTriggerDefinitions(service) {
43
+ const load = this.executorModules[service];
44
+ return load ? ((await load()).triggers ?? []) : [];
45
+ }
42
46
  _findActionExecutor(service, actionId, executors) {
43
47
  if (!actionId.startsWith(`${service}.`)) {
44
48
  return undefined;
@@ -439,6 +439,7 @@ export const executorModules = {
439
439
  encodian: () => import("./encodian/executors.js"),
440
440
  energy_performance_certificates: () => import("./energy_performance_certificates/executors.js"),
441
441
  enigma: () => import("./enigma/executors.js"),
442
+ enormail: () => import("./enormail/executors.js"),
442
443
  envoy: () => import("./envoy/executors.js"),
443
444
  eodhd_apis: () => import("./eodhd_apis/executors.js"),
444
445
  eraser: () => import("./eraser/executors.js"),
@@ -661,6 +662,7 @@ export const executorModules = {
661
662
  imgix: () => import("./imgix/executors.js"),
662
663
  incident_io: () => import("./incident_io/executors.js"),
663
664
  indeed: () => import("./indeed/executors.js"),
665
+ indexed: () => import("./indexed/executors.js"),
664
666
  indiegogo: () => import("./indiegogo/executors.js"),
665
667
  influxdb_cloud: () => import("./influxdb_cloud/executors.js"),
666
668
  infolobby: () => import("./infolobby/executors.js"),
@@ -1,4 +1,7 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  export declare const executors: ProviderExecutors;
3
5
  export declare const proxy: ProviderProxyExecutor;
4
6
  export declare const credentialValidators: CredentialValidators;
7
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
@@ -2,6 +2,7 @@ import { optionalRecord, optionalString } from "../../core/cast.js";
2
2
  import { defineProviderExecutors, defineProviderProxy, ProviderRequestError } from "../provider-runtime.js";
3
3
  import { buildShopifyRestApiBaseUrl, normalizeShopDomain, shopifyActionHandlers, validateShopifyCredential, } from "./runtime.js";
4
4
  import { shopifyReadContentScope } from "./scopes.js";
5
+ import { shopifyShopEvent } from "./trigger-on-shop-event.js";
5
6
  const service = "shopify";
6
7
  export const executors = defineProviderExecutors({
7
8
  service,
@@ -62,3 +63,4 @@ function parseShopifyScopes(value) {
62
63
  .map((scope) => scope.trim())
63
64
  .filter(Boolean);
64
65
  }
66
+ export const triggers = [shopifyShopEvent];
@@ -0,0 +1,2 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ export declare const shopifyShopEvent: IntegrationDefinition;
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
@@ -0,0 +1,214 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const topics = [
3
+ "app/scopes_update",
4
+ "app/uninstalled",
5
+ "app_purchases_one_time/update",
6
+ "app_subscriptions/approaching_capped_amount",
7
+ "app_subscriptions/update",
8
+ "bulk_operations/finish",
9
+ "carts/create",
10
+ "carts/update",
11
+ "channels/delete",
12
+ "checkout_and_accounts_configurations/update",
13
+ "checkouts/create",
14
+ "checkouts/delete",
15
+ "checkouts/update",
16
+ "collection_listings/add",
17
+ "collection_listings/remove",
18
+ "collection_listings/update",
19
+ "collection_publications/create",
20
+ "collection_publications/delete",
21
+ "collection_publications/update",
22
+ "collections/create",
23
+ "collections/delete",
24
+ "collections/update",
25
+ "companies/create",
26
+ "companies/delete",
27
+ "companies/update",
28
+ "company_contact_roles/assign",
29
+ "company_contact_roles/revoke",
30
+ "company_contacts/create",
31
+ "company_contacts/delete",
32
+ "company_contacts/update",
33
+ "company_locations/create",
34
+ "company_locations/delete",
35
+ "company_locations/update",
36
+ "customer.joined_segment",
37
+ "customer.left_segment",
38
+ "customer.tags_added",
39
+ "customer.tags_removed",
40
+ "customer_account_settings/update",
41
+ "customer_groups/create",
42
+ "customer_groups/delete",
43
+ "customer_groups/update",
44
+ "customers/create",
45
+ "customers/delete",
46
+ "customers/disable",
47
+ "customers/enable",
48
+ "customers/purchasing_summary",
49
+ "customers/update",
50
+ "customers_email_marketing_consent/update",
51
+ "customers_marketing_consent/update",
52
+ "delivery_promise_settings/update",
53
+ "disputes/create",
54
+ "disputes/update",
55
+ "domains/create",
56
+ "domains/destroy",
57
+ "domains/update",
58
+ "draft_orders/create",
59
+ "draft_orders/delete",
60
+ "draft_orders/update",
61
+ "fulfillment_events/create",
62
+ "fulfillment_events/delete",
63
+ "fulfillment_holds/added",
64
+ "fulfillment_holds/released",
65
+ "fulfillment_orders/cancellation_request_accepted",
66
+ "fulfillment_orders/cancellation_request_rejected",
67
+ "fulfillment_orders/cancellation_request_submitted",
68
+ "fulfillment_orders/cancelled",
69
+ "fulfillment_orders/fulfillment_request_accepted",
70
+ "fulfillment_orders/fulfillment_request_rejected",
71
+ "fulfillment_orders/fulfillment_request_submitted",
72
+ "fulfillment_orders/fulfillment_service_failed_to_complete",
73
+ "fulfillment_orders/hold_released",
74
+ "fulfillment_orders/line_items_prepared_for_local_delivery",
75
+ "fulfillment_orders/line_items_prepared_for_pickup",
76
+ "fulfillment_orders/manually_reported_progress_stopped",
77
+ "fulfillment_orders/merged",
78
+ "fulfillment_orders/moved",
79
+ "fulfillment_orders/order_routing_complete",
80
+ "fulfillment_orders/placed_on_hold",
81
+ "fulfillment_orders/progress_reported",
82
+ "fulfillment_orders/rescheduled",
83
+ "fulfillment_orders/scheduled_fulfillment_order_ready",
84
+ "fulfillment_orders/split",
85
+ "fulfillments/create",
86
+ "fulfillments/update",
87
+ "inventory_items/create",
88
+ "inventory_items/delete",
89
+ "inventory_items/update",
90
+ "inventory_levels/connect",
91
+ "inventory_levels/disconnect",
92
+ "inventory_levels/update",
93
+ "locales/create",
94
+ "locales/destroy",
95
+ "locales/update",
96
+ "locations/activate",
97
+ "locations/create",
98
+ "locations/deactivate",
99
+ "locations/delete",
100
+ "locations/update",
101
+ "machine_translation_batch/completed",
102
+ "metafield_definitions/create",
103
+ "metafield_definitions/delete",
104
+ "metafield_definitions/update",
105
+ "order_transactions/create",
106
+ "orders/cancelled",
107
+ "orders/create",
108
+ "orders/delete",
109
+ "orders/edited",
110
+ "orders/fulfilled",
111
+ "orders/link_requested",
112
+ "orders/paid",
113
+ "orders/partially_fulfilled",
114
+ "orders/risk_assessment_changed",
115
+ "orders/shopify_protect_eligibility_changed",
116
+ "orders/updated",
117
+ "payment_schedules/due",
118
+ "payment_terms/create",
119
+ "payment_terms/delete",
120
+ "payment_terms/update",
121
+ "product_feeds/create",
122
+ "product_feeds/full_sync",
123
+ "product_feeds/full_sync_finish",
124
+ "product_feeds/incremental_sync",
125
+ "product_feeds/update",
126
+ "product_listings/add",
127
+ "product_listings/remove",
128
+ "product_listings/update",
129
+ "product_publications/create",
130
+ "product_publications/delete",
131
+ "product_publications/update",
132
+ "products/create",
133
+ "products/delete",
134
+ "products/update",
135
+ "profiles/create",
136
+ "profiles/delete",
137
+ "profiles/update",
138
+ "publications/delete",
139
+ "refunds/create",
140
+ "returns/approve",
141
+ "returns/cancel",
142
+ "returns/close",
143
+ "returns/decline",
144
+ "returns/process",
145
+ "returns/reopen",
146
+ "returns/request",
147
+ "returns/update",
148
+ "reverse_deliveries/attach_deliverable",
149
+ "reverse_fulfillment_orders/dispose",
150
+ "scheduled_product_listings/add",
151
+ "scheduled_product_listings/remove",
152
+ "scheduled_product_listings/update",
153
+ "segments/create",
154
+ "segments/delete",
155
+ "segments/update",
156
+ "selling_plan_groups/create",
157
+ "selling_plan_groups/delete",
158
+ "selling_plan_groups/update",
159
+ "shop/update",
160
+ "subscription_billing_attempts/challenged",
161
+ "subscription_billing_attempts/failure",
162
+ "subscription_billing_attempts/success",
163
+ "subscription_billing_cycle_edits/create",
164
+ "subscription_billing_cycle_edits/delete",
165
+ "subscription_billing_cycle_edits/update",
166
+ "subscription_billing_cycles/skip",
167
+ "subscription_billing_cycles/unskip",
168
+ "subscription_contracts/activate",
169
+ "subscription_contracts/cancel",
170
+ "subscription_contracts/create",
171
+ "subscription_contracts/expire",
172
+ "subscription_contracts/fail",
173
+ "subscription_contracts/pause",
174
+ "subscription_contracts/update",
175
+ "tax_partners/update",
176
+ "tax_summaries/create",
177
+ "tender_transactions/create",
178
+ "themes/create",
179
+ "themes/delete",
180
+ "themes/publish",
181
+ "themes/update",
182
+ "variants/in_stock",
183
+ "variants/out_of_stock",
184
+ ];
185
+ export const snapshot = {
186
+ configInputs: [
187
+ {
188
+ handle: "topics",
189
+ jsonSchema: s.array(s.stringEnum(topics), { maxItems: 20, minItems: 1, uniqueItems: true }),
190
+ nullable: false,
191
+ },
192
+ ],
193
+ definitionVersion: 2,
194
+ description: "Triggers when selected Shopify webhook topics occur in the connected store.",
195
+ displayName: "Store Event",
196
+ endpoint: {
197
+ body: { allowArray: false, allowEmpty: false, formats: ["json"] },
198
+ methods: ["POST"],
199
+ successStatus: 202,
200
+ },
201
+ key: "shopify.on_shop_event",
202
+ name: "on_shop_event",
203
+ outputs: [
204
+ { handle: "apiVersion", jsonSchema: s.string(), nullable: false },
205
+ { handle: "body", jsonSchema: { type: "object" }, nullable: false },
206
+ { handle: "eventId", jsonSchema: s.string(), nullable: false },
207
+ { handle: "shopDomain", jsonSchema: s.string(), nullable: false },
208
+ { handle: "topic", jsonSchema: s.string(), nullable: false },
209
+ { handle: "triggeredAt", jsonSchema: s.string(), nullable: false },
210
+ { handle: "webhookId", jsonSchema: s.string(), nullable: false },
211
+ ],
212
+ provider: "shopify",
213
+ type: "integration",
214
+ };