@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,233 @@
1
+ import { eventsPollOutputs, maximumPollEventsPerPage, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
2
+ import { snapshot } from "./trigger-on-event-changed.definition.js";
3
+ const quotaReasons = new Set(["rateLimitExceeded", "userRateLimitExceeded", "quotaExceeded", "usageLimits"]);
4
+ export const googleCalendarEventChanged = {
5
+ buildOutputs: eventsPollOutputs,
6
+ snapshot,
7
+ async poll(context) {
8
+ const config = resolveConfig(context.config);
9
+ if (context.checkpoint === null)
10
+ return seed(context, config, context.now.toISOString());
11
+ const checkpoint = readCheckpoint(context.checkpoint);
12
+ if (checkpoint.calendarId !== config.calendarId)
13
+ return seed(context, config, context.now.toISOString());
14
+ if ("seedTimeMin" in checkpoint)
15
+ return seed(context, config, checkpoint.seedTimeMin, checkpoint.pageToken);
16
+ return incremental(context, config, checkpoint);
17
+ },
18
+ };
19
+ function resolveConfig(value) {
20
+ return {
21
+ calendarId: value.calendarId,
22
+ changes: new Set(value.changes),
23
+ matchTerm: value.matchTerm.trim(),
24
+ maxEventsPerPoll: value.maxEventsPerPoll,
25
+ };
26
+ }
27
+ function readCheckpoint(value) {
28
+ const checkpoint = record(value);
29
+ const pageToken = typeof checkpoint?.pageToken == "string" ? checkpoint.pageToken : undefined;
30
+ const calendarId = typeof checkpoint?.calendarId == "string" ? checkpoint.calendarId : undefined;
31
+ if (typeof checkpoint?.syncToken == "string" && checkpoint.syncToken.length > 0) {
32
+ return {
33
+ calendarId,
34
+ ...(pageToken == null ? {} : { pageToken }),
35
+ syncToken: checkpoint.syncToken,
36
+ };
37
+ }
38
+ if (typeof checkpoint?.seedTimeMin == "string" && checkpoint.seedTimeMin.length > 0) {
39
+ return {
40
+ calendarId,
41
+ ...(pageToken == null ? {} : { pageToken }),
42
+ seedTimeMin: checkpoint.seedTimeMin,
43
+ };
44
+ }
45
+ throw new PermanentPollError("Google Calendar checkpoint is invalid; recreate the Trigger.");
46
+ }
47
+ async function seed(context, config, timeMin, startPageToken) {
48
+ let pageToken = startPageToken;
49
+ for (let page = 0; page < 2; page += 1) {
50
+ const result = await list(context, config.calendarId, {
51
+ maxResults: 2_500,
52
+ pageToken,
53
+ showDeleted: "true",
54
+ singleEvents: "false",
55
+ timeMin,
56
+ });
57
+ if (pageToken != null && stalePage(result))
58
+ return { checkpoint: { calendarId: config.calendarId, seedTimeMin: timeMin }, events: [] };
59
+ success(context, result, "seed full sync");
60
+ const parsed = (record(result.data) ?? {});
61
+ if (parsed.nextSyncToken)
62
+ return {
63
+ checkpoint: { calendarId: config.calendarId, syncToken: parsed.nextSyncToken },
64
+ events: [],
65
+ };
66
+ if (!parsed.nextPageToken)
67
+ throw new TransientPollError("Google Calendar seed response has no continuation token.");
68
+ pageToken = parsed.nextPageToken;
69
+ }
70
+ return {
71
+ checkpoint: {
72
+ calendarId: config.calendarId,
73
+ ...(pageToken == null ? {} : { pageToken }),
74
+ seedTimeMin: timeMin,
75
+ },
76
+ events: [],
77
+ hasMore: true,
78
+ };
79
+ }
80
+ async function incremental(context, config, checkpoint) {
81
+ const events = [];
82
+ let filtered = 0;
83
+ const result = await list(context, config.calendarId, {
84
+ maxResults: Math.min(config.maxEventsPerPoll, maximumPollEventsPerPage),
85
+ pageToken: checkpoint.pageToken,
86
+ showDeleted: "true",
87
+ singleEvents: "false",
88
+ syncToken: checkpoint.syncToken,
89
+ });
90
+ if (checkpoint.pageToken != null && stalePage(result)) {
91
+ return {
92
+ checkpoint: { calendarId: config.calendarId, syncToken: checkpoint.syncToken },
93
+ events,
94
+ filtered,
95
+ };
96
+ }
97
+ success(context, result, "incremental sync");
98
+ const parsed = (record(result.data) ?? {});
99
+ for (const item of parsed.items ?? []) {
100
+ if (item.id == null || item.id.length == 0)
101
+ continue;
102
+ const change = classify(item);
103
+ if (!config.changes.has(change) || !matches(item, config.matchTerm)) {
104
+ filtered += 1;
105
+ continue;
106
+ }
107
+ events.push(event(item, item.id, change, config.calendarId));
108
+ }
109
+ if (parsed.nextSyncToken) {
110
+ return {
111
+ checkpoint: { calendarId: config.calendarId, syncToken: parsed.nextSyncToken },
112
+ events,
113
+ filtered,
114
+ };
115
+ }
116
+ if (!parsed.nextPageToken)
117
+ throw new TransientPollError("Google Calendar sync response has no continuation token.");
118
+ return {
119
+ checkpoint: {
120
+ calendarId: config.calendarId,
121
+ pageToken: parsed.nextPageToken,
122
+ syncToken: checkpoint.syncToken,
123
+ },
124
+ events,
125
+ filtered,
126
+ hasMore: true,
127
+ };
128
+ }
129
+ function classify(value) {
130
+ if (value.status == "cancelled")
131
+ return "cancelled";
132
+ const created = epochSecond(value.created);
133
+ const updated = epochSecond(value.updated);
134
+ return created != null && created == updated ? "created" : "updated";
135
+ }
136
+ function matches(value, term) {
137
+ if (term.length == 0)
138
+ return true;
139
+ const needle = term.toLowerCase();
140
+ return [value.summary, value.description, value.location, ...(value.attendees ?? []).map(({ email }) => email)].some((candidate) => typeof candidate == "string" && candidate.toLowerCase().includes(needle));
141
+ }
142
+ function event(item, eventId, change, calendarId) {
143
+ return {
144
+ dedupeKey: `${eventId}:${item.updated ?? item.etag ?? ""}`,
145
+ payload: {
146
+ attendeeEmails: (item.attendees ?? []).flatMap(({ email }) => email == null || email.length == 0 ? [] : [email]),
147
+ calendarId,
148
+ changeType: change,
149
+ created: iso(item.created),
150
+ creatorEmail: item.creator?.email ?? null,
151
+ description: item.description ?? null,
152
+ end: item.end ?? null,
153
+ eventId,
154
+ eventType: item.eventType ?? null,
155
+ htmlLink: item.htmlLink ?? null,
156
+ isAllDay: item.start?.date != null,
157
+ location: item.location ?? null,
158
+ organizerEmail: item.organizer?.email ?? null,
159
+ recurringEventId: item.recurringEventId ?? null,
160
+ start: item.start ?? null,
161
+ status: item.status ?? "",
162
+ summary: item.summary ?? null,
163
+ updated: iso(item.updated),
164
+ },
165
+ };
166
+ }
167
+ async function list(context, calendarId, query) {
168
+ const endpoint = `/calendars/${encodeURIComponent(calendarId)}/events`;
169
+ try {
170
+ return await context.connector.execute({
171
+ endpoint,
172
+ method: "GET",
173
+ query: Object.fromEntries(Object.entries(query).filter((entry) => entry[1] != null)),
174
+ }, context.signal);
175
+ }
176
+ catch (cause) {
177
+ throw new TransientPollError(`Google Calendar proxy request to ${endpoint} failed.`, { cause });
178
+ }
179
+ }
180
+ function success(context, result, operation) {
181
+ if (result.status >= 200 && result.status < 300)
182
+ return;
183
+ if (result.status == 410 || (result.status == 400 && fullSyncRequired(result.data))) {
184
+ throw new PermanentPollError("Google Calendar sync token expired; recreate the Trigger.");
185
+ }
186
+ if (result.status == 400 || (result.status == 404 && context.checkpoint === null)) {
187
+ throw new PermanentPollError(`Google Calendar ${operation} rejected the configuration.`);
188
+ }
189
+ if (result.status == 401)
190
+ throw new PollConnectionError(`Google Calendar ${operation} rejected the Connection.`);
191
+ if (result.status == 403) {
192
+ if (reasons(result.data).some((reason) => quotaReasons.has(reason))) {
193
+ throw new TransientPollError(`Google Calendar ${operation} was rate limited.`);
194
+ }
195
+ throw new PollConnectionError(`Google Calendar ${operation} rejected the Connection.`);
196
+ }
197
+ throw new TransientPollError(`Google Calendar ${operation} failed with status ${result.status}.`);
198
+ }
199
+ function stalePage(result) {
200
+ return result.status == 400 && !fullSyncRequired(result.data);
201
+ }
202
+ function reasons(data) {
203
+ const errors = record(record(data)?.error)?.errors;
204
+ if (!Array.isArray(errors))
205
+ return [];
206
+ return errors.flatMap((value) => {
207
+ const reason = record(value)?.reason;
208
+ return typeof reason == "string" ? [reason] : [];
209
+ });
210
+ }
211
+ function fullSyncRequired(data) {
212
+ if (reasons(data).includes("fullSyncRequired"))
213
+ return true;
214
+ const message = record(record(data)?.error)?.message;
215
+ return typeof message == "string" && message.includes("fullSyncRequired");
216
+ }
217
+ function iso(value) {
218
+ if (value == null || value.length == 0)
219
+ return null;
220
+ const milliseconds = Date.parse(value);
221
+ return Number.isNaN(milliseconds) ? null : new Date(milliseconds).toISOString();
222
+ }
223
+ function epochSecond(value) {
224
+ if (value == null || value.length == 0)
225
+ return null;
226
+ const milliseconds = Date.parse(value);
227
+ return Number.isNaN(milliseconds) ? null : Math.floor(milliseconds / 1_000);
228
+ }
229
+ function record(value) {
230
+ return value != null && typeof value == "object" && !Array.isArray(value)
231
+ ? value
232
+ : undefined;
233
+ }
@@ -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 credentialValidators: CredentialValidators;
4
6
  export declare const proxy: ProviderProxyExecutor;
7
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
@@ -7,6 +7,8 @@ import { createComment, createPermission, createReply, deleteComment, deletePerm
7
7
  import { googleJsonRequest, googleRequest } from "./runtime-request.js";
8
8
  import { asObject, asOptionalObject, asOptionalInteger, asStringArray, asStringRecord, compactObject, compactUnknownObject, optionalBoolean, optionalNestedString, optionalString, parseSizeBytes, pickOptionalBoolean, pickOptionalInteger, pickOptionalString, resolveFileId, resolveRequiredString, resolveSupportsAllDrives, } from "./runtime-shared.js";
9
9
  import { googledriveOAuthScopes } from "./scopes.js";
10
+ import { googleDriveChanges, googleDriveChangeListener } from "./trigger-changes.js";
11
+ import { googleDriveFileChange } from "./trigger-on-file-change.js";
10
12
  const service = "googledrive";
11
13
  const driveApiBaseUrl = "https://www.googleapis.com/drive/v3";
12
14
  const driveUploadApiBaseUrl = "https://www.googleapis.com/upload/drive/v3";
@@ -863,3 +865,8 @@ export const proxy = defineProviderProxy({
863
865
  auth: googleBearerProxyAuth(googledriveOAuthScopes),
864
866
  allowedEndpoint: providerProxyEndpointPrefixes("/drive/v3", "/upload/drive/v3"),
865
867
  });
868
+ export const triggers = [
869
+ googleDriveChanges,
870
+ googleDriveChangeListener,
871
+ googleDriveFileChange,
872
+ ];
@@ -0,0 +1,12 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ import type { ConnectorProxy } from "../../triggers/common/proxy.ts";
3
+ import type { JsonValue } from "../../triggers/common/types.ts";
4
+ interface ReadContext {
5
+ readonly config: Readonly<Record<string, JsonValue>>;
6
+ readonly connector: ConnectorProxy;
7
+ readonly signal?: AbortSignal;
8
+ }
9
+ export declare const googleDriveChanges: IntegrationDefinition;
10
+ export declare function googleDriveStartPageToken(context: ReadContext): Promise<string>;
11
+ export declare const googleDriveChangeListener: IntegrationDefinition;
12
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
5
+ export declare const additionalSnapshot0: TriggerKeySnapshot & {
6
+ readonly type: "integration";
7
+ };
@@ -0,0 +1,101 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const defaultPageSize = 100;
3
+ export const snapshot = {
4
+ configInputs: [
5
+ {
6
+ handle: "driveId",
7
+ jsonSchema: s.string({ maxLength: 256, minLength: 1 }),
8
+ nullable: true,
9
+ description: "Optional shared drive ID. Omit it to monitor the connected account.",
10
+ },
11
+ {
12
+ handle: "includeCorpusRemovals",
13
+ jsonSchema: s.boolean(),
14
+ nullable: false,
15
+ value: false,
16
+ description: "Include the accessible file resource when an item leaves the change corpus.",
17
+ },
18
+ {
19
+ handle: "includeItemsFromAllDrives",
20
+ jsonSchema: s.boolean(),
21
+ nullable: false,
22
+ value: true,
23
+ description: "Include items from My Drive and shared drives.",
24
+ },
25
+ {
26
+ handle: "includeRemoved",
27
+ jsonSchema: s.boolean(),
28
+ nullable: false,
29
+ value: true,
30
+ description: "Include changes caused by deletion or loss of access.",
31
+ },
32
+ {
33
+ handle: "pageSize",
34
+ jsonSchema: s.integer({ maximum: 100, minimum: 1 }),
35
+ nullable: false,
36
+ value: defaultPageSize,
37
+ description: "Maximum changes included in one Flow Run.",
38
+ },
39
+ {
40
+ handle: "restrictToMyDrive",
41
+ jsonSchema: s.boolean(),
42
+ nullable: false,
43
+ value: false,
44
+ description: "Restrict changes to the My Drive hierarchy.",
45
+ },
46
+ ],
47
+ definitionVersion: 2,
48
+ description: "Uses a Google Drive changes.watch channel and triggers when Drive changes are available.",
49
+ displayName: "Changes Detected",
50
+ endpoint: {
51
+ body: { allowArray: false, allowEmpty: true, formats: ["json"] },
52
+ methods: ["POST"],
53
+ successStatus: 204,
54
+ },
55
+ key: "googledrive.changes_detected",
56
+ name: "changes_detected",
57
+ outputs: [
58
+ {
59
+ handle: "events",
60
+ jsonSchema: s.array(s.object({
61
+ changeId: s.string(),
62
+ changeType: { type: ["string", "null"] },
63
+ driveId: { type: ["string", "null"] },
64
+ file: { type: ["object", "null"] },
65
+ fileId: { type: ["string", "null"] },
66
+ notification: s.object({
67
+ changedTypes: s.array(s.string()),
68
+ messageNumber: { type: ["string", "null"] },
69
+ resourceState: s.string(),
70
+ resourceUri: { type: ["string", "null"] },
71
+ }, {
72
+ additionalProperties: false,
73
+ required: ["resourceState", "changedTypes", "messageNumber", "resourceUri"],
74
+ }),
75
+ removed: s.boolean(),
76
+ time: { type: ["string", "null"] },
77
+ }, {
78
+ additionalProperties: false,
79
+ required: ["changeId", "changeType", "removed", "time", "fileId", "driveId", "file", "notification"],
80
+ })),
81
+ nullable: false,
82
+ },
83
+ ],
84
+ provider: "googledrive",
85
+ type: "integration",
86
+ };
87
+ export const additionalSnapshot0 = {
88
+ ...snapshot,
89
+ configInputs: snapshot.configInputs,
90
+ key: "googledrive.watch_changes",
91
+ name: "watch_changes",
92
+ displayName: "Watch Changes",
93
+ description: "Monitors Drive changes using notifications and periodic scans of the same change stream.",
94
+ outputs: [
95
+ {
96
+ handle: "events",
97
+ jsonSchema: s.array({ type: "object" }),
98
+ nullable: false,
99
+ },
100
+ ],
101
+ };